成绩记录簿课程设计报告.docx
《成绩记录簿课程设计报告.docx》由会员分享,可在线阅读,更多相关《成绩记录簿课程设计报告.docx(50页珍藏版)》请在冰豆网上搜索。
成绩记录簿课程设计报告
课程设计报告
课程名称程序设计基础C语言
设计题目成绩记录簿
姓名国俊
专业计算机工程
班级
学号
指导教师
日期2012.6.25~7.6
一、目的及要求4
二、课程设计容4
三、总体设计5
3.1功能模块设计5
3.1.1成绩记录簿执行的主流程5
3.1.2输入信息模块5
3.1.3修改成绩模块5
3.1.4删除模块6
3.1.5查学生成绩模块6
3.1.6查班成绩表模块6
3.1.7入文件模块6
3.1.8取文件模块6
3.1.9出模块。
6
3.2数据结构设计9
3.2.1stu结构体9
3.2.2全局变量9
3.3函数功能描述10
1)init()10
2)input_list()10
3)insert()10
4)input_info()10
5)check_number(char*s)和same_numder(char*s)10
6)check_name(char*s)10
7)check_number2(char*s)和same_number2(student*p,inti)11
8)intcheak_result(floats)和cheak_credit(floats)11
9)voidadd_result()11
10)search_delete()、delete_stu(student*s)和student*searchfront_stu()11
11)seach_findstudent()、output_stuinfo(student*p)12
12)seach_findclass()、output_classinfo(inti)12
13)save_tofile()、output_tofile(FILE*fp,student*p)12
14)load_file()12
15)end()、free_list(student*p)13
四、程序实现13
4.1源码分析13
1)程序预处理13
2).主函数main15
3).程序初始化16
4).各种合法性检测16
5).输入数据(添加)18
6).修改成绩22
7).删除成绩25
8).查询信息(班级和个人)27
查询班级32
9).保存和打开文件32
10).退出系统35
五、结论及体会42
参考文献43
一、目的及要求
1、目的
a)本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:
b)巩固和加深学生对C语言课程的基本知识的理解和掌握;
c)掌握C语言编程和程序调试的基本技能;
d)利用C语言进行基本的软件设计;
e)掌握书写程序设计说明文档的能力
f)提高运用C语言解决实际问题的能力。
2.课程设计要求
a)分析课程设计题目的要求;
b)写出详细设计说明;
c)编写程序代码,调试程序使其能正确运行;
d)设计完成的软件要便于操作和使用,有整齐、美观的使用界面;
e)设计完成后提交课程设计报告和源代码文件的电子文档。
二、课程设计容
题目四:
成绩记录簿
1.设计要求:
基本要求:
g)添加成绩
h)删除成绩
i)查询学生成绩
j)查询班级成绩
k)退出
拓展功能:
l)写入文件
m)读取文件
创新(自拟)功能:
程序实现的其它功能由个人自拟。
2.设计要求具体说明基本功能:
●成绩记录簿中记录以下数据:
学号、、课程编号、课程名称、成绩、学分,所有成绩都以百分制计分;输入信息时要检查数据项学号、课程编号、成绩、学分的合法性,学号:
8位数字;课程编号:
5位数字;成绩:
0~100之间的整数,学分:
1~5之间的实型数。
●添加成绩:
需要输入学生的学号或、课程编号及成绩,如已有该门课程成绩给出提示;
●查询(班级或个人)成绩:
●查询个人成绩:
以学号或作为关键字,可查询一个学生的所有成绩,和已完成的总学分。
●查询班级成绩:
以课程编号为关键字,成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。
拓展功能:
a)程序启动时先从文件读入数据,如果文件中没有数据则给出提示;
b)每次修改的数据写入文件。
3.提示定义合适的结构体类型,使用链表或数组的方式组织数据。
三、总体设计
3.1功能模块设计
3.1.1成绩记录簿执行的主流程
主要的流程图如下图(图1所示),首先,程序进入main函数程序调用菜单函数menu(),在主函数运行时,调用init()函数默认对系统进行初始化,并将初始化函数返回的值付给头指针head,在屏幕上显示菜单。
3.1.2输入信息模块
执行“1.添加”操作时时,调用input_list()函数,要求用户键入添加的人数。
进入input_list()函数时,将调用insert()函数对每个的信息用头插法建立链表节点并同时进行对每一个人的信息进行输入(由insert()函数调用input_info()函数实现)。
(如下图3.1.2)
3.1.3修改成绩模块
执行“2.修改成绩”时,调用add_result()函数,要求用户键入要修改的学生的或者是学号,然后键入要修改的课程编号,在输入成绩时,如果是已经有成绩则提示“已经有程序”以后有“是否修改成绩?
”的提示。
3.1.4删除模块
执行“3.删除”时,用户输入要删除的学生或学号,检查合法性后,调用查找函数search_number(char*)(学号查找)或search_name(char*)(查找),将返回的链表地址给utput_stuinfo(student*)(显示在屏幕)并且提示用户是否删除。
如过删除,则继续将返回的链表给delete_stu(student*)函数,将这个链表的下一个节点的头指针连接到这个链表的上一个尾指针,则删除成功。
3.1.5查学生成绩模块
调用seach_findstudent()函数,要求用户输入学号或者是,通过check_name()和check_number2()函数判断或者学号的合法性(即是否为字母,学号为)。
3.1.6查班成绩表模块
通过调用seach_findclass()函数,要求用户输入课程编号进入,通过课程编号查找所有节点的相同课程编号,并且输出所有学生的这一课程编号的成绩、学分和平均分;成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。
3.1.7入文件模块
通过调用save_tofile()函数,提示用户输入文件名,这里为用户自己定义,文件以“w”方式,当程序开始运行时,提示是否打开文件,文件名称要用户自己定义。
3.1.8取文件模块
通过load_file()函数,可将本程序保存的数据文件在程序重新期待时读写到系统存里,可对其进行查看、编辑、处理等任务。
3.1.9出模块。
退出时,释放链表存。
然后exit(0)退出程序。
1.总体框图
图1总体框图
2.目录函数menu()
图2目录函数(menu)流程图
3.目录主要源码
intmenu()
{
intn;
charch;
printf("************************\n");
printf("**成绩记录簿**\n");
printf("************************\n");
printf("**1.添加**\n");
printf("**2.修改成绩**\n");
printf("**3.删除**\n");
printf("**4.查学生成绩**\n");
printf("**5.查班成绩表**\n");
printf("**6.写入文件**\n");
printf("**7.读取文件**\n");
printf("**0.退出**\n");
printf("************************\n");
if(!
SWITCH[3])
{
SWITCH[3]=1;
printf("是否打开文件?
(y为打开,任意键取消!
)\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
load_file();//打开文件
}
printf("\n\n输入程序序号:
");
scanf("%d",&n);
returnn;
}
4.源码解释
menu()函数完成打印菜单和接收用户选择功能。
3.2数据结构设计
3.2.1stu结构体
typedefstructstu{
charnumber[20];//学号
charname[20];//
charcurriculum_number[CLASS][6];//课程代号
floatcredit[CLASS];//学分
floatresult[CLASS];//分数
floatsum;//总分
floatave;//平均分
floatsum_credit;//总学分
structstu*next;
}student;
源码解释:
对结构体使用链表处理。
3.2.2全局变量
charresult_name[CLASS][30]={"数学","英语","政治","计算机"};对课程的名字进行定义。
intSWITCH[4]={0,0,0,0};为程序设定开关,方便特定条件下决定部分程序是否运行
charclassname[CLASS][6];为了记录第一次定义的课程编码。
intnumber_student=0;记录输入数据的学生人数“输入链表”即“添加”菜单步骤里做自增,计算人数。
student*head=NULL;为链表的头指针。
FILE*fp;为文件指针。
3.3函数功能描述
1)init()
函数原型student*init();
init()函数用于初始化程序,对头函数进行初值的操作。
其返回值赋值给头指针head。
2)input_list()
函数原型voidinput_list();
input_list()函数为输入链表操作的第一步,接收用户输入的节点数(即记录的学生人数)。
对头插法函数进行插入循环。
3)insert()
原型函数voidinsert();
insert()函数为将数据运用头插法插入。
4)input_info()
原型函数voidinput_info(student*p);
input_info(student*)函数为给接收到的p指向的节点输入数据。
数据有学号、、课程代码(第一次运行程序并且没有一开始读取文件的时候执行输入,否则程序部将课程代码复制给下一个学生的信息里。
)、每个课程代码对应的课程的分数和学分,并且自动计算个人总分、平均分和总学分。
5)check_number(char*s)和same_numder(char*s)
原型函数intcheck_number(char*s)和intsame_numder(char*s)
check_number(char*s)是检测学号是否为8位阿拉伯数字。
same_numder(char*s)函数为检测这一次输入的学号是否与前面所有学号有相同。
6)check_name(char*s)
函数原型intcheck_name(char*s)
check_name(char*s)函数为检测输入的是否合法,是否为空,是否为英文字母。
7)check_number2(char*s)和same_number2(student*p,inti)
函数原型:
intcheck_number2(char*s)和check_number2(char*s)
check_number2(char*s)为检测接收的课程编码是否为5位阿拉伯数字。
same_number2(student*p,inti)检测在有输入课程编码时,查找输入的课程编码是否与原有的课程编码有相同。
8)intcheak_result(floats)和cheak_credit(floats)
函数原型:
intcheak_result(char*s)和intcheak_credit(floats)
cheak_result(char*s)函数为检测输入的分数是否为1~100;
cheak_credit(floats)函数则检测学分是否为大于0且小于5的。
9)voidadd_result()
函数原型voidadd_result()
add_result()函数进行修改成绩的操作,用户输入学号,查找是否有学号,如果有此学号,则程序查找到这个学号对应的节点,然后要求用户输入要修改的课程代号,找到需要修改的课程,输入成绩,最后判断是否修改,若否则不修改退出此操作。
学分在成绩以后修改。
10)search_delete()、delete_stu(student*s)和student*searchfront_stu()
函数原型voidsearch_delete()、voiddelete_stu(student*s)和student*searchfront_stu(student*n)
voidsearch_delete()为主函数调用的删除指令,在调用check_number(char*)和check_name(char*)判断输入合法性和正确性后确认删除时,打印要删除的信息,如果确认删除,则调用delete_stu(student*s)(删除接受的s节点的指令)函数运行student*searchfront_stu(student*n)(返回前一个节点的功能),将所要删除的信息的后一个链表连接到要删除的信息的前一个链表。
11)seach_findstudent()、output_stuinfo(student*p)
函数原型:
voidseach_findstudent()、voidoutput_stuinfo(student*p)
seach_findstudent()函数为查询查学生成绩的操作,用户输入要查询的学生学号或者是,调用check_number(char*)和check_name(char*)判断输入合法性和正确性后和判断是学号还是,最后再调用student*search_number(char*)按学号查找,或调用student*search_name(char*)按查找,若查找到,则返回查找的指针,最后通过函数output_stuinfo(student*p)打印学生信息。
12)seach_findclass()、output_classinfo(inti)
函数原型voidseach_findclass(),voidoutput_classinfo(inti)
seach_findclass()函数为查询班级信息的操作,用户输入要查询的课程编码,在通过调用check_number2(char*)检测编码合法性后,执行按节点查找课程编码位置步骤,然后调用output_classinfo(inti)(输出班级信息)函数,将位置固定,查找head之后所有节点的同一课程编码并且输出。
然后计算head之后的所有节点的该课程编码情况计算统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比并且列出。
13)save_tofile()、output_tofile(FILE*fp,student*p)
函数原型voidsave_tofile()、voidoutput_tofile(FILE*fp,student*p)
save_tofile()函数为主函数调用,并检测输入合法性。
output_tofile(FILE*fp,student*p)函数实现写入文件操作。
14)load_file()
函数原型voidload_file()
load_file()函数实现从文件里将数据读到存里,从而能进行对数据的处理。
15)end()、free_list(student*p)
函数原型为voidend()、voidfree_list(student*p)
voidend()函数调用free_list(student*p)函数将空间返回存。
四、程序实现
4.1源码分析
1)程序预处理
#include
#include
#include
#defineCLASS4//课程多少
#defineMALLOC(student*)malloc(sizeof(student))
#defineMAX_NO8//学号长度
typedefstructstu{
charnumber[20];//学号
charname[20];//
charcurriculum_number[CLASS][6];//课程代号
floatcredit[CLASS];//学分
floatresult[CLASS];//分数
floatsum;//总分
floatave;//平均分
floatsum_credit;//总学分
structstu*next;
}student;
charresult_name[CLASS][30]={"数学","英语","政治","计算机"};
/*开关*/
intSWITCH[4]={0,0,0,0};
charclassname[CLASS][6];//记录第一次定义的课程
intnumber_student=0;//记录输入数据的学生人数“输入链表”即“添加”菜单步骤里计算人数。
/*头指针*/
student*head=NULL;
/*文件指针*/
FILE*fp;
/*声明*/
intmenu();//菜单
student*init();//初始化
voidinsert();//头插法插入节点
voidinput_list();//(写入链表的操作)
voidinput_info(student*);//真正输入的函数。
intcheck_number(char*);//学号检测。
intcheck_number2(char*);//检测课程编号
intsame_number2(char*,int);//检测相同课程编码
intcheak_result(float);//检测分数
intcheak_credit(float*);//检测学分
intcheck_name(char*);//检测
intsame_numder(char*);//检测相同
intsame_result(int*);//检测相同成绩
student*search_number(char*);//按学号查找
student*search_name(char*);//按查找
voidcompute(student*);//总分与平均分
student*searchfront_stu(student*);//返回前一个节点用于删除
voidinput(student*);//输入
voidseach_findstudent();//查询学生信息
voidsearch_delete();//删除操作
voiddelete_stu(student*);//删除数据
voidoutput_stuinfo(student*);//输出个人信息
voidoutput_classinfo(student*,int*);//输出班级信息
voidseach_findclass();//查询班级信息
voidresult_outside();//成绩表
voidoutput_tofile(FILE*,student*);//写入文件
voidsave_tofile();//保存到文件
voidload_file();//读出文件
voidfree_list(student*);//结束链表
voidend();//结束
2).主函数main
intmain(void)
{
intn;
head=init();//初始化
while
(2){
n=menu();//菜单
switch(n){
case1:
input_list();//键入信息
break;
case2:
add_result();//修改成绩
break;
case3:
search_delete();//删除信息
break;
case4:
system("cls");//清屏
seach_findstudent();//查询学生信息
break;
case5:
system("cls");
seach_findclass();//查询班级信息
break;
case6:
save_tofile();//写入文件
break;
case7:
head=init();
load_file();//文件中读取
break;
case0:
end();//退出
break;
default:
printf("无效命令!
\n");
fflush(stdin);
}
}
system("pause");
return0;
}
3).程序初始化
student*init()//初始化
{student*head;
head=MALLOC;//建立head头链表
head->next=NULL;//设定头指针也是尾指针
returnhead;//返回头指针
4).各种合法性检测
/*检测*/
intcheck_name(char*s)
{
if(strlen(s)==0)