IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Libor Šimo (libcosenior):5.5.2013 9:52

Projekt v jazyku c (Code:Blocks 10.05):
Databáza klientov služby, ktorí majú platiť za túto službu. (môžu mesačne, štvrťročne, polročne aj ročne)
Vstupy:

  • základné údaje klienta, možnosť úpravy v prípade potreby
  • zadávanie po klientoch - dátum a výška platby za službu, ukladanie maximálne 14 mesiacov starú platbu

Výstupy:

  • výpis klientov a do kedy majú zaplatené
  • výpis neplatičov, aký čas a sumu meškajú

Prosím o posúdenie, či som projekt dobre začal.

/**************************
* main.c                 ver. 1.0
*
* Hlavny program
*
* libcosenior, april 2013
***************************/
/* vlastne hlavickove subory */
#include "STDDFN.H"
#include "MAIN.H"
#include "PROCED.H"

int main(void)
{
    int volba;
    for (;;) {
        CLS;  // vycisti obrazovku
        printf("            MENU\n\n"
               "1. Zadanie noveho klienta\n"
               "2. Zadanie platby klienta\n"
               "3. Vyhladanie klienta\n"
               "4. Vypis klientov\n"
               "5. Vypis neplaticov\n"
               "6. Pomocnik\n"
               "0. Koniec\n\n");
        printf("Vyberte si: ");
        scanf("%d", &volba);

        switch (volba) {
            case 1:
                zadavanie_klienta();
                break;
            case 2:
                zadavanie_platby();
                break;
            case 3:
                vyhladavanie();
                break;
            case 4:
                vypis_klientov();
                break;
            case 5:
                vypis_neplaticov();
                break;
            case 6:
                pomocnik();
                break;
            case 0:
                system("cls");
                printf("Koniec programu!\n");
                exit(EXIT_FAILURE);
                break;
            default:
                printf("Mimo rozsah! Stlac klavesu!\n");
                BEZENTER;
                getchar();
                break;
        }
    }
    return 0;
}
/************************************
 * MAIN.H    ver. 1.0
 *
 * Hlavickovy subor modulu main.c
 *
 * libcosenior, april 2013
 ************************************/

/* systemove hlavickove subory */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

/* makra */
#define NAZOV "data.dat" // nazov binarneho suboru
#define BEZENTER { while (getchar() != '\n') ;} // zbavenie sa znaku '\n' - ENTER
#define CLS  system("cls");  // vycisti obrazovku

/* struktury */
GLOBAL typedef struct {
char datum[11];
float suma;
int index_data;
} DATA;

GLOBAL typedef struct {
char meno[20];
char heslo[20];
char email[25];
char meno_priezvisko[25];
char vs[5]; // variabilný symbol
char datzaciatku[11]; // datum spustenia sluzby
DATA platby[15];
int index_klient;
}IDENT;

/* globalne premenne */
GLOBAL IDENT klient[100];
GLOBAL FILE *faplus; // subor pre citanie a zapis na koniec
GLOBAL char c;
GLOBAL int i, poradie, pomoc;
GLOBAL IDENT xident;

#endif // MAIN_H_INCLUDED
/**************************
* pomocny subor
* STDDFN.H               ver. 1.0
*
* Standardne definicie
*
* libcosenior, april 2013
***************************/
#ifndef STDDFN_H_INCLUDED
#define STDDFN_H_INCLUDED

#define GLOBAL /*       */
#define LOCAL    static
#define IMPORT   extern
#define EXPORT   extern

#endif // STDDFN_H_INCLUDED
/**************************
* proced.c               ver. 1.0
*
* Vsetky funkcie k projektu
*
* libcosenior, april 2013
***************************/
/* vlastne hlavickove subory */
#include "STDDFN.H"
#include "MAIN.H"
#include "PROCED.H"

/***************************************************
 * vytvorenie novej databazy klientov
 * doplnanie novych klientov do vytvorenej databazy
 * návrat do MENU
 ***************************************************/
GLOBAL void zadavanie_klienta(void)
{
    BEZENTER; // zbavim sa znaku ENTER
    pomoc = subor_do_pola(klient); // natiahnem data zo suboru do pola
    if (pomoc > 0) // ak subor existuje
        poradie = pomoc; // pomoc je pocet struktur v subore (poli)
    else {
        poradie = 0; // subor neexistuje, pole je prazdne
        printf("V databaze nie su ziadni klienti.\n");
    }

    for (i = poradie; i < 100; i++) { // cyklus na zadavanie klientov
        klient[i].index_klient = i + 1; // poradove cislo klienta
        CLS; // vycistenie okna
        printf("Novy klient\n");
        printf("\nmeno: ");
        gets(klient[i].meno);

        printf("\nheslo: ");
        gets(klient[i].heslo);

        printf("\nemail: ");
        gets(klient[i].email);

        printf("\nMeno Priezvisko: ");
        gets(klient[i].meno_priezvisko);

        printf("\nvariabilny symbol: ");
        gets(klient[i].vs);

        printf("\ndatum zaciatku: ");
        gets(klient[i].datzaciatku);

        /*** dalsi zapis alebo ulozit pole do suboru na koniec a spat do MENU ***/
        printf("\nPokracovat? a/n: ");
        c = getchar();
        BEZENTER;
        if (c == 'n') {
            if (pole_do_suboru(klient, i + 1) == 0) { // ulozi pole do suboru
                printf("\nUdaje sa zapisali. Pokracuj klavesou ENTER.");
                getchar();
                break;
            }
            else {
                printf("\nPri zapise udajov nastala chyba. Pokracuj klavesou ENTER.");
                getchar();
                break;
            }
        }
    }
}

