计算机三级数据库C语言编程题

现有一个10个候选人进行选举,现有一个100条记录的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推 :内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票选中人数小于等于5个人时则被认为是无效的选票。给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。把结果yy输出到文件OUT.DAT中。
void CountRS(void)
{
int i,j;
int cnt;
for(i=o;i<10;i++)
yy[i]=0;
for(i=o;i<100;i++)
{
cnt=o;
for(j=o;j<10;j++)
if(xx[i][j]=='1')
cnt++;
if(cnt>5)
{
for(j=0;j<10;j++)
if(xx[i][j]=='1')
yy[j]++;
}
}
}
请大家帮忙解释一下啊

第1个回答  2008-03-03
完整正确程序:
#include <stdio.h>
#include <stdlib.h>
FILE *fin, *fout;
char xx[100][11];
int n = 100;
int yy[10];

void ReadDat();
void CountRs();

void main(void)
{
char namein[]="in.dat",nameout[]="out.dat";
int i;

fin = fopen(namein,"r");
(void) ReadDat();
fclose(fin);
(void) CountRs();

fout = fopen(nameout,"w");
for (i=0;i<10;i++) fprintf(fout, "%d\n",yy[i]);
fclose(fout);
printf("\007Output in %s\n",nameout);
exit(0);
}

void ReadDat(){
int i;
for (i=0;i<100;i++){
fscanf(fin,"%10s",&xx[i][0]);
};
}

void CountRs(){
int e[10];
int i,j;
int sum;
for (i=0;i<10;i++) yy[i]=0;

for (j=0;j<100;j++){
sum = 0;
for (i=0;i<10;i++) {
sscanf(&xx[j][i],"%1d",&e[i]);
sum = sum + e[i];
};
if (sum > 5){
for (i=0;i<10;i++){
yy[i] = yy[i] + e[i];
};
};
};
}
=======================
for(i=o;i<10;i++) yy[i]=0; 累加器,存每人得票数,初始化为0.
for(i=0;i<100;i++)
{
cnt=0; // 用于判断单张票是否选满5人的累加器,初始化为0
for(j=0;j<10;j++)
if(xx[i][j]=='1') cnt++; // 单张票10个侯选人选了几人
if(cnt>5) // 单张票选多于5人则做
{
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++; //第i张票,第j人被选(为1),则给第j人的得票累加器加1(yy[j]++);
}
第2个回答  2008-03-02
void CountRS(void)
{
int i,j;
int cnt;
for(i=0;i<10;i++) /*这个循环用于初始化数组,以免后面的yy[i]++;操作出现错误值*/
yy[i]=0;
for(i=0;i<100;i++)
{
cnt=0;/*用于统计每位参选人的得票数,每次对下一位参选人统计之前要归0*/
for(j=0;j<10;j++)
if(xx[i][j]=='1')/*xx[i]是代表不同的选票,下面的xx[i][j]则是不同的选民的投票结果,如果xx[i][j]为1则cnt++;*/
cnt++;
if(cnt>5)/*如果得票数大于5,则计算该候选人的得票数,并保存到对应的yy[i]中*/
{
for(j=0;j<10;j++)
if(xx[i][j]=='1')
yy[j]++;/*个人感觉这里应该是yy[i],代表第i号候选人,不理解这里为什么是j*/
}
}
}
第3个回答  2008-03-05
这样写吧!
比你写那个简便多了。运算也要快些。
#include <stdio.h>
#include <stdlib.h>
FILE *fin, *fout;
char xx[100][11];
int n = 100;
int yy[10];

void ReadDat();
void CountRs();

void main(void)
{
char namein[]="in.dat",nameout[]="out.dat";
int i;

fin = fopen(namein,"r");
(void) ReadDat();
fclose(fin);
(void) CountRs();

fout = fopen(nameout,"w");
for (i=0;i<10;i++) fprintf(fout, "%d\n",yy[i]);
fclose(fout);
printf("\007Output in %s\n",nameout);
exit(0);
}

void ReadDat(){
int i;
for (i=0;i<100;i++){
fscanf(fin,"%10s",&xx[i][0]);
};
}

void CountRs(){
int e[10];
int i,j;
int sum;
for (i=0;i<10;i++) yy[i]=0;

for (j=0;j<100;j++){
sum = 0;
for (i=0;i<10;i++) {
sscanf(&xx[j][i],"%1d",&e[i]);
sum = sum + e[i];
};
if (sum > 5){
for (i=0;i<10;i++){
yy[i] = yy[i] + e[i];
};
};
};
}
=======================
for(i=o;i<10;i++) yy[i]=0; 累加器,存每人得票数,初始化为0.
for(i=0;i<100;i++)
{
cnt=0; // 用于判断单张票是否选满5人的累加器,初始化为0
for(j=0;j<10;j++)
if(xx[i][j]=='1') cnt++; // 单张票10个侯选人选了几人
if(cnt>5) // 单张票选多于5人则做
{
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++; //第i张票,第j人被选(为1),则给第j人的得票累加器加1(yy[j]++);
}
第4个回答  2008-03-02
你少了文件操作
int tmp=0,yy[10]={0,0,0,0,0,0,0,0,0,0};
FILE *fp;
fp=fopen("in.dat","rb+");
for(i=0;i<=9;i++)
{for(j=0;j<=9;j++)
{
tmp=fgetc();
if(tmp=="1")yy[j]++;
}
}
fclose(fp);
fp=fopen("out.dat","w");
for(i=0;i<10;i++)
{
fprintf(fp,"%d\t",yy[i]);
}
fclose(fp);
第5个回答  2008-03-02
挺好的,好像没问题,把几个o改成0就可以了
输出是
int i;
FILE *fp;
fp=fopen("OUT.DAT","w");
for(i=0;i<10;i++){
fprintf(fp,"%d\t",yy[i]);
fclose(fp);本回答被提问者采纳
相似回答
大家正在搜