#include <stdio.h>
#include <stdlib.h>
void readfile();
void sortnum();
void tongji();
/*定义结构体*/
struct people
{
int a;//序号
int b;//账号
int c;//福的种类
int n;//福的总数
}st[21];
struct people sp[15];//用于存储统计之后的结果
int k=0;//记录统计之后的人数
void main()
{
printf("从文件中读取的结果是:");
readfile(st);
printf("最终的统计结果是:\n");
tongji(st,sp);
printf("从小到大的排序结果为:\n");
sortnum(sp);
}
//读入文件
void readfile(struct people s[])
{
FILE *fp;
int i;
if((fp=fopen("wufu.txt","r"))==NULL)
printf("文件无法打开!\n");
for(i=0;i<21;i++)
{ fscanf(fp,"%d,%d,%d",&s[i].a,&s[i].b,&s[i].c);
}
fclose(fp);
for(i=0;i<21;i++)
{ printf("%d\t%d\t%d\n",s[i].a,s[i].b,s[i].c);
}
}
//统计每个人各得几个福
void tongji(struct people s[],struct people s1[])
{
int i,j,d,y,m=0;
for(i=0;i<21;i++)
{
s[i].n=0;
for(j=0;j<21;j++)
{
if(s[i].b==s[j].b)
s[i].n++;
}
if(k==0)
{
s1[k]=s[i];
k++;
}
else
{
y=0;
for(d=0;d<k;d++)//判断是否已经存在该账号
{
if(s1[d].b==s[i].b)
y=1;
}
if(y!=1)//表明无重复的账号
{
s1[k]=s[i];
k++;
}
}
}
for(i=0;i<k;i++)
printf("%d\t%d\n",s1[i].b,s1[i].n);
printf("集满五福的用户有:\n");
for(i=0;i<k+1;i++)
{
if(s1[i].n==5)
printf("%d\n",s1[i].b);
}
}
//冒泡排序
void sortnum(struct people s1[])
{
int i,j;
struct people temp;
for(i=0;i<k-1;i++)
{
for(j=0;j<k-1-i;j++)
{
if(s1[j].n>s1[j+1].n)
{
temp=s1[j];
s1[j]=s1[j+1];
s1[j+1]=temp;
}
}
}
for(i=0;i<k;i++)
printf("%d\t%d\n",s1[i].b,s1[i].n);
}
这个作业,比较复杂的点就是统计账号收集多少张福字,需要用到循环嵌套,用于统计每个账号出现了几次,然后把统计好的账号存到另一个数组里,在存入的过程中,还需要判断用于存放新信息的数组是否之前已经存过该账号的信息,如果没有就存入,有就不存。其他的都比较简单。
注意:1.需要读入的文件是否放入到项目文件里。
2.文件中数据的格式是什么,这决定你用fscanf读入文件时的格式。
3.每个功能以模块的形式实现。
运行结果: