기음
#include <stdio.h>
#define NCANDIDATES 4
static const char * const cand_list[NCANDIDATES] = {
"Alberto Arbusto",
"Juan Perez",
"Mickey Mouse",
"Jorge Sangre"
};
#define BUFFER_SIZE 100
int
main(int argc, char **argv)
{
int votes[NCANDIDATES];
int candidate;
size_t name_start;
int i;
int j;
int place;
int max;
size_t bytes;
char buffer[BUFFER_SIZE];
/*
Make sure input is read in text mode, so we don't have to
worry about whether line endings are LF or CRLF.
*/
freopen(NULL, "rt", stdin);
/* Initialize vote tally. */
for (candidate = 0; candidate < NCANDIDATES; candidate++) {
votes[candidate] = 0;
}
/* Read and process vote file. */
do {
/* Read a block of data. */
bytes = fread(buffer, 1, BUFFER_SIZE, stdin);
/* Loop over the data, finding and counting the votes. */
name_start = 0;
for (i = 0; i < bytes; i++) {
if (buffer[i] == '\n') {
/* Found name. */
buffer[i] = '\0'; // nul-terminate name so strcmp will work
/* Look up candidate. */
for (j = 0; j < NCANDIDATES; j++) {
if (strcmp(&buffer[name_start], cand_list[j]) == 0) {
candidate = j;
break;
}
}
/* Count vote. */
++votes[candidate];
/* Next name starts at next character */
name_start = i + 1;
}
}
} while (bytes > 0);
/* Output the candidates, in decreasing order of votes. */
for (place = 0; place < NCANDIDATES; place++) {
max = -1;
for (j = 0; j < NCANDIDATES; j++) {
if (votes[j] > max) {
candidate = j;
max = votes[j];
}
}
printf("%8d %s\n", votes[candidate], cand_list[candidate]);
votes[candidate] = -1; // Remove from consideration for next place.
}
return 0;
}
호르헤 상 그르에게 유리하다.
무작위로 생성 된 투표 파일을 테스트 할 때 Alberto Arbusto가 실제 투표의 1.4 % 이상을 받더라도 (Jorge Sangre의 48.3 % vs. 47.2 %) 내 남자 Jorge Sangre가 일반적으로 이깁니다.
고정 크기 블록에서 데이터를 읽으면 종종 두 블록에 선이 분할됩니다. 첫 번째 블록 끝에있는 줄 조각은 줄 바꿈 문자가 없으므로 계산되지 않습니다. 두 번째 블록의 조각은 투표를 생성하지만 후보자의 이름과 일치하지 않으므로 '후보'변수가 업데이트되지 않습니다. 이는 이름이 나뉘어 진 후보자에서 이전 투표를받은 후보자에게 투표권을 이전시키는 효과가 있습니다. 더 긴 이름은 여러 블록으로 나뉘어 질 가능성이 높기 때문에 Alberto Arbusto는 Jorge Sangre보다 더 자주 "공여국"으로 표결됩니다.