..引言通过大一下学期对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指定首次输入的职工人数,可根据不同需要随时更改。
输入函数: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)将所输入的信息写入指定文件。
保存函数:void save(int m)定义文件指针fp,用fopen"只写"打开指定在D盘的“d://bbb.txt”文本文件。
首先用if语句判断文件是否打开成功,若fopen返回值不为0,则可继续下面操作。
用for循环通过fprintf语句将结构数组em中的内容写入保存在D盘的文本文件里面。
形参m指需要写入文件的职工人数。
最后关闭文件。
=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:prin tf(" ◆◆◆浏览职工信息◆◆◆\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");} elseexit(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+20140000;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语言设计编译的程序。