int main(void) { FILE *fr; int c, i; int pole[POCET]; // pole na mnoztvo opakovani jednotlivych pismen
for (i = 0; i < POCET; i++) pole[i] = 0; // nulovanie pola - naplnenie pola nulami
if ((fr = fopen("TEXT.TXT", "r")) == NULL) { // otvorenie suboru s overenim ci existuje printf("Subor sa nepodarilo otvorit!\n"); return; } while ((c = getc(fr)) != EOF) { // citanie jednostlivych znakov suboru if (isalpha(c)) // ak je znak pismeno pole[toupper(c) - 'A']++; // v cykle zvacsuje o jedna prvok pola s indexom // velke pismeno (c) - 'A', teda ak napr. c = 'A', // 'A' - 'A' = 0, teda obsah pole[0] sa zvacsi o jedna } printf("V subore bol tento pocet jednotlivych pismen:\n"); for (i = 0; i < POCET; i++) { printf("%c - %2d\t", i + 'A', pole[i]); // v cykle vypisuje jednotlive velke pismena // a k nim hodnoty z prislusnych prvkov pola for (c = 0; c < pole[i]; c++) { // vypis histogramu - prislusneho poctu hviezdiciek putchar('*'); // za hodnoty z prislusnych prvkov pola } putchar('\n'); // odriadkovanie po kazdom riadku } fclose(fr); return 0; }
2. Napíš funkciu void ahoj(void), ktorá vytlačí na obrazovku číslo a slovo ahoj, pričom číslo bude poradové číslo volania funkcie ahoj(). Ďalej definuj premennú p_ahoj ako pointer na funkciu ahoj(). V cykle volaj funkciu ahoj() pomocou pointeru p_ahoj.
Spoiler:
Kód:
/*********************************************** * * 2.c ver. 1.0 * popis je vyssie * =========================================== * * libcosenior, september 2012 * ***********************************************/
#include <stdio.h>
/* funkcia vytlaci na obrazovku poradove cislo volania funkcie a slovo ahoj */ void ahoj(void) { static int i = 0; // staticka premenna
i++; // sa pri kazdom volani funkcie zvysi o jedna printf("%2d ahoj\n", i); // vypis stanoveneho cisla a slova (2 je poticia cisla) }
int main(void) { int i; void (*p_ahoj)(); // pointer na funkciu vracajucu void
p_ahoj = ahoj; // priradi pointeru p_ahoj adresu funkcie ahoj() for (i = 0; i < 10; i++) { (*p_ahoj)(); // volanie funkcie ahoj() pomocou pointeru prvy spôsob p_ahoj(); // volanie funkcie ahoj() pomocou pointeru druhy spôsob } return 0; }
3. V súbore POZDRAVY.C napíš niekoľko funkcií typu void ahoj(void), ktoré vytlačia vždy jeden príslušný pozdrav (ahoj, nazdar, servus, cauko, ...). V súbore HLAVNY.C definuj pole pointerov na tieto funkcie a inicializuj ho adresami týchto funkcií. Ďalej definuj pole znakov, ktoré inicializuj počiatočnými (alebo prístupovými) znakmi jednotlivých pozdravov. Vytvor program, ktorý bude čítať znaky z klávesnice, rozpozná ich a vytlačí príslušný pozdrav pomocou pointeru na funkciu. Nepoužívaj prepínač switch!
Spoiler:
Kód:
/*********************************************** * * POZDRAVY.C ver. 1.0 * funkcie typu void ahoj(void) * =========================================== * * libcosenior, september 2012 * ***********************************************/
#include <stdio.h>
/* funkcia vytlaci na obrazovku poradove cislo volania funkcie a slovo ahoj */ void ahoj(void) { static int i = 0; // staticka premenna
i++; // sa pri kazdom volani funkcie zvysi o jedna printf("%2d ahoj\n", i); // vypis stanoveneho cisla a slova (2 je poticia cisla) }
/* funkcia vytlaci na obrazovku poradove cislo volania funkcie a slovo nazdar */ void nazdar(void) { static int i = 0; // staticka premenna
i++; // sa pri kazdom volani funkcie zvysi o jedna printf("%2d nazdar\n", i); // vypis stanoveneho cisla a slova (2 je poticia cisla) }
/* funkcia vytlaci na obrazovku poradove cislo volania funkcie a slovo servus */ void servus(void) { static int i = 0; // staticka premenna
i++; // sa pri kazdom volani funkcie zvysi o jedna printf("%2d servus\n", i); // vypis stanoveneho cisla a slova (2 je poticia cisla) }
/* funkcia vytlaci na obrazovku poradove cislo volania funkcie a slovo cauko */ void cauko(void) { static int i = 0; // staticka premenna
i++; // sa pri kazdom volani funkcie zvysi o jedna printf("%2d cauko\n", i); // vypis stanoveneho cisla a slova (2 je poticia cisla) }
/* funkcia vytlaci na obrazovku poradove cislo volania funkcie a slovo halo */ void halo(void) { static int i = 0; // staticka premenna
i++; // sa pri kazdom volani funkcie zvysi o jedna printf("%2d halo\n", i); // vypis stanoveneho cisla a slova (2 je poticia cisla) }
Spoiler:
Kód:
/****************************************************** * * HLAVNY.C ver. 1.0 * definuje pole pointerov na funkcie a inicializuje ho * adresami tychto funkcii, definuje pole znakov * a inicializuje ho pociatocnymi pismenami pozdravov * =================================================== * * libcosenior, september 2012 * ******************************************************/
#include "POZDRAVY.C" // aby sa dali volat funkcie
typedef void (* P_FCE) (); // definicia pointeru na funkciu vracajucu typ void * P_FCE funkcia[] = {ahoj, nazdar, servus, cauko, halo}; // pole pointerov na funkcie s inicializyciou
//char znaky[] = {'a', 'n', 's', 'c', 'h'}; // pole charov s inicializaciou 1. sposob char znaky[] = {"ansch"}; // pole charov s inicializaciou 2. sposob /* funguju obidva sposoby */
Kód:
/*********************************************** * * 3.c ver. 1.0 * program cita znaky z klavesnice, rozpozna ich * a vytlaci prislusny pozdrav pomocou pointeru * na funkciu * =========================================== * * libcosenior, september 2012 * ***********************************************/
#include "HLAVNY.C" // aby sa pripojili subory POZDRAV.C a HLAVNY.C aj s kniznicou <stdio.h>
int main(void) { int i, j; char c; for (;;) { j = 0; printf("Vyber si pismeno a, n, s, c alebo h (k = koniec): "); c = getchar(); while (getchar() != '\n') // odstranenie znaku Enter ; for (i = 0; i < 5; i++) { // cyklus c == znaky[i] ? funkcia[i] () : j++; // porovna c s obsahom pola znaky[] // ak je tam, spusti prislusnu funkciu // ak nie, zvysi premennu j o jedna if (c == 'k') // vyber - ukoncenie behu programu return 0; if (j == 5) { // c sa nerovna znakom z pola znaky[] printf("Nespravny vyber!\n"); break; } } } return 0; }
4. Napíš program, ktorý zistí počet jednotlivých písmen v každom riadku súboru TEXT.TXT. Výsledky vytlač v prehľadnej tabuľke, kde vo vodorovnom smere budú písmená (malé a veľké nerozlišuj) a v zvislom smere čísla riadkov. Spracuj len prvých 20 riadkov súboru.
Spoiler:
Kód:
/*********************************************** * * 4.c ver. 1.0 * popis je vyssie * =========================================== * * libcosenior, september 2012 * ***********************************************/
#include <stdio.h> #include <ctype.h> // pouzitie makier isalpha() a toupper()
#define POCET ('Z' - 'A' + 1) // rozsah vsetkych velkych pismen (bez diakritiky) + 1 /* ciara nad a pod tabulkou */ #define CIARA { for (i = 'A'; i <= 'Z'; i++) printf("---"); printf("--"); putchar('\n');}
int main(void) { FILE *fr; int i, j = 0; char c; int pole[POCET]; // pole na mnoztvo opakovani jednotlivych pismen
for (i = 0; i < POCET; i++) pole[i] = 0; // nulovanie pola - naplnenie pola nulami
if ((fr = fopen("TEXT.TXT", "r")) == NULL) { // otvorenie suboru s overenim ci existuje printf("Subor sa nepodarilo otvorit!\n"); return; } printf("TABULKA poctu vyskytov jednotlivych pismen v riadkoch suboru.\n"); CIARA; printf("pc|"); for (i = 'A'; i <= 'Z'; i++) { // riadok z pismen printf(" %c", i); if (i < 'Z') putchar('|'); } //putchar('\n'); while ((c = getc(fr)) != EOF) { // citanie jednostlivych znakov suboru if (j == 20) { // ukoncenie behu programu po 20 riadku suboru CIARA; return 0; } if (c != '\n') { if (isalpha(c)) // ak je znak pismeno pole[toupper(c) - 'A']++; // v cykle zvacsuje o jedna prvok pola s indexom // velke pismeno (c) - 'A', teda ak napr. c = 'A', // 'A' - 'A' = 0, teda obsah pole[0] sa zvacsi o jedna } else { j++; // pocitadlo riadkov printf("%2d|", j); for (i = 0; i < POCET; i++) { printf("%2d", pole[i]); // v cykle vypisuje hodnoty z prislusnych prvkov pola if (i < (POCET - 1)) putchar('|'); } //putchar('\n'); for (i = 0; i < POCET; i++) pole[i] = 0; // nulovanie pola - naplnenie pola nulami } } fclose(fr); return 0; }
5. Napíš funkciu void zorad(int x[], int y[], int pocet), ktorá zoradí pole x podľa veľkosti vzostupne do poľa y.
Spoiler:
Kód:
/*********************************************** * * 5.c ver. 1.0 * popis je vyssie * =========================================== * * libcosenior, september 2012 * ***********************************************/
#include <stdio.h> #define POCET 10 //definovany pocet prvkov pola
/* funkcia zoradi pole x do pola y vzostupne */ void zorad(int x[], int y[], int pocet) { int i, j = 0, pomoc; for (i = 0; i < pocet; i++) // skopirovanie pola x do pola y y[i] = x[i]; for (j = 0; j < pocet; j++) { for (i = 0; i < pocet; i++) { if (y[j] < y[i]) { // ak je [0] prvok mensi ako [1], vymenia sa navzajom, pomoc = y[j]; // ak je [0] prvok mensi ako [2], vymenia sa navzajom, y[j] = y[i]; // tak az do konca pola, potom ak je [1] mensi ako [2], y[i] = pomoc; // vymenia sa navzajom, atd. az do konca pola } } } }
int main(void) { int i; int polex[POCET] = {25, -36, 45, 15, 258, 37, -1, 2, 5, 4}; int poley[POCET];
zorad(polex, poley, POCET); // volanie funkcie printf("Nezoradene pole.\n"); for (i = 0; i < POCET; i++) printf("%3d, ", polex[i]); // vypis pola x putchar('\n'); printf("To iste pole zoradene vzostupne.\n"); for (i = 0; i < POCET; i++) printf("%3d, ", poley[i]); // vypis pola y putchar('\n'); return 0; }
6. Napíš funkciu int parne(int x[], int y[], int pocet), ktorá skopíruje z poľa x do poľa y len párne prvky a vráti počet prvkov pola y.
Spoiler:
Kód:
/*********************************************** * * 6.c ver. 1.0 * popis je vyssie * =========================================== * * libcosenior, september 2012 * ***********************************************/
#include <stdio.h> #define POCET 10
/* funkcia zoradi pole x do pola y vzostupne */ int parne(int x[], int y[], int pocet) { int i, j = 0, vysledok; for (i = 0; i < pocet; i++) { if ((x[i] % 2 == 0) && x[i] != 0) { y[j] = x[i]; j++; } } return (j); }
int main(void) { int i; int polex[POCET] = {25, -36, 0, 45, 258, 37, -1, 2, 56, 12}; int poley[POCET];
parne(polex, poley, POCET); printf("Inicializovane pole.\n"); for (i = 0; i < POCET; i++) printf("%3d, ", polex[i]); putchar('\n'); printf("To iste pole, vypisane len parne cisla.\n"); for (i = 0; i < parne(polex, poley, POCET); i++) printf("%3d, ", poley[i]); printf("\nMa %d prvkov.\n", parne(polex, poley, POCET)); return 0; }
_________________ kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor), Skype: libcokamo, ICQ: 56312279 Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.
Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 1 hosť
Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre Nemôžete zasielať súbory v tomto fóre