C语言课程设计实验报告.docx
《C语言课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
C语言课程设计实验报告
课程设计
课程名称程序设计课程设计
设计题目高校在职职工管理软件
班级及班级代码
专业
指导教师:
学号:
姓名:
提交日期:
姓名课程设计成绩
评语:
评价内容
不及格
及格
中
良
优
表达精练,格式准确,基本无错别字
内容完整,思路清晰,结构严谨,设计科学,可操作性强
程序能完成课程设计任务书所规定的任务,功能完善,
独立分析和解决问题能力较好。
代码简洁,算法清晰,可读性强
无抄袭现象且课程设计报告体会深刻
指导教师(签名)
年月日
1系统功能要求(需求分析):
采用结构体数组或文件形式存储职工的信息,每个职工应包含如下几方面的信息:
职工号、姓名、性别、所属二级单位、所学专业、职称、月工资,电话号码。
软件由主函数(含欢迎界面)和下列6个功能模块组成:
(1)减少一个职工(需指定要删除职工的职工号);
(2)增加一个职工号(需输入要增加职工号的所有信息);(3)查找一个职工号的信息(需指定职工号或电话号码);(4)统计指定二级单位的职工人数、工资总额;(5)按职工的工资多少对职工排序(6)退出程序的运行。
(正文宋体4号,行距固定为20英镑)
2系统总体(概要)设计思想
(1)开发及设计的总体思想
高校在职职工管理软件设计算法说明:
STEP1预处理,定义结构体
STEP2进入欢迎界面
STEP3选择某一种功能
STEP4根据提示输入一个字母
STEP5对于输入的字母编辑关于删除、增加、排序、查找、统计功能的函数
STEP6如果输入的字母表示退出,退出系统
(2)
系体模块结构图
(3)系统文件及函数组成、功能(参考P154的表12-1)
源文件
函数名及其成分
功能
workers.c
main
总控函数
库函数及函数原型声明
引用库函数及函数
常数
提供常数
add_disp.c
showTable
输出表头
display
显示所有职工信息函数
addRecord
在当前表的末尾增加新的信息
handle_menu.c
handle_menu
菜单处理函数
menu_select.c
menu_select
菜单选择函数
quit
结束运行,退出
que_remv.c
findRecord
查找指定记录函数
showTable
打印查询到的职工信息
removeRecord
删除记录函数
copyRecord
将src指向的一条记录复制给dest指向的记录
save_load.c
saveRecords
文件存储操作函数
loadRecords
文件读取操作函数
sort_tongji.c
Tongji
统计职工资料
showTable
打印统计二级单位的职工人数和工资总额
sortInfo
职工信息排序函数
workers.h
常数
提供常数
结构声明
职工信息结构
库函数及函数原型声明
引用库函数及函数
3系统详细设计
(1)函数的描述
a.本程序总共有8个文件:
workers.h
workers.c
add_disp.c
sav_load.c
que_remv.c
sort_tongji.c
handle_menu.c
menu_select.c
b.所涉及到的函数如下:
(1).菜单处理函数
函数原型:
voidhandle_menu(void);//菜单处理
功能:
处理选择的菜单命令
参数:
void
返回值:
void
工作方式:
根据命令,调用相应函数
要求:
给出结束信息
(2).菜单选择函数
函数原型:
intmenu_select(void);//菜单选择
功能:
接受用户选择的命令代码
参数:
void
返回值:
int
工作方式:
返回命令代码的整数值
要求:
只允许选择规定键,如果输入不合要求,则提醒用户重新输入
(3).删除记录函数
函数原型:
voidremoveRecord(void);//删除指定的记录
功能:
删除内存数组内存数组中的指定记录
参数:
void
返回值:
void
工作方式:
根据给定的关键字,查找符合的记录并删除之。
要求:
将后面的记录前移,同时改变名次并给出相关信息
(4).增加信息函数
函数原型:
voidaddRecord(void);//在表尾追加职工信息
功能:
增加记录
参数:
void
返回值:
void
工作方式:
从尾部开始逐个追加记录
要求:
将新的记录追加在记录尾部,并对记录进行计数
(5).显示所有学生信息函数
函数原型:
voiddisplay(void);//显示信息
功能:
显示内存里的记录信息
参数:
void
返回值:
void
工作方式:
从头部开始逐个显示记录内容
要求:
报告是否有记录及记录条数和内容
(6).查询指定职工信息函数
函数原型:
voidqueryInfo(void);//查询指定的职工信息
功能:
将一个文件的内容追加到另一个文件的尾部
参数:
void
返回值:
void
工作方式:
可以按照职工号或电话号码来查询
要求:
打印查询到的学生的信息或给出相关信息。
(7).对职工信息进行排序
函数原型:
voidsort(void);//对职工进行排序
功能:
对职工信息进行排序
参数:
void
返回值:
void
工作方式:
按职工工资多少对职工进行排序
要求:
打印排序结果
(8).统计二级单位人数和工资总额
函数原型:
voidtongji(void);//统计函数
功能:
统计二级单位人数和工资总额
参数:
void
返回值:
void
工作方式:
指定二级单位,然后再进行统计
要求:
统计后打印
(9).文件存储操作函数
函数原型:
intsaveRecords(void);//文件存储
功能:
将记录存入默认文件wor_info或者指定文件
参数:
void
返回值:
成功0,失败-1
工作方式:
数组records被保存至指定文件
要求:
报告是否有记录可存,是否能正常建立或打开文件,根据要求执行存入操作并报告存入记录的条数
(10).文件读取操作函数
函数原型:
intloadRecords(void);//文件读取
功能:
默认文件wor_info或者指定文件的记录取入内存
参数:
void
返回值:
成功0,失败-1
工作方式:
records为从指定文件中读取出的记录
要求:
报告是否有记录可存,是否能够正常打开文件,是否覆盖已有记录以及读取记录的条数
(11).结束程序运行函数
函数原型:
voidquit(void);//结束运行
功能:
结束程序运行
参数:
void
返回值:
void
工作方式:
根据要求决定在退出前是否将修改的记录存入文件
要求:
结束运行之前,询问是否对修改的记录进行存储
(12).输出表头函数
函数原型:
voidshowTable(void);//输出表头
功能:
输出表头信息
参数:
void
返回值:
void
工作方式:
输出一行表头信息
要求:
输出一行表头信息
(13).查找指定记录函数原型
函数原型:
intfindRecord(char*target,inttargetType,intfrom);
功能:
查找指定的记录
参数:
char*target欲查找记录的某一项及target相同;
inttargetType通过什么来查找;
intfrom从第from个记录开始查找
返回值:
int(找到的记录的序号),若找不到则返回-1
工作方式:
根据给定的关键字,查找符合记录的序号
要求:
找不到则返回-1
(2)主要函数流程图(2个以上,可参考材P148的写法)
addRecordquit
(3)编码(附后)
4系统测试
内容包括:
程序调试情况(8幅以上测试结果截图);
5、总结:
本人C语言程序设计基础较差,因此,在写这个程序的时候遇到了诸多困难,多亏同学的帮忙我的程序才可以成功地运行,真的是自己之前不够刻苦,用功,写代码这种东西还是要多练,多做题才能有收获,在写那个登陆账号和密码的函数的时候,我调试了好久都没发现错误,最后。
在同学的帮助下,成功发现是数组那里除了问题,居然少打了个中括号。
所以本人数组和指针方面的知识点欠缺,还需要多多练习。
虽然这份程序是参考学生成绩那份来找灵感的,还是出现了好多错误,最大的收货就是看到程序成功运行的那一刻。
6结束语
感谢李惠坤同学和林柔佳同学热心帮助。
参考文献
[1]谭浩强,C程序设计(第二版),北京:
清华大学出版社,2001.1(左对齐,宋体,五号)
[2]陈朔鹰,C语言程序设计习题集,北京:
人民邮电出版社,2003.6
7附录(代码)
#include
#include
//#include
#include//conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
#include
#defineINITIAL_SIZE100//数组初始大小
#defineINCR_SIZE50//数组每次增加的大小
structworkers_info
{//每个职工包含的信息
charnum[10];//职工号
charname[10];//姓名
charsex[3];//性别
charpost[10];//所属二级单位
charmajor[10];//所学专业
charjobname[10];//职称
floatsalary;//月工资
charphonenum[11];//电话号码
}wk[10];
typedefstructworkers_infoWrkInfo;
externintnumWrks;//记录职工数
externWrkInfo*records;//记录职工信息的数组
externcharsavedTag;//信息是否已保存的标志,0为已保存,1为未保存
externintarraySize;//数组大小
voidhandle_menu(void);//菜单处理
intmenu_select(void);//菜单选择
voidremoveRecord(void);//删除指定的记录
voidaddRecord(void);//在表尾追加职工信息
voiddisplay(void);//显示信息
voidqueryInfo(void);//查询指定的职工信息
voidsortInfo(void);//对职工进行排序
voidTongji(void);//统计函数
intsaveRecords(void);//文件存储
intloadRecords(void);//文件读取
voidquit(void);//结束运行
voidshowTable(void);//输出表头
intfindRecord(char*target,inttargetType,intfrom);//char*target欲查找记录的某一项及target相同;inttargetType通过什么来查找;intfrom从第from个记录开始查找
#include"workers.h"
/*************************
*初始化
*************************/
intnumWrks=0;//记录的职工数
WrkInfo*records=NULL;//记录职工信息的数据
charsavedTag=0;//信息是否已保存的标志,1为未保存,0为保存
intarraySize;//数组大小
/*********************
*主函数
********************/
voidmain()
{
//初始化数组
chara[20]="14251102104",b[20]="0808",str[20];
records=(WrkInfo*)malloc(sizeof(WrkInfo)*INITIAL_SIZE);
system("color5A");
if(records==NULL)
{
printf("memoryfail!
");
exit(-1);
}
arraySize=INITIAL_SIZE;//
printf("\n");
printf("\t**********************************\n");
printf("\t*这是一个*\n");
printf("\t*高校在职职工简单管理程序*\n");
printf("\t*可以对职工信息进行管理*\n");
printf("\t*欢迎使用管理程序*\n");
printf("\t**********************************\n");
printf("\n");
printf("\n");
printf("请输入用户名<14251102104>和密码<0808>");
while
(1){
scanf("%s",str);
if(!
strcmp(str,a)){
scanf("%s",str);
if(!
strcmp(str,b)){
printf("登陆成功");
handle_menu();
}
elseprintf("登陆失败");
}
}
}
voidcopyRecord(WrkInfo*src,WrkInfo*dest);
/*********************
*菜单处理函数
********************/
#include"workers.h"
voidhandle_menu(void)
{
for(;;){
switch(menu_select())
{
case1:
removeRecord();
break;
case2:
addRecord();
break;
case3:
queryInfo();
break;
case4:
Tongji();
break;
case5:
sortInfo();
break;
case6:
display();
break;
case7:
saveRecords();
break;
case8:
loadRecords();
break;
case9:
quit();
}
}
}
#include"workers.h"
/*********************
*菜单选择函数menu_select
********************/
intmenu_select()
{
chars[2];
intcn=0;
printf("\n");
printf("\t1.删除职工信息\n");
printf("\t2.增加职工信息\n");
printf("\t3.查询职工信息\n");
printf("\t4.统计职工信息\n");
printf("\t5.对职工信息进行排序\n");
printf("\t6.显示职工信息\n");
printf("\t7.保存学生信息至记录文件\n");
printf("\t8.从记录文件读取学生信息\n");
printf("\t9.结束运行\n");
printf("\n\t左边数字对应功能选择,请选1-9:
\n\n");
for(;;)
{
gets(s);
cn=atoi(s);
if(cn<1||cn>9)printf("\n\t输入错误,重选1-9:
\n\n");
elsebreak;
}
returncn;
}
/*********************
*结束运行,退出
*参数void
********************/
voidquit(void)
{
charstr[5];
if(savedTag==1)
{
printf("是否保存原来的记录?
(Y/n)");
gets(str);
if(str[0]!
='n'&&str[0]!
='N')
saveRecords();
}
free(records);
exit(0);
}
#include"workers.h"
/*********************
*输出表头
********************/
voidshowTable(void)
{
printf("职工号\t姓名\t性别\t所属二级单位\t所学专业\t职称\t月工资\t电话号码\n");
}
/*********************
*显示所有职工信息函数
********************/
voiddisplay(void)
{
inti;
if(numWrks==0)
{
printf("没有可供显示的记录!
");
return;
}
showTable();
for(i=0;i{
//打印职工信息
printf("%s\t%s\t%s\t%s\t",records[i].num,records[i].name,records[i].sex,records[i].post,records[i].major);
printf("%s\t%s\t%f\t%s\t",records[i].jobname,records[i].salary,records[i].phonenum);
//打印满10个记录后停下来
if(i%9==0&&i!
=0)
{
printf("输入任一字符后继续...\n");
getch();
printf("\n\n");
showTable();
}
}
}
/****************************************
*在当前表的末尾增加新的信息结果:
*records中将记录的信息,如果数组
*大小不够,会重新申请数组空间
****************************************/
voidaddRecord(void)
{
//records=realloc(records,(arraySize+INCR_SIZE)*sizeof(WrkInfo));
charstr[10];
intj;
floatmark,sum;
if(numWrks==0)
printf("原来没有记录,现在建立新表\n");
else
printf("下面在当前表的末尾增加新的信息\n");
while
(1)//()中为1表示无条件反复循环
{
printf("您将要添加一组信息,确定吗?
(Y/n)");
gets(str);
if(str[0]=='n'||str[0]=='N')//不再添加新的信息
break;
if(numWrks>=arraySize)//现在的数组空间不足,需要重新申请空间
{
records=realloc(records,(arraySize+INCR_SIZE)*sizeof(WrkInfo));//新空间大小变为(arraySize+INCR_SIZE)记录大小,即在原来基础上增加INCR_SIZE个记录大小
if(records==NULL)
{
printf("memoryfailed!
");
exit(-1);
}
arraySize=arraySize+INCR_SIZE;//arraySize修改为新空间可保存的记录数
}
printf("请输入职工号:
");
gets(records[numWrks].num);
printf("请输入姓名:
");
gets(records[numWrks].name);
printf("请输入性别(0为女,1为男):
");
gets(str);
if(str[0]=='0')
strcpy(records[numWrks].sex,"女");
else
strcpy(records[numWrks].sex,"男");
printf("请输入所属二级单位:
");
gets(records[numWrks].post);
printf("请输入所学专业:
");
gets(records[numWrks].major);
printf("请输入职称:
");
gets(records[numWrks].jobname);
printf("请输入月工资:
");
gets(str);
records[numWrks].salary=(float)atof(str);
printf("请输入电话号码:
");
gets(records[numWrks].phonenum);
numWrks++;
}
printf("现在一共有%d条信息\n",numWrks);
savedTag=1;
}#include"workers.h"
/*********************************************
*查找指定记录函数
*参数:
target:
欲查找记录的某一项及target相同
*targetType:
表明通过那一项来查找,0为学号,1为姓名,2为名次
*from:
从第from个记录开始找
*返回:
找到的记录的序号,若找不到则返回-1
*********************************************/
intfindRecord(char*target,inttargetType,intfrom)
{
inti;
for(i=from;i<=numWrks;i++)
{
if((targetType==0&&strcmp(target,records[i].num)==0)||(targetType==1&&strcmp(target,records[i].name)==0)||(targetType==2&&strcmp(target,records[i].post)==0))
returni;
}
return-1;
}
voidqueryInfo(void)
{
charstr[5];
chartarget[20];
inttype;