优化下列函数:struct student { int num; char name[10]; int c,oop,db; float avg; }; void input(int n,struct student hkx[]) { for(int i=1;i<n;i++) { scanf("%d%s",&hkx[i].num,hkx[i].name,&hkx[i].c,&hkx[i].oop,&hkx[i].db); hkx[i].avg = (float)(hkx[i].c+hkx[i].oop+hkx[i].db)/3; } } int output(int n,struct student hkx[]) { for(int i=0;i<n;i++) { printf("%d%s",hkx[i].num,hkx[i].name); for(int j=0;j<n;j++) { printf("%d%d%d",hkx[i].c,hkx[i].oop,hkx[i].db); } printf("%f\n",hkx[i].avg); } } int sort(int n,struct student stu[]) { struct student temp; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (hkx[i].avg < hkx[j].avg) { temp = hkx[i]; hkx[i] = hkx[j]; hkx[j] = temp; } } } } int main() { struct student hkx[100]; int n; printf("请输入要录入成绩资料的学生人数:"); scanf("%d", &n); struct student hkx[i]; input(hkx,n); // 输入学生成绩资料 sort(hkx,n); // 对结构体数组进行降序排序 output(hkx,n); // 输出每个学生的成绩资料 return 0; }
时间: 2024-04-28 20:20:24 浏览: 49
这段代码存在一些问题和可以优化的地方,以下是我的建议:
1. 在函数 input 中的 for 循环中,循环变量 i 应该从 0 开始,而不是从 1 开始。因为结构体数组 hkx 的下标是从 0 开始的,如果 i 从 1 开始,则会导致 hkx[0] 没有被赋值,可能会导致程序出错。
2. 在函数 output 中,第一个 printf 函数的输出格式缺少一个空格,应该改为:printf("%d %s ", hkx[i].num, hkx[i].name); 。
3. 在函数 output 中的第二个 for 循环中,循环变量 j 的上限应该是 3,而不是 n。因为每个学生只有三门课程的成绩,超过三门课程的成绩没有意义。
4. 在函数 sort 中,循环变量 i 应该从 0 开始,而不是从 1 开始,同样的道理,因为结构体数组 hkx 的下标是从 0 开始的。
5. 函数 sort 没有返回值,应该将其返回值类型改为 void。
6. 在函数 main 中,结构体数组 hkx 已经在声明时定义了大小为 100,不需要再在输入数据前再次定义一个大小未知的 hkx 数组。
7. 在函数 main 中,应该检查输入的 n 是否超过了 hkx 数组的大小,如果超过了,应该给出提示并结束程序。
8. 在函数 main 中,应该在最后返回一个值,比如返回 0。
改进后的代码如下:
相关问题
假如我这样写,struct student { int num; char name[10]; char gender; int c, oop, db; float avg; ,我将会scanf上面所有变量那char [10]是定义成谁的空间了?
在这个结构体中,`char name[10]`是定义成一个长度为10的字符数组,用于存储学生的姓名。当你使用`scanf`函数读入学生的姓名时,可以使用`%s`格式化字符串,并将其赋值给`name`数组,如下所示:
```c
struct student stu;
scanf("%d %s %c %d %d %d", &stu.num, stu.name, &stu.gender, &stu.c, &stu.oop, &stu.db);
```
在上面的代码中,`stu.name`表示结构体中的姓名数组,`%s`格式化字符串用于读入字符串类型的数据。
struct Student { char id[10];//学生学号 char name[NAME_LEN];//姓名 int scores[MAX_COURSE_NUM];//各科分数 int total_score;//总分 float avg_score;//平均分 }; void input_record(struct Student students[], int num);//录入每个学生的学号、姓名和各科考试成绩 请用c语言补充函数
好的,以下是 `input_record` 函数的一个示例实现:
```c
void input_record(struct Student students[], int num) {
for (int i = 0; i < num; i++) {
printf("请输入第%d个学生的学号:", i + 1);
scanf("%s", students[i].id);
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", students[i].name);
for (int j = 0; j < MAX_COURSE_NUM; j++) {
printf("请输入第%d个学生的第%d门课程成绩:", i + 1, j + 1);
scanf("%d", &students[i].scores[j]);
students[i].total_score += students[i].scores[j]; // 累加总分
}
students[i].avg_score = students[i].total_score / MAX_COURSE_NUM; // 计算平均分
}
}
```
这个函数中,我们使用了一个 `for` 循环来循环录入每个学生的信息。对于每一个学生,我们依次使用 `scanf` 函数来录入其学号、姓名和各科成绩,并将这些信息存储到对应的结构体成员变量中。同时,我们使用一个内层的 `for` 循环来循环录入每个学生的各门课程成绩,并在循环中累加每个学生的总分。最后,我们计算每个学生的平均分,并将其存储到对应的结构体成员变量中。
需要注意的是,在实际编写中,我们还需要处理一些错误情况,比如输入的学号或成绩不合法等等,这些情况的处理方式可能会因具体需求而不同。
阅读全文