学生成绩管理系统(2)_第1页
学生成绩管理系统(2)_第2页
学生成绩管理系统(2)_第3页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、设计题目:学生成绩管理系统院系:电子工程系班级:电嵌Q0941实验人:赵婷婷学号:091602009实验指导老师:李俊目录.课程设计任务Q书3*.内容提要4三.正文51.设计目的-52.总体设计-53.详细设计64.调试与测试35.源码和运1行结果13文献四参考35五课 程 设 计35嵌入式程序课程设计任务书、题目:学生成绩管理系统设计、内容与要求学生成绩信息包括:学期,学号,班别,姓名,四门课程成绩(语文、数学、英语和计算机)等。主要功能:(1)能按学期、按班级完成对学生成绩的录入、修改(2)能按班级统计学生的成绩,求学生的总分及平均分(3)能查询学生成绩,不及格科目及学生名单(4)能按班级

2、输出学生的成绩单要求:使用二进制文件方式存储数据、三、地点:实验2号楼4层硬件实验室四、时间安排:第6-18周星期五的12节五、班级与指导老师:六、参考资料电嵌Q0941班;指导教师:李俊(自己补充)内容提要学生成绩管理系统可以说是每个教育单位的得力助手,它利用计算机对学生 成绩进行统一管理,实现学生成绩信息管理工作流程的系统化、 规范化和自动化, 提高了广大教师的工作效率。该设计报告围绕学生成绩管理系统的源代码,展开一系列丰富的功能介绍和 操作细节。其功能主要有五大板块组成:输入记录模块、查询记录模块、更新记 录模块、统计记录模块和输出记录模块。每一功能模块中又包含一系列具体功能, 如:从文

3、件读入或从键盘输入学生的基本信息, 按学号或者姓名查找已存在的记 录,对存在的记录进行修改、删除、插入、排序,统计所有学生信息中的最高分、 不及格人数等,基本上涵盖了学生成绩管理系统所应该具备的基本操作。为了使广大读者对该系统有更好的了解,此报告还列举出了程序代码中的一 系列具体函数以及它的作用及功能。下面列举源代码中的部分函数:1) prin theader()函数原型:void prin theader()该函数用于在以表格形式显示学生记录时,打印输出表头信息。2) stringinput()函数原型: void stri ngin put(char *t,i nt len s,char

4、*no tice)该函数用于输入字符串,并进行字符串长度验证。T用于保存输入的字符串, 因为是以指针形式传递的,所以t相当于该函数的返回值。3) Disp()函数原型:void Disp(li nk l)该函数用于显示单链表l中存储学生的记录,内容为student结构中定义的 内容。4) Add()函数原型:void Add(li nk l)该函数用于在单链表l中增加学生记录的节点。整个分析过程可在后面内容中详细了解, 这里仅列举几个提供说明。该报告 同时含有源代码的运行结果以及调试和出错分析。 由于时间、经验及水平的原因, 报告中难免有不足和错误之处,敬请批评指正。一. 设计目的本程序旨在训

5、练读者的基本编程能力,了解管理信息开发系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。本程序中设计结构体、单链表、文 件等方面的知识。通过本程序的训练,使读者能对C语言的文件操作有一个更深 刻的了解,掌握利用单链表存储结构实现对学生成绩管理的原理,为进一步开发出高质量的信息管理系统打下坚实的基础。二. 总体设计此成绩管理系统主要利用单链表实现,它有如下五大功能模块组成。其功能 模块图如下所示。(1) 输入记录模块。输入记录模块主要完成将数据存入单链表的工作中。在 此成绩管理系统中,记录可以从以二进制形式存储的数据文件中读入,也可从键盘逐个输入学生记录。学生记录由学生的基本信息和成绩信息

