202 lines
4.9 KiB
C
202 lines
4.9 KiB
C
#include<stdio.h>
|
||
#include<stdlib.h>
|
||
#include<conio.h>
|
||
#include<string.h>
|
||
#define MAX 100
|
||
#define MAX_1 100
|
||
typedef struct singer{
|
||
int num; // 序号
|
||
char name[10]; // 姓名
|
||
char xb[10]; // 性别
|
||
float aver; // 平均分
|
||
int score[MAX_1]; // 原始成绩
|
||
}SING;
|
||
void inarray(SING sing[MAX], int *pnum){
|
||
// 输入歌手信息:序号、姓名、性别
|
||
int n=0;
|
||
printf("输入歌手人数:");
|
||
scanf("%d", &n);
|
||
printf("请输入%d个歌手的信息:\n",n);
|
||
printf("序号\t姓名\t性别\n");
|
||
for(int i=0;i<n;i++){
|
||
scanf("%d%s%s",&sing[i].num,sing[i].name,sing[i].xb);
|
||
}
|
||
*pnum = n;
|
||
}
|
||
void outarrry(SING sing[MAX], int n, int n_){
|
||
// 输出歌手信息:序号、姓名、性别、平均分、原始成绩
|
||
printf("序号\t姓名\t性别\t平均分\t原始成绩\n");
|
||
for(int i=0;i<n;i++){
|
||
printf("%d\t%s\t%s\t%.2f",sing[i].num,sing[i].name,sing[i].xb,sing[i].aver);
|
||
for(int j=0;j<n_;j++){
|
||
printf("\t%d",sing[i].score[j]);
|
||
}
|
||
printf("\n");
|
||
}
|
||
}
|
||
void insert(SING sing[MAX], int *pnum){
|
||
// 新增歌手信息:序号、姓名、性别(增加到最后)
|
||
int n=*pnum;
|
||
printf("请输入第%d个歌手的信息:\n",n+1);
|
||
printf("序号\t姓名\t性别\n");
|
||
scanf("%d%s%s",&sing[n].num,sing[n].name,sing[n].xb);
|
||
*pnum=n+1;
|
||
}
|
||
void save(SING sing[MAX], int num, int num_){
|
||
// 保存数据到文件
|
||
FILE *fp;
|
||
char filename[10];
|
||
|
||
printf("请输入文件名:");
|
||
scanf("%s", filename);
|
||
|
||
// 打开文件
|
||
if((fp=fopen(filename, "w"))==NULL){
|
||
printf("无法打开该文件,可能是文件名有误!\n");
|
||
return;
|
||
}
|
||
// 写入文件
|
||
fprintf(fp, "当前共有%d个歌手,%d个评委:\n",num,num_);
|
||
fprintf(fp, "序号\t姓名\t性别\t平均分\t原始成绩\n");
|
||
for(int i=0;i<num;i++){
|
||
fprintf(fp,"%d\t%s\t%s\t%.2f",sing[i].num,sing[i].name,sing[i].xb,sing[i].aver);
|
||
for(int n=0;n<num_;n++){
|
||
fprintf(fp,"\t%d",sing[i].score[n]);
|
||
}
|
||
fprintf(fp,"\n");
|
||
}
|
||
printf("导出完成\n");
|
||
// 关闭文件
|
||
fclose(fp);
|
||
}
|
||
void load(SING sing[MAX], int *num, int *num_){
|
||
// 从文件读取数据
|
||
FILE *fp;
|
||
char filename[10],temp[10];
|
||
|
||
printf("请输入文件名:");
|
||
scanf("%s", filename);
|
||
// 打开文件
|
||
if((fp=fopen(filename, "r"))==NULL){
|
||
printf("无法打开该文件,可能是文件名有误!\n");
|
||
return;
|
||
}
|
||
// 读取数据
|
||
fscanf(fp,"当前共有%d个歌手,%d个评委:",num,num_);
|
||
// 过滤多余文本
|
||
for(int i=0;i<5;i++){
|
||
fscanf(fp,"%s",temp);
|
||
}
|
||
// 读取歌手信息
|
||
for(int i=0;i<*num;i++){
|
||
fscanf(fp,"%d%s%s%f",&sing[i].num,sing[i].name,sing[i].xb,&sing[i].aver);
|
||
for(int n=0;n<*num_;n++){
|
||
fscanf(fp,"%d",&sing[i].score[n]);
|
||
}
|
||
}
|
||
printf("读取完成。\n");
|
||
// 关闭文件
|
||
fclose(fp);
|
||
}
|
||
void aver(SING sing[MAX], int num, int num_){
|
||
int temp,data[MAX_1];
|
||
for(int k=0;k<num;k++){
|
||
memcpy(data,sing[k].score,sizeof(int)*MAX_1);
|
||
// 对分数按从小到大排序
|
||
for(int i=0;i<num_-1;i++){
|
||
for(int j=0;j<num_-1-i;j++){
|
||
if(data[j]>data[j+1]){
|
||
// 交换元素
|
||
temp=data[j];
|
||
data[j]=data[j+1];
|
||
data[j+1]=temp;
|
||
}
|
||
}
|
||
}
|
||
// 计算平均分
|
||
temp=0;
|
||
for(int j=1;j<num_-1;j++){
|
||
temp+=data[j];
|
||
}
|
||
sing[k].aver = temp / (float)(num_-2);
|
||
}
|
||
}
|
||
void mark(SING sing[MAX], int num, int *num_){
|
||
// 输入评委个数
|
||
printf("请输入评委个数:");
|
||
scanf("%d",num_);
|
||
// 逐个评分
|
||
for(int i=0;i<num;i++){
|
||
system("cls");
|
||
printf("当前正在对第 %d 个歌手进行评分:\n\n",i+1);
|
||
printf("歌手信息如下:\n");
|
||
printf("序号\t姓名\t性别\n");
|
||
printf("%d\t%s\t%s\n\n",sing[i].num,sing[i].name,sing[i].xb);
|
||
for(int n=0;n<*num_;n++){
|
||
printf("现在请第 %d 个评委进行评分(0-10分):",n+1);
|
||
scanf("%d",&sing[i].score[n]);
|
||
}
|
||
}
|
||
// 计算平均分
|
||
aver(sing,num,*num_);
|
||
printf("评分完成。\n");
|
||
}
|
||
int main(){
|
||
SING sing[MAX];
|
||
// num 为歌手数,num_ 为评委数
|
||
int num=0,num_=0;
|
||
int choice;
|
||
|
||
while(1){
|
||
// 1.菜单
|
||
printf("\t1.输入歌手信息\n"); // 已完成
|
||
printf("\t2.输出歌手信息\n"); // 已完成
|
||
printf("\t3.新增一个歌手\n"); // 已完成
|
||
printf("\t4.查找歌手信息\n");
|
||
printf("\t5.修改歌手信息\n");
|
||
printf("\t6.删除歌手信息\n");
|
||
printf("\t7.排序歌手\n");
|
||
printf("\t8.评委评分\n"); // 已完成
|
||
printf("\t9.保存歌手信息\n"); // 已完成
|
||
printf("\t10.加载歌手信息\n"); // 已完成
|
||
printf("\t0.退出\n"); // 已完成
|
||
|
||
// 2.输入
|
||
scanf("%d", &choice);
|
||
|
||
// 3.退出
|
||
if(choice==0) break;
|
||
|
||
// 4.调用子函数功能
|
||
switch (choice) {
|
||
case 1:
|
||
inarray(sing,&num);
|
||
break;
|
||
case 2:
|
||
outarrry(sing,num,num_);
|
||
break;
|
||
case 3:
|
||
insert(sing,&num);
|
||
break;
|
||
case 8:
|
||
mark(sing,num,&num_);
|
||
break;
|
||
case 9:
|
||
save(sing,num,num_);
|
||
break;
|
||
case 10:
|
||
load(sing,&num,&num_);
|
||
break;
|
||
default:
|
||
printf("调用输入错误函数\n");
|
||
break;
|
||
}
|
||
|
||
// 5.清屏
|
||
printf("按任意键继续...\n");
|
||
getch();
|
||
system("cls");
|
||
}
|
||
printf("感谢使用,再见!\n");
|
||
return 0;
|
||
} |