资源描述
引言
经过大一下学期对C语言学习,了解到了很多C语言相关知识。学习过程有很多迷惑不过当自己能够独立看懂,能够独立完成一个简单程序时,心中就会收获无限喜悦和成就感。我能够看懂部分简单程序,编写部分简单程序,更多是学会了一个思想——编程,它让我去思索很多日常生活中事物是怎样经过一个个小小函数实现其功效,激发我探究爱好,更让我认真学习C语言程序设计。
C语言是在中国外广泛使用一个计算机语言。C语言简练紧凑、使用灵活方便、运算符丰富、适用范围大、可移植性好。它既含有高级语言特点,又含有汇编语言特点。它能够作为系统设计语言,编写工作系统应用程序,也能够作为应用程序设计语言,编写不依靠计算机硬件应用程序。
在这次课程设计中我将经过亲自设计程序,让自己熟悉C语言操作,更熟练掌握C语句。初步体会编程过程,在不停调试中取得最为完整程序,为未来程序深入学习打下基础和培养爱好。
1 功效介绍和设计要求
1.1 程序功效介绍
能够向文件中录入、删除、添加、查询职员信息,也能够从文件中导出来浏览
1.2 程序设计要求
职员信息包含职员号、姓名、性别、年纪、学历、工资、住址、电话等(职员号不反复)。试设计职员信息管理系统,使之能提供以下功效:
系统以菜单方法工作
职员信息录入功效(职员信息用文件保留)--输入
职员信息浏览功效 --输出
查询信息功效:(最少一个查询方法) --算法
按职员号查询
按学历查询
按电话查询
职员信息删除、添加功效
2 程序总体设计框图
输入函数
:用键盘输入职员信息
写入函数
:将信息写入指定文本文件
导出函数
:将信息导出放在结构数组em中
浏览函数
:将全部信息显示在屏幕上
按职员号查询
:输入职员号显示信息
显示主菜单
查询函数
按电话查询
:输入名字显示信息
按学历查询
:输入学历显示信息
删除函数
:删除原有职员信息
添加函数
:添加新职员信息
3 关键函数介绍
主函数:main()
显示系统工作菜单,罗列该系统全部功效。先申明全部将会调用到函数名。再利用选择函数switch即可依据使用者所输入功效代号进入对应功效程序。亮点:定义一个全局变量*p和全局变量a。其中a表示目前系统中职员人数,p指向a地址,追踪人数改变,这么在添加或删除造成人数改变后,浏览函数display()能够正确显示出目前人数职员信息。宏定义define N指定首次输入职员人数,可依据不一样需要随时更改。
显示菜单
开始
输入功效代码switch(n)
n=1 n=2 n=3 n=4 n=5 default
退出
Exit(0)
调用添加函数
Add()
调用查询函数
Search()
调用删除函数
Del()
调用浏览函数
Display()
调用输入
函数
Input()
结束
输入函数:void input()
定义一个结构struct employee和数组em【N】用来储存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)。经过for循环输入全部职员信息。用printf语句提醒需要输入内容,接着用scanf语句输入对应内容。输入完成后套用保留函数save(N)将所输入信息写入指定文件。
开始
i=1
Printf(“创建完成”)
结束
i++
Printf(“提醒需要输入内容”)
Scanf(“输入信息”)
i<n
=0
!=0
保留函数:void save(int m)
定义文件指针fp,用fopen"只写"打开指定在D盘“d://bbb.txt”文本文件。首先用if语句判定文件是否打开成功,若fopen返回值不为0,则可继续下面操作。用for循环经过fprintf语句将结构数组em中内容写入保留在D盘文本文件里面。形参m指需要写入文件职员人数。最终关闭文件。
开始
fopen(“d:\\bbb.txt”, “w”)
exit
=0
Printf写入文件
i<m
i=0
!=0
=0
结束
fclose(fp)
i++
!=0
导出函数:void load(int b)
首先判定fopen"只读"打开“d://bbb.txt”是否成功,若其返回值不为零,继续下面操作。用for循环经过fscanf语句将文件中职员信息取出放到em结构数组里面。形参b指需要导出职员人数。最终关闭文件。 图 同上。
4 功效模块函数设计和调试
4.1功效模块函数设计
在整个程序编译过程中,在调试时候出现了好多错误和警告,经过认真分析和修改全部能够处理,不过其中碰到最大问题是全部程序代码编完放在一起后,即使能够成功运行,不过还是出现了部分小问题,就是在调用随机分配函数时职员工号不随机分配,每次到了自动分配工号时候全部会跳过那一步就直接进行下一步骤输入了。这使我百思不得其解,以后我在网上查询了好多资料后最终明白了,原来在使用随机分配函数时首先要调用随机分配函数所在函数库,这么才能够正常使用。使用时假如职员人数发生改变,会造成文件后部出现乱码现象。若要使每次运行全部正常,必需在人数改变后退出程序,修改宏定义N值。这么很不方便,不能够连续运行。为处理这一大问题,最终我想到了定义一个全局变量,用来追踪链接最新人数。尤其是删除和添加这两个会造成人数改变函数中,全局变量p起了很大作用。经过一边修改一边调试,最终能够成功用p串联整个函数,在连续运行时,总能依据最新人数调用各个函数。另外在串联全部函数时,调试提醒犯错:有以下多个函数:
“search; srand;display;basic;types” 处理:在函数名前加void指明类型。
整个程序代码是分块书写,每个函数全部能够独立运行。只有输入函数查询菜单函数写得很顺利,一次性就能够成功运行,其它函数在调试过程中或多或少全部出现了问题。
保留函数save()在调试和链接时候全部没有出现错误提醒,但在运行时候出现了问题。写入指定位置文件,打开后总会有乱码。和c语言书本上例题对照后发觉,在存放文件时一定要指定文件存放类型。这么才能够正确进行存放,不会出现乱码现象。
导出函数load()碰到两个问题。1是为方便直接将保留函数复制过来进行修改时,忘了修改文件打开方法,不能运行。经过数次检验后最终发觉了,处理:将只写改为只读就ok了。2是用fscanf语句时,漏写地址符。调试和链接全部没问题,但点击运行后,总出现一个提醒犯错蓝色小窗口。经过老师提醒发觉了错误所在。处理方法:在em[i].name等之前加上取地址符就能够处理。
在进行职员信息录入时候一定要注意汉字和英文之间切换,不然话会出现无法正确输入和跳转现象。
4.2 程序调试
4.2.1 原始数据
{ int num;
char name[10];
char sex;
int age;
char xueli[30];
int wage;
char addr[30];
long int tel;
}em[100]; /*定义一个结构体*/
void menu();
void input();
void save(int);
void display();
void del();
void add();
void search();
void search_num();
void search_xueli();
void search_tel();
void modify(); /*定义各函数*/
void menu() /*菜单函数*/
{ printf(" ☆☆☆C语言程序设计☆☆☆\n");
printf("\n");
printf(" ∮机设1401班 张凯凯∮\n");
printf("\n");
printf(" **********职员信息管理**********\n");
printf(" 1.录入职员信息");
printf(" 2.浏览职员信息\n");
printf(" 3.查询职员信息");
printf(" 4.删除职员信息\n");
printf(" 5.添加职员信息");
printf(" 6.修改职员信息\n");
printf(" 7.退出\n");
printf(" **********谢谢使用**********\n");
printf("\n");
printf("\n");
}void main()
{ menu(); /*调用菜单函数*/
int n,flag;
char a;
do
{ printf("请选择你需要操作步骤(1--7):\n");
scanf("%d",&n);
if(n>=1&&n<=7)
{ flag=1;
break; }
else
{ flag=0;
printf("您输入有误,请重新选择!");}
} while(flag==0);
while(flag==1)
{ switch(n)
{ case 1:printf(" ◆◆◆输入职员信息◆◆◆\n");printf("\n");input();break;
case 2:printf(" ◆◆◆浏览职员信息◆◆◆\n");printf("\n");display();break;
case 3:printf(" ◆◆◆按职员号查询职员信息◆◆◆\n");printf("\n");search();break;
case 4:printf(" ◆◆◆删除职员信息◆◆◆\n");printf("\n");del();break;
case 5:printf(" ◆◆◆添加职员信息◆◆◆\n");printf("\n");add();break;
case 6:printf(" ◆◆◆修改职员信息◆◆◆\n");printf("\n");modify();break;
case 7:exit(0);break;
default :break;
}
getchar();
printf("\n");
printf("是否继续进行(y or n):\n");
scanf("%c",&a);
if(a=='y')
{
flag=1;
system("cls"); /*清屏*/
menu(); /*调用菜单函数*/
printf("请再次选择你需要操作步骤(1--6):\n");
scanf("%d",&n);
printf("\n");
} else
exit(0);
}
}
void input() /*录入函数*/
{
int i,m;
printf("请输入需要创建信息职员人数(1--100):\n");
scanf("%d",&m);
for (i=0;i<m;i++)
{
printf("职员号: ");
srand((int)time(0));
em[i].num=rand()%10000+0000;
if(em[i].num!=em[i-1].num)
printf("%8d ",em[i].num);
printf("\n");
printf("请输入姓名: ");
scanf("%s",em[i].name);
getchar();
printf("请输入性别(f--女 m--男): ");
scanf("%c",&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].addr);
printf("请输入电话: ");
scanf("%ld",&em[i].tel);
printf("\n");
}
printf("\n创建完成!\n");
save(m);
}
void save(int m) /*保留文件函数*/
{
int i;
FILE*fp;
if ((fp=fopen("employee_list","wb"))==NULL) /*创建文件并判定是否能打开*/
{
printf ("cannot open file\n");
exit(0);
}
for (i=0;i<m;i++) /*将内存中职员信息输出到磁盘文件中去*/
if (fwrite(&em[i],sizeof(struct employee),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int load() /*导入函数*/
{
FILE*fp;
int i=0;
if((fp=fopen("employee_list","rb"))==NULL)
{
printf ("cannot open file\n");
exit(0);
}
else
{
do
{
fread(&em[i],sizeof(struct employee),1,fp);
i++;
}
while(feof(fp)==0);
}
fclose(fp);
return(i-1);
}
4.2.2 调试过程
5 设计心得和总结:
经过一学期C语言学习,我们掌握了C语言基础知识,能够读懂她人用c语言设计编译程序。平时程序设计大多是在书上看到全部是以书面形式出现,即使有所接触,但全部不完全。而这周课程设计,却让我们完完全全用自己所学到知识编写了一个完整系统程序。这是一个新挑战,也是一个新学习。
我们组选择题目是——职员信息管理系统。这需要我们自己设计一个系统,能够输入信息,保留到文件里,再从文件里调出来,使之显示在屏幕上,进行删除、添加、查询等对信息修改。初看到这个题目认为很简单,但当我做到电脑前准备开始编写代码时候才发觉无从下手。经过去图书馆查找程序设计相关书籍,和上网参考前人编写类似程序,我脑中才有了一个大约方向。
慢慢开始着手写下了第一段输入函数代码,因为这是我们平时课堂上用最多最熟printf语句,写了很长一大段,调式运行竟然成功了,立即信心倍增。于是我开始迫不及待开始写第二段保留函数。我记得第一天下来,我只写好了这两个函数,但还是很快乐,因为这是我编第一个小系统成功开始!
接下来几天全部在宿舍整个下午对着电脑不停编译、调试、修改,每次编好一个能够成功运行程序,全部会感到很欣慰,并增加继续下去信心。当然其中也有碰到困难时候。好几次碰到编好程序调试没有错误,却偏偏不能运行这种情况,自己编程序自己极难发觉当中错误,而电脑又没有提醒,这时候就很受打击,也会着急。反复检验全部找不出毛病来时候就会有想要放弃念头。有时候就直接关机去做别事情,等再开始做程序时候,才发觉先前错误所在。这时候会有一个“柳暗花明又一村”欣慰感觉。总而言之,碰到困难,能够先放一放,让脑子休息一下,忘记错误记忆。或许等过段时间再回过头来,就会很轻易发觉之前错误了。伴随编好程序越多,累积经验也越多,查找错误就越快了。还有会发觉很多程序有很多相同之处,能够经过复制修改发式来编写。即使题目要求只需要两种查询方法,但当我编出规律以后自然就想多写一个,写完就会有很大成就感了。
当全部功效函数全部编好后,我用主函数将她们串起来,这是碰到最大问题就是经过删除、添加后职员人数会发生改变。想了很久,又翻以前课堂笔记,最终想到了使用全局变量来处理这个问题。这个问题成功处理预示着我们职员信息管理系统大功告成!
总而言之,经过这一次课程设计,我们体会到了痛苦和愉快同存感觉。当最终一次成功串联运行全部函数时,真很快乐。经过这次实践,我们能够更熟练掌握C语言,尤其是循环和文件,当初在课堂上没有学太清楚,这个程序设计以后全部很明白了。同时增加了我们对程序设计爱好,暑假回家我还会尝试着做部分其它小系统。
6 参考文件
[1]谭浩强。C程序设计(第二版)。北京:清华大学出版社,
[2]谭浩强。C程序设计题解和上机指导(第二版)。北京:清华大学出版社,
[3]baidu文库
展开阅读全文