1、 嵌入式课程设计报告册 题目:学生信息管理系统 班级:移动三班 辅导老师:邱雅 一、软件需求分析 1、可行性分析 (1)经济可行性 ①:目前中国有越来越多的中小型企业在蓬勃发展,而现代化员工信息管理系统已经逐渐取代了传统的人工信息管理,智能化的管理系统更具有高效性可行性,所以自能管理系统将会成为或正在成为现代化公司员工信息管理的有效方式; ②:这款学生信息管理系统的价格适合所有学校消费群体,将会有很大的应用空间,满足各种学校学生管理的要求; ③:学生系信息管理系统的价格比相对于同类公司员工管理系统产品较低,同时本软件的成本低于同类产品的平
2、均水平,具有很大的利润空间; ④:本系统的开发环境和软件环境都是当前流行的产品,本系统的软件需求都是基本的功能和应用,在现实中很容易实现。 (2)法律可行性 本软件的开发采用C语言作为软件的开发语言,没有采用同类产的代码,完全是自主开发,并按照国际上软件开发的相关规定来实现开发的; (3)技术可行性 本软件开发系统采用linux开发平台,具有很强的兼容性和扩展性,本软件的占用的内存较小大部分的硬件处理系统都可以兼容,开发语言采用国际通用的C高级编程语言具有很高的维护可行性,经过综合分析我认为现阶段我方所拥有的资源和技术人员,在技术上完全可以实现这款软件的开发,并且能高质量,快速的
3、完成这项工作。 2、用户需求概述 用户需要一个可以简单的实现通讯录功能的简单通讯录系统,分别完成查询,增加,修改,删除的一些简单的功能要求在完成所要求功能的前提下增强与用户的互动,使软件的可操作性增强,此外还可以自愿加入一些新的功能来进行对软件的优化在优化的同时要注意软件基本功能的保障。 二、软件分析与设计 一.功能 1、创建班级 2、输出学生信息 3、按照学号录入学生成绩 4、按照班级录入学生成绩 5、按照学号修改学生成绩 6、按照班级修改学生成绩 7、按照班级统计学生的总成绩 8、按照学号查询学生成绩 9、按照班级输出不及格学生名单及科目 10、按照班级输出学生
4、成绩单 0、退出系统 二.功能模块图: 图1 系统功能模块图 三、主要功能的实现 程序设计一般由两部分组成算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性,在学生信息管理程序中由于预计记录数比较大能够、删除、保存等外更多的情况是查询。所以选用动态链表保存数据. 1、学生信息管理 由于信息输入量比较大,需要的存储空间大,所以需要采用树的双亲表示法进行信息存储,为了方便采用以下定义。 struct student { int num; ch
5、ar name[20]; char sex[5]; char class[30]; int semester; char course[30]; int score[3]; struct student *next; }; struct list { int class; struct student *head; }; 2。main()主函数 程序采用模块化设计,主函数是程序的入口各模块独立。可分块调 试均由主函
6、数控制调用控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值调用相应的各功能函数。同时设置一个断点。即当返回值为一定条件时运行break 0;函数结束程序,以免造成死循环。根据菜单的提示进行需要的操作。 图2 主函数输出界面 图3 程序总体流程图 (1)主菜单 直接利用输出函数 printf 输出字符串在屏幕上显示一个菜单并显示一个提示输入 选项输入数字,将此数字作为菜单函数的返回值返回主函数,主函数根据 这个数字调用相应的功能函数, 制作简便, 操作简单界面
7、如图 10—2 所示: 图 4 主菜单界面 由于程序中很多地方用到了字符串输入语句会造成下一个字符不能正确读入为了 在程序调用执行了各个函数后能够清晰地看到菜单并输入新的选项。 按照所见即所得的方式直接设计输出函数输出字符串达到菜单效果将精力主要放在程序功能的实现上利用
8、 while循环语句一直执行 scanf(”%d” ,t)语句。让用户输入 数按照整形数据形式输入然后字符串转化为数字返回主函数 。既然是数字选项为什么不用整数格式输入而要按字符串输入。再将其转换呢,如果按照整数格式输入,当用户输入了非数字字 符。例如 a 和 b 等由于类型不同将导致程序出错。所以对于不参与运算的数据表面上看是数字也应将其设为字符处理。例如电话号码,千万不要设为整数类型,程序设计技巧很多。所以读者在编程调试中应注意并仔细体会。 (2)创建班级 输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,较为清晰且能直
9、 接反映数据之间的关系,但由于 scanf 函数的特性,在输入时数据用回车分隔也是可以 的,但与界面设计不吻合界面。 由于记录并不是一次性全部输入而是随时填加和删除的,而预先开辟的空间数往往大于实际的记录数。所以程序设计为首先输入准备输入的记录数 n, 然后用while循环语句循环输信息。 图5 创建列表页面 输出学生信息 该功能的实现主要是是通过结构体数组中的链表指针进行输出 图6输出全部信息 按照学号录入学生成绩 通过头指针查找到需要
10、录入成绩的节点,录入成绩. 按照班级录入学生成绩 按照学号修改学生成绩 按照班级修改学生成绩 按照班级统计学生的总成绩 按照学号查询学生成绩 按照班级输出不及格学生名单及科目(11)按照班级输出学生成绩单 四、程序设计 (一)先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力
11、求做到以下几点:①应当采用结构化程序方法编程,以增加可读性;②尽可能多加注释,以帮助理解每段程序的作用;③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能.各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理.(二)在人工检查无误后,再上机调试。 通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找.有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有
12、关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。 如果系统提示的出错信息很多,应当从上到下逐一改正.有时显示出一大片出错信息往往使人感到问题严重,无从下手.其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息.这时只要加上一个变量定义,就所有错误都消除了。(三)在改正语法错误(包括“错误(error)"和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求.有的初学者看到运行结果就认为没问题了,不作认真分析,这
13、是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程。事实上,当程序复杂时很难把所有的可能情况全部都试到,选择典型的临界数据作试验即可。(四)运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法: 1.将程序与流程图仔细对照,如果流程图是正确的,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。 2。如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查.直到找
14、到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。 3.也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不用再编译了,也不再被执行了)。这种方法可以不必一一去掉printf函数语句,以提高效率. 4.如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题.如有则改正之,接着修改程序。 5。有的系统还提供debug(调试)工具,跟踪程序并给出相应信息,使用更为方便,请查阅有关手册。 总之,程序调试是一项细致深入的工作,需要下功夫,动脑子,善于积累经验。在程序调试
15、过程中往往反映出一个人的水平,经验和态度。希望大家给以足够的重视。上机调试程序的目的决不是为了“验证程序的正确",而是“掌握调试的方法和技术",要学会自己找问题,这样慢慢自己就会写出错误较少的实用程序.
五、代码的实现
#include 16、ruct student *next;
};
struct list
{
int class;
struct student *head;
};
void CreatClassStudent(struct list Class[],int n)//创建班级
{
char ch;
int i;
i = 1;
struct student *head,*p,*q;
head = (struct student *)malloc(sizeof(struct student));
q = p = head;
while(i 〈= n)
{
printf("输入第%d个 17、班级的信息:\n",i);
struct student *head,*p,*q;
head = (struct student *)malloc(sizeof(struct student));
Class[i].head = p = head;
while(1)
{
printf(”输入学号:\n”);
scanf(”%d",&head-〉num);
printf(”输入姓名:\n");
scanf(”%s”,head—>name);
head—>score[0] = 0;
head-〉score[1] = 0;
head-〉score[2] = 0;
getch 18、ar();
printf(”是否继续?\n”);
scanf(”%c”,&ch);
if(ch == ’n’)
break;
p = (struct student *)malloc(sizeof(struct student));
head—>next = p;
head = p;
}
head —〉next = NULL;
i++;
}
}
void print(struct list Class[],int n)//输出学生信息 按照班级输出
{
struct student *p;
int i=1;
while(i 〈= n )
{
p = C 19、lass[i].head;
printf("移动%d班学生信息\n”,i);
while(p != NULL)
{
printf("%d\t”,p—〉num);
printf(”%s\t",p-〉name);
printf("%d\t%d\t%d”,p—>score[0],p->score[1],p-〉score[2]);
p = p—>next;
printf(”\n");
}
printf(”\n”);
i++;
}
}
void StudentId(struct list Class[],int n)//按照学号输入成绩
{
int score1,scor 20、e2,score3;
int t;
int key;
printf(”输入学号:");
scanf(”%d”,&key);
int i;
i = 1;
struct student *p;
while(i <= n)
{
p = Class[i]。head;
while(p != NULL)
{
if(p—〉num == key)
{
printf("输入3门成绩:”);
scanf(”%d%d%d”,&score1,&score2,&score3);
p—>score[0] = score1;
p—〉score[1] = score2;
p—〉sco 21、re[2] = score3;
t = 0;
}
p = p—>next;
}
i++;
}
if(t != 0)
printf("该学号不存在!\n”);
}
void ClassId(struct list Class[],int n)
{
int i = 1;
struct student *p;
while(i 〈= n)
{
printf(”录入%d班级的成绩\n”,i);
p = Class[i].head;
while(p != NULL)
{
printf("输入学号为%d的学生成绩:”,p->num);
scanf(”%d%d%d”, 22、p—〉score[0],&p->score[1],&p—>score[2]);
p = p->next;
}
printf("成绩录入结束\n”);
i++;
}
}
void StudentNumberChange(struct list Class[],int n)
{
int i = 1;
int key;
int score1,score2,score3;
int t;
printf("请输入学号:”);
scanf("%d",&key);
struct student *p;
while(i 〈= n)
{
p = Class[i].head;
23、
while(p != NULL)
{
if(p—〉num == key)
{
printf(”请输入新的成绩:”);
scanf(”%d%d%d”,&score1,&score2,&score3);
p—〉score[0] = score1;
p-〉score[1] = score2;
p—〉score[2] = score3;
t = 0;
}
p = p—>next;
}
i++;
}
if(t != 0)
{
printf("该学号不存在!\n”);
}
}
void ClassNumChange(struct list Class[],int 24、n)
{
int class;
int score1,score2,score3;
char ch;
struct student *p;
printf(”输入需要修改信息的班级号%d--——%d:”,1,n);
scanf("%d”,&class);
p = Class[class]。head;
while(p != NULL)
{
printf("是否要修改%d的成绩:",p—>num);
getchar();
scanf("%c”,&ch);
if(ch == 'n’)
{
p = p->next;
continue;
}
printf(”输入新的成 25、绩:”);
scanf(”%d%d%d”,&score1,&score2,&score3);
p-〉score[0] = score1;
p—〉score[1] = score2;
p—〉score[2] = score3;
p = p->next;
}
}
void TotalGrade(struct list Class[],int n)
{
int sum = 0;
int average;
int k;
int class;
printf(”输入班级号%d——---—%d\n”,1,n);
scanf("%d”,&class);
struct stude 26、nt *p;
p = Class[class]。head;
while(p != NULL)
{
sum = p—〉score[0] + p—〉score[1] + p—〉score[2];
average = sum / 3;
printf(”%d的总成绩是%d平均成绩是%d\n”,p-〉num,sum,average);
p = p—>next;
}
}
void QueryResults(struct list Class[],int n)
{
int i = 1;
int key;
int t;
struct student *p;
printf(”请输 27、入学号:");
scanf(”%d",&key);
while(i 〈= n)
{
p = Class[i]。head;
while(p != NULL)
{
if(p—>num == key)
{
printf(”学号为%d的学生[移动%d班]”,p—〉num,i);
printf(”%d\t%d\t%d\n”,p-〉score[0],p—>score[1],p—〉score[2]);
t = 0;
break;
}
p = p—〉next;
}
if(t != 0)
{
printf(”该学生不存在于%d班\n",i);
}
i++;
}
}
28、void NotPass(struct list Class[],int n)
{
int class;
printf(”请输入班级号%d—--%d:",1,n);
scanf(”%d”,&class);
struct student *p;
p = Class[class].head;
printf(”%d班不及格名单\n",class);
while(p != NULL)
{
if(p->score[0] < 60 || p—〉score[1] < 60 || p—>score[2] 〈 60)
{
printf(”%d\t%s\t",p—〉num,p—〉name) 29、
if(p->score[0] 〈 60)
printf(”语文\t%d\t不及格\t",p-〉score[0]);
if(p—〉score[1] 〈 60)
printf(”线性代数\t%d\t不及格\t",p-〉score[1]);
if(p—>score[2]<60)
printf("英语\t%d\t不及格\t",p-〉score[2]);
printf("\n”);
}
p = p->next;
}
}
void Transcript(struct list Class[],int n)
{
int class;
printf("请输入班级号:”);
30、scanf("%d”,&class);
struct student *p;
p = Class[class].head;
while(p != NULL)
{
printf(”%d\t%s\t%d\t%d\t%d\n”,p-〉num,p-〉name,p-〉score[0],p-〉score[1],p-〉score[2]);
p = p—〉next;
}
}
void menu()
{
printf(”0、退出系统\n”);
printf("1、创建班级\n");
printf("2、输出学生信息\n");
printf(”3、按照学号录入学生成绩\n”);
pr 31、intf("4、按照班级录入学生成绩\n");
printf(”5、按照学号修改学生成绩\n");
printf("6、按照班级修改学生成绩\n”);
printf(”7、按照班级统计学生的总成绩\n”);
printf(”8、按照学号查询学生成绩\n”);
printf("9、按照班级输出不及格学生名单及科目\n");
printf("10、按照班级输出学生成绩单\n”);
}
int main()
{
int n;
int i;
int operation;
struct list Class[MAXSIZE];
Class[0]。head = NULL;
C 32、lass[0]。class = —1;
printf(”输入班级数量:\n”);
scanf("%d”,&n);
while(1)
{
menu();
printf("请选择操作:”);
scanf(”%d”,&operation);
switch(operation)
{
case 1:CreatClassStudent(Class,n);
break;
case 2:print(Class,n);
break;
case 3:StudentId(Class,n);
break;
case 4:ClassId(Class,n);
break;
case 5 33、StudentNumberChange(Class,n);
break;
case 6:ClassNumChange(Class,n);
break;
case 7:TotalGrade(Class,n);
break;
case 8: QueryResults(Class,n);
break;
case 9:NotPass(Class,n);
break;
case 10:Transcript(Class,n);
break;
case 0:exit(—1);
}
}
return 0;
}
六、参考文献
1、《嵌入式linux上的C语言编程实践》 北京亚嵌教育研究中心、韩超 电子工业出版社
2、《linux 下C语言应用编程》 杨铸 北京航空航天大学出版社
3、《linux 高级程序设计》 杨宗德 邓玉春 人民邮电出版社
七、开发环境
开发环境linux操作系统
GNU Compiler Collection程序生成工具软件