GLOBAL void zadavanie_platby(void)
{
    printf("Zadavanie platby\n");
    system("pause");
}

GLOBAL void vyhladavanie(void)
{
    printf("Vyhladavanie\n");
    system("pause");
}

/*********************************************
 * vypise vsetkych klientov z databazy
 * moznost zastavenia vypisu a navrat do MENU
 *********************************************/
GLOBAL void vypis_klientov(void)
{
    BEZENTER; // zbavim sa znaku ENTER
    pomoc = subor_do_pola(klient); // natiahnem data zo suboru do pola
    if (pomoc > 0) // ak subor existuje
        poradie = pomoc; // pomoc je pocet struktur v subore (poli)
    else {
        poradie = 0; // subor neexistuje, pole je prazdne
        printf("V databaze nie su ziadni klienti.\n");
    }

    for (i = 0; i < poradie; i++) { // cyklus na vypis klientov
        CLS;
        printf("\nklient cislo: %d\nmeno: %s\nheslo: %s\nemail: %s\nMeno priezvisko: %s"
               "\nvariabilny symbol: %s\nzaciatok sluzby: %s\n", klient[i].index_klient,
               klient[i].meno , klient[i].heslo, klient[i].email, klient[i].meno_priezvisko,
               klient[i].vs, klient[i].datzaciatku);
        printf("\nPokracovat? a/n: ");
        c = getchar();
        BEZENTER;
        if (c == 'n')
            break;


    }
    CLS;
    printf("\nTo su vsetci, viac ich v databaze nie je. Stlac ENTER!");
    getchar();
}

GLOBAL void vypis_neplaticov(void)
{
    printf("Vypis_neplaticov\n");
    system("pause");
}

GLOBAL void pomocnik(void)
{
    printf("pomocnik\n");
    system("pause");
}


/*** nacita pole do suboru ***/
GLOBAL int pole_do_suboru(IDENT p[], int pocet)
{
    if((faplus = fopen(NAZOV, "wb")) == NULL) // zapis alebo prepísanie
    {
        printf("\nSubor sa nepodarilo otvorit\n");
        return -1;
    }
    for(i = 0; i<pocet; i++)
    {
        fwrite(&p[i], sizeof(IDENT), 1, faplus);
    }
    if (fclose(faplus )== EOF)
    {
        printf("Subor sa nepodarilo zavriet");
        return -1;
    }
    return 0;
}

/*** nacita subor do pola ***/
GLOBAL int subor_do_pola(IDENT p[])
{
    int i = 0, pocet = 0;
    if((faplus = fopen(NAZOV,"rb")) == NULL)
        {
        printf("\nSubor sa nepodarilo otvorit\n");
        return -1;
    }

    while(fread(&xident, sizeof(IDENT), 1, faplus) == 1)
    {
        p[i] = xident;
        i++;
        pocet++;
    }

    fclose(faplus);
    return pocet;
 }
/************************************
 * PROCED.H    ver. 1.0
 *
 * Hlavickovy subor modulu proced.c
 *
 * libcosenior, april 2013
 ************************************/
#ifndef PROCED_H_INCLUDED
#define PROCED_H_INCLUDED

/* uplne funkcne prototypy GLOBALnych funkcii modulu proced.c */
EXPORT void zadavanie_klienta(void);
EXPORT void zadavanie_platby(void);
EXPORT void vyhladavanie(void);
EXPORT void vypis_klientov(void);
EXPORT void vypis_neplaticov(void);
EXPORT void pomocnik(void);
EXPORT void zatvor_subor(void);
EXPORT int pole_do_suboru(IDENT p[], int pocet);
EXPORT int subor_do_pola(IDENT klient[]);

#endif // PROCED_H_INCLUDED
Odpovědět
5.5.2013 9:52
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Lukáš Hruda:5.5.2013 12:24

V čistém C téměř nedělám, ale jelikož se v něm nedá programovat objektově, řekl bych, že je to takhle celkem v pořádku, možná až na ty globální proměnné, bez těch by se to pravděpodobně obešlo. Pak ještě některé funkce by se nejspíš daly rozdělit do více menších, ale to nepovažuji za nutnost.

 
Nahoru Odpovědět
5.5.2013 12:24
Avatar
Libor Šimo (libcosenior):8.5.2013 13:30

