Škôlka jazyka C

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

Aktuálny čas je 20 Apr 2024, 15:21

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: 27 Sep 2012, 19:20 
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. Napíš program, ktorý naplní maticu 10 x 10 int číslami 0 - 99 a pomocou pointerov vytlačí jej obsah prehľadne na obrazovku. Pri nastavovaní hodnôt prvkov pristupuj do matice pomocou indexov.
Spoiler:
Kód:
/***********************************************
 *
 * 1.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>

int main(void)
{
    int i, j, x[10][10]; // dvojrozmerne pole o 100 prvkoch

    for (i = 0; i < 10; i++) { // pre kazdy riadok
        for (j = 0; j < 10; j++) // pre kazdy stlpec
            x[i][j] = j + (i * 10); // vkladanie cisiel od 0 do 99 po riadkoch
    }
    for (i = 0; i < 10; i++) { // vypis cisla riadku
        printf("mapa pamati pre %d. riadok: \n",i);
        for(j = 0; j < 10; j++) // vypis cisla stlpca a hodnoty prvkov
            printf("\t stlpec %d \t hodnota %d \n", j, x[i][j]);
        putchar('\n');
    }

    return 0;
}

2. Definuj statické pole 5 x 5 int a vypíš adresu začiatku poľa, nultého a prvého riadku, prvku [0][0], [1][0] a posledného prvku. Pomocou sizeof() zisti veľkosť poľa a porovnaj toto číslo s bázovou adresou poľa a adresou jeho posledného prvku. Adresy vypisuj formátom %p alebo %x.
Spoiler:
Kód:
/***********************************************
 *
 * 2.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>

int main(void)
{
    int i, j;
    int x[5][5]; // dvojrozmerne pole o 25 prvkoch

    printf("Vypisem adresy:\n"
           "zaciatok pola \t%p\n" // *x
           "nulty riadok \t%p\n"  // x[0] = 0-ty riadok, 0-ty stlpec - nie je uvedeny
           "prvy riadok \t%p\n"   // x[1] = 1-ty riadok, 0-ty stlpec - nie je uvedeny
           "prvok [0][0] \t%p\n"  // &x[0][0]
           "prvok [1][0] \t%p\n"  // &x[1][0]
           "posledny prvok \t%p\n" // &x[4][4]
           , *x, x[0], x[1], &x[0][0], &x[1][0], &x[4][4]);
    printf("%d, %d\n", (&x[4][4] - *x), (sizeof(x) / sizeof(x[0] + 0)));

    return 0;
}

3. Napíš program, ktorý prečíta súbor a pomocou poľa pointerov na char ho uloží do
dynamickej pamäti po riadkoch. Ukladaj len skutočné dĺžky riadkov. Čítaný súbor nebude mať viac
ako 1000 riadkov. Do druhého súboru zapíš prečítaný súbor opačne, teda najskôr posledný riadok
a nakoniec prvý riadok. Pre čítanie celého riadku použi funkciu fgets().
Spoiler:
Kód:
/***********************************************
 *
 * 3.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int i, j;
    FILE *fr, *fw;
    char *pole[1000]; // definicia jednorozmerneho pola pointerov

    for (i = 0; i < 1000; i++) { // dynamicky alokovany druhy rozmer pola
        if ((pole[i] = (char *) malloc(1000)) == NULL) {
            printf("Malo pamati");
            return;
        }
    }
    if ((fr = fopen("DOPIS.TXT", "r")) == NULL) {
        printf("Subor sa neda otvorit.");
        return;
    }
    if ((fw = fopen("KOPIA.TXT", "w")) == NULL) {
        printf("Subor sa neda otvorit.");
        return;
    }
    i = 0;
    while (fgets((pole[i]), 999, fr) != NULL && i <= 1000) // vlozenie riadkov do pola
        i++;
    i -= 1;
    while (i != -1) {
        fputs(pole[i], fw); // vlozenie riadkov do noveho suboru opacne
        i--;
    }
    fclose(fr);
    fclose(fw);

    return 0;
}

4. Uprav predchádzajúci program tak, že bude na obrazovku vypisovať len riadky, v ktorých sa objaví slovo, ktoré bude zadané z klávesnice. Na hľadanie reťazca využi funkciu srtstr().
Spoiler:
Kód:
/***********************************************
 *
 * 4.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int i, j;
    FILE *fr, *fw;
    char *pole[1000]; // definicia jednorozmerneho pola pointerov
    char  slovo[50];

    for (i = 0; i < 1000; i++) { // dynamicky alokovany druhy rozmer pola
        if ((pole[i] = (char *) malloc(1000)) == NULL) {
            printf("Malo pamati");
            return;
        }
    }
    if ((fr = fopen("DOPIS.TXT", "r")) == NULL) {
        printf("Subor sa neda otvorit.");
        return;
    }
    if ((fw = fopen("KOPIA.TXT", "w")) == NULL) {
        printf("Subor sa neda otvorit.");
        return;
    }
    i = 0;
    while (fgets((pole[i]), 999, fr) != NULL && i <= 1000) // vlozenie riadkov do pola
        i++;
    i -= 1;
    while (i != -1) {
        fputs(pole[i], fw); // vlozenie riadkov do noveho suboru opacne
        i--;
    }
    printf("Zadaj slovo a vypisem riadky, ktore ho obsahuju: ");
    scanf("%s", slovo);
    for (i = 0; i < 1000; i++) {
        if (strstr(pole[i], slovo))
            puts(pole[i]);
    }
    fclose(fr);
    fclose(fw);

    return 0;
}

5. Uprav predchádzajúci program tak, že vytvorí súbor ODKAZY.TXT, kde ku každému slovu zo súboru SLOVA.TXT pripíše čísla riadkov, na ktorých sa príslušné slovo nachádzalo.
Spoiler:
Kód:
/***********************************************
 *
 * 5.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int i, j, k, pocet_slov;
    FILE *fr, *fr1, *fw;
    char *pole[1000], *slovo[50]; // definicia jednorozmerneho pola pointerov

    /* dynamicky alokovany druhy rozmer pola */
    for (i = 0; i < 1000; i++) {
        if ((pole[i] = (char *) malloc(1000)) == NULL) {
            printf("Malo pamati");
            return;
        }
    }
    for (i = 0; i < 50; i++) {
        if ((slovo[i] = (char *) malloc(50)) == NULL) {
            printf("Malo pamati");
            return;
        }
    }

    /* otvorenie suboru DOPIS.TXT na citanie a vlozenie jeho obsahu
       do dvojrozmerneho pola po riadkoch */
    if ((fr = fopen("DOPIS.TXT", "r")) == NULL) {
        printf("Subor sa neda otvorit.");
        return;
    }
    i = 0;
    while (fgets((pole[i]), 999, fr) != NULL && i <= 1000) // vlozenie riadkov do pola
        i++;
    fclose(fr);

    /* otvorenie suboru SLOVA.TXT na citanie a vlozenie jednotlivych slov
       do dvojrozmerneho pola po riadkoch */
     if ((fr1 = fopen("SLOVA.TXT", "r")) == NULL) {
        printf("Subor sa neda otvorit.");
        return;
    }
    i = 0;
    while (fgets((slovo[i]), 49, fr1) != NULL && i <= 50) { // vlozenie riadkov do pola
        slovo[i][strlen(slovo[i]) - 1] = '\0'; // orezanie znaku '\n'
        //printf("%s - %d\n", slovo[i], strlen(slovo[i]));
        i++;
    }
    fclose(fr1);
    pocet_slov = i; // pamata si pocet riadkov pola

    /* otvorenie suboru ODKAZY.TXT na zapis a vlozenie do neho
       po riadkoch jednotlive slova s vypisom cisiel riadkov kde sa
       v subore DOPIS.TXT nachadzaju*/
    if ((fw = fopen("ODKAZY.TXT", "w")) == NULL) {
        printf("Subor sa neda otvorit.");
        return;
    }
    for(k = 0; k < pocet_slov; k++) {
        fprintf(fw, "%s - ", slovo[k]); // vlozenie slova
        j = 0;
        for (i = 0; i < 1000; i++) {
            if (strstr(pole[i], slovo[k]))
                fprintf(fw, "%d ", i); // vlozenie cisiel riadkov
        }
        fprintf(fw, "\n"); // odriadkovanie riadku v suboru
    }
    fclose(fw);
    printf("Skontroluj si obsah suboru ODKAZY.TXT.\n");
    return 0;
}

