Az alábbi letöltési lehetőségek közül választhatsz: (
segítség)
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 (I = 0; I < CandNum; I++)
fscanf(IN, "%d", &BP[I]);
fscanf(IN, "\n");
V = new char * [VoteNum];
for (I = 0; I < VoteNum; I++) {
V[I] = new char [CandNum];
for (J = 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 (I = 0; I < CandNum; I++)
N[I] = 0;
for (I = 0; I < VoteNum; I++)
N[V[I][0]]++;
for (I = 0; I < CandNum; I++)
if (N[I] > Max)
Max = N[I];
for (I = 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 (I = 0; I < CandNum; I++)
N[I] = 0;
for (I = 0; I < VoteNum; I++)
N[V[I][0]]++;
for (I = 0; I < CandNum; I++)
if (N[I] > VoteNum/2) {
fprintf(OUT, "%c", I + 'a');
break;
}
if (I == CandNum) {
for (I = 0; I < CandNum; I++)
if (N[I] > Max)
Max = N[I];
X = 0;
for (I = 0; I < CandNum && X < 2; I++)
if (N[I] == Max)
W[X++] = I;
if (X == 1) {
Max = 0;
for (I = 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 (I = 0; I < VoteNum; I++)
for (J = 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 (I = 0; I < CandNum; I++)
N[I] = 0;
for (I = 0; I < CandNum; I++) {
for (J = I + 1; J < CandNum; J++) {
IN = JN = 0;
for (K = 0; K < VoteNum; K++)
for (L = 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 (I = 0; I < CandNum; I++)
N[I] = 0;
for (I = 0; I < VoteNum; I++)
for (J = 0; J < CandNum; J++)
N[V[I][J]]+= BP[J];
Max = 0;
for (I = 0; I < CandNum; I++)
if (N[I] > Max)
Max = N[I];
for (I = 0; I < CandNum; I++)
if (N[I] == Max)
fprintf(OUT, "%c", I + 'a');
fprintf(OUT, "\n");
}