A-C/1.c
2022-03-06 03:20:25 -05:00

199 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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){
// 输出歌手信息:序号、姓名、性别
printf("序号\t姓名\t性别\n");
for(int i=0;i<n;i++){
printf("%d\t%s\t%s\n",sing[i].num,sing[i].name,sing[i].xb);
}
}
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("\t11.加载歌手信息\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);
break;
case 3:
insert(sing,&num);
break;
case 8:
mark(sing,num,&num_);
break;
case 10:
save(sing,num,num_);
break;
case 11:
load(sing,&num,&num_);
break;
default:
printf("调用输入错误函数\n");
break;
}
// 5.清屏
printf("按任意键继续...\n");
getch();
system("cls");
}
printf("感谢使用,再见!\n");
return 0;
}