Nadesłany przez Krzysztof Kranc, 06 czerwca 2012 20:09
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
translation.java:
//Zamiana liczby na slowa z polska gramatyka
//Krzysztof Kranc
//www.algorytm.org
import java.util.InputMismatchException;
import java.util.Scanner;
public class translation {
public static String translacja(long liczba) {
String[] jedności = { "", "jeden ", "dwa ", "trzy ", "cztery ",
"pięć ", "sześć ", "siedem ", "osiem ", "dziewięć ", };
String[] nastki = { "", "jedenaście ", "dwanaście ", "trzynaście ",
"czternaście ", "piętnaście ", "szesnaście ", "siedemnaście ",
"osiemnaście ", "dziewiętnaście ", };
String[] dziesiątki = { "", "dziesięć ", "dwadzieścia ",
"trzydzieści ", "czterdzieści ", "pięćdziesiąt ",
"sześćdziesiąt ", "siedemdziesiąt ", "osiemdziesiąt ",
"dziewięćdziesiąt ", };
String[] setki = { "", "sto ", "dwieście ", "trzysta ", "czterysta ",
"pięćset ", "sześćset ", "siedemset ", "osiemset ",
"dziewięćset ", };
String[][] grupy = { { "", "", "" },
{ "tysiąc ", "tysiące ", "tysięcy " },
{ "milion ", "miliony ", "milionów " },
{ "miliard ", "miliardy ", "miliardów " },
{ "bilion ", "biliony ", "bilionów " },
{ "biliard ", "biliardy ", "biliardów " },
{ "trylion ", "tryliony ", "trylionów " }, };
// INICJACJA ZMIENNYCH
long j = 0/* jedności */, n = 0/* nastki */, d = 0/* dziesiątki */, s = 0/* setki */, g = 0/* grupy */, k = 0/* końcówwki */;
String słownie = "";
String znak = "";
// OPERACJA DOTYCZąCA ZNAKU
if (liczba < 0) {
znak = "minus ";
liczba = -liczba; // bezwględna wartość ponieważ, jeśli będziemy
// operować na liczbie z minusem tablica będzie
// przyjmowała wartości ujemne i zwróci nam błąd
}
if (liczba == 0) {
znak = "zero";
}
// PĘTLA GŁÓWNA
while (liczba != 0) {
s = liczba % 1000 / 100;
d = liczba % 100 / 10;
j = liczba % 10;
if (d == 1 & j > 0) // if zajmujący się nastkami
{
n = j;
d = 0;
j = 0;
} else {
n = 0;
}
// <---- KOŃCÓWKI
if (j == 1 & s + d + n == 0) {
k = 0;
if (s + d == 0 && g > 0) // jeśli nie będzie dziesiątek ani setek, wtedy otrzymamy samą grupę
{ // przykładowo 1000 - wyświetli nam się "tysiąc", jeśli
// zakomentujemy tego if'a to otrzymamy "jeden tysiąc"
j = 0;
słownie = grupy[(int) g][(int) k] + słownie;
}
} else if (j == 2) {
k = 1;
} else if (j == 3) {
k = 1;
} else if (j == 4) {
k = 1;
} else {
k = 2;
}
// KONIEC KOŃCÓWEK -->
if (s+d+n+j > 0) {
słownie = setki[(int) s] + dziesiątki[(int) d] + nastki[(int) n]
+ jedności[(int) j] + grupy[(int) g][(int) k] + słownie;
}
// POZBYWAMY SIĘ TYCH LICZBY KTÓRE JUŻ PRZEROBILIŚMY czyli
// przykładowo z 132132 zostaje nam 132 do obróbki
liczba = liczba / 1000;
// ORAZ ZWIĘKSZAMY G KTÓRE ODPOWIEDZIALNE JEST ZA NUMER POLA W
// TABLICY WIELOWYMIAROWEJ
g = g + 1;
}
// KONIEC PĘTLI GŁÓWNEJ
// DODANIE ZNAKU I ZWRÓCENIE METODY
słownie = znak + słownie;
return słownie;
}
public static void main(String[] args) {
Scanner skaner = new Scanner(System.in);
boolean isNotNumber = true;
do {
try {
System.out.println("Wprowadź liczbę!");
long liczba = skaner.nextLong();
System.out.println(translation.translacja(liczba));
isNotNumber = false;
} catch (InputMismatchException ime) {
System.err.println("Złe dane!");
skaner.nextLine();
System.out.println("Wprowadź dane powownie");
}
} while (isNotNumber);
skaner.close();
}
}

