C语言学生成绩管理系统-设计报告_第1页
C语言学生成绩管理系统-设计报告_第2页
C语言学生成绩管理系统-设计报告_第3页
C语言学生成绩管理系统-设计报告_第4页
C语言学生成绩管理系统-设计报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

学生成绩管理系统课程设计报告专 业: 软 件 学 院 班 级: 计 HR-06-7 班 姓 名: 李 政 源 指导教师: 李 建 中 学 号: 0620010710 课程设计报告一、课程设计题目 基本要求题目:矩阵乘法。 综合训练:学生成绩管理系统二、设计要求矩阵乘法:编写一个函数实现矩阵 A(2 行 3 列)与矩阵 B 相乘(3 行 2 列) ,乘积放在 C数组中。在主函数中输入相乘的两数组,并输出结果。学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等的综合应用)程序说明:有 N 个学生,每个学生的数据包含学号(不重复) 、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能:(1)主菜单(2)各菜单项功能 成绩录入:输入学生的学号、姓名及三门课的成绩; 成绩查询:(至少一种查询方式) 。 按学号查询学生记录。 查询不及格学生的记录。成绩统计: 计算学生的平均分; 根据学生的平均分高低,对学生的数据进行排序后输出; 对学生单科成绩排序,输出学生姓名与该科成绩;退出系统:退出整个系统(即主菜单) 。(3)结构体数组:define N 30struct studentint num; /* 定义学号*/char name20; /* 定义姓名*/float score3; /* 定义存贮三门课成绩的数组*/float average; /* 定义平均成绩*/;struct student stuN; /* 定义结构体数组,存贮多个学生的记录*/三、数据结构设计描述系统功能描述系统功能描述1 能够输入学生的学号、姓名、三科成绩并且计算出平均成绩。2 能够以表格的形式输出学生记录3 能够按照学生三科的平均成绩进行排序4 能够按照学生的单科成绩进行排序学生成绩管理系统1、 成绩录入2、 成绩查询3、 成绩统计4、 退出5 能够按照学号查询学生记录6 往表中插入学生记录7 从表中删除学生记录8 存储记录到文件中9 从文件中读取记录10 退出数据字典数据字典1 数据流条目数据流名称:全部记录别名:无简述:最新更新后所有关于学生成绩的记录来源:数据库去向:加工“记录筛选”数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩数据存储条数据存储名称:学生成绩记录别名:无简述:存放学生所有可供查询的信息组成:学号+姓名+SC1+SC2+SC3+平均成绩组织方式:索引文件,以学学号为关键字查询要求:要求能立即查询2 数据项条目数据项名称:学号别名:无简述:所有学校学生的学号类型:字符串3 加工条目加工名:更改的记录激发条件:学生成绩记录被改动优先级:普通输入:新记录输出:更新数据、数据未改动加工逻辑:根据现有学生成绩记录if 新记录旧记录then 更新数据else 数据未改动endif设计测试流程设计测试流程1、进入界面 2、输入选项 0,回车;按提示输入数据3、回到主菜单;输入选项 8,回车;输入文件名:data,回车;出现成功提示,则读入文件操作成功。4、回到主菜单,输入 1,回车每 10 个暂停显示数据5、回到主菜单,输入 2,回车出现排序成功信息。6、回到主菜单,输入 3,回车出现排序成功信息。7、回到主菜单,输入 5,回车按提示插入一组数据8、回到主菜单,输入 6,回车按提示输入姓名,删除数据出现删除成功的信息9、回到主菜单,输入 4,回车输入学号进行查询10、回到主菜单,输入 1,回车出现统计信息11、回到主菜单,输入 7,回车输入 result,回车出现成功写入文件的信息12、回到主菜单,输入 9,回车退出系统四、各变量的定义和作用#define N 3 定义常数 typedef struct z1 定义数据结构 char no11; char name15; int scoreN; float sum; float average; int order; struct z1 *next; STUDENT;char *menu 定义菜单字符串数组Enter list 输入记录Print list 显示单链表中所有记录 Sort to make new file 按照总成绩排序 sort to Single course result 按照单科成绩排序 Search record on ID 按照学号查找记录 Insert record to list 插入记录到表中 Delete a record from list 从表中删除记录 Save the file 将单链表中记录保存到文件中Load the file 从文件中读入记录*/ Quit 退出STUDENT *init() 初始化链表STUDENT *create()创建链表,完成数据录入功能inputs(char *prompt, char *s, int count) 自定义输入控制函数 inputs五、系统各模块(函数)的组成。功能、参数说明、相互调用关系主函数 main()利用无限次循环 for(;)和 swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。初始化函数 STUDENT *init()这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使 head 的值为 NULL。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!菜单选择函数 int menu_select();这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!输入记录函数 STUDENT *create()这是一个无参函数,用来执行第学生成绩记录的输入,当学生为 0 时停止输入,函数结束后,带回一个指向链表头的指针 head。输入记录函数 STUDENT *create()这是一个无参函数,用来执行第学生成绩记录的输入,当学生为 0 时停止输入,函数结束后,带回一个指向链表头的指针 head。显示记录函数 void print(STUDENT *head)这是一个不返回值的有参函数,形参为“链表头的指针” ,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。查找记录函数 void search(STUDENT *head)这是一个不返回值的有参函数,形参为“链表头的指针” ,实现按学号对某个学生进行查找,并显示所查找到的记录。删除记录函数 STUDENT *delete(STUDENT *head)这是一个有参函数,形参为“链表头的指针” ,先输入要删除的学生记录的学号,找到后显示该学生信息,等确认后便可按“Y”进行删除。排序函数 STUDENT *sort(STUDENT *head)这是一个有参函数,形参为“链表头的指针” ,按学生成绩的平均分高低进行排序,还可以显示名次。插入函数 STUDENT *insert(STUDENT *head,STUDENT *new)这是一个有参函数,形参有两个,一个是“链表头的指针” ,一个是“待插入指针” ,按照原来成绩平均分的高低进行插入,插入后会重新进行排序,并返回。保存数据到文件函数 void save(STUDENT *head)这是一个不返回值的有参函数,形参为“链表头的指针” ,可以把学生记录保存在电脑上由自己任意命名的二进制文件。从文件读数据函数 STUDENT *load()这是一个不返回值的有参函数,形参为“链表头的指针” ,根据输入的文件地址进行读取六、各功能模块的算法处理流程图及相关说明1、主函数 main()2、初始化函数 STUDENT *init()3、菜单选择函数 int menu_select();4、输入记录函数 STUDENT *create()算法:先声明一个首节点 head,并将 head-next 设为 NULL。每输入一个数据就声明一个新节点 p,把 p-next 设为 NULL,并且链接到之前列表的尾端。N-S 流程图如下:head=NULLfor(;)指针 p 指向新开辟的单元指针 p 是否为空是 否输入学号 p-num输出 p-num 是否为 0内存 是 否溢出 输入姓名 p-name停止 for(i=0;isum=s;菜单 p-average=(float)s/3;p-order=0;p-next=head;head=p;5、 记录函数 void print(STUDENT *head)算法:先将 p 结点的指针指向第一个结点,将 p 结点(即第一个结点)的数据输出。然后再将 p 结点的指针指向 p 指针的的指针(即下一结点),将 p 结点(即第一结点)的数据输出。重复执行此步聚直到 p 指针指向 NULL 为止。N-S 流程图如下:p=head,使指向第一个结点输出 p 所指向的结点p 指向一下个结点当 p 指的不是表尾6、 找记录函数 void search(STUDENT *head)算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号 s,设一个指针变量 p,先指向第一个结点,当 strcmp(p-name,s) & p != NULL 时,使 p 后移一个结点,如果 p!=NULL,输出 p 所指的结点。N-S 流程图如下:输入要查找的学生的学号 sp=head,使 p 指向第一结点当记录的学号不是要找的,或指针不为空时p=p-nextp!=NULL 如果指针不为空是 否显示没有该输出 p 所指向的结点 学生7、删除记录函数 STUDENT *delete(STUDENT *head)算法:从 p 指向的第一个结点开始,检查该结点中的 num 值是否等于输入的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将 p 后移一个结点,再如此进行下去,直到遇到表尾为止。N-S 流程图如下:p1=head;输入入要删除的学号 s当(strcmp(p1-num,s))& p1 != NULLp2=p1 p1=p1-nextp1 是要删除的结点是 否p1 所指是头结点是 否 输出”找不到”head=p1-next p2-next=p1-next 的信息“(删除头结点)8、排序函数 STUDENT *sort(STUDENT *head)N-S 流程图:temp=head-next,head-next=NULL当 temp!=NULL 时t=temp;temp=temp-next;p1=head;p2=head;当 t-averageaverage&p1!=NULL 时p2=p1;p1=p1-next;p1=p2是 否t-next=p1; t-next=p1;head=t; p2-next=t;p1=head;当 p1!=NULL 时i+;p1-order=i;p1=p1-next;输出“排序成功”9、 入函数 STUDENT *insert(STUDENT *head,STUDENT *new)算法:先将学生的成绩按平均分由高分到低分进行排序,再插入一个新生的结点,要求按平均分的高低顺序插入。先用指针变量 p0 指向待插入的结点,p1 指向第一个结点。如果 p0-averageaverage,则待插入的结点不应插在 p1 所指的结点之前。此时将 p1 后移,并使 p2 指向刚才 p1 所指的结点。重复以上的步骤,直到 p0-average=p1-average 为止。这时将 p0 指向的结点插到 p1 所指结点之前。但是如果 p1 所指的已是表尾结点,则 p1 就不应后移了。如果 p0-average 比所有结点的 average 都小,则应将 p0 所指的结点插到链表末尾。如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将 p0 的值赋给p2-,使 p2-next 指向待插入的结点,然后将 p1 的值赋给 p0-next,使得 p0-next 指向 p1 指向的变量。如果插入位置为第一个结点之前,则将 p0 赋给 head,将 p1 赋给 p0-next。如果要插到表尾之后,应将 p0 赋给 p1-next,NULL 赋给 p0-next。最后再调用排序的函数,将学生成绩重新排序.N-S 流程图如下:P1=head, p0=new原来的链表是空表是 否将 p0 所指 当 p0-averageaverage 以及 p1 所指向的不是表尾结的结点作为 点唯一结点 p2 指向 p1 位置 p1 向后移一个结点p0-average=p1-average是 否p1 指向头结点 p1-next=p0是 否 p0-next=NULLhead=p0 p2-next=p0 (插到表尾之后)p0 -next=p1 p0-next=p1(插到表头之前) (插到表中间)n=n+1;(结点加 1)head=sort(hear);(将成绩重新排序)10、保存数据到文件函数 void save(STUDENT *head)N-S 流程图如下:输入要保存记录的文件地址 outfile文件不能打开否 是p=head;输出一个出错信当 p 不为空时 息,并返回菜单fwrite(p,LEN,1,fp); (写入一条记录)p=p-next; (指针后移)fclose(fp); (关闭文件)11、从文件读数据函数 STUDENT *load()N-S 流程图如下:定义两个指针变量 p1,p2输入要打开的记录文件地址 infile文件不能打开否 是开辟一个新单元指针 p1 是否为空 返回菜单否 是返回菜单读入记录fclose(fp); (关闭文件)七、课程设计过程中遇到的问题及解决过程(1)刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试得去执行显示功能,结果显示的是一些乱码!加入初始化函数后,这种现象也随之消失。(2)刚开始执行输入函数,按学号顺序输入十个学生的成绩,输完后执行显示功能,学生成绩记录是按学号的反顺序显示的,试着在其中增加一些语句,希望能把学号按正常顺序显示,但暂时没有成功,所以在输入成绩时只能按学号反顺序输入,最后就按学号正常顺序输出了。(3)刚开始时,先把成绩按平均分排序,再插入一个学生的成绩,执行显示功能,虽然插入的学生的成绩能正常插入,但该学生的名次为 0。后来,在插入成绩之后,调用排序函数,把所有成绩重新排序一次。(4)在输入函数中设了一个无限循环,可以输入无数个学生的成绩信息,当学号为 0 的时候则停止输入。(5)输入太多个学生的成绩时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录,十七左右为最佳。(6)在没有输入任何信息的情况下,去执行排序功能,最后显示有一个记录,学号、姓名为空白,成绩都为 0,名次为 1。(7)在输入选项时不能输入字母,否则会死循环,建议不要乱输字母。八、课程设计心得体会经过一个多星期的 C 语言课程设计,感觉自己收获不少!首先是:链表本来上课是没有上的,但这个课程设计里面主要都是用链表,因为要达到这样的功能,使用链表相当方便,但不容易理解,所以在这方面我很了很多的时间看课本和参考课外书,使 C 语言的知识强化了不少。其次,在做课程设计的过程中,发现了平时很多没有注意到的问题,例如:返回值函数和不返回值函数两者在主函数中的调用是不同的更重要的是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了 C 语言的重要性。这个学生成绩管理系统都是在自己知识范围内完成的,所以界面清晰简单,可能不是很好看,但绝对实用!从这里我也得到一个体会,做一个程序,或者开发一个软件,应该着重从它的后台制作入手,不能做出一个中看不中用的程序或者软件。相信这次的课程设计为我以后继续从事计算机工作打了一个小小的开头。九、附源程序#include stdio.h /*I/O 函数*/ #include stdlib.h /*其它说明*/ #include string.h /*字符串函数*/ #include conio.h /*屏幕操作函数*/ #include mem.h /*内存操作函数*/ #include ctype.h /*字符操作函数*/ #include alloc.h /*动态地址分配函数*/ #define N 3 /*定义常数*/ #define M 30struct studenttypedef struct z1 /*定义数据结构*/ char no11; char name15; int scoreN; float sum; float average; int order; struct z1 *next; STUDENT; /*菜单函数,返回值为整数*/ menu_select() char *menu= *MENU*, /*定义菜单字符串数组*/ 0. Enter list, /*初始化*/ 1. Print list, /*输入记录*/ 2. Sort to make new file , /*显示单链表中所有记录*/ 3. sort to Single course result, /*排序*/ 4. Search record on ID, /*按照学号查找记录*/ 5. Insert record to list , /*插入记录到表中*/ 6. Delete a record from list, /*从表中删除记录*/ 7. Save the file, /*将单链表中记录保存到文件中*/ 8. Load the file, /*从文件中读入记录*/ 9. Quit, /*退出*/ , , /*屏幕调节,没有实际意义*/ , *, , ,; char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ textbackground(YELLOW); /*设置背景颜色为黄色*/ gotoxy(1,25); /*移动光标*/ printf(Press any key enter menu.n); /*压任一键进入主菜单*/ getch(); /*输入任一键*/ clrscr(); /*清屏*/ for(i=0;i9); /*选择项不在 09 之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/ /*初始化链表,可以实现对另一组数据的处理*/ STUDENT *init() /*初始化链表*/ return NULL; /*创建链表,完成数据录入功能*/ STUDENT *create() int i; int s; STUDENT *h=NULL,*info; /* STUDENT 指向结构体的指针*/ for(;) info=(STUDENT *)malloc(sizeof(STUDENT); /*申请空间*/ if(!info) /*如果指针 info 为空*/ printf(nOut of memory); /*输出内存溢出*/ return NULL; /*返回空指针*/ printf(Input imformation as follow.n); printf(Press #afterEnter NOto end the input.n); inputs(Enter NO.:,info-no,11); /*输入学号并校验*/ if(info-no0=#) break; /*如果学号首字符为#则结束输入*/ inputs(Enter name:,info-name,15); /*输入姓名,并进行校验*/ printf(Please input %d scores n,N); /*提示开始输入成绩*/ s=0; /*计算每个学生的总分,初值为 0*/ for(i=0;iscorei); /*输入成绩*/ if(info-scorei100|info-scoreiscorei100|info-scoreiscorei; /*累加各门课程成绩*/ info-sum=s; /*将总分保存*/ info-average=(float)s/N; /*求出平均值*/ info-order=0; /*未排序前此值为 0*/ info-next=h; /*将头结点做为新输入结点的后继结点*/ h=info; /*新输入结点为新的头结点*/*没排序前,后输入的数据将排在最上*/ return(h); /*返回头指针*/ /*自定义输入控制函数 inputs*/ inputs(char *prompt, char *s, int count) char p255; doprintf(prompt); /*显示提示信息*/ scanf(%s,p); /*输入字符串*/ if(strlen(p)count)printf(n Too long! n); /*进行长度校验,超过 count 值重输入*/ while(strlen(p)count); strcpy(s,p); /*将输入的字符串拷贝到字符串 s 中*/ /*显示模块*/ void print(STUDENT *h) int i=0; /* 统计记录条数*/ STUDENT *p; /*移动指针*/ clrscr(); /*清屏*/ p=h; /*初值为头指针*/ printf(nnn*STUDENT*n); printf(|rec|NO. | name | sc1| sc2| sc3| ave |order|n); printf(|-|-|-|-|-|-|-|-|n); while(p!=NULL) i+; if(i%15=0)getch();clrscr(); printf(nnnn); /*否则什么也不做*/ else; printf(|%2d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %3d |n, i, p-no,p-name,p-score0,p-score1, p-score2,p-average,p-order); p=p-next; printf(*end*n); /*排序模块*/ STUDENT *sort(STUDENT *h) int i=0; /*用来保存名次*/ STUDENT *p,*q,*t,*h1; /*定义临时指针*/ h1=h-next; /*将原表的头指针所指的下一个结点作头指针*/ h-next=NULL; /*断开原来链表头结点与其它结点的连接*/ while(h1!=NULL) /*当原表不为空时,进行排序*/ t=h1; /*取原表的头结点*/ h1=h1-next; /*原表头结点指针后移*/ p=h; /*设定移动指针 p,从头指针开始*/ q=h; /*设定移动指针 q 做为 p 的前驱,初值为头指针*/ while(t-sumsum&p!=NULL) /*作总分比较*/ q=p; /*待插入点值小,则新表指针后移*/ p=p-next; if(p=q) /*p=q,上面的 while 没有执行,也即插入点大于头指针,此点应排在首位*/ t-next=p; /*待排序点的后继为 p*/ h=t; /*新头结点为待排序点*/ else /*待排序点应插入在 q 和 p 之间,如 p 为空则是尾部*/ t-next=p; /*t 的后继是 p*/ q-next=t; /*q 的后继是 t*/ p=h; /*已排好序的头指针赋给 p*/ while(p!=NULL) /*赋予各组数据排序号*/ i+; /*结点序号*/ p-order=i; /*将名次赋值*/ p=p-next; /*指针后移*/ printf(Sort sucess!n); /*排序成功*/ return (h); /*返回头指针*/ /*查找记录模块*/ void search(STUDENT *h) STUDENT *p; /*移动指针*/ char s15; /*存放姓名的字符数组*/ clrscr(); /*清屏幕*/ printf(Input the ID that you want to search:n); scanf(%s,s); /*输入姓名*/ p=h; /*将头指针赋给 p*/ while(strcmp(p-no,s)&p!=NULL)/*当记录的姓名不是要找的,并且指针不为空时*/ p=p-next; /*移动指针,指向下一结点,继续查找*/ if(p=NULL) /*指针为空,说明未能找到所要的结点*/ printf(nCan find the student who ID is %sn,s); else /*显示找到的记录信息*/ printf(nn*havefound*n); printf(|NO. | name | sc1| sc2| sc3| ave |order|n); printf(|-|-|-|-|-|-|-|-|n); printf(|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %3d |n, p-no,p-name,p-score0,p-score1,p-score2,p-average,p-order); printf(*end*n); /*插入记录模块*/ STUDENT *insert(STUDENT *h) STUDENT *p,*q,*info,*k; /*p 指向插入位置,q 是其前驱,info 指新插入记录*/ int s1,i,n=0; printf(nplease new recordn); info=(STUDENT *)malloc(sizeof(STUDENT); /*申请空间*/ if(!info) printf(Out of memory); /*如没有申请到,内存溢出*/ return NULL; /*返回空指针*/ inputs(Enter NO.:,info-no,11); /*以下是待插入数据的录入和处理,具体同创建模块同*/ inputs(Enter name:,info-name,15); printf(Please input %d score n,N); s1=0; for(i=0;iscorei); if(info-scorei100|info-scoreiscorei100|info-scoreiscorei; info-sum=s1; info-average=(float)s1/N; info-next=NULL; /*设后继指针为空*/ p=h; /*将指针赋值给 p*/ q=h; /*将指针赋值给 q*/ if(h=NULL) /*链表为空*/ h=info;info-next=NULL; else while(info-sumsum)&(p-next!=NULL) q=p; /*使 q 指向 p 刚才的结点*/ p=p-next; /*使 p 后移一个结点*/ if(info-sum=p-sum) if(h=p)h=info; info-next=p; /*info 作为头指针,p 作为 info 的后继指针*/ else q-next=info; /*q 的后继指针是 info*/ info-next=p; /*info 的后继指针是 p*/ else p-next=info;info-next=NULL; /*p 的后继指针是 info,info 的后继指针是空*/ k=h; while(k!=NULL) /*重新赋予排序号(排序号因为被插入新数据而改变)*/ n+; k-order=n; k=k-next; printf(n -have inserted %s student-n,info-name); return(h); /*返回头指针*/ /* ) */ /* 只是修改 将“) ” 换成 “” 就可以了, 就这么一个错误 */ /*删除记录模块*/ STUDENT *delete(STUDENT *h) char k5; /*定义字符串数组,用来确认删除信息*/ STUDENT *p,*q; /*p 为查找到要删除的结点指针,q 为其前驱指针*/ char s11; /*存放学号*/ clrscr(); /*清屏*/ printf(Please deleted non); /*显示提示信息*/ scanf(%s,s); /*输入要删除记录的学号*/ q=p=h; /*给 q 和 p 赋初值头指针*/ while(strcmp(p-no,s)&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/ q=p; /*将 p 指针值赋给 q 作为 p 的前驱指针*/ p=p-next; /*将 p 指针指向下一条记录*/ if(p=NULL) /*如果 p 为空,说明链表中没有该结点*/ printf(nlist no %s studentn,s); else /*p 不为空,显示找到的记录信息*/ printf(*have found*n); printf(|no | name | sc1| sc2| sc3| ave |order|n); printf(|-|-|-|-|-|-|-|n); printf(|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %3d |n, p-no, p-name,p-score0,p-score1,p-score2,p-average,p-order); printf(*end*n); doinputs(Do you really want to deleted?(y/n),k,5); while(k0!=y if(k0!=n) /*删除确认判断*/ if(p=h) /*如果 p=h,说明被删结点是头结点*/ h=p-next; /*修改头指针指向下一条记录*/ else q-next=p-next; /*不是头指针,将 p 的后继结点作为 q 的后继结点*/ free(p); /*释放 p 所指结点空间*/ printf(n have deleted No %s studentn,s); return(h); /*返回头指针*/ /*保存数据到文件模块*/ void save(STUDENT *h) FILE *fp; /*定义指向文件的指针*/ STUDENT *p; /* 定义移动指针*/ char outfile20; /*保存输出文件名*/ printf(Enter outfile name,for example G:f1score.txt:n); scanf(%s,outfile); if(fp=fopen(outfile,wb)=NULL) /*为输出打开一个二进制文件,如没有则建立*/ printf(Can not open filen); exit(1); printf(nSaving file.n); /*打开文件,提示正在保存*/ p=h; /*移动指针从头指针开始*/ while(p!=NULL) /*如 p 不为空*/ fwrite(p,sizeof(STUDENT),1,fp); /*写入一条记录*/ p=p-next; /*指针后移*/ fclose(fp); /*关闭文件*/ printf(-Save success!-n); /*显示保存成功*/ /*导入信息模块*/ STUDENT *load() STUDENT *p,*q,*h=NULL; /*定义记录指针变量*/ FILE *fp; /* 定义指向文件的指针*/ char infile20; /*保存文件名*/ printf(Enter infile name,for example G:f1score.txt:n); scanf(%s,infile); /*输入文件名*/ if(fp=fopen(infile,rb)=NULL) /*打开一个二进制文件,为读方式*/ printf(Can not open filen); /*如不能打开,返回头指针*/ return h; printf(n -Loading file!-n); p=(STUDENT *)malloc(sizeof(STUDENT); /*申请空间*/ if(!p) printf(Out of memory!n); /*如没有申请到,则内存溢出*/ return h; /*返回空头指针*/ h=p; /*申请到空间,将其作为头指针*/ while(!feof(fp) /*循环读数据直到文件尾结束*/ if(1!=fread(p,sizeof(STUDENT),1,fp) break; /*如果没读到数据,跳出循环*/ p-next=(STUDENT *)malloc(sizeof(STUDENT); /*为下一个结点申请空间*/ if(!p-next) printf(Out of memory!n); /*如没有申请到,则内存溢出*/ return h; q=p; /*保存当前结点的指针,作为下一结点的前驱*/ p=p-next; /*指针后移,新读入数据链到当前表尾*/ q-next=NULL; /*最后一个结点的后继指针为空*/ fclose(fp); /*关闭文件*/ printf(Load success!n); return h; /*返回头指针*/ /*单科排序模块*/STUDENT *sort1(STUDENT *h) int i=0,j; /*用来保存名次*/STUDENT *p,*q,*t,*h1; /*定义临时指针*/printf(Enter according to which the number of courses to be sorted :(0.sc1 1.sc2 2.sc3)n);/*选择指定所要的单科成绩进行排序(0,1,2) */ scanf(%d, /*进行选择*/h1=h-next; /*将原表的头指针所指的下一个结点作头指针*/h-next=NULL; /*断开原来链表头结点与其它结点的连接*/while(h1!=

温馨提示

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

评论

0/150

提交评论