C语言程序设计.docx
- 文档编号:5151661
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:23
- 大小:226.53KB
C语言程序设计.docx
《C语言程序设计.docx》由会员分享,可在线阅读,更多相关《C语言程序设计.docx(23页珍藏版)》请在冰豆网上搜索。
C语言程序设计
课程设计报告
课程名称C语言课程设计
课题名称职工信息管理系统
专业纺织工程
班级1303
学号26
姓名詹翊姗
指导教师田媛
2014年09月08日
湖南工程学院
课程设计任务书
课程名称C语言课程设计
课题职工信息管理系统
专业班级纺织工程
学生姓名詹翊姗
学号26
指导老师田媛
审批
任务书下达日期2014年09月01日
任务完成日期2014年09月08日
目录
1系统需求分析6
2概要设计6
3详细设计6
4系统测试7
5课程设计总结9
1系统需求分析
职工信息管理系统是为了良好的管理职工的信息,方便查询了解职工的具体情况而设计的一个便利工具。
主要用来进行对职工信息的录入、修改、删除、输出、查询。
2概要设计
系统功能模块图:
3详细设计
3.1数据结构
介绍本系统中所用的数据结构,包括结构体的定义,各个变量的含义,以及是使用链表还是数组,可以简要说明理由。
1、主函数:
main()
显示系统工作菜单,罗列该系统所有功能。
先声明所有将会调用到的函数名。
再运用选择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。
亮点:
定义一个全局指针变量*p和全局变量a。
其中a表示当前系统中职工人数,p指向a的地址,追踪人数变化,这样在添加或者删除导致人数变化后,浏览函数display()能够正确显示出当前人数的职工信息。
宏定义defineN指定首次输入的职工人数,可根据不同需要随时更改。
2、输入函数:
voidinput()
定义一个结构structemployee和数组用来储存N个职工的所有信息(职工号em[i].number、姓名em[i].wage、住址em[i].address、电话em[i].telephone)。
通过for循环输入所有职工信息。
用printf语句提示需要输入的内容,接着用scanf语句输入相应内容。
输入完毕后套用保存函数save(N)将所输入的内容写入指定文件。
3、保存函数:
voidsave(intm)
定义文件指针fp,用fopen"只写"打开指定在D盘的“d:
//bbb.txt”文本文件。
首先用if语句判断文件是否打开成功,若fopen返回值不为0,则可继续下面操作。
用for循环通过fprintf语句将结构数组em中的内容写入保存在D盘的文本文件里面。
形参m指需要写入文件的职工人数。
最后关闭文件。
4、导出函数:
voidload(intb)
首先判断fopen"只读"打开“d:
//bbb.txt”是否成功,若其返回值不为零,继续下面操作。
用for循环通过fscanf语句将文件中的职工信息取出放到em结构数组里面。
形参b指需要导出的职工人数。
最后关闭文件。
5、浏览函数voiddisplay(inta)
声明整形变量i和b,其中i记录输出的职工序数,b用来接收调用浏览函数时所传递过来的实参,接着将其值传递给导出函数load(b),使得导出的职工人数与浏览的职工人数保持一致。
通过调用load函数后(即给em数组附值),用for循环输出每个职工的各种信息。
6、查询函数voidsearch()
声明整体变量t,先用printf语句显示查询菜单,用scanf输入选择的查询方式代号,用switch(t)进入所选择的具体查询函数,包括按职工号查询、按姓名查询、按学历查询三种方式。
7、按职工号查询voidsearchnumber()
声明2个整形变量:
i记录职工的序数,number存放键盘输入的职工号。
调用导出函数load(*p)(*p表示当前的职工人数)。
通过scanf语句从键盘输入需要查询的职工号,并赋值给number。
用for循环,循环主体是先判断em.number中是否有输入的职工号,如果有,用printf语句输出与职工号相对应的该职工所有信息,再跳出循环;如果没有,输入“查无此人”,并调用search()返回查询菜单。
8、按姓名查询void search_name()
声明整形变量i和字符形数组name[20],调用导出函数load(*p),用scanf语句输入要查询的职工名字(字符串)放在数组name里面。
用for循环,循环主体是先判断em.name中是否有输入的职工姓名,如果有,用printf语句输出与职工名字相对应的该职工所有信息,再跳出循环;如果没有,输出“查无此人”,并调用search()返回查询菜单。
9、按学历查询void search_xueli()
声明整形变量i,k=0,char形数组xueli[20]。
调用导出函数load(*P),用scanf语句输入要查询的职工学历(字符串)放在数组xueli里面。
考虑到与前两种查询方式不一样的是,可能有多个职工具有相同的学历,所以循环主体较之前稍有变化。
即在判断并执行第一次后不用break,而是继续循环,直到找出所有该学历的职工。
为解决输入错误而提示“查无此人”的问题,就需要再写一段for循环代码,通过计量数k记录循环的次数,若直到循环到最后一次仍无结果输出,则表示输入错误,这时用printf输出“查无此人”,并调用search()返回查询菜单。
10、,删除函数voiddel(int*b)
声明整形变量i,j,t,m,a和char形数组name[20]。
其中给a附初始值a=*b,表示当前职工人数。
首先调用浏览函数display(a),显示所有职工信息,便于使用者审阅需删除的对象。
用printf语句提示“输入要删除的职工名字”,接着用scanf语句输入删除对象名字。
用for循环,循环主体是先判断em.name中是否存在所输入的名字(调用字符串比较函数stecmp)。
若存在,printf语句提示是否确认删除,用scanf语句输入确认指令,再用for循环从要删除的这个职工开始,依次用后一个职工的信息覆盖前一个的。
循环结束后当前职工人数a自减1,并保存,跳出大循环;若不存在,输出“输入错误,无此人”。
再将a的新值附给*b,实参p所指的人数地址中的人数也随即改变删除后的人数。
printf提示下一步操作“继续删除请按1\n浏览信息请按2\n返回主菜单请按3”。
switch根据键盘输入的指令代号选择下一步连接的函数。
11、添加函数voidadd(int*a)
声明整形变量i,n,m,定义文件指针fp,用追加的方式打开文件"d:
//bbb.txt",若打开失败,退出。
若成功,继续下面操作。
printf提示“输入要添加的人数”
scanf输入要添加的人数存放在n。
用for循环输入要添加的职工信息,再用另一个for循环将输入的新信息追加写入"d:
//bbb.txt"文件保存。
关闭文件。
再调用switch语句选择下一步操作,并连接到相应函数。
遇到最大的问题是所有程序代码编完放在一起后,虽然能够成功运行,但使用时如果职工人数发生变化,会导致文件后部出现乱码。
若要使每次运行都正常,必须在人数改变后退出程序,修改宏定义N的值。
这样很不方便,不能够连续运行。
为解决这一大问题,最后我想到了定义一个全局指针变量,用来追踪最新的人数。
特别是删除和添加这两个会导致人数变化的函数中,全局指针变量p起了很大作用。
经过一边修改一边调试,最终可以成功的用p串联整个函数,在连续运行时,总能根据最新的人数调用各个函数。
另外在串联所有函数时,调试提示出错:
有几个函数“redefinition; different basic types”解决:
在函数名前加void指明类型。
3.2编程中出现的问题与解决方法
整个程序代码是分块书写的,每个函数都可以独立运行。
只有输入函数查询菜单函数写得很顺利,一次性就能够成功运行,其他函数在调试过程中或多或少都出现了问题。
1、保存函数save()在调试和链接的时候都没有出现错误提示,但在运行的时候出现了问题。
写入指定位置的文件,打开后总会有乱码。
与c语言课本上的例题对照后发现,我写的fopen("d:
//bbb","w")没有指定文件的存储类型。
解决方法:
在文件名bbb后面加上.txt后即可。
2、导出函数load()遇到两个问题。
1是为图方便直接将保存函数复制过来进行修改时,忘了修改文件的打开方式,不能运行。
经多次检查后终于发现了,解决:
将只写"w"改为只读"r"。
2是用fscanf语句时,漏写地址符。
调试和链接都没问题,但点击运行后,总出现一个提示出错的蓝色小窗口。
经老师提时候发现了错误所在。
解决:
在em[i].name等之前加上地址符。
3、浏览函数display()遇到的问题虽然不大,但解决起来很麻烦。
理想的运行结果是美观整齐。
即下面的职工信息分别与第一个printf输出的中文项目提示对齐。
解决方法:
不断修改空格个数,不断运行察看效果。
4、按学历查询函数search_xueli(),要考虑输入一种学历,可能对应出很多职工,这就不能延用按姓名和职工号查询中判断是否输入错误的方法了。
为了显示出所有具有该学历的职工,就需要让for循环一直运行到最后一个为止。
这时计量数i始终会等于职工人数,不能再用i来判断是否不存在此人。
这就需要再定一个整形变量k,用来计量单独的一个循环次数。
5、删除函数del()的难点在于多次删除。
即在删除掉第一个人以后,现有职工人数发生改变,而宏定义中的N却是不变的。
最开始我想到了用static定义一个整形变量a来计量当前人数。
这在单独运行删除函数时,可以成功的连续删除。
最后所有函数串在一起时,有了更好的解决方法,全局指针。
6、添加函数add()遇到的问题是用printf输入新职工信息后,保存到文件里面,发现原有的信息不见了。
解决:
文件打开方式改用"a"追加写入。
4系统测试
4.1录入职工信息
4.2浏览职工信息
4.3查询职工信息
4.4删除职工信息
4.5添加职工信息
5课程设计总结
经历了上学期的C语言教学,我开始对之前完全陌生的电脑编程世界有了一些非常浅显的了解。
越发崇敬那些编程高手!
上学期的认真学习让我掌握了基础的C语言。
也能看懂一些简单的C语言程序。
但这次的C语言程序设计与以往的考试不同,我要面对的不是简单的程序改错或填空,而是要根据要求完整的写出可以运行的程序。
这是一个挑战,成功便是成就。
所以我接受!
我的学号是26号,所以我的课题是“职工信息管理系统设计”
这需要我设计的程序可以输入信息,保存到文件里,再从文件里调出来,使之显示在屏幕上,进行删除、添加等对信息的修改。
开始写第一段输入函数的代码时,我选择了经常使用的printf。
调试成功了!
万事开头难。
良好的开头让我有了信心可以很好完成这个程序。
接下来的状况有好有坏,有时候电脑检查出程序有问题,但我就是没办法改好。
简直想就这么不干了!
但等我情绪稳定下来,我还是一遍遍的改。
功夫不负有心人!
在磕磕绊绊中还是让我把程序写了出来。
最后一次调试时成功后,我忍不住又调试了好多遍。
真是不敢相信!
总之,在这一次的课程设计中,当最后一次成功串联运行所有函数时,真的很开心。
通过这次实践,我们能够更熟练掌握C语言,特别是循环和文件,当时在课堂上没有学太清楚的,这个程序设计之后都很明白了。
增加了我们对程序设计的兴趣,暑假回家我还会尝试着做一些其他的小系统。
附录:
源程序代码:
#include
#include
#define N 6
struct employee
{
int number,age,wage;
char name[20],sex[10],address[30],xueli[20];
long int telephone;
}em[N];
int a=N;
int *p=&a;
main()
{
void search();
void search_name();
void search_xueli();
void search_number();
void load();
void display();
void del();
void input();
void add();
void save();
int n;
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("\n");
scanf("%d",&n);
switch(n)
{
case 1:
printf(" ◆◆◆输入职工信息◆◆◆\n");printf("\n");input();main();break;
case 2:
printf(" ◆◆◆浏览职工信息◆◆◆\n");printf("\n");display(*p);main();break;
case 3:
printf(" ◆◆◆查询职工信息◆◆◆\n");printf("\n");search();break;
case 4:
printf(" ◆◆◆删除职工信息◆◆◆\n");printf("\n");del(p);break;
case 5:
printf(" ◆◆◆添加职工信息◆◆◆\n");printf("\n");add(p);break;
case 6:
exit(0);break;
default :
break;
}
}
void input()
{
int i;
for(i=0;i { printf("请输入职工号: "); scanf("%d",&em[i].number); printf("请输入姓名: "); scanf("%s",em[i].name); printf("请输入性别: "); scanf("%s",&em[i].sex); printf("请输入年龄: "); scanf("%d",&em[i].age); printf("请输入学历: "); scanf("%s",em[i].xueli); printf("请输入工资: "); scanf("%d",&em[i].wage); printf("请输入住址: "); scanf("%s",em[i].address); printf("请输入电话: "); scanf("%d",&em[i].telephone); printf("\n"); } printf("\n创建完毕! \n"); save(N); } void save(int m) { int i; FILE*fp; if(! (fp=fopen("d: //bbb.txt","w"))) { printf("打开失败"); exit(0); } for(i=0;i fprintf(fp,"M %8s %5s ] %8s ] %8s �\n",em[i].number, em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage, em[i].address,em[i].telephone); fclose(fp); } void load(int b) { int i; FILE*fp; if(! (fp=fopen("d: //bbb.txt","r"))) { printf("打开失败"); exit(0); } else for(i=0;i fscanf(fp,"�%8s%5s]%8s]%8s�\n",&em[i].number,&em[i].name,&em[i].sex,&em[i].age,&em[i].xueli,&em[i].wage,&em[i].address,&em[i].telephone); fclose(fp); } void display(int a) { int i,b=a; load(b); printf("\n职工号\t 姓名\t性别\t年龄\t 学历\t 工资\t 住址\t 电话\n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计