From 4145c627a225fd720c37ec8500cd865b11a70da4 Mon Sep 17 00:00:00 2001 From: tht_krisztian <tht_krisztian@sch.bme.hu> Date: Mon, 2 Dec 2013 20:14:00 +0100 Subject: [PATCH] Modulozva2.0 --- receptor/beolvasofv.c | 358 ++++++++++++++++++++++++++++++++++++++++ receptor/receptor.h.bak | 68 ++++++++ receptor/receptor.zip | Bin 4086 -> 0 bytes 3 files changed, 426 insertions(+) create mode 100644 receptor/beolvasofv.c create mode 100644 receptor/receptor.h.bak delete mode 100644 receptor/receptor.zip diff --git a/receptor/beolvasofv.c b/receptor/beolvasofv.c new file mode 100644 index 0000000..0e0d7ee --- /dev/null +++ b/receptor/beolvasofv.c @@ -0,0 +1,358 @@ +#define TESZT +#include "receptor.h" +#ifndef BEOLVASO_FV +#define BEOLVASO_FV +#ifndef INCLUDES +#define INCLUDES +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#endif + +void Lista_hoz_beszur(Hozzavalo *uj,Lista_hoz *lista); +void Lista_rec_beszur(Recept *uj,Lista_rec *lista); +void Lista_hoz_init(Lista_hoz *lista); +void Lista_rec_init(Lista_rec *lista); +void Main_receptek(Lista_rec *lista); +Recept* Beolvas_recept(FILE *fp,char * fajlnev); +Hozzavalo* Beolvas_hozzavalo(char *str); +void kiir(Lista_rec *lista); +void szabadit_hozzavalok(Recept *eleje); +void szabadit_elkeszites(char** pt,int db); +void szabadit_receptek(Recept *eleje); +char mertekegysegek_szovegben[][15]={"mg","g","dkg","kg","ml","cl","dl","l","db","teaskanal","kiskanal","evokanal","merokanal","p�r","fej","gerezd","szelet","csomag",""}; + +void Lista_hoz_beszur(Hozzavalo *uj,Lista_hoz *lista) +{ + uj->kovetkezo=lista->eleje->kovetkezo; + lista->eleje->kovetkezo=uj; + uj->kovetkezo->elozo=uj; + uj->elozo=lista->eleje; + +} + +void Lista_rec_beszur(Recept *uj,Lista_rec *lista) +{ + uj->kovetkezo=lista->eleje->kovetkezo; + lista->eleje->kovetkezo=uj; + uj->kovetkezo->elozo=uj; + uj->elozo=lista->eleje; +} + + +void Lista_hoz_init(Lista_hoz *lista) +{ + lista->eleje=(Hozzavalo*)malloc(sizeof(Hozzavalo)); + lista->vege=(Hozzavalo*)malloc(sizeof(Hozzavalo)); + lista->eleje->kovetkezo=lista->vege; + lista->eleje->elozo=NULL; + lista->vege->kovetkezo=NULL; + lista->vege->elozo=lista->eleje; +} + +void Lista_rec_init(Lista_rec *lista) +{ + lista->eleje=(Recept *) malloc(sizeof(Recept)); + lista->vege=(Recept*) malloc(sizeof(Recept)); + lista->eleje->kovetkezo=lista->vege; + lista->eleje->elozo=NULL; + lista->vege->kovetkezo=NULL; + lista->vege->elozo=lista->eleje; +} + +/** Beolvassa a 00.txt f�jlban t�rolt f�jlneveket, �s l�trehozza a l�ncolt list�t a receptekb�l +* Megh�vja a Beolvas_recept, Lista_rec_beszur f�ggv�nyeket. +* @param lista Egy str�zsa, a recepteken. +* @param temp (max 100) ideiglenes puffer beolvas�shoz +* @param fajlnev (max 50) �ppen kiolvasand� f�jl nev�t t�rolja +* @param fp_00 FILE pointer a 00.txt f�jlra +* @param fp File pointer az �ppen beolvasasnd� f�jlra mutat +* @param ujelem Recept pointer, ebben t�rol�dik az �jonnan beolvasott recept, ekkor m�g nincs neki foglalva hely +* @param db_rec a 00.txt els� sor�ban t�rolt sz�m, megadja a receptek sz�m�t +*/ +void Main_receptek(Lista_rec *lista) +{ +#ifdef TESZT +fprintf(stdout,"Main receptek f�ggv�ny: \n"); +#endif + char temp[100]=""; + char fajlnev[50]; + + FILE *fp_00=NULL; + FILE *fp=NULL; + Recept *ujelem; + Lista_rec_init(lista); + + fp_00=fopen("00.txt","rt"); + if(fp_00==NULL) printf("Nem sikerult megnyitni a fajlt!\n"); + else{ + int db_rec,i,k; + fgets(temp,5,fp_00); + db_rec=atoi(temp); + #ifdef TESZT + fprintf(stdout,"Receptek sz�ma: %d\n",db_rec); + #endif + for(i=0;i<db_rec;i++) + { + fgets(temp,50,fp_00); + k=0; + while(temp[k]!='\n') + { + fajlnev[k++]=temp[k]; + } + fajlnev[k]='\0'; + fp=fopen(fajlnev, "rt"); + if (fp==NULL) printf("Nem sikerult megnyitni a fajlt!\n"); + else + { + ujelem=Beolvas_recept(fp,fajlnev); + Lista_rec_beszur(ujelem,lista); + } + } + } + #ifdef TESZT + fprintf(stdout,"----Main Receptek V�ge\n"); + #endif +} +/** Param�terk�nt �tvett f�jlb�l beolvassa a recept nev�t,neh�zs�g�t,elk.idej�t. +*! Dinamikus mem�ri�t foglal, amit a h�v� feladata felszabad�tani. +* Megh�vja Lista_hoz_init, Beolvas_hozzavalo, Lista_hoz_beszur f�ggv�nyeket. +* @param fp FILE pointer receptre mutatat. +* @param fajlnev a forr�sf�jl neve kiterjeszt�ssel. +* @param uj_rec dinamikusan foglalt ter�let egy recept sz�m�ra. +* @param temp ideiglenes puffer f�jlb�l olvas�shoz. +* @param temp_int ideiglenes puffer sz�mok t�rol�s�hoz. +* @param allapot defini�lt t�pus, mely ir�ny�t egy switch-et, kett�v�lasztja a beolvas�s els� r�sz�t a hozz�val�k beolvas�s�st�l. +* @param lista_hozza Str�zsa a hozz�val�k l�ncolt list�j�n. (!Dinamikusan foglalt) +* @param temp_hozza ideiglenes t�rol� az �ppen beolvasni k�v�nt hozz�val�nak. +* @return pointer az ujonnan l�trehozott receptre, NULL, ha nem tudott dinamikusan foglalni helyet +*/ +Recept* Beolvas_recept(FILE *fp,char * fajlnev) +{ + #ifdef TESZT + fprintf(stdout,"Beolvas_recept f�ggv�ny: \n"); + #endif + + Recept* uj_rec=(Recept*)malloc(sizeof(Recept)); + if(uj_rec!=NULL) + { + char temp[100]; + int temp_int; + + strcpy(uj_rec->fajlnev,fajlnev); + + fgets(temp,100,fp); + strcpy(uj_rec->nev,temp); + + fgets(temp,100,fp); + sscanf(temp,"%d ",&temp_int); + uj_rec->nehezseg=temp_int; + + fgets(temp,100,fp); + sscanf(temp,"%d ",&temp_int); + uj_rec->fozesi_ido=temp_int; + + #ifdef TESZT + fprintf(stdout,"Recept: %s\n",uj_rec->fajlnev); + #endif + + beolvasas allapot; + allapot=elso_szakasz; + + Lista_hoz *lista_hozza=(Lista_hoz*)malloc(sizeof(Lista_hoz)); + if(lista_hozza!=NULL) + { + Lista_hoz_init(lista_hozza); + + Hozzavalo *temp_hozza; + #ifdef TESZT + fprintf(stdout,"Hozz�val�k beolvas�sa: \n"); + #endif + while(fgets(temp,100,fp) && strstr(temp,"Elkeszites:")==NULL) + { + switch(allapot) + { + case elso_szakasz: + if(strstr(temp,"Hozzavalok:")!=NULL) + { + allapot=hozzavalok_beolvas; + fgets(temp,100,fp); + sscanf(temp,"%d ",&temp_int); + uj_rec->fo=temp_int; + } + break; + + case hozzavalok_beolvas: + temp_hozza=Beolvas_hozzavalo(temp); + if(temp_hozza==NULL) printf("Hiba a hozzavalok letrehozasanal!\n"); + else Lista_hoz_beszur(temp_hozza,lista_hozza); + break; + } + } + uj_rec->hozzavalok=lista_hozza; + } + } + #ifdef TESZT + fprintf(stdout,"----Beolvas_recept V�ge"); + #endif + return uj_rec; +} + +/** Param�terk�n �tvesz egy sornyi beolvasott hozz�val�t, amivel azt�n felt�lt egy Hozzavalo t�pus� dinamikusan fogalalt v�ltoz�t. +* @param str param�terk�nt �tvett sztring, mely tartalmazza a beolvasott hozz�val�t +* @param uj_hozz Dinamikusan fogalalt mem�ria egy hozz�val�nak +* @param ujmenny ideiglenes t�rol� +* @param ujmertek ideiglenes t�rol� +* @param ujnev ideiglenes t�rol� +* @return �rtelmezett hozz�val�ra mutatott pointerrel, NULL, ha nem siker�lt dinamikusan mem�ri�t foglalni. +*/ +Hozzavalo* Beolvas_hozzavalo(char *str) +{ + #ifdef TESZT + fprintf(stdout,"Beolvas_hozzavalo f�ggv�ny: \n"); + #endif + Hozzavalo* uj_hozz=(Hozzavalo*)malloc(sizeof(Hozzavalo)); + if(uj_hozz!=NULL) + { + char ujmenny[255],ujmertek[255],ujnev[255]; + sscanf(str,"%s %s ",ujmenny,ujmertek); + if(isdigit(ujmenny[0])) + { + int i,k; + uj_hozz->mennyiseg=atoi(ujmenny); + i=0; + while(strcmp(mertekegysegek_szovegben[i],ujmertek) && strcmp(mertekegysegek_szovegben[i],"")) i++; + if(!strcmp(mertekegysegek_szovegben[i],ujmertek)) uj_hozz->mertekegyseg=i; + else uj_hozz->mertekegyseg=ismeretlen; + + + k=strlen(ujmenny)+strlen(ujmertek)+2; + for(i=0;k<=(strlen(str));i++) ujnev[i]=str[k++]; + } + else + { + strcpy(ujnev,str); + uj_hozz->mennyiseg=-1; + uj_hozz->mertekegyseg=-1; + } + + strcpy(uj_hozz->nev,ujnev); + #ifdef TESZT + fprintf(stdout,"%s",ujnev); + fprintf(stdout,"----Beolvas_hozzavalo V�ge\n"); + #endif + } + return uj_hozz; +} + +/*void Beolvas_elkeszites() +{ + //h�ny utas�t�s lesz? + int i; + ujelem->elkeszites_db=atoi(temp); + + //!a h�v� feladata felszabad�tani + lista_elem->elkeszites= (char **) malloc(lista_elem->elkeszites_db*sizeof(char*)); + + for(i=0;i<lista_elem->elkeszites_db;i++) + { + fgets(temp,400,fp); + lista_elem->elkeszites[i]=(char *) malloc((strlen(temp)+1)*sizeof(char)); + strcpy(lista_elem->elkeszites[i],temp); + } + fgets(temp,400,fp); +}*/ + +void kiir(Lista_rec *lista) +{ + Hozzavalo *i; + printf("Az on valasztasa a %s receptje\n",lista->eleje->kovetkezo->nev); + printf("Nehezsegi szint: %2d/10\n",lista->eleje->kovetkezo->nehezseg); + printf("\r"); + printf("Varhato idotartam: %d perc\n",lista->eleje->kovetkezo->fozesi_ido); + + i=lista->eleje->kovetkezo->hozzavalok->vege->elozo; + printf("Hozzaval�k: \n"); + while(i!=lista->eleje->kovetkezo->hozzavalok->eleje) + { + if(i->mennyiseg>0) + { + printf("%d %s %s\n",i->mennyiseg,mertekegysegek_szovegben[i->mertekegyseg],i->nev); + } + else + { + printf("%s\n",i->nev); + } + i=i->elozo; + } + //!Meg kell �rni, hogy csak egyet olvasson be amire sz�ks�g�nk van + /*printf("\nElkeszites:\n"); + int k; + for(k=0;k<lista->eleje->kovetkezo->elkeszites_db;k++) + { + printf("%s\n",lista->eleje->kovetkezo->elkeszites[k]); + }*/ +} + +//A hozz�val�knak foglalt dinamikus mem�ria ter�letet felszabad�tja + +void szabadit_hozzavalok(Recept *eleje) +{ + #ifdef TESZT + fprintf(stdout,"Szabadit_hozzavalok: \n"); + #endif + int db=0; + Recept *mozgo_rec; + Hozzavalo *mozgo_hoz,*kov; + for(mozgo_rec=eleje->kovetkezo;mozgo_rec->kovetkezo!=NULL;mozgo_rec=mozgo_rec->kovetkezo) + { + for(mozgo_hoz=mozgo_rec->hozzavalok->eleje->kovetkezo;mozgo_hoz->kovetkezo!=NULL;) + { + kov=mozgo_hoz->kovetkezo; + free(mozgo_hoz); + db++; + mozgo_hoz=kov; + } + free(mozgo_rec->hozzavalok->eleje); + free(mozgo_rec->hozzavalok->vege); + } + #ifdef TESZT + fprintf(stdout,"Felszabaditott hozzavalok: %d\n",db); + fprintf(stdout,"----Szabadit_hozzavalok V�ge\n"); + #endif +} + +//Az elk�sz�t�s m�dj�t t�rol� char m�trixnak foglalt ter�letet felszabad�tja +void szabadit_elkeszites(char** pt,int db) +{ + int i; + for(i=0;i<db;i++) + { + free(pt[i]); + } + free(pt); +} + +//A recept strukt�r�knak dinamikusan foglalt mem�ri�t felszabad�tja +void szabadit_receptek(Recept *eleje) +{ + #ifdef TESZT + fprintf(stdout,"Szabadit_receptek: \n"); + #endif + int db=0; + Recept *akt,*kov; + for(akt=eleje->kovetkezo;akt->kovetkezo!=NULL;) + { + kov=akt->kovetkezo; + free(akt); + db++; + akt=kov; + } + free(eleje); + #ifdef TESZT + fprintf(stdout,"Felszabaditott receptek: %d\n",db); + fprintf(stdout,"----Szabadit_hozzavalok V�ge\n"); + #endif +} +#endif // BEOLVASO_FV diff --git a/receptor/receptor.h.bak b/receptor/receptor.h.bak new file mode 100644 index 0000000..ed8a023 --- /dev/null +++ b/receptor/receptor.h.bak @@ -0,0 +1,68 @@ +#include <stdio.h> +#ifndef FEJLEC +#define FEJLEC +typedef enum menu { + alap=0, + betolt_adatok=1, + alapanyagok_beker=2, + kereses=3 +}menu; + +typedef enum beolvasas{ + elso_szakasz, + hozzavalok_beolvas +} beolvasas; + +typedef enum mertek{ + mg=0,g,dkg,kg,ml,cl,dl,l,db,teaskanal,kiskanal,evokanal,merokanal,par,fej,gerezd,szelet,csomag,ismeretlen +} mertek; +/** Egy hozzávalót tároló struktúra.*/ +typedef struct Hozzavalo{ + char nev[100]; + int mennyiseg; + mertek mertekegyseg; + struct Hozzavalo *elozo; + struct Hozzavalo *kovetkezo; +} Hozzavalo; + +typedef struct Lista_hoz{ + Hozzavalo *eleje; + Hozzavalo *vege; +}Lista_hoz; + +typedef struct Recept{ + char nev[100]; + char fajlnev[100]; + int nehezseg; + int fozesi_ido; + Lista_hoz *hozzavalok; + int fo; //hány fő részére + int elkeszites_db; + char** elkeszites; + struct Recept *kovetkezo; + struct Recept *elozo; +} Recept; + +//Láncolt lista adatszerkezet strázsája, pointerek a lista első és utolsó elemére +typedef struct Lista_rec{ + Recept *eleje; + Recept *vege; +}Lista_rec; + +//char mertekegysegek_szovegben[][15]={"mg","g","dkg","kg","ml","cl","dl","l","db","teaskanal","kiskanal", +//"evokanal","merokanal","pár","fej","gerezd","szelet","csomag",""}; + +/*void Lista_hoz_beszur(Hozzavalo *uj,Lista_hoz *lista); +void Lista_rec_beszur(Recept *uj,Lista_rec *lista); +void Lista_hoz_init(Lista_hoz *lista); +void Lista_rec_init(Lista_rec *lista); +void Main_receptek(Lista_rec *lista); +Recept* Beolvas_recept(FILE *fp,char * fajlnev); +Hozzavalo* Beolvas_hozzavalo(char *str); +void kiir(Lista_rec *lista); +void szabadit_hozzavalok(Recept *eleje); +void szabadit_elkeszites(char** pt,int db); +void szabadit_receptek(Recept *eleje);*/ + +#endif //FEJLEC + diff --git a/receptor/receptor.zip b/receptor/receptor.zip deleted file mode 100644 index da94d664b111184fa8feee7cb5fbe4b0a8b2f4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4086 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%0A&yd!iR9B0n93BA+Np|1QTK)&?( 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 TpwM7pU|}#}WMEjs2jT$$Ew3h2 -- GitLab