Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include "main.h"
  6.  
  7.  
  8. // Neuen Block anlegen
  9. // pText: Partei
  10. // pZahl: Stimmen
  11. P_BLOCK BlockNeu(char *pText, int pZahl) {
  12. P_BLOCK pBlock;
  13.  
  14. assert(pText);
  15. pBlock = (P_BLOCK) malloc(sizeof(T_BLOCK));
  16. if (pBlock == (P_BLOCK)NULL)
  17. return (P_BLOCK)NULL;
  18. else {
  19. size_t ObjektLaenge = strlen(pText)+1;
  20. pBlock->pNext = (P_BLOCK)NULL;
  21. pBlock->pPartei = (char *)malloc(ObjektLaenge);
  22. if (pBlock->pPartei == (char *)NULL) {
  23. free(pBlock);
  24. return ((P_BLOCK)NULL);
  25. }
  26. memcpy(pBlock->pPartei, pText, ObjektLaenge);
  27. pBlock->pStimmen = pZahl;
  28. return (pBlock);
  29. }
  30. }
  31. // pBlock wird an die Liste *pListe hinten angehängt
  32. void ListeHintenEinketten(P_BLOCK *pListe, P_BLOCK pBlock) {
  33. assert (pBlock && pBlock->pPartei);
  34.  
  35. if ((*pListe) == (P_BLOCK)NULL)
  36. *pListe = pBlock;
  37. else {
  38. P_BLOCK p;
  39. for (p = *pListe; p->pNext != (P_BLOCK)NULL; p = p->pNext) ;
  40. p->pNext = pBlock;
  41. }
  42. }
  43.  
  44. // pBlock wird sortiert, anzahl ist die Anzahl der Listenblocks
  45. void BubbleSortListe(P_BLOCK pBlock, int anzahl){
  46. P_BLOCK pStart = pBlock; // den Listenstartpunkt merken
  47. int i, j;
  48. for(i = 0; i < anzahl; i++) {
  49. pBlock = pStart; // zum Listenanfang zurückgehen
  50. for(j = 0; j < (anzahl - 1); j++) {
  51. if(pBlock->pStimmen < pBlock->pNext->pStimmen) {
  52. SwapBlock(pBlock, pBlock->pNext);
  53. }
  54. pBlock = pBlock->pNext;
  55. }
  56. }
  57. return;
  58. }
  59.  
  60. // Den Inhalt 2er Bocks austauschen
  61. void SwapBlock(P_BLOCK pBlock1, P_BLOCK pBlock2){
  62. P_BLOCK temp = BlockNeu(pBlock1->pPartei, pBlock1->pStimmen);
  63. pBlock1->pPartei = pBlock2->pPartei;
  64. pBlock1->pStimmen = pBlock2->pStimmen;
  65. pBlock2->pPartei = temp->pPartei;
  66. pBlock2->pStimmen = temp->pStimmen;
  67. }
  68.  
  69. // Nach einer Partei suchen
  70. P_BLOCK ListeTextSuchen(P_BLOCK pBlock, char* pText) {
  71. while (pBlock && pBlock->pPartei && strcmp (pBlock->pPartei, pText))
  72. pBlock = pBlock->pNext;
  73. return pBlock;
  74. }
  75.  
  76. // pStimmen um 1 erhöhen
  77. void BlockParteiSitzeErhöhen(P_BLOCK pBlock) {
  78. pBlock->pStimmen++;
  79. return;
  80. }
  81.  
  82. // Die Liste in der Console ausgeben
  83. void ListeAusgeben(P_BLOCK pListe) {
  84. while(pListe) {
  85. BlockAusgeben(pListe);
  86. pListe = pListe->pNext;
  87. }
  88. }
  89.  
  90. // Einen einzelnen Block ausgeben
  91. void BlockAusgeben(P_BLOCK pBlock) {
  92. assert (pBlock && pBlock->pPartei);
  93. printf ("Partei %s erhaelt %i Sitze\n", pBlock->pPartei, pBlock->pStimmen);
  94. }
  95.  
  96. // Einen Block freigeben
  97. void BlockFreigeben(P_BLOCK pBlock) {
  98. assert(pBlock && pBlock->pPartei);
  99. free(pBlock->pPartei);
  100. free(pBlock);
  101. }
  102.  
  103. int uebung7(){
  104. int menu;
  105. int i, j;
  106. // Datei Pointer
  107. FILE *file;
  108. // Zum auslesen der Datei
  109. char line[40], w1[20], w2[10];
  110. // lineare Listen
  111. P_BLOCK lParteiStimmen;
  112. P_BLOCK lErgebnis;
  113. int sitze;
  114.  
  115. puts("2. d'Hondtsches Hoechstzahlverfahrens\n");
  116. scanf_s("%i", &menu);
  117. switch(menu){
  118. case 2:
  119. file = fopen("parteistimmen.txt", "r"); // Datei öffnen
  120. if(file == NULL){
  121. printf("Datei nicht gefunden!\n");
  122. return 0;
  123. }
  124. i = -1;
  125. while(fgets(line, sizeof(line), file)){ // Solange es noch zeilen gibt in der Datei
  126. i++;
  127. if (line[0] == '/' && line[1] == '/'){ // Wenn es ein Kommentar ist, überspringen
  128. i--; // und counter um 1 runterzählen
  129. continue;
  130. }
  131. if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2){ // Falsches Format
  132. i--;
  133. continue;
  134. }
  135. // Sitze auslesen
  136. if(!i && w2){
  137. sitze = atoi(w2);
  138. continue;
  139. }
  140. else if(!i){
  141. printf("Fehler beim Auslesen der Sitze!\n");
  142. return 0;
  143. }
  144. // Partei Liste
  145. if(i == 1)
  146. lErgebnis = BlockNeu(w1, 0);
  147. else
  148. ListeHintenEinketten(&lErgebnis, BlockNeu(w1, 0));
  149. // Liste zur Berechnung erstellen
  150. for(j = 1; j <= sitze; j++){
  151. if(j == 1 && i == 1)
  152. lParteiStimmen = BlockNeu(w1, atoi(w2) / j);
  153. else
  154. ListeHintenEinketten(&lParteiStimmen, BlockNeu(w1, atoi(w2) / j));
  155. }
  156. }
  157. fclose (file); // Datei schließen
  158. BubbleSortListe(lParteiStimmen, i*(j-1)); // Liste sortieren
  159. for(i = 0; i < sitze; i++){ // Einträge von 1-sitze auswerten und den parteien die sitze zuweisen
  160. BlockParteiSitzeErhöhen(ListeTextSuchen(lErgebnis, lParteiStimmen->pPartei));
  161. lParteiStimmen = lParteiStimmen->pNext;
  162. }
  163. ListeAusgeben(lErgebnis); // Liste ausgeben
  164. break;
  165. default:
  166. return 0;
  167. }
  168. return 1;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement