C语言课程设计参考例
例子:职工信息管理系统
1. 用户分析
1.1用户目的
设计一个职工信息管理系统,使之能提供以下功能:
1)录入职工信息
2)显示职工信息
3)查询职工信息
4)修改职工信息
5)删除职工信息
1.4用户需求
职工信息包括职工号、姓名、性别、出生年月、学历、职务、工资、住址、电话等,并且要求职工号不重复;
系统应以菜单方式工作;
录入的职工信息要求用文件形式保存,并可以对其进行浏览、查询、修改、删除等基本操作;
职工信息的显式要有一定的规范格式;
按职工号查询职工信息,或按工资,学历查询;
按职工号修改职工信息并保存;
用户使用过程中能够要有容错处理。
2. 总体设计
省略
3. 概要设计
3.1功能设计
3.1.1功能模块图
该系统可以按功能进行模块划分,其模块图如下:
系统模块图
其中:
菜单选择模块完成用户命令的接收,此模块也是职工信息管理系统的入口,用户所要进行的各种操作均需在此模块中进行选择并进而调用其他模块实现相应的功能;
信息输入模块完成职工信息的输入功能,输入信息包括职工号、姓名、性别、出生年月、学历、职务、工资、住址、电话等;
信息浏览模块完成已录入职工信息的显示;
信息查询模块完成职工信息的查询,查询时对应有按工资查询和按学历查询两种方式;
信息修改模块完成职工信息的修改功能;
信息删除模块完成职工信息的删除功能;
3.1.2用户输入画面
3.1.3用户输出画面
3.1.4数据结构设计
职工号,4位正整数;
姓名,10个汉字;
性别,1个特征位;
出生年月日,年4位正整数,月2位正整数,日2位正整数;
学历,1个特征位;
职务,10个汉字;
工资,10位,其中小数点2位;
住址,30个汉字;
电话,20个字符;
在处理过程中各项可以作为一个职工的不同属性来进行处理;整体作为一张二维表进行处理,因此,采用结构数组。
3.1.5功能运行流程图
系统的执行应从功能菜单的选择开始,依据用户的选择来进行后续的处理,直到用户选择退出系统为止,其间应对用户的选择做出判断及异常处理。系统的流程图如下:
程序流程图
4. 详细设计
4.0菜单选择模块的流程图或伪代码
给出信息提示;
清屏;
绘制菜单(包含输入、显示、查询、修改、删除、退出);
提示菜单选择并读入到变量;
根据读入变量的值调用不同的模块函数;
4.1输入模块的流程图或伪代码
打开职工信息文件;
while ( 继续输入 )
{
读入职工信息;
将读入信息添加到职工信息文件中;
提示是否继续输入;
}
关闭职工信息文件;
4.2输出模块的流程图或伪代码
打开职工信息文件;
while ( 不到文件结束 )
{
从文件中顺序读出一个职工的信息;
按指定格式输出该职工的信息;
}
关闭职工信息文件;
4.3执行模块的流程图或伪代码
4.3.1 信息查询模块:
while ( 仍继续查询 )
{
if( 按工资查询 )
{
读入查询的职工工资条件;
打开职工信息文件;
while( 不到文件结束 )
{
顺序读出一个职工的信息;
if( 该职工信息的工资符合条件 ) 输出该职工的信息;
}
关闭职工信息文件;
提示共有几条符合条件的记录;
}
else
if ( 按学历查询 )
{
读入学历查询的条件;
打开职工信息文件;
while( 不到文件结束 )
{
顺序读出一个职工的信息;
if( 该职工信息的学历符合条件 ) 输出该职工的信息;
}
关闭职工信息文件;
提示符合条件的记录数;
}
else 提示输入不合适;
提示是否继续查询;
}
4.3.2 信息修改模块:
while( 继续修改 )
{
从给出信息文件中所有的记录情况;
提示并读入待修改的记录的职工的职工号;
打开职工信息文件;
查找并读出该职工的信息到一个中间变量中;
提示并读入要针对该职工的哪个属性进行修改;
根据用户的选择提示并读入所要修改属性的新值;
在该职工的中间变量中修改刚刚读入的属性值;
提示是否确定要进行修改;
如果用户确定则将中间变量重新写回到原职工信息文件中;
关闭职工信息文件;
}
4.3.3信息删除模块:
while( 继续删除 )
{
显示所有职工的信息;
提示并读入待删除的职工的职工号;
打开职工信息文件;
查找是否有符合条件的职工记录;
if( 有符合条件的记录)
{
提示是否确认该删除操作;
if (用户确认此操作)
{
创建一个新的临时文件;
打开原信息文件;
while( 原信息文件中记录未读完 )
{
读出原信息文件中的下一条记录;
if( 此条记录不是待删除记录) 写入临时文件中去;
}
关闭原信息文件;
关闭临时文件;
读方式打开临时文件;
写方式重建与原信息文件同名的新信息文件;
将临时文件中的内容写入到新信息文件中去;
关闭新信息文件;
关闭临时文件;
删除临时文件;
}
}
else 提示没有符合条件的记录存在;
}
4.4数据结构的C语言表示
性别: enum Sex{ male, female };
学历 :enum Education{ high, junior, college, master, doctor};
日期 :struct Date
{ int year;
int month;
int day;
};
职工信息:struct Info
{
int num; // 职工号
char name[20]; // 姓名
enum Sex sex; // 性别
struct Date birthday; // 出生年月
enum Education education; // 学历
char duty[20]; // 职务
double wage; // 工资
char addr[60]; // 地址
char phone[20]; // 电话
};
第二篇:C语言课程设计报告(通讯录)
面向过程程序设计(C语言)课程设计
设计说明书
起止日期: 2011年 01 月 03 日 至 2011年 01 月 08 日
计算机与通信学院
2011 年 01 月 08 日
一、 课题任务
设计一个通讯录管理系统。
课题的主要任务是:
1.对通讯录信息有添加、查找、显示、保存、删除、修改等操作功能。
2.可以将输入的数据保存在文本文件中,并可以将其调出使用。
我的主要任务是编写主函数,查找模块和修改模块。
二、设计要求
建立通讯录信息,信息至少包含姓名、住址、单位、固定电话、移动手机、分类(如同事、朋友、同学、家人等)、E-mail、QQ等。
该系统提供添加、删除、修改和查找功能,其中按姓名方式删除、修改,按姓名、单位、分类方式查找。
将通讯录保存在文件中。
能够输出通讯录中的信息。
二、 程序的功能设计
创建:创建通讯录文件并对其命名
添加:添加通讯录记录
输出:显示通讯录记录
删除:删除通讯录记录
查找:查询通讯录记录
修改:修改通讯录记录
保存:将信息保存到文件中
四、程序的数据设计
该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和删除数据。
创建:用fopen()建立一个文本文件,然后用fprintf()向其中输入数据(例如,向文件中输入“姓名”,“地址”等), 并对文件进行命名。
添加:可以添加通讯录记录,利用C语言文件,向文件中按顺序输入姓名、住址、单位、固定电话、手机号码、分类(如同事、朋友、同学、家人等)、E-mail、QQ,再用fclose()函数关闭并保存文件。
输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。
删除:输入你要删除的人的姓名后,系统会自动删除他(她)的记录,在删除通过switch语句满足提示你确认删除的功能,只有等你确认删除后才会删除。
查找:为了满足用户的实际需求,设计了三种查询方式,可以用姓名、单位、分类三种方式查找通讯录记录。这里用到strcmp()函数,通过比较字符串是否相同来判别是否找到相关信息,找到后,就把文件中的数据赋给对应的变量,再把变量所带的值输出到屏幕上。
修改:输入你要修改的那个人的姓名后,系统会查找该通讯录文件(此时用发ftell()函数来跟踪文件指针的指向地址,找到个人的记录后,会显示他(她)的记录,然后通过fseek()函数来找到修改处的地址,然后用户再依次输入他(她)的相关信息来替代以前的记录。
保存:用到fclose()函数,每次操作成功后会自动保存到指定的文件中。
如下图所示:
五、程序的函数设计
下面是主函数部分:
void main()
while(1) /*通过一个无限循环来完成
无数条记录的输入*/
{
int n;
printf("\n\t*******************欢迎使用通讯录系统************************\n\n");
printf("\n\t创建,请按1");
printf("\n\t添加,请按2");
printf("\n\t查找,请按3");
printf("\n\t修改,请按4");
printf("\n\t输出,请按5");
printf("\n\t删除,请按6");
printf("\n\t退出,请按0");
printf("\n\t*************************************************************\n\n");
printf("\n请选择(0--5): ");
scanf("%d",&n);
if(n<=6&&n>=0)
{
switch(n)
{
case 1:creat();break;
case 2:add(); break;
case 3:search(); break;
case 4:modify(); break;
case 5:output(); break;
case 6:del(); break;
case 0:exit(1);
}
printf("\n\n操作完成,请再次选择!");
}
else
printf("\n\n选择错误,请再次选择!");
}
}
上面主要是菜单部分,用来提醒用户需要选择哪些功能。
这部分是来通过一个无限循环(用while(1))来执行上述所有的功能模块,不断的输出菜单项目,用switch语句来执行用户选择的功能模块,每一个case后面就是对应的功能函数,(比如,用户输入数字2,那么就是执行添加功能,相应的就是执行case 2 后面的add()函数,然后用break语句跳出循环,再输出主菜单,如果用户要退出的话,只需选择“0”就可以成功退出并且自动将数据保存到指定的文件中。如果用户选择的时输入的数据有误的话,会提示“选择错误,请再次选择!”,这样,用户就能够再次输入数据。
查找模块:
该查找功能分3种方式查找,姓名查找(按1),分类查找(按2),单位查找(按3)。这是通过switch语句来实现,case 1后面是按姓名查找函数,case 2 后面是按分类查找函数,case 3 后面是按单位查找函数。如果用户要选择一种方式查找通讯录记录,只需输入对应的数字就可以。三种方法大同小异,下面就说明姓名查找吧!查找用户,进入查找界面后并且键入“1”后,就执行姓名查找方式,此时界面上会显示“请输入姓名”,然后系统将用户输入的姓名赋给对应的变量,然后用循环(用while(!feof(fp))这条语句来完成)来找出这个人的所有记录,并将其输出到屏幕上。如果没有此人的记录,那就会输出“对不起,通讯录中没有此人的记录”或“对不起,通讯录中没有此类人的记录”或“对不起,通讯录中没有此单位的记录”,这里输出视查找方式而定。执行查找功能后会返回主菜单,并提示用户再次选择。
修改模块:
用户使用这个功能的时候,界面上会显示“请你输入要修改人的姓名:”等用户输入数据后,系统会通过循环从文件中寻找此人,该过程和删除模块是一样的,每次从文件中读取数据后,便把数据赋给相应的变量,再用该数据与用户输入字符串比较,如果相同,那就说明已找到该人的数据;如果不同,那就执行下一个循环,直到找出为止,在寻找过程中,用ftell()函数来跟踪地址,修改的时候用fseek()函数来寻找地址,找到要修改的地址后,系统会显示该人的所有记录,然后输出“请输入新的姓名、住址、工作(或学习)单位、固定电话、手机号码、邮箱、QQ以及分类。”这时用户要按顺序输入数据。用户输入完成后,系统会显示“已修改!”并且返回主菜单。
六、函数编码及调试
编写的程序中很容易出现一些低级语法错误,(比如,有时候把%s写成了%d),当然这很容易找出并且更正,主要是一些算法错误很难找到,在调试的过程中,最令我头痛的就是编写修改模块时用到的ftell和fseek函数,好郁闷的,改了好几天都没有进展,最后在机房里的时候请教了一下老师,经老师指点后,我就顿然开朗啦,原来是在寻找地址的时候出了错,但是待我修改后还是不可以,每次执行修改的时候总是修改了别的数据,不过我发现这个被修改的数据和我想修改的数据的都靠在一起,我就想是不是我输入数据的时候漏掉了一个字符?本来文本文件用ftell和fseek函数的时候就特别容易出错,所以我碰到这个麻烦的 时候,心情一点也不好,但潜意识告诉我,我不能放弃,然后我就再把程序看了几遍,我试着把下列的程序
fprintf(fp,"%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",one.name, one.addr, one.work_place,one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
改为
fprintf(fp,"%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s\n",one.name, one.addr, one.work_place,one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
改的时候就加了一个转义字符“\n”,然后我再运行了一下,结果竟然对了,太巧了,我把整个程序仔细一看,原来是在添加和创建模块的时候都有这个字符,如果后面修改的时候不加的话,文件上就会在排版上不符合导致在修改的时候修改错位置,嘿嘿,终于找到错误了,好有成就感的,就是这个小小的字符害我花了好几天时间,不过也获得了一个教训,那就是写程序的时候一定要注意前后的格式,要整体把握。
七、总结
这个课题是设计一个通讯录系统,该通讯系统能够较好的管理好我们的通讯录记录,也拥有比较完善的功能,但是该系统依旧有漏洞,此程序必须按照系统提示的操作来执行,不然的话就会使程序进入死循环,比如,如果我输入字符串的长度过长的话,程序就会终止运行了,并且还没有提示;后面的删除模块所用的方法是用空格替代,虽然可以删除,但达不到理想的效果。
在编写过程中,我逐步的了解了程序模块化设计的思想含义。在整个程序设计的过程中语法的错误还是比较容易检查的,但是对于那些逻辑思维的问题方面的缺陷不易查出,因此常常出现系统提示没有错误但是仍然不能够正常运行的境况,尽管有很多不足之处,但我在整个系统程序设计的过程中,我可以感受到自己对C语言有了一定的掌握,对整体的把握度也提高了很多。
此外编程是一项高精度的工作,所以我们要有规范化,标准化的代码编写习惯,良好的编写习惯,不但有助于代码的纠错,也有助于不同人员之间的协作。
我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大的避免重复性的工作。另外我们要重视程序的算法,在程序中,算法是灵魂,我们要努力学习各种先进的算法,提高自己的编程能力。
附:系统的主要程序代码
主函数部分:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct person
{
char name[10]; /*姓名*/
char mobile_phone[16]; /*手机号码*/
char fixed_telephone[16]; /*固定电话*/
char work_place[20]; /*工作单位*/
char addr[20]; /*家庭住址*/
char e_mail[30]; /*邮箱*/
char QQ[12]; /*QQ聊天软件*/
char category[10]; /*分类*/
};
char dir_name[20]="e:\\通讯录.txt";
FILE *fp;
void creat(); /*创建一个通讯录并命名,下次如果要打开以前的通讯录话,就在创建的时候输入以前的文件名称。*/
void output();/*输出模块*/
void add();/*添加模块*/
void modify();/*修改模块*/
void del();/*删除模块*/
void search();/*查找模块*/
void main()
{
while(1) /*一次完成无数条记录的输入*/
{
int n;
printf("\n\t*******************欢迎使用通讯录系统************************\n\n");
printf("\n\t创建,请按1");
printf("\n\t添加,请按2");
printf("\n\t查找,请按3");
printf("\n\t修改,请按4");
printf("\n\t输出,请按5");
printf("\n\t删除,请按6");
printf("\n\t退出,请按0");
printf("\n\t*************************************************************\n\n");
printf("\n请选择(0--5): ");
scanf("%d",&n);
if(n<=6&&n>=0)
{
switch(n)
{
case 1:creat();break;
case 2:add(); break;
case 3:search(); break;
case 4:modify(); break;
case 5:output(); break;
case 6:del(); break;
case 0:exit(1);
}
printf("\n\n操作完成,请再次选择!");
}
else
printf("\n\n选择错误,请再次选择!");
}
}
查找模块:
void search()
{
struct person one;
int k,j=0;
if((fp=fopen(dir_name,"r"))==NULL)
{
printf("\n不能打开通讯录");
getchar();
exit(1);
}
printf("\n姓名查找请按1");
printf("\n分类查找请按2");
printf("\n单位查找请按3");
printf("\n请选择查找方式(按回车键输入): ");
scanf("%d",&k);
switch(k)
{
case 1:
{
char s_name[10];
printf("\n请输入姓名: ");
scanf("%s",s_name);
while(!feof(fp))
{fscanf(fp,"%s%s%s%s%s%s%s%s",one.name, one.addr, one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
if(!strcmp(s_name,one.name))
{printf("\n已经查到此人,记录为: \n");
printf("\n%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",one.name, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
j=1;
}
}
if(!j) printf("\n对不起,通讯录中没有此人的记录");
fclose(fp);
}
break;
case 2:
{
char s_category[10];
printf("\n请输入类别: ");
scanf("%s",s_category);
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s%s%s",one.name, one.addr, one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
if(!strcmp(s_category,one.category))
{
printf("\n已经查到此类人,记录为: \n");
printf("\n%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",one.name, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
j=1;
}
}
if(!j) printf("\n对不起,通讯录中没有此类人的记录");
fclose(fp);
}
break;
case 3:
{
char s_workplace[20];
printf("\n请输入工作单位 : ");
scanf("%s",s_workplace);
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s%s%s",one.name, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
if(!strcmp(s_workplace,one.work_place))
{
printf("\n已经查到此单位,记录为:\n");
printf("\n%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",one.name, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
j=1;
}
}
if(!j) printf("\n对不起,通讯录中没有此单位的记录");
fclose(fp);
}
break;
}
}
修改模块:
void modify()
{
struct person one;
int k=0;
long st;
char name_modify[10];
printf("\n请你输入要修改人的姓名: ");
scanf("%s",name_modify);
if((fp=fopen(dir_name,"r+"))==NULL)
{
printf("\n不能打开通讯录!");
getchar();
exit(1);
}
while(!feof(fp))
{
st=ftell(fp); /*跟踪地址*/
fscanf(fp,"%s%s%s%s%s%s%s%s\n",one.name, one.addr, one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
if(!strcmp(name_modify,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n该名字已找到,他(她)的记录是:\n");
printf("%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",one.name, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
printf("\n请输入新的姓名、住址、工作(或学习)单位、固定电话、手机号码、邮箱、QQ以及分类。请输入:\n");
scanf("%s%s%s%s%s%s%s%s",one.name, one.addr, one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
fseek(fp,st,0); /*找到修改的地址*/
fprintf(fp,"%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s\n",one.name, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
printf("已修改!");
}
else
printf("\n对不起,通讯录中没有此人的记录。");
fclose(fp);
}