Příklady v jazyku C – část 7
Napište rekurzivní podprogram, který vypočítá faktoriál a použijte ho při vyvolání v hlavním programu: #include int fakt(int n) { return ( (n==0)? 1 : n*fakt(n-1) ); } int main() { int x; while (1) { printf(" Zadej hodnotu pro faktorial:"); scanf("%d",&x); if(x<=0) break; printf("%d faktorial je : %d \n\n", x, fakt(x) ); } return 0; }
Napište rekurzivní podprogram, který vypočítá Fibonnaciho posloupnost (každé další číslo v řadě je dáno součtem dvou čísel předcházejících) a zobrazí řadu od 0 do 15: #include long int fibo(long int x) { if (x<2) return (x); else return (fibo(x-1)+fibo(x-2)); } int main() { long int x; printf("Fibonnaciho posloupnost - rekurzivne: \n\n"); for (x=0;x<=15;x++) printf("Pro %2d je fibo(%2d) =%4d \n", x, x, fibo(x) ); while(!kbhit()); return 0; }
Napište rekurzivní podprogram, který vypočítá tzv.Ackermannovu funkci, která je definována následujícími rekurentními vzorci: Hodnoty A(m, n) m\nm\n01234n n n n n − 3A(3, − 3)A(3, A(4, 3)) A(4, 65533)A(4, A(5, 1))A(4, A(5, 2))A(4, A(5, 3)) 6A(5, 1)A(5, A(5, 1))A(5, A(6, 1))A(5, A(6, 2))A(5, A(6, 3))
#include int ack(int m, int n) { if ( m == 0 ) return (n+1); else if ((m > 0) && (n == 0)) return ack(m-1, 1); else return (ack(m-1, ack(m, n-1))); } int main() { int x; while (1) { printf(" Zadej hodnoty n, p pro Ackermannovu funkci:"); scanf("%d %d",&n, &p); if(n<0) break; printf("%d faktorial je : %d \n\n", x, ack(n,p) ); } return 0; }
Napište program, který naplní pole o 15 prvcích hodnotou jejich indexů a vypíše obsah tohoto pole na obrazovku: #include int main() { int i, x[15]; for (i=0;i<=14;i++) x[i] = i; printf("Obsah pole: n\n"); for (i=0;i<=14;i++) printf("Obsah %2d.prvku je %2d \n", i+1,x[i] ); while(!kbhit()); return 0; }
Napište program, který naplní pole o 10 prvcích hodnotou druhých mocnin jejich indexů a vypíše obsah tohoto pole na obrazovku: #include int main() { int i, x[10]; for (i=0;i<=9;i++) x[i] = i*i; printf("Obsah pole: n\n"); for (i=0;i<=9;i++) printf("Obsah %2d.prvku je %4d \n", i+1,x[i] ); while(!kbhit()); return 0; }
Napište program, který vypočítá Fibonnaciho posloupnost čísel, která jsou umístěna v jednorozměrném poli – vektoru délky 20 prvků: #include int main() { int i, x[20]; x[0]=0; x[1]=1; printf("Fibonnaciho posloupnost - v poli: n\n"); for (i=2;i<=19;i++) x[i] = x[i-1]+x[i-2]; for (i=0;i<=19;i++) printf("Pro %2d je fibo(%2d) =%4d \n", i+1,i+1,x[i] ); while(!kbhit()); return 0; }
Napište program, který zkopíruje všechny tabulka jednorozměrného pole " a " do pole " b " (všechny tabulka pole " b " jsou při deklaraci inicializovány na 0, tabulka pole " a " jsou načteny ze vstupu) – délky vektorů jsou 20 prvků. Vypište obsah pole " b " : #include int main() { int i, a[10], b[10]; for (i=0;i<=9;i++) b[i]=0; printf("Zadej hodnoty 10 prvku pole a: \n"); for (i=0;i<=9;i++) scanf("%d",&a[i]); for (i=0;i<=9;i++) b[i]=a[i]; printf("\nZkopirovane pole b:\n"); for (i=0;i<=9;i++) printf("%2d ",b[i]); while(!kbhit()); return 0; }
Napište program, který načte maximálně 100 čísel ze vstupu (počet také načte ze vstupu) a provede jejich setřídění algoritmem „bublinkové třídění“ : #include int main() { int tabulka[100], a, b, t, pocet; printf("Kolik bude prvku? \n"); scanf ("%d",&pocet); printf("\npocet = %d\n",pocet); for (a=0;a<pocet;a++) { scanf("%d",&tabulka[a]); printf("\nPrvek[%d] = %d\n",a+1,tabulka[a]);} /* Algoritmus bublinkoveho trideni */ for (a=1;a<pocet;++a) for (b=pocet-1;b>=a;--b) if ( tabulka[b-1] > tabulka[b] ) { t = tabulka[b-1]; tabulka[b-1] = tabulka[b]; tabulka[b] = t; } printf("\nVypis setrideneho pole: \n \n "); for (t=0;t<pocet;t++) printf("%4d \n ",tabulka[t]); while(!kbhit()); return 0;}
Napište program, který načte číslo, které obsahuje/neobsahuje nesetříděná tabulka a provede vyhledání čísla v tabulce algoritmem „lineární vyhledávání“ : #include int main() { int tabulka[20]={5,8,3,4,1,7,8,9,15,10,11,12,13,16,14,0,2,17,18,19} ; int i, j=0, prvek; /* výpis tabulky */ for (i=0;i<20;i++) printf("Prvek[%d] = %d\n",i+1,tabulka[i]); printf("Zadej hledany prvek: "); scanf ("%d",&prvek); /* Algoritmus linearniho vyhledavani */ for (i=0;i<20;i++) if ( tabulka[i] == prvek ) { j=i; break; } /* Ukonci cyklus po nalezeni prvku */ if ( j == 0 ) printf("\nPrvek: %d nenalezen v tabulce \n ",prvek); else printf("\nPrvek: %d nalezen na %d pozici tabulky. \n ",prvek,j+1); while(!kbhit()); return 0; }
Napište program, který načte číslo, které obsahuje/neobsahuje setříděná tabulka a provede vyhledání čísla v tabulce algoritmem „binární vyhledávání“ : #include int main() {int tabulka[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20} ; int i, nalezeno=0, prvek,levy=0,pravy=19,stred; /* Tabulka: */ for (i=0;i<20;i++) printf("Prvek[%d] = %d\n",i+1,tabulka[i]); printf("Zadej hledany prvek: "); scanf ("%d",&prvek); /* Algoritmus binarniho vyhledavani */ while (levy<=pravy && !nalezeno) { stred=(levy+pravy)/2; if ( tabulka[stred] == prvek ) nalezeno=1; else if ( tabulka[stred] < prvek ) levy = stred+1; else pravy = stred-1; printf("\nLevy:%2d Pravy:%2d Stred:%2d Tab[stred]: %2d",levy, pravy, stred, tabulka[stred]); } if ( nalezeno == 0 ) printf("\n\nPrvek: %d nenalezen v tabulce \n ",prvek); else printf("\n\nPrvek: %d nalezen na %d pozici tabulky. \n",prvek,stred+1); while(!kbhit()); return 0; }
Proveďte deklaraci řetězce „str“ délky max 80 znaků a načtěte řetězec z klávesnice. Zabezpečte, že se nepřečte více znaků, než je udaných 80. Po přečtení řetězce (stisknutí ENTER) se provede výpis řetězce: #include int main() { char str[20]; int i; printf("Zadej retezec (mene nez 20 znaku): \n"); /*gets(str);*/ fgets(str,19,stdin); printf("\n\nDelka zadaneho retezce je : %d\n\n",strlen(str)); for ( i=0 ; str[i] ; i++ ) printf("%c",str[i]); printf("\n%s",str); while(!kbhit()); return 0; }
Přečtěte z klávesnice první a druhý řetězec (max. 80 znaků) a proveďte následující řetězcové operace a vypište výsledek: a) zjištění délky řetězců b) porovnání řetězců ( strcmp(str1,str2) ) c) přidání str2 na konec str1 (vejde-li se součet délek do str1) (strcat(s1,s2)) d) zkopírování str2 do str1 ( strcpy(str1,str2) ) #include int main() { char str1[80], str2[80]; int i; printf("Vloz prvni retezec: "); gets(str1); printf("Vloz druhy retezec: "); gets(str2); /* a) zjisteni delky retezcu */ printf("%s je %d znaku dlouhy\n", str1, strlen(str1)); printf("%s je %d znaku dlouhy\n", str2, strlen(str2));
/* pokracovani programu … */ /* b) porovnani retezcu */ i = strcmp(str1, str2); if( !i ) printf("Retezce jsou totozne.\n"); else if(i<0) printf("%s je mensi nez %s\n", str1, str2); else printf("%s je vetsi nez %s\n", str1, str2); /* c) pridani str2 na konec str1, pokud je dost mista */ if(strlen(str1) + strlen(str2) < 80) { strcat(str1, str2); printf("%s\n", str1); } /* d) kopirovani str2 to str1 */ strcpy(str1, str2); printf("%s %s\n", str1, str2); while(!kbhit()); return 0; }
Vytvořte program – kalkulačku. Zadejte příkaz (součet, rozdíl, dělení, násobení, konec) jako řetězec, který načtete z klávesnice. Poté načtete z klávesnice první a druhé číslo jako operandy (řetězcovým způsobem a převedete řetězce na čísla pomocí funkce atoi (tj. číslo=atoi(řetězec)) ) a provedete požadovanou operaci. Je-li kód operace „konec“, program je ukončen. #include int main(void) { char command[80], temp[80]; int i, j; for( ; ; ) { printf("Zadej kód operace? "); gets(command); /* Zjisteni, zda chce uzivatel skoncit */ if(!strcmp(command, "konec")) break; printf(„Vloz první cislo: "); gets(temp); i = atoi(temp);
/* pokracovani programu … */ printf("Vloz druhe cislo: "); gets(temp); j = atoi(temp); /* nyni proved pozadovanou operaci */ if(!strcmp(command, "soucet")) printf("%d\n", i+j); else if(!strcmp(command, "rozdil")) printf("%d\n", i-j); else if(!strcmp(command, "deleni")) { if(j) printf("%d\n", i/j); } else if(!strcmp(command, "nasobeni")) printf("%d\n", i*j); else printf("Neznamy prikaz. \n"); } while(!kbhit()); return 0; }
Napište program, který přečte z klávesnice řetězec a vypíše jej pozpátku: #include int main(void) { char str[80]; int i; printf("Vloz retezec: "); gets(str); printf("Obraceny retezec: "); for (i=strlen(str)-1; i>=0; i--) printf("%c", str[i]); while(!kbhit()); return 0; }
Napište program, který opakovaně načítá řetězce. Při každém vstupu řetězce je tento řetězec zřetězen (pomocí strcat(str1, str2) ) s druhým řetězcem nazývaným „bigstr“. Na konec každého řetězce přidává nulový řádek. Když uživatel napíše „konec“, načítání se zastaví a vypíše se „bigstr“. Program se zastaví, také, pokud došlo k překročen íé délky pole „bigstr“. #include int main(void) { char bigstr[1000] = "", str[80]; for( ; ; ) { printf("Vloz retezec: "); gets(str); if(!strcmp(str, "konec")) break; strcat(str, "\n"); /* test na preteceni pole bigstr */ if(strlen(bigstr)+strlen(str) >= 1000) break; strcat(bigstr, str); } printf(bigstr); while(!kbhit()); return 0; }