C程序设计实习报告学生证管理系统文档格式.docx
《C程序设计实习报告学生证管理系统文档格式.docx》由会员分享,可在线阅读,更多相关《C程序设计实习报告学生证管理系统文档格式.docx(42页珍藏版)》请在冰点文库上搜索。
![C程序设计实习报告学生证管理系统文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/5b53d29a-6932-4b8e-acef-a5a4b2f666fc/5b53d29a-6932-4b8e-acef-a5a4b2f666fc1.gif)
4.3查询信息效果图11
4.4修改信息效果图12
4.5删除效果图13
4.6统计信息效果图14
五、心得体会15
六、参考文献15
七、附录15
一、需求分析
1.1题目要求
该系统应该具有下列功能:
(1)录入某位学生的学生证信息
(2)给定学号,显示某位学生的学生证信息
(3)给定某个班级的班号,显示该班所有学生的学生证信息
(4)给定某位学生的学号,修改该学生的学生证信息
(5)给定某位学生的学号,删除该学生的学生证信息
(6)提供一些统计各类信息的功能
输入要求:
应用程序运行之后,在屏幕生显示一个菜单。
用户可以根据需求,选定相应的操作项目。
进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。
输出要求:
(1)应用程序运行之后,要在屏幕上显示一个菜单。
(2)要求用户输入数据时,要给出清、晰明确的提示信息,包括输入的数据内容、格式及结束方式等。
提示:
设计时可以采用结构体类型和以为数组类型,用来保存学生证的内容。
2、总体设计
2.1设计思想
经分析,整个系统可分为以下几大块:
(1)学生证信息的输入和输出:
输入输出学号、班号、姓名、性别、民族、学院、专业、生日、身份证号等信息。
(2)学生证信息的保存:
在输入、修改或删除后,通过文件将学生的信息保存。
(3)学生证信息的的查询:
根据学号查询某学生的信息或者根据班号查找该班所有学生的信息。
(4)学生证信息的修改:
根据学号修改该学生的信息。
(5)学生证信息的删除:
根据学号删除该学生的信息。
(6)信息的统计:
根据班号统计该班总人数、根据学院统计该学院的总人数或者根据专业统计该专业的总人数。
(7)信息的排序:
按照学号从大到小对学生的信息进行排序。
2.2运行平台及开发环境
此程序是在MicrosoftVisualC++软件平台上编译的,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等等编程语言。
VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(WindowsAPI)、三维动画DirectXAPI,Microsoft.NET框架
2.3数据结构
综合以上的分析及开发平台特点,我决定采用结构体数据结构,将学生的基本信息与成绩设计为结构体数据,用来存放多个学生的信息,把学生的姓名、学号、宿舍号、成绩作为结构体成员,从而实现信息之间的对应输入输出。
但要注意的是要用两个不同的结构体分别定义学生基本信息和学生成绩,以便于后续的一些功能的实现。
2.4系统结构简图
图2-1
三、详细设计
3.1主函数
主函数的功能是对各个子函数进行调用,并且输出一个菜单界面,只需按照菜单输入相应数字就可以选择相应功能。
实现这一功能主要通过switch语句,首先通过printf函数打印出菜单,然后通过scanf函数输入数字选择菜单,经过switch语句判断调用相应的函数,从而实现预定的功能。
3.2信息输入
在定义变量时采用结构体数据结构,学号、班号、生日、身份证号是整型,姓名、性别民族、学院、专业是字符型,采用字符型数组,但数组长度一定要足够,否则会出现数据丢失错误,考虑到姓名性别的字符长度,定义它们为长度为20的字符数组。
且由于涉及到学生一系列的的基本信息,将基本信息定义为结构体。
在将学生的基本信息输入时,要将其保存为.txt文件,用来存放学生的信息。
这时就涉及到文件的建立和写入,由于fwrite、fread函数是以二进制形式将数据写入、读出文件的,所以在文件中会出现乱码,而fprintf、fscanf烦函数则会将ASCII码转化为二进制码,不会出现乱码,所以决定选取较为简单的fprintf函数作为写入文件的函数。
首先定义一个指向文件的指针,再定义一个整型的外部变量变量N,定义整形的外部变量是为了控制输入的人数,并用for函数进行循环,在输入数据之后当然,自动调用save函数,循环N次,通过指针打开建立一个文本文件,fprintf函数自动建立一个文本文件,实现向文件中写入N组数据的功能。
循环结束后文件件中已经写入要输入的信息。
在程序的最后通过一个if和else判断语句,结合printf和scanf函数判断是否继续执行输入函数或者返回菜单。
流程图如图3-2。
N
Y
图3-2
3.3总信息的显示
这部分比较简单,主要是通过主函数调用,先打开文件用fprintf函数将数据全部读入,然后经过for循环,经数据全部输出,最后通过一个if和else判断语句,结合printf和scanf函数判断是否继续执行本函数或者返回菜单。
流程图如图3-3。
图3-3
3.4查询信息
3.4.1按学号查询
此函数通过主函数调用,先将文件打开读入数据,然后输入学号,经过循环查找最终确定该学生的位置,进行输出;
当输入的学号没有时,会重新执行本函数。
Y
图3-4
3.4.2按班级查询
此函数通过主函数调用,先将文件打开读入数据,然后输入班号,经过循环查找最终确定该班所有学生的位置,进行输出;
当输入的班号没有时,会重新执行本函数。
图3-5
3.5修改信息
本程序采用的基本思路是先查找,找到之后再对信息逐条修改。
查找仍是用for循环,输入一个学号,然后逐个进行比对,找到之后再输入你想修改的信息,将原数据替换,最后保存。
开始仍然有对学号的判断,最后仍然有返回主菜单的判断。
图3-6
3.6删除信息
删除的基本思想就是后面的信息覆盖前面的信息,后面的信息被0代替,从而实现删除功能。
具体实现方法就是选择删除功能,利用文件指针和fscanf函数,将文件内容读出,显示在屏幕上,让用户决定删除哪一个学生的基本信息,然后输入该学生的学号赋值给一个整型变量,利用for循环在文件中查找与该变量值相同的学生,找到之后将后面一个结构体的全部信息赋值给前面一个结构体,从而将该学生信息“删除”。
同时要实现的是在存放成绩的文件中也要该同学的成绩信息删除,原理相同,就是在找到该同学的信息之后,保留循环变量的值,再对成绩文件里该同学的进行相同覆盖操作,即可实现同时在B文件删除信息。
流程图如下;
图3-7
3.7统计信息
首先定义一个变量x=0,读入数据,然后输入你想统计的班号,学院或专业名称,然后通过for循环,进行比较,当数据中的班号,学院或专业名称与你输入的相同时,x+1,循环结束最后将x的值输出,即为统计的总人数。
3.7.1统计班级总人数
图3-8
3.7.2统计学院或专业总人数
学院专业
图3-9
3.7.3排序
排序的基本思想即为“冒泡法”。
在编写函数时,要注意如何实现结构体变量之间的交换,由于结构体中成员较多,数据结构较为复杂,因此需要采用中间变量进行替换。
具体的操作在程序开始成绩定义结构体变量时,需要定义两组成绩结构体变量,一组用于存放数据,另一组即用来作为零时替换变量,用来接受将需要交换的变量值。
首先还是需要进行问基金按内容的读出。
再用冒泡法排序,冒泡法就是用第一个值分别与后面的每一个值进行比较,如果小于后一个值则交换它们的值,再将已变换过的第一个值与后面的每一个值比较,直到一个for循环结束,然后再进行相同的过程,直到一个大的for循环结束。
然后将排序后的文件内容显示出来,。
流程图如下:
图3-10
以上就是各模块的详细设计,在主菜单中选择调用各个模块子的函数,从而实现不同功能。
四、测试结果分析
4.1输入信息部分效果图
图4-1
图4-2
4.2输出总信息效果图
图4-3
文件如图4-4
图4-4
4.3查询信息效果图
图4-5
图4-6
图4-7
4.4修改信息效果图
图4-8
图4-9
4.5删除效果图
图4-10
图4-11
4.6统计信息效果图
图4-12
图4-13
图4-14
五、心得体会
在本次实习中,我又重新熟悉了一遍c,感觉很多东西都已经遗忘了,所以在编程的时候需要不断的翻书查资料,用了很多时间,不过编程还算顺利,遇到的问题在看课本之后都解决了。
程序的缺点还有很多,比如没有实现对文本的添加功能,不能在已有的数据上添加新的数据,在程序的输入和输出的地方也有很多的不足,输出的效果也不是很好。
我会在以后进一步熟悉c,改掉这些缺点和错误。
六、参考文献
[1]谭浩强《C程序设计》第三版清华大学出版社2005
[2]张冬梅等《C语言课程设计与实习指导》第一版中国铁道出版社2008
七、附录
主函数
主函数通过菜单,用switch函数调用子函数,来实现各个模块的功能。
voidmain()
{
inta;
voiddi1();
voiddi2();
voiddi3();
voiddi4();
voiddi5();
voiddi6();
/*子函数的申明*/
voiddi7();
voiddi8();
voiddi9();
printf("
\n\n"
);
学生证管理系统\n\n"
菜单\n"
***********************************************"
**1.录入学生的学生证信息**\n"
**2.显示所有学生的学生证信息**\n"
**3.按学号查找某学生的学生证信息**\n"
**4.按班级查找某班所有学生的学生证信息**\n"
**5.修改某学生的学生证信息**\n"
**6.删除某学生的学生证信息**\n"
**7.统计某班的总人数**\n"
**8.统计某学院或某专业的总人数**\n"
**9.按照学号从小到大排序并输出排序后的总信息**\n"
**退出请按其余的任意键**\n"
\n\n\n"
请输入数字后选择菜单\n"
scanf("
%d"
&
a);
switch(a)
{
case1:
di1();
break;
case2:
di2();
case3:
di3();
/*选择菜单*/
case4:
di4();
case5:
di5();
case6:
di6();
case7:
di7();
case8:
di8();
case9:
di9();
default:
按任意键确认\n"
}
}
保存模块
voidsave()/*打开一个文件并写入数据*/
FILE*fp;
inti;
if((fp=fopen("
stu_list.txt"
"
w"
))==NULL)
printf("
cannotopenfile\n"
return;
for(i=0;
i<
N;
i++)
fprintf(fp,"
%-5d%-5d%-10s%-5s%-5s%-10s%-10s%-5d%-5d\n\n"
stu[i].xuehao,stu[i].banhao,stu[i].name,stu[i].sex,stu[i].minzu,stu[i].xueyuan,stu[i].zhuanye,stu[i].shengri,stu[i].shenfenzheng);
fclose(fp);
录入函数
voiddi1()/*录入数据*/
intt;
FILE*fp3;
fp3=fopen("
Num.txt"
你需要录入几位学生的信息\n"
N);
putw(N,fp3);
请依次输入\n"
{
第%d个学生\n"
i+1);
学号:
"
scanf("
stu[i].xuehao);
班号:
stu[i].banhao);
姓名:
%s"
stu[i].name);
性别:
stu[i].sex);
民族:
stu[i].minzu);
学院:
stu[i].xueyuan);
专业:
stu[i].zhuanye);
生日:
stu[i].shengri);
身份证:
stu[i].shenfenzheng);
save();
fclose(fp3);
录入成功\n"
--返回主菜单按:
1----\n"
--重新录入按其他任意数字----\n"
t);
if(t==1)main();
elsedi1();
显示所有学生的信息
voiddi2()/*显示所有学生的数据*/
r"
fp=fopen("
N=getw(fp3);
所有学生信息如下\n"
fscanf(fp,"
%d%d%s%s%s%s%s%d%d"
stu[i].xuehao,&
stu[i].banhao,stu[i].name,&
stu[i].sex,&
stu[i].minzu,&
stu[i].xueyuan,&
stu[i].zhuanye,&
stu[i].shengri,&
学号:
%-5d班号:
%-5d姓名:
%-10s性别:
%-5s民族:
%-5s\n学院:
%-10s专业:
%-10s生日:
%-5d身份证:
%-5d\n\n"
elsedi2();
按学号查找
voiddi3()/*按学号查找学生信息*/
intb;
intg=0;
请输入您要显示的学生的学号\n"
b);
fscanf(fp,"
stu[i].banhao,stu[i].name,stu[i].sex,stu[i].minzu,stu[i].xueyuan,stu[i].zhuanye,&
if(stu[i].xuehao==b)
g=g+1;
if(g!
=0)
该学生信息如下\n"
{
if(stu[i].xuehao==b)
}
else
没有该学生\n"
\n"
elsedi3();
按班号查找
voiddi4()/*显示某班所有学生的数据*/
intc;
请输入您要显示的班的班号\n"
c);
if(stu[i].banhao==c)
该班的所有学生的信息如下\n"
if(stu[i].banhao==c)
没有该班\n"
elsedi4();
修改
voiddi5()/*按学号修改学生的信息*/
intd;
intm;
intn;
charp[20];
charq[20];
charr[20];
chars[20];
chart1[20];
intu;
intv;
请输入您要修改的学生的学号\n"
d);
if(stu[i].xuehao==d)
for(i=0;
if(stu[i].xuehao==d)
{
printf("
该学生的原信息如下\n"
%-1