Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
discount week 30 halloween
Avatar
Adam Nemec
Člen
Avatar
Adam Nemec:22.4.2020 11:06

potreboval by som pomôcť s príkladmi do školy

Zkusil jsem: skúšal som to robiť sam pomocou prezentácií, bohužiaľ neúspešne

Chci docílit: 1. Napíšte funkciu ktorá dostane ako parameter názov súboru.
a. Funkcia súbor otvorí (na konci zatvorí)
b. Funkcia alokuje (samozrejme dynamicky) jednorozmerné pole celých čísel veľkosti 500
(typ int)
c. Funkcia následne číta zo súboru čísla (každé číslo na samostatnom riadku, najľahšie sa
použije fscanf) a napĺňa pole
d. Číslo do poľa skutočne zaradí a zapíše len ak je kladné !
e. Pozor, čísel v súbore môže byť menej ako maximálna dĺžka poľa (načítanie skončí na
konci súboru).
f. Pozor, čísel v súbore môže byť viac (načítanie skončí tým, že počet skutočne načítaných
bude rovný maximálnej veľkosti poľa)
g. Funkcia vráti smerník na alokované pole (podobná funkcia v prednáške)
h. Funkcia vráti počet reálne načítaných čísel (parameter – volanie odkazom)
Prototyp funkcie: int * AlokujNapln(char *subor, int *velkost)

2. Napíšte funkciu ktorá vypíše obsah poľa. Funkciu volajte VŽDY po každej funkcii.
Prototyp funkcie: void Vypis(int *pole, int velkost)

3. Napíšte funkciou, ktorá v poli z príkladu 1
a. nájde hodnotu maxima (to vráti ako výstup funkcie – return)
b. pozíciu nájdeného maxima (index v poli – v parametri volanom odkazom)
Prototyp funkcie: int *Maximum(int *pole, int velkost, int *pozicia)

4. Napíšte funkciou, ktorá z poľa z príkladu 1
a. Vymaže všetky nepárne čísla
b. A vráti novú dĺžku poľa
Prototyp funkcie: int VymazNeparne (int *pole, int velkost)

5. (1b) Napíšte funkciou, ktorá upraví pole z príkladu 1 takto
a. Funkcia dostane pole a číslo
b. Funkcia hľadá číslo a zdvojí ho (ak by pole malo obsah 4 3 5 a hľadám 3, výsledné pole
by bolo 4 3 3 5)
c. Funkcia pole dopĺňa len ak jeho dĺžka po úprave neprekročí alokáciu (500)
d. Funkcia vráti novú dĺžku poľa
Prototyp funkcie: int DuplikujCislo (int *pole, int cislo)

 
Odpovědět
22.4.2020 11:06
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Adam Nemec
DarkCoder:22.4.2020 11:56

Po dlouhé době vidím nějaké rozumné příklady do školy, které umožnují procvičit si širší část jazyka C (práce s funkcemi, se soubory, s ukazateli, s dynamickou alokací a logické uvažování).

Zkusil jsem: skúšal som to robiť sam pomocou prezentácií, bohužiaľ neúspešne

To že si se to snažil řešit sám je naprosto v pořádku. Neúspěšně je však ne moc konkrétní pojem. Co máš hotového, co konkrétně nevíš?

Nahoru Odpovědět
22.4.2020 11:56
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Adam Nemec
Člen
Avatar
Odpovídá na DarkCoder
Adam Nemec:22.4.2020 12:02

neviem akú ma ten program mať štruktúru, ako volať tie funkcie, neviem ako funguje smerník, funkciu na výpis poľa viem, párne nepárne, max min tie základne veci budem vedieť.
ďakujem

 
Nahoru Odpovědět
22.4.2020 12:02
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Adam Nemec
DarkCoder:22.4.2020 12:28

Však také o struktuře programu nic vědět nemusíš, program psát nemáš. Zadání jasně říká, že máš napsat 5 funkcí. A to jak mají vypadat jejich deklarace, tedy jejich prototyp, je uvedeno na konci každého bodu úkolu. Ale abys ověřil funkčnost tebou napsaných funkcí, je dobré si nějaký svůj program napsat. Jak pak volat v programu uvedené funkce bys ale znát měl. Stejně tak jako to co jsou to ukazatele, bez toho se při zpracování úkolů neobjedeš.

Nahoru Odpovědět
22.4.2020 12:28
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Adam Nemec
Člen
Avatar
Adam Nemec:22.4.2020 12:35

