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

C++ C a C++ Pomôžete mi s programom v C?

Avatar
oliver.olejnik:

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):

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:

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

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

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):

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:

Viac menej áno..

 
Nahoru Odpovědět 29.5.2015 17:38
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na oliver.olejnik
David Novák:
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):
#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í
+1 bodů
Ř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
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:

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  +1 29.5.2015 18:26
Chyba je mezi klávesnicí a židlí.
Avatar
oliver.olejnik:

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):

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
Tým ITnetwork
Avatar
Nahoru Odpovědět  +1 29.5.2015 18:51
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Libor Šimo (libcosenior):

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
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:

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.