Uproszczenie prostego NumToWord

0

Siemanko mógłby ktoś rzucić oknem jak to objętościowo zmniejszyć, uprościć kod? Będę wdzięczny: )

package ZadaniaPROG;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int num, j, n, d, s, t;
        int x = 0;
        String[] jedności = {"jeden", "dwa", "trzy", "cztery", "pieć", "sześć", "siedem", "osiem", "dziewięć"};
        String[] nastki = {"dziesięć", "jedenaście", "dwanaście", "trzynaście", "czternaście", "piętnaście", "szesnaście", "siedemnaście", "osiemnaście", "dziewiętnaście"};
        String[] dziesiątki = {"dziesięć", "dwadziescia", "trzydzieści", "czterdzieści", "pięćdziesiąt", "sześciedziąt", "siedemdziesiąt", "osiemdziesiąt", "dziewięćdziesiąt"};
        String[] setki = {"sto", "dwieście", "trzysta", "czterysta", "pięćset", "sześćset", "siedemset", "osiemset", "dziewięcset"};
        String[] tysiące = {"tysiąc", "tysiące", "tysięcy"};

        System.out.println("Program konwertuje liczby na słowa");
        System.out.println("Wpisz liczbę:");
        Scanner scan = new Scanner(System.in);
        num = scan.nextInt();

        do {
            if ((num >= 1) && (num <= 9)) {
                System.out.println("Liczba słownie :" + " " + jedności[num - 1]);
            } else if (num == 0) {
                System.out.println("zero");
            } else if ((num >= 10) && (num <= 19)) {
                n = num % 10;
                System.out.println("Liczba słownie :" + " " + nastki[n]);
            } else if (num >= 20 && num <= 99) {
                d = num % 100 / 10 - 1;
                j = num % 10 - 1;
                System.out.println("Liczba słownie:" + " " + dziesiątki[d] + " " + jedności[j]);
            } else if (num >= 100 && num <= 999) {
                s = num / 100 - 1;
                d = num % 100 / 10 - 1;
                j = num % 10 - 1;
                System.out.println("Liczba słownie:" + " " + setki[s] + " " + dziesiątki[d] + " " + jedności[j]);
            } else if (num >= 1000 && num <= 9999) {
                t = num / 1000;
                s = num % 1000 / 100 - 1;
                d = num % 100 / 10 - 1;
                j = num % 10 - 1;
                if (t == 1)
                    System.out.println("Liczba słownie:" + tysiące[0] + " " + setki[s] + " " + dziesiątki[d] + " " + jedności[j]);
                else if (t >= 2 && t <= 4) {
                    System.out.println("Liczba słownie:" + jedności[t - 1] + " " + tysiące[1] + " " + setki[s] + " " + dziesiątki[d] + " " + jedności[j]);
                } else if (t >= 6 && t <= 9) {
                    System.out.println("Liczba słownie:" + jedności[t - 1] + " " + tysiące[2] + " " + setki[s] + " " + dziesiątki[d] + " " + jedności[j]);
                }
            }
            System.out.println("Wpisz liczbę:");
            num = scan.nextInt();
        }
        while (x < 10);

    }
}

2
  1. Jak wielu na początku mieszasz (być może całkiem wporzo) algorytm z operacjami wejścia-wyjścia. Wyobraż sobie, że potrzebujesz tego w drugim, trzecim projekcie. Oddziel funkcję, która jednokrotnie przetwarza int w sts::string (bez drukowania). Drukowanie w kodzie który ją wywołuje
  2. Po drugie robisz to w mainie
  3. Dziur w algorytmie na szybko nie stwierdziłęm
0

Dzięki Wielkie za Pomoc:)Wyciągnę wnioski;)

1

Widziałem kod, który realizuje tę funkcję i był ze 4 razy większy, więc Twój jest bardzo spoko :)
Do poćwiczenia kwestia wydzielenia tego do osobnej klasy (tak jak pisze @AnyKtokolwiek) żeby można było użyć w formie, np.

LiczbaSlownie ls = new LiczbaSlownie(42);
System.out.println(ls.toString());

albo może tak:

System.out.println(LiczbaSlownie.konwertuj(42));

Możliwości jest wiele, możesz spróbować obydwa powyższe jednocześnie.

1

• Twój kod wywala się na liczbie 20.

• W stringach masz literówki:
pieć
dwadziescia
sześciedziąt
dziewięcset

• 5000-5999 nie działa
• 6000 wywala się

