班级成绩管理系统C课程设计任务书.docx
《班级成绩管理系统C课程设计任务书.docx》由会员分享,可在线阅读,更多相关《班级成绩管理系统C课程设计任务书.docx(17页珍藏版)》请在冰豆网上搜索。
![班级成绩管理系统C课程设计任务书.docx](https://file1.bdocx.com/fileroot1/2022-11/26/d5bbae54-0ed2-40bc-90fc-ccaca0becd94/d5bbae54-0ed2-40bc-90fc-ccaca0becd941.gif)
班级成绩管理系统C课程设计任务书
课程设计报告
课程名称C语言程序设计
课题名称班级成绩管理系统
专业通信工程
班级0801班
学号2008030201010
姓名殷燕玲
指导教师雷晓、乔汇东、谭小兰
2009年6月25日
湖南工程学院
课程设计任务书
课程名称C语言程序设计
课题班级成绩管理系统
专业班级通信工程0801
学生姓名殷燕玲
学号200803020109
指导老师雷晓、乔汇东、谭小兰
审批
任务书下达日期2009年6月4日
任务完成日期2007年6月25日
一、设计内容与设计要求
1.设计内容:
⑴问题描述:
通过该系统实现对通讯录信息进行录入、显示、修改、删除、插入、排序、保存等操作的管理。
⑵功能要求:
①、本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:
编号、姓名、电话号码、地址。
②、本系统显示这样的菜单:
请选择系统功能项:
a、通讯信息录入
b、通讯信息显示
c、通讯信息保存
d、通讯信息删除
e、通讯信息修改
f、通讯信息查询
Ⅰ、按编号查询
Ⅱ、按姓名查询
Ⅲ、按电话号码查询
g、退出系统
③、执行一个具体的功能之后,程序将重新显示菜单。
④、将通讯信息保存到文件中。
⑶算法提示:
①、数据结构:
结构体类型数组。
②、数据库结构:
下表构成该系统的基本数据库。
编号
姓名
电话号码
地址
char
char
Char
char
⑷测试数据:
纪录数20
⑸其它
对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。
2.设计要求:
1).设计正确,方案合理。
2).界面友好,使用方便。
3).程序精炼,结构清晰。
4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5).实际操作过程中遇到的问题及解决方法:
设计总结及心得体会.
6).上机演示。
3.分组及安排
所选题目根据学生学号确定,学号模4加1,即(学号%4+1)。
如你的学号为17,则所选题目号为:
17%4+1==(题目2)。
4.成绩评定
程序设计方案是否合理;程序设计是否正确;调试结果;设计说明书的质量高低;答辩时回答问题情况;课程设计周表现情况;总评成绩记入“课程设计成绩评分表”。
二、进度安排
第17周星期二08:
00——12:
00
了解这次课程设计的内容和要求,通过网上查找相关资料,与书本知识相结合,清楚掌握一些所要用到的文件及函数等,然后把整个程序设计的总体框架和所涉及的各模快的流程图板书出来,并进行书面程序设计。
星期日08:
00——12:
00
14:
00——18:
30
上机进行程序编辑,调整程序结构,熟知程序中所出现的错误,并找到错误出现的根源并加以改正,使源代码满足课程设计的要求和实现课程设计的基本功能。
第18周星期一08:
00——12:
00
完善程序内容,修改、编辑、调整程序。
不断改正错误,保证程序能成功编译成目标文件,且能链接成功,使之成为可执行文件,再运行能显示出所需要的信息,这样才能算已经完成了本课题的基本功能。
星期日08:
00——12:
00
14:
00——18:
30
撰写课程设计报告,将报告内容进行排版,并进一步完善。
之后,进行程序演示,完成课程设计答辩,完成并打印课程设计报告。
目录
一、课题的主要功能7
二、课题的功能模块的划分8
1、程序数据类型的定义8
2、程序的模块组成:
8
3、各函数的主要功能描述如下9
三、主要功能的实现9
四、程序调试11
五、总结12
六、附录13
评分表18
一、课题的主要功能
本程序利用数组和指针完成对通讯记录的动态管理,其基本功能模块图如图所示:
基本功能模块
①、本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:
编号、姓名、电话号码、地址。
②、本系统显示这样的菜单:
请选择系统功能项:
a、通讯信息录入
b、通讯信息显示
c、通讯信息保存
d、通讯信息删除
e、通讯信息修改
f、通讯信息查询
Ⅰ、按编号查询
Ⅱ、按姓名查询
Ⅲ、按电话号码查询
g、退出系统
③、执行一个具体的功能之后,程序将重新显示菜单。
④、将通讯信息保存到文件中。
二、课题的功能模块的划分
1、程序数据类型的定义
structstudent
{
longnum;
charname[20];
longtel_num;
charadd[40];
structstudent*next;
}stu[];
2、程序的模块组成:
a)主函数main()
b)初始化函数structstudent*init()
c)菜单选择函数intmenu_select()
d)输入函数structstudent*creat()
e)显示通讯信息函数voidprint(structstudent*head)
f)保存数据到文件函数voidsave(structstudent*head)
g)删除通讯信息函数structstudent*del(structstudent*head,longnum)
h)修改通讯信息函数structstudent*change(structstudent*head,longnum)
i)查询通讯信息函数
1.编号查询通讯信息函数voidsearch_1(structstudent*head,longnum)
2.姓名查询通讯信息函数voidsearch_2(structstudent*head,char*name)
3.电话号码查询通讯信息函数voidsearch_3(structstudent*head,longtel_num)
main函数实现总的控制台界面,structstudent*init(),intmenu_select(),structstudent*creat(),voidprint(structstudent*head),voidsave(structstudent*head)structstudent*del(structstudent*head,longnum)structstudent*change(structstudent*head,longnum),void*search_1(structstudent*head,longnum),voidsearch_2(structstudent*head,char*name),voidsearch_3(structstudent*head,longtel_num)调用函数实现各种用户功能要求。
3、各函数的主要功能描述如下
structstudent*init():
使链表初始化,使head的值为NULL.
intmenu_select():
主要实现“功能选择”的界面。
structstudent*creat():
,用来执行通讯记录的输入,当通讯记录编号为0时停止输入,函数结束后,带回一个指向链表头的指针head。
voidprint(structstudent*head):
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部销售记录的输出。
structstudent*del(structstudent*head):
这是一个有参函数,形参为“链表头的指针”,先输入要删除通讯信息记录的编号,找到后显示该通讯信息记录信息,然后进行删除。
voidsave(structstudent*head):
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把通讯信息记录保存在电脑上由自己任意命名的二进制文件。
void*search_1(structstudent*head,longnum):
这是一个有参函数,形参为“链表头的指针”,先输入要查找的通讯信息的编号,找到后显示该通讯信息信息。
voidsearch_2(structstudent*head,char*name):
这是一个有参函数,形参为“链表头的指针”,先输入要查找的通讯信息的姓名,找到后显示该通讯信息信息。
voidsearch_3(structstudent*head,longtel_num):
这是一个有参函数,形参为“链表头的指针”,先输入要查找的通讯信息的电话号码,找到后显示该通讯信息记录信息。
三、主要功能的实现
各个函数的设计说明如下:
(1)主函数main()
利用无限次for(;;)循环和switch()循环实现各函数的调用,系统根据输入的字母选项来调用相应的函数
(2)初始化函数structstudent*init()
这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
(3)菜单选择函数intmenu_select();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的七大功能,根据每个功能前面的序号进行选择。
等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!
(4)输入记录函数structstudent*creat()
这是一个无参函数,用来执行通讯信息的输入,当通讯人员编号为0时停止输入,函数结束后,带回一个指向链表头的指针head。
算法:
先声明一个首节点head,并将head设为NULL。
每输入一个数据就声明一个新节点,把p2->next设为NULL,并且链接到之前列表的尾端。
structstudent*creat()函数流程图
开辟一个新结点,并使p1、p2指向它
读入一个数据给p1所指的结点
head=NULL,n=0
当读入的p1->num不是零
n=n+1
真n等
于1?
假
head=p1
(把p1所指的结点
作为第一个结点)
p2->next=p1
(把p1所指的结点
连接到表尾)
p2=p1(p2移到表尾)
再开辟一个新结点,并使p1指向它
读入一个数据给p1所指的结点
表尾结点的指针变量置NULL
(5)删除记录函数structstudent*del(structstudent*head)
这是一个有参函数,形参为“链表头的指针”,先输入要删除的通讯信息的通讯人员编号,找到后显示该销售员信息,等确认后便可按“Y”进行删除。
算法:
从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个编号。
如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。
(6)保存数据到文件函数voidsave(structstudent*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把通讯保信息存在电脑上由自己任意命名的二进制文件。
(7)显示全部记录函数voidprint(structstudent*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部通讯信息的输出。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
四、程序调试
1.在比较输入姓名与通信信息中的姓名是否一致时,调用strcmp函数时需要extern对函数作申明,在头文件中引用字符串函数,就可以解决这一问题。
2.在输入函数中设了一个无限循环,可以输入无数个销售员记录信息,但课设要求没那么多数据,当用指针时当输入的编号为0的时候则停止输入。
3.在输入选项时不能输入数字,否则会死循环,建议不要乱输字母
4.用scanf函数输入数据时,输入列表项中在p1->name前添加”&”符号,运行时出现错误。
因为p1->name是字符数组名,本身代表地址,因而前没有”&”符号。
修改后的结果:
主界面:
五、总结
这次课题设计有几个要求:
要能录入新的信息,要能删除不需要的信息,要能按照关键字查找已有的信息,以及保存文件等功能。
完成这个课程设计需要用用链表的结构来存储数据。
这就需要建立动态链表。
建立链表时,要熟悉它的删除操作、插入操作输入输出等操作。
应知道设计程序时所要用到的算法和数据结构。
编程时有了程序的算法和程序的结构是最基本的,但你有了的算法、思路和程序的基本结构还是不能写出好多程序来的。
你会发觉你在编写程序的时候会出现很多的错误和漏洞,这会让你对你有的那些基础出现不同的看法,所以这也是一门很细心的一门课程,不得马虎,程序是不允许一丁点的错的。
一步错误会导致一个程序全部都错误。
当程序错误时,得需有耐心的好好检查程序,它会告诉你它错在哪里,但不会告诉你为什么错了,只有自己去检查,自己去修改,这也是让自己锻炼自己检查程序错误的时候,把自己编写程序准确率能力提升的最好方法。
经过几周的上机操作,让我认识到自己的操作能力的不足。
不能很快的调试好程序,我想这与缺乏实际操作,以后要多实践课本知识,“孰能生巧”,用得多了,遇到的问题多了,自然就有了经验,一旦总结了经验,以后程序调试就容易很多。
六、附录
#include
#include/*动态地址分配函数*/
#include
#defineNULL0
#defineFORMAT"%ld%s%ld%s\n"
#defineLENsizeof(structstudent)
#definesize20
structstudent
{
longnum;
charname[20];
longtel_num;
charadd[40];
structstudent*next;
}stu[];
voidprint(structstudent*head);
voidsave(structstudent*head);
structstudent*del(structstudent*head,longnum);
structstudent*change(structstudent*head,longnum);
voidsearch_1(structstudent*head,longnum);
voidsearch_2(structstudent*head,char*name);
voidsearch_3(structstudent*head,longtel_num);*/
intn;/*n为全局变量,本文机件模块中各函数均可使用它*/
structstudent*creat()/*定义函数,此函数带回一个指向链表头的指针*/
{
structstudent*head;
structstudent*p1,*p2;
n=0;
p1=p2=(structstudent*)malloc(LEN);/*开辟一个新单元*/
scanf(FORMAT,&p1->num,p1->name,&p1->tel_num,p1->add);
head=NULL;
while(p1->num!
=0)
{
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
scanf(FORMAT,&p1->num,p1->name,&p1->tel_num,p1->add);
}
p2->next=NULL;
return(head);
}
voidprint(structstudent*head)/*显示通讯信息函数*/
{
structstudent*p;
printf("\n编号姓名电话号码地址\n");
p=head;
if(head!
=NULL)
do
{
printf(FORMAT,p->num,p->name,p->tel_num,p->add);
p=p->next;
}while(p!
=NULL);
}
voidsave(structstudent*head)/*保存数据到文件*/
{
FILE*fp;
intn;
if((fp=fopen("yinyanling","wb"))==NULL)/*为输入打开一个二进制文件夹*/
{
printf("cannotopeninfile\n");
return;
}
for(n=0;nif(fwrite(head,sizeof(structstudent),1,fp)!
=1)/*读写数据块*/
printf("filewriteerror\n");
fclose(fp);/*关闭文件夹*/
}
structstudent*del(structstudent*head,longnum)/*通讯信息删除*/
{
structstudent*p1,*p2;
if(head!
=NULL){printf("\nlistnull!
\n");}
p1=head;/*p1指向的不是所要找的接点,并且后面还有接点*/
while(num!
=p1->num&&p1->next==NULL)/*否则将下一接点地址赋给前一接点地址*/
{p2=p1;p1=p1->next;}/*p1后移一个接点*/
if(num==p1->num)
{if(p1=head)head=p1->next;/*若指向的是首接点,把第二个接点地址赋予head*/
elsep2->next=p1->next;
printf(FORMAT,p1->num,p1->name,p1->tel_num,p1->add);
n=n-1;
}
elseprintf("%ldnotbeenfound!
\n",num);/*找不到该接点*/
return(head);
}
structstudent*change(structstudent*head,longnum)/*通讯信息修改*/
{
structstudent*p1,*p2;
p1=head;
scanf("%ld",&num);
while(num!
=p1->num&&p1->next==NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)/*找到了要修改的编号*/
{if(p1=head)head=p1->next;
elsep2->next=p1->next;
printf("%ld",num);
n=n-1;
}
return(head);
}
voidsearch_1(structstudent*head,longnum)/*编号查询通讯信息函数*/
{
structstudent*p1,*p2;
if(head!
=NULL){printf("\nlistnull!
\n");}
p1=head;
while(num!
=p1->num&&p1->next==NULL)
{p2=p1;p1=p1->next;}
if(num==p1->num)
{if(p1=head)head=p1->next;
elsep2->next=p1->next;
printf(FORMAT,p1->num,p1->name,p1->tel_num,p1->add);
n=n-1;
}
elseprintf("%ldnotbeenfound!
\n",num);
}
voidsearch_2(structstudent*head,char*name)/*姓名查询通讯信息函数*/
{
structstudent*p1,*p2;
if(head!
=NULL){printf("\nlistnull!
\n");}
p1=head;
while(strcmp(name,p1->name)!
=0&&p1->next==NULL)
{p2=p1;p1=p1->next;}
if(strcmp(name,p1->name)==0)
{if(p1=head)head=p1->next;
elsep2->next=p1->next;
printf(FORMAT,p1->num,p1->name,p1->tel_num,p1->add);
n=n-1;
}
elseprintf("%snotbeenfound!
\n",name);
}
voidsearch_3(structstudent*head,longtel_num)/*电话号码查询通讯信息函数*/
{
structstudent*p1,*p2;
if(head!
=NULL){printf("\nlistnull!
\n");}
p1=head;
while(tel_num!
=p1->num&&p1->next==NULL)
{p2=p1;p1=p1->next;}
if(tel_num==p1->tel_num)
{if(p1=head)head=p1->next;
elsep2->next=p1->next;
printf(FORMAT,p1->num,p1->name,p1->tel_num,p1->add);
n=n-1;
}
elseprintf("%ldnotbeenfound!
\n",tel_num);
}
voidmain()/*主函数*/
{
structstudent*head;
chari,j;
for(;;)
{printf("Pressanykeytoentherthemenu\n");
printf("欢迎进入查询系统!
\n");
printf("***************************MENU********************\n");
printf("a、通讯信息录入\n");
printf("b、通讯信息显示\n");
printf("c、通讯信息保存\n");
printf("d、通讯信息删除\n");
printf("e、通讯