#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<dos.h>
#define LEN sizeof(struct teacher) /*宏定义自定义结构体类型的长度*/
#define FORMAT "%-15s%-15s%-5s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n" /*定义数据元素输出的格式*/
#define DATA &tea[i].name,&tea[i].number,&tea[i].sex,&tea[i].title,&tea[i].project1,&tea[i].project2,&tea[i].project3,&tea[i].degree,&tea[i].effectiveness,&tea[i].schoolterm
/*定义结构体类型的数组引用成员的输出列表*/
struct teacher /*定义教师结构体*/
{
char name[15]; /*教师姓名*/
char number; /*职工号*/
char sex; /*性别*/
char title[15]; /*职称*/
char project1[15]; /*主讲科目1*/
char project2[15]; /*主讲科目2*/
char project3[15]; /*主讲科目3*/
char degree[15]; /*学位性质*/
char effectiveness; /*教学效果评分*/
char schoolterm[15]; /*办学日期*/
};
struct teacher tea[20];
int n;
void menu();
void in();
void search();
void del();
void modify();
void insert();
void order();
void show();
void menu()/*声明功能模板的函数,自定义函数实现菜单功能*/
{
system("cls"); /*调用系统命令cls完成清屏操作,即清空屏幕*/
printf("\n\n");
printf("\t\t|----------学院教学信息管理系统---------|\n");
printf("\t\t|\t |\n");
printf("\t\t|\t 1.录入教师信息 |\n");
printf("\t\t|\t 2.查找教师信息 |\n");
printf("\t\t|\t 3.删除教师信息 |\n");
printf("\t\t|\t 4.修改教师信息 |\n");
printf("\t\t|\t 5.插入教师信息 |\n");
printf("\t\t|\t 6.按教学效果评分排序\t |\n");
printf("\t\t|\t 7.显示所有教师信息\t |\n");
printf("\t\t|\t 0.退出系统 |\n");
printf("\t\t|\t |\n");
printf("\t\t|---------------------------------------|\n");
printf("\t\t| 请选择(0~7): |\n");
}
void main()/*主函数*/
{
system("color f0\n");
/*发出一个DOS命令,用于执行系统命令,颜色属性由两个十六进制数字指定(前景后字),“f”代表亮白色,“0”代表黑色,即“白地黑字”*/
menu();
scanf("%d",&n);
/*输入选择功能的编号,程序会根据该数字调用不同的函数*/
while(n)
{
switch(n)
{case 1: in();break; /*录入教师信息*/
case 2: search();break; /*查找教师信息*/
case 3: del();break; /*删除教师信息*/
case 4: modify();break; /*修改教师信息*/
case 5: insert();break; /*插入教师信息*/
case 6: order();break; /*按教学效果成绩排序*/
case 7: show();break; /*显示教师信息*/
default: break; /*退出程序*/
}
getch();
menu();/*执行完功能再次显示菜单界面*/
scanf("%d",&n);
}
}
void in() /*定义in函数,录入教师信息*/
{
char i,m=0; /*m是记录的条数*/
char ch[2]; /*定义字符型一维数组ch*/
FILE *fp; /*定义一个指向文件的指针变量fp*/
if((fp=fopen("data.txt","a+"))==NULL)
/*对磁盘文件进行操作处理需要首先打开指定文件,如果指定文件不存在便会出错*/
/*将fopen函数的返回值赋给指针变量fp,打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当检查到文件未结束时*/
{
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
{m++;} /*统计当前记录条数*/
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件中没有记录!\n");}
else
{show();}
/*如果录入信息时,查询到文件data中有数据,会首先调用show函数显示原有信息,再询问是否插入数据以添加信息*/
if((fp=fopen("data.txt","wb"))==NULL)/*判断读写的文本文件是否存在*/
{printf("文件不存在!\n");return;}
printf("输入教师信息(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息,Y/y即要录入*/
{
printf("请输入职工号number:");
scanf("%s",&tea[m].number);/*输入要插入的职工号*/
for(i=0;i<m;i++)
if(tea[i].number==tea[m].number)
{
printf("该职工号number已存在,按任意键继续!\n");
/*如果选择插入数据,系统首先会对输入的职工号进行检查,只有在输入的职工号与已存在的职工号不重复的情况下,才能继续输入其他老师的信息*/
getch();
fclose(fp);
return;
}
printf("不存在该教师信息,请继续!\n");
printf("姓名:\n");
scanf("%s",&tea[m].name);
printf("职工号:\n");
scanf("%s",&tea[m].number);
printf("性别(F/M):\n");
scanf("%s",&tea[m].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):\n");
scanf("%s",&tea[m].title);
printf("主讲科目1:\n");
scanf("%s",&tea[m].project1);
printf("主讲科目2:\n");
scanf("%s",&tea[m].project2);
printf("主讲科目3:\n");
scanf("%s",&tea[m].project3);
printf("学位性质(学位degree/非学位non degree):\n");
scanf("%s",&tea[m].degree);
printf("教学效果综合评分(0~100分):\n");
scanf("%s",&tea[m].effectiveness);
printf("办学日期:\n");
scanf("%s",&tea[m].schoolterm);
if(fwrite(&tea[m],LEN,1,fp)!=1) /*将录入的信息写入指定的磁盘文件*/
/*将&tea[m]所指的1*LEN个字节输出到fp所指文件中*/
{printf("不能保存!");getch();}
else
{printf("\t%s\t已被保存!\n ",tea[m].name);
m++;} /*统计当前记录条数*/
printf("继续?(y/n):"); /*询问是否继续*/
scanf("%s",ch);
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("OK!\n");
}
void search() /*定义search函数,根据职工号查找教师信息*/
{
FILE *fp; /*定义文件指针*/
char snum,i,m=0;
if((fp=fopen("data.txt","rb"))==NULL) /*查询的文件中不存在该职工号*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件不存在!\n");return;}
printf("请输入职工号number:");
scanf("%s",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*查找输入的职工号是否在记录中*/
{
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
printf(FORMAT,DATA);
/*将查找出的结果按指定格式输出*/
break;
}
if(i==m) printf("没有查询到该教师!\n");
}
void del() /*定义del函数*/
{
FILE *fp; /*定义文件指针*/
char snum,i,j,m=0;
char ch[2];
if((fp=fopen("data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("请输入教师的职工号number:");
scanf("%s",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*匹配查找教师信息*/
{
printf("查询到该教师,是否删除?(y/n)"); /*是否删除该信息*/
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0) /*判断是否删除该信息*/
{
for(j=i;j<m;j++)
tea[j]=tea[j+1]; /*将后一个记录移到前一个记录的位置,以删除匹配查找出的教师信息*/
m--; /*记录的总数减1*/
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(j=0;j<m;j++) /*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&tea[m],LEN,1,fp)!=1)
{printf("can not save!\n");getch();}
fclose(fp);
printf("删除成功!\n");
}
else
{printf("找到了记录,选择不删除!");}/**/
break;
}
}
void modify() /*自定义修改函数*/
{
FILE *fp; /*定义文件指针*/
char snum,i=0,j=0,m=0;
if((fp=fopen("data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
show();
printf("请输入要修改的教师的number: ");
scanf("%s",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number)
{
printf("找到该名教师,可修改信息!\n");
printf("姓名:");
scanf("%s",&tea[i].name);
printf("职工号:");
scanf("%s",&tea[i].number);
printf("性别(F/M):");
scanf("%s",&tea[i].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",&tea[i].title);
printf("主讲科目1:");
scanf("%s",&tea[i].project1);
printf("主讲科目2:");
scanf("%s",&tea[i].project2);
printf("主讲科目3:");
scanf("%s",&tea[i].project3);
printf("学位性质(学位/非学位):");
scanf("%s",&tea[i].degree);
printf("教学效果综合评分(0~100分):");
scanf("%s",&tea[i].effectiveness);
printf("办学日期:");
scanf("%s",&tea[i].schoolterm);
if((fp=fopen("data.txt","wb"))==NULL)
{printf("不能打开文件!\n");return;}
for(j=0;j<m;j++) /*将新修改的信息写入指定的磁盘文件中*/
if(fwrite(&tea[j],LEN,1,fp)!=1)
{printf("不能保存文件!\n");getch();}
fclose(fp);
break;
}
if(m==0)
{printf("没有找到这名学生!\n");}
}
void insert() /*自定义插入函数*/
{
FILE *fp; /*定义文件指针*/
char snum,i,j,k,m=0;
if((fp=fopen("data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
printf("请输入要插入的位置(number)"); /*即插在该职工号后面*/
scanf("%s",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number) /*查找该职工号*/
break;
for(j=m-1;j>i;j--)
tea[j+1]=tea[j]; /*从最后一条记录开始均向后移一位*/
printf("现在请输入要插入的位置\n");
printf("number: ");
scanf("%s",&tea[i+1].number);
for(k=0;k<m;k++)
if(tea[k].number==tea[m].number)
{
printf("该教师的number已存在,请按任意键继续!");
getch();
fclose(fp);
return;
}
printf("姓名:");
scanf("%s",&tea[i+1].name);
printf("职工号:");
scanf("%s",&tea[i+1].number);
printf("性别(F/M):");
scanf("%s",&tea[i+1].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",&tea[i+1].title);
printf("主讲科目1:");
scanf("%s",&tea[i+1].project1);
printf("主讲科目2:");
scanf("%s",&tea[i+1].project2);
printf("主讲科目3:");
scanf("%s",&tea[i+1].project3);
printf("学位性质(学位degree/非学位non degree):");
scanf("%s",&tea[i+1].degree);
printf("教学效果综合评分(0~100分):");
scanf("%s",&tea[i+1].effectiveness);
printf("办学日期:");
scanf("%s",&tea[i+1].schoolterm);
printf("插入成功!按任意键返回主界面!");
if((fp=fopen("data.txt","wb"))==NULL)
{printf("不能打开!\n");return;}
for(k=0;k<=m;k++)
if(fwrite(&tea[k],LEN,1,fp)!=1) /*将新修改的信息写入指定的磁盘文件中*/
{printf("不能保存!");getch();}
fclose(fp);
}
void order() /*自定义排序函数,首先读出已录入的教师信息,将信息按照教学效果成绩排序*/
{
FILE *fp; /*定义文件指针*/
struct teacher t;
char i=0,j=0,m=0;
if((fp=fopen("data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{printf("文件中没有记录!\n");return;}
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m-1;i++) /*教学效果成绩从高到低排列*/
for(j=i+1;j<m;j++)
if(tea[i].effectiveness<tea[j].effectiveness)
{
t.effectiveness=tea[i].effectiveness;
tea[i].effectiveness=tea[j].effectiveness;
tea[j].effectiveness=t.effectiveness;
}
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m;i++)
if(fwrite(&tea[i],LEN,1,fp)!=1) /*将重新排序后的信息写入指定的磁盘文件中*/
{printf("%s 不能保存文件!\n");getch();}
fclose(fp);
printf("保存成功!\n");
}
void show()
{
FILE *fp;
char i,m=0;
fp=fopen("data.txt","rb"); /*打开一个文本文件只读*/
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
{
if(fread(&tea[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
for(i=0;i<m;i++)
{
printf(FORMAT,DATA);
}
}
教师信息管理系统
程序正常运行,选择1(录入教师信息),依次输入数据
然后再enter,选择不继续--n,然后退出程序
数据存入到程序运行时新建的data.txt,打开查看却发现10001变成1,91变成9
选择7(显示所有教师信息),却又变成这样
求解,是字节存储的问题吗
但char number; /*职工号*/改成char number[15]; /*职工号*/
char effectiveness; /*教学效果评分*/改成char effectiveness[15]; /*教学效果评分*/
程序变得无法运行