问一下,为什么最后的查询学生成绩时,查询的成绩都是0.
该怎么改,感谢
#include <stdio.h> //头文件
#include <string.h> //处理包含字符串的头文件
//定义结构
struct list //struct 关键字 定义结构体
{
//字符类型
char name[10]; //姓名 ,最多容纳4个汉字
//定义整型变量
int chinese; //语文成绩
int math; //数学成绩
int english; //英语成绩
int c; //C语言成绩
};
void input(struct list m[], int n); //输入学生成绩的函数
void average(struct list m[], int n); //计算学科平均值的函数
void find(struct list m[], int n); //查询学生成绩的函数
int main(void)
{
struct list m[30]; //数组 最多输入30个学生
int choices,x,y; //定义 choice,x,y
//用do-while 循环 来实现数字对应功能的选择作用
do{
rerun:
printf("\n");
printf("\t 统计学生成绩系统 \n");
printf("\t \n");
printf("\t 输入学生成绩---------1 \n");
printf("\t 查看学科成绩的平均值---2 \n");
printf("\t 查询学生成绩---------3 \n");
printf("\t 退出系统-------------0 \n");
printf("\t \n");
printf("\t选择功能:");
scanf("%d", &choices);
switch(choices) //switch 常和 case 连用表示判断选择代码
{ //当choices表示的值与case 后的数字相同时,程序会执行与数字相对应的case语句
case 1:
printf("成绩输入中\n\n");
printf("\t请输入学生人数(1~30):");
scanf("%d",&y);
input(m,y);
break; //break直接终止循环
case 2:
printf("学科平均成绩计算\n\n");
average(m,y);
break;
case 3:
printf("开始查看学生成绩\n\n");
find(m, y);
break;
case 0:
printf("\t已经退出统计学生成绩系统");
break;
default : //当输入的值与所有case所带的常量不一样时,则执行default下面的语句
printf("\t输入错误");
goto rerun; //重新返回rerun循环执行语句
}
}while(choices>0&&choices<5);
return 0;
}
void input(struct list m[], int n) //定义输入函数 ,开始输入学生成绩 , 存入数组
{
int i;
for(i=0;i<n;i++) //使用for循环,可以录入多名学生的成绩
{
printf("\t输入第%d名同学的姓名:", i+1);
scanf("%s", m[i].name); //输入名字
printf("\t输入第%d名同学的语文成绩:", i+1);
scanf("%d", &m[i].chinese); //语文成绩
printf("\t输入第%d名同学的数学成绩:", i+1);
scanf("%d", &m[i].math); //数学成绩
printf("\t输入第%d名同学的英语成绩:", i+1);
scanf("%d", &m[i].english); //英语成绩
printf("\t输入第%d名同学的C语言成绩:", i+1);
scanf("%d", &m[i].c); //C语言成绩
}
printf("\t成绩已录入\n");
}
void average(struct list m[], int n) //计算学科的平均分
{
printf("\t语文\t数学\t英语\tC语言\n");
int i;
float result=0.0; //float 单精度浮点型小数类型
for(i=0;i<n;i++)
{
result+=m[i].chinese; //计算语文成绩的总和
}
printf("\t%.2f", result/n);// %.2f是float后的小数只输出两位,计算语文学科平均分
result=0;
for(i=0;i<n;i++)
{
result+=m[i].math; //计算数学成绩的总和
}
printf("\t%.2f", result/n); //计算数学这一学科的平均分
result=0;
for(i=0;i<n;i++)
{
result+=m[i].english; //计算英语成绩的总和
}
printf("\t%.2f", result/n); //计算英语这一学科的平均分
result=0;
for(i=0;i<n;i++)
{
result+=m[i].c; //计算C语言成绩的总和
}
printf("\t%.2f\n", result/n); //计算C语言成绩的平均分
}
void find(struct list m[], int n) //查询学生成绩
{
int i,trigger;
char in_name[10];
do{
printf("\t请输入要查询的学生姓名:");
scanf("%s", in_name);
int chack=0;
for(i=0;i<n;i++)
{
if(strcmp(in_name,m[i].name)==0)
{
printf("\t%s的成绩为:\n\n",m[i].name);
printf("\tC语言\t数学\t英语\t语文\n");
printf("\t%.2f\t%.2f\t%.2f\t%.2f\n\n",m[i].c,m[i].math,m[i].english,m[i].chinese);
chack=1;
}
}
if(chack==0) printf("\t*查无此人*\n\n");
printf("\t继续查询请输入1,否则输入0返回功能选择界面:");
scanf("%d", &trigger);
}while(trigger==1);
}
该回答引用ChatGPT
您的代码实现有一个问题,就是在 average() 函数中没有对每个学科进行分别求平均分。在代码中只有一个 result 变量保存了学科成绩的总和,因此在输出各个学科的平均分时会出现问题。
在 average() 函数中,应该为每个学科分别定义一个变量来保存该学科的成绩总和,并将每个学科的成绩总和除以学生数,即可得到该学科的平均分。修改后的 average() 函数如下:
void average(struct list m[], int n) {
int i;
float sum_chinese = 0.0, sum_math = 0.0, sum_english = 0.0, sum_c = 0.0;
for (i = 0; i < n; i++) {
sum_chinese += m[i].chinese;
sum_math += m[i].math;
sum_english += m[i].english;
sum_c += m[i].c;
}
printf("\t语文\t数学\t英语\tC语言\n");
printf("\t%.2f\t%.2f\t%.2f\t%.2f\n", sum_chinese/n, sum_math/n, sum_english/n, sum_c/n);
}
此外,在查询学生成绩时,您的代码中没有对姓名进行比较,因此无法找到对应的学生成绩。您需要先输入要查询的学生姓名,然后在数组中查找该学生的信息。修改后的 find() 函数如下:
void find(struct list m[], int n) {
char name[10];
int i, found = 0;
printf("请输入要查询的学生姓名:");
scanf("%s", name);
for (i = 0; i < n; i++) {
if (strcmp(name, m[i].name) == 0) {
printf("\t姓名\t语文\t数学\t英语\tC语言\n");
printf("\t%s\t%d\t%d\t%d\t%d\n", m[i].name, m[i].chinese, m[i].math, m[i].english, m[i].c);
found = 1;
break;
}
}
if (!found) {
printf("\t未找到该学生的信息\n");
}
}
这段代码存在一个问题,即在选择查询学生成绩时,调用find()函数时没有将输入的学生人数n作为参数传递给函数,因此函数内部的循环将没有可用的数据。需要在调用find()函数时将n作为参数传递进去。具体而言,在主函数中case 3下的find(m, y)应该改为find(m, n)。