6. Definuj v main() lokálne automatické pole 10 x 10 prvkov typu int a vytvor funkcie napln() a vytlac(). Prvá funkcia toto pole naplní číslami 0 - 99 a druhá ho vytlačí na obrazovku. Pole odovzdávaj do obidvoch funkcií ako skutočný parameter.
Spoiler:
Kód:
/***********************************************
 *
 * 6.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void napln(int pole[][10], int pocet);
void vytlac(int pole[][10], int pocet);

int main(void)
{
    int pole[10][10]; // definicia lokalne automatickeho dvojrozmerneho pola

    napln(pole, 10);
    vytlac(pole, 10);

    return 0;
}

/* funkcia naplni dvojrozmerne pole cislami 0 - 99 */
void napln(int pole[][10], int pocet)
{
    int i, j, k = 0;

    for (i = 0; i < pocet; i++) {
        for (j = 0; j < 10; j++) {
            pole[i][j] = k; // ulozenie cisla do prvku pola
            k++; // zvysenie ukladaneho cisla o jedna
        }
    }
}

/* funkcia vytlaci na obrazovku obsah dvojrozmerneho pola */
void vytlac(int pole[][10], int pocet)
{
    int i, j;

    for (i = 0; i < pocet; i++) {
        for (j = 0; j < 10; j++)
            printf("%d\n", pole[i][j]); // vypis jednotlivych prvkov pola pod seba
    }
}

