资源描述
C语言课程设计试验总结
一、需求分析:
1.需求概述
设计一个职员信息管理系统,使之能提供以下功效:
(1)职员信息录入功效
(2)职员信息浏览功效
(3)职员信息删除功效
(4)职员信息修改功效
(5) 职员信息查询功效
2.需求说明
(1)职员信息包含:职员号、姓名、性别、出生年月、学历职务、工资、住址、电话,而且职员号要求不反复。
(2)录入职员信息要求用文件形式保留,并对其进行浏览、查询、修改、删除等基础操作。
(3)对职员信息分别按职员号、性别、姓名、工资四种方法进行查询,并返回全部符合条件职员信息。
(4)对职员信息修改应该逐一进行,一个职员信息修改不应影响其它职员信息。
(5)所设计系统应以菜单方法工作,应为用户提供清楚使用提醒,依据用户选择进行多种处理,并要求在此过程中能够尽可能兼容用户使用过程中异常情况。
二、总体设计
1.功效划分
该系统能够按功效进行模块划分,以下图所表示:
职员信息管理系统
菜单
信息输入
浏览信息
信息查询
信息修改
信息删除
职员号查询
性别查询
姓名查询
工资查询
其中:
(1) 菜单选择模块完成用户选择,此模块也是职员信息管理系统入口,用户所要进行全部操作需要在此模块中选择,并调用相对应模块实现对应功效。
(2) 信息输入模块完成信息录入功效,输入信息包含:职员号、姓名、性别、出生年月、学历职务、工资、住址、电话。
(3) 信息浏览模块完成对全部职员信息显示。
(4) 信息查询模块分四种查询方法:按职员号查询、按性别查询、按姓名查询、按职务查询。而且输出相对应且符合要求职员信息。
(5) 信息修改模块完成是职员信息修改功效。
(6) 信息删除模块完成是职员信息删除功效。
2.数据结构
本系统中关键数据结构为职员信息,其中包含:职员号、姓名、性别、出生年月、学历职务、工资、住址、电话等,其中出生年月用结构体表示,其中又包含:出生年份、出生月份、出生日期。
3.程序步骤
系统实施应从功效菜单选择开始,依据用户选择进行后续处理,直到用户选择退出系统为止,其间应对用户选择做出判定及异常处理。系统步骤图以下图所表示:
是
是
是
是
是
否
否
否
否
结束
删除?
查询?
修改?
否
开始
菜单
输入?
浏览?
三、具体设计
1. 数据结构
(1)职员信息:
struct Zg
{
char num[20]; //职员号
char name[15]; // 姓名
char sex; //性别
struct Birthday birthday; //出生年月
char xueli[10]; //学历
char position[15]; //职务
int wage; //工资
char address[20];住址
char phone[12]; //电话
}zg[N];
(2)出生年月
struct Birthday //出生年月
{
int year;
int month;
int day;
};
2. 各个功效模块处理步骤
对应总体设计时系统模块图,各个功效模块处 步骤以下:
(1) 菜单模块
清屏;
绘制菜单界面;
信息提醒,提醒用户选择对应序号;
判定选择序号是否正确;
返回变量值;
(2) 信息录入模块
定义相关变量;
判定文件能否打开;
提醒需要输入职员个数;
for(循环条件)
{
提醒输入信息;
将信息写进文件;
}
提醒是否退出该菜单;
关闭文件;
(3) 浏览信息模块
定义相关变量;
判定文件能否打开;
输出全部职员信息;
关闭文件;
(4) 信息查询模块
定义相关变量;
判定文件能否打开;
do
{
清屏;
输出查询菜单;
提醒用户选择对应序号;
switch(变量)
{
判定查询方法;
}
提醒是否退出该菜单;
}while(循环条件);
(5) 按职员号查询模块
定义相关变量;
判定文件能否打开;
do
{
信息提醒;
for(;循环条件;)
{
判定是否符合条件;
若符累计数器加1;
输出符合职员信息;
}
判定计数器是否为0;
若为0,输出相关信息;
提醒是否退出该菜单;
}while(循环条件);
(6) 按性别查询模块
定义相关变量;
判定文件能否打开;
do
{
信息提醒;
for(;循环条件;)
{
判定是否符合条件;
若符累计数器加1;
输出符合职员信息;
}
判定计数器是否为0;
若为0,输出相关信息;
提醒是否退出该菜单;
}while(循环条件);
(7) 按姓名查询模块
定义相关变量;
判定文件能否打开;
do
{
信息提醒;
for(;循环条件;)
{
判定是否符合条件;
若符累计数器加1;
输出符合职员信息;
}
判定计数器是否为0;
若为0,输出相关信息;
提醒是否退出该菜单;
}while(循环条件);
(8) 按职务查询模块
定义相关变量;
判定文件能否打开;
do
{
信息提醒;
for(;循环条件;)
{
判定是否符合条件;
若符累计数器加1;
输出符合职员信息;
}
判定计数器是否为0;
若为0,输出相关信息;
提醒是否退出该菜单;
}while(循环条件);
(9) 信息删除模块
定义相关变量
判定能否打开文件
提醒信息;
for(循环条件)
{
判定是否是要删除职员;
若是则记标志变量为1;
若不是则将其写入临时文件;
}
关闭相关文件;
判定标志变量值;
假如为1,则将源文件删除,并将临时文件重命名;
不然输出相关提醒信息;
提醒退出该菜单;
(10) 信息修改模块
定义相关变量
判定能否打开文件
提醒信息;
for(循环条件)
{
判定是否是要修改职员;
若是则记标志变量为1,并将修改后信息写入临时文件;
若不是则将其写入临时文件;
}
关闭相关文件;
判定标志变量值;
假如为1,则将源文件删除,并将临时文件重命名;
不然输出相关提醒信息;
提醒退出该菜单;
四、具体程序
# include<stdio.h>
# include<stdlib.h>
# include<conio.h>
# include<string.h>
# define N 100
void welcome();//欢迎界面
int menu();//菜单
void input();//输入函数
int pdnum(char num[20]);//判定职员号是否反复
int pdsex(char ch);//判定输入性别是否符合要求
void output();//输出函数
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;
};
struct Zg
{
char num[20]; //职员号
char name[15]; // 姓名
char sex; //性别
struct Birthday birthday; //出生年月
char xueli[10]; //学历
char position[15]; //职务
int wage; //工资
char address[20]; //住址
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;
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\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★★ ★★\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\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※◆※◆※◆※ 菜◆单 ※◆※◆※◆※\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※◆※◆※◆※◆※◆※◆※◆※◆※※\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;
}
/******************************读取文件中数据个数****************************/
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,number,flage;
if((fp=fopen("职员信息记录表.txt","ab"))==NULL)
{
printf("文件 职员信息记录表.txt 不能打开!");
getch();
exit(1);
}
printf("\t请输入录入职员数:");
scanf("%d",&number);
for(i=0;i<number;i++)
{
printf("\t---请输入第%d个职员信息:---",i+1);
do
{
printf("\n请输入职员号:");scanf("%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[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);
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;
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此职员号已存在!请重新输入");
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**输入错误!请重新输入\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].birthday.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 output()
{
FILE *fp;
int count=0,i;
Number=dq();
if((fp=fopen("职员信息记录表.txt","rb"))==NULL)
{
printf("文件 职员信息记录表.txt 不能打开!");
getch();
exit(1);
}
for(i=0;i<Number;i++)
{
dayin(i);
count++;
}
printf("\t共有%d个职员。\n",count);
printf("\t---按任意键退出浏览菜单---\n");
getch();
fclose(fp);
}
/******************************查询信息****************************/
void search()
{
int choice;
char ch;
do
{
system("cls");
printf("\n\t★★★★★★★★★★★★★★★★\n");
printf("\t★ 请输入你查询方法 ★\n");
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();break;
case 4:searchposition();break;
default:printf("\t输入错误,没有该功效!请返回重新选择");break;
}
printf("\n\n\t◇◇◇是否退出查询菜单(y/n)?◇◇◇\n");
fflush(stdin);
ch=getchar();
}while(ch=='Y'||ch=='y');
}
/******************************按职员号查询信息****************************/
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",&temp);
for(i=0;i<Number;i++)
{
if(strcmp(zg[i].num,temp)==0)
{
count++;
dayin(i);
}
}
if(count==0) /*count=0说明没有该职员号职员*/
printf("\t没有该工号职员!\n");
printf("\n\t★★★是否继续按职员号查询(y/n)?★★★");
fflush(stdin);
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----文件 职员信息记录表.txt 打不开!----");
getch();
exit(1);
}
do
{
printf("\t请输入你要查询性别:");
fflush(stdin);
scanf("%c",&sex);
for(i=0;i<Number;i++)
{
if(zg[i].sex==sex)
{
count++;
dayin(i);
}
}
if(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];
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<Number;i++)
{
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');
}
/******************************按职务查询信息****************************/
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);
}
do
{
printf("\t请输入你要查询职务:");
fflush(stdin);
scanf("%s",&position);
for(i=0;i<Number;i++)
{
if(strcmp(zg[i].position,position)==0)
{
count++;
dayin(i);
}
}
if(count==0)
printf("\t没有该职务职员!\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=fopen("职员信息记录表.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<Number;i++)
{
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],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★
展开阅读全文