source: research/2008-displacement/vote.c @ 2285

Last change on this file since 2285 was 2284, checked in by Sam Hocevar, 15 years ago
  • Added a small Condorcet voting program.
File size: 2.1 KB
Line 
1/* Quick voting software.
2 * Usage:
3 *   vote <file1> <file2> ...
4 * File format:
5 *   <key1> <value1>
6 *   <key1> <value1>
7 */
8
9#include <stdio.h>
10#include <string.h>
11#include <stdlib.h>
12
13#define MAXLEN 20
14#define MAXITEMS 2000
15
16static char *items[MAXITEMS];
17static int nitems;
18
19static int *matrix;
20
21static int lookup(char const *str)
22{
23    int i;
24
25    for(i = 0; i < nitems; i++)
26        if(!strcmp(str, items[i]))
27            return i;
28
29    return -1;
30}
31
32static int record(char const *str)
33{
34    int n = lookup(str);
35
36    if(n >= 0)
37        return n;
38
39    items[nitems] = strdup(str);
40    return nitems++;
41}
42
43static void recordfile(char const *file)
44{
45    char buf[MAXLEN];
46    FILE *f;
47    float val;
48
49    f = fopen(file, "r");
50    if(!f)
51        return;
52    while(!feof(f))
53    {
54        fscanf(f, "%s %g", buf, &val);
55        record(buf);
56    }
57    fclose(f);
58}
59
60static void readfile(char const *file)
61{
62    float values[MAXITEMS];
63    char buf[MAXLEN];
64    FILE *f;
65    float val;
66    int n, i, j;
67
68    f = fopen(file, "r");
69    if(!f)
70        return;
71    while(!feof(f))
72    {
73        fscanf(f, "%s %g", buf, &val);
74        n = lookup(buf);
75        values[n] = val;
76    }
77    fclose(f);
78
79    for(j = 0; j < nitems; j++)
80        for(i = j + 1; i < nitems; i++)
81            if(values[i] < values[j])
82                matrix[j * nitems + i]++;
83            else if(values[i] > values[j])
84                matrix[i * nitems + j]++;
85}
86
87static void solvematrix(void)
88{
89    int wins[MAXITEMS];
90    int i, j;
91
92    memset(wins, 0, MAXITEMS * sizeof(int));
93
94    for(j = 0; j < nitems; j++)
95        for(i = j + 1; i < nitems; i++)
96        {
97            if(matrix[j * nitems + i] > matrix[i * nitems + j])
98                wins[i]++;
99            else
100                wins[j]++;
101        }
102
103    for(i = 0; i < nitems; i++)
104        printf("%s (%i): %i wins\n", items[i], i, wins[i]);
105}
106
107int main(int argc, char *argv[])
108{
109    int i;
110
111    for(i = 1; i < argc; i++)
112        recordfile(argv[i]);
113
114    matrix = malloc(nitems * nitems * sizeof(int));
115    memset(matrix, 0, nitems * nitems * sizeof(int));
116
117    for(i = 1; i < argc; i++)
118        readfile(argv[i]);
119
120    solvematrix();
121
122    return 0;
123}
124
Note: See TracBrowser for help on using the repository browser.