用线性表实现有若干学生数据(学生数小于50),每个学生数据包含学号(每个学生学号是唯一的,但学生记录不一定按学号顺序存放)、姓名、班号和若干门课程成绩(每个学生所选课程数目可能不等,但最多不超过6门),输出每门课程的平均分和每个学生的平均分
时间: 2023-05-29 07:07:17 浏览: 102
编制一个程序,要求输入5个学生的学号、2门课的成绩,然后输出每个学生的学号、2门课成绩、平均成绩。
3星 · 编辑精心推荐
伪代码如下:
定义一个结构体Student,包含学号、姓名、班号和课程成绩数组
定义一个线性表List,存储所有学生数据
对于每门课程:
定义一个变量sum和num,分别表示总分和选课人数
遍历List,统计该门课程的总分和选课人数
计算平均分并输出
对于每个学生:
定义一个变量sum和num,分别表示总分和选课门数
遍历该学生的课程成绩数组,统计总分和选课门数
计算平均分并输出
具体实现见下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_COURSE_NUM 6
#define MAX_STUDENT_NUM 50
typedef struct {
char id[20]; // 学号
char name[20]; // 姓名
char class_id[10]; // 班号
int scores[MAX_COURSE_NUM]; // 课程成绩数组
int course_num; // 选课门数
} Student;
typedef struct {
Student students[MAX_STUDENT_NUM]; // 学生数组
int len; // 线性表长度
} List;
void init(List *list) {
list->len = 0;
}
int find(List *list, char *id) {
int i;
for (i = 0; i < list->len; i++) {
if (strcmp(list->students[i].id, id) == 0) {
return i;
}
}
return -1;
}
void add(List *list, Student student) {
list->students[list->len++] = student;
}
void input(Student *student) {
printf("请输入学号:");
scanf("%s", student->id);
printf("请输入姓名:");
scanf("%s", student->name);
printf("请输入班号:");
scanf("%s", student->class_id);
printf("请输入选课门数:");
scanf("%d", &student->course_num);
int i;
printf("请输入%d门课程成绩:", student->course_num);
for (i = 0; i < student->course_num; i++) {
scanf("%d", &student->scores[i]);
}
}
void output(Student student) {
printf("%s %s %s ", student.id, student.name, student.class_id);
int i;
for (i = 0; i < student.course_num; i++) {
printf("%d ", student.scores[i]);
}
printf("\n");
}
void course_avg(List *list) {
int i, j, sum, num;
for (i = 0; i < MAX_COURSE_NUM; i++) {
sum = 0;
num = 0;
for (j = 0; j < list->len; j++) {
if (i < list->students[j].course_num) {
sum += list->students[j].scores[i];
num++;
}
}
if (num > 0) {
printf("第%d门课程平均分为:%.2f\n", i + 1, (double)sum / num);
}
}
}
void student_avg(List *list) {
int i, j, sum, num;
for (i = 0; i < list->len; i++) {
sum = 0;
num = 0;
for (j = 0; j < list->students[i].course_num; j++) {
sum += list->students[i].scores[j];
num++;
}
printf("%s的平均分为:%.2f\n", list->students[i].name, (double)sum / num);
}
}
int main() {
List list;
init(&list);
int n;
printf("请输入学生数:");
scanf("%d", &n);
int i;
Student student;
for (i = 0; i < n; i++) {
input(&student);
add(&list, student);
}
course_avg(&list);
student_avg(&list);
return 0;
}
```
阅读全文