c语言课设报告Word文档格式.docx
《c语言课设报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《c语言课设报告Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
指导教师:
________学生签名:
________
五、说明书成绩
六、教师评语
目录
一、需求分析1
二、程序流程图2
三、核心技术的实现说明及相应程序段6
四、课设总结11
五、参考文献11
六、源程序12
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为六个模块,其中每一个模块对应一个函数,它们的功能分别是:
输入课程信息函数,添加课程信息函数,选修一门课程函数,显示选课情况函数,显示课程信息函数以及删除课程信息函数。
在这些函数当中,前四个函数的实现严格按照题目的要求,而后面的两个函数属于附加功能。
1、输入课程信息函数主要实现程序最初运行时课程数据的录入功能(课程信息包括课程编号、课程名、学时和学分),并且课程按课程编号有序;
2、添加课程信息函数实现的功能是第一次输入后的运行中课程数据的追加功能,追加的信息按编号顺序存入;
3、选修一门课程函数按照题目的具体要求实现的是给出学号和课程编号,如果课程编号不存在则重新输入,直到输入正确为止。
若输入正确则与相应的课程名一起存入文件中;
4、显示选课情况函数将选课情况显示在屏幕上,数据按学生学号有序;
5、显示课程信息函数实现的是显示所有存入的课程信息;
6、删除课程信息函数可以将某个课程信息删除。
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个学生记录都包含课程编号、课程名、学时和学分四项信息,在程序当中,将课程记录类型定义为结构体类型,添加以及追加的学生信息直接写入D盘的lessons.txt文件中,同时选课信息也定义为结构体类型,存储在D盘的SelectInfo.txt文件中。
其它函数每次对课程记录和选课记录的访问,其数据来源都是lessons.txt和SelectInfo.txt文件,这样做不但可以保证数据的一致性,而且可以对数据进行永久保存,保证每次运行程序都可以采用原来的数据。
二、程序流程图
1、程序总体结构图
图1程序总体结构图
2、具体功能框图
(1)添加学生数据函数add
图2添加学生数据函数
(2)读取课程数据reads
图3读取课程数据
(3)删除学生记录函数del
(4)按总分排序函数sort
(4)排序函数sort
图4删除学生记录函数
图5总分排序函数
三、核心技术的实现说明及相应程序段
本程序主要由六个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其它函数来实现要求的所有功能。
在这些函数当中,添加数据函数、删除数据函数和排序函数是程序中较为核心的部分,下面分别进行说明。
1、添加数据函数
添加数据分为两种情况,其一是在学生文件(student.dat)不存在的情况下,首先由程序创建一个新文件,并将录入的学生信息写入该文件当中;
其二是在学生文件(student.dat)已经存在的情况下,此时文件要以读写方式或追加的方式打开,这样才可以保证以前已经存在的数据不丢失。
具体的程序段如下:
if((fp=fopen("
e:
\\student.dat"
"
rb+"
))!
=NULL)/*读写方式打开文件*/
{j=getw(fp);
rewind(fp);
/*文件位置指针返回文件开头*/
printf("
请输入要添加的学生数量,按回车键确认:
"
);
scanf("
%d"
&
n);
putw(j+n,fp);
fseek(fp,0L,2);
for(i=1;
i<
=n;
i++)
{printf("
\n请输入第%d个学生的学号、姓名,并按回车键确认:
\n"
i);
%s%s"
stu.num,stu.name);
\n请输入第%d个学生的三门成绩,并按回车键确认:
%f%f%f"
stu.english,&
puter,&
stu.math);
fwrite(&
stu,sizeof(structstudent),1,fp);
}
else/*文件不存在时,新建一个文件,并将数据写入该文件*/
{if((fp=fopen("
wb"
=NULL)
putw(n,fp);
scanf("
}
fclose(fp);
2、删除数据函数
该函数的核心内容是删除算法以及最终对源文件的更新。
该函数执行时,首先调用reads函数将文件中的学生信息读入数组当中,并由用户输入待删除学生的学号,而后按照该学号进行查找,如果文件中存在该学生的数据,则采用删除算法删除,否则输出学生信息不存在的提示信息。
对学生信息的具体删除算法是在结构体数组中实现的,当学生的信息被找到后,位于数组中该学生后面的学生记录依次向前移动一个元素的位置,这些操作完成后,要删除的学生信息就被后面的数组元素覆盖掉了,也就实现了删除。
在数组中删除学生信息后,还要将更改后的信息重新写回文件当中,以保证数据的一致性。
具体程序段如下:
voiddel()/*信息删除函数*/
{structstudentstu[N];
charnumber[20];
FILE*fp;
intn,i,j;
reads(stu,&
\n请输入要删除信息的学生学号,按回车键确认:
%s"
number);
for(i=0;
n;
i++)/*查找待删除的学生记录*/
if(strcmp(number,stu[i].num)==0)break;
if(i>
=n)
{printf("
没有找到该学生信息!
return;
else
{for(j=i+1;
j<
j++)/*左移,覆盖待删除的学生记录*/
strcpy(stu[j-1].num,stu[j].num);
strcpy(stu[j-1].name,stu[j].name);
stu[j-1].english=stu[j].english;
stu[j-1].computer=stu[j].computer;
stu[j-1].math=stu[j].math;
if((fp=fopen("
))==NULL)
文件打开失败!
else/*重新写回文件当中*/
{putw(n-1,fp);
n-1;
stu[i],sizeof(structstudent),1,fp);
删除成功!
}
3、总分排序函数
对于总分的排序采用的排序算法是冒泡法排序,其中总分的求得是在排序的过程中实现的,这部分程序仍然调用了reads函数,整个排序过程在结构体数组stu中实现,由于排序算法涉及到两个数组元素的信息交换,因此还需要定义一个中间变量来协助。
排序函数使学生数据的排列顺序发生了变化,因此也需要队员文件进行更新,此外,对于学生排序后名次的确定,仅在结果输出时予以显示,并未将名次信息写入源文件。
具体的程序段如下:
voidsort()/*排序函数*/
{FILE*fp;
structstudentstu[N],temp;
inti,j,n;
i++)/*采用冒泡法对总分进行排序*/
for(j=0;
n-1-i;
j++)
{if(stu[j].english+stu[j].computer+stu[j].math<
stu[j+1].english+stu[j+1].computer+stu[j+1].math)
{strcpy(temp.num,stu[j].num);
strcpy(temp.name,stu[j].name);
temp.english=stu[j].english;
puter=stu[j].computer;
temp.math=stu[j].math;
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j].name,stu[j+1].name);
stu[j].english=stu[j+1].english;
stu[j].computer=stu[j+1].computer;
stu[j].math=stu[j+1].math;
strcpy(stu[j+1].num,temp.num);
strcpy(stu[j+1].name,temp.name);
stu[j+1].english=temp.english;
stu[j+1].computer=puter;
stu[j+1].math=temp.math;
))==NULL)/*更新文件*/
打开文件失败!
j=1;
{fwrite(&
if(stu[i].english+stu[i].computer+stu[i].math==stu[i+1].english+stu[i+1].computer+stu[i+1].math)
%3d%5s%5s%8.2f%8.2f%8.2f%9.2f\n"
j,stu[i].num,stu[i].name,stu[i].english,stu[i].computer,stu[i].math,stu[i].english+stu[i].computer+stu[i].math);
else
j++,stu[i].num,stu[i].name,stu[i].english,stu[i].computer,stu[i].math,stu[i].english+stu[i].computer+stu[i].math);
fclose(fp);
getch();
四、课设总结
写出在课程设计过程中的收获和体会,并说明程序的完成情况,如果程序未能全部实现请分析其中的原因。
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
六、源程序
#include<
stdio.h>
stdlib.h>
//其中定义了system()函数。
conio.h>
//其中定义了getch()函数。
string.h>
//定义了字符串控制函数
#defineN20
structlesson//课程
{charnum[20];
//课程编号
charname[10];
//课程名称
floathour;
//课时
floatpoint;
//学分
};
structchoice//学生选课
{charnumstu[20];
//学生学号
charnumles[20];
charname[20];
//课程名
voidmenu();
//菜单
voidreads(structlessonles[N],int*n);
//读取文件中的信息
voidshow();
//显示所有选修课信息
voidadd();
//输入课程信息
voiddel();
//删除课程信息
voidplus();
//添加课程信息
voidselect();
//选修一门课程
voidshowresult();
//显示选课情况
voidmain()
{
intn;
while
(1)
{
menu();
\n请输入您要选择的操作序号,按回车键确认:
switch(n)
{case1:
add();
break;
case2:
show();
case3:
plus();
case4:
del();
case5:
select();
case6:
showresult();
case7:
exit(0);
//退出
default:
\n输入错误,请输入列表中存在的序号!
\n\n"
}
voidmenu()
{printf("
********%%%%%%%%*****************%%%%%%%%%*******\n"
班级成绩管理系统\n"
\n1输入课程信息"
\n2显示课程信息"
\n3添加课程信息"
\n4删除课程信息"
\n5选修一门课程"
\n6显示选课情况"
\n7退出"
voidreads(structlessonles[N],int*n)/*从文件中读取信息*/
inti=0;
d:
\\lessons.txt"
r"
{
!
feof(fp);
fscanf(fp,"
%s%s%f%f"
les[i].num,les[i].name,&
les[i].hour,&
les[i].point);
*n=i;
voidadd()/*输入选修课信息*/
{FILE*fp;
structlessonles[N],les1;
w"
=NULL)/*新建选修课文件并添加信息*/
请问您想添加几门课程,按回车键确认:
printf("
\n请输入第%d个选修课程的编号、课程名、学时和学分,用空格分开,并按回车键确认:
les[i-1].num,&
les[i-1].name,&
les[i-1].hour,&
les[i-1].point);
{for(i=0;
n-j;
i++)
if(strcmp(les[i].num,les[i+1].num)>
0)
{les1=les[i];
les[i]=les[i+1];
les[i+1]=les1;
}
fprintf(fp,"
\n%s%s%f%f"
les[i].num,les[i].name,les[i].hour,les[i].point);
/*课程信息写入文件*/
voidshow()/*显示所有选修课信息*/
{structlessonles[N];
inti,n;
reads(les,&
/*从文件中读出所有选修课信息*/
*****************所有的选修课信息如下*****************"
\n序号课程编号选修课名称课时学分"
\n%3d%5s%5s%8.1f%8.1f\n"
i+1,les[i].num,les[i].name,les[i].hour,les[i].point);
请按任意键继续\n"
getch();
voidplus()/*添加课程*/
structlessonles[N];
structlessonles1;
\n请输入要添加的选修课程的编号、课程名、学时和学分,用空格分开,并按回车键确认:
les1.num,&
les1.name,&
les1.hour,&
les1.point);
if(strcmp(les1.num,les[i].num)==0)break;
if(strcmp(les[0].num,les1.num)>
for(i=n;
i>
0;
i--)
les[i]=les[i-1];
les[0]=les1;
elseif(strcmp(les1.num,les[n-1].num)>
{les[n]=les1;
else
if(strcmp(les1.num,les[i].num)>
0&
&
strcmp(les1.num,les[i+1].num)<
for(j=n;
j>
i+1;
j--)
les[j]=les[j-1];
les[j]=les1;
{
该课程已存在\n"
voiddel()/*删除选修课程信息函数*/
\n请输入要删除信息的课程编号,按回车键确认:
getchar();
if(strcmp(number,les[i].num)==0)break;
没有找到该课程信息!
les[j-1]=les[j];
))==NULL)/*更新文件*/
\n%s%s%