C语言程序设计报告.docx
- 文档编号:6337037
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:23
- 大小:105.50KB
C语言程序设计报告.docx
《C语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
C语言程序设计报告
文件排版存档编号:
[UYTR-OUPT28-KBNTL98-UYNN208]
C语言程序设计报告
C语言课程设计报告
《计算机程序设计基础》课程设计
题目学生信息管理系统
学生姓名胡乔楠
学号
指导教师汤哲
学院信息科学与工程学院
专业班级电气0821班
完成时间七月四号
第一章项目概述
1.1问题的要求分析与描述
1.2问题的要求和限制
第二章项目设计
2.1系统程序的组成框图
2.2:
程序的流程图
2.3详细设计
第三章调试与结果
3.1调试方法
3.2测试结果(见附录A、B)
第四章工作总结
附录A、B;
源代码;
参考文献;
第一章项目概述
1.1问题的要求分析与描述
我设计一个学生信息管理系统。
首先学生的信息包括:
学号、姓名、年龄、性别、出生年月、家庭地址、电话号码、电子邮件、毕业学校等等。
这个管理系统需要实现以下功能:
1.系统以菜单的方式工作;
2.实现学生信息的录入功能,学生的信息保存在文件中;
3.实现学生信息的输出功能,输出功能应包括如下算法:
3_1:
单个学生按学号查询功能;
3_2:
单个学生按姓名查询功能;
3_2:
全部学生的浏览功能;
3_3:
全部学生按学号排序浏览功能;
4.实现学生信息的删除和修改;
1.2问题的要求和限制
1:
系统要美观,有欢迎界面;
2:
在输入信息时要有一定的容错能力,比如年龄输入为负数或者大于150就提示有错,要求重新输入;
第二章项目设计
2.1系统程序的组成框图如下:
2.2:
我设计的程序,其主要流程图如下:
假
假
真假
真
真假
真
真假
假真
假真
假真
假
2.3详细设计
系统在visualstudioc++中运行,visualstudioc++支持中文并且有强大输出功能。
这样就能作出美观的界面,并且制作出详细的菜单。
2.3.1编译预处理命令
在开头就调用了“stdio.h”和“string.h”函数,并且定义了一个结构体数组,数组中有一百个结构体。
每个结构体中有长整型,整型,字符型数组,
还有指针,为以后制定链表用。
定义了一个全局变量“i”。
此变量来记录学生的个数。
2.3.2main函数
所有的函数都写在main函数中并给他调用。
Main函数中首先定义了一些整型数据,ch1、ch2、j、长整型数据“number”,字符数组“name”,文件指针。
接着“printf”函数打印出一个欢迎界面。
用死循环进入一个选择菜单,用户输入选项来运行系统。
用“scanf”函数来给ch1赋值。
接着程序就进入一个多分支if语句中。
通过判断,程序运行进入相应的功能区。
Ch1=0就会跳出此模块,返回上一模块。
Ch1=1时,函数进入学生信息录入功能,用户输入学生的信息。
在输入信息时会有容错能力。
比如输入性别不是男或女,就会提示输入错误,要求用户重新输入;使用“fwrite”函数,使学生的信息保存在C盘中名为“INFORMATION.txt”的文档中。
ch1=2时,函数进入学生信息查询功能。
用户根据菜单输入信息进入相应的子功能。
用户可以更具菜单选择相应的功能。
Ch3=0,系统就会返回上一个功能。
Ch3=1,系统就会按学生学号来查询学生信息,用户输入学号。
若学号正确,则系统输出相应的学生信息。
若错误,系统就提示用户学号错误,请重新输入。
Ch3=2,系统就会按学生姓名来查询学生信息,用户输入姓名。
若姓名正确,则系统输出相应的学生信息。
若错误,系统就提示用户姓名错误,请重新输入。
Ch3=3,系统进入学生信息浏览功能,同样有一个菜单供用户选择,1为浏览所有学生的信息。
用“for”循环把所有学生的信息从文本中用“fread”函数读出来,在把所有结构体成员一一打印出来。
这时调用了一个“print(intl)”函数。
在主函数中,把“i”传给“n”。
2为按学号的顺序来浏览所有学生的信息,调用“paixu(intn)”函数。
主函数把“i”的值传给“n”,实现学生的信息排序,并打印出来。
同样,选择为0时就返回上一级菜单。
若ch1=3,系统进入删除功能模块。
此时调用了“deletes(intn)”,主函数把“i”的值传给“n”,实现学生信息的删除功能。
若ch1=4,系统进入修改功能模块,此时调用了“changes()”,主函数实现学生信息的修改功能。
(欢迎界面、开始菜单、容错能力、单个查询功能见附录A)
2.3.3print函数
“print(intl)”函数中,从主函数接收变量“i”,并把其值赋给“l”。
“print(intl)”函数用“structstudents*p1”,定义了一个结构体指针。
接着用“printf”函数打印各个结构体的成员,“p1->num”等来表示成员。
2.3.4paixu函数
“paixu(intn)”从主函数接收变量“i”,并把其值赋给“n”。
“paixu(intn)”中定义了两个整型数据,用来作为循环时的变量。
以及两个结构体数组u[100]和v[100],一个文件指针。
函数先用for循环和“fread”函数把文件中的数据读出来并赋值给u[100]。
接着对u[100]来进行冒泡排序,v[100]作为中间变量来实现排序。
排完后,把u[100]中的数据用“printf”函数打印出来。
2.3.5deletes函数
“deletes(intn)”从主函数接收变量“i”,并把其值赋给“n”。
“deletes(intn)”中定义了三个整型变量“j”、“k”和“chioce”,一个长整型变量“number”,一个结构体数组“structstudentsu[100]”,一个文件指针。
函数先判断有没有学生信息被录入,如果没有,系统则自动返回。
如果有,则要求用户输入要删除学生的学号。
用“scanf”函数给“number”赋值,并判断文本中是否有此学生的信息,如果此学生的信息不存在,则系统会提示用户学生不存在,并自动返回。
如果学生信息存在,则系统将打印学生的全部信息,并再一次提示用户是否要删除此学生。
当用户选择1时,系统删除此学生信息,选择否时,系统将自动返回,学生信息改变。
2.3.6changes函数
“changes()”函数没有形参,直接对文件中的结构体进行修改。
“changes()”函数中定义了两个文件指针“fp1”和“fp2”,一个长整型数据“number”,三个整形数据“j”“flag”“choice”。
函数先判断有没有学生信息被录入,如果没有,系统则自动返回。
如果有,则要求用户输入要修改学生的学号。
“fp1”指向文本“INFORMATION.txt”,“fp2”在c盘中重新建立一个文本“change.txt”。
用“fread”读出文本中的学生信息。
用“scanf”函数给“number”赋值,并用“for”循环来判断文本中是否有此学生的信息,如果此学生的信息不存在,则系统会提示用户学生不存在,并自动返回。
如果学生信息存在,则系统将调用“print(intn)”函数打印学生的全部信息,并给用户选择要修改的具体内容。
用“switch”分支语句来判断并修改用户所指定的项。
不管每个结构体是否修改,都会用“fwrite”函数把读出来的结构体写进“change.txt”中。
For循环终止后,再把所有的结构体从“change.txt”中写进空的“INFORMATION.txt”中。
这样就能很好的完成修改了。
(其中浏览、按学号排序浏览、学生删除、学生修改的具体的执行结果见附录B)
第三章调试与结果
3.1调试方法:
visualstudioc++有很好的调试与查错功能,写好代码后首先按“build”键来查错。
程序会把所有错误和警告显示出来,找到程序有错的地方,参考错误的原因,仔细查看程序改写代码,确认无误后,再按“build”键。
若有错误就再看错误并改写原代码。
若无误就再纠正下一个错误。
很多错误就是这样一个一个慢慢地解决。
调试结果分析与讨论:
开始写的代码是实现学生信息录入与单个查询功能,在查询结果时,发现毕业学校的信息被重复打印到了电子邮件里面。
接着就查找打印是否有错,确认无误后,结果没有变。
就查找程序开始的赋值是否有错,最终发现了错误,在“scanf(“%s”,&s[j].graduateschool);”中误加了“&”这个符号。
修改后,打印结果正确。
对所有学生的信息按照学号的顺序来浏览功能中,要用到冒泡排序法,用两个“for”循环来完成,其中的变量有固定的形式要求。
并且终止条件也很严格的要求。
刚开始我用了错误的算法,后来通过问老师,得到正确的方法,再经过反复的推敲,实现了排序功能。
在实现修改功能中,我找不到算法,从书上的找了一个算法,书写完后,发现程序直接跳出修改的选择信息模块。
经检查后发现“getchar()”这个函数出了问题,最后修改了代码,删除“getchar()”函数。
得到了正确结果。
主要问题及解决方法1。
在书写长代码时,要用到很多“{}”这样的符号,有时会漏掉这个符号,导致错误;所以书写时一定要非常细心,严格按照语法来写2.“}”花括号在某些地方有很多,在修改程序或者添加程序时会很麻烦,不知道应该在哪个地方添加,或者该删除哪个“}”。
所以,凡是有“{}”的都要用“/*文字*/”来标记,以后就不用一个个找原来语句了。
3。
在修改过程中修改了一个变量,却没有发现其他地方的相应程序也要修改,导致查出许多错误。
4。
我曾经用两个指针指向同一个文件,visualstudioc++并不报错,但是我的排序和修改功能一直实现不了。
最后问老师,才知道一个指针只能指向同一个文件。
修改了指针及相应的程序后,我的功能实现了。
5.使用冒泡排序法时,结构体的个数控制得很严格,最终发现for循环多走了一步。
把“n”减一就解决了问题。
3.2测试结果:
输入了学生的信息后能正确打印。
有时候在字符数组里面输入整型数据时,后面的“scanf”函数就不再正确执行。
把整型数据改为字符型后,就能正确运行程序了。
有时候排序功不正确,是在终止结果里面出了错误。
所有的程序运行数据和结果都在附录A、B中。
第四章工作总结
这次课程设计的任务原本要求是以十个人为一组一起合作完成,但是作为一个已经选了计算机科学与技术专业的学生,应该具备很强的编程能力。
为了好好锻炼自己的编程能力,我毅然决定一个人独立完成此次课程设计。
刚开始我只知道要用文件来做这个课程设计,但是我的文件那块掌握得不好,就看老师给我们讲的文件的程序。
先是复习,再去写程序。
按照课程设计的要求,我先定义结构体,再把所有的知识都运用上去。
前四天,我把学生信息录入功能、学生信息按学号当个查询功能做好了。
在按学生姓名查询的时候,要用到“#include
并且字符串处理函数都忘了,接着就看书把“strcmp”这个函数的功能及用法掌握。
最后完成了按学生姓名查询功能。
看着自己完成的程序,心中很高兴。
还拿了同学的信息来做实验。
当时信心大增,想着用一个星期就能完成任务。
没想到后面的程序是如此的困难。
因为前四天我写的程序还不长,所用到的知识和算法都还相对简单。
到了浏览学生信息的哪一个功能,我就几天都实现不了了。
在这之前,我编写的程序都没有用模块化编写,一个主函数就包括了上述所有的功能。
我就开始编写功能函数。
把排序功能全写到一个“paixu(intn)”中。
我到处查阅资料,向老师请教,问同学。
终于搞清楚了算法。
就是用冒泡排序法。
我按照这个思路去做也没有得出正确结果。
一连两三天,我都找不出错误的原因,反复修改也不行。
编译环境也没有报错。
在找老师查看我的源代码之后,发现我用了两个文件指针指向了同一个文件,书上没有这样讲过,但也没有说这样不对。
我自认为是对的,却花了我这么多时间去改他。
这次教训中,我深刻的体会到。
要想运用一个新知识,必须的问问老师或者在行的人是否能用,不能擅作主张。
我经快修改完程序,并且调试、查错。
实现了排序的功能,我当时高兴的跳起来。
这就是编程中的快乐。
参考文献很重要。
在做修改的功能时,我找不到算法。
但在一本书中,我找到类似的算法,经过反复推敲。
我决定引用其中的算法。
编写的函数很长,并且那段代码必须经过修改才能在我的程序中实现修改功能。
因为有参考,这个功能还是相对容易实现的。
最后就是删除功能了,算法了解后,就直接开始编程。
找到要删除的学生,接着把所有的结构体都后移一位。
但是在循环体中,哪个变量因该是多少,会不会多了一1,或者少了一个1,这需要自己去耐心调试。
总体来说,变成是很麻烦的。
中途我就又放弃的念头,因为那是连程序的一般都没有完成,但是一个功能就花了我几个下午的时间,却没有一点进展。
还好我没有放弃,毕竟
大学里面的学习机会十分宝贵。
四年也只有一次这样系统的C语言编程技巧的时间。
这次独立完成,对以后的学习和编程也会有很大的帮助。
自己感到惭愧的是,老师教C语言的时候没有把它学得很通。
在写程序的时候经常有很多与发行的错误,还有在运用一些简单的语句时,忘记了其中的格式。
语法中经常有笔误,都是平时训练少,对自己要求不严格的结果。
还有参考文献,虚心向别人请教。
很多问题,也许看看书,问问老师之后就会迎刃而解。
读程序多了之后,就会对编程很有感觉,编程的速度会提高、质量会变高、思路也会越来越清晰。
附录A:
欢迎界面和开始菜单:
输入信息时的容错能力:
学生信息的录入功能:
按学号来查询学生,以及选择菜单时的容错能力:
按姓名来单个查询的功能:
附录B:
按时间顺寻来浏览所有学生的信息:
按学号的大小来浏览所有学生的信息:
对学生的姓名进行修改:
紧接着修改学生的年龄
修改完后,查询学生的信息是否被修改:
查询结果
删除学生信息的功能:
查看是否已经被成功删除:
以下是源代码:
#include
#include
voidprintstarts(){printf("*************************************************\n");}
structstudents{
longnum;
charname[15];
intage;
charsex[4];
charbirthdate[15];
charaddress[30];
charphonenumber[15];
charemail[20];
chargraduateschool[20];
structstudents*next;
}s[100],*p;/*定一个有一百个成员的结构体数组*/
inti=0;/*定义一个全局变量,记录被录入学生的个数*/
voidprint(intl);
voidpaixu(intn);
voiddeletes(intn);
voidchanges();/*先定义所有的功能函数,供主函数中调用*/
voidmain(){
intch1,ch2,ch3,ch4,ch5,ch6,ch7,flag1=0;
intflag2=0,j,choice=1;
intch0=0;
longnumber;
charname[20];
FILE*fp;
printf("\n\n\n\n\n\n");
printf("\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\t\t◆欢迎进入学生信息管理系统◆\n");
printf("\t\t◆------------------------------------------◆\n");
printf("\t\t◆胡乔楠◆\n");
printf("\t\t◆------------------------------------------◆\n");
printf("\t\t◆2009年7月3日◆\n");
printf("\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");/*美观的欢迎界面*/
printf("\n\n\n\n");
while
(1){
printf("\n");
printf("\n");
printf("\n");
printf("\t\t学生信息管理系统\n");
printf("\t\t==============================\n");
printf("\t\t1.添加学生信息\n");
printf("\t\t2.查询学生信息\n");
printf("\t\t3.删除学生信息\n");
printf("\t\t4.修改学生信息\n");
printf("\t\t0.退出系统\n");
printf("\n");
printf("\n\n\t请按键选择功能(0~4):
");
scanf("%d",&ch1);
if(ch1==0){break;}
elseif(ch1==1){
while(choice==1){
fp=fopen("c:
\\INFORMATION.txt","a+");
printf("请输入学号:
");scanf("%ld",&s[i].num);
printf("请输入姓名:
");scanf("%s",s[i].name);
printf("请输入年龄:
");scanf("%d",&s[i].age);/*加入容错能力*/
if(s[i].age<=0||s[i].age>=150){printf("输入错误,请重新输入\n");
break;
}
printf("请输入性别(男/女):
");
scanf("%s",s[i].sex);
if(strcmp(s[i].sex,"男")!
=0&&strcmp(s[i].sex,"女")!
=0){
printf("输入错误,请重新输入\n");
break;
}
printf("请输入出生日期:
");scanf("%s",s[i].birthdate);
printf("请输入家庭地址:
");scanf("%s",s[i].address);
printf("请输入电话号码:
");scanf("%s",s[i].phonenumber);
printf("请输入电子邮件:
");scanf("%s",s[i].email);
printf("请输入毕业学校:
");scanf("%s",s[i].graduateschool);
fwrite(&s[i],sizeof(structstudents),1,fp);
fclose(fp);
printf("\t\t添加成功!
\n");
i++;/*输入一个学生就加一次*/
printf("\n");
printf("\t\t是否再添加?
\n");
printf("\t\t1:
添加\n");
printf("\t\t0:
不添加\n");
scanf("%d",&choice);
if(choice==0){break;}
elseif(choice==1){continue;}
else{choice=2;
printf("选择错误!
!
系统自动返回\n");
break;
}
}
/*ch1==1*/}
elseif(ch1==2){
/*check*/while
(1){/*此处是查询功能的菜单*/
printf("\t\t1.按单个学号来查询\n");
printf("\t\t2.按学生姓名来查询\n");
printf("\t\t3.查询所有学生信息\n");
printf("\t\t0.返回上一级菜单\n");
scanf("%d",&ch2);
if(ch2==0){break;}
elseif(ch2==1){
while
(1){
printf("\t\t1.继续服务\n");
printf("\t\t0.返回上一级菜单\n");
printf("\n\n\t请按键选择:
");
scanf("%d",&ch3);
if(ch3==0){break;}
elseif(ch3==1){
fp=fopen("c:
\\INFORMATION.txt","r");/*用学号来查*/
printf("请输入学号:
");
scanf("%ld",&number);
for(j=0;j
fread(&s[j],sizeof(structstudents),1,fp);
if(s[j].num==number){
flag1=1;
print(j);
fclose(fp);
if(flag1==0){printf("号码不存在!
\n");break;}
/*if*/}
/*for*/}
/*ch3==1*/}
else{printf("选择错误!
!
系统自动返回\n");
}
/*while
(1)*/}
/*ch2==1*/}
elseif(ch2==2){
/*ch4*/while
(1){
printf("\t\t1.继续服务\n");
printf("\t\t0.返回上一级菜单\n");
printf("\n\n\t请按键选择:
");
scanf("%d",&ch4);
if(ch4==0){break;}
elseif(ch4==1){
printf("请输入名字:
");/*用学生姓名来查询*/
scanf("%s",name);
fp=fopen("c:
\\INFORMATION.txt","r");
for(j=0;j<=i;j++){
fread(&s[j],sizeof(structstudents),1,fp);
if(strcmp(name,s[j].name)==0){
flag2=1;
printf("查询成功!
!
\n");
print(j);
fclose(fp);
if(flag2==0){printf("名字不存在!
");break;}
/*if*/}
/*for*/}
/*ch4==1*/}
else{printf("选择错误!
!
系统自动返回\n");
}
/*3while
(1)*/}
/*ch2=2*/}
elseif(ch2==3){
while
(1){
printf("\t\t1.按时间循序来查询所有学生信息\n");
printf("\t\t2.按学号来查询所有学生信息\n");
printf("\t\t0.返回上一级菜单\n");
printf("\n\n\t请按键选择:
");
scanf("%d",&ch5);
/*ch5*/if(ch5==0){break;}
elseif(ch5==1){
for(j=0;j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 报告