C语言作业——歌手比赛系统

题目

歌手比赛系统

功能:

对一次歌手比赛的成绩进行管理,功能要求:
1、输入每个选手的数据包括编号、姓 名、十个评委的成绩,根据输入计算出总成绩和平均成绩(去掉最高分,去掉最低分)。
2、显示主菜单如下:1)输入选手数据2)评委打分3)成绩排序(按平均 分) 4)数据查询5) 追加选手数据6)写入数据文件7)退出系统。

结果图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实现代码

#include <stdio.h>
#include <string.h>
#include <conio.h> 
#include <stdlib.h>

struct Data
{
	char num[20];//编号
	char name[20];//姓名
	float playerScore[10];//十个评委的成绩 
	float sumScore;//总成绩
	float aveScore;//平均成绩 
}data;

void getContext()// 输入选手数据
{
	printf("请输入选手数据:(编号 姓名 )\n");
	printf("按999结束\n");
	getchar();
	while(1)
	{
		gets(data.num);
		if(strcmp(data.num,"999") == 0)//相等返回0 
		{
			break;
		}
		gets(data.name);
			
	    FILE *p = fopen("xinxi.txt", "a+");	
	    if(p == NULL)
	    {
	        printf("open error!\n");
	    }   
		fputs(data.num,p);
		fputs("\t",p);
		fputs(data.name,p);
		fputs("\n",p);
				
	    fclose(p);		
	}
}

void teachScore()//评委打分
{
    FILE *p1 = fopen("xinxi.txt","r");
    FILE *p2 = fopen("tmp.txt","w");
	if(p1 == NULL)	
    {
        printf("read error!\n");
    }
	if(p2 == NULL)	
    {
        printf("open error!\n");
    }
    char buf[999]; //定义缓冲区,用于暂时存储数据 
	while(fgets(buf, 100, p1) != NULL)
	{
		sscanf(buf,"%s%s", &data.num,&data.name);
		printf("请十位老师输入编号为%s的同学的成绩:\n",data.num);
		float sum = 0; 
		float min = 999, max = 0;
		
		for(int k = 0; k < 10; k++)
		{
			scanf("%f",&data.playerScore[k]);
			if(min > data.playerScore[k])
			{
				min = data.playerScore[k];
			}
			if(max < data.playerScore[k])
			{
				max = data.playerScore[k];
			}
			sum += data.playerScore[k];
		}
		data.sumScore = sum;
		int sum1 = 0;
		for(int t = 0; t < 10; t++)
		{
			if(data.playerScore[t] != max && data.playerScore[t] != min)
			{
				sum1 += data.playerScore[t];
			}
		}
		data.aveScore = sum1/8;
		fputs(data.num,p2);
		fputs("\t",p2); 
		fputs(data.name,p2);
		fputs("\t",p2); 
		for(int k = 0; k < 10; k++)
		{
			fprintf(p2, "%.2f", data.playerScore[k]);
			fputs("\t",p2); 	
		}
		fprintf(p2, "%.2f", data.sumScore);
		fputs("\t",p2); 
		fprintf(p2, "%.2f", data.aveScore);
		fputs("\n",p2);
	}
	fclose(p1);
	fclose(p2);
	remove("xinxi.txt");
	rename("tmp.txt","xinxi.txt");
}

