#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(suppress : 4996)
const int N = 10010;//结构体数组最大容量
const int LEN = 50;//名字最大长度
typedef struct
{
char name[LEN];//名字
int snumber;//编号
double avecore;//平均分
}singerinf;
singerinf singers[N];//结构体数组,每一个元素都是一个singerinf类型
int cnt = 0;//记录数组用到哪个位置
void menu()
{
printf("====================================\n");
printf("1.歌手信息录入\n");
printf("2.排序并查看所有歌手信息\n");
printf("3.歌手查询\n");
printf("4.读取数据\n");
printf("5.保存数据\n");
printf("6.退出\n");
printf("====================================\n");
}
void insingerinf()
{
singerinf singer;
printf("请输入名字\n");
scanf_s("%s", singer.name);
printf("请输入歌手编号\n");
scanf_s("%d", &singer.snumber);
printf("请输入十个评委的分数\n");
double core = 0, sum = 0, k;
for (k = 1; k <= 10; k++)
{
printf("第%.0lf位评委的评分为:\n", k);
scanf_s("%lf", &core);
sum += core;
}
singer.avecore = sum / 10.00;
singers[cnt++] = singer;
int idx1 = cnt - 1;
printf("-------------------录入成功!-------------------\n");
printf("歌手姓名:%s\n", singers[idx1].name);
printf("歌手编号:%d\n", singers[idx1].snumber);
printf("歌手均分:%.2lf\n", singers[idx1].avecore);
//printf("cnt = %d\n",cnt);
printf("------------------------------------------------\n");
}
void sortcheck(singerinf q[], int l, int r)//按平均分快速排序
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[(l + r) / 2].avecore;
while (i < j)
{
do i++; while (q[i].avecore < x);
do j--; while (q[j].avecore > x);
if (i < j)
{
singerinf t = q[i];
q[i] = q[j];
q[j] = t;
}
}
sortcheck(q, l, j);
sortcheck(q, j + 1, r);
}
void check()
{
for (int i = 0; i < cnt; i++)
{
printf("-------------------------------\n");
printf("歌手姓名:%s\n", singers[i].name);
printf("歌手编号:%d\n", singers[i].snumber);
printf("歌手均分:%.2lf\n", singers[i].avecore);
printf("-------------------------------\n");
}
printf("排序已完成!\n");
}
void inffind()
{
printf("---------------------------------\n");
printf("请输入查询姓名:");
char fname[LEN];
scanf_s("%s", fname);
for (int i = 0; i < cnt; i++)
{
if (!strcmp(fname, singers[i].name))
{
printf("歌手姓名%s\n", singers[i].name);
printf("歌手编号%d\n", singers[i].snumber);
printf("歌手均分%.2lf\n", singers[i].avecore);
break;
}
}
printf("---------------------------------\n");
}
void savedata()
{
FILE* fp = NULL;
fp = fopen("data.txt", "wb");
//写入
for (int i = 0; i < cnt; i++)
{
fwrite(&singers[i], sizeof(singerinf), 1, fp);
}
fclose(fp);
}
void readdata()
{
FILE* fp = NULL;
fp = fopen("data.txt", "rb");
//读出
int i = 0;
while (!feof(fp))
{
fread(&singers[i], sizeof(singerinf), 1, fp);
//printf("name = %s\n",singers[i].name);
//printf(" i = %d\n",i);
i++;
}
i--;
cnt = i;
fclose(fp);
printf("读取成功!\n");
}
int main()
{
menu();
int op;
while (1)
{
scanf_s("%d", &op);
if (op == 1)
{
system("cls");
insingerinf();
menu();
}
else if (op == 2)
{
system("cls");
sortcheck(singers, 0, cnt - 1);
check();
menu();
}
else if (op == 3)
{
system("cls");
inffind();
menu();
}
else if (op == 4)
{
system("cls");
readdata();
menu();
}
else if (op == 5)
{
system("cls");
savedata();
menu();
}
else if (op == 6)
{
break;
}
else printf("intput errpr!!\n");
}
return 0;
}
注意scanf_s输出字符串时的格式
我只是在vs上运行调试了一下代码问题,细节请自己关注
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(suppress : 4996)
const int N = 10010;//结构体数组最大容量
const int LEN = 50;//名字最大长度
typedef struct
{
char name[LEN];//名字
int snumber;//编号
double avecore;//平均分
}singerinf;
singerinf singers[N];//结构体数组,每一个元素都是一个singerinf类型
int cnt = 0;//记录数组用到哪个位置
void menu()
{
printf("====================================\n");
printf("1.歌手信息录入\n");
printf("2.排序并查看所有歌手信息\n");
printf("3.歌手查询\n");
printf("4.读取数据\n");
printf("5.保存数据\n");
printf("6.退出\n");
printf("====================================\n");
}
void insingerinf()
{
singerinf singer;
printf("请输入名字\n");
scanf_s("%s", singer.name, LEN);
printf("请输入歌手编号\n");
scanf_s("%d", &singer.snumber);
printf("请输入十个评委的分数\n");
double core = 0, sum = 0, k;
for (k = 1; k <= 10; k++)
{
printf("第%.0lf位评委的评分为:\n", k);
scanf_s("%lf", &core);
sum += core;
}
singer.avecore = sum / 10.00;
singers[cnt++] = singer;
int idx1 = cnt - 1;
printf("-------------------录入成功!-------------------\n");
printf("歌手姓名:%s\n", singers[idx1].name);
printf("歌手编号:%d\n", singers[idx1].snumber);
printf("歌手均分:%.2lf\n", singers[idx1].avecore);
//printf("cnt = %d\n",cnt);
printf("------------------------------------------------\n");
}
void sortcheck(singerinf q[], int l, int r)//按平均分快速排序
{
if (l >= r) return;
int i = l - 1, j = r + 1;
double x = q[(l + r) / 2].avecore;
while (i < j)
{
do i++; while (q[i].avecore < x);
do j--; while (q[j].avecore > x);
if (i < j)
{
singerinf t = q[i];
q[i] = q[j];
q[j] = t;
}
}
sortcheck(q, l, j);
sortcheck(q, j + 1, r);
}
void check()
{
for (int i = 0; i < cnt; i++)
{
printf("-------------------------------\n");
printf("歌手姓名:%s\n", singers[i].name);
printf("歌手编号:%d\n", singers[i].snumber);
printf("歌手均分:%.2lf\n", singers[i].avecore);
printf("-------------------------------\n");
}
printf("排序已完成!\n");
}
void inffind()
{
printf("---------------------------------\n");
printf("请输入查询姓名:");
char fname[LEN] = {0};
scanf_s("%s", fname, LEN);
for (int i = 0; i < cnt; i++)
{
if (!strcmp(fname, singers[i].name))
{
printf("歌手姓名%s\n", singers[i].name);
printf("歌手编号%d\n", singers[i].snumber);
printf("歌手均分%.2lf\n", singers[i].avecore);
break;
}
}
printf("---------------------------------\n");
}
void savedata()
{
FILE* fp = NULL;
// fp = fopen("data.txt", "wb");
if (fopen_s(&fp, "data.txt", "wb") != 0)
{
return;
}
//写入
for (int i = 0; i < cnt; i++)
{
fwrite(&singers[i], sizeof(singerinf), 1, fp);
}
fclose(fp);
}
void readdata()
{
FILE* fp = NULL;
if (fopen_s(&fp, "data.txt", "rb") != 0)
{
return;
}
//读出
int i = 0;
while (!feof(fp))
{
fread(&singers[i], sizeof(singerinf), 1, fp);
//printf("name = %s\n",singers[i].name);
//printf(" i = %d\n",i);
i++;
}
i--;
cnt = i;
fclose(fp);
printf("读取成功!\n");
}
int main()
{
menu();
int op;
while (1)
{
scanf_s("%d", &op);
if (op == 1)
{
system("cls");
insingerinf();
menu();
}
else if (op == 2)
{
system("cls");
sortcheck(singers, 0, cnt - 1);
check();
menu();
}
else if (op == 3)
{
system("cls");
inffind();
menu();
}
else if (op == 4)
{
system("cls");
readdata();
menu();
}
else if (op == 5)
{
system("cls");
savedata();
menu();
}
else if (op == 6)
{
break;
}
else printf("intput errpr!!\n");
}
return 0;
}