年级成绩录入系统

一个简单的全年级的分数录入系统,用来统计及计算信息。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里,是为了方便把数组传递到下一个函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值