1、C语言课程设计试验总结 一、需求分析: 1.需求概述 设计一个职员信息管理系统,使之能提供以下功效:
2、
3、 (1)职员信息录入功效 (2)职员信息浏览功效 (3)职员信息删除功效 (4)职员信息修改功效 (5) 职员信息查询功效 2.需求说明 (1)职员信息包含:职员号、姓名、性别、出生年月、学历职务、工资、住址、电话,而且职员号要求不反复。 (2)录入职员信息要求用文件形式保留,并对其进行浏览、查询、修改、删除等基础操作。 (3)对职员信息分别按职员号、性别、姓名、工资四种方法进行查询,并返回全部符合条件职员信息。 (4)对职员信息修改应该逐一
4、进行,一个职员信息修改不应影响其它职员信息。 (5)所设计系统应以菜单方法工作,应为用户提供清楚使用提醒,依据用户选择进行多种处理,并要求在此过程中能够尽可能兼容用户使用过程中异常情况。 二、总体设计 1.功效划分 该系统能够按功效进行模块划分,以下图所表示: 职员信息管理系统 菜单 信息输入 浏览信息 信息查询 信息修改 信息删除 职员号查询 性别查询 姓名查询 工资查询 其中: (1) 菜单选择模块完成用户选择,此模块也是职员信息管理系统入口,用户所要进行全部操作需要在此模块中选择,并调用相对应模块实现对应功效。 (2) 信息输入模
5、块完成信息录入功效,输入信息包含:职员号、姓名、性别、出生年月、学历职务、工资、住址、电话。 (3) 信息浏览模块完成对全部职员信息显示。 (4) 信息查询模块分四种查询方法:按职员号查询、按性别查询、按姓名查询、按职务查询。而且输出相对应且符合要求职员信息。 (5) 信息修改模块完成是职员信息修改功效。 (6) 信息删除模块完成是职员信息删除功效。 2.数据结构 本系统中关键数据结构为职员信息,其中包含:职员号、姓名、性别、出生年月、学历职务、工资、住址、电话等,其中出生年月用结构体表示,其中又包含:出生年份、出生月份、出生日期。 3.程
6、序步骤 系统实施应从功效菜单选择开始,依据用户选择进行后续处理,直到用户选择退出系统为止,其间应对用户选择做出判定及异常处理。系统步骤图以下图所表示: 是 是 是 是 是 否 否 否 否 结束 删除? 查询? 修改? 否 开始 菜单 输入? 浏览? 三、具体设计 1. 数据结构 (1)职员信息: struct Zg { char num[20]; //职员号 char name[15]; // 姓名
7、 char sex; //性别 struct Birthday birthday; //出生年月 char xueli[10]; //学历 char position[15]; //职务 int wage; //工资 char address[20];住址 char phone[12]; //电话 }zg[N]; (2)出生年月 struct Birthday //出
8、生年月 { int year; int month; int day; }; 2. 各个功效模块处理步骤 对应总体设计时系统模块图,各个功效模块处 步骤以下: (1) 菜单模块 清屏; 绘制菜单界面; 信息提醒,提醒用户选择对应序号; 判定选择序号是否正确; 返回变量值; (2) 信息录入模块 定义相关变量; 判定文件能否打开; 提醒需要输入职员个数; for(循环条件) { 提醒输入信
9、息; 将信息写进文件; } 提醒是否退出该菜单; 关闭文件; (3) 浏览信息模块 定义相关变量; 判定文件能否打开; 输出全部职员信息; 关闭文件; (4) 信息查询模块 定义相关变量; 判定文件能否打开; do { 清屏; 输出查询菜单; 提醒用户选择对应序号; switch(变量) {
10、 判定查询方法; } 提醒是否退出该菜单; }while(循环条件); (5) 按职员号查询模块 定义相关变量; 判定文件能否打开; do { 信息提醒; for(;循环条件;) { 判定是否符合条件; 若符累计数器加1; 输出符合职员信息; } 判定计数器是否为0;
11、 若为0,输出相关信息; 提醒是否退出该菜单; }while(循环条件); (6) 按性别查询模块 定义相关变量; 判定文件能否打开; do { 信息提醒; for(;循环条件;) { 判定是否符合条件; 若符累计数器加1; 输出符合职员信息; } 判定计数器是否为0; 若为0,输出相关信息; 提醒是否退出该菜单; }while(循环条件); (7) 按姓
12、名查询模块 定义相关变量; 判定文件能否打开; do { 信息提醒; for(;循环条件;) { 判定是否符合条件; 若符累计数器加1; 输出符合职员信息; } 判定计数器是否为0; 若为0,输出相关信息; 提醒是否退出该菜单; }while(循环条件); (8) 按职务查询模块 定义相关变量; 判定文件能否打开; do {
13、 信息提醒; for(;循环条件;) { 判定是否符合条件; 若符累计数器加1; 输出符合职员信息; } 判定计数器是否为0; 若为0,输出相关信息; 提醒是否退出该菜单; }while(循环条件); (9) 信息删除模块 定义相关变量 判定能否打开文件 提醒信息; for(循环条件) { 判定是否是要删除职员;
14、 若是则记标志变量为1; 若不是则将其写入临时文件; } 关闭相关文件; 判定标志变量值; 假如为1,则将源文件删除,并将临时文件重命名; 不然输出相关提醒信息; 提醒退出该菜单; (10) 信息修改模块 定义相关变量 判定能否打开文件 提醒信息; for(循环条件) { 判定是否是要修改职员; 若是则记标志变量为1,并将修改后信息写入临时文件; 若不是则将其写入临时文件; } 关闭相关文件; 判定标志变量值; 假如为1,则将
15、源文件删除,并将临时文件重命名;
不然输出相关提醒信息;
提醒退出该菜单;
四、具体程序
# include
16、输出函数 void dayin(int i);//输出所查询信息 int dq();//读取文件中数据个数 void search();//查询函数 void searchzgnum();//按职员号查询 void searchsex();//按性别查询 void searchname();//按姓名查询 void searchposition();//按职务查询 void del();//删除函数 void xiugai();//修改函数 struct Birthday //出生年月 { int year; int month; int day; }
17、 struct Zg { char num[20]; //职员号 char name[15]; // 姓名 char sex; //性别 struct Birthday birthday; //出生年月 char xueli[10]; //学历 char position[15]; //职务 int wage; //工资 char address[20
18、]; //住址 char phone[12]; //电话 }zg[N]; int Number=0; /****************************主函数******************************/ int main() { fflush(stdin); welcome(); while(1) { switch(menu()) { case 1:input();break; case 2:output();break;
19、case 3:search();break; case 4:del();break; case 5:xiugai();break; case 6:exit(0);break; } } return 0; } /******************************欢迎界面****************************/ void welcome() { system("cls"); printf("\n\t\5\5\3\3\3\3☆☆※★★※☆☆※★★※☆☆※★★※☆☆\3\3\3\3\3\3
20、\3\3\3\3\3\3"); printf("\n\t\5\5\3\3※◆◆☆☆◆◆◆◆◆◆※☆☆※◆◆◆◆◆◆☆☆◆◆※\3\3"); printf("\n\t\5\5\3\3\3\3\3\3★★ ★★\3\3\3\3\3\3\3\3\3"); printf("\n\t\5\5\3\3\3\3\3☆★☆☆★★☆ 欢 迎 进 入 ☆☆★☆☆★★\3\3\3\3\3\3\3"); printf("\n\t\5\5\3\3\3\3\3\3★★
21、 ★★\3\3\3\3\3\3\3\3\3"); printf("\n\t\5\5\3\3\3\3☆★☆☆★◆◆ 本 系 统 ◆◆★☆☆★☆\3\3\3\3\3\3"); printf("\n\t\5\5\3\3\3\3\3\3★★ ★★\3\3\3\3\3\3\3\3\3"); printf("\n\t\5\5\3\3\3\3\3\3☆☆※★★※☆☆※★★※☆☆※★★※☆☆\3\3\3\3\3\3\3\3\3\3"); printf("\n\t\5\5\3
22、\3\3\3\3\3★★☆◆◆ 按任意键进入 ◆◆☆★★\3\3\3\3\3\3\3\3\3"); printf("\n\t\5\5\3\3\3\3☆☆※★★※☆☆※★★※☆☆※★★※☆☆\3\3\3\3\3\3\3\3\3\3\3\3\n"); fflush(stdin); getch(); } /******************************菜单****************************/ int menu() { int n; system("cls"); printf("\t\t※◆※◆※◆※ 菜◆单 ※◆
23、※◆※◆※\n"); printf("\t\t※ ※\n"); printf("\t\t※ 1.录入 2.浏览 ※\n"); printf("\t\t※ 3.查询 4.删除 ※\n"); printf("\t\t※ 5.修改 6.退出 ※\n"); printf("\t\t※ ※\n"); printf("\t\t※◆※◆※◆※◆※◆※◆※◆※◆※
24、※\n"); printf("\n\t\t--请输入您选择序号(1-6):[ ]--\b\b\b\b"); fflush(stdin); scanf("%d",&n); while(1) { if(n<1 || n>6) { printf("\t\t-----输入错误!请重新选择:[ ]----\b\b\b\b\b\b"); scanf("%d",&n); } else break; } return n; } /******************************读取文件中数据个数******
25、/ int dq() { FILE *fp=NULL; int i=0; fp=fopen("职员信息记录表.txt","rb"); while(fread(&zg[i],sizeof(struct Zg),1,fp)) i++; fclose(fp); return i; } /******************************录入信息****************************/ void input() { FILE *fp; int i,
26、number,flage;
if((fp=fopen("职员信息记录表.txt","ab"))==NULL)
{
printf("文件 职员信息记录表.txt 不能打开!");
getch();
exit(1);
}
printf("\t请输入录入职员数:");
scanf("%d",&number);
for(i=0;i 27、s",&zg[i].num);
flage=pdnum(zg[i].num);
}while(flage==1);
printf("请输入姓名:");scanf("%s",&zg[i].name);
do
{
printf("请输入性别(f/m):");scanf("%s",&zg[i].sex);
flage=pdsex(zg[i].sex);
}while(flage==0);
printf("请输入出生年月如( 6 7):");scanf("%d%d%d",&zg 28、[i].birthday.year,&zg[i].birthday.month,&zg[i].birthday.day);
printf("请输入学历(junior,high,college,master,doctor):");scanf("%s",&zg[i].xueli);
printf("请输入职务:");scanf("%s",&zg[i].position);
printf("请输入工资:");scanf("%d",&zg[i].wage);
printf("请输入住址:");scanf("%s",&zg[i].address);
29、 printf("请输入电话:");scanf("%s",&zg[i].phone);
fwrite(&zg[i],sizeof(struct Zg),1,fp);
}
printf("\t★★★★按任意键退出录入菜单★★★★\n");
getch();
fclose(fp);
}
/******************************判定职员号是否反复****************************/
int pdnum(char num[20])
{
FILE *fp;
struct Zg temp;
30、 int i,flage=0;
if((fp=fopen("职员信息记录表.txt","rb"))==NULL)
{
printf("文件 职员信息记录表.txt 不能打开!");
getch();
exit(1);
}
while(fread(&temp,sizeof(struct Zg),1,fp)==1)
{
if(strcmp(temp.num,num)==0)
{
printf("\t此职员号已存在!请重新输入");
31、
flage=1;
break;
}
}
return(flage);
}
/******************************判定输入性别是否正确****************************/
int pdsex(char ch)
{
int flage;
if(ch=='f' || ch=='m')
flage=1;
else
flage=0;
if(flage==0)
printf("\t 32、输入错误!请重新输入\n**");
return(flage);
}
/******************************输出所查询信息****************************/
void dayin(int i)
{
printf("职员号:%s\n",zg[i].num);
printf("姓名:%s\n",zg[i].name);
printf("性别:%c\n",zg[i].sex);
printf("出生日期:%d %d %d\n",zg[i].birthday.year,zg[i].birth 33、day.month,zg[i].birthday.day);
printf("学历:%s\n",zg[i].xueli);
printf("职务:%s\n",zg[i].position);
printf("工资:%d\n",zg[i].wage);
printf("住址:%s\n",zg[i].address);
printf("电话:%s\n\n",zg[i].phone);
}
/******************************输出全部信息****************************/
void o 34、utput()
{
FILE *fp;
int count=0,i;
Number=dq();
if((fp=fopen("职员信息记录表.txt","rb"))==NULL)
{
printf("文件 职员信息记录表.txt 不能打开!");
getch();
exit(1);
}
for(i=0;i 35、 printf("\t---按任意键退出浏览菜单---\n");
getch();
fclose(fp);
}
/******************************查询信息****************************/
void search()
{
int choice;
char ch;
do
{
system("cls");
printf("\n\t★★★★★★★★★★★★★★★★\n");
printf("\t★ 请输入你查询方法 ★\n");
36、 printf("\t★ 1.职员号 2.性别 ★\n");
printf("\t★ 3.姓名 4.职务 ★\n");
printf("\t★★★★★★★★★★★★★★★★\n");
scanf("%d",&choice);
switch(choice)
{
case 1:searchzgnum();break;
case 2:searchsex();break;
case 3:searchname();br 37、eak;
case 4:searchposition();break;
default:printf("\t输入错误,没有该功效!请返回重新选择");break;
}
printf("\n\n\t◇◇◇是否退出查询菜单(y/n)?◇◇◇\n");
fflush(stdin);
ch=getchar();
}while(ch=='Y'||ch=='y');
}
/******************************按职员号查询信息****************************/
38、void searchzgnum()
{
FILE *fp;
char ch;
int count=0,i;
char temp[20];
Number=dq();
if((fp=fopen("职员信息记录表.txt","rb"))==NULL)
{
printf("\t----文件 职员信息记录表.txt 不能打开!----");
getch();
exit(1);
}
do
{
printf("\t请输入你要查询职员号:");
scanf("%s" 39、temp);
for(i=0;i 40、in);
ch=getchar();
}while(ch=='y' ||ch=='Y');
}
/******************************按性别查询信息****************************/
void searchsex()
{
FILE *fp;
int count=0,i;
char sex,ch;
Number=dq();
if((fp=fopen("职员信息记录表.txt","rb"))==NULL)
{
printf("\t----文件 职员信息记录表. 41、txt 打不开!----");
getch();
exit(1);
}
do
{
printf("\t请输入你要查询性别:");
fflush(stdin);
scanf("%c",&sex);
for(i=0;i 42、count==0)
printf("\t没有该性别职员!\n");
printf("\n\t★★★是否继续按性别查询(y/n)?★★★");
fflush(stdin);
ch=getchar();
}while(ch=='y' ||ch=='Y');
}
/******************************按姓名查询信息****************************/
void searchname()
{
FILE *fp;
int count=0,i;
char name[15 43、];
char ch;
Number=dq();
if((fp=fopen("职员信息记录表.txt","rb"))==NULL)
{
printf("\t----文件 职员信息记录表.txt 打不开!----");
getch();
exit(1);
}
do
{
printf("\t请输入你要查询姓名:");
fflush(stdin);
scanf("%s",&name);
for(i=0;i 44、 if(strcmp(zg[i].name,name)==0)
{
count++;
dayin(i);
}
}
if(count==0)
printf("\t没有该名字职员!\n");
printf("\n\t★★★是否继续按姓名查询(y/n)?★★★");
fflush(stdin);
ch=getchar();
}while(ch=='y' ||ch=='Y');
}
/*************** 45、按职务查询信息****************************/
void searchposition()
{
FILE *fp;
int count=0,i;
char position[15];
char ch;
Number=dq();
if((fp=fopen("职员信息记录表.txt","rb"))==NULL)
{
printf("\t----文件 职员信息记录表.txt 打不开!----");
getch();
exit(1);
46、 }
do
{
printf("\t请输入你要查询职务:");
fflush(stdin);
scanf("%s",&position);
for(i=0;i 47、没有该职务职员!\n");
printf("\n\t★★★是否继续按职务查询(y/n)?★★★");
fflush(stdin);
ch=getchar();
}while(ch=='y' ||ch=='Y');
}
/******************************删除信息****************************/
void del()
{
FILE *fp,*fp2;
int i,flage=0;
char number[20],ch;
Number=dq();
if((fp=fo 48、pen("职员信息记录表.txt","rb"))==NULL)
{
printf("文件 职员信息记录表.txt 打不开!\n");
getch();
exit(1);
}
if((fp2=fopen("temp.txt","wb"))==NULL)
{
printf("文件 temp.txt 打不开!\n");
getch();
exit(1);
}
printf("请输入你要删除职员号:");
scanf("%s",number);
for(i=0;i 49、{
if(strcmp(zg[i].num,number)==0)
{
printf("\t**你确定删除该职员信息(y/n)?**");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y')
{
flage=1;
}
else
fwrite(&zg[i],sizeof(struct Zg),1,fp2);
}
else
fwrite(&zg[i], 50、sizeof(struct Zg),1,fp2);
}
fclose(fp);
fclose(fp2);
if(flage==1)
{
remove("职员信息记录表.txt");
rename("temp.txt","职员信息记录表.txt");
printf("\t***删除成功!***\n");
}
else
printf("\t***未找到该职员号,删除失败!***\n");
fclose(fp);
fclose(fp2);
printf("\n\t★






