高级语言课程设计说明书_第1页
高级语言课程设计说明书_第2页
高级语言课程设计说明书_第3页
高级语言课程设计说明书_第4页
高级语言课程设计说明书_第5页
已阅读5页,还剩16页未读, 继续免费阅读

下载本文档

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

文档简介

1、高级语言(C语言)课程设计说明书起止日期: 2012 年 07 月 2 日 至 2012 年 07 月 14 日题目学生成绩管理系统学生姓名十月走班级电子信息工程1101班学号xxxxxxxxxxxxxxxx成绩优秀通信与信息工程学院说明书撰写提纲一、 课程设计要求课程设计系统组成及模块功能:学生成绩管理是教学管理中的一项重要内容,主要包括成绩的录入、显示、查询和统计四大模块。各主要模块的功能如下:a) 录入模块通过键盘录入某同学的学号,姓名,3门课成绩。b) 显示模块显示所有录入的成绩。c) 查询模块查询相关同学的成绩。d) 统计模块计算全部同学的总分和平均分。 设计要求: (1)界面菜单主

2、菜单,具体要求如下: *MENU*" 1. Enter list /*输入记录*/ 2. Delete a record from list /*从表中删除记录*/ 3. print list /*显示单链表中所有记录*/ 4. Search record on name /*按照姓名查找记录*/ 5. compute the score /*计算所有学生的总分和均分*/ 6. sort by score /*排序*/ 7. Quit /*退出*/ (2)需要定义多个函数对应菜单/*以下是函数原型对应以上菜单*/STUDENT *create(); /*输入记录*/STUDENT *

3、delete(STUDENT *h); /*删除记录*/void print(STUDENT *h); /*显示所有记录*/void search(STUDENT *h); /*查找*/void computer(STUDENT *h); /*计算总分和均分*/STUDENT *sort(STUDENT *h); /*排序*/int menu_select(); /*菜单函数*/ (3) 要求设计流程图(4) 要求功能框图(5)代码二、程序的功能设计开始主界面输入数字1234567输入删除数据打印列表查找数据求总成绩排序输入数据是否为零?退出结束NY三、 程序的数据结构主要功能的实现函数明细:

