Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<string.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<math.h>
- typedef struct bases /*a bázis adatait tároló struktúra: a címe, meg a következőre mutató pointer*/
- {
- unsigned int x;
- unsigned int y;
- struct bases *nbase;
- }base;
- typedef struct gyereks
- {
- int sm; /*sent money: az elküldött pénz*/
- char* ajl[26]; /*az ajándék lista*/
- unsigned int x; /*a haázuk koordinátája*/
- unsigned int y;
- int bd, volt; /*base distance, meg iga/hamis: a bázistól való távolság és hogy feldolgoztuk-e már(később bővebben)*/
- base* honnan; /*a bázishoz való tartozást mutató pointer*/
- struct gyereks* ngyerek; /*a következő gyerekre mutató pointer*/
- }gyerek;
- int artomb[26];
- double distance(unsigned int ax, unsigned int ay, unsigned int bx, unsigned int by) /*két-két számot kap, amik megfelelnek a 2 pont koordinátájának*/
- {
- double d;
- if ((ax>bx)&&(ay>by)) /*Csak nagyobból lehet kivonni a kisebbet*/
- d=sqrt((double)(ax-bx)*(double)(ax-bx)+(double)(ay-by)*(double)(ay-by)); /*az sqrt nem műlödik a unsigned int típussal, ezért double-é kell castolnom*/
- else if((ax>by)&&(ay<by))
- d=sqrt((double)(ax-bx)*(double)(ax-bx)+(double)(by-ay)*(double)(by-ay));
- else if((ax<bx)&&(ay>by))
- d=sqrt((double)(bx-ax)*(double)(bx-ax)+(double)(ay-by)*(double)(ay-by));
- else
- d=sqrt((double)(bx-ax)*(double)(bx-ax)+(double)(by-ay)*(double)(by-ay));
- return d;
- }//////////tavolsag
- double kerekit(double szam) /*a kapott számot kerekítem floor függvény segítségével*/
- {
- double kerekitett=floor(szam+0.5);
- return kerekitett;
- }///////kerekit
- base *new_base_list() /*Új base elemekből álló listát hoz létre*/
- {
- base *stre=(base*)malloc(sizeof (base)); /*Egy első és hátsó strázsát tartalmaz*/
- base *stru=(base*)malloc(sizeof (base));
- if(stre&&stru)
- {
- stre->x=0;
- stre->y=0;
- stre->nbase=stru;
- stru->x=0; /*A rendezés miatt célszerű 0-nak venni az értékait a hátsó strázsának*/
- stru->y=0;
- stru->nbase=NULL;
- return stre;
- }
- else /*Ha nem jött létre az egyik strázsa, akkor a másik se legyen már ott :D*/
- {
- if(!stru)
- free(stre);
- if(!stre)
- free(stru);
- return NULL;
- }
- }//////////new_base_list
- base *new_base(unsigned int h, unsigned int v) /*horizontal és vertical változókat kap a listaelemet feltöltő függvény*/
- {
- base*helye=(base*)malloc(sizeof(base));
- if(helye) /*ha le tudta foglalni és nem nullát adott vissza*/
- helye->x=h;
- helye->y=v;
- helye->nbase=NULL;
- return helye;
- }//////////new_base
- base* add_base(base*stre) /*Bázisokat beolvasó és tároló függvény*/
- {
- unsigned int hori, verti, k, i=0;
- base *spot, *temp, *head=stre; /*Mivel rendezem is egyből, kell ennyi változó*/
- FILE *fp=fopen("BASE.DAT","rb");
- if(!fp) /*Ha hibásan nyitná meg a filet:*/
- {
- printf("An error occured during the opening of the file.\n");
- return 0;
- }
- while (fread (&k, sizeof (unsigned int), 1, fp) != 0) /*A ciklus addig megy, amíg az fp a nullára nem mutat*/
- {
- if(i%2==0)
- verti=k;
- else
- {
- hori=k;
- temp=new_base(hori, verti); /*A rendezésnél a legkeletibb kell, az lesz az első elemem, hogy strázsa arra mutasson*/
- spot=stre; /*A rendezésnél mindig a lista első elemével kell kezdeni, hogy biztosan jó értéket adjon*/
- for(spot; spot->nbase!=NULL; spot=spot->nbase)
- {
- if(hori>spot->nbase->x) /*A legkeletibb bázist teszi az első helyre*/
- {
- spot->nbase=temp;
- }
- }
- }
- i++;
- }
- fclose(fp);
- return stre; /*Az első elem címét kell visszaadni az eljárás végeztélvel.*/
- }//////// add_base
- void arak() /*beolvassa fajlbol az egyes ajandekok arait, ezt pedig egy tombben tarolja*/
- {
- int i;
- FILE *fp = fopen("PRICE.DAT", "rb"); /*Globális változóba ovlassa be*/
- if(!fp)
- {
- printf("An error occured during the opening of the file.\n");
- return 0;
- }
- for(i=0;i<26;i++)
- fread(&artomb[i], sizeof(int), 1, fp);
- fclose(fp);
- }//////////arak
- gyerek *new_gyerek_list() /*Új base elemekből álló listát hoz létre*/
- {
- gyerek *stre=(gyerek*)malloc(sizeof (gyerek)); /*Egy első és hátsó strázsát tartalmaz*/
- gyerek *stru=(gyerek*)malloc(sizeof (gyerek));
- if(stre&&stru)
- {
- stre->sm=0; /*Az ajl(ajándék lista nem kell, mert a strázsát nem használjuk.)*/
- stre->x=0;
- stre->y=0;
- stre->bd=0;
- stre->volt=1;
- stre->honnan=NULL;
- stre->ngyerek=NULL;
- stru->sm=0;
- stru->x=0;
- stru->y=0;
- stru->bd=0;
- stru->volt=1;
- stru->honnan=NULL;
- stru->ngyerek=NULL;
- return stre;
- }
- else /*Ha nem jött létre az egyik strázsa, akkor a másik se legyen már ott :D*/
- {
- if(!stru)
- free(stre);
- if(!stre)
- free(stru);
- return NULL;
- }
- }/////////////new_gyerek_list
- gyerek *new_gyerek(unsigned int h, unsigned int v, unsigned sent_money, char*ajlista) /*horizontal és vertical változókat kap a listaelemet feltöltő függvény*/
- {
- gyerek*minden=(gyerek*)malloc(sizeof(gyerek));
- if(minden) /*ha le tudta foglalni és nem nullát adott vissza*/
- {
- minden->ajl[26]=ajlista;
- minden->x=h;
- minden->y=v;
- minden->sm=sent_money;
- minden->ngyerek=NULL;
- minden->volt=1;
- minden->bd=0;
- minden->honnan=NULL;
- }
- return minden;
- }//////////new_gyerek
- gyerek* add_gyerek(gyerek* stre)
- {
- FILE* fp=fopen("GIFT.TXT", "rt");
- char c, *ajl; /*ajl az ajándéklista verti, hori és sm a file-ból kiolvasott: x,y koordináták és az elküldött pénz*/
- unsigned verti, hori, i=0, sm;
- gyerek* temp=NULL, *spot=stre->ngyerek;
- while(fscanf(fp,"%d %d\n", &verti, &hori)!=EOF)
- {
- for(i=27; i>=0; i--) /*Kinullázza a tömböt*/
- temp->ajl[i]='\0';
- while(fscanf(fp, "%c ", &c) && c!='\n')
- {
- if('A'<=c && c<='Z')
- ajl[i++]=c; /*i-t az előbb levittük 0-ra, ezért a 0 címkéjű elemnél indul*/
- }
- fscanf(fp, "%d", &sm);
- temp=new_gyerek(verti, hori, sm, ajl);
- spot->ngyerek=temp;
- spot=spot->ngyerek;
- }
- return stre;
- fclose(fp);
- }/////////////add_gyerek
- gyerek* find_north_gyerek(gyerek* stre)
- {
- gyerek* spot=stre->ngyerek, *temp=NULL; /*Lépgeteő spot, segéd temp, ebben tárolom a visszaadandó gyerek címét*/
- unsigned int max=0;
- while(spot->ngyerek)
- {
- if(max<spot->x)
- {
- max=spot->x;
- temp=spot;
- }
- spot=spot->ngyerek;
- }
- return temp;
- }/////////////find_north_gyerek
- int main()
- {
- gyerek* gyp, *ami;
- base* bp, *valami;
- bp=new_base_list();
- valami=add_base(bp);
- gyp=new_gyerek_list();
- ami=add_gyerek(gyp);
- return 0;
- }
Add Comment
Please, Sign In to add comment