|
/************************************************** |
|
* Program pro slovní výpis vstupního čísla |
|
* Užití: slovne <cislo> |
|
* Pokud uživatel nezadá ono číslo, program si vstup |
|
* vyžádá. |
|
* |
|
* Rozsah je od -10^18 do +10^18 |
|
* |
|
* Kód vytvořil: Marek Poláček (Polda18) |
|
* |
|
* Soubor: main.c |
|
**************************************************/ |
|
|
|
// Důležité globální knihovny |
|
//------------------------------------------------------ |
|
#include <math.h> |
|
#include <stdio.h> |
|
#include <stdbool.h> |
|
|
|
// Důležité lokální knihovny |
|
//------------------------------------------------------ |
|
#include "definice.h" |
|
#include "funkce.h" |
|
|
|
// Počátek programu |
|
int main(int argc, char** argv) { |
|
fprintf(stdout, "------------------------------------------------------\n"); |
|
fprintf(stdout, " Konvertor čísla na slovní vyjádření\n"); |
|
fprintf(stdout, "------------------------------------------------------\n\n"); |
|
|
|
bool precteno = false; // Pokud je číslo úspěšně přečteno |
|
bool minus; // Operátor záporného čísla |
|
double cislo; // Sem zadáme číslo pro konverzi |
|
int jednotky_celkem, tisice_celkem, miliony_celkem; |
|
int miliardy_celkem, biliony_celkem, triliony_celkem; // Dělení celočíselné části |
|
int kvadriliony = 0; // Případ přetečení až na doraz |
|
int tisiciny_celkem, miliontiny_celkem; // Dělení desetinné části |
|
double celacast, desetinnacast, absolutni; // Převzetí celé a desetinné části, smazání znaménka |
|
double zbytek; // Výpočet zbytku |
|
|
|
// Práce s argumenty příkazu |
|
if (argc < 2) { |
|
// Argument nezadán, zeptat se na číslo |
|
fprintf(stdout, "Zadejte číslo v rozsahu od -10^18 do +10^18 bez těchto mezních hodnot.\n"); |
|
fprintf(stdout, "Číslo může být desetinné, zadávejte ho však s desetinnou tečkou.\n\n"); |
|
fprintf(stdout, "Zadejte číslo zde> "); |
|
fflush(stdin); |
|
precteno = fscanf_s(stdin, "%lf", &cislo); |
|
putchar('\n'); // Odřádkování |
|
} |
|
else { |
|
// Argument zadán, přečíst z argumentu |
|
precteno = sscanf_s(argv[1], "%lf", &cislo); |
|
} |
|
|
|
if (!precteno) { |
|
// Nebylo zadáno číslo |
|
fprintf(stderr, "CHYBA! Zadaný vstup není číslo!\n"); |
|
return 1; |
|
} |
|
|
|
minus = cislo < 0; |
|
absolutni = (minus) ? -cislo : cislo; |
|
|
|
if (absolutni >= 1.e+18) { |
|
// Číslo je mimo stanovený rozsah |
|
fprintf(stderr, "CHYBA! Zadané číslo je mimo stanovený rozsah!\n"); |
|
return 2; |
|
} |
|
|
|
// Převzetí celé části a výpočet zbytku |
|
celacast = floor(absolutni); |
|
desetinnacast = absolutni - celacast; |
|
|
|
// Výpočet celé části |
|
triliony_celkem = (int)floor(celacast / 1.e+15); |
|
biliony_celkem = (int)(floor(celacast / 1.e+12) |
|
- triliony_celkem * 1.e+3); |
|
miliardy_celkem = (int)(floor(celacast / 1.e+9) |
|
- triliony_celkem * 1.e+6 |
|
- biliony_celkem * 1.e+3); |
|
miliony_celkem = (int)(floor(celacast / 1.e+6) |
|
- triliony_celkem * 1.e+9 |
|
- biliony_celkem * 1.e+6 |
|
- miliardy_celkem * 1.e+3); |
|
tisice_celkem = (int)(floor(celacast / 1.e+3) |
|
- triliony_celkem * 1.e+12 |
|
- biliony_celkem * 1.e+9 |
|
- miliardy_celkem * 1.e+6 |
|
- miliony_celkem * 1.e+3); |
|
jednotky_celkem = (int)(celacast |
|
- triliony_celkem * 1.e+15 |
|
- biliony_celkem * 1.e+12 |
|
- miliardy_celkem * 1.e+9 |
|
- miliony_celkem * 1.e+6 |
|
- tisice_celkem * 1.e+3); |
|
|
|
// Výpočet desetinné části |
|
tisiciny_celkem = (int)(desetinnacast * 1.e+3); |
|
miliontiny_celkem = (int)(desetinnacast * 1.e+6 - tisiciny_celkem * 1.e+3); |
|
|
|
// Výpočet zbytku (určeno pro zaokrouhlení) |
|
zbytek = (desetinnacast - tisiciny_celkem / 1000. - miliontiny_celkem / 1000000.) * 1000000.; |
|
|
|
// Ošetření přetečení |
|
if (zbytek >= .5) |
|
++miliontiny_celkem; // Pokud je zbytek větší nebo rovno 5 desetimiliontinám, |
|
// zvyš počet miliontin o jednu |
|
|
|
if (miliontiny_celkem > 999) { |
|
// Ošetření přetečení miliontin |
|
miliontiny_celkem %= 1000; |
|
++tisiciny_celkem; |
|
} |
|
|
|
if (tisiciny_celkem > 999) { |
|
// Ošetření přetečení tisícin |
|
tisiciny_celkem %= 1000; |
|
++jednotky_celkem; |
|
} |
|
|
|
if (jednotky_celkem > 999) { |
|
// Ošetření přetečení jednotek |
|
jednotky_celkem %= 1000; |
|
++tisice_celkem; |
|
} |
|
|
|
if (tisice_celkem > 999) { |
|
// Ošetření přetečení tisíců |
|
tisice_celkem %= 1000; |
|
++miliony_celkem; |
|
} |
|
|
|
if (miliony_celkem > 999) { |
|
// Ošetření přetečení milionů |
|
miliony_celkem %= 1000; |
|
++miliardy_celkem; |
|
} |
|
|
|
if (miliardy_celkem > 999) { |
|
// Ošetření přetečení miliard |
|
miliardy_celkem %= 1000; |
|
++biliony_celkem; |
|
} |
|
|
|
if (biliony_celkem > 999) { |
|
// Ošetření přetečení bilionů |
|
biliony_celkem %= 1000; |
|
++triliony_celkem; |
|
} |
|
|
|
if (triliony_celkem > 999) { |
|
// Ošetření přetečení trilionů |
|
triliony_celkem %= 1000; |
|
++kvadriliony; // Nejvyšší přetečení |
|
} |
|
|
|
// Výpočet číselných jednotek |
|
//------------------------------------------------------ |
|
|
|
// Připraveno pro stovky, desítky a jednotky trojic řádů |
|
int triliony_stovky, triliony; // množiny trilionů |
|
int biliony_stovky, biliony; // množiny bilionů |
|
int miliardy_stovky, miliardy; // množiny miliard |
|
int miliony_stovky, miliony; // množiny milionů |
|
int tisice_stovky, tisice; // množiny tisíců |
|
int stovky, jednotky; // jednotky |
|
int desetiny, setiny, tisiciny; // množiny tisícin |
|
int desetitisiciny, stotisiciny, miliontiny; // množiny miliontin |
|
|
|
// Výpočet jednotlivých částí |
|
//------------------------------------------------------ |
|
|
|
// Celá část |
|
// Triliony |
|
triliony_stovky = triliony_celkem / 100; |
|
triliony = triliony_celkem % 100; |
|
|
|
// Biliony |
|
biliony_stovky = biliony_celkem / 100; |
|
biliony = biliony_celkem % 100; |
|
|
|
// Miliardy |
|
miliardy_stovky = miliardy_celkem / 100; |
|
miliardy = miliardy_celkem % 100; |
|
|
|
// Miliony |
|
miliony_stovky = miliony_celkem / 100; |
|
miliony = miliony_celkem % 100; |
|
|
|
// Tisíce |
|
tisice_stovky = tisice_celkem / 100; |
|
tisice = tisice_celkem % 100; |
|
|
|
// Jednotky |
|
stovky = jednotky_celkem / 100; |
|
jednotky = jednotky_celkem % 100; |
|
|
|
// Desetinná část |
|
// Tisíciny |
|
desetiny = tisiciny_celkem / 100; |
|
setiny = tisiciny_celkem % 100 / 10; |
|
tisiciny = tisiciny_celkem % 10; |
|
|
|
// Miliontiny |
|
desetitisiciny = miliontiny_celkem / 100; |
|
stotisiciny = miliontiny_celkem % 100 / 10; |
|
miliontiny = miliontiny_celkem % 10; |
|
|
|
// Výsledky |
|
fprintf(stdout, "Vstup uživatele: %lf\n", cislo); |
|
fprintf(stdout, "Číslo vyjádřeno slovy je:\n\n"); |
|
|
|
// Slovní vyjádření zadaného čísla |
|
//------------------------------------------------------ |
|
|
|
// Nulové číslo |
|
if (!cislo) { |
|
fprintf(stdout, NULA); |
|
putchar('\n'); |
|
return 0; |
|
} |
|
|
|
// Znaménko |
|
if (minus) |
|
fprintf(stdout, "minus "); |
|
|
|
// Výpis číselného vyjádření kvadrilionů - pouze jedna možnost, tedy ukončit program |
|
if (kvadriliony) { |
|
fprintf(stdout, "%s kvadrilion\n", JEDEN); |
|
return 0; |
|
} |
|
|
|
// Výpis jednotek |
|
//------------------------------------------------------ |
|
|
|
// Stovky trilionů |
|
if (triliony_stovky) { |
|
slovo_cislovky(triliony_stovky, PREPINAC_STOVKY); |
|
oddelovac(); |
|
slovo_stovky(triliony_stovky); |
|
} |
|
|
|
// Pokud existují zároveň stovky a jednotky trilionů |
|
if (triliony_stovky && triliony) |
|
oddelovac(); |
|
|
|
// Jednotky trilionů |
|
if (triliony) |
|
slovo_cislovky(triliony, PREPINAC_RADY_CELE); |
|
|
|
// Pokud existují všechny řády z trojřádu trilionů |
|
if (triliony_celkem) { |
|
oddelovac(); |
|
slovo_triliony(triliony_celkem); |
|
} |
|
|
|
// Pokud existuje zároveň alespoň jeden z trojřádu trilionů a alespoň jeden z trojřádu bilionů |
|
if (triliony_celkem && biliony_celkem) |
|
oddelovac(); |
|
|
|
// Stovky bilionů |
|
if (biliony_stovky) { |
|
slovo_cislovky(biliony_stovky, PREPINAC_STOVKY); |
|
oddelovac(); |
|
slovo_stovky(biliony_stovky); |
|
} |
|
|
|
// Pokud existují zároveň stovky a jednotky bilionů |
|
if (biliony_stovky && biliony) |
|
oddelovac(); |
|
|
|
// Jednotky bilionů |
|
if (biliony) |
|
slovo_cislovky(biliony, PREPINAC_RADY_CELE); |
|
|
|
// Pokud existuje alespoň jeden z řádů v trojřádu bilionů |
|
if (biliony_celkem) { |
|
oddelovac(); |
|
slovo_biliony(biliony_celkem); |
|
} |
|
|
|
// Pokud existuje alespoň jeden z řádu trilionů a jeden z řádu miliard |
|
// nebo jeden z řádu bilionů a jeden z řádu miliard |
|
if (triliony_celkem && miliardy_celkem |
|
|| biliony_celkem && miliardy_celkem) |
|
oddelovac(); |
|
|
|
// Stovky miliard |
|
if (miliardy_stovky) { |
|
slovo_cislovky(miliardy_stovky, PREPINAC_STOVKY); |
|
oddelovac(); |
|
slovo_stovky(miliardy_stovky); |
|
} |
|
|
|
// Pokud existují zároveň stovky a jednotky miliard |
|
if (miliardy_stovky && miliardy) |
|
oddelovac(); |
|
|
|
// Jednotky miliard |
|
if (miliardy) |
|
slovo_cislovky(miliardy, PREPINAC_RADY_CELE); |
|
|
|
// Pokud existuje jakýkoliv z řádů miliard |
|
if (miliardy_celkem) { |
|
oddelovac(); |
|
slovo_miliardy(miliardy_celkem); |
|
} |
|
|
|
// Pokud existuje jakýkoliv z řádů trilionů a milionů, bilionů a milionů nebo miliard a milionů |
|
if (triliony_celkem && miliony_celkem |
|
|| biliony_celkem && miliony_celkem |
|
|| miliardy_celkem && miliony_celkem) |
|
oddelovac(); |
|
|
|
// Stovky milionů |
|
if (miliony_stovky) { |
|
slovo_cislovky(miliony_stovky, PREPINAC_STOVKY); |
|
oddelovac(); |
|
slovo_stovky(miliony_stovky); |
|
} |
|
|
|
// Pokud existují stovky a jednotky milionů |
|
if (miliony_stovky && miliony) |
|
oddelovac(); |
|
|
|
// Jednotky milionů |
|
if (miliony) |
|
slovo_cislovky(miliony, PREPINAC_RADY_CELE); |
|
|
|
// Pokud existuje trojřád milionů |
|
if (miliony_celkem) { |
|
oddelovac(); |
|
slovo_miliony(miliony_celkem); |
|
} |
|
|
|
// Pokud existují trojřád trilionů a tisíců, trojřád bilionů a tisíců, trojřád miliard a tisíců |
|
// nebo trojřád milionů a tisíců |
|
if (triliony_celkem && tisice_celkem |
|
|| biliony_celkem && tisice_celkem |
|
|| miliardy_celkem && tisice_celkem |
|
|| miliony_celkem && tisice_celkem) |
|
oddelovac(); |
|
|
|
// Stovky tisíců |
|
if (tisice_stovky) { |
|
slovo_cislovky(tisice_stovky, PREPINAC_STOVKY); |
|
oddelovac(); |
|
slovo_stovky(tisice_stovky); |
|
} |
|
|
|
// Pokud existují stovky a jednotky tisíců |
|
if (tisice_stovky && tisice) |
|
oddelovac(); |
|
|
|
// Jednotky tisíců |
|
if (tisice) |
|
slovo_cislovky(tisice, PREPINAC_RADY_CELE); |
|
|
|
// Pokud existuje trojřád tisíců |
|
if (tisice_celkem) { |
|
oddelovac(); |
|
slovo_tisice(tisice_celkem); |
|
} |
|
|
|
// Pokud existuje trojřád trilionů a jednotek, bilionů a jednotek, miliard a jednotek, |
|
// milionů a jednotek nebo tisíců a jednotek |
|
if (triliony_celkem && jednotky_celkem |
|
|| biliony_celkem && jednotky_celkem |
|
|| miliardy_celkem && jednotky_celkem |
|
|| miliony_celkem && jednotky_celkem |
|
|| tisice_celkem && jednotky_celkem) |
|
oddelovac(); |
|
|
|
// Stovky |
|
if (stovky) { |
|
slovo_cislovky(stovky, PREPINAC_STOVKY); |
|
oddelovac(); |
|
slovo_stovky(stovky); |
|
} |
|
|
|
// Pokud existují stovky a jednotky |
|
if (stovky && jednotky) |
|
oddelovac(); |
|
|
|
// Jednotky |
|
if (jednotky) |
|
slovo_cislovky(jednotky, PREPINAC_JEDNOTKY); |
|
|
|
// Desetinná část |
|
if (celacast > 0 && desetinnacast > 0) { |
|
// Celá část je nenulová a desetinná je nenulová |
|
oddelovac(); |
|
fprintf(stdout, CELYCH); |
|
oddelovac(); |
|
} |
|
else if (desetinnacast > 0) { |
|
// Celá část je nulová a desetinná je nenulová |
|
fprintf(stdout, NULA); |
|
oddelovac(); |
|
fprintf(stdout, CELYCH); |
|
oddelovac(); |
|
} |
|
|
|
// Desetiny |
|
if (desetiny) { |
|
slovo_cislovky(desetiny, PREPINAC_RADY_DESETINNE); |
|
oddelovac(); |
|
slovo_desetiny(desetiny); |
|
} |
|
|
|
// Pokud existují desetiny a setiny |
|
if (desetiny && setiny) |
|
oddelovac(); |
|
|
|
// Setiny |
|
if (setiny) { |
|
slovo_cislovky(setiny, PREPINAC_RADY_DESETINNE); |
|
oddelovac(); |
|
slovo_setiny(setiny); |
|
} |
|
|
|
// Pokud existují desetiny a tisíciny nebo setiny a tisíciny |
|
if (desetiny && tisiciny |
|
|| setiny && tisiciny) |
|
oddelovac(); |
|
|
|
// Tisíciny |
|
if (tisiciny) { |
|
slovo_cislovky(tisiciny, PREPINAC_RADY_DESETINNE); |
|
oddelovac(); |
|
slovo_tisiciny(tisiciny); |
|
} |
|
|
|
// Pokud existují desetiny a desetitisíciny, setiny a desetitisíciny |
|
// nebo tisíciny a desetitisíciny |
|
if (desetiny && desetitisiciny |
|
|| setiny && desetitisiciny |
|
|| tisiciny && desetitisiciny) |
|
oddelovac(); |
|
|
|
// Desetitisíciny |
|
if (desetitisiciny) { |
|
slovo_cislovky(desetitisiciny, PREPINAC_RADY_DESETINNE); |
|
oddelovac(); |
|
slovo_desetitisiciny(desetitisiciny); |
|
} |
|
|
|
// Pokud existují desetiny a stotisíciny, setiny a stotisíciny, |
|
// tisíciny a stotisíciny nebo desetitisíciny a stotisíciny |
|
if (desetiny && stotisiciny |
|
|| setiny && stotisiciny |
|
|| tisiciny && stotisiciny |
|
|| desetitisiciny && stotisiciny) |
|
oddelovac(); |
|
|
|
// Stotisíciny |
|
if (stotisiciny) { |
|
slovo_cislovky(stotisiciny, PREPINAC_RADY_DESETINNE); |
|
oddelovac(); |
|
slovo_stotisiciny(stotisiciny); |
|
} |
|
|
|
// Pokud existují desetiny a miliontiny, setiny a miliontiny, |
|
// tisíciny a miliontiny, desetitisíciny a miliontiny nebo |
|
// stotisíciny a miliontiny |
|
if (desetiny && miliontiny |
|
|| setiny && miliontiny |
|
|| tisiciny && miliontiny |
|
|| desetitisiciny && miliontiny |
|
|| stotisiciny && miliontiny) |
|
oddelovac(); |
|
|
|
// Miliontiny |
|
if (miliontiny) { |
|
slovo_cislovky(miliontiny, PREPINAC_RADY_DESETINNE); |
|
oddelovac(); |
|
slovo_miliontiny(miliontiny); |
|
} |
|
|
|
// Finální odřádkování |
|
putchar('\n'); |
|
|
|
// Konec programu |
|
return 0; |
|
} |