4、整个系统除了主函数外,另外还有14个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下:主函数 main()利用无限次循环for(;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。菜单选择函数 int menu_select()这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,再自行返回该函数。初始化函数 STUDENT *init()这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head的

5、值为NULL和一个清屏语句。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!输入记录函数 STUDENT *create()这是一个无参函数,用来执行第学生成绩记录的输入,当学生为时停止输入,函数结束后,带回一个指链表头的指针向head。将下一个学生的信息插在表头。显示记录函数 void print(STUDENT *h)这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针

6、(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。查找记录函数 void search(STUDENT *h)这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。算法:采用线性查找法往下一个结点查找。输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。删除记录函数 STUDENT *delete(STUDENT *h)这是一个有返回值的有参函数。形

7、参为“链表头的指针”,在核对密码后。实现对所要删除学生按学号进行查找。找到后显示该学生的信息。按任意键进行删除。算法:主函数链表的头指针,用一个输出语句printf("Input your password:");提示用户输入密码。在输入过程中如果需要用到退格。putchar(8);putchar(' '); putchar(8);来达到视觉和功能上的要求。如果密码错误,则两秒后自动返回主菜单。正确后输入要删除的学生学号,进行删除。N-S流程图如下: 传递头指针;输入密码;否 密码正确 是 输入要删除学生的学号 printf("Password 有

8、该学生信息is mistake 否 是 Tow seconds to return!"); printf( 显示该学生信息"Password is 按任意键确认删除 mistake Tow seconds to printf("n have deleted No %s studentn",s); return!"); printf("Don't forget saven");sleep(2);clrscr();修改函数 STUDENT *Modify(STUDENT *h)这是一个有参函数,一个是“链表头的指针”修改

9、之后,并返回链表的头指针。算法:首先向系统申请一块空间,用于存放输入的信息。程序会根据用户输入的学号。采用线性查找法往下一个结点查找。设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。如果有该学生就修改。并出现提示信息"*Modify success!*"。如果没有该学生则出现“*Find out No.%s student*”提示。并2秒后返回主菜单。N-S流程图如下:q=head原来的链表是空表是否2秒后当记录的学号不是要找的,或指针不为空时

10、返回主菜单info指向q位置 q向后移一个结点!strcmp(p->no,info->no)是 否printf("Don't forget saven") info->next=p->next; q->next=info;按部分排序函数 STUDENT *sort(STUDENT *head)这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。N-S流程图:temp=head->next,head->next=NULL 当temp!=NULL时t=temp;temp=temp->n

11、ext;p1=head;p2=head;当t->average<p1->average&&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;输出“排序成功”四、 程序的函数设计1. 函数的功能描述1) 程序的模块组成: 主 函 数: int main() 新建函数:STUDENT *init() 输入函数 :STUDENT *create()

12、 显示函数: void print(STUDENT *h) 删除函数: STUDENT *delete(STUDENT *h) 按名字寻找函数: void search(STUDENT *h)按总分排序函数: STUDENT *sort(STUDENT *h) 计算总分和均分函数: void computer(STUDENT *h)修改函数: STUDENT *Modify(STUDENT *head,STUDENT *new) 按学号排序函数: STUDENT *index(STUDENT *h) 菜单函数:int menu_select()2) 各个函数的主要功能: 输入函数: 随时输入数

13、据。 菜单函数:显示系统主菜单。 显示函数: 显示所有学生的信息。 寻找函数: 方便学生查找自己的成绩。 删除函数: 删除某学生的信息。 排序函数: 按总成绩排序。 按学号排序函数: 按学号排序。插入函数: 可以插入新的信息。函数的调用关系源文件函数名或其他成分功 能student.hmain总控函数menu_select菜单选择handle_menu菜单处理newRecords新建学生信息记录quit结束运行add_disp.cshowTable打印表头getIndex按升序排序的位置addRecord在表尾追加信息display显示信息que_remv_modi.cremoveRecord

14、删除制定的记录findRecord查找制定的记录queryInfo查找制定学生的信息copyRecord复制记录modifyRecord修改制定学生信息save_loadsave_loadsave文件储存load文件读取sort.csortInfo排序student.h常数提供常数结构声明学生成绩结构库函数及函数原型声明引用库函数及函数五、 源程序代码#include <malloc.h>#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct scorenode)#define DEBUG

15、#include <string.h>struct scorenodeint number;/*学号*/char name10;/*姓名*/float yuwen;/*语文成绩*/float yingyu;/*英语成绩*/float shuxue;/*数学成绩 */float zongfen;/*个人总分*/struct scorenode *next;typedef struct scorenode score;int n,k;/*n,k为全局变量,本程序中的函数均可以使用它*/*=*/score *creat2311(void)/*函数creat2311,功能:创建链表,此函数

16、带回一个指向链表头的指针*/score*head;score *p1,*p2,*p3,*max;int i,j;float fen; char t10; n=0; p1=p2=p3=(score *)malloc(LEN);head=p3; /*开辟一个新单元*/ printf("请输入学生资料,输0退出!n");repeat1: printf("请输入学生学号(学号应大于0):");/*输入学号,学号应大于0*/ scanf("%d",&p1->number); while(p1->number<0) ge

17、tchar(); printf("输入错误,请重新输入学生学号:"); scanf("%d",&p1->number); /*输入学号为字符或小于0时,程序报错,提示重新输入学号*/ if(p1->number=0) goto end;/*当输入的学号为0时,转到末尾,结束创建链表*/ else p3=head; if(n>0) for(i=0;i<n;i+) if(p1->number!=p3->number) p3=p3->next; else printf("学号重复,请重输!n"

18、;); goto repeat1; /*当输入的学号已经存在,程序报错,返回前面重新输入*/ printf("请输入学生姓名:"); scanf("%s",&p1->name);/*输入学生姓名*/ printf("请输入语文成绩(0100):");/*输入语文成绩,成绩应在0-100*/ scanf("%f",&p1->yuwen); while(p1->yuwen<0|p1->yuwen>100)getchar(); printf("输入错误,请重新

19、输入语文成绩");/*输入错误,重新输入语文成绩直到正确为止*/ scanf("%f",&p1->yuwen); printf("请输入英语成绩(0100):");/*输入英语成绩,成绩应在0-100*/ scanf("%f",&p1->yingyu); while(p1->yingyu<0|p1->yingyu>100)getchar(); printf("输入错误,请重新输入英语成绩");/*输入错误,重新输入英语成绩直到正确为止*/ scanf(&

20、quot;%f",&p1->yingyu); printf("请输入数学成绩(0100):");/*输入数学成绩,成绩应在0-100*/ scanf("%f",&p1->shuxue); while(p1->shuxue<0|p1->shuxue>100)getchar(); printf("输入错误,请重新输入数学成绩"); scanf("%f",&p1->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/ head=NULL

21、;while(p1->number!=0) n=n+1;if(n=1) head=p1;else p2->next=p1; p2=p1; p1=(score *)malloc(LEN); printf("请输入学生资料,输0退出!n");repeat2:printf("请输入学生学号(学号应大于0):"); scanf("%d",&p1->number);/*输入学号,学号应大于0*/ while(p1->number<0) getchar(); printf("输入错误,请重新输入学生

22、学号:"); scanf("%d",&p1->number); /*输入学号为字符或小于0时,程序报错,提示重新输入学号*/ if(p1->number=0) goto end;/*当输入的学号为0时,转到末尾,结束创建链表*/ else p3=head; if(n>0) for(i=0;i<n;i+) if(p1->number!=p3->number) p3=p3->next; else printf("学号重复,请重输!n"); goto repeat2; /*当输入的学号已经存在,程序报

23、错,返回前面重新输入*/ printf("请输入学生姓名:"); scanf("%s",&p1->name);/*输入学生姓名*/ printf("请输入语文成绩(0100):"); scanf("%f",&p1->yuwen);/*输入语文成绩,成绩应在0-100*/ while(p1->yuwen<0|p1->yuwen>100) getchar(); printf("输入错误,请重新输入语文成绩"); scanf("%f&quo

24、t;,&p1->yuwen);/*输入错误,重新输入语文成绩直到正确为止*/ printf("请输入英语成绩(0100):"); scanf("%f",&p1->yingyu);/*输入英语成绩,成绩应在0-100*/ while(p1->yingyu<0|p1->yingyu>100) getchar(); printf("输入错误,请重新输入英语成绩"); scanf("%f",&p1->yingyu);/*输入错误,重新输入英语成绩直到正确为止

25、*/ printf("请输入数学成绩(0100):"); scanf("%f",&p1->shuxue);/*输入数学成绩,成绩应在0-100*/ while(p1->shuxue<0|p1->shuxue>100) getchar(); printf("输入错误,请重新输入数学成绩"); scanf("%f",&p1->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/ end: p1=head; p3=p1; for(i=1;i<n;i+)

26、for(j=i+1;j<=n;j+) max=p1; p1=p1->next; if(max->number>p1->number) k=max->number; max->number=p1->number; p1->number=k; /*交换前后结点中的学号值,使得学号大者移到后面的结点中*/ strcpy(t,max->name); strcpy(max->name,p1->name); strcpy(p1->name,t); /*交换前后结点中的姓名,使之与学号相匹配*/ fen=max->yuwen

27、; max->yuwen=p1->yuwen; p1->yuwen=fen; /*交换前后结点中的语文成绩,使之与学号相匹配*/ fen=max->yingyu; max->yingyu=p1->yingyu; p1->yingyu=fen; /*交换前后结点中的英语成绩,使之与学号相匹配*/ fen=max->shuxue; max->shuxue=p1->shuxue; p1->shuxue=fen; /*交换前后结点中的数学成绩,使之与学号相匹配*/ max=head;p1=head;/*重新使max,p指向链表头*/ p

28、2->next=NULL;/*链表结尾*/ printf("输入的学生数为:%d个!n",n); return(head);/*=*/*=*/score *load2311(score *head)/*函数load2311,功能:从文件读入学生记录*/ score *p1,*p2; int m=0; char filepn10; FILE *fp; printf("请输入文件路径及文件名:"); scanf("%s",filepn);/*输入文件路径及名称*/ if(fp=fopen(filepn,"r+")

29、=NULL) printf("不能打开文件!n"); return 0; fscanf(fp," 学生成绩管理系统 n"); fscanf(fp,"作者:李鹏超 班级: 电信1101班 学号:1107050113 n"); fscanf(fp,"-n"); fscanf(fp,"|学号t|姓名t|语文t|英语t|数学t|n"); fscanf(fp,"-n");/*读入表格域*/ printf(" 学生成绩管理系统 n"); printf(" 作

30、者:李鹏超 班级: 电信1101班 学号:1107050113 n"); printf("-n"); printf("|学号t|姓名t|语文t|英语t|数学t|n"); printf("-n");/*打印表格域*/ m=m+1; if(m=1) p1=(score *)malloc(LEN); /*开辟一个新单元*/ fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->yuwen,&p1->yingyu,&

31、;p1->shuxue); printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue); /*文件读入与显示*/ head=NULL; do n=n+1; if(n=1) head=p1; else p2->next=p1; p2=p1; p1=(score *)malloc(LEN); /*开辟一个新单元*/ fscanf(fp,"%d%s%f%f%fn",&p1->numbe

32、r,p1->name,&p1->yuwen,&p1->yingyu,&p1->shuxue); printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue); /*文件读入与显示*/ while(!feof(fp); p2->next=p1; p1->next=NULL; n=n+1; printf("-n");/*表格下线*/ fclose(fp

33、);/*结束读入,关闭文件*/ return (head);/*=*/*=*/score *add2311(score *head,score *stu)/*函数add2311,功能:追加学生资料,并且将所有学生资料按学号排序*/score *p0,*p1,*p2,*p3,*max; int i,j;float fen; char t10; p3=stu=(score *)malloc(LEN);/*开辟一个新单元*/ printf("n输入要增加的学生的资料!"); repeat4: printf("请输入学生学号(学号应大于0):"); scanf(

34、"%d",&stu->number); /*输入学号,学号应大于0*/ while(stu->number<0) getchar(); printf("输入错误,请重新输入学生学号:"); scanf("%d",&stu->number);/*输入错误,重新输入学号*/ /*/ if(stu->number=0) goto end2;/*当输入的学号为0时,转到末尾,结束追加*/ else p3=head; if(n>0) for(i=0;i<n;i+) if(stu->

35、number!=p3->number) p3=p3->next; else printf("学号重复,请重输!n"); goto repeat4; /*当输入的学号已经存在,程序报错,返回前面重新输入*/ /*/ printf("输入学生姓名:"); scanf("%s",stu->name); /*输入学生姓名*/ printf("请输入语文成绩(0100):"); scanf("%f",&stu->yuwen); /*输入语文成绩,成绩应在0-100*/ wh

36、ile(stu->yuwen<0|stu->yuwen>100) getchar(); printf("输入错误,请重新输入语文成绩"); scanf("%f",&stu->yuwen); /*输入错误,重新输入语文成绩直到正确为止*/ printf("请输入英语成绩(0100):"); scanf("%f",&stu->yingyu);/*输入英语成绩,成绩应在0-100*/ while(stu->yingyu<0|stu->yingyu>

37、;100) getchar(); printf("输入错误,请重新输入英语成绩"); scanf("%f",&stu->yingyu);/*输入错误,重新输入英语成绩直到正确为止*/ printf("请输入数学成绩(0100):"); scanf("%f",&stu->shuxue);/*输入数学成绩,成绩应在0-100*/ while(stu->shuxue<0|stu->shuxue>100) getchar(); printf("输入错误,请重新输

38、入数学成绩"); scanf("%f",&stu->shuxue);/*输入错误,重新输入数学成绩直到正确为止*/p1=head;p0=stu;if(head=NULL)head=p0;p0->next=NULL;/*当原来链表为空时,从首结点开始存放资料*/else/*原来链表不为空*/ if(p1->next=NULL)/*找到原来链表的末尾*/ p1->next=p0; p0->next=NULL;/*将它与新开单元相连接*/ else while(p1->next!=NULL)/*还没找到末尾,继续找*/ p2=

39、p1;p1=p1->next; p1->next=p0; p0->next=NULL; n=n+1;p1=head;p0=stu; for(i=1;i<n;i+) for(j=i+1;j<=n;j+) max=p1; p1=p1->next; if(max->number>p1->number) k=max->number; max->number=p1->number; p1->number=k; /*交换前后结点中的学号值,使得学号大者移到后面的结点中*/ strcpy(t,max->name); strc

40、py(max->name,p1->name); strcpy(p1->name,t); /*交换前后结点中的姓名,使之与学号相匹配*/ fen=max->yuwen; max->yuwen=p1->yuwen; p1->yuwen=fen; /*交换前后结点中的语文成绩,使之与学号相匹配*/ fen=max->yingyu; max->yingyu=p1->yingyu; p1->yingyu=fen; /*交换前后结点中的英语成绩,使之与学号相匹配*/ fen=max->shuxue; max->shuxue=p1

41、->shuxue; p1->shuxue=fen; /*交换前后结点中的数学成绩,使之与学号相匹配*/ max=head;p1=head;/*重新使max,p指向链表头*/ end2:printf("现在的学生数为:%d个!n",n); return(head);/*=*/*=*/score *search2311(score *head)/*函数search2311,功能:查询学生成绩*/int number;score *p1,*p2;printf("输入要查询的学生的学号,");scanf("%d",&num

42、ber);while(number!=0) if(head=NULL) printf("n没有任何学生资料!n");return(head); printf("-n"); printf("|学号t|姓名t|语文t|英语t|数学t|n"); printf("-n");/*打印表格域*/ p1=head; while(number!=p1->number&&p1->next!=NULL) p2=p1;p1=p1->next; if(number=p1->number) print

43、f("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->yuwen,p1->yingyu,p1->shuxue); printf("-n");/*打印表格域*/ else printf("%d不存在此学生!n",number); printf("输入要查询的学生的学号,"); scanf("%d",&number);printf("已经退出了!n");return(head);/*

44、=*/*=*/score *del2311(score *head)/*函数del2311,功能:删除学生资料*/score *p1,*p2;int number;printf("输入要删除的学生的学号(输入0时退出):");scanf("%d",&number);getchar();while(number!=0)/*输入学号为0时退出*/ if(head=NULL) printf("n没有任何学生资料!n"); return(head); p1=head; while(number!=p1->number&&

45、amp;p1->next!=NULL) /*p1指向的不是所要找的首结点,并且后面还有结点*/ p2=p1;p1=p1->next; /*p1后移一个结点*/ if(number=p1->number) /*找到了*/ if(p1=head) head=p1->next; /*若p1指向的是首结点,把地二个结点地址赋予head*/ else p2->next=p1->next; /*否则将下一个结点地址 赋给前一结点地址*/ printf("删除:%dn",number);n=n-1; else printf("%d不存在此学生

46、!n",number); /*找不到该结点*/ printf("输入要删除的学生的学号:"); scanf("%d",&number); getchar();#ifdef DEBUG printf("已经退出了!n");#endifprintf("现在的学生数为:%d个!n",n);return(head); /*=*/*=*/void print2311(score *head)/*函数print2311,功能:显示学生成绩*/score *p;if(head=NULL) printf(&quo

47、t;n没有任何学生资料!n");elseprintf("%dn",n);printf("-n");printf("|学号t|姓名t|语文t|英语t|数学t|n");printf("-n");/*打印表格域*/p=head; do printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue); printf("-n");/*打印表

48、格域*/ p=p->next;while (p!=NULL);/*打印完成了*/*=*/*=*/score *statistics2311(score *head) /*函数statistics2311,功能:统计学生成绩*/ float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min; score *p; int x,y=0,i=0; p=head; printf("1个人总分和平均分t2单科平均分t3总分最高分t4总分最低分n"); scanf("%d",&x); getchar();switch(x) /*用switch语句实现功能选择*/case 1: if(head=NULL) printf("n没有任何学生资料!

温馨提示

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

评论

0/150

提交评论