NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Pomôžete mi s programom v C?

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
oliver.olejnik:29.5.2015 11:58

Zdravím, neviem si dať rady s jedným céčkovským programom.. Budem rád, ak mi s tým pomôžete. :/
Tu je zadanie: Napíšte program, ktorý umožní z klávesnice zadávať názov tovaru, množstvo a jednotkovú cenu. Počet druhov tovaru zadáte na začiatku programu. Do súboru vystup.txt na samostatný riadok vypíše poradové číslo, názov tovaru a celkovú cenu za daný druh tovaru. Prvý riadok bude tvoriť hlavička. V poslednom riadku bude celková cena za nákup.

 
Odpovědět
29.5.2015 11:58
Avatar
Libor Šimo (libcosenior):29.5.2015 13:49

Urob si structuru napr:

typedef struct {
char *tovar;
unsigned int mnozstvo;
double cena;
} TOVAR;

V main si vypytaj od uzivatela pocet druhov tovarov a deklaruj take velke pole struktur.
Potom v cykle nacitavaj jednotlive struktury do pola, zaroven mozes spocitavat celkovu cenu do nejakej premennej.
Nakoniec pole ulozis po riadkoch do suboru, kam das najprv hlavicku a na koniec vysledok.

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

Štruktúry som sa zatiaľ neučil, dalo by sa to urobiť jednoduchšie? :/

 
Nahoru Odpovědět
29.5.2015 15:58
Avatar
Odpovídá na oliver.olejnik
Libor Šimo (libcosenior):29.5.2015 17:30

A reťazce už ovládaš?

Nahoru Odpovědět
29.5.2015 17:30
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
oliver.olejnik:29.5.2015 17:32

Celkom.. tu je zatiaľ môj program.. ale nefunguje.. vedel by si mi to opraviť? :/

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

int main()
{
int poradovecislo,i,po­cet,mnozstvo[100],ce­na[100],celko­vacena;
string nazov[100];
FILE *f;

printf("Zadajte, kolko druhov tovaru chcete zadavat: ");
scanf("%d",&pocet);

for(i=0;i<=po­cet,i++) {
printf("Zadajte nazov tovaru: ");
scanf("%s",na­zov[i]);
printf("Zadajte mnozstvo tovaru: ");
scanf("%d",&mnoz­stvo[i]);
printf("Zadajte jednotkovu cenu tovaru: ");
scanf("%d",&ce­na[i]);
}

f = fopen("vystup­.txt","w");

fprintf(f,"P.C. Tovar Spolu\n");
fprintf(f,"--------------------------------\n\n");

poradovecislo = 0;

for(i=0;i<=po­cet;i++) {
fprintf(f,"%d %s %d\n",poradove­cislo++,nazov[i],ce­na[i]*pocet);

}
fprintf(f,"\n--------------------------------\n\n");

celkovacena = 0;

for(i=0;i<=po­cet;i++) {
celkovacena = cena[i] + cena[i];
}

fprintf(f,"Celkova cena: %d\n",celkovacena);

fclose(f);

getchar();
getchar();
}

 
Nahoru Odpovědět
29.5.2015 17:32
Avatar
Libor Šimo (libcosenior):29.5.2015 17:33

Prácu so súbormi si sa už učil?

Nahoru Odpovědět
29.5.2015 17:33
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
oliver.olejnik:29.5.2015 17:38

Viac menej áno..

 
Nahoru Odpovědět
29.5.2015 17:38
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na oliver.olejnik
David Novák:29.5.2015 18:09
string nazov[100];

Jazyk C neumí string - musíš si udělat pole ukazatelů na char a alokovat pro ně pak paměť, jestli chceš docílit podobné funkcionality. Nebo dvourozměrné pole charů, pokud znáš předem maximální délku názvu.

Nejlepší je to udělat pomocí struktur - vyšší přehlednost. Není na tom nic těžkého.. Nauč se to ;)