6、字段组成。当从数 据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复 制到单链表中。(2) 查询记录模块。查询记录模块主要完成在单链表中查找满足相关条件的 学生记录。在此成绩管理系统中,用户可以按照学生的学号获姓名在单链表中进 行查找。若找到该学生的记录,则返回指向该学生的记录的指针。否则,返回一 个值为NULL的空指针,并打印出未找到该学生记录的信息。(3) 更新记录模块。更新记录模块主要完成对学生记录的维护。在此成绩管理系统中,它实现了对学生记录的修改、删除、插入和排序操作。一般而言,系 统进行着修操作后,需要将修改的数据存入原数据文件。(4) 统计记录模块。统计记录模

7、块主要完成对个门功课最高分和不及格人数 的统计。(5) 输出记录模块。输出记录模块主要完成两个任务。第一,它实现对学生 记录的存盘操作,即将单链表中的各节点中存储的学生记录信息写入数据文件中。第二,它实现将单链表中的学生记录信息以表格的形式在屏幕上打印出来。三. 详细设计1. 主控main()函数执行流程本成绩管理系统执行流程如图所示。它先以可读写的方式打开数据文件, 此文件默认为“ c:student ” ,若干文件不存在,则新建此文件。当打开文件操 作成功后,从文件中一次读出一条记录,添加到新建的单链表中,然后执行显示 主菜单和进入主循环操作,进行按键判断。在判断键值时,有效的输入为0至9

8、之间的任意数值,其他输入都视为错 误按键。若输入为0 (即变量select=0),它会继续判断是否在对记录进行更新 操作之后进行了存盘操作,若未存盘,则全局变量saveflag=1,系统会提示用户 是否需要进行存盘操作,用户输入 丫或y,系统会进行存盘操作。最后,系统执 行推出成绩管理系统操作。若选择1,则调用Add()函数,执行增加学生记录操作;若选择 2,则调用Del()函数,执行删除学生记录操作;若选择3,贝碉用Qur()函数,执行查询学 生记录操作;若选择4,则调用Modify(0函数,执行修改学生记录操作;若选 择5,则调用Insert()函数,执行插入学生记录操作;若选择6,则调用

9、Tongji() 函数,执行统计学生记录操作;若选择7,则调用Sort()函数,执行按降序排序 学生记录的操作;若选择8,则调用Save()函数,执行将学生记录存入磁盘中的 数据文件的操作;若选择9,则调用Disp()函数,执行将学生记录以表格形式打 印输出至屏幕的操作;若输入为 09之外的值,则调用 Wrong()函数,给出按键 错误的提示。2. 输入记录模块输入记录模块主要实现将数据存入单链表中。这部分的操作较为简单。当从数据文件中读出记录时,它调用fread(p,sizeof(Node),1,fp)文件读取函数,执行一次从文件中读取一条学生成绩记录信息存入指针变量P所指向节点中的操作,并

10、且这个操作在main()中执行,即当成绩管理系统进入显示菜单界面时, 该操作已经执行了。若该文件中没有数据,系统会提示单链表为空,没有任何学 生记录可操作,此时,用户应选择 1,调用Add(1)函数,进行学生记录的输入, 即完成在单链表1中添加节点的操作。3. 查询记录模块查询记录模块主要实现了在单链表中按学号或姓名查找满足相关条件的学 生记录。在查询函数Qur中,1为指向保存了学生成绩信息的单链表的首地址 的指针变量。为了遵循模块化编程的原则,我们将在单链表中进行的指针定位操 作设计成了一个单独 的函数 Node* Locate(Link 1,char findmess,char nameo

11、rnum),参数findmess保存到要查找的具体内容,nameornum保存要 查找的字段(值为字符串类型的num或者name ,若找到该记录,则返回指向该 节点的指针;否则,返回一个空指针。4. 更新记录模块此模块主要实现了对学生记录的修改、 删除、插入和排序操作。因为学生记 录是以单链表的结构形式存储的,所以这些操作都在单链表中完成。下面分别介 绍这四个功能模块。1) 修改记录修改记录操作需要对单链表中目标节点的数据域中的值进行修改,它分两步 完成。第一步,输入要修改的学号,输入后调用定位函数Locate()在单链表 中逐个对节点数据域中学好字段的值进行比较,直到找到该学好的学生记录;

12、第二步,若找到该学生记录,修改除学号之外的各字段的值,并将存盘标记 变量saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。2)删除记录删除记录操作完成删除制定学号或姓名的学生记录,它也分两步完成。第一 步,输入要删除的学号或姓名,输入后调用定位函数Locate()在单链表中逐 个对节点数据域中的学号或姓名字段的值进行比较,知道找到该学号或姓名 的记录,返回指向该学生记录的节点指针;第二步,若找到该学生记录,将 该学生记录所在节点的前驱节点的指针域指向目标节点后的后继节点。3)插入记录插入学生记录操作完成在制定学号的随后位置插入新的学生记录。首先,它要求用户输入某个学生的学号,

