/*
* Název programu:	Synteza slovniho vyjadreni cisel
* Autor:                fra.iesus
* Studijní skupina:     I/28
* Email autora:         fra.iesus@seznam.cz
* Datum vypracování:    14. 3. 2k5
* Zadání:               Napište program, který převede celé číslo na jeho slovní
*                       vyjádření, tzn. např. pro zadané číslo 512121856340162
*                       se vypíše "pět set dvanáct bilionů sto dvacet jedna
*                       miliard osm set padesát šest milionů třista čtyřicet
*                       tisíc (jedno) sto šedesát dva". 
* Stručný popis řešení: viz zadani a napoveda :o)
*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <math.h>

char *rady[3][5] = {{"", "tisic ", "milion ", "miliarda ", "bilion "},
                    {"", "tisice ", "miliony ", "miliardy ", "biliony "},
                    {"", "tisic ", "milionu ", "miliard ", "bilionu "}};
char *cisliceRad[2][5] = {{"jedna ", "jeden ", "jeden ", "jedna ", "jeden "},
                          {"dva ", "dva ", "dva ", "dve ", "dva "}};

char *stovky[10] = {"", "sto ", "dveste ",  "trista ", "ctyrista ", "petset ",
                   "sestset ", "sedmset ", "osumset ", "devetset "};
char *cislice[20] = {"", "jedna ", "dva ", "tri ", "ctyri ", "pet ",
                     "sest ", "sedm ", "osum ", "devet ",
                     "deset ", "jedenact ", "dvanact ", "trinact ", "ctrnact ", "patnact ",
                     "sestnact ", "sedmnact ", "osumnact ", "devatenact "};
char *desitky[10] = {"", "deset " /*nepouziva se :^)*/, "dvacet ", "tricet ", "ctyricet ",
                    "padesat ", "sedesat ", "sedmdesat ", "osumdesat ", "devadesat "};


void do_tisice(long cislo, int rada, char **slovo) {
    *slovo = "";
    char s[1000] = "";
    strcat(s, stovky[cislo/100]);    
    int do100 = fmod(cislo, 100);
    int do10 = fmod(do100, 10);
    if (((cislo > 1) && (rada > 0)) || (rada == 0))
        if (do100 < 20) {
            if (do100 == 2)
                strcat(s, cisliceRad[1][rada]);
            else 
                strcat(s, cislice[do100]);
        }    
        else {
            strcat(s, desitky[do100/10]);
            if ((do10 > 0) && (do10 < 3)) {
				if (do10 == 1)
                    strcat(s, cisliceRad[0][rada]);
				else
                    strcat(s, cisliceRad[1][rada]);
                    }
            else 
                strcat(s, cislice[do10]);
        }
    if (((do10 < 5) && (do100 < 5)) || ((do10 < 5) && (do10 > 0) && (do100 > 20))) {
        if (do10 == 1)
            strcat(s, rady[0][rada]);
        else
            strcat(s, rady[1][rada]);
    }    
    else strcat(s, rady[2][rada]);
    *slovo = s;
    return;
}    

int analyze_diz(long cis, char **slovne) {
    if (cis == 0) return 0;
	int _ret = 0;
    int rada = 0;
    long num;
    char _s1[1000] = "", _s2[1000] = "";
    char *_str1 = _s1, *_str2 = _s2;
    int minus = 0;
    if (cis < 0) {
        minus = 1;
        cis = 0-cis;
    }    
    while (cis != 0) {
        num = fmod(cis, 1000);
        do_tisice(num, rada++, &_str1);
        strcat(_str1, _str2);
        strcpy(_str2, _str1);
        cis /= 1000;        
    }
    if (minus) {
        strcpy(_str2, "minus ");
        strcat(_str2, _str1);
    }
    *slovne = _str2;
    return _ret;
}    

int main(int argc, char* argv[])
{
    long uff_cislo;
    char retezec[1000] = "nula\nProc musim tohle hlasit, kdyz mam IQ 6000, to vazne nechapu.\nJe to tak ponizujici... ;o)";
	char *uff_slovne = retezec;
    int status;
    printf("Synteza slovniho vyjadreni cisel\nZadejte cele cislo: ");
	while ((status=scanf("%d", &uff_cislo))!=1) {
        printf("Chybny vstup!!!\nOpakujte zadani: ");
	    fflush(stdin); 
	}    
    if ((status = analyze_diz(uff_cislo, &uff_slovne)) != 0)
        printf("Tak tohle cislo nedokazu zpracovat ... lituji\n");
    else
    	printf("Vami zadane cislo %d se da slovne vyjadrit v nasledujici podobe:\n%s\n", uff_cislo, uff_slovne);

	system("PAUSE");
	return EXIT_SUCCESS;
}

