我必须在带有姓名和号码的文本文件中阅读。这些名字代表虚拟选举中的候选人(共7人),数字代表选民。如果选民号码不在7个候选人的范围内,它将被抛出但仍然存储。最后,我必须打印出谁赢得大选的结果以及有多少被破坏的选票。
这是我的文字档案:
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;
}
答案 0 :(得分:1)
使用scanf
时,您必须提供要将结果扫描到的变量的地址。使用&
运算符提供地址。此外,最好检查scanf
的结果,以确保它成功扫描了您要求的内容。除非发生I / O错误,否则scanf
将始终返回成功扫描的元素数,在这种情况下,它将返回负数。
这是一个固定的,带注释的程序版本:
#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
变量(如果可以的话)。