7. Napíš program, ktorý vytvorí dynamické pole a dolnú trojuholníkovú maticu. Túto maticu naplň číslami xij, kde xij = i * 10 + j a vytlač ju.
Spoiler:
Kód:
/***********************************************
 *
 * 7.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int i, j;
    int *pole[10]; // definicia jednorozmerneho pola pointerov

    /* dynamicky alokovany druhy rozmer pola */
    for (i = 0; i < 10; i++)
        pole[i] = (int *) malloc((i + 1) * sizeof(int));

    /* naplnenie pola premennymi podla vzorca: prvok = i * 10 + j */
    for (i = 0; i < 10; i++) {
        for (j = 0; j < i + 1; j++)
        pole[i][j] = i * 10 + j;
    }

    /* vypis obsahu pola po riadkoch */
    for (i = 0; i < 10; i++) {
        for (j = 0; j < i + 1; j++)
            printf("%2d ", pole[i][j]);
        putchar('\n');
    }

    return 0;
}

8. Napíš program, ktorý prečíta parametre príkazového riadku a vypíše ich veľkými písmenami.
Spoiler:
Kód:
/***********************************************
 *
 * osem.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
    int i, j;

   for (i = 0; i < argc; i++) {
      for (j = 0; j < strlen(argv[i]); j++)
            printf("%c", toupper(argv[i][j]));
      putchar(' ');
   }
    return 0;
}

9. Napíš program, ktorý vypíše na obrazovku súbor, ktorého meno je prvý parameter príkazového riadku. Pokiaľ bude uvedený aj druhý parameter, považuj ho za meno súboru, do ktorého sa bude čítaný súbor kopírovať namiesto výpisu na obrazovku. Ak nebude uvedený žiadny parameter, vypíš prehľadný návod k použitiu.
Spoiler:
Kód:
/***********************************************
 *
 * 9.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE *fr, *fw;
    char c;

    if (argc == 2) {
        if ((fr = fopen(argv[1], "r")) == NULL) {
            printf("\nSubor %s sa nepodarilo otvorit!\n", argv[1]);
            return 0;
        }
        putchar('\n');
        while ((c = getc(fr)) != EOF)
            putchar(c);
        fclose(fr);
    }
    else if (argc == 3) {
        if ((fr = fopen(argv[1], "r")) == NULL) {
            printf("\nSubor %s sa nepodarilo otvorit!\n", argv[1]);
            return 0;
        }
        if ((fw = fopen(argv[2], "w")) == NULL) {
            printf("\nSubor %s sa nepodarilo otvorit!\n", argv[2]);
            return 0;
        }
        while ((c = getc(fr)) != EOF)
            putc(c, fw);
        fclose(fr);
        fclose(fw);
        printf("\nObsah suboru %s bol prekopirovany do suboru %s.\n", argv[1], argv[2]);
    }
    else
        printf("\nSubor 9.exe je potrebne spustit z prikazoveho riadku nasledovne:\n\n"
               "1) s prvym parametrom - presny nazov suboru, ktory chceme citat\n"
               "vtedy sa jeho obsah vypise na obrazovku.\n"
               "Napriklad: 9 dopis.txt\n\n"
               "2) s prvym parametrom - presny nazov suboru, ktory chceme citat\n"
               "a s druhym parametrom - nazov suboru, do ktoreho chceme zapisovat.\n"
               "Napriklad: 9 dopis.txt kopia.txt\n");

    return 0;
}

10. Uprav predchádzajúci program tak, že návod k použitiu sa vypíše, ak bude prvý parameter -h alebo -H (help). Ak nebude zadaný žiadny parameter, program bude vyžadovať zadanie názvu čítaného súboru z klávesnice.
Spoiler:
Kód:
/***********************************************
 *
 * 10.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    FILE *fr, *fw;
    char c, subor[30];

    if (argc == 2) {
        if (argv[1][1] == 'h' || argv[1][1] == 'H') {
            printf("\nSubor 10.exe je potrebne spustit z prikazoveho riadku nasledovne:\n\n"
               "1) s prvym parametrom - presny nazov suboru, ktory chceme citat\n"
               "vtedy sa jeho obsah vypise na obrazovku.\n"
               "Napriklad: 10 dopis.txt\n\n"
               "2) s prvym parametrom - presny nazov suboru, ktory chceme citat\n"
               "a s druhym parametrom - nazov suboru, do ktoreho chceme zapisovat.\n"
               "Napriklad: 10 dopis.txt kopia.txt\n");
        return 0;
        }
        else {
            if ((fr = fopen(argv[1], "r")) == NULL) {
                printf("\nSubor %s sa nepodarilo otvorit!\n", argv[1]);
                return 0;
            }
            putchar('\n');
            while ((c = getc(fr)) != EOF)
                putchar(c);
            fclose(fr);
        }
    }
    else if (argc == 3) {
        if ((fr = fopen(argv[1], "r")) == NULL) {
            printf("\nSubor %s sa nepodarilo otvorit!\n", argv[1]);
            return 0;
        }
        if ((fw = fopen(argv[2], "w")) == NULL) {
            printf("\nSubor %s sa nepodarilo otvorit!\n", argv[2]);
            return 0;
        }
        while ((c = getc(fr)) != EOF)
            putc(c, fw);
        fclose(fr);
        fclose(fw);
        printf("\nObsah suboru %s bol prekopirovany do suboru %s.\n", argv[1], argv[2]);
    }
    else {
        printf("Zadaj presny nazov suboru, z ktoreho chces citat: ");
        scanf("%s", subor);
        if ((fr = fopen(subor, "r")) == NULL) {
            printf("\nSubor %s sa nepodarilo otvorit!\n", subor);
            return 0;
            }
            putchar('\n');
            while ((c = getc(fr)) != EOF)
                putchar(c);
            fclose(fr);
    }

    return 0;
}

11. Napíš program, ktorý bude v súbore, ktorého názov bude uvedený ako 1. parameter príkazového riadku, hľadať reťazec, ktorý bude zadaný ako 2. parameter. Riadky obsahujúce tento reťazec sa vypíšu na obrazovku. Program bude reagovať aj na nasledujúce znaky, ktoré sa môžu objaviť v ľubovolnom poradí ako 3. parameter príkazového riadku:
c (case sensitive) rozlišuje malé a veľké písmená, inakšie ich považuje za rovnaké
n (numbering) každý vypísaný riadok bude očíslovaný, inakšie sa číslovať nebude

Príklady zadania z príkazového riadku:
11 dopis.txt pointer
11 dopis.txt pointer c
11 dopis.txt pointer n
11 dopis.txt pointer cn // alebo tretí parameter bude nc, výstup bude rovnaký
Spoiler:
Kód:
/***********************************************
 *
 * 11.c        ver. 1.0
 * popis je vyssie
 * ===========================================
 *
 * libcosenior,     september 2012
 *
 ***********************************************/

