上周太忙,拖更了一期博客,这里先给大家赔个不是哈...
并再说明一下,大学进入期末月啦,笔者得专心复习,所以这个月更完这两期就不更了,等放寒假以后再和大家分享。
话不多说,进入正题,相信很多计算机专业的同学在这临近期末的时候,都遇见了类似的计算机大作业——设计信息系统。笔者收到的大作业具体要求如下:
不同学校的要求不尽相同,这里分享的是笔者的设计思想。
当然,如上要求对于不同的人来说难易感受也不同,不过尽可能严格要求自己吧,设计你能设计出的最好的系统,来证明给自己看——这学期真的收获很多很多。
这篇博客我将按照作业形式来写,可能稍显简略。详细的如何思考分析,实现过程,注意事项,知识分享都将在下一篇博客提到。
说明:在《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