určite by mi pomohlo nejaké vzorové riešenie hoci podobného problemu.

 
Nahoru Odpovědět
22.4.2020 12:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na DarkCoder
DarkCoder:22.4.2020 12:57

To jak se pracuje s poly, soubory, ukazately a dynamickou alokací paměti, toho je v praktické podobě dost ode mě v sekci C. Doporučuji se na to minimálně podívat a pokusit se pochopit.

Zkus 1. příklad, bod 1a - otevření a zavření souboru.

Editováno 22.4.2020 12:59
Nahoru Odpovědět
22.4.2020 12:57
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Adam Nemec
DarkCoder:22.4.2020 13:03

Zde je malá nápověda:

ukazatel na FILE, fopen(), fclose(), NULL

Nahoru Odpovědět
22.4.2020 13:03
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Adam Nemec
DarkCoder:24.4.2020 21:03

Domnívám se, že nevíš jak vůbec začít.. Zkusím Tě trochu víc nakopnout.. :-)

Tak pojďme na to...

Nejprve si vytvoř testovací soubor nums.txt a naplň ho např. těmito daty:

-10
20
0
30
-40
50
-60
-70
80
-90

Pro testování můžeš použít následující kód:

#define _CRT_SECURE_NO_WARNINGS

#define DEBUG 0 // ladeni - DEBUG 1
#define SIZE 500 // velikost pole

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

// Prototypy
int * AlokujNapln(char *subor, int *velkost);
void Vypis(int *pole, int velkost);

int main(void) {
        int n = 0; // pocet prvku ulozenych v poli
        int *arr = NULL; // dynamicke pole

        arr = AlokujNapln("nums.txt", &n);

// Kontrolni vypis obsahu promenne n
#if DEBUG == 1
        printf("%d\n", n);
#endif

        Vypis(arr, n);

        free((void *)arr);
        arr = NULL;

        return 0;
}

Chceš-li vidět počet prvků uložených v poli, nastav makro DEBUG na 1.
Pro testování měň hodnotu makra SIZE v rozsahu <0,11> a sleduj co se děje.

Zde je kompletní bod 1:

// Alokace pameti a nacteni dat do pole ze souboru
int * AlokujNapln(char *subor, int *velkost) {
        FILE *fp = NULL;
        int tmp, *pole = NULL;

        // Alokace pameti
        pole = (int*)malloc(SIZE * sizeof(int));
        if (!pole) {
                fprintf(stderr, "Chyba alokace pameti.");
                exit(1);
        }

        // Otevreni souboru pro cteni
        fp = fopen(subor, "r");
        if (!fp) {
                fprintf(stderr, "Soubor nelze otevrit.");
                free((void *)pole);
                pole = NULL;
                exit(1);
        }

        // Cteni dat ze souboru
        while (!feof(fp) && (*velkost < SIZE)) {
                if (fscanf(fp, "%d", &tmp) != 1) {
                        fprintf(stderr, "Chyba cteni dat.");
                        free((void *)pole);
                        pole = NULL;
                        exit(1);
                }
                if (tmp >= 0) {
                        *(pole + *velkost) = tmp;
                        (*velkost)++;
                }
        }

        // Uzavreni souboru
        if (fclose(fp) == EOF) {
                fprintf(stderr, "Soubor nelze uzavrit.");
                free((void *)pole);
                pole = NULL;
                exit(1);
        }

        return pole;
}

Zde je kompletní bod 2:

// Vypis pole na obrazovku
void Vypis(int *pole, int velkost) {
        for (int i = 0; i < velkost; i++) printf("%d ", *(pole + i));
        putchar('\n');
}

Nyní máš vše potřebné k tomu, abys mohl pokračovat dále v řešení úlohy (body 3,4,5).

Poznámka:
Abys mohl svoji úlohu obhájit, musíš porozumět tomu, co se v programu děje. Toto ber pouze jako doporučení a instruktáž. Snaž se to napsat svým vlastním způsobem. Zlepšíš tím své programové dovednosti, které se ti budou později hodit. A o to jde! V opačném případě ztratí zadání úlohy svůj smysl a také Ti velmi reálně hrozí to, že Tě profesor snadno nachytá na tom, že to není tvá práce.

Stále platí, že pokud Ti cokoli nebude jasné, ptej se... :-)

Nahoru Odpovědět
24.4.2020 21:03
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.