Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.98 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<string.h>
  5.  
  6. typedef struct versenyzo {
  7.     char nev[30];
  8.     int fordulo[6];     /*Egy logikai tömb, amely eldönti hogy egy versenyző részt vett-e egy fordulóban*/
  9.     int pontszam[3];    /*Az 1-1 fordulóban elért 3 pontszámot tárolja (mindig felül lesz írva)*/
  10.     int sorszam;
  11.     int kivalasztas;    /*A párokba állításhoz egy logikai változó*/
  12. }versenyzo;
  13.  
  14. typedef struct paros {      /*Láncolt lista elemei - pároknak*/
  15.     versenyzo v1;
  16.     versenyzo v2;
  17.     struct paros *next;
  18. }paros;
  19.  
  20. versenyzo *beolvasas(char *filenev, int *pdb)
  21. {
  22.     versenyzo *dintomb;
  23.     FILE *be;
  24.     char puffer[35];
  25.     int db, i;
  26.  
  27.     be = fopen(filenev, "r");
  28.     if (be == NULL)
  29.         return 11;
  30.     fgets(puffer, 35, be);
  31.     sscanf(puffer, "%d", &db); /*Első sor beolvasása = ennyi további adatot kell beolvasni*/
  32.  
  33.     dintomb = (versenyzo*)malloc(db*sizeof(versenyzo));
  34.     if (dintomb == NULL)
  35.         return 12;
  36.  
  37.     for (i = 0; i < db; ++i)    /*A versenyzők sorszámának és nevének beolvasása egyenként*/
  38.     {
  39.         fgets(puffer, 35, be);
  40.         sscanf(puffer, "%d", &dintomb[i].sorszam);
  41.         fgets(dintomb[i].nev, "%s", be);
  42.     }
  43.  
  44.     fclose(be);
  45.     *pdb = db;
  46.     return dintomb;
  47. }
  48.  
  49. versenyzo *feltoltes(versenyzo *Indulok, int *meret)    /*A fordulo tömb feltöltése*/
  50. {
  51.     int j, k;
  52.     for (j = 0; j < *meret; ++j)
  53.     {
  54.         for (k = 0; k < 6; ++k)
  55.         {
  56.             if (k == 0)
  57.                 Indulok[j].fordulo[k] = 1;
  58.             else
  59.                 Indulok[j].fordulo[k] = 0;
  60.         }
  61.     }
  62.     return Indulok;
  63. }
  64.  
  65. versenyzo *kinullazas(versenyzo *Indulok, int *meret)   /*Ennek a logikai változónak (kivalasztas) szükséges a 0-ra állítása minden forduló elején*/
  66. {
  67.     int i;
  68.     for (i = 0; i < *meret; ++i)
  69.         Indulok[i].kivalasztas = 0;
  70.     return Indulok;
  71. }
  72.  
  73. paros *new_par(paros *head, versenyzo v_1, versenyzo v_2)       /*Új pár hozzáadása a listához*/
  74. {
  75.     paros *uj;
  76.     uj = (paros*)malloc(sizeof(paros));
  77.     uj->v1 = v_1;
  78.     uj->v2 = v_2;
  79.     uj->next = head;
  80.     head = uj;
  81.     return head;
  82. }
  83.  
  84. void print_list(paros *head)        /*A lista kiírása*/
  85. {
  86.     paros *p;
  87.     p = head;
  88.     if (head != NULL)
  89.     {
  90.         while (p != NULL)
  91.         {
  92.             printf("Paros:\n");
  93.             printf("%s\n%s\n\n", p->v1.nev, p->v2.nev);
  94.             p = p->next;
  95.         }
  96.     }
  97. }
  98.  
  99. paros *pontozas(paros *head)        /*Az egyes játékosok pontozása a láncolt listában*/
  100. {
  101.     int i, random1, random2;
  102.     paros *p;
  103.     p = head;
  104.     if (head != NULL)
  105.     {
  106.         while (p != NULL)
  107.         {
  108.             for (i = 0; i < 3; ++i)
  109.             {
  110.                 random1 = rand() % 4;
  111.                 random2 = rand() % 4;
  112.                 p->v1.pontszam[i] = random1;
  113.                 p->v2.pontszam[i] = random2;
  114.             }
  115.             p = p->next;
  116.         }
  117.     }
  118.     return head;
  119. }
  120.  
  121. paros *tovabbjutas(paros *head, int fordulo)        /*Eldönti a függvény hogy ki nyerte a mérkőzést*/
  122. {
  123.     int sum1 = 0, sum2 = 0, i, random1, random2;
  124.     paros *p;
  125.     p = head;
  126.     if (head != NULL)
  127.     {
  128.         while (p != NULL)
  129.         {
  130.             for (i = 0; i < 3; ++i)         /*Pontok összegzése*/
  131.             {
  132.                 sum1 += p->v1.pontszam[i];
  133.                 sum2 += p->v2.pontszam[i];
  134.             }
  135.             if (sum1 == sum2)               /*Ha egyenlő a pontszám akkor új forduló*/
  136.             {
  137.                 random1 = rand() % 4;
  138.                 random2 = rand() % 4;
  139.                 while (random1 == random2)
  140.                 {
  141.                     random1 = rand() % 4;
  142.                     random2 = rand() % 4;
  143.                 }
  144.                 if (random1 > random2)
  145.                     p->v1.kivalasztas = 1;      /*A nyertes logikai változójának 1-esre állítása*/
  146.                 else
  147.                     p->v2.kivalasztas = 1;
  148.             }
  149.             if (sum1 > sum2)
  150.                 p->v1.kivalasztas = 1;
  151.             if (sum2 > sum1)
  152.                 p->v2.kivalasztas = 1;
  153.             p = p->next;
  154.         }
  155.     }
  156.     return head;
  157. }
  158.  
  159. versenyzo *adatatiras(paros *head, versenyzo *Indulok, int *meret, int fordulo)     /*A láncolt listából a nyertesek kiválasztása és az Indulók köv. fordulójának 1-re állítása*/
  160. {
  161.     int i;
  162.     paros *p;
  163.     p = head;
  164.     if (head != NULL)
  165.     {
  166.         while (p != NULL)
  167.         {
  168.             if (p->v1.kivalasztas == 1)
  169.             {
  170.                 for (i = 0; i < *meret; i++)
  171.                 {
  172.                     if (p->v1.sorszam == Indulok[i].sorszam)
  173.                         Indulok[i].fordulo[fordulo + 1] = 1;
  174.                 }
  175.             }
  176.             else
  177.             {
  178.                 for (i = 0; i < *meret; i++)
  179.                 {
  180.                     if (p->v2.sorszam == Indulok[i].sorszam)
  181.                         Indulok[i].fordulo[fordulo + 1] = 1;
  182.                 }
  183.             }
  184.             p = p->next;
  185.         }
  186.     }
  187.     return Indulok;
  188. }
  189.  
  190. void delete_list(paros *head)       /*A lista törlése.*/
  191. {
  192.     paros *p;
  193.     p = head->next;
  194.     if (head != NULL)
  195.     {
  196.         while (p != NULL)
  197.         {
  198.             free(head);
  199.             head = p;
  200.             p = p->next;
  201.         }
  202.         free(head);
  203.     }
  204. }
  205.  
  206. versenyzo *verseny(versenyzo *Indulok, int *osszesindulo)
  207. {
  208.     int i, k, j; /*ciklusváltozók*/
  209.    
  210.     for (i = 0; i < 5; ++i)
  211.     {
  212.         Indulok = kinullazas(Indulok, osszesindulo);            /*Minden forduló elején szükséges!*/
  213.         paros *head;                    /*Minden fordulóban újabb listára van szükség.*/
  214.         head = NULL;
  215.  
  216.         int tovabbjutottak = 0;
  217.         for (j = 0; j < *osszesindulo; ++j)         /*Megnézi hányan jutottak tovább ebbe a fordulóba.*/
  218.         {
  219.             if (Indulok[j].fordulo[i] == 1)
  220.                 tovabbjutottak++;
  221.         }
  222.         int *indexek;
  223.         indexek = (int*)malloc(tovabbjutottak*sizeof(int));     /*Egy dinamikus tömb létrehozása, melyben a továbbjutott indulók indexeit tárolom*/
  224.         int t = 0;
  225.  
  226.         for (k = 0; k < *osszesindulo; ++k)     /*Továbbjutottak indexeinek beolvasása*/
  227.         {
  228.             if (Indulok[k].fordulo[i] == 1)
  229.             {
  230.                 indexek[t] = k;
  231.                 t++;
  232.             }
  233.         }
  234.        
  235.         int kivalaszt = 0;
  236.         versenyzo par[2];           /*Kételemű tömb egy pár eltárolására*/
  237.  
  238.         while (kivalaszt != tovabbjutottak)     /*Párbaállítás kezdete*/
  239.         {
  240.             int random, a;
  241.             random = rand() % tovabbjutottak + 1;
  242.             for (a = 0; a < 2; ++a)
  243.             {
  244.                 if (Indulok[indexek[random - 1]].kivalasztas == 1)  /*Ha már ki lett választva*/
  245.                 {
  246.                     while (Indulok[indexek[random - 1]].kivalasztas != 0 && Indulok[indexek[random - 1]].fordulo[i] == 1)   /*Addig generáljon egy random indexet amíg olyan elemet nem talál, amely még nem volt kiválasztva*/
  247.                         random = rand() % tovabbjutottak + 1;
  248.                 }
  249.                 par[a] = Indulok[indexek[random - 1]];
  250.                 /*Hamarabb olvasom be a tömbbe, minthogy 1-re állítanám a logikai változóját -- > a láncolt listában 0 marad így ott is felhasználhatom még.*/
  251.                 kivalaszt++;
  252.                 Indulok[indexek[random - 1]].kivalasztas = 1;           /*Logikai változójának beállítása - többé ne legyen kiválasztva*/
  253.             }
  254.             head = new_par(head, par[0], par[1]);                   /*A versenyzőket kettesével beolvasom a láncolt listába*/
  255.         }   /*Párbaállítás vége!*/
  256.  
  257.         head = pontozas(head);          /*Pontozás*/
  258.         head = tovabbjutas(head, i);        /*Továbbjutók kiválasztása (a láncolt listában egyelőre)*/
  259.         adatatiras(head, Indulok, osszesindulo, i);     /*A továbbjutó következő fordulójának 1-re állítása a TÖMBben.*/
  260.         printf("Az %d-dik fordulo versenyzoi:\n\n", i + 1);
  261.         print_list(head);
  262.         printf("\n");
  263.  
  264.         free(indexek);
  265.         delete_list(head);
  266.     }
  267.  
  268.     return Indulok;
  269. }
  270.  
  271. void binarisba_iras(versenyzo *Indulok, int *osszesindulo)
  272. {
  273.     FILE *ki;
  274.     ki = fopen("Nyertes.dat", "wb");
  275.     if (ki == NULL)
  276.         return 15;
  277.     int i;
  278.     char puffer[35];
  279.     for (i = 0; i < *osszesindulo; ++i)
  280.     {
  281.         if (Indulok[i].fordulo[5] == 1)
  282.             strcpy(puffer, Indulok[i].nev);
  283.     }
  284.     if (fwrite(puffer, 36 * sizeof(char), 1, ki) != 1)
  285.         return 16;
  286.    
  287.     if (fclose(ki) != 0)
  288.         return 17;
  289.     fclose(ki);
  290. }
  291.  
  292. void binaris_beolvas() /*Ellenőrzés*/
  293. {
  294.     FILE *bin;
  295.     bin = fopen("Nyertes.dat", "rb");
  296.     if (bin == NULL)
  297.         return 18;
  298.     char puffer[35];
  299.     if(fread(puffer, 36*sizeof(char), 1, bin) != 1)
  300.         return 19;
  301.     printf("%s\n", puffer);
  302.     if (fclose(bin) != 0)
  303.         return 20;
  304.     fclose(bin);
  305. }
  306.  
  307. int main()
  308. {
  309.     versenyzo *Indulok;
  310.     int osszesindulo;
  311.     int l;
  312.  
  313.     srand(time(NULL));
  314.     /*Adatok beolvasása: */
  315.     Indulok = beolvasas("versenyzok.txt", &osszesindulo);
  316.     /*A forduló logikai tömb feltöltése: */
  317.     Indulok = feltoltes(Indulok, &osszesindulo);
  318.     /*A verseny lebonyolítása: */
  319.     Indulok = verseny(Indulok, &osszesindulo);
  320.     /*Eredmény kiírása bináris fájlba: */
  321.     binarisba_iras(Indulok, &osszesindulo);
  322.     /*printf("\n\n");
  323.     for (l = 0; l < osszesindulo; ++l)
  324.     {
  325.         if (Indulok[l].fordulo[5] == 1)
  326.             printf("A nyertes: %s\n", Indulok[l].nev);
  327.     }*/
  328.     /*Ellenőrzés*/
  329.     binaris_beolvas();
  330.     free(Indulok);
  331.     return 0;
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement