Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Roomalaiset numerot Javalla

Sivun loppuun

Snopde [11.09.2007 15:42:01]

#

Tehtävänä on pieni java-ohjelman rakentaminen. Eli Roomalaisen luvun muuttaminen numeroksi,yksinkertaisesti. Löytyyköhän keneltäkään koodi apua tähän??

Antti Laaksonen [11.09.2007 16:59:45]

#

Toki, mutta millaista apua kaipaat? Jos ohjelma on harjoitustehtävä, et varmaan halua valmiin ohjelman lähdekoodia. Ensimmäinen vaihe on miettiä, miten roomalaiset numerot muutetaan omaan järjestelmäämme. Hyvä konsti voisi olla summata yhteen roomalaisia merkkejä vastaavat luvut. Esim. jos luku on CCXXXVI, tulos on 100 + 100 + 10 + 10 + 10 + 5 + 1 = 236. Ainoa vaikeus tulee luvuista 4, 9, 40, 90, 400 ja 900, ja kannattaa ehkä saman tien tunnistaa yhdistelmät IV, IX, XL, XC, CD ja CM. Silloin esim. luku CMXXIV muuttuu muotoon 900 + 10 + 10 + 4 = 924.

Snopde [11.09.2007 17:23:50]

#

Oon kyllä tehnyt noita pohjia mutta jotenkin vaan se ei toimi!!Ottaisin kyllä ihan mielelläni valmiin,jostain voisin sitten tarkastaa ns. oikean vastauksen ja hioa omaa koodia.

Antti Laaksonen [11.09.2007 18:02:09]

#

Tässä on jokin tekele, jonka toimivuutta en takaa.

public class Rooma {
    private static String[] merkit = {"M", "CM", "D", "CD", "C",
        "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    private static int[] arvot = {1000, 900, 500, 400, 100,
        90, 50, 40, 10, 9, 5, 4, 1};
    private static int maara = 13;

    private static int muuta(String luku) {
        int summa = 0, alku = 0;
        for (int i = 0; i < maara; i++) {
            while (luku.indexOf(merkit[i], alku) == alku) {
                summa += arvot[i];
                alku += merkit[i].length();
            }
        }
        return summa;
    }

    public static void main(String[] args) {
        System.out.println(muuta("XI"));
        System.out.println(muuta("XCVIII"));
        System.out.println(muuta("CCXXXVI"));
        System.out.println(muuta("CMXXIV"));
        System.out.println(muuta("MMVII"));
    }
}

Snopde [11.09.2007 18:17:18]

#

Hienoa,lähes tollasta oon itsekkin saanut aikaseks!!"pääpulmana" on vaan, et miten sen sais toimimaan niin et kysyy käyttäjältä esim. Anna luku väliltä 1-3999?,jonka jälkeen tulis sitten kyseinen annettu luku roomalaisena.

TsaTsaTsaa [11.09.2007 18:26:52]

#

Luvun lukeminen käy jotensakin näin:

import java.util.Scanner;

public class Esimerkki
{
   // Tehdään scanner-olio, jolla luetaan
   private static Scanner lukija = new Scanner(System.in);

   public static void main(String args[])
   {
      int luku = 0;
      System.out.print("Syötä luku: ");
      // Luetaan seuraava kokonaisluku
      luku = lukija.nextInt();
   }

}

Snopde [13.09.2007 08:43:00]

#

Ei tää homma vaan toimi!!On mennyt pää ihan sekasin,kun koodit vaan pyörii=(Huomenna olis viimeinen päivä,toivottavasti joku vois vielä auttaa?

setä [13.09.2007 09:22:54]

#

Tee looppi, jossa tutkit onko annettu luku >= arvot suurimmasta pienimpään. Kun ehdon toteuttava arvo löytyy, vähennät arvon luvusta kunnes luku < arvo. Lisäät merkkijonoon arvoa vastaavan merkin niin monena kuin vähennyksiä on tehty. jatkat looppia kunnes viimenenkin arvo (=1) on käyty läpi. Toivottavasti ajatus selviää tuosta.

TsaTsaTsaa [13.09.2007 10:33:04]

#

Tässä vähän pseudokoodia, millä tavalla sen voisi tehdä (ei varmastikaan kätevin):

tonnit = luku / 1000
silmukka * tonnit
{
   tulosta "M"
}
sataset = (luku % 1000) / 100
jos (sataset = 9) tulosta "CM"
muuten jos (sataset < 9 ja sataset >= 5)
{
   tulosta "D"
   silmukka * (sataset-5)
   {
      tulosta "C"
   }
}
muuten jos (sataset = 4) tulosta "CD"
muuten
{
   silmukka * sataset
   {
      tulosta "C"
   }
}
kympit = (luku % 100) / 10
// Vastaavat toimenpiteet kun satasille
ykköset = (luku % 10)
// Ja vastaavasti taas
tulosta rivinvaihto

setä [13.09.2007 13:09:15]

#

En ole jaksanut Javaan perehtyä mutta VB5:llä toimii oheinen koodi.
Testilukuna oli 2743 ja tulokseksi tuli MMDCCXLIII. Olen laiska kirjoittamaan ja kommentoimaan mutta eiköhän tuosta saa tolkun.

Option Explicit

Dim m As Variant
Dim a As Variant
Dim i As Integer
Dim n As Integer
Dim R As String

Private Sub Form_Load()
  m = Array("M", "CM", "D", "CD", "C", _
        "XC", "L", "XL", "X", "IX", "V", "IV", "I")
  a = Array(1000, 900, 500, 400, 100, _
        90, 50, 40, 10, 9, 5, 4, 1)
  txtA_KeyPress (13)
End Sub

Private Sub txtA_KeyPress(KeyAscii As Integer)
  If KeyAscii <> 13 Then Exit Sub
  On Error GoTo virhe
  If txtA > 3999 Then txtA = 3999
  n = txtA
  i = 0
  R = ""
  Do
    If n >= a(i) Then
      n = n - a(i)
      R = R & m(i)
    Else
      i = i + 1
    End If
  Loop Until i = 13
  txtR = R
  Exit Sub

virhe:
  MsgBox Err.Description
End Sub

Snopde [13.09.2007 14:41:27]

#

Apuvaah,toi menee hieman ohi,hehe!!!mä oon kyllä niin paras ohjelmoinnis,pakko saada toi pakollinen java työ vaan jotenkin hoidettua!!ehkäpä pitää palauttaa nää kaikki,heh!!no toivottavasti mun enkeli vielä löytyis=)

setä [13.09.2007 15:31:09]

#

Jospa lukisit nuo vinkit toiseenkin kertaan oikein ajatuksen kanssa niin ehkä asia alkaa kirkastua.

setä [13.09.2007 16:59:37]

#

Tämähän on hyvä harjoitustehtävä virheenkäsittelyineen päivineen.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta