Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 20 Apr 2024, 05:23

Všetky časy sú v GMT + 1 hodina




Fórum je zamknuté Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie.  [ Príspevok: 1 ] 
Autor Správa
PoslaťNapísal: 01 Sep 2012, 21:06 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
1. Zisti počet jednotlivých písmen v súbore TEXT.TXT, Zistené počty vypíš číslom, ale aj pomocou histogramu, napr.:
Kód:
    A:   5 *****
    B:  10 **********

Spoiler:
Kód:
/***********************************************
 *
 * 1.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

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.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Fórum je zamknuté Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie.  [ Príspevok: 1 ] 

Všetky časy sú v GMT + 1 hodina


Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 1 hosť


Rýchla úprava:
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

Hľadať:
Skočiť na:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK