这个程序可以编译,但是很不对劲,好几个选项都重复循环,人数只要超过两个人就开始无限循环
#include<stdio.h>
struct score{
double chinese;
double math;
double eng;
double total;
double average;
};
struct std{
int num;
char name[20];
struct score cj;
};
void printfscore(int n,struct std s[]);
int Searchid(int xh,int n,struct std s[]);
void totalscore(int y,struct std s[]);
void mmave(int y,struct std s[]/*,struct score*/,double *MAX,double *MIN);
void printfscore(int n,struct std s[]/*,struct score*/)
{ int i;
for(i=0;i<n;i++){
printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
}
printf("显示结束");
}
int Searchid(int xh,int n,struct std s[]/*,struct score*/)
{
int i;
for (i=0;i<n;i++)
{
if (xh==s[i].num)
{
printf("num:%d\n",s[i].num);
printf("name:%s\n",s[i].name);
printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
}
return 1;
}
return 0;
}
void totalscore(int j,struct std s[]/*,struct score*/)
{ int i;
for(i=0;i<j;j++){
s[i].cj.total=s[i].cj.chinese+s[i].cj.math+s[i].cj.eng;
printf("第%d个学生的总成绩如下%lf:\n",i+1,s[i].cj.total);
}
}
void mmave(int j,struct std s[]/*,struct score*/,double *MAX,double *MIN)
{ int i;
double max=0;
double min=0;
MAX=&max;
MIN=&min;
for(i=0;i<j;j++){
s[i].cj.average=(s[i].cj.chinese+s[i].cj.math+s[i].cj.eng)/3;
printf("第%d个学生的总成绩如下%lf:\n",i+1,s[i].cj.average);
}
for(i=0;i<j;i++){
if(s[i].cj.average>=*MAX){
//*MAX=s[i].cj.average;
max=s[i].cj.average;
}
if(s[i].cj.average<=*MIN){
//*MIN=s[i].cj.average;
min=s[i].cj.average;
}
}
}
int main(){
struct std s[20];
int i=0;
int choice;
int n,j,xh;
int num_students = 0; // 记录学生数量
double MAX,MIN;
printf("**************************************\n");
printf("*********** 欢迎进入 ***********\n");
printf("*******某某小学学生信息管理系统*******\n");
printf("|------------------------------------|\n");
printf("| 1.录入学生信息 |\n");
printf("| 2.显示学生信息 |\n");
printf("| 3.查询学生信息 |\n");
printf("| 4.显示总成绩 |\n");
printf("| 5.显示平均分 |\n");
printf("| 6.显示成绩最大最小值 |\n");
printf("| 7.退出信息系统 |\n");
printf("**************************************\n");
do {
printf("请输入您的选择:");
scanf("%d",&choice);
switch (choice) {
case 1://录入学生信息
printf("请输入学生的总人数(不能超过2000人):");
scanf("%d",&n);
for (i=0;i<n;i++) {
printf("请输入第%d个学生的学号、姓名、语文、数学和英语成绩:", i+1);
scanf("%d%s%lf",&s[i].num,s[i].name,&s[i].cj.chinese,&s[i].cj.math,&s[i].cj.eng);
}
num_students=n; // 更新学生数量
printf("学生信息已成功添加!\n");
break;
case 2://显示学生信息
if (num_students==0) {
printf("没有学生信息可以显示,请选择1录入信息\n");
break;
}
printf("请输入您想查询多少人:\n");
scanf("%d",&j);
printf("学生信息如下:\n");
for (i=0;i<j;i++) {
printf("学号:%d,姓名:%s,成绩:%.2lf\n",s[i].num,s[i].name,s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
}
break;
case 3:
// 查询学生信息
printf("请输入您想查找的学生的学号:\n");
scanf("%d",&xh);
if(Searchid(xh,n,s)==1)
printf("找到了!");
else
printf("没有找到该信息,请重新输入");
break;
case 4:
//显示总成绩
printf("请输入您想查询多少人:\n");
scanf("%d",&j);
totalscore(j,s);
break;
case 5:
//显示平均分
printf("请输入您想查询多少人:\n");
scanf("%d",&j);
for(i=0;i<j;i++)
{
printf("第%d个人的平均分是%lf",i+1,s[i].cj.average);
}
break;
case 6:
// 显示平均分最大最小及对应的人
/*if (num_students==0) {
printf("没有成绩信息可以显示,请选择1录入信息\n");
break;
}
printf("以下是成绩信息:\n");
printfscore(n,s);*/
mmave(j,s/*,struct score*/,&MAX,&MIN);
printf("%s的平均分最大值是:%.2lf\n",s[i].name,MAX);
printf("%s的平均分最小值是:%.2lf\n",s[i].name,MIN);
break;
case 7:
printf("感谢使用学生信息管理系统!\n");
break;
default:
printf("无效的选择,请重新输入\n");
break;
}
} while (choice!=7);
return 0;
}
发现几处错误
int Searchid(int xh,int n,struct std s[])
{
int i;
for (i=0;i<n;i++)
{
if (xh==s[i].num)
{
printf("num:%d\n",s[i].num);
printf("name:%s\n",s[i].name);
printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
return 1;
}
}
return 0;
}
【以下回答由 GPT 生成】
问题回答:
该程序的目标是处理学生的成绩信息,并提供一些功能,如打印所有学生成绩,查找学生信息等。具体的功能包括: - printfscore
函数:打印所有学生成绩 - Searchid
函数:根据学生的学号查找并打印学生的信息 - totalscore
函数:根据学生的学号计算并打印学生的总成绩 - mmave
函数:根据学生的学号计算并打印学生成绩的最高分和最低分
printfscore
函数:打印所有学生成绩
int n
表示学生的数量,struct std s[]
表示学生结构体数组printfscore(n, s)
,其中n
为学生数量,s
为学生结构体数组Searchid
函数:根据学生的学号查找并打印学生的信息
int xh
表示要查找的学生学号,int n
表示学生的数量,struct std s[]
表示学生结构体数组Searchid(xh, n, s)
,其中xh
为要查找的学生学号,n
为学生数量,s
为学生结构体数组totalscore
函数:根据学生的学号计算并打印学生的总成绩
int y
表示要计算总成绩的学生学号,struct std s[]
表示学生结构体数组totalscore(y, s)
,其中y
为要计算总成绩的学生学号,s
为学生结构体数组mmave
函数:根据学生的学号计算并打印学生成绩的最高分和最低分
int y
表示要计算最高分和最低分的学生学号,struct std s[]
表示学生结构体数组,double *MAX
和double *MIN
为用于保存最高分和最低分的指针变量mmave(y, s, &MAX, &MIN)
,其中y
为要计算最高分和最低分的学生学号,s
为学生结构体数组,MAX
和MIN
为用于保存最高分和最低分的指针变量根据程序的描述,我们可以期望在输入人数大于两个时,能够正确地执行各个功能函数,并按照预期的方式输出结果,不会发生无限循环的问题。然而,根据提供的代码,无法直接判断问题的具体原因。可能的问题包括: - 循环中的遍历不完整导致无限循环 - 函数调用的参数或返回值的使用存在错误 - 数据结构的定义和使用存在问题 - 其他潜在的算法逻辑错误
为了进一步分析问题和解决问题,我们需要查看完整的代码实现和提供更多的上下文信息。由于提供的代码不完整,无法直接判断问题的根本原因。希望能够提供完整的代码和更多的问题描述,以便更准确地给出解决方案。
【相关推荐】