一个简单的全年级的分数录入系统,用来统计及计算信息。C语言。仅录入哦,不支持修改等其他功能。
关键词: 嵌套的链表,指针,结构体
适合于初学者。
- 功能介绍
输入: 可设定班级个数及班级大小(每个班人数相同)。可录入名字及三科成绩
输出: 输出登记的信息列表。并计算得出全年级的最高分、最低分和平均分
关键词:
- 代码
//一个全年级分数录入系统。
//输入: 可设定班级个数及班级大小(每个班人数相同)。可录入名字及三科成绩
//输出: 输出登记的信息列表。并计算得出全年级的最高分、最低分和平均分
//关键词: 嵌套双层链表,指针,结构体
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义学生节点。用来存储个人的信息
typedef struct student {
char stuName[20];
int yuwen;
int shuxue;
int yingyu;
int Score;
struct student *next;
} Student_, *P_Student;
//定义班级节点。用来存储代表的地址(指针)
typedef struct class
{
struct student *P_student_represent; //每个班级节点,存储的是一个"学生代表"(领头的学生)。
struct class *next;
} Class_, *P_Class;
//定义规模大小
int numOfstudent1 = 0; //1处用到计算,可不备份
int numOfClass1 = 0; //2处用到计算,作备份
int studentsNumOfGrade = 0; //此数值可修改
//创建班级链表。手动输入一个班级所有学生的信息,然后把一个班的学生用头插法串在一起;
//函数: 返回一个指向学生的指针。这个学生正好是一个班级的领头
P_Student creatClass ()
{
P_Student new_one_student; //新节点的指针
P_Student First_student = NULL;
int numOfstudent = numOfstudent1;
while (numOfstudent--) {
new_one_student = (P_Student) malloc (sizeof (Student_) ); //指针指向一个可以存储学生节点的空间
memset (new_one_student->stuName, '\0', 20); //清空一下内容避免错误
printf ("此班%d号 输入名字\n", numOfstudent + 1);
scanf ("%s", new_one_student->stuName); //名字
printf ("名字为: %s \n", new_one_student->stuName);
printf ("输入语文成绩\n");
scanf ("%d", &new_one_student->yuwen); //语文
printf ("输入数学成绩\n");
scanf ("%d", &new_one_student->shuxue); //数学
printf ("输入英语成绩\n");
scanf ("%d", &new_one_student->yingyu); //英语
new_one_student->Score = (new_one_student->yuwen + new_one_student->shuxue + new_one_student->yingyu); //计算得出总分并记录
new_one_student->next = First_student; //尾巴指向上一个创建的。第一次创建的前一个为NULL
First_student = new_one_student; //头指针重新指向最新创建的一个
}
return First_student;
}
//创建年级链表。把各个班级的代表们从数组中提取,然后用头插法串在一起;
//函数: 返回一个指向“学生代表”的指针。这个“学生代表”正好是一个年级的领头
P_Class creatGrade (P_Class Grade_head, struct student* all_represent[])
{
int numOfClass = numOfClass1;
P_Class new_Class_represent;
while (numOfClass--) {
new_Class_represent = (P_Class) malloc (sizeof (Class_) );
new_Class_represent->P_student_represent = all_represent[numOfClass]; //因为数组从0开始,所以数字正好对应
new_Class_represent->next = Grade_head;
Grade_head = new_Class_represent;
}
return Grade_head;
}
void printScore (P_Class Grade_head)
{
P_Class p1 = (P_Class) malloc (sizeof (Class_) );
p1 = Grade_head;
P_Student p2 = (P_Student) malloc (sizeof (Student_) );
p2 = Grade_head->P_student_represent;
int Class_num = 1;
while (p1 != NULL) { //遍历行
printf (" %d 班成绩: \n", Class_num);
p2 = p1->P_student_represent; //备份
while (p1->P_student_represent != NULL) { //遍历列
printf ("N0.%d %s 语文=%d ", studentsNumOfGrade + 1, p1->P_student_represent->stuName, p1->P_student_represent->yuwen);
printf ("数学=%d ", p1->P_student_represent->shuxue);
printf ("英语=%d ", p1->P_student_represent->yingyu);
printf ("个人总分=%d\n", p1->P_student_represent->Score);
p1->P_student_represent = p1->P_student_represent->next;
studentsNumOfGrade++; //全局变量。用来统计全年级人数
}
p1->P_student_represent = p2; //还原
printf ("\n");
Class_num++;
p1 = p1->next;
}
}
P_Class calcScore (P_Class Grade_head)
{
P_Class p1 = (P_Class) malloc (sizeof (Class_) );
p1 = Grade_head;
P_Student p2 = (P_Student) malloc (sizeof (Student_) );
p2 = Grade_head->P_student_represent;
int Max_totalGrade = 0;
int Min_totalGrade = 0;
float Average_totalGrade;
int SumForGrade = 0;
Max_totalGrade = p1->P_student_represent->Score;
Min_totalGrade = p1->P_student_represent->Score;
while (p1 != NULL) {
p2 = p1->P_student_represent;
while (p1->P_student_represent != NULL) {
if (p1->P_student_represent->Score > Max_totalGrade) {
Max_totalGrade = p1->P_student_represent->Score;
} else if (p1->P_student_represent->Score < Min_totalGrade) {
Min_totalGrade = p1->P_student_represent->Score;
}
SumForGrade = (SumForGrade + p1->P_student_represent->Score);
p1->P_student_represent = p1->P_student_represent->next;
}
p1->P_student_represent = p2;
p1 = p1->next;
}
Average_totalGrade = (float) SumForGrade / studentsNumOfGrade;
printf ("Grade Max_totalGrade = %d \n", Max_totalGrade);
printf ("Grade Min_totalGrade = %d \n", Min_totalGrade);
printf ("Grade Average_totalGrade = %f \n", Average_totalGrade);
}
int main()
{
printf ("请输入有几个班级,以及一个班级有几个学生。如,5 5\n"); //自定义规模
scanf ("%d %d", &numOfClass1, &numOfstudent1);
printf ("好的,%d个班级,每班%d个学生\n", numOfClass1, numOfstudent1);
printf ("接下来开始录入成绩\n");
struct student* All_represent[numOfClass1]; //用来存储各班的代表学生
int numOfClass = numOfClass1;
//创建所有班级,每个班级的代表都记录在数组里。
while (numOfClass--) {
printf ("==============================\n");
printf ("\n现在是%d班,请输入此班所有学生分数\n", numOfClass + 1); //step
All_represent[numOfClass] = creatClass();
printf ("==============================\n");
}
P_Class Grade_head = NULL;
Grade_head = creatGrade (Grade_head, All_represent);
printScore (Grade_head);
calcScore (Grade_head);
return 0;
}
个人心得闲谈:
在ubuntu下编译测试的。
对于变量的命名: 起初命名不太好,自己看的都费劲。后来改善了一下。也不管是不是驼峰还是linux风格,至少是增进了理解。
对于班级规模的设定: 一开始是没这个功能的。是写死的,如固定5个班5个人。后来发现代码重复量高。一时间想不出怎么抽出来。后来才想到的可以用数组。对于个别代码为什么卸载main里,是为了方便把数组传递到下一个函数。