用typedef、struct写出其链式存储结构的类型定义,其中“学生”为复合型数据类型,包括:学号、姓名、性别、年龄、考试科目、考试成绩。)统计考试科目的平均成绩,考试科目3门,分别是“高数”、“外语”和“物理”
时间: 2024-10-09 19:05:18 浏览: 42
在C语言中,我们可以使用`typedef`来定义一个新的类型名,并结合`struct`来创建一个复合型的数据类型。首先,我们需要定义一个名为`Student`的结构体,包含学号、姓名、性别、年龄、考试科目及其对应的分数。然后,我们可以通过`typedef`来简化这个结构体类型的名称。
```c
// 定义一个结构体,表示学生信息
typedef struct {
int student_id; // 学号
char name[50]; // 姓名
char gender; // 性别
int age; // 年龄
float exam_scores[3]; // 考试成绩,数组长度为3代表三门课程
} Student;
// 然后定义函数来计算平均成绩
float calculate_average_score(Student* students, int num_students) {
float total = 0;
for (int i = 0; i < num_students; i++) {
total += students[i].exam_scores[0] + students[i].exam_scores[1] + students[i].exam_scores[2];
}
return total / (num_students * 3); // 除以科目数乘以学生总数
}
相关问题
利用单链表实现以下功能:(1)以“学生”为数据元素的线性表 (2)用typedef、struct写出其链式存储结构的类型定义,其中“学生”为复合型数据类型,包括:学号、姓名、性别、年龄、考试科目、考试成绩。 (3)统计考试科目的平均成绩,考试科目3门,分别是“高数”、“外语”和“物理” (4)功能1:根据学号进行成绩录入(新增),删除 (5)功能2:根据学号进行成绩查询,成绩修改 (6)功能3:根据考试科目分别求总平均分、男女生平均分 (7)功能4:显示出各门成绩的最高分同学信息。其中可以用文件输入学生信
息,以下是我实现的代码,注释中有详细的解释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义“学生”数据类型
typedef struct student {
char id[20]; // 学号
char name[20]; // 姓名
char sex[5]; // 性别
int age; // 年龄
int scores[3]; // 考试成绩,下标分别对应高数、外语、物理
struct student* next; // 指向下一个学生的指针
} Student;
// 定义链表的头指针
Student* head = NULL;
// 功能1:根据学号进行成绩录入(新增),删除
void add_or_delete() {
printf("请选择操作:1.新增 2.删除\n");
int opt;
scanf("%d", &opt);
if (opt == 1) {
printf("请输入学生信息:\n");
// 创建新的学生节点
Student* new_student = (Student*)malloc(sizeof(Student));
printf("学号:");
scanf("%s", new_student->id);
printf("姓名:");
scanf("%s", new_student->name);
printf("性别:");
scanf("%s", new_student->sex);
printf("年龄:");
scanf("%d", &new_student->age);
printf("高数成绩:");
scanf("%d", &new_student->scores[0]);
printf("外语成绩:");
scanf("%d", &new_student->scores[1]);
printf("物理成绩:");
scanf("%d", &new_student->scores[2]);
// 将新节点插入链表头部
new_student->next = head;
head = new_student;
printf("新增成功!\n");
} else if (opt == 2) {
printf("请输入要删除的学号:");
char id[20];
scanf("%s", id);
Student* prev = NULL;
Student* curr = head;
while (curr != NULL) {
if (strcmp(curr->id, id) == 0) {
// 找到了要删除的节点
if (prev == NULL) {
// 要删除的节点是头节点
head = curr->next;
} else {
prev->next = curr->next;
}
free(curr);
printf("删除成功!\n");
return;
}
prev = curr;
curr = curr->next;
}
printf("没有找到要删除的学生!\n");
} else {
printf("输入有误,请重新输入!\n");
}
}
// 功能2:根据学号进行成绩查询,成绩修改
void query_or_modify() {
printf("请选择操作:1.查询 2.修改\n");
int opt;
scanf("%d", &opt);
printf("请输入要操作的学号:");
char id[20];
scanf("%s", id);
Student* curr = head;
while (curr != NULL) {
if (strcmp(curr->id, id) == 0) {
// 找到了要查询或修改的学生节点
if (opt == 1) {
// 查询
printf("学号:%s\n", curr->id);
printf("姓名:%s\n", curr->name);
printf("性别:%s\n", curr->sex);
printf("年龄:%d\n", curr->age);
printf("高数成绩:%d\n", curr->scores[0]);
printf("外语成绩:%d\n", curr->scores[1]);
printf("物理成绩:%d\n", curr->scores[2]);
return;
} else if (opt == 2) {
// 修改
printf("请输入修改后的信息:\n");
printf("姓名:");
scanf("%s", curr->name);
printf("性别:");
scanf("%s", curr->sex);
printf("年龄:");
scanf("%d", &curr->age);
printf("高数成绩:");
scanf("%d", &curr->scores[0]);
printf("外语成绩:");
scanf("%d", &curr->scores[1]);
printf("物理成绩:");
scanf("%d", &curr->scores[2]);
printf("修改成功!\n");
return;
} else {
printf("输入有误,请重新输入!\n");
return;
}
}
curr = curr->next;
}
printf("没有找到要操作的学生!\n");
}
// 功能3:根据考试科目分别求总平均分、男女生平均分
void calculate_average_scores() {
int count[3] = {0}; // 分别用来记录每门科目的学生人数
int sum[3] = {0}; // 分别用来记录每门科目的总分数
int male_count[3] = {0}; // 分别用来记录每门科目的男生人数
int female_count[3] = {0}; // 分别用来记录每门科目的女生人数
int male_sum[3] = {0}; // 分别用来记录每门科目的男生总分数
int female_sum[3] = {0}; // 分别用来记录每门科目的女生总分数
Student* curr = head;
while (curr != NULL) {
for (int i = 0; i < 3; i++) {
count[i] += 1;
sum[i] += curr->scores[i];
if (strcmp(curr->sex, "男") == 0) {
male_count[i] += 1;
male_sum[i] += curr->scores[i];
} else if (strcmp(curr->sex, "女") == 0) {
female_count[i] += 1;
female_sum[i] += curr->scores[i];
}
}
curr = curr->next;
}
printf("各门科目平均分如下:\n");
for (int i = 0; i < 3; i++) {
printf("%s平均分:%f\n", i == 0 ? "高数" : (i == 1 ? "外语" : "物理"), (float)sum[i] / count[i]);
printf("男生平均分:%f\n", (float)male_sum[i] / male_count[i]);
printf("女生平均分:%f\n", (float)female_sum[i] / female_count[i]);
}
}
// 功能4:显示出各门成绩的最高分同学信息
void show_highest_score() {
int highest_scores[3] = {0}; // 分别记录每门科目的最高分数
char highest_scores_id[3][20]; // 分别记录每门科目的最高分数对应的学号
for (int i = 0; i < 3; i++) {
highest_scores[i] = -1;
strcpy(highest_scores_id[i], "");
}
Student* curr = head;
while (curr != NULL) {
for (int i = 0; i < 3; i++) {
if (curr->scores[i] > highest_scores[i]) {
highest_scores[i] = curr->scores[i];
strcpy(highest_scores_id[i], curr->id);
}
}
curr = curr->next;
}
printf("高数最高分:%d,学号:%s\n", highest_scores[0], highest_scores_id[0]);
printf("外语最高分:%d,学号:%s\n", highest_scores[1], highest_scores_id[1]);
printf("物理最高分:%d,学号:%s\n", highest_scores[2], highest_scores_id[2]);
}
int main() {
// 从文件中读取学生信息
FILE* fp = fopen("students.txt", "r");
if (fp != NULL) {
while (!feof(fp)) {
Student* new_student = (Student*)malloc(sizeof(Student));
fscanf(fp, "%s%s%s%d%d%d", new_student->id, new_student->name, new_student->sex, &new_student->age, &new_student->scores[0], &new_student->scores[1], &new_student->scores[2]);
new_student->next = head;
head = new_student;
}
fclose(fp);
}
while (1) {
printf("请选择操作:1.新增/删除学生信息 2.查询/修改学生信息 3.计算平均分 4.显示最高分\n");
int opt;
scanf("%d", &opt);
switch (opt) {
case 1:
add_or_delete();
break;
case 2:
query_or_modify();
break;
case 3:
calculate_average_scores();
break;
case 4:
show_highest_score();
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
}
return 0;
}
```
阅读全文