mesiac<=12;//podmienka cyklu mesiac++ ) //AKTUALIZACIA premennej cyklu, // vzdy na konci vykonaneho tela cyklu tesne pred kontrolou podmienky { //telo cyklu printf("Mesiac c. %2d ma %2d dni.\n", mesiac, pocet_dni(mesiac)); } //finalizacia za cyklom } //nacita mesiac a vypise jeho pocet dni, // vrati 0, ak zlyhalo nacitanie mesiaca int vypis_dni_dowhile() { int mesiac; //TODO: overit nacitanie? do { printf("Zadaj cislo mesiaca: "); scanf("%d", &mesiac); //TODO: break, ak sa nacitalo nieco zle printf("Mesiac c. %2d ma %2d dni.\n", mesiac, pocet_dni(mesiac)); } while (mesiac >= 1 && mesiac <= 12);
// (ale nesmie byt len privelke, v zavislosti na prekladaci)
charbuffer[len+1];
//vysledok je garantovany, nemusime sa o neho starat
// posleme ho rovno na vypis
printf("\nTest1a: %s\n",generuj1(buffer,len));
//pri skonceni funkcie sa buffer uvolni automaticky
}
//Sposob pouzitia generuj1:
voidtest1b(unsignedintlen)
{
// mozeme pouzit aj pamat dynamicku:
char*buffer;//pripravime si len pointer
//pamat si vyziadame od systemu podla len
buffer=(char*)malloc((len+1)*sizeof(char));
//musime ale skontrolovat, ci je dost pamate
if(buffer!=NULL)
{
//vysledok je garantovany, nemusime sa o neho starat
// posleme ho rovno na vypis
printf("\nTest1b: %s\n",generuj1(buffer,len));
//kedze sme mali dynamicku pamat, ktoru uz nepotrebujeme, uvolnime ju
free(buffer);
}
//free(buffer) je vnutri if, ak sa nepodarilo alokovat, nemame co uvolnit
}
//POZOR: ZLA VERZIA FUNKCIE, TAKTO SA TO NEMA POUZIVAT!
char*generuj2(unsignedintlen)
{
unsignedinti;
//automaticka alokacia, pole variabilnej dlzky (C99 standard)
charbuffer[len+1];
for(i=0;i<len;i+=2){buffer[i]=SPOLUHLASKY[rand()%LENSPOLU];buffer[i+1]=SAMOHLASKY[rand()%LENSAMO];}buffer[len]='\0';//TOTO JE VELMI NEBEZPECNA CHYBA // -co sa stane: posle sa odkaz na pamat buffer, ktora // po return prestane byt alokovana // -problem je: obcas to moze fungovat: ked sa nevola dalsia funkcia, // data zostanu v pamati // -ked sa vsak vola dalsia funkcia (napr. printf), buffer sa prepise // udajmi tejto novej funkcie return buffer; } //Ukazka problemov s generuj2 void test2(unsigned int len) { //pre generuj2 sa o pamat zdanlivo nemusime starat //ak date dost velku len, vysledok sa zobrazi "poskodeny" printf("\nTest2: %s\n", generuj2(len)); } //Funkcia so statickou pamatou (podobne, keby buffer bola globalna premenna) //Funkcia ma svoju pamat, vytvara retazec v nej, volajuca funkcia // sa o nic nemusi starat //PROBLEM: buffer existuje len jeden: // - neda sa pouzit paralelne, // - pri druhom volani sa prepise starsia hodnota //PROBLEM2: staticke pole ma fixnu dlzku, musime kontrolovat, ci nepretecie char* generuj3(unsigned int len) { unsigned int i; //staticka alokacia, pole musi mat fixnu dlzku static char buffer[MAXLEN+1]; //ak je vstupny parameter prilis velky, nemozeme splnit ulohu // vratime neplatnu adresu NULL ako chybu if (len > MAXLEN)
returnNULL;
for(i=0;i<len;i+=2)
{
buffer[i]=SPOLUHLASKY[rand()%LENSPOLU];
buffer[i+1]=SAMOHLASKY[rand()%LENSAMO];
}
buffer[len]='\0';
//tato funkcia vlastne vracia vzdy tu istu adresu:
returnbuffer;
}
//Ukazka problemov s generuj3
voidtest3(unsignedintlen)
{
//pre generuj3 sa opat o pamat zdanlivo nemusime starat
// ale budeme chciet teraz 2 retazce, takze si pripravime 2 smerniky
// na ulozenie vystupnej adresy z generuj3
char*str1,*str2;
str1=generuj3(len);//ulozime si vysledok pre dalsie pouzitie
if(str1!=NULL)//kontrola...
printf("\nTest3, str1 (%p) %s\n",str1,str1);
//poznamka: %p nam vypise adresu, nie retazec, na kontrolu
str2=generuj3(len);//dame si dalsi retazec
if(str2!=NULL)//kontrola...
printf("\nTest3, str2 (%p) %s\n",str2,str2);
//a pozrieme sa naspat na str1:
if(str1!=NULL)
printf("\nTest3, str1 (%p) %s\n",str1,str1);
}
//Funkcia s dynamickou pamatou, funkcia vygeneruje nove pole podla poziadavky
//POZOR: volajuca funkcia sa musi postarat o uvolnenie pamate
// - ak to nespravi, dochadza k postupnemu vycerpavaniu pamate, memory leak
// (zial casty problem aj niektorych komercnych programov a hier)
char*generuj4(unsignedintlen)
{
unsignedinti;
//tu si vytvorime len pointer, kde si neskor ulozime adresu
// novo pridelenej pamate
char*buffer;
//dame si pridelit novu pamat od systemu,
// potrebujeme pamat, kde sa zmesti len+1 znakov (char)
// ziskanu adresu ulozime do smernika buffer
buffer=(char*)malloc((len+1)*sizeof(char));
//ak nie je dost pamate, malloc vrati neplatnu adresu NULL
// v tomto pripade ju posunieme volajucej funkcii na osetrenie
if(buffer==NULL)
returnbuffer;
//tu mame platne pole, postupujeme ako predtym
for(i=0;i<len;i+=2)
{
buffer[i]=SPOLUHLASKY[rand()%LENSPOLU];
buffer[i+1]=SAMOHLASKY[rand()%LENSAMO];
}
buffer[len]='\0';
//tato funkcia vracia adresu pridelenu cez malloc,
// ktoru si pamatame v premennej buffer
returnbuffer;
}
//Ukazka pouzitia generuj4
voidtest4a(unsignedintlen)
{
//pouzijeme podobny kod ako pre generuj4
//pre generuj3 sa opat o pamat zdanlivo nemusime starat
// ale budeme chciet teraz 2 retazce, takze si pripravime 2 smerniky
// na ulozenie vystupnej adresy z generuj3
char*str1,*str2;
str1=generuj4(len);//ulozime si vysledok pre dalsie pouzitie
if(str1!=NULL)//kontrola...
printf("\nTest4a, str1 (%p) %s\n",str1,str1);
str2=generuj4(len);//dame si dalsi retazec
if(str2!=NULL)//kontrola...
printf("\nTest4a, str2 (%p) %s\n",str2,str2);
//a pozrieme sa naspat na str1:
if(str1!=NULL)
printf("\nTest4a, str1 (%p) %s\n",str1,str1);
//po skonceni prace s dynamickymi retazcami musime pamat uvolnit rucne
// (vid test4b co sa stane, ked nie)
//retazce uvolni ta funkcia, ktora vie, ze sa uz dalej nebudu pouzivat
if((k&0x7)==0)//to iste co k % 8, ale pozor na zatvorkovanie!
printf(" ");
}
// number sa posunie o k bitov, k-ty bit bude LSB,
// operacia x&1 vyberie len LSB z x
}
//vypise v binarnom tvare obsah pamate od nejakej adresy
voidbinary_mem(unsignedchar*mem,intlen){
staticcharout[9]="";
unsignedcharc;
for(inti=0;i<len;i++)
{
c=*mem++;//vyberie nasledovny znak a posunie sa v pamati
//je rychlejsie robit jednu printf operaciu a bez cyklov...
// MSB ide do out[0], LSB do out[1]
out[7]='0'+((c>>0)&1);//pozor na zatvorkovanie!, & ma nizsiu prioritu ako +
out[6]='0'+((c>>1)&1);
out[5]='0'+((c>>2)&1);
out[4]='0'+((c>>3)&1);
out[3]='0'+((c>>4)&1);
out[2]='0'+((c>>5)&1);
out[1]='0'+((c>>6)&1);
out[0]='0'+((c>>7)&1);
printf("%s ",out);
}
}
intmain()
{
unsignedinta=0xdeadbeef;
unsignedintb=0x0f3c5a;
printf("\nBinarny vypis a : ");
binary(a);
printf("\nBinarne od &a : ");
binary_mem((unsignedchar*)&a,sizeof(a));
printf("\nBinarny vypis b : ");
binary(b);
printf("\nBinarny vypis ~b : ");
binary(~b);
printf("\nBinarny vypis a|b : ");
binary(a|b);
printf("\nBinarny vypis a&b : ");
binary(a&b);
printf("\nBinarny vypis a^b : ");
binary(a^b);
printf("\nBinarny vypis b>>4: ");
binary(b>>4);
printf("\nBinarny vypis b<<4: ");
binary(b<<4);
return0;
}
Tento web používa súbory cookies. Prehliadaním webu vyjadrujete súhlas s ich používaním.
Viac informácií o tom, ktoré cookies používame, alebo ako ich môžete vypnúť nájdete tu: Využitie cookies. Akceptovať
Privacy & Cookies Policy
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are as essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.