Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #include "main.h"
- // Neuen Block anlegen
- // pText: Partei
- // pZahl: Stimmen
- P_BLOCK BlockNeu(char *pText, int pZahl) {
- P_BLOCK pBlock;
- assert(pText);
- pBlock = (P_BLOCK) malloc(sizeof(T_BLOCK));
- if (pBlock == (P_BLOCK)NULL)
- return (P_BLOCK)NULL;
- else {
- size_t ObjektLaenge = strlen(pText)+1;
- pBlock->pNext = (P_BLOCK)NULL;
- pBlock->pPartei = (char *)malloc(ObjektLaenge);
- if (pBlock->pPartei == (char *)NULL) {
- free(pBlock);
- return ((P_BLOCK)NULL);
- }
- memcpy(pBlock->pPartei, pText, ObjektLaenge);
- pBlock->pStimmen = pZahl;
- return (pBlock);
- }
- }
- // pBlock wird an die Liste *pListe hinten angehängt
- void ListeHintenEinketten(P_BLOCK *pListe, P_BLOCK pBlock) {
- assert (pBlock && pBlock->pPartei);
- if ((*pListe) == (P_BLOCK)NULL)
- *pListe = pBlock;
- else {
- P_BLOCK p;
- for (p = *pListe; p->pNext != (P_BLOCK)NULL; p = p->pNext) ;
- p->pNext = pBlock;
- }
- }
- // pBlock wird sortiert, anzahl ist die Anzahl der Listenblocks
- void BubbleSortListe(P_BLOCK pBlock, int anzahl){
- P_BLOCK pStart = pBlock; // den Listenstartpunkt merken
- int i, j;
- for(i = 0; i < anzahl; i++) {
- pBlock = pStart; // zum Listenanfang zurückgehen
- for(j = 0; j < (anzahl - 1); j++) {
- if(pBlock->pStimmen < pBlock->pNext->pStimmen) {
- SwapBlock(pBlock, pBlock->pNext);
- }
- pBlock = pBlock->pNext;
- }
- }
- return;
- }
- // Den Inhalt 2er Bocks austauschen
- void SwapBlock(P_BLOCK pBlock1, P_BLOCK pBlock2){
- P_BLOCK temp = BlockNeu(pBlock1->pPartei, pBlock1->pStimmen);
- pBlock1->pPartei = pBlock2->pPartei;
- pBlock1->pStimmen = pBlock2->pStimmen;
- pBlock2->pPartei = temp->pPartei;
- pBlock2->pStimmen = temp->pStimmen;
- }
- // Nach einer Partei suchen
- P_BLOCK ListeTextSuchen(P_BLOCK pBlock, char* pText) {
- while (pBlock && pBlock->pPartei && strcmp (pBlock->pPartei, pText))
- pBlock = pBlock->pNext;
- return pBlock;
- }
- // pStimmen um 1 erhöhen
- void BlockParteiSitzeErhöhen(P_BLOCK pBlock) {
- pBlock->pStimmen++;
- return;
- }
- // Die Liste in der Console ausgeben
- void ListeAusgeben(P_BLOCK pListe) {
- while(pListe) {
- BlockAusgeben(pListe);
- pListe = pListe->pNext;
- }
- }
- // Einen einzelnen Block ausgeben
- void BlockAusgeben(P_BLOCK pBlock) {
- assert (pBlock && pBlock->pPartei);
- printf ("Partei %s erhaelt %i Sitze\n", pBlock->pPartei, pBlock->pStimmen);
- }
- // Einen Block freigeben
- void BlockFreigeben(P_BLOCK pBlock) {
- assert(pBlock && pBlock->pPartei);
- free(pBlock->pPartei);
- free(pBlock);
- }
- int uebung7(){
- int menu;
- int i, j;
- // Datei Pointer
- FILE *file;
- // Zum auslesen der Datei
- char line[40], w1[20], w2[10];
- // lineare Listen
- P_BLOCK lParteiStimmen;
- P_BLOCK lErgebnis;
- int sitze;
- puts("2. d'Hondtsches Hoechstzahlverfahrens\n");
- scanf_s("%i", &menu);
- switch(menu){
- case 2:
- file = fopen("parteistimmen.txt", "r"); // Datei öffnen
- if(file == NULL){
- printf("Datei nicht gefunden!\n");
- return 0;
- }
- i = -1;
- while(fgets(line, sizeof(line), file)){ // Solange es noch zeilen gibt in der Datei
- i++;
- if (line[0] == '/' && line[1] == '/'){ // Wenn es ein Kommentar ist, überspringen
- i--; // und counter um 1 runterzählen
- continue;
- }
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2){ // Falsches Format
- i--;
- continue;
- }
- // Sitze auslesen
- if(!i && w2){
- sitze = atoi(w2);
- continue;
- }
- else if(!i){
- printf("Fehler beim Auslesen der Sitze!\n");
- return 0;
- }
- // Partei Liste
- if(i == 1)
- lErgebnis = BlockNeu(w1, 0);
- else
- ListeHintenEinketten(&lErgebnis, BlockNeu(w1, 0));
- // Liste zur Berechnung erstellen
- for(j = 1; j <= sitze; j++){
- if(j == 1 && i == 1)
- lParteiStimmen = BlockNeu(w1, atoi(w2) / j);
- else
- ListeHintenEinketten(&lParteiStimmen, BlockNeu(w1, atoi(w2) / j));
- }
- }
- fclose (file); // Datei schließen
- BubbleSortListe(lParteiStimmen, i*(j-1)); // Liste sortieren
- for(i = 0; i < sitze; i++){ // Einträge von 1-sitze auswerten und den parteien die sitze zuweisen
- BlockParteiSitzeErhöhen(ListeTextSuchen(lErgebnis, lParteiStimmen->pPartei));
- lParteiStimmen = lParteiStimmen->pNext;
- }
- ListeAusgeben(lErgebnis); // Liste ausgeben
- break;
- default:
- return 0;
- }
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement