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;

}