Nahoru Odpovědět
29.5.2015 18:09
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na oliver.olejnik
Libor Šimo (libcosenior):29.5.2015 18:17
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int i, pocet, mnozstvo;
    float jedn_cena, cena_za_mnozstvo, cena_spolu = 0;
    char nazov[100];
    FILE *fw;

    fw = fopen("vystup.txt","w");
    /* Hlavicka sa zapise do suboru */
    fprintf(fw,"P.c.\tTovar\t\tSpolu\n");
    fprintf(fw,"-----------------------------\n");
    /* Uzivatel zada pocet zadavanych druhov tovaru */
    printf("Zadajte, kolko druhov tovaru chcete zadavat: ");
    scanf("%d",&pocet);

    for(i = 0; i < pocet; i++) {
        /* Uzivatel zada jednotlive polozky jedneho raidku,
        *  pozor nie je to osetrene proti zadaniu nespravnych hodnot */
        printf("Zadajte nazov tovaru: ");
        scanf("%s",nazov);
        printf("Zadajte mnozstvo tovaru: ");
        scanf("%d",&mnozstvo);
        printf("Zadajte jednotkovu cenu tovaru: ");
        scanf("%f",&jedn_cena);
        /* Riadok sa zapise do suboru
        *  vypocita sa cena za mnozstvo tovaru */
        fprintf(fw, "%2d.\t%s\t\t%.2f\n", i + 1, nazov, mnozstvo * jedn_cena);
        /* Pocita sa celkova suma za tovar */
        cena_spolu += mnozstvo * jedn_cena;
    }
    /* Koniec sa zapise do suboru aj s vyslednou cenou za vsetok tovar */
    fprintf(fw,"-----------------------------\n");
    fprintf(fw, "Cena za vsetok tovar je %.2f eur.", cena_spolu);

    fclose(fw);
    printf("Pre vypocet a ulozenie stlacte enter.");
    getchar();
    getchar();

    return 0;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
29.5.2015 18:17
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:29.5.2015 18:26

Je lepší používat fgets místo scanf..

Když už scanf na načítání řetězce, tak aspoň omezit délku..

scanf("%99s", nazov);
Nahoru Odpovědět
29.5.2015 18:26
Chyba je mezi klávesnicí a židlí.
Avatar
oliver.olejnik:29.5.2015 18:36

Super Libor, upravil si to geniálne a patrí ti odo mňa jedno veľké ĎAKUJEM! :)
Tak isto ďakujem David za radu :)

 
Nahoru Odpovědět
29.5.2015 18:36
Avatar
Odpovídá na David Novák
Libor Šimo (libcosenior):29.5.2015 18:38

Písal som v komentároch, že to nie je ošetrené. ;)

Nahoru Odpovědět
29.5.2015 18:38
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:29.5.2015 18:51

Promiň :D
Nějak jsem přehlédl..

Nahoru Odpovědět
29.5.2015 18:51
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Libor Šimo (libcosenior):30.5.2015 13:06

fgets() by sa udajne nemal velmi pouzivat, je to udajne funkcia narocna na prostriedky. Lepsie je udajne scanf(), ale s presnou specifikaciou.
Napr.
scanf(" %100[^\n]s", buffer);

Nahoru Odpovědět
30.5.2015 13:06
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Nahoru Odpovědět
30.5.2015 13:24
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:30.5.2015 16:20

o_O zdroj?

Co já vím, tak je to přesně naopak - scanf spotřebovává prostředky tím, že musí pokaždé zpracovat řětězec formátů a navíc se v těle určitě více větví - podporuje snad všechno..

fgets jednoduše načte všechny znaky po \n (případně méně, pokud se nevleze do limitu).. Tam není co řešit. Rozhodně bych doporučoval používat spíše fgets.. ;)

Nahoru Odpovědět
30.5.2015 16:20
Chyba je mezi klávesnicí a židlí.
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 16 zpráv z 16.