890行。设计最强最全学生成绩管理系统(C语言大作业)(文后附解析说明的博客)

        上周太忙,拖更了一期博客,这里先给大家赔个不是哈...

        

        并再说明一下,大学进入期末月啦,笔者得专心复习,所以这个月更完这两期就不更了,等放寒假以后再和大家分享。

        话不多说,进入正题,相信很多计算机专业的同学在这临近期末的时候,都遇见了类似的计算机大作业——设计信息系统。笔者收到的大作业具体要求如下:

        不同学校的要求不尽相同,这里分享的是笔者的设计思想。

        当然,如上要求对于不同的人来说难易感受也不同,不过尽可能严格要求自己吧,设计你能设计出的最好的系统,来证明给自己看——这学期真的收获很多很多。 

        这篇博客我将按照作业形式来写,可能稍显简略。详细的如何思考分析,实现过程,注意事项,知识分享都将在下一篇博客提到。

说明:在《C Prime Plus》中有提到编写C程序的7个步骤,从前往后分别是:定义程序的目标,设计程序,编写代码,编译,运行程序,测试和调试程序,维护和修改代码,说明。并指出许多初学者经常忽略第一步和第二步,直接开始编写代码,以致像编写这种”庞大”的大作业程序时,会写出一些非常难找的隐藏错误,跳过前期规划,往往找bug上花费了更多的时间。“因为他们写出的程序难看、缺乏条理、让人难以理解”。个人觉得十分在理,所以在作业的“结果分析”前加上了“功能的设计与分析”

正文:

四、功能的设计与分析

1、结合内容①⑦,皆为录入信息,但为给后续增加信息留够空间,所以开始可以定义一个很大的数组。但静态定义一个“用不完”的数组实在浪费空间,不如在堆上动态申请内存空间(malloc,calloc...),现学现用,用最好的。同时注意到录入的信息包括姓名、成绩。结合实际情况,成绩可分为多门科目的成绩,而信息还可添加性别,学号,总分,排名等,用好结构体,这些都可实现。

2、发现②其实被后面的多个功能包含,如排序、查找、输出总分大于指定分数的同学信息等,所以后续结合其他功能考虑。

3、③④皆为查找,结合我们将录入学号,还可通过学号查找。设计程序时可以考虑遍历结构体中的指定信息,与目标对比,一旦找到printf输出。

4、⑤排序,可降序就可升序,这也是可以添加的功能,这里想到学过的选择,冒泡排序。但提高对自己的要求,考虑用实现最复杂,但时间复杂度最小的快速排序实现。

5、⑥删除,开始想用数组存储信息,遍历找到需要删除的学生(数组元素),将其后的所有元素前移一位,覆盖掉需要删除的位置,达成目的。但这样做时间复杂度太高,所以考虑用新学的链表来实现。

6、⑧划定分数线,即遍历+判断语句,当判断总分比指定分数大时,printf输出。

7、关注实验里的额外要求,菜单调用。即printf出一个菜单,显示出各个选项,当输入选项时,可以采用switch语句,调用各个case中的具体函数中去。

8、增加功能。结合实际情况,一个成绩管理系统难免出现录入信息出错的地方,所以考虑增加修改信息的功能。而录入一次考试所有学生的信息后,大家往往会关注考试结果(不只是排名),这就需要统计功能,考虑增加统计平均分和各科考试情况的功能。

9、当使用者还未录入便选择查询、删除等操作时,程序肯定就不知道该怎么做了,所以还可以增加一些判断条件,解决不正确输入问题,提高程序容错率。

五、具体代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>

int flag = 0, numstudent = 0, numcourse, choice;		//宏定义,变量声明
int* pc;
typedef struct information				//结构体定义,每一个都代表着一个学生
{
	long int ID;//学号
	char name[20];//姓名
	char sex[10];//性别(男/女)
	int score[12];//各科分数
	int total = 0;//总分
}information;

typedef struct node						//链表嵌套调用“信息”结构体
{
	information data;
	node* next;
}node;
node* t, * head;

//主要功能函数							//函数声明
int Input();//选项输入
void Enter();//信息录入
void Revise();//修改
void Delete();//删除
void Find();//查找
void Statistic();//统计
void Sort();//排序
void Total_Level();//划线查看

//辅助函数
void Menu();//菜单
void Tips();//提示功能函数
void Tips();//智能提示
int  Legal_Check();//合法性检查
void Header1();//输入表头
void Header2();//输出表头
void Header3();//统计表头
void Swap();//交换
void Down_Sort();//降序排列
void Up_Sort();//升序排列
void Find_by_name();//姓名查找
void Find_by_ID();//学号查找
void Find_by_rank();//排名查找
void Find_by_total();//总分查找
void Play_On_Play();//“我为自己找事干”函数
void Course_Average();//统计平均分

void Tips(char a[])
{
	int i;
	for (i = 0; i < strlen(a); i++)
	{
		printf("%c", a[i]);
		Sleep(30);//利用休眠函数,使说明语句一个一个字打印,让程序有温度!
	}
}

void Menu(int way)
{
	int i;
	char tip[] = "\n请选择菜单中你想要进行的操作选项:\n\n";
	char menu[15][54] = { "				------------------------------------------------\n",
						"				-----------           菜单           -----------\n",
						"				|1、录入学生信息                               |\n",
						"				|2、添加学生信息                               |\n",
						"				|3、修改学生信息                               |\n",
						"				|4、删除学生信息                               |\n",
						"				|5、查找学生信息                               |\n",
						"				|6、查看成绩统计结果                           |\n",
						"				|7、学生成绩排名                               |\n",
						"				|8、划定分数线并查看                           |\n",
						"				|0、退出                                       |\n",
						"				-----------                          -----------\n",
						"				------------------------------------------------\n",
						"\nTo:" };

	if (way == 1)//第一次打印菜单,缓慢打印
	{
		Tips(tip);
		Sleep(1000);
		for (i = 0; i < 15; i++)
		{
			printf("%s", menu[i]);
			Sleep(150);
		}
	}
	else//后续菜单直接显示,不拖沓
	{
		for (i = 0; i < 15; i++)
			printf("%s", menu[i]);
	}
	return;
}

void Header1()//只录入ID、姓名、性别、和各科成绩,所以增加相应表头
{
	int i;
	for (i = 0; i < 20 + 8 * numcourse; i++)
		printf("-");
	printf("\n");
	printf("%-7s %-7s %-7s", "ID", "姓名", "性别");
	for (i = 1; i <= numcourse; i++)
	{
		printf("%-s%-4d", "课程", i);
	}
	printf("\n");
	for (i = 0; i &l
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值