1.题目
教师信息包括:记录编号、教师工号、姓名、出生日期(年、月)、学院、住址,联系方式
功能要求:
- 从教师信息文件中读取已有的教师信息,并实现屏幕显示。
- 能通过教师工号对已有的教师信息进行修改,要求工号不能修改,其他信息内容都可改,修改的结果保存至教师信息文件。
- 实现对教师信息的统计(分学院统计教师数量)并排序显示。
- 实现对教师信息的查询显示(查询条件分为工号、出生年、学院)。
- 新教师信息的添加并保存至教师信息文件。
- 教师信息的删除,根据工号,删除指定教师生信息,并将结果写入文件。
- 每增加一条记录,记录编号自动加1。
2.总体设计
3.系统详细设计
- 文件读/写模块:首先创建一个文件指针,然后以读/写的方式打开文件并设置完全缓存模式,然后利用while(i < n)该循环逐一对每组数据进行读/写的操作,最后再关闭文件即可。
- 查询模块:为了更人性化一些,可根据教师的任意信息进行查询。首先定义根据该信息查询全部该教师信息的变量,然后调用文件读模块(打开程序后,要查询以前的数据,要先读入),接着用printf打印出每个数字对应各个查询方式的一个菜单。当然,当输入的指令不在范围内的话会提示出错并关闭窗口然后用continue语句可继续输入指令。语句如下:
if(num < '0' || num > '9')
{
printf("错误指令!\n\n");
system("pause");//这将要求“按任意键....”关闭窗口
continue; //重新执行条件判断
}
然后会根据指令多次调用类似于下面的语句进行查询。利用for循环以及条件语句if逐一筛选出要查找的信息,而if里面的条件判断句是利用比较字符串strcmp,符合后会调用显示模块来显示出要查找的信息,语句如下:
if(num == '1') //按工号查询
{
printf("\t\t请输入您要查询教师的工号:");
scanf("%s",q_id);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].ID,q_id) == 0)
{
output_inf(i);
flag = 1;//标记
break;
}
}
}
利用下面这条语句可确定是否查找出要查找的教师信息(因为如果成功查找,flag会被赋值为一)。
if(!flag)//判断是否有该教师信息
{
printf("\n\n无该教师信息!\n\n");
}
接着会提示是否继续查询,若要继续查询则重复上面所说的步骤,如果不,则会强制跳出,语句如下:
printf("\n\n是否继续查询(Y/N):");
scanf("%*c%c",&c); //%*c作用是读取输入流中数字后的一个字符,并丢弃,使得后面的输入函数不能读到那个字符跳过一个字符
if(c == 'N' || c == 'n')
break; //强制跳出
4.源码
//文件读写模块
void read(void)//读文件
{
FILE *fp;
int i = 0;
if( (fp = fopen("d:\\date.txt","r")) == NULL )//以读的方式打开文件
{
printf("请在D盘根目录下新建一个文本文件,文件名为date\n\n\n");
system("pause"); //这将要求“按任意键....”关闭窗口
system("cls"); //这将清除运行的任何文本的屏幕
return;
}
setvbuf(fp,NULL,_IOFBF,BUFSIZ); //设置完全缓存模式
fscanf(fp,"%d\n",&n); //从输入流中读取并保存到文件中
while(i < n)
{
fscanf(fp,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",work[i].ID,work[i].name,work[i].sex,work[i].born,work[i].edu,work[i].dep,work[i].position,work[i].wage,work[i].address,work[i].tel);
i++;
}
fclose(fp);
}
void write(void)//写入数据
{
FILE *fp;
int i = 0;
if( (fp = fopen("d:\\date.txt","w")) == NULL )//以写的方式打开文件
{
printf("无法打开文件!\n");
return ;
}
setvbuf(fp,NULL,_IOFBF,BUFSIZ); //设置完全缓存模式
fprintf(fp,"%d\n",n); //输出到文件中
while(i < n)
{
fprintf(fp,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",work[i].ID,work[i].name,work[i].sex,work[i].born,work[i].edu,work[i].dep,work[i].position,work[i].wage,work[i].address,work[i].tel);
i ++;
}
fclose(fp);
}
//查询模块
void que(void)
{
char num; //1-9
int flag,i;
char q_id[20]; //查询工号
char q_name[20]; //查询姓名
char q_edu[20]; //查询学历
char q_position[20];//查询职务
char q_dep[20]; //查询学院
char q_tel[20]; //查询电话
char q_sex[20]; //查询性别
char q_wage[20]; //查询工资
char q_address[20]; //查询地址
char q_born[20]; //查询生日
char c; //指令Y?N
read(); //打开程序后,要查询以前的数据,要先读入
while(1)
{
system("cls"); //这将清除运行的任何文本的屏幕
printf("\t\t******************查询********************\n");
printf("\t\t* *\n");
printf("\t\t* 1.按工号查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 2.按姓名查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 3.按学历查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 4.按职务查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 5.按性别查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 6.按住址查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 7.按电话查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 8.按工资查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 9.按学院查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 0.按生日查询 *\n");
printf("\t\t* *\n");
printf("\t\t* 输入其他任意键退出本模块 *\n");
printf("\t\t******************************************\n");
printf("\t\t请输入指令(0-9):");
scanf("%*c%c",&num);//%*c作用是读取输入流中数字后的一个字符,并丢弃,使得后面的输入函数不能读到那个字符跳过一个字符
if(num < '0' || num > '9')
{
printf("错误指令!\n\n");
system("pause");//这将要求“按任意键....”关闭窗口
continue; //重新执行条件判断
}
system("cls"); //这将清除运行的任何文本的屏幕
flag = 0; //用来标记教师信息是否存在
if(num == '1') //按工号查询
{
printf("\t\t请输入您要查询教师的工号:");
scanf("%s",q_id);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].ID,q_id) == 0)
{
output_inf(i);
flag = 1;//标记
break;
}
}
}
else if(num == '2')//按姓名查询
{
printf("\t\t请输入您要查询教师的姓名:");
scanf("%s",q_name);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].name,q_name) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '3')//按学历查询
{
printf("\t\t请输入您要查询教师的学历:");
scanf("%s",q_edu);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].edu,q_edu) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '4')//按职务查询
{
printf("\t\t请输入您要查询教师的职务:");
scanf("%s",q_position);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].position,q_position) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '5')//按性别查询
{
printf("\t\t请输入您要查询教师的性别:");
scanf("%s",q_sex);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].sex,q_sex) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '6')//按住址查询
{
printf("\t\t请输入您要查询教师的住址:");
scanf("%s",q_address);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].address,q_address) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '7')//按电话查询
{
printf("\t\t请输入您要查询教师的电话:");
scanf("%s",q_tel);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].tel,q_tel) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '8')//按工资查询
{
printf("\t\t请输入您要查询教师的工资:");
scanf("%s",q_wage);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].wage,q_wage) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '9')//按学院查询
{
printf("\t\t请输入您要查询教师的学院:");
scanf("%s",q_dep);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].dep,q_dep) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
else if(num == '0')//按生日查询
{
printf("\t\t请输入您要查询教师的生日:");
scanf("%s",q_born);
for(i = 0 ; i < n ;i ++)
{
if( strcmp(work[i].born,q_born) == 0)
{
output_inf(i);
flag = 1;//标记
}
}
}
if(!flag)//判断是否有该教师信息
{
printf("\n\n无该教师信息!\n\n");
}
printf("\n\n是否继续查询(Y/N):");
scanf("%*c%c",&c);//%*c作用是读取输入流中数字后的一个字符,并丢弃,使得后面的输入函数不能读到那个字符跳过一个字符
if(c == 'N' || c == 'n')
break; //强制跳出
}
}