#include <stdio.h> // I/O funkcie
#include <stdlib.h> // funkcia malloc
#include <string.h> // funkcia strstr
#include <ctype.h> // pouzitie makier napr.islower, toupper

int main(int argc, char **argv)
{
    FILE *fr;
    char *pole[1000];
    int i;

    /* dynamicke vytvorenie druhej dimenzie pola */
    for (i = 0; i < 1000; i++) {
        if ((pole[i] = (char *) malloc(1000)) == NULL) {
            printf("Malo pamati");
            return;
        }
    }

    /* ak je zadany aj 2. alebo 3. parameter, plnia sa ulohy programu */
    if (argc == 3 || argc == 4) {
        /* otvorenie suboru na citanie */
        if ((fr = fopen(argv[1], "r")) == NULL) {
            printf("\nSubor %s sa nepodarilo otvorit!\n", argv[1]);
            return 0;
        }
        /* vlozenie obsahu suboru do dvojrozmerneho pola po riadkoch */
        i = 0;
        while (fgets((pole[i]), 999, fr) != NULL && i <= 1000)
            i++;

        /* ak je zadany aj 2. parameter - retazec, vypisu sa riadky, ktore ho obsahuju
           nezalezi ci je zaciatocne pismeno retazca velke alebo male */
        if (argc == 3) {
            if (islower(argv[2][0]))
                argv[2][0] = toupper(argv[2][0]);
            for (i = 0; i < 1000; i++) {
                if (strstr(pole[i], argv[2]))
                    printf("%s", pole[i]);
            }
            if (isupper(argv[2][0]))
                argv[2][0] = tolower(argv[2][0]);
            for (i = 0; i < 1000; i++) {
                if (strstr(pole[i], argv[2]))
                    printf("%s", pole[i]);
            }
        }

        /* ak je zadany aj 3. parameter - volitelne, vypisuje sa podla jeho hodnoty */
        else if (argc == 4) {
            /* vypisuje cisla riadkov */
            if (argv[3][0] == 'n' && argv[3][1] != 'c') {
                for (i = 0; i < 1000; i++) {
                if (strstr(pole[i], argv[2]))
                    printf("%3d. %s", i, pole[i]);
                }
            }
            /* vypisuje riadky, ktore obsahuju retazec, zalezi na velkosti prveho pismena */
            else if (argv[3][0] == 'c' && argv[3][1] != 'n') {
                for (i = 0; i < 1000; i++) {
                    if (strstr(pole[i], argv[2]))
                        printf("%s", pole[i]);
                }
            }

            /* nezalezi ci je zaciatocne pismeno retazca velke alebo male a vypisuje cisla riadkov */
            else if ((argv[3][0] == 'c' && argv[3][1] == 'n') || (argv[3][0] == 'n' && argv[3][1] == 'c')) {
                for (i = 0; i < 1000; i++) {
                    if (strstr(pole[i], argv[2]))
                        printf("%3d. %s", i, pole[i]);
                }
            }

            /* ak nebol zadany spravny 3. parameter */
            else
                printf("Nezadal si spravny treti parameter!!!\n");
            fclose(fr);
        }
    }

    /* ak nebol zadany 1. a 2. parameter */
    else
        printf("\nNezadal si spravne parametre k suboru %s z prikazoveho riadku.\n\n"
               "Treba zadat napr.: 11 dopis.txt Staticka nc\n", argv[0]);

    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