C语言三diamagnetic某个班的学生,每个学生的信息包括学号、姓名、3门课成绩。从键盘输入学生的数据,要求:能够以循环菜单方式给用户提供以下功能: 1、找到每门课成绩最高的学生,打印其全部信息;2、查找平均分最高的学生打印其信息;(要求使用链表方式,用结构体数组形式不得分)
时间: 2023-08-31 20:24:18 浏览: 134
### 回答1:
可以使用链表来实现这一功能。首先,使用链表存储学生的信息,包括学号、姓名、3门课成绩。然后,使用循环菜单的方式,给用户提供以下功能:1、遍历链表,找到每门课成绩最高的学生,打印其全部信息;2、查找平均分最高的学生,打印其信息。
### 回答2:
实现该功能可以按照以下步骤进行:
1. 定义一个结构体`student`,包含学号、姓名、3门课成绩以及一个指向下一个学生节点的指针。结构体定义如下:
```
typedef struct student_s {
int id;
char name[20];
int score1;
int score2;
int score3;
struct student_s* next;
} Student;
```
2. 定义一个函数`add_student()`,用于从键盘输入学生信息并添加到链表中。该函数的伪代码如下:
```
1. 创建一个新的学生节点
2. 从键盘输入学生的学号、姓名和3门课成绩
3. 将输入的信息赋值给新的学生节点
4. 将新的学生节点插入到链表中适当的位置
```
3. 定义一个函数`find_highest_score()`,用于找到每门课程成绩最高的学生并打印其信息。该函数的伪代码如下:
```
1. 遍历链表中的每个学生节点
2. 比较每个学生节点的3门课成绩,找到最高的成绩并记录
3. 打印具有最高成绩的学生信息
```
4. 定义一个函数`find_highest_average_score()`,用于查找平均分最高的学生并打印其信息。该函数的伪代码如下:
```
1. 遍历链表中的每个学生节点
2. 计算每个学生节点的平均分,如果平均分比当前最高平均分高,更新最高平均分和对应的学生节点
3. 打印平均分最高的学生信息
```
5. 在主函数中实现循环菜单,根据用户选择调用相应的函数。
完整的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student_s {
int id;
char name[20];
int score1;
int score2;
int score3;
struct student_s* next;
} Student;
void add_student(Student** head) {
Student* new_student = (Student*)malloc(sizeof(Student));
printf("请输入学号:");
scanf("%d", &(new_student->id));
printf("请输入姓名:");
scanf("%s", new_student->name);
printf("请输入第一门课成绩:");
scanf("%d", &(new_student->score1));
printf("请输入第二门课成绩:");
scanf("%d", &(new_student->score2));
printf("请输入第三门课成绩:");
scanf("%d", &(new_student->score3));
new_student->next = *head;
*head = new_student;
}
void find_highest_score(Student* head) {
Student* current = head;
int max_score1 = -1;
int max_score2 = -1;
int max_score3 = -1;
while (current != NULL) {
if (current->score1 > max_score1) {
max_score1 = current->score1;
}
if (current->score2 > max_score2) {
max_score2 = current->score2;
}
if (current->score3 > max_score3) {
max_score3 = current->score3;
}
current = current->next;
}
current = head;
while (current != NULL) {
if (current->score1 == max_score1 || current->score2 == max_score2 || current->score3 == max_score3) {
printf("最高分学生信息:\n");
printf("学号:%d\n", current->id);
printf("姓名:%s\n", current->name);
printf("第一门课成绩:%d\n", current->score1);
printf("第二门课成绩:%d\n", current->score2);
printf("第三门课成绩:%d\n", current->score3);
}
current = current->next;
}
}
void find_highest_average_score(Student* head) {
Student* current = head;
float max_average = 0;
Student* highest_average_student = NULL;
while (current != NULL) {
float average = (current->score1 + current->score2 + current->score3) / 3.0;
if (average > max_average) {
max_average = average;
highest_average_student = current;
}
current = current->next;
}
printf("平均分最高学生信息:\n");
printf("学号:%d\n", highest_average_student->id);
printf("姓名:%s\n", highest_average_student->name);
printf("第一门课成绩:%d\n", highest_average_student->score1);
printf("第二门课成绩:%d\n", highest_average_student->score2);
printf("第三门课成绩:%d\n", highest_average_student->score3);
}
int main() {
Student* head = NULL;
int choice;
while (1) {
printf("菜单:\n");
printf("1. 添加学生\n");
printf("2. 查找每门课成绩最高的学生\n");
printf("3. 查找平均分最高的学生\n");
printf("请输入选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student(&head);
break;
case 2:
find_highest_score(head);
break;
case 3:
find_highest_average_score(head);
break;
default:
printf("请输入有效选择。\n");
break;
}
// 清空输入缓冲区
while (getchar() != '\n') {
;
}
}
return 0;
}
```
### 回答3:
为了实现上述功能,我们可以先定义一个学生结构体,包含学号、姓名、3门课成绩。然后使用链表的方式存储学生的信息,每个节点表示一个学生。
首先,我们需要实现以下几个操作:
1. 添加学生信息:从键盘输入学生的信息,创建一个新的节点,并将节点添加到链表中。
2. 找到每门课成绩最高的学生:遍历链表,找到每门课成绩最高的学生,并打印其全部信息。
3. 查找平均分最高的学生:遍历链表,计算每个学生的平均分,找到平均分最高的学生,并打印其信息。
接下来,我们可以按照以下伪代码的方式实现循环菜单功能:
```c
struct student
{
int id;
char name[20];
int scores[3];
struct student* next;
};
// 全局变量,表示链表头节点
struct student* head = NULL;
// 添加学生信息
void add_student()
{
// 从键盘输入学生信息
// 创建新的节点
struct student* new_student = (struct student*)malloc(sizeof(struct student));
// 将新节点加入链表
}
// 找到每门课成绩最高的学生
void find_highest_score()
{
// 遍历链表,找到每门课成绩最高的学生
// 打印学生信息
}
// 查找平均分最高的学生
void find_highest_avg()
{
// 遍历链表,计算每个学生的平均分
// 找到平均分最高的学生
// 打印学生信息
}
int main()
{
int choice;
while (1)
{
// 显示菜单选项
// 从键盘输入选择
switch (choice)
{
case 1:
add_student();
break;
case 2:
find_highest_score();
break;
case 3:
find_highest_avg();
break;
default:
printf("Invalid choice\n");
break;
}
}
return 0;
}
```
这样就实现了能够以循环菜单方式提供给用户功能的C语言程序。注意,在实际代码中,我们还需要加入相应的输入验证、链表节点的释放等操作。
阅读全文