C语言课程设计_第1页
C语言课程设计_第2页
C语言课程设计_第3页
C语言课程设计_第4页
C语言课程设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、课程名称 C语言课程设计 课题名称 学生成绩管理 专 业班 级学 号姓 名指导教师湖南工程学院课 程 设 计 任 务 书课程名称 C语言课程设计 课 题 学生成绩管理 专业班级 学生姓名 学 号 指导老师 审 批 任务书下达日期 任务完成日期 目录一、 课程设计内容与主要功能 .4二、 课题分析 .6三、 主要功能的实现步骤 .7四、 程序测试.13调试分析与结论.21五、 总结 .22六、 附件 .23一、 课题设计内容与主要功能程序设计内容对一个班级的学生,每个学生有N门课程。该系统实现对班级成绩的录入、显示、删除、查找、添加、计算、修改、排序、保存等操作的管理。设计思想结构化程序设计一般

2、由两部分组成:算法和数据结构,合理地选择和实现一个数据结构与处理这些数据结构具有同样的重要性。数据结构在本课题中,每个学生的成绩门数用先预先定义一个常数N表示。将学生的信息:学号、姓名、成绩、总分、平均分、名次。定义成如下的数据结构:#define N 3typedef struct s1char no 11; /*学号*/char name16; /*姓名*/int scoreN; /*成绩*/float sum; /*总分*/float average; /*平均分*/int order; /*名次*/struct s1 next;/*指向后继结点的指针*/(2)main()主函数主函数是

3、程序的入口,采用模块化设计,主函数不宜复杂,功能尽量在各模块中实现。首先声明一些必要的变量,然后作一无限循环程序,循环体为一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。menu_select()主菜单制作一个单边框的窗口,窗口背景为蓝色,在窗口中显示光带主菜单,字体颜色为黄色,同时光标默认定位在第一项菜单上,用光标的上下移动即可选中所需选项,选中项背景不绿色,按回车键后进入相应的功能函数,而不必输入数,真正具有了窗口的特性,方便了操作。利用函数bioskey()

4、识别按了什么键,根据光标停留在窗口的行数换算成对应的菜单项,作为菜单函数的返回值。init()初始化初始化单链表。enter()录入记录输入学生信息,按照提示信息输入学号(字符串不超过10位)、姓名(字符串不超过15位)、三门课程成绩(整数0-100),每输入一个数就按一下回车键,进行下一个数的输入,当在输入学号首字符为时结束输入,返回主函数。list()显示所有记录学生成绩信息录入好后,更频繁的操作是显示和查找记录,本函数实现学生信息的显示功能。delete(); /*删除记录*/删除指定学号的学生记录。首先输入要删除学生记录的学号,输入后判断该学生是否存在,如果不存在,则输出没找到的提示信

5、息;否则,显示找到的学生信息,按任意键后进行该学生信息的删除。search(); /*查找记录*/按照学生姓名查找学生信息,如果查找成功,则显示信息,否则显示提示没找到的信息。姓名是字符串,比较功能利用字符串比较函数strcmp()实现。add(); /*添加记录*/添加记录函数的功能是将新的记录紧跟在原来所有信息记录的后面进行添加,添加一个学生后。computer(); /*计算总分和均分*/该功能是计算所有学生成绩的总分和平均分。void sort(); /*排序*/对于学生成绩的管理,一个很重要的运算是将学生按照分数由高到低排名,本函数实现按照总分排序功能,最后根据排序后学生信息的排列顺

6、序,将每个学生名次写入order的当中。本程序利用数组和指针完成对学生成绩的动态管理,其基本功能模块图如图21所示。主程序初始化输入显示删除查找添加计算排序退出图2-1基本功能模块通过实现学生成绩管理,了解数据库管理的基本功能,掌握C语言中的数组、指针、函数(系统函数、自定义函数)等知识,是一个C语言知识的比较综合应用。二、课题分析(分析课程设计项目的实现方法,并写出类声明与核心算法实现代码)。该系统是一个简单的学生挡案管理系统,能够使学生了解到相应的信息。同时也减少了老师的工作量。整个系统除了主函数外,另外还有五个函数,实现五大功能:插入功能、显示功能、查找功能、修改功能、删除功能。该系统的

7、插入功能可以每次可以任意插入一位学生的学生信息;显示功能可以任意显示一名或多名学生信息;查找功能分为学号查找和姓名查找两种查找方式;删除功能和修改功能进入这两个系统时可选择进行学号对比和姓名对比两种方式。该系统操作简单,这也利于管理人员进行实际的操作。 主要流程结构学生成绩管理系统成绩录入 成绩显示成绩删除成绩查找成绩添加成绩排序退出系统三、主要功能的实现步骤 输入记录函数 这是一个无参函数,用来执行第学生成绩记录的输入,函数结束后,带回一个指链表头的指针向r。将下一个学生的信息插在表头。N-S流程图如下:r=l;s=l->next;指针 l->next 指向新开辟的单元指针 l-

