Guest User

Untitled

a guest
Apr 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.80 KB | None | 0 0
  1. #include<string.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. #include<math.h>         
  5.  
  6.  
  7. typedef struct bases                        /*a bázis adatait tároló struktúra: a címe, meg a következőre mutató pointer*/
  8. {
  9.     unsigned int x;
  10.     unsigned int y;
  11.     struct bases *nbase;
  12. }base;     
  13. typedef struct gyereks
  14. {
  15.     int sm;                             /*sent money: az elküldött pénz*/
  16.     char* ajl[26];                      /*az ajándék lista*/
  17.     unsigned int x;                     /*a haázuk koordinátája*/
  18.     unsigned int y;
  19.     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)*/
  20.     base* honnan;                       /*a bázishoz való tartozást mutató pointer*/
  21.     struct gyereks* ngyerek;                    /*a következő gyerekre mutató pointer*/
  22. }gyerek;
  23. int artomb[26];
  24.  
  25.  
  26.  
  27. 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*/
  28. {
  29.     double d;
  30.     if ((ax>bx)&&(ay>by))                                                               /*Csak nagyobból lehet kivonni a kisebbet*/
  31.         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*/
  32.     else if((ax>by)&&(ay<by))
  33.         d=sqrt((double)(ax-bx)*(double)(ax-bx)+(double)(by-ay)*(double)(by-ay));
  34.     else if((ax<bx)&&(ay>by))
  35.         d=sqrt((double)(bx-ax)*(double)(bx-ax)+(double)(ay-by)*(double)(ay-by));
  36.     else
  37.         d=sqrt((double)(bx-ax)*(double)(bx-ax)+(double)(by-ay)*(double)(by-ay));
  38.     return d;
  39. }//////////tavolsag
  40.  
  41. double kerekit(double szam)                                     /*a kapott számot kerekítem floor függvény segítségével*/
  42. {
  43.     double kerekitett=floor(szam+0.5);
  44.     return kerekitett;
  45. }///////kerekit
  46.  
  47. base *new_base_list()                                   /*Új base elemekből álló listát hoz létre*/
  48. {
  49.     base *stre=(base*)malloc(sizeof (base));                /*Egy első és hátsó strázsát tartalmaz*/
  50.     base *stru=(base*)malloc(sizeof (base));
  51.     if(stre&&stru)
  52.     {
  53.         stre->x=0;
  54.         stre->y=0;
  55.         stre->nbase=stru;
  56.         stru->x=0;                                      /*A rendezés miatt célszerű 0-nak venni az értékait a hátsó strázsának*/
  57.         stru->y=0;
  58.         stru->nbase=NULL;
  59.         return stre;
  60.     }
  61.     else                                                /*Ha nem jött létre az egyik strázsa, akkor a másik se legyen már ott :D*/
  62.     {
  63.         if(!stru)
  64.             free(stre);
  65.         if(!stre)
  66.             free(stru);
  67.         return NULL;
  68.     }
  69. }//////////new_base_list
  70.  
  71. base *new_base(unsigned int h, unsigned int v)                  /*horizontal és vertical változókat kap a listaelemet feltöltő függvény*/
  72. {
  73.     base*helye=(base*)malloc(sizeof(base));
  74.     if(helye)                                                   /*ha le tudta foglalni és nem nullát adott vissza*/
  75.         helye->x=h;
  76.         helye->y=v;
  77.         helye->nbase=NULL;
  78.     return helye;
  79. }//////////new_base
  80.  
  81. base* add_base(base*stre)                                       /*Bázisokat beolvasó és tároló függvény*/
  82. {
  83.     unsigned int hori, verti, k, i=0;                                      
  84.     base *spot, *temp, *head=stre;                              /*Mivel rendezem is egyből, kell ennyi változó*/
  85.     FILE *fp=fopen("BASE.DAT","rb");
  86.     if(!fp)                                                     /*Ha hibásan nyitná meg a filet:*/
  87.     {
  88.         printf("An error occured during the opening of the file.\n");
  89.         return 0;
  90.     }
  91.     while (fread (&k, sizeof (unsigned int), 1, fp) != 0)       /*A ciklus addig megy, amíg az fp a nullára nem mutat*/
  92.     {
  93.         if(i%2==0)     
  94.             verti=k;
  95.         else
  96.         {
  97.             hori=k;
  98.             temp=new_base(hori, verti);                         /*A rendezésnél a legkeletibb kell, az lesz az első elemem, hogy strázsa arra mutasson*/
  99.             spot=stre;                                          /*A rendezésnél mindig a lista első elemével kell kezdeni, hogy biztosan jó értéket adjon*/
  100.             for(spot; spot->nbase!=NULL; spot=spot->nbase)
  101.             {
  102.                 if(hori>spot->nbase->x)                         /*A legkeletibb bázist teszi az első helyre*/
  103.                 {
  104.                     spot->nbase=temp;
  105.                 }
  106.             }
  107.         }          
  108.         i++;
  109.     }
  110.     fclose(fp);
  111.     return stre;                                                /*Az első elem címét kell visszaadni az eljárás végeztélvel.*/
  112. }//////// add_base
  113. void arak()                                                     /*beolvassa fajlbol az egyes ajandekok arait, ezt pedig egy tombben tarolja*/
  114.  {
  115.         int i;
  116.         FILE *fp = fopen("PRICE.DAT", "rb");                    /*Globális változóba ovlassa be*/
  117.         if(!fp)
  118.         {
  119.             printf("An error occured during the opening of the file.\n");
  120.             return 0;
  121.         }
  122.         for(i=0;i<26;i++)
  123.             fread(&artomb[i], sizeof(int), 1, fp);
  124.         fclose(fp);
  125.  }//////////arak
  126. gyerek *new_gyerek_list()                                   /*Új base elemekből álló listát hoz létre*/
  127. {
  128.     gyerek *stre=(gyerek*)malloc(sizeof (gyerek));              /*Egy első és hátsó strázsát tartalmaz*/
  129.     gyerek *stru=(gyerek*)malloc(sizeof (gyerek));
  130.     if(stre&&stru)
  131.     {
  132.         stre->sm=0;                                         /*Az ajl(ajándék lista nem kell, mert a strázsát nem használjuk.)*/   
  133.         stre->x=0;                     
  134.         stre->y=0;
  135.         stre->bd=0;
  136.         stre->volt=1;
  137.         stre->honnan=NULL;                     
  138.         stre->ngyerek=NULL;
  139.         stru->sm=0;                                
  140.         stru->x=0;                     
  141.         stru->y=0;
  142.         stru->bd=0;
  143.         stru->volt=1;
  144.         stru->honnan=NULL;                     
  145.         stru->ngyerek=NULL;
  146.         return stre;
  147.     }
  148.     else                                        /*Ha nem jött létre az egyik strázsa, akkor a másik se legyen már ott :D*/
  149.     {
  150.         if(!stru)
  151.             free(stre);
  152.         if(!stre)
  153.             free(stru);
  154.         return NULL;
  155.     }
  156. }/////////////new_gyerek_list
  157. 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*/
  158. {
  159.     gyerek*minden=(gyerek*)malloc(sizeof(gyerek));
  160.     if(minden)                                                      /*ha le tudta foglalni és nem nullát adott vissza*/
  161.     {
  162.         minden->ajl[26]=ajlista;
  163.         minden->x=h;
  164.         minden->y=v;
  165.         minden->sm=sent_money;
  166.         minden->ngyerek=NULL;
  167.         minden->volt=1;
  168.         minden->bd=0;
  169.         minden->honnan=NULL;
  170.     }
  171.     return minden;
  172. }//////////new_gyerek
  173.  
  174. gyerek* add_gyerek(gyerek* stre)
  175. {
  176.     FILE* fp=fopen("GIFT.TXT", "rt");                                  
  177.     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*/
  178.     unsigned verti, hori, i=0, sm;
  179.     gyerek* temp=NULL, *spot=stre->ngyerek;
  180.  
  181.     while(fscanf(fp,"%d %d\n", &verti, &hori)!=EOF)
  182.     {
  183.         for(i=27; i>=0; i--)                                    /*Kinullázza a tömböt*/
  184.             temp->ajl[i]='\0';     
  185.         while(fscanf(fp, "%c ", &c) && c!='\n')
  186.             {
  187.                 if('A'<=c && c<='Z')
  188.                     ajl[i++]=c;                         /*i-t az előbb levittük 0-ra, ezért a 0 címkéjű elemnél indul*/
  189.             }
  190.         fscanf(fp, "%d", &sm);
  191.         temp=new_gyerek(verti, hori, sm, ajl);
  192.         spot->ngyerek=temp;
  193.         spot=spot->ngyerek;
  194.     }
  195.     return stre;
  196.     fclose(fp);
  197. }/////////////add_gyerek
  198. gyerek* find_north_gyerek(gyerek* stre)
  199. {
  200.     gyerek* spot=stre->ngyerek, *temp=NULL;                     /*Lépgeteő spot, segéd temp, ebben tárolom a visszaadandó gyerek címét*/
  201.     unsigned int max=0;
  202.     while(spot->ngyerek)
  203.     {
  204.         if(max<spot->x)
  205.         {
  206.             max=spot->x;
  207.             temp=spot;
  208.         }
  209.         spot=spot->ngyerek;
  210.     }
  211.     return temp;
  212. }/////////////find_north_gyerek
  213.  
  214.  
  215. int main()
  216. {
  217.     gyerek* gyp, *ami;
  218.     base* bp, *valami;
  219.     bp=new_base_list();
  220.     valami=add_base(bp);
  221.     gyp=new_gyerek_list();
  222.     ami=add_gyerek(gyp);
  223.     return 0;
  224. }
Add Comment
Please, Sign In to add comment