Programování v C/CPP/soucet cisel v ruznych ciselnych soustavach
Z ωικι.matfyz.cz
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;
}