Zápočtová písemka C/C++
Command line program, jako argument dostane soucet cisel v různých číselných soustavách. Omezeno "cislicemi" 1-9A-Z. Po trose odmlouvání bylo povoleno, že se mezivýsledek vejde do unsigned long (počítám, že obecnější nebo původní zadní bylo že se vejde do C++ stringu). Př. jako argument dostane -300(4) + -200(3) + ZZZ(35) + 11111111110(2) - 11111111111111111111111111(1) Bacha muze dostat i jen 11(2) a pak musi 3.
Toto bylo zapoctuhodne, s povinnym restartem windows po aktualizacich a jinych komplikacich s microshit visual studiem to bylo za 3h splichtene za 5sekund deadline, mozna spis 5minut po. ;-P
#include<stdio.h>
#include<string.h> #include<conio.h>
#include<stdlib.h>
unsigned long pozice(char znak,int zaklad,int exponent) {
unsigned long umocneno = 1; int cislovka = 0; if((znak >= '0') && (znak <= '9')) cislovka = znak - '0'; else { cislovka = znak - 'A'; cislovka += 10; } while(exponent > 0) { umocneno = umocneno * zaklad; exponent --; } return umocneno * cislovka;
}
unsigned long parsuj(char * radka,char * lzavorka) {
unsigned long vysledek = 0; char * rzavorka; int zaklad; if(rzavorka = strchr(lzavorka,')')) { *rzavorka = 0; if(strlen(lzavorka)) zaklad = atoi(lzavorka+1); else return -2; } else return -1; //printf("\nparsuj - zaklad je %d \n", zaklad); int exponent = 0; while( --lzavorka ) { vysledek += pozice(*lzavorka,zaklad,exponent); if(lzavorka == radka) break; exponent ++; } return vysledek;
} int main(int argc,char ** argv)
{ int i = 1;
unsigned long vysledek = 0, mezivysledek = 0; char *lzavorka = 0; char mezivysledek_string\[64]; int zaporny = 0; int unarminus = 0; int plus = 1; int minus = 0; int uminus =0; char * zacatek; while(i < argc ) { if(lzavorka = strchr(argv\[i],'(')) { zacatek = argv\[i]; if('-' == argv\[i]\[0]) { uminus =1; zacatek ++; } mezivysledek = parsuj(zacatek,lzavorka); ultoa(mezivysledek,mezivysledek_string,10); if(minus && uminus) { plus = 1; minus = 0; } if(plus && uminus) { plus = 0; minus = 1; } if(mezivysledek <= vysledek) { if(plus) { if(zaporny) { vysledek -= mezivysledek; } else { vysledek += mezivysledek; } } else //minus
{
if(zaporny) { vysledek += mezivysledek; } else { vysledek -= mezivysledek; } } } else // mezivysledek je vetsi { if(plus) { if(zaporny) { vysledek = mezivysledek - vysledek; zaporny = 0; } else { vysledek += mezivysledek; } } else //minus
{
if(zaporny) { vysledek += mezivysledek; } else { vysledek = mezivysledek - vysledek; zaporny = 1; } } } plus = 0; minus = 0; uminus = 0; if ((0 == vysledek) && zaporny) zaporny = 0; } else { if('-' == argv\[i]\[0]) { if(plus || minus) uminus = 1; else minus = 1; } else { plus = 1; } } i ++; } /* char test\[10] = "a"; printf("\n a ja %d",atoi(test)); char ahoj\[] = "ABCDEFG"; int z = 'A'; z = ahoj\[2]; z -= 'A'; z+= 10; printf("\n test s A - %d \n",z); */ char vysledek_string\[128]; //vysledek = 21234; ultoa(vysledek,vysledek_string,10); char znamenko = ' '; if(zaporny) znamenko = '-'; printf ("Vysledek je: %c%s ",znamenko,vysledek_string); getch(); //343434(10) - 1030212(4) + 2350127(16) - - 322(5) return 0;
}