13、新的记录将插入在该学生记录之后;然后, 提示用户输入一条新的学生记录的信息,这些信息保存在新节点的数据域中; 最后,将该节点插入在指定位置学号之后。它的就具体插入执行过程如图6.3 所示,图中q为位置学号所在节点的指针变量,其中,p为q所指节点的后 继节点的指针变量,q >next=p,指针变量i指向新记录所在的节点,为插入 节点i,依次执行的操作为:i->next=q->next;q->next=i。4)排序记录有关排序的算法有很多,如冒泡排序、插入排序等。针对单链表结构的特点, 我们用插入排序算法实现按总分的从高到低对学生记录进行排序,排序完成 之后,即可按顺序给名

14、次字段赋值。在单链表中,实现插入排序的基本步骤如下。(1) 新建一个单链表1,用来保存排序结果,其初始值为待排序单链表中 的头节点。(2) 从待排序链表中取出下一个节点,将其总分字段值与单链表1中的各节点中总分字段的值进行比较,知道在链表 1中找到总分小于它的节 点。若找到如此节点,系统将待排序链表中取出的节点插入此节点前, 作为其前驱。否则,将取出的节点放在单链表1的尾部。(3) 重复第(2)步,知道从待排序链表取出的节点的指针域为NULL即此节点为链表的尾部节点,排序完成5. 统计记录模块该模块的实现比较简单,它主要通过循环读取指针变量p所指的当前节点的 数据域中各字段的值,并对各个成绩字

15、段进行逐个判断的形式, 完成单科成绩最 高分学生的查找和各科不及格人数的统计。6. 输出记录模块当把记录输出至文件时,调用fwrite(p,sizeof(Node),1,fp) 函数,将p指 针所指节点中的各字段值,写入文件指针fp所指的文件。当把记录输出值屏幕时,调用void Disp(Link l)函数,将单链表1中存储的学生记录信息以表格的 形式在屏幕上打印出来。7. 数据结构设计学生成绩信息结构体typedef struct stude nt保存学号保存姓名 保存C语言成绩 保存数学成绩 保存英语成绩保存总分 保存平均分 保存名次char num10; /char n ame15; /

16、int cgrade; /int mgrade; /int egrade;int total;float ave;int min gci;单链表node结构体typedef struct nodestruct stude nt data;struct node *n ext;Node,*Li nk;这里定义了一个单链表的结构,结构标记为node,data为student结构类型 的数据,作为单链表结构中的数据域,next为单链表中的指针域,用来存储其 直接后继节点的地址。Node为node类型的结构变量,*Link为node类型的指针 变量。具体函数功能描述1) printheader()函数

17、原型:void prin theader()prin theader()函数用于在以表格形式显示学生记录时,打印输出表头信息。2) printdata()函数原型:void prin tdata(Node *pp)printdata()函数用于以表格形式显示学生记录时,打印输出单链表pp中的学生 信息。3) stringinput()函数原型: void stri ngin put(char *t,i nt lens, char *no tice)stringinput() 函数用于输入字符串,并进行字符串长度验证(长度<lens )。t用于保存输入的字符串,因为是以指针形式传递的,所以