Zdefiniuj FUNKCJĘ która przyjmuje inta i zwraca stringa. Odpal ją w pętli w pełnym zakresie intów które chcesz obsłużyć.
Wyniki zapisz do pliku, każda liczba w osobnej linii. Przejrzyj ten plik dokładnie.

1
function Slownie(Val:Int64):String;
var S,Sadd:String;
var I,N,N1,N2,N3:Word;
const Range:array[0..3,0..2]of String=
(
  ('','',''),
  ('tysiąc ','tysiące ','tysięcy '),
  ('milion ','miliony ','milionów '),
  ('miliard ','miliardy ','miliardów ')
);
const Digits:array[0..3,0..9]of String=
(
  ('','jeden ','dwa ','trzy ','cztery ','pięć ','sześć ','siedem ','osiem ','dziewięć '),
  ('dziesięć ','jedenaście ','dwanaście ','trzynaście ','czternaście ','piętnaście ','szesnaście ','siedemnaście ','osiemnaście ','dziewiętnaście '),
  ('','','dwadzieścia ','trzydzieści ','czterdzieści ','pięćdziesiąt ','sześćdziesiąt ','siedemdziesiąt ','osiemdziesiąt ','dziewięćdziesiąt '),
  ('','sto ','dwieście ','trzysta ','czterysta ','pięćset ','sześćset ','siedemset ','osiemset ','dziewięćset ')
);
begin
  if Val<0 then
  begin
    Result:='- ';
    Val:=-Val;
  end
  else SetLength(Result,0);
  
  if Val=0 then Result:='Zero '
  else
  begin
    I:=0;
    while Val>0 do
    begin
      N:=(Val)mod(1000);
      N1:=(Val)mod(10);
      N2:=(Val)div(10)mod(10);
      N3:=(Val)div(100)mod(10);
      Val:=(Val)div(1000);
      Sadd:=Digits[3,N3];
      if N2=1 then Sadd:=Sadd+Digits[1,N1] else Sadd:=Sadd+Digits[2,N2]+Digits[0,N1];
      if N>0 then
      begin
        if N2=1 then Sadd:=Sadd+Range[I,2]
        else if (2<=N1)and(N1<=4) then Sadd:=Sadd+Range[I,1]
        else if N1<>1 then Sadd:=Sadd+Range[I,2]
        else if (N2=0)and(N3=0) then Sadd:=Sadd+Range[I,0]
        else Sadd:=Sadd+Range[I,2];
      end;
      Inc(I);
      S:=Sadd+S;
    end;
    Result:=Result+S;
  end;
end;

Owszem paskal ale sądzę że dasz rady przeczytać i odpowiednio zmienić swój kod.

1

Implementacja "leniwa" (tzn. nie chciało mi się za dużo myśleć):

package com.company;


class PolishNumbers {
    static final String[] ones = { "", "jeden", "dwa", "trzy", "cztery", "pięć", "sześć", "siedem", "osiem", "dziewięć",
                                   "dziesięć", "jedenaście", "dwanaście", "trzynaście", "czternaście",
                                   "piętnaście", "szesnaście", "siedemnaście", "osiemnaście", "dziewiętnaście" };
    static final String[] tens = { null, null, "dwadzieścia ", "trzydzieści ", "czterdzieści ", "pięćdziesiąt ",
                                   "sześćdziesiąt ", "siedemdziesiąt ", "osiemdziesiąt ", "dziewięćdziesiąt " };
    static final String[] hundreds = { null, "sto ", "dwieście ", "trzysta ", "czterysta ", "pięćset ",
                                       "sześćset ", "siedemset ", "osiemset ", "dziewięćset " };

    static String intToWordsInternal(int n) {
        if (n > 999) {
            int t = n / 1000;
            String smallPart = intToWordsInternal(n % 1000);
            if (t == 1)
                return "tysiąc " + smallPart;
            else
                return ones[t] + (t < 5 ? " tysiące " : " tysięcy ") + smallPart;
        }
        else if (n > 99)
            return hundreds[n / 100] + intToWordsInternal(n % 100);
        else if (n > 19)
            return tens[n / 10] + ones[n % 10];
        else
            return(ones[n]);
    }

    public static String intToWords(int n) {
        assert(n >=0 && n <= 9999);
        if (n == 0)
            return "zero";
        else
            return intToWordsInternal(n).trim();
    }
}

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i<=9999; i++)
            System.out.printf("%d '%s'\n", i, PolishNumbers.intToWords(i));
    }
}
0

Dzięki Wszystkim za Pomoc z pewnością skorzystam:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1