8、>next r是否为空是否输入学号num输出strcmp(num,”0”)是否为0内存是否溢出 输入姓名停止while(s)输入输入成绩返回p->data.grade;菜单 ;p->data.ave=p->data.totle / 4;p->next=NULL; r->next=p; r=p;显示记录函数 void Disp(link l)这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p

9、指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。N-S流程图如下: p=l->next,使指向第一个结点 输出p所指向的结点p->next指向一下个结点当p指的不是表尾保存数据到文件函数 void Save(link l)这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。查找记录函数 void Qur(link l)这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。算法:采用线性查找法往下一个结点查找。输入所要查找的学

10、生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。结构流程图如下:开始Void find()打开文件选择查找方式学号查找姓名查找Strcmp(NO,stui.number)Strcmp(name,)输出学生信息输出学生信息输出错误输出错误结束查找程序保存关闭文件结束删除函数 Del(link l)这是一个有返回值的有参函数。形参为“链表头的指针”,在核对密码后。实现对所要删除学生按学号进行查找。找到后显示该学生的信息。按任意键进行删除。

11、算法:主函数链表的头指针,用一个输出语句printf("Input your password:");提示用户输入密码。在输入过程中如果需要用到退格。putchar(8);putchar(' '); putchar(8);来达到视觉和功能上的要求。如果密码错误,则两秒后自动返回主菜单。正确后输入要删除的学生学号,进行删除。开始打开文件void Del(Link l)输入所需删除学生信息的学生的学号删除该学生的信息之后,把所有该学生以后的学生信息都复制给前面一个学生的学生信息,来填补空位该学生档案管理系统中不存在此学号,不做任何处理。结束删除程序关闭保存文件S

12、tcmp(num,stui.number)修改函数 void Modify(link l)这是一个有参函数,一个是“链表头的指针”修改之后,并返回链表的头指针。算法:首先向系统申请一块空间,用于存放输入的信息。程序会根据用户输入的学号。采用线性查找法往下一个结点查找。设一个指针变量p,先指向第一个结点,当strcmp(p->) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。如果有该学生就修改。并出现提示信息"资料修改成功"。如果没有该学生则出现“没有资料可以修改!”。结构流程图如下开始Void modify()打开

13、文件输入要修改的学生信息的学生的学号Stcmp(num,stui.number)修改该学生所需修改的学生信息无该学生学号,系统不作任何修改结束对学生信息的修改程序关闭保存文件结束定位链表函数:Node* Locate(Link l,char findmess,char nameornumber)这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。排序函数 void Sort (link l)这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。四、程序测试与结论(应包括课程设计程序的屏幕显示,并加以简单的文字说明)。1、开始运行页

14、面如图1所示 图12、输入学生信息数据页面如图2所示图23、删除记录页面如图3所示图34、查找全部记录页面如图4所示图45、查找记录页面如图5所示图56、保存文件页面如图6所示图67、读文件页面如图7所示图78、计算总分和平均分页面如图8所示图89、插入记录页面如图9所示图910、复制文件如图10所示图1011、为所有学生排序页面如图11所示图1112、追加记录页面如图12图1213、索引成功页面如图13所示图1314、分类合计页面如图14图14调试分析与结论:五、总结六、附件(所有程序的原代码,要求对程序写出必要的注释)。/*xuesheng.c*/*头文件(.h)*/#include &q