18、t相当于该函数的返回 值。notice用于保存printf()中输出的提示信息。4) Numberi nput()函数原型:int nu mberi nput(char *no tice)numberinput()函数用于输入数值型数据,notice用于保存printf() 中输出的提示信息,该函数返回用户输入的整型数据。5) Disp()函数原型:void Disp(Li nk l)Disp()函数用于显示单链表l中存储的学生记录,内容为student结构中定义的 内容。6) Locate()函数原型: Node* Locate(Link l,char findmess,char nameo

19、rnum)Locate()函数用于定位链表中符合要求的节点,并返回指向该节点的指针。参数 findmess保存要查找的具体内容,nameornum保存按什么字段在单链表l中 查找。7) Add()函数原型:void Add(Li nk l)Qur()函数用于在单链表l中增加学生记录的节点。8) Qur()函数原型:void Qur(Li nk l)Qur()函数用于先在单链表I中按学号或姓名查找满足条件的记录,并显示出来。9) Del()函数原型:void DeI(L ink I)Del()函数用于先在单链表I中找到满足条件的学生记录的节点,然后删除该节 点。10) Modify()函数原型:

20、void Modify(Li nk I)Modify()函数用于在单链表I中修改学生记录。11) 1 nsert()函数原型:void In sert(Li nk I)Insert()函数用于在单链表I中插入学生记录。12) To ngji()函数原型:void Tongji(Link I)Tongji()函数用于在单链表I中完成学生记录的统计工作,统计该班的总分第一 名、单科第一名和各科不及格人数。13) Sort()函数原型:void Sort(Li nk I)Sort()函数用于在单链表I中完成利用插入排序算法实现单链表的按总分字段 的降序排序。14) Save()函数原型:void S

21、ave(Li nk I)Save()函数用于在单链表I中的数据写入磁盘中的数据文件。15) 主函数main()整个成绩管理系统控制部分。四. 调试与测试打开随书光盘,将光盘中的学生成绩管理系统源代码转至运行环境中,开始运行测试,运行过程中出现两个问题,问题描述及解决方法如下:1. 源代码中出现两个系统无法调用的函数textcolor() 和gotoxy(),这两个函数的作用是:在文本模式中选择新的字符颜色和在文本窗口中设置光标。 因为这两个功能对系统影响不大,故可以将这两个函数删掉,使程序正常运行。2. 进入运行结果界面,按代码中的输入顺序对某个学生输入计算机成绩98,输入英语成绩86,打印结

22、果却为:计算机成绩 86,英语成绩98。导致这种现象 发生,其原因很有可能是源代码中的输出模块中的egrade和cgrade顺序反了。回到源代码,仔细观察输出模块,将会发现Disp()函数中调用了 printdata()函数用于输出有效数据,而prin tdata()函数中引用了预处理中的 DATA格式,而在宏定义DATA中 egrade和cgrade的顺序果然反了,至此检查出错误的根本。 更正后,程序正常运行。五. 源码和运行结果1. 源代码#in clude "stdio.h" /*标准输入输出函数库*/#include "stdlib.h" /*标

23、准函数库*/#include "string.h" /*#in clude "con io.h" /*字符串函数库*/屏幕操作函数库*/#defi neHEADER1IISTUDENTn"#define HEADER2 | number | name |Comp|Math|Eng| yuw| sum|ave |mici|n"#defi neHEADER3"|1|-|-T-|-|-|-T-|n "#defi ne FORMAT "|%-10s|%-15s|%4d|%4d|%4d|%4d|%4d|%4.1f|

24、%4d|n"#defi neDATA p->data .nu m,p->data .n ame,p->data.cgrade,p->data.mgrade,p->data.egrade,p->data. yuw,p->data.total,p->data.ave,p->data. min gci#defi neENDn"int saveflag=0; /*是否需要存盘的标志变量*/typedef struct stude nt/*char num10;/*char name15; /*标记为student*/学号*/姓名

25、*/int cgrade;/*Cint mgrade;/*int egrade;/*int yuw;/*int total;/*float ave; /*int mi ngci; /*语言成绩*/数学成绩*/英语成绩*/ 语文成绩*/总分*/平均分*/名次*/int clas; /*班级*/stude nt;/*定义每条记录或结点的数据结构,标记为:node*/typedef struct nodestruct student data; /*数据域 */struct node *next; /*指针域 */Node,*Link; /*Node 为node类型的结构变量,*Link为node类

26、型的指针变量*/void menu() /* 主菜单 */system("cls"); /* 调用 DOS命令,清屏.与 clrscr()功能相同 */cpri ntf(”The Stude nts' Grade Man ageme nt System n ”);cpri ntf(”*Me nu *n")cpri ntf(”*1 in putrecord2 deleterecord*n ”);cpri ntf(”*3 searchrecord4 modifyrecord*n ”);cpri ntf(”*5 in sertrecord6 cou ntreco

27、rd*n ”);cpri ntf(”*7 sortreord8 saverecord*n ”);cpri ntf(”*9 display record0 quitsystem*n ”);cpri ntf(”格式化输出表头*/*n") void prin theader() /*prin tf(HEADER1);prin tf(HEADER2);prin tf(HEADER3); void prin tdata(Node *pp)/*格式化输出表中数据 */Node* p;P=PP;prin tf(FORMAT,DATA);void Wron g() /* 输出按键错误信息*/prin

28、 tf("nnnnn *Error:i nputhas wrong! press any key tocontinu e*n");getchar();void Nofi nd() /* 输出未查找此学生的信息 */prin tf("n=>Not find this stude nt!n");void Disp(Link l) /*显示单链表I中存储的学生记录,内容为 student结构中定义的内容*/Node *p;p=l-> next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(

29、!p) /*p=NULL,NUII 在 stdlib 中定义为 0*/prin tf("n=>Not stude nt record!n");getchar();return;prin tf("nn");printheader(); /* 输出表格头部*/while(p) /*逐条输出链表中存储的学生信息*/prin tdata(p);p=p-> next; /*移动直下一个结点*/prin tf(HEADER3);getchar();/*作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess保存要查找的具体内容 ;

30、nameornum保存按什么查找;在单链表I中查找;*/Node* Locate(Link l,char findmess,char nameornum)Node *r;if(strcmp(nameornum,"num")=0) /*按学号查询 */r=l->n ext;while(r)if(strcmp(r->data.num,findmess)=0) /*若找至U findmess 值的学号 */return r;r=r->n ext;else if(strcmp(nameornum,"name")=0) /*按姓名查询 */r=l

31、->n ext;while(r)if(strcmp(r->,findmess)=0) /*若找至U findmess 值的学生姓名*/ return r;r=r->n ext;return 0; /*若未找到,返回一个空指针*/*输入字符串,并进行长度验证(长度<lens)*/void stri ngin put(char *t,i nt le ns,char *no tice)char n255;doprintf(notice); /*显示提示信息 */scanf("%s",n); /*输入字符串 */if(strle n(n)

32、>le ns) prin tf("n exceed the required len gth! n ”); /*行长度校验,超过lens值重新输入*/while(strle n(n )>le ns);strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/*输入分数,0< =分数<=100)*/int nu mberi nput(char *no tice)int t=0;doprintf(notice); /*显示提示信息 */scanf("%d",&t); /*输入分数 */if(t>100 | t<0) p

33、rin tf("n score must in 0,100! n"); /*进行分数校验*/while(t>100 | t<0);return t;/*增加学生记录*/void Add(Li nk l)Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/char ch,flag=0,nu m10;r=l;s=l->n ext;system("cls");Disp(l); /*先打印出已有的学生信息*/while(r-> next!=NULL)r=r-> next; /*将指针移至于链表最末尾,准备添加记录

34、 */while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/while(1) /*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/stri ngin put (nu m,10,"nin put nu mber(press '0'retur n menu):") ;/*格式化输入学号并检验*/flag=0;if(strcmp(num,"0")=0)/*输入为0,则退出添加操作,返回主界面*/return; s=l->n ext;while(s) /*查询该学号是否已经存在,若存在则要求重

35、新输入一个未被占用的学号*/if(strcmp(s->data. nu m, nu m)=0)flag=1;break;s=s->n ext;if(flag=1)/*提示用户是否重新输入*/getchar();prin tf("=>The agai n?(y/n):", num);nu mber %s isnot existi ng,try elsescan f("%c",&ch); if(ch='y'|ch='Y') con ti nue;elsereturn;break;p=(Node *)m

36、alloc(sizeof(Node); /*申请内存空间 */if(!p)prin tf("n allocate memory failure "); /*如没有申请到,打印提示信息*/return ;/*返回主界面*/strcpy(p->data.num,num); /*将字符串 num拷贝至U p->data.num 中*/stri ngin put(p->data .n ame,15,"Name:");p->data.cgrade=nu mberi nput("C Ian guage Score0-100:&quo

37、t;); /*输入并检验分数,分数必须在0100之间*/p->data.mgrade=n umberi nput("Math Score0-100:"); /*分数必须在0 100之间*/p->data.egrade=numberinput("English Score0-100:"); /*分数必须在0 100之间*/输入并检验分数,输入并检验分数,p->data.yuw=nu mberi nput("yuw Score0-100:");/*输入并检验分数,分数必须在0-100之间*/p->data.tota

38、l=p->data.egrade+p->data.cgrade+p->data.mgrade+p->data.yuw;/*计算总分*/p->data.ave=(float)(p->data.total/4); /*计算平均分 */p->data. min gci=0;p-> next=NULL; /* 表明这是链表的尾部结点*/r->n ext=p; /*将新建的结点加入链表尾部中*/r=p; saveflag=1;return ;void Qur(Li nk I) /*按学号或姓名,查询学生记录*/int select; /*1:按学号查

39、,2:按姓名查,其他:返回主界面(菜单) */char search in put20; /*保存用户输入的查询内容*/Node *p;if(!l->next) /*若链表为空 */system("cls");printf("n=>No student record!n");getchar();return;system("cls");prin tf("n=>1 Search by nu mber =>2 Search by n amen");prin tf(" please ch

40、oice1,2:");scan f("%d", &select);if(select=1) /*按学号查询 */stringinput(searchinput,10,"input the existing student number:");p=Locate(l,searchinput,"num");/*在 I 中查找学号为 searchinput值的节点,并返回节点的指针*/if(p) /* 若 p!=NULL*/prin theader();prin tdata(p);prin tf(END);prin tf(&

41、quot;press any key to retur n");getchar();elseNofi nd();getchar();else if(select=2) /* 按姓名查询 */stri ngin put(search in put,15,"i nput the existi ng stude nt n ame:");p=Locate(l,search in put," name");if(p)prin theader();prin tdata(p);prin tf(END);prin tf("press any key

42、to retur n");getchar();elseNofi nd();getchar();elseWron g();getchar();/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/void Del(Li nk l)int sel;Node *p,*r;char fin dmess20;if(!l-> next)system("cls");printf("n=>No student record!n”);getchar();return;system("cls");Disp(l);prin tf(&q

43、uot;n=>1 Delete by nu mber =>2 Delete by n amen");printf(" please choice1,2:");scan f("%d", &sel);if(sel=1)stringinput(findmess,10,"input the existing student number:"); p=Locate(l,fi ndmess," nu m");if(p) /*p!=NULL*/r=l;while(r- >n ext!=p)r=

44、r->n ext;r->next=p->next;/*将p所指节点从链表中去除 */free(p); /* 释放内存空间*/ prin tf("n=>delete success!n");getchar();saveflag=1;elseNofi nd();getchar();else if(sel=2) /*先按姓名查询到该记录所在的节点*/stri ngin put(fi ndmess,15,"i nput the existi ng stude nt n ame");p=Locate(l,fi ndmess," n

45、ame");if(p)r=l;while(r- >n ext!=p)r=r->n ext;r->n ext=p->n ext;free(p);prin tf("n=>delete success!n");getchar();saveflag=1;elseNofi nd();getchar();elseWron g();getchar();/*修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号 不能修改*/void Modify(Li nk l)Node *p;char fin dmess20;if(!l-&g

46、t; next)system("cls");printf("n=>No student record!n”);getchar();return;system("cls");prin tf("modify stude nt recorder");Disp(l);stringinput(findmess,10,"input the existing student number:"); /*输入并检验该学号*/p=Locate(l,findmess,"num"); /*查询至U该节点

47、 */if(p) /* 若p!=NULL,表明已经找到该节点 */prin tf("Number:%s,n",p->data .nu m);prin tf("Name:%s,",p->data .n ame);stri ngin put(p->data .n ame,15,"i nput new n ame:");printf("C Ian guage score:%d,",p->data.cgrade);p->data.cgrade=nu mberi nput("C Ian

48、 guage Score0-100:");prin tf("Math score:%d,",p->data.mgrade);p->data.mgrade=nu mberi nput("Math Score0-100:");prin tf("E nglish score:%d,",p->data.egrade);p->data.egrade=nu mberi nput("E nglish Score0-100:");prin tf("yuw score:%d,",

49、p->data.yuw); p->data.yuw=nu mberi nput("yuw Score0-100:");p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade+p->data.yuw; p->data.ave=(float)(p->data.total/4);p->data. min gci=0;prin tf("n=>modify success!n");Disp(l);saveflag=1;elseNofi n

50、d();getchar();/*插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。*/void In sert(L ink l)Link p,v,newinfo; /*p指向插入位置,newinfo 指新插入记录 */char ch,num10,s10; /*s保存插入点位置之前的学号,num保存输入的新记录的学号*/int flag=0;v=l->n ext;system("cls");Disp(l);while(1)stri ngin put(s,10,"please in put in sert locati on after

51、the Number:"); flag=O;v=l->n ext;while(v)/*查询该学号是否存在,flag=1表示该学号存在*/if(strcmp(v->data .nu m,s)=O) flag=1;break;v=v- >n ext;if(flag=1)break; /*若学号存在,则进行插入之前的新记录的输入操作*/elsegetchar();printf("n=>The number %s is not existing,try again?(y/n):",s);scan f("%c", &ch)

52、;if(ch='y'|ch='Y')con ti nu e;elsereturn;/*以下新记录的输入操作与Add()相同*/stringinput(num,10,"input new student Number:");v=l->n ext;while(v)if(strcmp(v->data .num,num)=0)printf("=>Sorry,the new number:'%s' is existing !n",num);prin theader();prin tdata(v);p

53、rin tf("n");getchar();return;v=v- >n ext;n ewi nfo=(Node *)malloc(sizeof(Node);if(! newi nfo)prin tf("n allocate memory failure "); /*如没有申请到,打印提示信息*/return ;/*返回主界面*/strcpy( newi nfo->data. nu m, nu m);stri ngi nput( newi nfo->data. name,15,"Name:");newin fo-&g

54、t;data.cgrade=nu mberi nput("C Ian guage Score0-100:");newi nfo->data.mgrade=nu mberi nput("Math Score0-100:");newin fo->data.egrade=nu mberi nput("E nglish Score0-100:");newinfo->data.yuw=numberinput("yuw Score0-100:");newin fo->data.total=newin f

55、o->data.egrade+newin fo->data.cgrade+newin fo->dat a.mgrade+newin fo->data.yuw;newin fo->data.ave=(float) (newin fo->data.total/4);newin fo->data. min gci=0; newinfo->n ext=NULL;saveflag=1; /* 在main()有对该全局变量的判断,若为1,则进行存盘操作*/*将指针赋值给p,因为I中的头节点的下一个节点才实际保存着学生的记录*/p=l->n ext;wh

56、ile(1)if(strcmp(p->data. nu m,s)=O)/*在链表中插入一个节点 */newinfo->n ext=p->n ext;p->n ext =newinfo;break;p=p->n ext;Disp(l);prin tf("nn");getchar();/*统计该班的总分第一名和单科第一,和各科不及格人数*/ void Ton gji(L ink l)用于指向分数最高的节点*/保存四门成绩中不及格的人数*/Node *pm,*pe,*pc,*pt,*pk,*p1,*p2,*p3,*p4; /*Node *r=l->n ext;int coun tc=0,co un tm=0,co un te=0,co un ty=0; /* if(!r)system("cls");prin tf("n=>Not stude nt record!' n"); getchar();return ;system("

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论