Programování v C/CPP/soucet cisel v ruznych ciselnych soustavach

Z ωικι.matfyz.cz
Přejít na: navigace, hledání

Zápočtová písemka C/C++[editovat | editovat zdroj]

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;
}