Avatar
hercik11
Člen
Avatar
hercik11:

Zdravím,
potřeboval bych poradit, předem říkám že jsem si programování v C vybral jako povinně volitelný předmět takže jsem na to dosti kašlal :) ale dostali jsme úkol a abych dostal zápočet tak to musím udělat
Zadání:

  1. Vytvořte tyto funkce:
  1. Funkce, která naplní pole lichými čísly
  2. Funkci, vypočte součet prvků na hlavní diagonále. Výstupním parametrem bude float. Operace ve funkci provádějte pomocí ukazatelů.
  3. Funkci, která uloží pole do souboru na disk v textové formě
  4. Funkci, která načte toto pole z tohoto souboru
  5. Hlavní funkce (main) :

· načte požadovaný rozměr z klávesnice a alokuje paměť podle tohoto požadavku.
· Vypíše pole na obrazovku
· Vytvoří a vypíše součet prvků na diagonále
· Uloží upravené pole do souboru na disk
· Načte toto pole a znovu jej vypíše
· Před ukončením programu uvolní všechnu alokovanou paměť
· Název souboru na disketě se zadává jako parametr při spouštění programu

nějak bych všechno MOŽNÁ zvládl ale přes ty ukazatele určitě ne....

tak jsem se chtěl zeptat jestli by mi někdo neporadil jak na to

 
Odpovědět 3.12.2013 15:17
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na hercik11
Zdeněk Pavlátka:

a)nepřesně zadané, není tam, jestli musí jít po sobě, pokud ano, použij něco na způsob

int i;
for(i = 0; i < velikost_pole; i++)
{
        pole[i] = 2 * i + 1;
}

b)nechápu zadání
c)něco jako

FILE *f = fopen("data.txt", "w");
int i;
for(i = 0; i < velikost_pole; i++)
{
        fprintf(f, "%d ", pole[i]);
}
fclose(f);

d)

FILE *f = fopen("data.txt", "r");
int i;
for(i = 0; i < velikost_pole; i++)
{
        fscanf(f, "%d", &pole[i]);
}
fclose(f);

e)jen stručné poznámky, nemůžu všechno vyřešit za tebe :D

int * pole, i;
//alokace paměti
pole = (int*)malloc(sizeof(int)*pocet_prvku);
//výpis
for(i = 0; i < velikost_pole; i++)
{
        printf("%d ", pole[i]);
}
//uvolnění paměti
free(pole);

zbytek je v předchozích úkolech.

Nahoru Odpovědět 3.12.2013 16:22
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
hercik11
Člen
Avatar
hercik11:

děkuju moc....
a u toho a) myslí aby to bylo něco jako matice tím pádem dvojrozměrné pole a pak u toho za b) aby to sečetlo ty čísla na hlavní diagonále pomocí ukazatelů

 
Nahoru Odpovědět 3.12.2013 16:38
Avatar
hercik11
Člen
Avatar
Odpovídá na Zdeněk Pavlátka
hercik11:

cau vím že asi otravuju ale nenapsal by jsi mi prosím jak by to vypadalo s tím dvojrozměrným polem ? nějak se přes to nemůžu dostat

 
Nahoru Odpovědět 4.12.2013 9:48
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:
int matice[8][6], i, j, c = 1;
for(i = 0;i < 8;i++)
    for(j = 0;j < 6;j++)
    {
        matice[i][j] =c;
        c++;
    }

Něco na tenhle způsob.
Výsledek uvedeného kódu je matice:

1  13 25 37 49 61 73 85
3  15 27 39 51 63 75 87
5  17 29 41 53 65 77 89
7  19 31 43 55 67 79 91
9  21 33 45 57 69 81 93
11 23 35 47 59 71 83 95
Editováno 4.12.2013 16:01
Nahoru Odpovědět 4.12.2013 16:00
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na hercik11
Zdeněk Pavlátka:

Víc ti bez přesnýho zadání neřeknu.

