运行截图:
数据文件(data.txt):
Thunder 109:113 Rocket
Westbrook,38,21,9,9,4
Geogre,38,28,14,2,4
Test1,40,22,1,2,1
Test2,30,10,2,3,3
代码:
#include <stdio.h>
//定义球员信息结构体
typedef struct _stdata
{
char name[30];
int time; //上场时间
int score;//得分
int panc; //篮板
int ass; //助攻
int qd; //抢断
float eff;//效率
}StData;
//定义球队得分结构体,保存文件的第一行数据
typedef struct _stTotaldata
{
char name[30]; //球队名称
int score;//得分
}StTotalData;
//解析第一行数据
void ParseFirstLine(char* buf,StTotalData total[])
{
int i=0,j=0;
//读取第一家球队名称
//过滤空格
while(buf[i]==' ')
i++;
while(buf[i]<'0' || buf[i]>'9')//非数字字符
{
total[0].name[j] = buf[i];
j++;
i++;
}
total[0].name[j] = 0;
//删除末尾的空格或制表符
j--;
while(j>=0)
{
if(total[0].name[j]==' '||total[0].name[j]=='\t')
{
total[0].name[j] = 0;
j--;
}
else
break;
}
//读取分数
total[0].score = 0;
while(buf[i]>='0'&&buf[i]<='9')
{
total[0].score = total[0].score*10+buf[i]-'0';
i++;
}
//过滤第二只球队分数前的内容
while(buf[i]<'0' || buf[i]>'9')
i++;
//读取第二只球队的分数
total[1].score = 0;
while(buf[i]>='0'&&buf[i]<='9')
{
total[1].score = total[1].score*10+buf[i]-'0';
i++;
}
//过滤第二只球队的名称前面的字符
while(buf[i]==' ' || buf[i]=='\t')
i++;
//读取第二只球队的名称
j=0;
while(buf[i]!='\0')
{
total[1].name[j] = buf[i];
j++;
i++;
}
total[1].name[j]= 0;
//删除末尾多余的空格或者\t
j--;
while(j>=0)
{
if(total[1].name[j]==' ' || total[1].name[j]=='\t')
{
total[1].name[j] = 0;
j--;
}else
break;
}
}
//读取数据
void readFile(const char* filename,StTotalData total[],StData data[],int* nmb)
{
int i=0,res=0,j;
char buf[100],ch;
FILE* fp = fopen(filename,"r");
if(fp==0)
{
printf("文件打开错误\n");
return ;
}
//读取文件
fgets(buf,100,fp); //读取第一行
ParseFirstLine(buf,total);
//读取球员数据,数据之间用英文逗号分隔
while(!feof(fp))
{
//读取名字
j=0;
//过滤回车符
while (!feof(fp))
{
ch = fgetc(fp);
if(ch =='\n' || ch=='\r')
continue;
else
break;
}
data[i].name[j]=ch;
j++;
while( (!feof(fp)) && (data[i].name[j]=fgetc(fp)) != ',')
j++;
data[i].name[j]=0;
if(feof(fp)) break;
//读取整数
res = fscanf(fp,"%d,%d,%d,%d,%d",&data[i].time,
&data[i].score,&data[i].panc,&data[i].ass,&data[i].qd);
if(res && data[i].score > 0)
{
//计算球员的效率
data[i].eff = 1.0*(data[i].score + data[i].panc*2 + data[i].ass*2+data[i].qd*5)/data[i].time;
i++;
}
}
fclose(fp);
*nmb = i;
}
//得分榜
void ScoreRank(StData data[],int nmb)
{
StData t;
int i,j;
for (i=0;i<nmb-1;i++)
{
for (j=0;j<nmb-i-1;j++)
{
if(data[j].score < data[j+1].score)
{
t = data[j];
data[j] = data[j+1];
data[j+1] = t;
}
}
}
//输出
printf("得分榜:\n");
for (i=0;i<nmb;i++)
{
printf("%s %d\n",data[i].name,data[i].score);
}
}
//助攻榜
void AssRank(StData data[],int nmb)
{
StData t;
int i,j;
for (i=0;i<nmb-1;i++)
{
for (j=0;j<nmb-i-1;j++)
{
if(data[j].ass < data[j+1].ass)
{
t = data[j];
data[j] = data[j+1];
data[j+1] = t;
}
}
}
//输出
printf("助攻榜:\n");
for (i=0;i<nmb;i++)
{
printf("%s %d\n",data[i].name,data[i].ass);
}
}
//抢断榜单
void QdRank(StData data[],int nmb)
{
StData t;
int i,j;
for (i=0;i<nmb-1;i++)
{
for (j=0;j<nmb-i-1;j++)
{
if(data[j].qd < data[j+1].qd)
{
t = data[j];
data[j] = data[j+1];
data[j+1] = t;
}
}
}
//输出
printf("抢断榜:\n");
for (i=0;i<nmb;i++)
{
printf("%s %d\n",data[i].name,data[i].qd);
}
}
//查看球员效率
void ShowEff(StData data[],int nmb)
{
int i=0;
printf("球员效率:\n");
for (;i<nmb;i++)
{
printf("%s %.2f\n",data[i].name,data[i].eff);
}
}
int main()
{
char* filename="data.txt";
StTotalData total[2];
StData data[100];
int nmb=0,op;
//从文件中读取数据
readFile(filename,total,data,&nmb);
//
while(1)
{
printf("1.查看得分榜\n");
printf("2.查看助攻榜\n");
printf("3.查看抢断榜\n");
printf("4.查看球员效率\n");
printf("5.退出\n");
printf("请选择:");
scanf("%d",&op);
switch(op)
{
case 1:
ScoreRank(data,nmb); break;
case 2:
AssRank(data,nmb); break;
case 3:
QdRank(data,nmb); break;
case 4:
ShowEff(data,nmb); break;
case 5:
return 0;
}
}
return 0;
}
有意思的作业
用fopen打开文件,逐行读取。定义一个球员数据结构和结构数组。然后按规则计算效率,定义三个排序函数按指定项排序就可以了