Informatika gyűjtemény

Egy szinttel feljebb valasztas.cpp

2004050607080910

NézetNyomtat

valasztas.cpp (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 3 KB
#include <stdio.h>

#define IFile "new07i.txt"
#define OFile "new07o.txt"

#define MaxCand 20

char ** V;
FILE * OUT;
int BP[MaxCand];
int VoteNum, CandNum;

void Start (void);
void End (void);
void Relative (void);
void Absolute (void);
void Condorcet (void);
void Borda (void);

int main (void) {
    Start();
    Relative();
    Absolute();
    Condorcet();
    Borda();
    End();
    return 0;
}

void Start (void) {
    int I, J;
    FILE * IN;

    IN = fopen(IFile, "rt");
    if (IN == NULL) {
        printf("Error with file %s.\n", IFile);
        return;
    }
    fscanf(IN, "%d %d\n", &VoteNum, &CandNum);
    for (= 0; I < CandNum; I++)
        fscanf(IN, "%d", &BP[I]);
    fscanf(IN, "\n");
    V = new char * [VoteNum];
    for (= 0; I < VoteNum; I++) {
        V[I] = new char [CandNum];
        for (= 0; J < CandNum; J++) {
            fscanf(IN, "%c", &V[I][J]);
            V[I][J]-= 97;
        }
        fscanf(IN, "\n");
    }
    fclose(IN);
    OUT = fopen(OFile, "wt");
}
void End (void) {
    fclose(OUT);
    for (int I = 0; I < VoteNum; I++)
        delete [] V[I];
    delete [] V;
}
void Relative (void) {
    int I, Max = 0, N[MaxCand];

    fprintf(OUT, "R: ");
    for (= 0; I < CandNum; I++)
        N[I] = 0;
    for (= 0; I < VoteNum; I++)
        N[V[I][0]]++;
    for (= 0; I < CandNum; I++)
        if (N[I] > Max)
            Max = N[I];
    for (= 0; I < CandNum; I++)
        if (N[I] == Max)
            fprintf(OUT, "%c", I + 'a');
    fprintf(OUT, "\n");
}
void Absolute (void) {
    int I, J, X, Max = 0, N[MaxCand], W[2];

    fprintf(OUT, "A: ");
    for (= 0; I < CandNum; I++)
        N[I] = 0;
    for (= 0; I < VoteNum; I++)
        N[V[I][0]]++;
    for (= 0; I < CandNum; I++)
        if (N[I] > VoteNum/2) {
            fprintf(OUT, "%c", I + 'a');
            break;
        }
    if (== CandNum) {
        for (= 0; I < CandNum; I++)
            if (N[I] > Max)
                Max = N[I];
        X = 0;
        for (= 0; I < CandNum && X < 2; I++)
            if (N[I] == Max)
                W[X++] = I;
        if (== 1) {
            Max = 0;
            for (= 0; I < CandNum; I++)
                if (N[I] > Max && I != W[0]) {
                    Max = N[I];
                    W[1] = I;
                }
        }
        N[W[0]] = 0;
        N[W[1]] = 0;
        for (= 0; I < VoteNum; I++)
            for (= 0; J < CandNum; J++) {
                if (V[I][J] == W[0] || V[I][J] == W[1]) {
                    N[V[I][J]]++;
                    break;
                }
            }
        if (N[W[0]] >= N[W[1]])
            fprintf(OUT, "%c", W[0] + 'a');
        if (N[W[1]] >= N[W[0]])
            fprintf(OUT, "%c", W[1] + 'a');
    }
    fprintf(OUT, "\n");
}
void Condorcet (void) {
    int I, J, K, L, Max, N[MaxCand], IN, JN;

    fprintf(OUT, "C: ");
    for (= 0; I < CandNum; I++)
        N[I] = 0;
    for (= 0; I < CandNum; I++) {
        for (= I + 1; J < CandNum; J++) {
            IN = JN = 0;
            for (= 0; K < VoteNum; K++)
                for (= 0; L < CandNum; L++) {
                    if (V[K][L] == I) {
                        IN++;
                        break;
                    }
                    if (V[K][L] == J) {
                        JN++;
                        break;
                    }
                }
            if (IN > JN)
                N[I]++;
            else
                N[J]++;
        }
        if (N[I] == CandNum - 1)
            fprintf(OUT, "%c", I + 'a');
    }
    fprintf(OUT, "\n");
}
void Borda (void) {
    int I, J, Max, N[MaxCand];

    fprintf(OUT, "B: ");
    for (= 0; I < CandNum; I++)
        N[I] = 0;
    for (= 0; I < VoteNum; I++)
        for (= 0; J < CandNum; J++)
            N[V[I][J]]+= BP[J];
    Max = 0;
    for (= 0; I < CandNum; I++)
        if (N[I] > Max)
            Max = N[I];
    for (= 0; I < CandNum; I++)
        if (N[I] == Max)
            fprintf(OUT, "%c", I + 'a');
    fprintf(OUT, "\n");
}
(Vissza)