Nahoru Odpovědět 4.12.2013 16:01
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
hercik11
Člen
Avatar
Odpovídá na Zdeněk Pavlátka
hercik11:

tak jestli teda můžu otravovat :)
a)naplnit dvojrozměrné pole lichými čísly tak... [i][j] aby se i=j
b)aby se pomocí ukazatelů provedl součet na hlavní diagonále např. [0][0] + [1][1] + [2][2] .....a aby výstup součtu byl float
c)aby se celé pole uložilo na disk v textové formě
d)aby se pole načetlo
e)Hlavní funkci která načte z klávesnice rozměr pole tedy "i" "j" a podle toho alokuje pamět......a pak vypíše na obrazovku to pole,vytvoří a vypíše součet prvků na hlavní diagonále,uloží upravené pole do souboru na disk a pak ho načte a na konci to uvolní pamět

jestli to uděláš tak mockrát děkuju

 
Nahoru Odpovědět 4.12.2013 16:33
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 4.12.2013 16:41
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na hercik11
Zdeněk Pavlátka:

A naplnění toho pole stále nechápu.

Nahoru Odpovědět 4.12.2013 16:44
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
hercik11
Člen
Avatar
Odpovídá na Zdeněk Pavlátka
hercik11:

No potřebuju to do Vánoc takže ještě je docela dost času.....
No to pole jak jsi ukazoval to je naplněný dobře ale musí to být jako čtvercová matice takže když máš..... matice [i][j] aby tam byla podmínka že i=j tím to bude ta čtvercová matice.....
a pak u tý druhý funkce aby se pomocí těch ukazatelů sečetly všechny prvky který jsou na hlavní diagonále z toho naplněnýho pole takže prvky na pozicích [0][0] + [1][1] + [2][2] + .....a tak to jde až po to kolik zadám že je "i" a "j"

už to je srozumitelnější ?

 
Nahoru Odpovědět 4.12.2013 22:05
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na hercik11
Zdeněk Pavlátka:

A nevíš, jak se má ta matice allokovat? Způsob, co používám já mi nesedí s těmi ukazareli.

Nahoru Odpovědět 5.12.2013 6:39
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
hercik11
Člen
Avatar
Odpovídá na Zdeněk Pavlátka
hercik11:
int **Pole;

int ** Nacti_matici(int n)
{ int i,j;
  int **Pole;
  if((Pole=(int**)malloc(n*sizeof(int*)))==NULL)
 {printf("Nedostatek pameti!\n");exit(0);}

  for (i=0;i<n;i++)
  if((Pole[i]=(int*)malloc(n*sizeof(int)))==NULL)
  {printf("Nedostatek pameti!\n");exit(0);}


  for (i=0;i<n;i++)
  for (j=0;j<n;j++)
  { printf("a[%d,%d]=",i,j);
    scanf("%d",(*(Pole+i))+j);
   }
 return Pole;
}

no tohle nám ukazoval on jak by naplnil to pole....nevím jestli ti to nějak pomůže já se v tom moc nevyznám

 
Nahoru Odpovědět 5.12.2013 12:44
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na hercik11
Zdeněk Pavlátka:

Řeším to stejně, ale nesedí mi tam ten výpočet přes ukazatele.

Nahoru Odpovědět 5.12.2013 15:56
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
coells
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
coells:

Co ti na tom nesedí?

(*(Pole+i))+j == (Pole[i])+j == &Pole[i][j]

Btw, tohle je přesně důvod, proč se má programování vyučovat v Pascalu a nikoliv v C.

 
Nahoru Odpovědět 5.12.2013 17:16
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na coells
Zdeněk Pavlátka:

Nesedí mi následné posunutí ukazatele z pole[i][j] na pole[i+1][j+1]. A Pascal nesnášim. Já začal s C++ jako samouk.

Nahoru Odpovědět 5.12.2013 17:20
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
coells
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
coells:

Máš pole polí intů, ukazatele jsou správně. Pascal je hezká věc pro vyučování, protože se v něm podobné zlovolnosti nedají dělat.

 
Nahoru Odpovědět 5.12.2013 17:29
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na coells
Zdeněk Pavlátka:

Dobře jinak, nevím, jak posunout ukazatel z pole[i][j] na pole[i+1][j+1].

Nahoru Odpovědět 5.12.2013 17:37
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na hercik11
Zdeněk Pavlátka:

Tady to máš:

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

main(int argc, char **argv)
{
        /*deklarace proměnných*/
        FILE *f;
        int **matice, i, j, c, w = 0;
        float vysledek = 0;
        char adress[200];
        int **pointer;

        /*adresa souboru*/
        if(argc > 1)
        {
                strcpy(adress, argv[1]);
        }
        else
                strcpy(adress, "data.txt");

        /*otevření souboru*/
        f = fopen(adress, "w");

        /*načtení rozměrů*/
        printf("Zadejte sirku matice: ");
        scanf("%d", &w);

        /*alokace paměti*/
        matice = (int**)calloc(w, sizeof(int));
        for(i = 0; i < w; i++)
                matice[i] = (int*)calloc(w, sizeof(int));

        for(i = 0; i < w; i++)
                for(j = 0; j < w; j++)
                        matice[i][j] = (rand()%20 + 1) * 2 - 1;

        /*výpis matice*/
        for(i = 0; i < w; i++)
        {
                for(j = 0; j < w; j++)
                        if(matice[i][j] < 10)
                                printf(" %d ", matice[i][j]);
                        else
                                printf("%d ", matice[i][j]);
                printf("\n");
        }

        /*výpočet a výpis součtu čísel na hlavní diagonále*/
        pointer = matice;
        for(i = 0; i < w; i++)
        {
                vysledek += *((*(pointer+i))+i);
        }
        printf("Soucet cisel na hlavni diagonale pres ukazatel: %f\n", vysledek);

        /*psaní do souboru*/
        for(i = 0; i < w; i++)
        {
                for(j = 0; j < w; j++)
                                fprintf(f, "%d ", matice[i][j]);
                fprintf(f, "\n");
        }

        /*"přepnutí" do režimu čtení*/
        fclose(f);
        f = fopen(adress, "r");

        /*čtení ze souboru*/
        for(i = 0; i < w; i++)
        {
                for(j = 0; j < w; j++)
                                fscanf(f, "%d", &matice[i][j]);
        }

        /*uvolnění paměti, zavření souboru*/
        for(i = 0; i < w; i++)
                free(matice[i]);
        free(matice);
        fclose(f);

        /*čekání na stisk libovolné klávesy*/
        _getch();

        /*ukončení pogramu*/
        return 0;
}

Můžeš si to jakkoli upravit, místo ukazatele pointer lze použít přímo ukazatel matice.

Nahoru Odpovědět  +2 5.12.2013 17:46
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Libor Šimo (libcosenior):

Možno by to bolo vhodnejšie takto:

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

// a) Funkce, která naplní pole lichými čísly
void napln_pole(int **matica, int strana_matice);
// b) Funkci, vypočte součet prvků na hlavní diagonále. Výstupním parametrem bude float.
// Operace ve funkci provádějte pomocí ukazatelů.
float sucet_prvkov_diagonaly(int **matica, int strana_matice);
// c) Funkci, která uloží pole do souboru na disk v textové formě
void uloz_pole_do_suboru(FILE *fw, char *nazov_suboru, int **matica, int strana_matice);
// d) Funkci, která načte toto pole z tohoto souboru
void nacitaj_pole_zo_suboru(FILE *fr, char *nazov_suboru, int **matica, int strana_matice);
// e) Hlavní funkce (main) :
// · Název souboru na disketě se zadává jako parametr při spouštění programu*/
int main(int argc, char *argv[])
{
    FILE *f;
    char nazov_suboru[30];
    int **matica, i, j, strana_matice;

    /* nazov suboru zoberie z parametra funkcie main() alebo ho nazve "data.txt" */
    if(argc > 1)
        strcpy(nazov_suboru, argv[1]);
    else
        strcpy(nazov_suboru, "data.txt");

    //· načte požadovaný rozměr z klávesnice a alokuje paměť podle tohoto požadavku.
        printf("Zadajte pocet riadkov matice: ");
        scanf("%d", &strana_matice);
        matica = (int **) malloc(strana_matice * sizeof(int *));
        for (i = 0; i < strana_matice; i++)
                matica[i] = (int *) malloc(strana_matice * sizeof(int));

    // · Vypíše pole na obrazovku
    napln_pole(matica, strana_matice); // naplni maticu neparnymi cislami
    putchar('\n');
    printf("Vypis matice na obrazovku:\n");
    for (i = 0; i < strana_matice; i++) {
        for (j = 0; j < strana_matice; j++)
            printf("%4d, ", matica[i][j]);
        putchar('\n');
    }

    // · Vytvoří a vypíše součet prvků na diagonále
    printf("\nSucet prvkov hlavnej diagonaly je %.2f\n",
           sucet_prvkov_diagonaly(matica, strana_matice));

    // · Uloží upravené pole do souboru na disk
    uloz_pole_do_suboru(f, nazov_suboru, matica, strana_matice);

    // · Načte toto pole a znovu jej vypíše
    nacitaj_pole_zo_suboru(f, nazov_suboru, matica, strana_matice);
    putchar('\n');
    printf("Vypis matice stiahnutej zo suboru na obrazovku:\n");
    for (i = 0; i < strana_matice; i++) {
        for (j = 0; j < strana_matice; j++)
            printf("%4d, ", matica[i][j]);
        putchar('\n');
    }

    // · Před ukončením programu uvolní všechnu alokovanou paměť
    for (i = 0; i < strana_matice; i++)
                free((void *) matica[i]);
        free((void *) matica);

    return 0;
}

// a) Funkce, která naplní pole lichými čísly
void napln_pole(int **matica, int strana_matice)
{
    int i, j, k = 1;

    for (i = 0; i < strana_matice; i++) {
        for (j = 0; j < strana_matice; j++) {
            matica[i][j] = k;
            k += 2;
        }
    }
}

// b) Funkci, vypočte součet prvků na hlavní diagonále. Výstupním parametrem bude float.
// Operace ve funkci provádějte pomocí ukazatelů.
float sucet_prvkov_diagonaly(int **matica, int strana_matice)
{
    int i;
    float sucet = 0.0;

    for(i = 0; i < strana_matice; i++) {
        sucet += *((*(matica+i))+i);
    }
    return sucet;
}

// c) Funkci, která uloží pole do souboru na disk v textové formě
void uloz_pole_do_suboru(FILE *fw, char *nazov_suboru, int **matica, int strana_matice)
{
    int i, j;
    char cislo_text[strana_matice * strana_matice][20];

    fw = fopen(nazov_suboru, "w");
    for (i = 0; i < strana_matice; i++) {
        for (j = 0; j < strana_matice; j++) {
            sprintf(cislo_text[i], "%d", matica[i][j]); // prevod cisla na retazec (text)
            fprintf(fw, "%s ", cislo_text[i]);
        }
        fprintf(fw, "\n");
    }
    fclose(fw);
}

// d) Funkci, která načte toto pole z tohoto souboru
void nacitaj_pole_zo_suboru(FILE *fr, char *nazov_suboru, int **matica, int strana_matice)
{
    int i, j;
    char cislo_text[strana_matice * strana_matice][20];

    if ((fr = fopen(nazov_suboru, "r")) == NULL)
        printf("Subor %s sa nepodarilo otvorit.\n", nazov_suboru);
    putchar('\n');
    for(i = 0; i < strana_matice; i++) {
        for(j = 0; j < strana_matice; j++) {
            fscanf(fr, "%s", &cislo_text[i]); // precitanie retazcov zo suboru
            matica[i][j] = atoi(cislo_text[i]); // prevod retazcov na cisla a vlozenie do pola
        }
    }
    fclose(fr);
}
Nahoru Odpovědět 5.12.2013 21:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
hercik11
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
hercik11:

strašne moc děkuju funguje to bezvadně jediný co ještě nevím kde ? a nebo jak ? zadat ten název souboru

 
Nahoru Odpovědět  -1 6.12.2013 14:41
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na hercik11
Jan Vargovský:

Máš to hned na začátku mainu.

 
Nahoru Odpovědět 6.12.2013 14:53
Avatar
Odpovídá na hercik11
Libor Šimo (libcosenior):

Ak chceš zadať názov súboru, musíš spustiť program v konzole (Command Prompt - príkazový riadok).
Robí sa to takto:
Spustíš príkazový riadok - je v príslušenstve.
Tam nalistuješ zložku, v ktorej sa nachádza program.
Príkaz: dir ti vypíše obsah zložky, v ktorej sa práve nachádzaš.
Príkaz: cd názov_zložky ťa presunie do zložky.
Zase dir na výpis atď. Nakoniec sa dostaneš do zložky, kde máš uložený program.
Tam zadáš príkaz: nazov_programu.exe (samozrejme, že tam musí byť), za ním medzeru a názov súboru, ktorý chceš predať ako argument.
Napr.: test.exe subor.txt
Po ukončení programu nájdeš v zložke vytvorený subor.txt a skontroluješ si ho.

Editováno 6.12.2013 15:13
Nahoru Odpovědět 6.12.2013 15:13
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Libor Šimo (libcosenior):

Viac obrázkov mi to nevzalo, tak dávam sem:

Nahoru Odpovědět 6.12.2013 15:15
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Nahoru Odpovědět 6.12.2013 15:15
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
Zdeněk Pavlátka:

Sice jsi to pěkně rozdělil do funkcí, ale kód je delší, ošklivější a méně přehledný ;) . Funkce se hodí hlavně na věci, které se často opakují.

Nahoru Odpovědět  -2 6.12.2013 16:04
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Libor Šimo (libcosenior):

Ja som len splnil presne požiadavky zadania. Tam sa tie funkcie priamo vyžadujú.
Navyše si myslím, že som neprehľadnosť kódu trochu nahradil popiskami. ;)

Editováno 6.12.2013 16:07
Nahoru Odpovědět  +2 6.12.2013 16:06
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Jan Vargovský:

Ty máš asi hodně rád velkou špagetu co ? :))

 
Nahoru Odpovědět 6.12.2013 16:09
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
Zdeněk Pavlátka:

Ne :D ale jsem zvyklý řešit vše co nejjednodušeji, šetřit pamětí a nepsát komentáře ;)

Nahoru Odpovědět 6.12.2013 16:11
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Libor Šimo (libcosenior):

Ja som tie komentáre písal hlavne kvôli nemu, aby mal aspoň predstavu vo co go. 8-)

Nahoru Odpovědět 6.12.2013 16:13
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
Zdeněk Pavlátka:

Já taky, jinak bych tam neměl ani jeden...

Nahoru Odpovědět 6.12.2013 16:14
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Libor Šimo (libcosenior):

Ja si komentáre píšem aj pre seba. Predsa len je rozdiel keď si svoj program bez komentárov pozrie za rok, dva 55 ročný alebo 16 ročný chlap. Čo ty na to? :)

Nahoru Odpovědět  +1 6.12.2013 16:19
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
Zdeněk Pavlátka:

Jojo. Já se ve svých kódech vyznám 8-)

Nahoru Odpovědět 6.12.2013 16:20
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
hercik11
Člen
Avatar
hercik11:

jj už to nějak tak chápu oběma vám moc děkuju

 
Nahoru Odpovědět 7.12.2013 1:13
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 33 zpráv z 33.