C语言的课程设计报告.docx
- 文档编号:28411000
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:14
- 大小:22.14KB
C语言的课程设计报告.docx
《C语言的课程设计报告.docx》由会员分享,可在线阅读,更多相关《C语言的课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
C语言的课程设计报告
C语言的课程设计报告
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
下面是小编想跟大家分享的C语言的课程设计报告,欢迎大家浏览。
通过亲自设计程序,可以令我们熟悉c语言操作,更熟练的掌握c语句。
初步体会编程的过程,为将来的程序深入学习打下基础和培养兴趣。
2.1题目简介
可以向文件中写入、删除、添加职工信息,也可以从文件中导出来浏览
2.2设计要求
职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等。
试设计职工信息管理系统,使之能提供以下功能:
系统以菜单方式工作。
职工信息录入功能(职工信息用文件保存)--输入
职工信息浏览功能--输出
查询和排序功能:
(至少一种查询方式) --算法
按职工号查询
按学历查询等
职工信息删除、添加功能
3.2详细设计:
1、主函数:
main()
显示系统工作菜单,罗列该系统所有功能。
先声明所有将会调用到的函数名。
再运用选择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。
亮点:
定义一个全局指针变量*p和全局变量a。
其中a表示当前系统中职工人数,p指向a的地址,追踪人数变化,这样在添加或者删除导致人数变化后,浏览函数display()能够正确显示出当前人数的职工信息。
宏定义define N指定首次输入的职工人数,可根据不同需要随时更改。
3、保存函数:
voidsave
定义文件指针fp,用fopen"只写"打开指定在D盘的“d:
//”文本文件。
首先用if语句判断文件是否打开成功,若fopen返回值不为0,则可继续下面操作。
用for循环通过fprintf语句将结构数组em中的内容写入保存在D盘的文本文件里面。
形参m指需要写入文件的职工人数。
最后关闭文件。
4、导出函数:
voidload(intb)
首先判断fopen"只读"打开“d:
//”是否成功,若其返回值不为零,继续下面操作。
用for循环通过fscanf语句将文件中的职工信息取出放到em结构数组里面。
形参b指需要导出的职工人数。
最后关闭文件。
5、浏览函数voiddisplay(inta)
声明整形变量i和b,其中i记录输出的职工序数,b用来接收调用浏览函数时所传递过来的实参,接着将其值传递给导出函数load(b),使得导出的职工人数与浏览的职工人数保持一致。
通过调用load函数后,用for循环输出每个职工的各种信息。
8、按姓名查询voidsearch_name()
声明整形变量i和字符形数组name,调用导出函数load,用scanf语句输入要查询的职工名字放在数组name里面。
用for循环,循环主体是先判断中是否有输入的职工姓名,如果有,用printf语句输出与职工名字相对应的该职工所有信息,再跳出循环;如果没有,输出“查无此人”,并调用search返回查询菜单。
流程图同上
9、按学历查询voidsearch_xueli()
声明整形变量i,k=0,char形数组xueli。
调用导出函数load(*P),用scanf语句输入要查询的职工学历放在数组xueli里面。
考虑到与前两种查询方式不一样的是,可能有多个职工具有相同的学历,所以循环主体较之前稍有变化。
即在判断并执行第一次后不用break,而是继续循环,直到找出所有该学历的职工。
为解决输入错误而提示“查无此人”的问题,就需要再写一段for循环代码,通过计量数k记录循环的次数,若直到循环到最后一次仍无结果输出,则表示输入错误,这时用printf输出“查无此人”,并调用search返回查询菜单。
流程图同上
10、,删除函数voiddel(int*b)
声明整形变量i,j,t,m,a和char形数组name。
其中给a附初始值a=*b,表示当前职工人数。
首先调用浏览函数display(a),显示所有职工信息,便于使用者审阅需删除的对象。
用printf语句提示“输入要删除的职工名字”,接着用scanf语句输入删除对象名字。
用for循环,循环主体是先判断中是否存在所输入的名字。
若存在,printf语句提示是否确认删除,用scanf语句输入确认指令,再用for循环从要删除的这个职工开始,依次用后一个职工的信息覆盖前一个的。
循环结束后当前职工人数a自减1,并保存,跳出大循环;若不存在,输出“输入错误,无此人”。
再将a的新值附给*b,实参p所指的人数地址中的人数也随即改变删除后的人数。
printf提示下一步操作“继续删除请按1浏览信息请按2返回主菜单请按3”。
switch根据键盘输入的指令代号选择下一步连接的函数。
11、添加函数voidadd
声明整形变量i,n,m,定义文件指针fp,用追加的方式打开文件"d:
//",若打开失败,退出。
若成功,继续下面操作。
printf提示“输入要添加的人数”
scanf输入要添加的人数存放在n。
用for循环输入要添加的职工信息,再用另一个for循环将输入的新信息追加写入"d:
//"文件保存。
关闭文件。
再调用switch语句选择下一步操作,并连接到相应函数。
流程图与删除函数类似。
3.3调试与测试:
。
遇到最大的问题是所有程序代码编完放在一起后,虽然能够成功运行,但使用时如果职工人数发生变化,会导致文件后部出现乱码。
若要使每次运行都正常,必须在人数改变后退出程序,修改宏定义N的值。
这样很不方便,不能够连续运行。
为解决这一大问题,最后我想到了定义一个全局指针变量,用来追踪最新的人数。
特别是删除和添加这两个会导致人数变化的函数中,全局指针变量p起了很大作用。
经过一边修改一边调试,最终可以成功的用p串联整个函数,在连续运行时,总能根据最新的人数调用各个函数。
另外在串联所有函数时,调试提示出错:
有几个函数“redefinition;differentbasictypes”解决:
在函数名前加void指明类型。
整个程序代码是分块书写的,每个函数都可以独立运行。
只有输入函数查询菜单函数写得很顺利,一次性就能够成功运行,其他函数在调试过程中或多或少都出现了问题。
1、保存函数save()在调试和链接的时候都没有出现错误提示,但在运行的时候出现了问题。
写入指定位置的文件,打开后总会有乱码。
与c语言课本上的例题对照后发现,我写的fopen("d:
//bbb","w")没有指定文件的存储类型。
解决方法:
在文件名bbb后面加上.txt后即可。
2、导出函数load()遇到两个问题。
1是为图方便直接将保存函数复制过来进行修改时,忘了修改文件的打开方式,不能运行。
经多次检查后终于发现了,解决:
将只写"w"改为只读"r"。
2是用fscanf语句时,漏写地址符。
调试和链接都没问题,但点击运行后,总出现一个提示出错的蓝色小窗口。
经老师提时候发现了错误所在。
解决:
在em.name等之前加上地址符。
3、浏览函数display()遇到的问题虽然不大,但解决起来很麻烦。
理想的运行结果是美观整齐。
即下面的职工信息分别与第一个printf输出的中文项目提示对齐。
解决方法:
不断修改空格个数,不断运行察看效果。
4、按学历查询函数search_xueli(),要考虑输入一种学历,可能对应出很多职工,这就不能延用按姓名和职工号查询中判断是否输入错误的方法了。
为了显示出所有具有该学历的职工,就需要让for循环一直运行到最后一个为止。
这时计量数i始终会等于职工人数,不能再用i来判断是否不存在此人。
这就需要再定一个整形变量k,用来计量单独的一个循环次数。
5、删除函数del()的难点在于多次删除。
即在删除掉第一个人以后,现有职工人数发生改变,而宏定义中的N却是不变的。
最开始我想到了用static定义一个整形变量a来计量当前人数。
这在单独运行删除函数时,可以成功的连续删除。
最后所有函数串在一起时,有了更好的解决方法,全局指针。
6、添加函数add()遇到的问题是用printf输入新职工信息后,保存到文件里面,发现原有的信息不见了。
解决:
文件打开方式改用"a"追加写入。
经过一学期的C语言学习,我们掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。
平时的程序设计大多是以填空的形式出现,虽然有所接触,但都不完全。
而这两周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。
这是一个新的挑战,也是一种新的学习。
我们组选择的是备选题目中的第一个——职工信息管理系统。
这需要我们自己设计一个系统,可以输入信息,保存到文件里,再从文件里调出来,使之显示在屏幕上,进行删除、添加等对信息的修改。
初看到这个题目觉得很简单,但当我做到电脑前准备开始编写代码的时候才发现无从下手。
通过去图书馆查找程序设计相关的书籍,和上网参考前人编写的类似程序,我脑中才有了一个大概方向。
终于开始着手写下了第一段输入函数的代码,因为这是我们平时课堂上用的最多最熟的printf语句,写了很长一大段,调式运行竟然成功了,顿时信心倍增。
于是我开始迫不及待的开始写第二段保存函数。
我记得第一天下来,我只写好了这两个函数,但还是很开心,因为这是我编的第一个小系统的成功的开始!
接下来几天都在宿舍整个下午的对着电脑不断的编译、调试、修改,每次编好一个能够成功运行的程序,都会感到很欣慰,并增加继续下去的信心。
当然其中也有遇到困难的时候。
好几次遇到编好的程序调试没有错误,却偏偏不能运行这种情况,自己编的程序自己很难发现当中的错误,而电脑又没有提示,这时候就很受打击,也会着急。
反复检查都找不出毛病来的时候就会有想要放弃的念头。
有时候就直接关机去做别的事情,等再开始做程序的时候,才发现先前的错误所在。
这时候会有一种“柳暗花明又一村”的欣慰感觉。
总之,遇到困难,可以先放一放,让脑子休息一下,忘掉错误的记忆。
或许等过段时间再回过头来,就会很容易的发现之前的错误了。
随着编好的程序越多,累积的经验也越多,查找错误就越快了。
还有会发现很多程序有很多相似之处,可以通过复制修改的发式来编写。
虽然题目要求只需要一种查询方式,但当我编出规律之后自然就想多写两个,写完就会有很大的成就感了。
在课程设计的过程中,还有一件很倒霉的事。
7月5号早上我们有一门考试,靠前还需要复习的那种。
所以我打算4号早上写会儿程序,从下午开始就复习第二天要考的科目,结果从早上开始写删除函数的代码,一边调试,一边修改,越来越接近成功,越激动越投入,等最后终于完成的时候猛然发现已经下午4点多了。
乘着兴致高,一口气把添加函数也写出来了。
虽然只能把复习挤到晚上进行,但因为编好了两个很难的程序代码,觉得这一天还是很有成就感的,很开心。
结果不幸的是,等我第二天考完试回来打算继续编的时候,才发现之前辛辛苦苦编的两段代码没有保存。
没办法,只能重新写。
当所有功能函数都编好后,我用主函数将他们串起来,这是遇到最大的问题就是经过删除、添加后职工人数会发生变化。
想了很久,又翻以前的课堂笔记,最后想到了定义全局指针变量来解决这个问题。
这个问题的成功解决预示着我们的职工信息管理系统大功告成!
总之,经过这一次的课程设计,我们体会到了痛苦与快乐同存的感觉。
当最后一次成功串联运行所有函数时,真的很开心。
通过这次实践,我们能够更熟练掌握C语言,特别是循环和文件,当时在课堂上没有学太清楚的,这个程序设计之后都很明白了。
同时增加了我们对程序设计的兴趣,暑假回家我还会尝试着做一些其他的小系统。
#include
#include
#defineN6
structemployee
{
intnumber,age,wage;
charname,sex,address,xueli;
longinttelephone;
}em;
inta=N;
int*p=&a;
main()
{
voidsearch();
voidsearch_name();
voidsearch_xueli();
voidsearch_number();
voidload();
voiddisplay();
voiddel();
voidinput();
voidadd();
voidsave();
intn;
printf("");
printf(" ******************职工信息管理****************");
printf("");
printf(" 1.录入职工信息");
printf(" 2.浏览职工信息");
printf(" 3.查询职工信息");
printf(" 4.删除职工信息");
printf(" 5.添加职工信息");
printf(" 6.退出");
printf("");
scanf("%d",&n);
switch(n)
{
case1:
printf(" ◆◆◆输入职工信息◆◆◆");printf("");input();main();break;
case2:
printf(" ◆◆◆浏览职工信息◆◆◆");printf("");display(*p);main();break;
case3:
printf(" ◆◆◆查询职工信息◆◆◆");printf("");search();break;
case4:
printf(" ◆◆◆删除职工信息◆◆◆");printf("");del(p);break;
case5:
printf(" ◆◆◆添加职工信息◆◆◆");printf("");add(p);break;
case6:
exit(0);break;
default:
break;
}
}
voidinput()
{
inti;
for(i=0;i {
printf("请输入职工号:
");
scanf("%d",&em.number);
printf("请输入姓名:
");
scanf("%s",em.name);
printf("请输入性别:
");
scanf("%s",&em.sex);
printf("请输入年龄:
");
scanf("%d",&em.age);
printf("请输入学历:
");
scanf("%s",em.xueli);
printf("请输入工资:
");
scanf("%d",&em.wage);
printf("请输入住址:
");
scanf("%s",em.address);
printf("请输入电话:
");
scanf("%d",&em.telephone);
printf("");
}
printf("创建完毕!
");
save(N);
}
voidsave(intm)
{
inti;
FILE*fp;
if(!
(fp=fopen("d:
//","w")))
{
printf("打开失败");
exit(0);
}
for(i=0;i fprintf(fp,"M%8s%5s]%8s]%8s",em.number,
em.name,em.sex,em.age,em.xueli,em.wage,
em.address,em.telephone);
fclose(fp);
}
voidload(intb)
{
inti;
FILE*fp;
if(!
(fp=fopen("d:
//","r")))
{
printf("打开失败");
exit(0);
}
else
for(i=0;i fscanf(fp,"%8s%5s]%8s]%8s",&em.number,&em.name,&em.sex,&em.age,&em.xueli,&em.wage,&em.address,&em.telephone);
fclose(fp);
}
voiddisplay(inta)
{
inti,b=a;
load(b);
printf("职工号 姓名性别年龄学历 工资 住址 电话");
for(i=0;i printf("%d%8s%s%d%8s %d%s%d",em.number,em.name,em.sex,em.age,em.xueli,em.wage,em.address,em.telephone);
printf("");
}
voidsearch()
{
intt;
printf("按职工号查询按1按姓名查询请按2");
printf("按学历查询请按3返回主菜单请按4");
scanf("%d",&t);
switch(t)
{
case1:
printf("按职工号查询");
search_number();
break;
case2:
printf("按姓名查询");
search_name();
break;
case3:
printf("按学历查询");
search_xueli();
break;
case4:
main();break;
default:
printf("输入错误,请重新输入!
");
search();
break;
}
}
voidsearch_number()
{
inti,number;
load(*p);
printf("请输入要查询的职工号:
");
scanf("%d",&number);
for(i=0;i if(number==em.number)
{
printf("该职工信息如下:
");
printf("职工号 姓名性别年龄学历 工资 住址 电话");
printf("%d%8s%s%d%8s %d%s%d",em.number,em.name,em.sex,em.age,em.xueli,em.wage,em.address,em.telephone);
printf("");
break;
}
if(i==*p)
printf("查无此人");
search();
}
voidsearch_name()
{
inti;
charname;
load(*p);
printf("请输入要查询的姓名:
");
scanf("%s",name);
for(i=0;i if(!
strcmp(em.name,name))
{
printf("该职工信息如下:
");
printf("职工号 姓名性别年龄学历 工资 住址 电话");
printf("%d%8s%s%d%8s %d%s%d",em.number,em.name,em.sex,em.age,em.xueli,em.wage,em.address,em.telephone);
printf("");
break;
}
if(i==*p)
printf("查无此人");
search();
}
voidsearch_xueli()
{
inti,k=0;
charxueli;
load(*p);
printf("请输入要查询的学历:
");
scanf("%s",xueli);
for(i=0;i if(!
strcmp(em.xueli,xueli))
{
printf("职工号 姓名性别年龄学历 工资 住址 电话");
printf("%d%8s%s%d%8s %d%s%d",em.number,em.name,em.sex,em.age,em.xueli,em.wage,em.address,em.telephone);
}
for(i=0;i {
if(!
strcmp(em.xueli,xueli))
break;
elsek++;
}
if(k==*p)
printf("查无此人");
search();
}
voiddel(int*b)
{
inti,t,j,m;
inta=*b;
charname;
printf("所有职工信息:
");
display(a);
printf("请输入要删除职工的名字:
");
scanf("%s",name);
for(i=0;i {
if(!
strcmp(em.name,name))
{
printf("确认删除请按1取消请按2");
scanf("%d",&t);
if(t==1)
{
for(j=i;j {
em.age=em.age;
em.wage=em.wage;
em.number=em.number;
em.telephone=em.telephone;
strcpy(em.xueli,em.xueli);
strcpy(em.name,em.name);
strcpy(em.address,em.address);
strcpy(em.sex,em.sex);
}
a--;
save(j);
break;
}
if(t==2)
break;
}
}
if(i==a)
printf("输入错误,无此人");
*b=a;
printf("继续删除请按1浏览信息请按2返回主菜单请按3");
scanf("%d",&m);
switch(m)
{
case1:
del(p);break;
case2:
display(*b);main();break;
case3:
main();break;
default:
break;
}
}
voidadd(int*a)
{
inti,n,m;
FILE*fp;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告