Trochu som sa pozrel na tie globálne premenné a je mi jasné, že všetky premenné (okrem štruktúr) môžem použiť ako lokálne tam, kde ich potrebujem. Skúšal som aj štruktúry, ale to mi nejak nešlo. Vieš poradiť ako na to?

Nahoru Odpovědět
8.5.2013 13:30
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Lukáš Hruda:8.5.2013 14:17

Deklarovat v nejvyšší úrovni kde se instance používá (pokud se používá všude tak v main) a předávat funkcím parametrem. Pokud je potřeba aby funkce instanci změnila, pak přes pointer, jinak stačí kopie. Pokud by těch instancí bylo hodně, pak je dobré je zabalit do nějaké další struktury, aby každá funkce neměla 10 parametrů.

 
Nahoru Odpovědět
8.5.2013 14:17
Avatar
Odpovídá na Lukáš Hruda
Libor Šimo (libcosenior):8.5.2013 16:17

Neviem to vyriešiť.
V MAIN.H ostali len makrá a globálna struktúra.
Do proced.c som doplnil lokálne premenné

/* vlastne hlavickove subory */
#include "STDDFN.H"
#include "MAIN.H"
#include "PROCED.H"

/* lokalne premenne */
LOCAL IDENT klient[100];
LOCAL FILE *faplus; // subor pre citanie a zapis na koniec
LOCAL char c, *druh;
LOCAL int i, poradie, pomoc, volba;
LOCAL IDENT xident;

/***************************************************
 * vytvorenie novej databazy klientov
 * doplnanie novych klientov do vytvorenej databazy
 * návrat do MENU
 ***************************************************/

Iné zmeny som nerobil.
Fakt neviem ako to spraviť.
Môžeš to napísať konkrétne?

Nahoru Odpovědět
8.5.2013 16:17
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:8.5.2013 17:16

Nějak takhle například:

void zadavanie_klienta(IDENT* klient, int pocet_klientu)
{
  ...
}

void main()
{
  IDENT klient[100];
  ...
  zadavanie_klienta(klient,100);
}

V main si deklaruješ data (popřípadě v nějaké více vnořené funkci, podle toho jak moc hluboko ty data potřebuješ) a každé funkci která s daty pracuje je předáš parametrem.

Editováno 8.5.2013 17:17
 
Nahoru Odpovědět
8.5.2013 17:16
Avatar
Libor Šimo (libcosenior):8.5.2013 17:52

Dík, vyskúšam.

Nahoru Odpovědět
8.5.2013 17:52
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):9.5.2013 5:35

Toto mi nepomôže. Mne ide o to, aby štruktúry nemuseli byť globálne. Pozri do súboru MAIN.H. Globálne premenné som už zlikvidoval, ale globálne štruktúry sú pre mňa potrebné.
Asi sa na to vykašlem a nechám štruktúry globálne, je to vlastne len jedna premenná a tú si postrážim.

Nahoru Odpovědět
9.5.2013 5:35
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Lukáš Hruda:9.5.2013 10:11

Pokud strukturami myslíš instance struktur, tak ty globální být nemusí, nejspíš bys kvůli tomu ale musel přepsat docela velkou část kódu. Pokud strukturami myslíš deklarace struktur jako takových, tak ty globální být musí, vytvářet si strukturu uvnitř funkce by asi ve většině případů nemělo moc smysl. Například...

GLOBAL typedef struct {
char datum[11];
float suma;
int index_data;
} DATA;

GLOBAL typedef struct {
char meno[20];
char heslo[20];
char email[25];
char meno_priezvisko[25];
char vs[5]; // variabilný symbol
char datzaciatku[11]; // datum spustenia sluzby
DATA platby[15];
int index_klient;
}IDENT;

...tahle část kódu globální být musí.

 
Nahoru Odpovědět
9.5.2013 10:11
Avatar
Libor Šimo (libcosenior):9.5.2013 13:25

Díky, presne to som si myslel, ale nebol som si istý, že deklarácia musí byť globálna.

Nahoru Odpovědět
9.5.2013 13:25
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Lukáš Hruda:9.5.2013 13:46

Vždy nemusí, můžeš vytvořit i strukturu uvnitř funkce:

void funkce()
{
  typedef struct
  {
    int a;
    int b;
  }struktura;

  struktura s = {5,10};
}

Pak tu strukturu ale můžeš použít jenom uvnitř té funkce a žádná jiná funkce nemůže pracovat s jejími instancemi, což většinou nemá moc smysl. Struktury se v drtivé většině případů definují mimo funkce, tedy globálně.

 
Nahoru Odpovědět
9.5.2013 13:46
Avatar
Odpovídá na Lukáš Hruda
Libor Šimo (libcosenior):10.5.2013 6:58

Díky. Je mi to jasné.

Nahoru Odpovědět
10.5.2013 6:58
Aj tisícmíľová cesta musí začať jednoduchým krokom.
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 12 zpráv z 12.