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
  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本实验课题主要是要解决数据在文件中的读取,并且要求读取到的学生总人数少于30人,每位学生的课程不多于6门。此程序需要实现输入、计算、排序、删除、查询、显示功能。此实验需要在CodeBlocks等C语言编译平台上完成同时本实验要求所写的程序可以流畅的在编译平台上运。首先为用户提供一个菜单,展示各个选项的功能,用户可输入一个选项(数字),执相应的功能,通过运用switch语句对用户输入的数字进处理判断出用户想要执的操作。一共有14个选项,第一个和八九选项没有使用函数,二三分别对应着一个函数,第四个到第七个都使用同一个函数来输出成绩。十到十三个分别对应一个函数,最后一个0来结束程序。 学生信息的写入(定义FILE *fp指针),先将将学生人数和课程门数写入文件,以结构体数组的形式来保存键盘上输入的每个学生相应的信息。然后再用fprintf函数的格式写入方式将数组中的数据写入文档中。 学生信息的读取,先定义结构体数组,从文件中读取学生的学号姓名及成绩等信息写入到结构体数组stu中,在用fscanf函数的格式读取方式将文档中相应的数据保存在相应的结构体数组里定义的变量中。 计算排序的功能,是按不同的要求分别将学生的总成绩和平均成绩计算出来,然后将每个学科的总成绩平均成绩计算出来,然后按升序或者降序将成绩排序出来。 删除查询显示等功能,可以通过读取得到的结构体数组,进重写文档,打印等方式实现功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值