求大神帮帮忙 很急!!!!!!!怎么改啊!!!!!!
#include<stdio.h> #include<stdlib.h> //标准库函数
#include<string.h> //字符串函数
#include<dos.h> //为了调用atof()等函数
#define M 50 //定义常数表示记录数
int flag=0;
char numstr[50];
char temp;
typedef struct //定义数据结构
{
char Name[30];
char Num[30];
char Class[10];
char Tel[50];
char Score[20];
char temp;
}ADDRESS;
/*@@@@@@@@@@@@@@以下是函数原型@@@@@@@@@@@@@@*/
int enter (ADDRESS t[]); //输入数据
void list (ADDRESS t[],int n); //显示全部记录
int add (ADDRESS t[],int n); //插入数据
int delete (ADDRESS t[],int n); //删除数据
int modify (ADDRESS t[],int n); //修改数据
void display (ADDRESS t[]); //按学号查询数据
void sort (ADDRESS t[],int n); //按姓名排序
void save (ADDRESS t[],int n); //将数据保存文件
int find (ADDRESS t[],int n,char *s); //查找函数
void print(ADDRESS temp); //显示单条记录
int menu_select (); //主菜单函数
/*》》》》》》》》》》》》........主函数开始........《《《《《《《《《《《《*/
main()
{
ADDRESS adr[M]; //定义结构体数组
int length;
system("cls"); //清屏
for(; ;) //无限循环
{
system("color 5e");
switch(menu_select()) //调用主菜单函数,返回值整数作开关语句的条件
{
case 0:length=enter(adr);break; //输入记录
case 1:list(adr,length);break; //显示全部记录
case 2:length=add(adr,length); break; //插入记录
case 3:length=delete(adr,length);break; //删除记录
case 4:length=modify(adr,length);break; //修改记录
case 5:display(adr);break; //按学号显示记录
case 6:sort(adr,length);break; //按姓名排序
case 7:save(adr,length);break; //保存文件
case 8:exit(0); //如返回值为8则程序结束
}
}
}
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
menu_select(){
char s[80];
int c;
printf("press any key to enter the menu ......\n"); //提示按任意键继续
getchar(); //读任意字符
system("cls"); //清屏
printf("\n");
printf("====================欢迎使用学生信息管理系统============================\n");
printf("****************************【MENU】***************************\n\n");
printf(" 【0】enter record\n");
printf(" 【1】list the file\n");
printf(" 【2】add record\n");
printf(" 【3】delete a record\n");
printf(" 【4】modify a record\n");
printf(" 【5】display record on order\n");
printf(" 【6】sort to make new file\n");
printf(" 【7】save the file\n");
printf(" 【8】quit\n");
printf("***********************************************************\n");
do{
printf("\n Enter your choice(0~8):"); //提示输入选项
scanf("%s",s); //输入选择项
c=atoi(s); //将输入的字符串转化为整形数
}
while(c<0||c>8); //选项不在0~8之间,请重新输入
return c; //返回选择项,主程序根据該数调用相应的函数
}
//*****输入记录,形参为结构体数组,函数值返回类型为整形 表示记录长度
int enter(ADDRESS t[]){
int i,j;
system("cls"); //清屏
printf("\n Please input num \n"); //提示输入信息
scanf("%d",&j); //输入记录数
printf("\n Please input record\n"); //提示输入记录
printf("Name Num Class Tel Score \n ");
printf("-------------------------------------------------------\n");
for(i=0;i<j;i++){
scanf("%s%s%s%s%s",t[i].Name,t[i].Num,t[i].Class,t[i].Tel,t[i].Score);
printf("--------------------------------------------------\n");
}
return j; //返回记录条数
}
//*****显示记录,参数为记录数组和记录条数
void list(ADDRESS t[],int n){
int i;
system("cls"); //清屏
printf("**************************ADDRESS*******************************\n");
printf("Name Num Class Tel Score \n ");
printf("----------------------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-30s%-30s%-50s%-10s%-20s",t[i].Name,t[i].Num,t[i].Class,t[i].Tel,t[i].Score);
if((i+1)%15==0) //判断输出是否达到15条记录
{
printf("Please press any key to continue...\n");
getchar(); //按任意键继续
}
printf("*********************The End************************\n");
}
//*****增加数据,参数为记录数组和记录条数
int add(ADDRESS t[],int n){
ADDRESS temp; //新插入记录信息
int i,j;
char s[30]; //确定将该信息增加在哪个位置
printf("Please input record\n"); //提示输入数据
printf("*************************************************************\n");
printf("Name Num Class Tel Score \n");
printf("--------------------------------------------------------------\n");
scanf("%s%s%s%s%s",t[i].Name,t[i].Num,t[i].Class,t[i].Tel,t[i].Score); //输入插入信息
printf("Please input locate name \n");
scanf("%s",s); //输入插入位置的姓名或学号
i=find(t,n,s); //调用find函数,确定要插入的位置
for(j=n-1;j>=i;j--) //从最后一个节点开始向后移动一条
{
strcpy(t[j+1].Name,t[j].Name); //将当前记录的姓名拷贝到后一条
strcpy(t[j+1].Num,t[j].Num); //将当前记录的学号拷贝到后一条
strcpy(t[j+1].Class,t[j].Class); //将当前记录的班级拷贝到后一条
strcpy(t[j+1].Tel,t[j].Tel); //将当前记录的电话号拷贝到后一条
strcpy(t[j+1].Num,t[j].Num); ////将当前记录的分数拷贝到后一条
}
strcpy(t[i].Name,temp.Name); //将新插入记录的姓名拷贝到第i个位置
strcpy(t[i].Num,temp.Num); //将新插入记录的学号拷贝到第i个位置
strcpy(t[i].Class,temp.Class); //将新插入记录的班级拷贝到 第i个位置
strcpy(t[i].Tel,temp.Tel); //将新插入记录的电话拷贝到第i个位置
strcpy(t[i].Score,temp.Score); //将新插入记录的分数拷贝到第i个位置
n++; //记录数加1
return n; //返回记录数
}
//*****删除数据,参数为记录数组和记录条数
int delete(ADDRESS t[],int n){
char s[20]; //要删除的学生姓名
int ch=0;
int i,j;
system("cls");
printf("Please input deleted name\n"); //提示输入信息
scanf("%s",s);
i=find(t,n,s); //调用find函数,确定要删除的位置
if(i>n-1) //如果i>n-1超过了数组的长度
printf("Not find data to delete!\n"); //显示没有要删除的文件
else{
printf("Are you sure delete it (1/0)\n"); //确认是否删除
scanf("%d",&ch);
if(ch==1) //确认删除 整数为1
{
for(j=i+1;j<n;j++) //删除该纪录后,实际后续记录前移
{
strcpy(t[j-1].Name,t[j].Name); //将后一条记录的姓名拷贝到前一条
strcpy(t[j-1].Num,t[j].Num); //将后一条记录的学号拷贝到前一条
strcpy(t[j-1].Class,t[j].Class); //将后一条记录的班级拷贝到前一条
strcpy(t[j-1].Tel,t[j].Tel); //将后一条记录的电话拷贝到前一条
strcpy(t[j-1].Score,t[j].Score); //将后一条记录的电话拷贝到前一条
n--; //记录数减1
}
}
return n; //返回记录数
}
//*****修改数据,参数为记录数组和记录条数
int modify (ADDRESS t[],int n){
char t[];
int j;
int flagfind = 0; //定义标志数
printf("\n请输入学生的学号:\n");
gets(numstr);
ADDRESS = atof(numstr);
for(j=0;j<=n;j++){
if(t[j].Num==Num)
{
printf("\t学生学号:%d10.0f\n",t[i].Num);
printf("\t学生班级:%d\n",t[i].Class);
printf("\t请输入学生班级:%d\n");
gets(numstr);
t[i].Class=atoi(numstr);
printf("\t学生分数:%10.2f\n",t[i].Score);
printf("\t请输入学生分数:%10.2f\n");
gets(numstr);
t[i].Class=atof(numstr);
printf("\t学生电话:%s\n",t[i].Tel);
printf("\t请输入学生电话:%s\n");
gets(numstr);
flagfind=1;
}
else{
flagfind = 0;
}
}
if(flagfind!=0)printf("\n没有此记录!\n");
return 0;
}
//*****按学号显示记录函数
void display(ADDRESS t[])
{
int id,n;
FILE *fp; //指向文件的指针
if((fp=fopen("record.txt","rb"))==NULL) //打开文件
{
printf("Can not open file!\n");
exit(1);
}
printf("Enter order number:\n"); //显示输入信息
scanf("%d",&id); //输入序号数
fscanf(fp,"%s",&n) //从文件中读入记录数
if(id>=0 && id<n) //判断序号数是否在记录范围内
{
fseek(fp,(id-1)*sizeof(ADDRESS),1); //移动文件指针到该该记录位置
printf(t[id]); //调用输出函数显示该记录
printf("\r\n");
}
else
printf("No %d number record!!!\n",id); //如果序号不合理显示信息
fclose(fp); //关闭文件
}
//*****按姓名排序,参数为结构体数组和记录数
void sort(ADDRESS t[],int n)
{
int i,j,k,flag;
char temp; //定义临时变量做交换数据用
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if((strcmp(t[k].Name ,t[j].Name))>0)k=j; //比较大小
if(k!=j)
{
strcpy(temp.Name,t[j].Name);
strcpy(temp.Num,t[j].Num);
strcpy(temp.Class,t[j].Class);
strcpy(temp.Tel,t[j].Tel);
strcpy(temp.Score,t[j].Score);
strcpy(t[j].Name,t[j+1].Name);
strcpy(t[j].Num,t[j+1].Num);
strcpy(t[j].Class,t[j+1].Class);
strcpy(t[j].Tel,t[j+1].Tel);
strcpy(t[j].Score,t[j+1].Score);
strcpy(t[j+1].Name,temp.Name);
strcpy(t[j+1].Num,temp.Num);
strcpy(t[j+1].Class,temp.Class);
strcpy(t[j+1].Tel,temp.Tel);
strcpy[(t[j+1].Score,temp.Score);
}
}
printf("sort success!!\n"); //显示按姓名排序排序成功
}
//***** 保存文件,参数为结构体数组和记录数
void save(ADDRESS t[],int n){
int i;
FILE *fp=fopen("record.txt","w");
if(!fp){
printf("文件打开失败\n");
exit(1);
}
printf("\n Saving file\n"); //提示数据保存信息
fprintf(fp,"%d",n); //将记录数写入文件
fprintf(fp,"\r\n"); //将换行文件写入文件
for(i=0;i<n;i++){
fprintf(fp,"%-30s%-30s%-50s%-10s%-20s",t[i].Name,t[i].Num,t[i].Class,t[i].Tel,t[i].Score); //格式写入记录
fprintf(fp,"\r\n"); //将换行文件写入文件
}
fclose(fp); //关闭文件
printf("******************SAVE SUCCESS********************\n"); //显示文件保存成功
}