void scoreSeque()//成绩排序(按平均分)
{
	printf("编号\t姓名\t\t\t\t\t十位评委的成绩\t\t\t\t\t总成绩\t平均成绩\n") ;
	Data data2[999];
    FILE *p1 = fopen("xinxi.txt","r");
	if(p1 == NULL)	
    {
        printf("read error!\n");
    }
    int i = 0;
	while(!feof(p1))
	{
		fscanf(p1,"%s%s%f%f%f%f%f%f%f%f%f%f%f%f", &data2[i].num, &data2[i].name, &data2[i].playerScore[0], &data2[i].playerScore[1], &data2[i].playerScore[2], &data2[i].playerScore[3], &data2[i].playerScore[4], &data2[i].playerScore[5], &data2[i].playerScore[6], &data2[i].playerScore[7], &data2[i].playerScore[8], &data2[i].playerScore[9], &data2[i].sumScore, &data2[i].aveScore);
		i++;
	}
	i--;
	for(int n = 0; n < i-1; n++)
	{
		for(int m = 0; m < i-n-1; m++)
		{
			if(data2[m].aveScore > data2[m+1].aveScore)
			{
				float tmp = data2[m].aveScore;
				data2[m].aveScore = data2[m+1].aveScore;
				data2[m+1].aveScore = tmp;
			}
		}
	}

    FILE *p2 = fopen("tmp.txt","w");
	if(p2 == NULL)	
    {
        printf("open error!\n");
    }
    for(int n = 0; n < i; n++)
    {
		fputs(data2[n].num,p2);
		fputs("\t",p2); 
		fputs(data2[n].name,p2);  
		fputs("\t",p2); 
		printf("%s\t%s\t",data2[n].num,data2[n].name);
		for(int k = 0; k < 10; k++)
		{
			fprintf(p2, "%.2f", data2[n].playerScore[k]); 
			printf("%.2f\t", data2[n].playerScore[k]);
			fputs("\t",p2); 
		}  	
		fprintf(p2, "%.2f", data2[n].sumScore);
		fputs("\t",p2); 
		fprintf(p2, "%.2f", data2[n].aveScore);
		fputs("\n",p2);
		printf("%.2f\t%.2f\n",data2[n].sumScore,data2[n].aveScore);
	}
	fclose(p1);
	fclose(p2);
	remove("xinxi.txt");
	rename("tmp.txt","xinxi.txt");
}

void findData()//数据查询
{
	printf("请输入要查询的学生的编号:\n");
	char my_num[20];
	getchar();
	gets(my_num);
	 
    FILE *p1 = fopen("xinxi.txt","r");
	if(p1 == NULL)	
    {
        printf("read error!\n");
    }
	while(!feof(p1))
	{
		fscanf(p1,"%s%s%f%f%f%f%f%f%f%f%f%f%f%f", &data.num, &data.name, &data.playerScore[0], &data.playerScore[1], &data.playerScore[2], &data.playerScore[3], &data.playerScore[4], &data.playerScore[5], &data.playerScore[6], &data.playerScore[7], &data.playerScore[8], &data.playerScore[9], &data.sumScore, &data.aveScore);

		if(strcmp(data.num, my_num) == 0)//找到了 
		{
			printf("%s\t%s\t",data.num,data.name);	
			for(int j = 0; j < 10; j++)
			{
				printf("%.2f\t", data.playerScore[j]);
			}
			printf("%.2f\t%.2f", data.sumScore, data.aveScore);
			break;
		}
	}
	fclose(p1);
}

void addData()//追加选手数据
{
	printf("请输入要追加的选手数据:(编号 姓名 )\n");

	printf("按888结束\n");
	getchar();
	while(1)
	{
		gets(data.num);
		if(strcmp(data.num,"888") == 0)//相等返回0 
		{
			break;
		}
		gets(data.name);
			
	    FILE *p = fopen("xinxi.txt", "a+");	
	    if(p == NULL)
	    {
	        printf("open error!\n");
	    }   
		fputs(data.num,p);
		fputs("\t",p);
		fputs(data.name,p);
		fputs("\n",p);
				
	    fclose(p);		
	}
}

void fileSever()//写入数据文件
{
	printf("已存档\n"); 
}
	
void exitSys()//退出系统
{
	exit(0);
}
 
void Display()//菜单界面
{
	int choice = 0; 
	printf("\t\t========歌手比赛系统=======\t\t\n\n");
	printf("\t\t1、输入选手数据\t\t\n\n");
	printf("\t\t2、评委打分\t\t\n\n");
	printf("\t\t3、成绩排序(按平均分)\t\t\n\n");
	printf("\t\t4、数据查询\t\t\n\n");
	printf("\t\t5、追加选手数据\t\t\n\n");
	printf("\t\t6、写入数据文件\t\t\n\n");
	printf("\t\t7、退出系统\t\t\n\n");
	scanf("%d", &choice);
	switch(choice)
	{
		case 1:
			{
				getContext();// 输入选手数据
				break; 
			}
		case 2:
			{
				teachScore();//评委打分
				break;
			}
		case 3:
			{
				scoreSeque();//成绩排序(按平均分)
				break;
			}
		case 4:
			{
				findData();//数据查询
				break;
			}
		case 5:
			{
				addData();//追加选手数据
				break;
			}
		case 6:
			{
				fileSever();//写入数据文件
				break;
			}
		case 7:
			{
				exitSys();//退出系统
				break;
			}
	}
} 

int main()
{
	Display(); 
	return 0;
}

感悟

题目有些地方不太明白,例如输入数据和写入数据文件为什么要分开来,怎么实现分开

评论 22 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

hongguoya

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值