/* Program bigplus v1.0 34. SeŸtØte dvØ cel  dekadick , maxim lnØ dvacetim¡stn  Ÿ¡sla zadan  z povelov‚ ý dky. Zad n¡ a vìsledek vypiçte na obrazovku a do zadan‚ho souboru. vol n¡: bigplus sŸ¡tanec1 sŸ¡tanec2 cilovy_soubor */ #include #include #include #define z(x) ((x)+48) #define i(c) ((c)-48) // dve makra s parametrem // jen prepocitaji znak cisla na opravdove cislo a zpet int isNumber(char *s) { int i; for (i = 0; s[i] != 0; i ++) { if ((s[i] < '0') || (s[i] > '9')) return 0; } return 1; } char *smazNulu(char *s) { // smaze prvni nulu, existuje-li, a posune zbytek int i, l = strlen(s); if (i(s[0]) == 0) // je potreba mazat? for (i = 0; i < l; i ++) s[i] = s[i+1]; // posunuje znaky return s; } char *secti(char *c1, char *c2, char *v) { // secte dve cisla v dekadicke soustave zadana v retezci int l1 = strlen(c1), l2 = strlen(c2), lax; // lax - maximalni delka obou retezcu c1, c2 int i, cislo = 0, flag = 0; lax = (l1>l2)?l1:l2; // do lax uloz vetsi z obou velikosti retezcu for (i = 0; i < lax; i ++) { // pro vsechny znaky delej... cislo = ((i < l1)?i(c1[l1-i-1]):0) + ((i < l2)?i(c2[l2-i-1]):0) + flag; // do cisla uloz soucet dvou cifer na aktualni pozici // a pritom zkontroluj, jestli ma retezec tolik cifer, // jestli ne, potom pouzij nulu; pricti vlajku if (cislo > 9) { // kdyz bude sectene cislo vetsi nebo rovny 10 v[lax-i] = z(cislo-10); // do vysledku uloz jen druhou cifru... flag = 1; // ... a pak ve vlajce zustane jednicka } else { v[lax-i] = z(cislo); // jinak staci ulozit cislo samotne a ... flag = 0; // ... pak je vlajka nula } } v[0] = z(flag); // prvni misto se nikdy nezaplni a tady se muze vlozit vlajka // napr: 999 + 1 = 1000 v[lax+1] = 0; // retezec ukonci nulou return smazNulu(v); // byla-li vlajka nula, pak neni nutne mit nulu na zactku - smaz ji } int main(int argc, char *argv[]) { FILE *out; // vystupni soubor char soucet[22]; if (argc != 4) { // kontrola poctu argumentu printf("Program spuste takto:\n\tbigplus.exe cislo1 cislo2 [vystupni soubor]\n"); return 0; } if (strlen(argv[1]) > 20) { // kontrola delky retezce printf("Prilis dlouhe cislo\n"); return 0; } if (strlen(argv[2]) > 20) { // kontrola delky retezce printf("Prilis dlouhe cislo\n"); return 0; } if (!isNumber(argv[1])) { // kontrola samotneho cisla printf("Spatne zadane cislo\n"); return 0; } if (!isNumber(argv[2])) { // kontrola samotneho cisla printf("Spatne zadane cislo\n"); return 0; } if ((out = fopen(argv[3], "a+t")) == NULL) { // kontrola otevreni souboru printf("Nepodarilo se otevrit vystupni soubor: %s\n", argv[2]); return 0; } secti(argv[1], argv[2], soucet); // tady se oba retezce sectou fprintf(out, "%s\n", soucet); // vypis soucet do souboru printf("%s\n", soucet); // vypis na obrazovku fclose(out); // uzavri soubor return 1; }