3条回答 默认 最新
- 技术专家团-小桥流水 2022-03-08 14:41关注
运行截图:
数据文件(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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 4无用
悬赏问题
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 AT89C51控制8位八段数码管显示时钟。
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
- ¥15 下图接收小电路,谁知道原理
- ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
- ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
- ¥15 手机接入宽带网线,如何释放宽带全部速度
- ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
- ¥15 ETLCloud 处理json多层级问题