15、uot;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 /*定义常数*/typedef struct z1 /*

16、定义数据结构*/ char no11; char name15; int scoreN; float sum; float average; int order; struct z1 *next; STUDENT;/*以下是函数原型*/STUDENT *init(); /*初始化函数*/STUDENT *create(); /*创建链表*/STUDENT *delete(STUDENT *h); /*删除记录*/void print(STUDENT *h); /* 显示所有记录*/void search(STUDENT *h); /*查找*/void save(STUDENT *h); /*保

17、存*/STUDENT *load(); /*读入记录*/void computer(STUDENT *h); /*计算总分和均分*/STUDENT *insert(STUDENT *h); /*插入记录*/void append(); /*追加记录*/STUDENT *sort(STUDENT *h); /*排序*/int menu_select(); /*菜单函数*/*主函数开始*/main() int i; STUDENT *head; /*链表定义头指针*/ head=init(); /*初始化链表*/ clrscr(); /*清屏*/ for(;) /*无限循环*/ switch(me

18、nu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ /*值不同,执行的函数不同,break 不能省略*/ case 0:head=init();break; /*执行初始化*/ case 1:head=create();break; /*创建链表*/ case 2:head=delete(head);break; /*删除记录*/ case 3:print(head);break; /*显示全部记录*/ case 4:search(head);break; /*查找记录*/ case 5:save(head);break; /*保存文件*/ case 6:head=lo

19、ad(); break; /*读文件*/ case 7:computer(head);break; /*计算总分和均分*/ case 8:head=insert(head); break; /*插入记录*/ case 9:head=sort(head);break; /*排序*/ case 10:append();break; /*追加记录*/ case 11:exit(0); /*如菜单返回值为14程序结束*/ /*菜单函数,返回值为整数*/menu_select() char *menu="*MENU*", /*定义菜单字符串数组*/ " 0. init li

20、st", /*初始化*/ " 1. Enter list", /*输入记录*/ " 2. Delete a record from list", /*从表中删除记录*/ " 3. print list ", /*显示单链表中所有记录*/ " 4. Search record on name", /*按照姓名查找记录*/ " 5. Save the file", /*将单链表中记录保存到文件中*/ " 6. Load the file", /*从文件中读入记录*/ &

21、quot; 7. compute the score", /*计算所有学生的总分和均分*/ " 8. insert record to list ", /*插入记录到表中*/ " 9. sort to make new file", /*排序*/ " 10. append record to file", /*追加记录到文件中*/ " 11. Quit" /*退出*/ char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ gotoxy(1,25); /*移动光标*/ pr

22、intf("press any key enter menu.n"); /*压任一键进入主菜单*/ getch(); /*输入任一键*/ clrscr(); /*清屏幕*/ gotoxy(1,1); /*移动光标*/ textcolor(YELLOW); /*设置文本显示颜色为黄色*/ textbackground(BLUE); /*设置背景颜色为蓝色*/ gotoxy(10,2); /*移动光标*/ putch(0xc9); /*输出左上角边框*/ for(i=1;i<44;i+) putch(0xcd); /*输出上边框水平线*/ putch(0xbb); /*输

23、出右上角边框 */ for(i=3;i<20;i+) gotoxy(10,i);putch(0xba); /*输出左垂直线*/ gotoxy(54,i);putch(0xba); /*输出右垂直线*/ gotoxy(10,20);putch(0xc8); /*输出左上角边框*/ for(i=1;i<44;i+) putch(0xcd); /*输出下边框水平线*/ putch(0xbc); /*输出右下角边框*/ window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); /*清屏*/ for(i=0;i<13;i+) /*输

24、出主菜单数组*/ gotoxy(10,i+1); cprintf("%s",menui); textbackground(BLACK); /*设置背景颜色为黑色*/ window(1,1,80,25); /*恢复原窗口大小*/ gotoxy(10,21); /*移动光标*/ do printf("n Enter you choice(014):"); /*在菜单窗口外显示提示信息*/ scanf("%s",s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ while(c<0|c>11);

25、 /*选择项不在014之间重输*/ 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 N

26、ULL; /*返回空指针*/ inputs("enter no:",info->no,11); /*输入学号并校验*/ if(info->no0='') break; /*如果学号首字符为则结束输入*/ inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/ printf("please input %d score n",N); /*提示开始输入成绩*/ s=0; /*计算每个学生的总分,初值为0*/ for(i=0;i<3;i+) /*3门课程

27、循环3次*/ scanf("%d",&info->scorei);while(info->scorei<0 | info->scorei>100); s=s+info->scorei; /*累加各门成绩*/ info->sum=s; /*将总分保存*/ info->average=(float)s/3; /*先用强制类型转换将s转换成float型,再求平均值*/ info->order=0; /*未排序前此值为0*/ info->next=h; /*将头结点做为新输入结点的后继结点*/ h=info; /*

28、新输入结点为新的头结点*/ return(h); /*返回头指针*/*输入字符串,并进行长度验证*/inputs(char *prompt, char *s, int count) char p255; do printf(prompt); /*显示提示信息*/ scanf("%s",p); /*输入字符串*/ if(strlen(p)>count)printf("n too long! n"); /*进行长度校验,超过count值重输入*/ while(strlen(p)>count); strcpy(s,p); /*将输入的字符串拷贝到字

29、符串s中*/*输出链表中结点信息*/void print(STUDENT *h) int i=0; /* 统计记录条数*/ STUDENT *p; /*移动指针*/ clrscr(); /*清屏*/ p=h; /*初值为头指针*/ printf("nnn*STUDENT*n"); printf("|rec|nO | name | sc1| sc2| sc3| sum | ave |order|n"); printf("|-|-|-|-|-|-|-|-|-|n"); while(p!=NULL) i+; printf("|%3

30、d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n", i, p->no,p->name,p->score0,p->score1,p->score2,p->sum,p->average,p->order); p=p->next; printf("*end*n");/*删除记录*/STUDENT *delete(STUDENT *h) STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/ char c; char s11; /*存放学号

31、*/ clrscr(); /*清屏*/ printf("please deleted non"); /*显示提示信息*/ scanf("%s",s); /*输入要删除记录的学号*/ q=p=h; /*给q和p赋初值头指针*/ while(strcmp(p->no,s) &&q!= NULL) /*当记录的学号不是要找的,或指针不为空时*/ q=p; /*将p指针值赋给q作为p的前驱指针*/p=p->next; /*将p指针指向下一条记录*/ if(strcmp(p->no,s)=0) /*学号找到了*/ printf(&

32、quot;*FOUND*n"); printf("-n"); printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |n"); printf("-n"); printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|n",p->no,p->name,p->score0,p->score1,p->score2,p->sum,p->average,

33、p->order); printf("-n"); printf("*END*n"); printf("Are you sure to delete the student Y/N ?"); /*提示是否要删除,输入Y删除,N则退出*/ for(;) scanf("%c",&c); if(c='n'|c='N') break; /*如果不删除,则跳出本循环*/ if(c='y'|c='Y') if(p=h) /*若p=head,说明被删结点

34、是首结点*/ h=p->next; /*把第二个结点地址赋予head*/ else q->next=p->next; /*否则将一下结点地址赋给前一结点地址*/ /* n=n-1;*/ printf("nNum %s student have been deleted.n",s); printf("Don't forget to save.n");break; /*删除后就跳出循环*/ else printf("nThere is no num %s student on the list.n",s); /*

35、找不到该结点*/return(h);/*/ if(p=NULL) /*如果p为空,说明链表中没有该结点*/ printf("nlist no %s studentn",s); else /*p不为空,显示找到的记录信息*/ printf("*have found*n"); printf("|no | name | sc1| sc2| sc3| sum | ave |order|n"); printf("|-|-|-|-|-|-|-|-|n"); printf("|%-10s|%-15s|%4d|%4d|%

36、4d| %4.2f | %4.2f | %3d |n", p->no, p->name,p->score0,p->score1,p->score2,p->sum, p->average,p->order); printf("*end*n"); getch(); /*压任一键后,开始删除*/ if(p=h) /*如果p=h,说明被删结点是头结点*/ h=p->next; /*修改头指针指向下一条记录*/ else q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/ f

37、ree(p); /*释放p所指结点空间*/ printf("n have deleted No %s studentn",s); printf("Don't forget saven");/*提示删除后不要忘记保存文件*/ return(h); /*返回头指针*/*查找记录*/void search(STUDENT *h) STUDENT *p; /* 移动指针*/ char s15; /*存放姓名的字符数组*/ clrscr(); /*清屏幕*/ printf("please enter name for searchn")

38、; scanf("%s",s); /*输入姓名*/ p=h; /*将头指针赋给p*/ while(strcmp(p->name,s)&&p!=NULL) /*当记录的姓名不是要找的,或指针不为空时*/ p=p->next; /*移动指针,指向下一结点*/ if(p=NULL) /*如果指针为空*/ printf("nlist no %s studentn",s); /*显示没有该学生*/ else /*显示找到的记录信息*/ printf("nn*havefound*n"); printf("|n

39、O | name | sc1| sc2| sc3| sum | ave |order|n"); printf("|-|-|-|-|-|-|-|-|n"); printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |n", p->no,p->name,p->score0,p->score1,p->score2,p->sum,p->average,p->order); printf("*end*n"); /*插入记录*/STUDE

40、NT *insert(STUDENT *h) STUDENT *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/ char s11; /*保存插入点位置的学号*/ int s1,i; printf("please enter location before the non"); scanf("%s",s); /*输入插入点学号*/ printf("nplease new recordn"); /*提示输入记录信息*/ info=(STUDENT *)malloc(sizeof(STUDENT); /*申

41、请空间*/ if(!info) printf("nout 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; /*保存新记录的总分,初值为0*/ for(i=0;i<N;i+) /*N门课程循环N次输入成绩*/ do /*对数据进行验证,保证在0100之间*/ printf("score%d:",i+1); scanf("%d",&info->scorei); if(info->scorei>100|info->scorei<0) printf("bad data,repeat inputn"); while(info->scorei>100

温馨提示

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

最新文档

评论

0/150

提交评论