2014-09-04 20 views
0

我必须阅读名称和数字的文本文件。名称代表虚拟选举中的候选人(共7人),数字代表选民。如果选民号码不在7个候选人的范围内,它将被抛出,但仍然存储。最后,我必须列出谁赢得了选举的结果以及那里有多少被宠坏的选票。什么时候应该使用scanf的地址'&'和号键?

这是我的文本文件:

Robert Bloom 
John Brown 
Michelle Dawn 
Michael Hall 
Sean O’Rielly 
Arthur Smith 
Carl White 

3 8 1 3 1 6 12 9 6 5 0 2 8 4 
6 6 8 3 2 8 0 12 6 1 8 3 2 2 
3 2 5 7 4 11 8 6 11 12 11 7 5 5 
8 9 10 12 1 3 12 12 9 11 7 9 3 1 
2 10 12 7 11 9 6 6 0 1 10 7 11 2 
8 0 12 8 10 11 2 2 8 4 2 12 3 2 
9 1 4 8 8 7 7 4 12 2 10 10 9 4 
12 9 3 12 0 4 8 0 6 5 9 0 5 3 
11 6 0 3 0 

这是我在哪里卡住了有关如何在扫描这些正确

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

FILE * data; 
int spoilt=0; 

typedef struct 
{ 
int votes; 
char name[20]; 
}candidates; 

void initialize(candidates *electionCandidates, FILE *data) 
{ 
    int i; 
    for(i=0; i<7; i++) 
    { 
     fscanf(data, "%[^\n]%*c", electionCandidates[i].name); 
     printf("%s\n", electionCandidates[i].name); 
     electionCandidates[i].votes=0; 
    } 

} 

int processVotes(candidates *electionCandidates, FILE *data) 
{ 
    int i;           //tallying votes 
    int voter; 
    for (i = 0; i< 365; i++) 
    { 
     fscanf(data, "%d", voter); 
     if (voter <= 7&& voter > 0) 
     electionCandidates[voter-1].votes++; 
     else 
     spoilt++; 
    } 

                //catcher to grab winner 
    int maxValue, winner=0; 

    maxValue = electionCandidates[0].votes; 
    for(i = 0; i < 7; i++) 
    { 
     if(maxValue < electionCandidates[i].votes) 
     { 
      maxValue = electionCandidates[i].votes; 
      electionCandidates[winner] = electionCandidates[i]; 
     } 

    } 

    return electionCandidates[winner], maxValue; 


} 

void printResults(candidates *electionCandidates) 
{ 
    printf("%s won the election with a total of %d votes.\n There was a total of %d spoilt" 
      electionCandidates[winner].name, maxValue, spoilt); 

} 


int main() { 
    data = fopen("elections.txt","r"); 
    candidates electionCandidates[7]; 

    initialize(electionCandidates, data); 
    processVotes(electionCandidates, data); 
    printResults(electionCandidates); 


    fclose(data); 
    return 0; 
} 
+2

它甚至编译?你在做什么这个'返回选举候选人[赢家],maxValue;'??你想要返回2个值吗? – Arpit 2014-09-04 23:22:25

+0

这是我想我即将搞砸的地方。我试图找到选举的赢家并返回结构数组中的位置的值 – Acehilm 2014-09-04 23:23:35

+1

只需返回获胜者的索引。用这个,你可以直接访问数组的名字和票数 – Arpit 2014-09-04 23:26:58

回答

1

使用scanf,你必须提供的的地址您想要将结果扫描到的变量。通过使用&运营商提供地址。此外,检查scanf的结果以确保它成功扫描了您要求的内容是个不错的主意。 scanf将始终返回成功扫描的元素数量,除非发生I/O错误,在这种情况下,它将返回负数。

这是你的程序的固定,注释版本:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

typedef struct 
{ 
int votes; 
char name[20]; 
}candidates; 

// specify a new type to hold the election result data 
typedef struct 
{ 
    int winner; 
    int maxVotes; 
    int spoilt; 
} electionResult; 

void initialize(candidates *electionCandidates, FILE *data) 
{ 
    int i; 
    for(i=0; i<7; i++) 
    { 
     fscanf(data, "%[^\n]%*c", electionCandidates[i].name); 
     printf("%s\n", electionCandidates[i].name); 
     electionCandidates[i].votes=0; 
    } 

} 

// This function can now return more than one value, because we've wrapped 
// the relevant info into a structure called "electionResult" 
electionResult processVotes(candidates *electionCandidates, FILE *data) 
{ 
    // declare the election result struct here (which we fill with data) 
    // we initially set all values to 0 

    electionResult er = {0, 0, 0}; 
    int i;           //tallying votes 
    int voter; 
    for (i = 0; i< 365; i++) 
    { 
     // scan the vote by providing the address of voter (using &) 
     int result = fscanf(data, "%d", &voter); 
     if (result == 1) 
     { 
      if (voter <= 7&& voter > 0) 
      electionCandidates[voter-1].votes++; 
      else 
      er.spoilt++; 
     } 
    } 

    er.maxVotes = electionCandidates[0].votes; 
    for(i = 0; i < 7; i++) 
    { 
     if(er.maxVotes < electionCandidates[i].votes) 
     { 
      // update the values in the election result struct 
      er.maxVotes = electionCandidates[i].votes; 
      er.winner = i; 
     } 
    } 

    return er; 
} 

// this function now prints the result of the election by accepting an "electionResult" struct 
void printResults(candidates *electionCandidates, electionResult er) 
{ 
    printf("%s won the election with a total of %d votes.\n There was a total of %d spoilt", 
      electionCandidates[er.winner].name, er.maxVotes, er.spoilt); 

} 


int main() { 
    FILE *data = fopen("elections.txt","r"); 
    candidates electionCandidates[7]; 
    electionResult er; 

    initialize(electionCandidates, data); 
    er = processVotes(electionCandidates, data); 
    printResults(electionCandidates, er); 


    fclose(data); 
    return 0; 
} 

一些提示:

  • 您不能访问其他功能声明的变量。您必须从一个函数中返回所需的数据并将其提供给另一个函数。

  • 避免在文件范围声明变量(如果可以的话)。对于这样简单的程序来说,这并不是什么大问题,但总的来说,使用全局变量往往会变得非常麻烦。

  • ,除非你在一个结构包裹起来的值不能从一个函数返回多个值,就像上面,或者,你已经接受函数指针将保存结果的对象,类似于fscanf接受&voter并随后用适当的数据填充voter变量(如果可以的话)。

+0

即使我尝试使用像这样的getwhile循环,我无法得到这个在Dev C++中编译: getchar(); return 0; } – Acehilm 2014-09-05 01:46:33

+0

@ user3498869:你得到了什么错误? – dreamlax 2014-09-05 02:10:00

+0

桌面\ mikehomework \ Makefile.win [生成错误] [theElection.o]错误1 – Acehilm 2014-09-05 02:45:27

相关问题