成绩管理.docx
《成绩管理.docx》由会员分享,可在线阅读,更多相关《成绩管理.docx(20页珍藏版)》请在冰豆网上搜索。
成绩管理
课程设计报告
课程名称C语言程序设计
课题名称班级成绩管理系统
专业通信工程
班级0801班
学号200803020111
姓名丰程
指导教师雷晓、乔汇东、谭小兰
2009年6月25日
湖南工程学院
课程设计任务书
课程名称C语言程序设计
课题销售管理系统
专业班级通信工程0801/0802
学生姓名丰程
学号200803020111
指导老师雷晓乔汇东谭小兰
审批
任务书下达日期2009年6月4日
任务完成日期2007年6月25日
一、设计内容与设计要求
1.设计内容:
⑴问题描述:
通过本系统实现对N个销售员信息的录入、显示、添加、删除,以及对产品销售额的排序等操作的管理。
⑵功能要求:
本程序利用数组和指针完成对销售记录的动态管理,其基本功能模块图如图所示:
①、本系统采用一个包含n个数据的结构体数组,每个数据的结构应当包括:
姓名、身份、产品1销售额、产品2销售额、总产品销售额。
②、本系统显示这样的菜单:
销售管理系统
a、销售员信息输入
b、销售员信息输出
c、销售员信息删除
d、销售员信息添加
e、销售额排序
f、统计产品销售额
g、保存销售额信息
h、退出系统
③、执行一个具体的功能之后,程序将重新显示菜单。
④、将系统信息保存到文件中。
⑶算法提示:
①、数据结构:
结构体类型数组。
②、数据库结构:
下表构成该系统的基本数据库。
姓名
身份
产品1销售额
产品1销售额
总产品销售额
char
int
int
int
int
⑷测试数据:
纪录数20
⑸其它
对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。
2.设计要求:
1).设计正确,方案合理。
2).界面友好,使用方便。
3).程序精炼,结构清晰。
4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5).实际操作过程中遇到的问题及解决方法:
设计总结及心得体会.
6).上机演示。
二、进度安排
第17周星期五08:
00——12:
00
熟悉这次课程设计的目的和课程设计的要求,明确了解一些要用到的文件和调用函数等,然后再把整个程序设计的总体框架、流程图等构思出来,并进行上机程序设计。
星期日08:
00——12:
00
14:
30——18:
30
机房上机,在计算机上编辑源程序。
调试程序,在改正错误的同时不断完善程序,使源代码满足课程设计的要求和实现课程设计的要求和实现课程设计的基本功能。
第18周星期一08:
00——12:
00
继续修改、编辑、调试程序。
不断改正错误后,要保证程序能成功编译成目标文件,链接成功成为可执行文件。
再运行能通过,这样才能算已经完成了本课题的基本功能。
之后,开始撰写课程设计报告。
星期日08:
00——12:
00
14:
30——18:
30
答辩,检查课设报告。
目录
一、课题的主要功能6
二、课题的功能模块的划分7
1、程序的抽象数据类型的定义7
2、程序的模块组成8
3、各函数的主要功能描述8
三、主要功能的实现9
1、各个函数的详细设计说明分别如下:
9
2、main函数的下属子功能函数及其调用示意图10
3、流程图10
四、程序调试11
五、总结11
七、附录12
评分表24
一、课题的主要功能
本程序利用数组和指针完成对销售记录的动态管理,其基本功能模块图如图所示:
①、本系统采用一个包含n个数据的结构体数组,每个数据的结构应当包括:
姓名、身份、产品1销售额、产品2销售额、总产品销售额。
②、本系统显示这样的菜单:
销售管理系统
i、销售员信息输入
j、销售员信息输出
k、销售员信息删除
l、销售员信息添加
m、销售额排序
n、查找销售记录
o、保存销售额信息
p、退出系统
③、将系统信息保存到文件中。
二、课题的功能模块的划分
1、程序的抽象数据类型的定义
typedefstruct_sale
{
intnum;
charname[20];
intmoney[2];
intsum;
struct_sale*next;
}SALE
2、序的模块组成以及各个模块的功能
2、程序的模块组成:
a)主函数main();
b)初始化函数SALE*init();
c)菜单选择函数intmenu_select();
d)输入函数SALE*create();
e)删除记录函数SALE*Delete(SALE*head);
f)产品总销售额排序函数SALE*sort(SALE*head);
g)添加记录函数SALE*insert(SALE*head);
h)显示全部记录函数voidprint(SALE*head);
i)保存数据到文件函数voidsave(SALE*head);
j)查找记录函数voidsearch(SALE*head)
main函数实现总的控制台界面,SALE*init(),intmenu_select(),SALE*create(),SALE*Delete(SALE*head),SALE*sort(SALE*head),SALE*insert(SALE*head),voidprint(SALE*head),voidsave(SALE*head)调用函数实现各种用户功能要求。
3、各函数的主要功能描述如下
SALE *init():
使链表初始化,使head的值为NULL.
intmenu_select():
主要实现“功能选择”的界面。
SALE*create():
,用来执行销售记录的输入,当销售员编号为0时停止输入,函数结束后,带回一个指向链表头的指针head。
voidprint(SALE*head):
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部销售记录的输出。
SALE*delete(STUDENT*head):
这是一个有参函数,形参为“链表头的指针”,先输入要删除的销售员记录的编号,找到后显示该销售员信息,等确认后便可按“Y”进行删除。
SALE*sort(STUDENT*head):
这是一个有参函数,形参为“链表头的指针”,按销售总额进行排序,顺序从低到高。
SALE*insert(SALE*head):
添加销售记录并返回。
voidsave(SALE*head):
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把销售记录保存在电脑上由自己任意命名的二进制文件。
三、主要功能的实现
1、各个函数的详细设计说明分别如下:
(1)主函数main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
(2)初始化函数SALE *init()
这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
(3)菜单选择函数intmenu_select();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的七大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。
等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!
以下是该界面:
(4)输入记录函数SALE*create()
这是一个无参函数,用来执行销售记录的输入,当销售员编号为0时停止输入,函数结束后,带回一个指向链表头的指针head。
算法:
先声明一个首节点head,并将head->next设为NULL。
每输入一个数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的尾端。
(5)删除记录函数SALE*delete(SALE*head)
这是一个有参函数,形参为“链表头的指针”,先输入要删除的销售记录的销售员编号,找到后显示该销售员信息,等确认后便可按“Y”进行删除。
算法:
从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个编号。
如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。
(6)排序函数SALE*sort(SALE*head)
这是一个有参函数,形参为“链表头的指针”,按销售总额高低进行排序,由低到高。
(7)添加函数SALE*insert(SALE*head)
添加销售记录。
(8)保存数据到文件函数SALE*insert(SALE*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把销售记录保存在电脑上由自己任意命名的二进制文件。
(9)显示全部记录函数voidprint(SALE*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部销售记录的输出。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
(10)关闭文件函数voidExit()。
2、main函数的下属子功能函数及其调用示意图:
3、流程图:
真
链表是一个空表假
输出
“空表”
p1=head
当num≠P1—>num以及p1所指的结点不是表尾结点
P2=p1(p2后移一个位置)
P1=p1->next(p1后移一个位置)
是p1是要删除的结点
否
是p1所指是
头结点否
Head=p1—>next
(删除头结点)
P2—>=next=
p1—>next
(删除一个结点)
四、程序调试
1、刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试得去执行显示功能,结果显示的是一些乱码!
加入初始化函数后,这种现象也随之消失。
2、刚开始执行输入函数,按学号顺序输入3个销售员的记录,输完后执行显示功能,销售员记录是按编号的反顺序显示的,试着在其中增加一些语句,希望能把编号按正常顺序显示,但暂时没有成功,所以在输入销售额时只能按编号反顺序输入,最后就按编号正常顺序输出了。
3、在输入函数中设了一个无限循环,可以输入无数个销售员记录信息,当比编号为0的时候则停止输入。
4、输入太多个销售员九路时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录,十七左右为最佳。
5、在输入选项时不能输入字母,否则会死循环,建议不要乱输字母。
五、总结
经过一个多星期的C语言课程设计,虽然感觉很困难,但也收获了不少。
首先链表上课只是大概讲了一下,但这个课程设计里面主要都是用链表,因为要达到这样的功能,使用链表相当方便,但不容易理解,所以在这方面我很了很多的时间看课本和参考课外书,使C语言的知识强化了不少。
其次,在做课程设计的过程中,发现了平时很多没有注意到的问题,例如:
返回值函数和不返回值函数两者在主函数中的调用是不同的…………
更重要的是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了C语言的重要性。
这个学生成绩管理系统都是在自己知识范围内完成的,所以界面清晰简单,可能不是很好看,但绝对实用!
从这里我也得到一个体会,做一个程序,或者开发一个软件,应该着重从它的后台制作入手,不能做出一个中看不中用的程序或者软件。
相信这次的课程设计为我以后继续从事计算机工作打了一个小小的开头。
由于这是第一次进行设计,写文档,难免会写得不好!
七、附录
源程序清单(带注释)
/*头文件*/
#include
#include
#include/*其它说明*/
#include/*字符串函数*/
#include/*内存操作函数*/
#include/*字符操作函数*/
#include/*动态地址分配函数*/
#defineLENsizeof(SALE)
typedefstruct_sale/*定义结构体数组用于缓存数据*/
{
intnum;
charname[20];
intmoney[2];
intsum;
struct_sale*next;
}SALE;
intn=0;/*代表销售员的数量*/
/*函数原型*/
SALE*create();/*创建链表*/
SALE*init();/*初始化函数*/
voidprint(SALE*head);/*显示全部记录*/
intmenu_select();/*菜单函数*/
SALE*sort(SALE*head);/*排序*/
SALE*Delete(SALE*head);/*删除记录*/
SALE*insert(SALE*head);/*添加记录*/
voidsave(SALE*head);/*保存文件*/
voidsearch(SALE*head);/*查找记录*/
voidExit()
{
return;
}
/*主函数界面*/
voidmain()
{
SALE*head;
head=init();/*链表初始化,使head的值为NULL*/
for(;;)/*循环无限次*/
{
switch(menu_select())
{
case1:
head=create();break;
case2:
print(head);break;
case3:
head=sort(head);break;
case4:
head=insert(head);break;/*&new表示返回地址*/
case5:
save(head);break;
case6:
head=Delete(head);break;
case7:
search(head);break;
case8:
exit(0);/*如菜单返回值为7则程序结束*/
}
}
}
/*初始化函数*/
SALE*init()
{
returnNULL;/*返回空指针*/
}
/*菜单选择函数*/
intmenu_select()
{intn;
printf("pressanykeytoenterthemenu......\n");/*按任一键进入主菜单*/
printf("*************************************MENU************************************\n");
printf("1.Entertherecord\n");/*输入售货员销售额记录*/
printf("2.Printtherecord\n");/*删除*/
printf("3.Sorttomakenewafile\n");/*排序*/
printf("4.Insertrecordtoalist\n");/*添加*/
printf("5.Savethefile\n");/*保存*/
printf("6.Deletearecord\n");/*显示*/
printf("7.Searchrecordonname\n");/*查找*/
printf("8.Quit\n");/*退出*/
printf("*****************************************************************************\n");
do{
printf("\nEnteryourchoice(1~8):
");
scanf("%d",&n);
}while(n<1||n>8);/*如果选择项不在1~8之间则重输*/
return(n);/*返回选择项,主函数根据该数调用相应的函数*/
}
/*输入函数*/
SALE*create()
{
SALE*head=NULL,*p;/*定义函数.此函数带回一个指向链表头的指针*/
for(;;)
{
p=(SALE*)malloc(LEN);/*开辟一个新的单元*/
printf("Enterthenum(0:
listend):
");
scanf("%d",&p->num);
if(p->num==0)break;/*如果销售员身份首字符为0则结束输入*/
printf("Enterthename:
");
scanf("%s",p->name);
printf("请输入第一个销售额\n");/*提示开始输入销售额*/
scanf("%d",&p->money[0]);
printf("请输入第二个销售额\n");/*提示开始输入销售额*/
scanf("%d",&p->money[1]);
p->sum=p->money[0]+p->money[1];/*将总销售额保存*/
p->next=head;/*将头结点做为新输入结点的后继结点*/
head=p;/*新输入结点为新的头结点*/
n++;
}
return(head);
}
/*删除记录函数*/
SALE*Delete(SALE*head)
{
SALE*p1,*p2;/*p1为查找到要删除的结点指针,p2为其前驱指针*/
ints;/*s用来存放销售员身份*/
charc;/*c用来输入字母*/
printf("Pleaseenterthedeletednum:
");
scanf("%d",&s);
p1=p2=head;/*给p1和p2赋初值头指针*/
while((p1->num!
=s)&&p1!
=NULL)/*当记录的身份不是要找的,或指针不为空时*/
{
p2=p1;/*将p1指针值赋给p2作为p1的前驱指针*/
p1=p1->next;/*将p1指针指向下一条记录*/
}
if(p1->num==s)/*身份找到了*/
{
printf("**************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("|Num|Name|sc1|sc2|Sum|\n");
printf("-------------------------------------------------------------------------------\n");
printf("|%4d|%4s|%3d|%3d|%3d|\n",p1->num,p1->name,p1->money[0],
p1->money[1],p1->sum);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
printf("AreyousuretodeletethesaleY/N?
");/*提示是否要删除,输入Y删除,N则退出*/
for(;;)
{
scanf("%c",&c);
if(c=='n'||c=='N')break;/*如果不删除,则跳出本循环*/
if(c=='y'||c=='Y')
{
if(p1==head)/*若p1==head,说明被删结点是首结点*/
head=p1->next;/*把第二个结点地址赋予head*/
else
p2->next=p1->next;/*否则将一下结点地址赋给前一结点地址*/
n--;
printf("\nNum%dsalehavebeendeleted.\n",s);
printf("Don'tforgettosave.\n");break;/*删除后就跳出循环*/
}
}
}
else
printf("\nThereisnonum%dsaleonthelist.\n",s);/*找不到该结点*/
return(head);
}
/*排序函数*/
SALE*sort(SALE*head)
{
unsignedintflag;
SALEsal,*p1,*p2,*p;
for(;;)
{
flag=1;
p=head;
p1=head;
p2=p1->next;
do
{
if((p1->sum)>(p2->sum))
{
sal.num=p1->num;
strcpy(sal.name,p1->name);
sal.money[0]=p1->money[0];
sal.money[1]=p1->money[1];
sal.sum=p1->sum;
p1->num=p2->num;
strcpy(p1->name,p2->name);
p1->money[0]=p2->money[0];
p1->money[1]=p2->money[1];
p1->sum=p2->sum;
p2->num=sal.num;
strcpy(p2->name,sal.name);
p2->money[0]=sal.money[0];
p2->money[1]=sal.money[1];
p2->sum=sal.sum;
flag=0;
}
p1=p1->next;
p2=p1->next;
}while(p2!
=NULL);
if(flag==1)
break;
}
p=head;
printf("success\n");
return(head);
}