一道C学生管理的题目,求帮助

「已注销」 2011-07-04 09:44:43
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define N 30

FILE *fp;
int pd=0;


struct Student
{
int num;
char name[20];
int bj;
char sex[2];
char bir[20];
double grade;
}stu[N],temp;

typedef struct Student SJ;


/****************************4删除函数****************************/
void namedel(SJ stu[N])
{
int i;
char namedel[20],a;
putchar(10);
printf("请输入您要删除的姓名: ");
scanf("%s",namedel);
for(i=0;i<N;i++)
if(strcmp(namedel,stu[i].name)==0)
{
printf("已找到如下内容:\n");
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
printf("确认删除? Y or N \? 请输入:");
scanf("%c",&a);
if(a=='y' || a== 'Y')
{
memset(&stu[i],0x00,sizeof(SJ));
putchar(10);
printf("已删除!\n");
}
}
}

void numdel(SJ stu[N])
{
int numdel,i;
char a;
printf("请输入您要删除的同学学号: ");
scanf("%d",&numdel);
putchar(10);
printf("查找中!\n\n\n");
for(i=0;i<N;i++)
if(numdel==stu[i].num)
{
printf("\t已找到如下内容:\n");
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
printf("确认删除? Y or N ? 请输入:");
scanf("%c",&a);
if(a=='y' || a== 'Y')
{
memset(&stu[i],0x00,sizeof(SJ));
putchar(10);
printf("已删除!\n");
}
}

}
void del(SJ stu[N])
{
int i,k;
if((fp=fopen("stu.dat","wb+"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
printf("欢迎使用删除功能!\n");
printf("*******************************\n");
printf("\t1、按照姓名删除内容。\n");
printf("\t2、按照学号删除内容。\n");
printf("*******************************\n");
printf("请输入您的选项: ");
scanf("%d",&k);
switch(k)
{
case 1:
namedel(stu);
break;
case 2:
numdel(stu);
break;
}
for(i=0;i<N;i++)
fwrite(&stu[i],sizeof(SJ),1,fp);
fclose(fp);
}

/****************************3插入函数****************************/

void insert(SJ stu[N])
{
int i,j,k=1;
if((fp=fopen("stu.dat","wb+"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
k=i;
for(j=0;j<N-1;j++)
for(i=0;i<N-1-j;i++)
if((stu[i].grade-stu[i+1].num)<1e-6)
{
memcpy(&temp,&stu[i],sizeof(SJ));
memcpy(&stu[i],&stu[i+1],sizeof(SJ));
memcpy(&stu[i+1],&temp,sizeof(SJ));
}
printf("排序已完成,现在插入学生信息了。\n\n");
printf("请输入学号: ");
scanf("%d",&temp.num);
printf("请输入姓名: ");
scanf("%s",temp.name);
printf("请输入班级:(一班请输入1)");
scanf("%d",&temp.bj);
printf("请输入性别(M OR F)");
scanf("%s",temp.sex);
printf("请输入生日(如1992-1-1)");
scanf("%s",temp.bir);
printf("请输入成绩: ");
scanf("%lf",&temp.grade);
for(i=0;i<=k;i++)
{
if(temp.num<stu[i].num)
{
for(j=k;j<i;j--)
memcpy(&stu[j],&stu[j-1],sizeof(SJ));
memcpy(&stu[i],&temp,sizeof(SJ));
}
else
memcpy(&stu[k],&temp,sizeof(SJ));
}
printf("已经成功插入!\n");
for(i=0;i<k;i++)
if(fwrite(&stu[i],sizeof(SJ),1,fp)!=1)
{
printf("对不起,无法写入文件!\n");
exit(0);
}
fclose(fp);
}
/********************排序函数****************/
void sort(SJ stu[N])
{
int i,j;
if((fp=fopen("stu.dat","w+"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
for(j=0;j<N-1;j++)
for(i=0;i<N-1-j;i++)
if((stu[i].grade-stu[i+1].num)<1e-6)
{
memcpy(&temp,&stu[i],sizeof(SJ));
memcpy(&stu[i],&stu[i+1],sizeof(SJ));
memcpy(&stu[i+1],&temp,sizeof(SJ));
}
printf("排序完成!\n");
for(i=0;i<N;i++)
fwrite(&stu[i],sizeof(SJ),1,fp);
fclose(fp);

}
/*************查询函数***********************/
void searchname(SJ stu[N]) //姓名查询
{
int i;
char name1[20];
printf("请输入姓名:");
scanf("%s",name1);
for(i=0;i<20;)
{
fread(&stu[i],sizeof(SJ),1,fp);
if(strcmp(name1,stu[i].name)==0)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
while(!feof(fp))
{
i++;
if(strcmp(name1,stu[i].name)==0)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
}
if(pd==0)
printf("对不起,没有找到您要的信息!\n");

}
}
void searchnum(SJ stu[N]) //学号
{
int i,number;
printf("请输入您要查找的学号: ");
scanf("%d",&number);
fclose(fp);
sort(stu);
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("无法打开文件!");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
for(i=0;i<N;i++)
{
if(stu[i].num==number)
{
pd=1;
printf("找到信息如下:\n");
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
}
}
if(pd==0)
printf("没有找到任何信息!\n");


}
void searchgrade(SJ stu[N]) //成绩查询
{
int i;
double search;
printf("请输入成绩:");
scanf("%lf",&search);
for(i=0;i<20;)
{
fread(&stu[i],sizeof(SJ),1,fp);
if((search-stu[i].grade)>=1e-10)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
if((search-stu[i].grade)>=1e-10)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
}
if(pd==0)
printf("对不起,没有找到您要的信息!\n");

}
}



/**************菜 单*****************/
void menu1(SJ stu[N])
{
int b;
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("无法打开文件!");
exit(0);
}
printf("****************************************\n");
printf("\t1----------按学号查询\n");
printf("\t2----------按姓名查询\n");
printf("\t3----------按成绩查询\n");
printf("****************************************\n");
putchar(10);
printf("\t请输入: ");
scanf("%d",&b);
switch(b)
{
case 1:
searchnum(stu);
break;
case 2:
searchname(stu);
break;
case 3:
searchgrade(stu);
break;
}
fclose(fp);
}
int menu(void)
{
int i;
printf("欢迎使用学生管理系统\n");
printf("****************************************\n");
printf("1--------------查询\n");
printf("2--------------排序\n");
printf("3--------------插入\n");
printf("4--------------删除\n");
printf("5--------------退出\n");
printf("****************************************\n");
putchar(10);
printf("\t请输入:");
scanf("%d",&i);
return i;
}


void main()
{
int a=0,b=0;
char c;
do
{
a=menu();
switch(a)
{
case 1:menu1(stu);break;
case 2:sort(stu);break;
case 3:insert(stu);break;
case 4:del(stu);break;
case 5:break;
}
printf("\n\t还要继续吗?(Y/N)");
do
{
c=getche();
putchar(10);
}while(c!='Y' && c!='y' && c!='N' && c!='n');
}while(c== 'y' || c == 'Y');
putchar(10);
printf("程序结束!\n");
}



能帮我看下为什么排完序之后这程序就死掉了。。谢谢了。
...全文
138 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hackbuteer1 2011-07-05
  • 打赏
  • 举报
回复
http://blog.csdn.net/hackbuteer1/article/details/6568892
我以前写过一个类似的,楼主可以参考一下的
hackbuteer1 2011-07-04
  • 打赏
  • 举报
回复
有几个地方楼主写错了,我已经给你修改过来了。。。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#define N 30

FILE *fp;
int pd=0;

struct Student
{
int num;
char name[20];
int bj;
char sex[2];
char bir[20];
double grade;
}stu[N],temp;

typedef struct Student SJ;

/****************************4删除函数****************************/
void namedel(SJ stu[N])
{
int i;
char namedel[20],a;
putchar(10);
printf("请输入您要删除的姓名: ");
scanf("%s",namedel);
for(i=0;i<N;i++)
{
if(strcmp(namedel,stu[i].name)==0)
{
printf("已找到如下内容:\n");
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
printf("确认删除? Y or N \? 请输入:");
scanf("%c",&a);
if(a=='y' || a== 'Y')
{
memset(&stu[i],0x00,sizeof(SJ));
putchar(10);
printf("已删除!\n");
}
}
}
}

void numdel(SJ stu[N])
{
int numdel,i;
char a;
printf("请输入您要删除的同学学号: ");
scanf("%d",&numdel);
putchar(10);
printf("查找中!\n\n\n");
for(i=0;i<N;i++)
{
if(numdel==stu[i].num)
{
printf("\t已找到如下内容:\n");
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
printf("确认删除? Y or N ? 请输入:");
scanf("%c",&a);
if(a=='y' || a== 'Y')
{
memset(&stu[i],0x00,sizeof(SJ));
putchar(10);
printf("已删除!\n");
}
}
}

}
void del(SJ stu[N])
{
int i,k;
if((fp=fopen("stu.dat","wb+"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
printf("欢迎使用删除功能!\n");
printf("*******************************\n");
printf("\t1、按照姓名删除内容。\n");
printf("\t2、按照学号删除内容。\n");
printf("*******************************\n");
printf("请输入您的选项: ");
scanf("%d",&k);
switch(k)
{
case 1:
namedel(stu);
break;
case 2:
numdel(stu);
break;
}
for(i=0;i<N;i++)
fwrite(&stu[i],sizeof(SJ),1,fp);
fclose(fp);
}

/****************************3插入函数****************************/

void insert(SJ stu[N])
{
int i,j,k=1;
if((fp=fopen("stu.dat","wb+"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
k=i;
for(j=0;j<N-1;j++)
{
for(i=0;i<N-1-j;i++)
{
if((stu[i].grade-stu[i+1].grade)<1e-6) //这里修改了
{
memcpy(&temp,&stu[i],sizeof(SJ));
memcpy(&stu[i],&stu[i+1],sizeof(SJ));
memcpy(&stu[i+1],&temp,sizeof(SJ));
}
}
}
printf("排序已完成,现在插入学生信息了。\n\n");
printf("请输入学号: ");
scanf("%d",&temp.num);
printf("请输入姓名: ");
scanf("%s",temp.name);
printf("请输入班级:(一班请输入1)");
scanf("%d",&temp.bj);
printf("请输入性别(M OR F)");
scanf("%s",temp.sex);
printf("请输入生日(如1992-1-1)");
scanf("%s",temp.bir);
printf("请输入成绩: ");
scanf("%lf",&temp.grade);
for(i=0;i<=k;i++)
{
if(temp.num<stu[i].num)
{
for(j=k;j>i;j--) //这里修改了
memcpy(&stu[j],&stu[j-1],sizeof(SJ));
memcpy(&stu[i],&temp,sizeof(SJ));
}
else
memcpy(&stu[k],&temp,sizeof(SJ));
}
printf("已经成功插入!\n");
for(i=0;i<k;i++)
{
if(fwrite(&stu[i],sizeof(SJ),1,fp)!=1)
{
printf("对不起,无法写入文件!\n");
exit(0);
}
}
fclose(fp);
}
/********************排序函数****************/
void sort(SJ stu[N])
{
int i,j;
if((fp=fopen("stu.dat","w+"))==NULL)
{
printf("无法打开文件!\n");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
for(j=0;j<N-1;j++)
{
for(i=0;i<N-1-j;i++)
{
if((stu[i].grade-stu[i+1].grade)<1e-6)
{
memcpy(&temp,&stu[i],sizeof(SJ));
memcpy(&stu[i],&stu[i+1],sizeof(SJ));
memcpy(&stu[i+1],&temp,sizeof(SJ));
}
}
}
printf("排序完成!\n");
for(i=0;i<N;i++)
fwrite(&stu[i],sizeof(SJ),1,fp);
fclose(fp);

}
/*************查询函数***********************/
void searchname(SJ stu[N]) //姓名查询
{
int i;
char name1[20];
printf("请输入姓名:");
scanf("%s",name1);
for(i=0;i<20;)
{
fread(&stu[i],sizeof(SJ),1,fp);
if(strcmp(name1,stu[i].name)==0)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
while(!feof(fp))
{
i++;
if(strcmp(name1,stu[i].name)==0)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
}
if(pd==0)
printf("对不起,没有找到您要的信息!\n");

}
}
void searchnum(SJ stu[N]) //学号
{
int i,number;
printf("请输入您要查找的学号: ");
scanf("%d",&number);
fclose(fp);
sort(stu);
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("无法打开文件!");
exit(0);
}
i=0;
fread(&stu[i],sizeof(SJ),1,fp);
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
}
for(i=0;i<N;i++)
{
if(stu[i].num==number)
{
pd=1;
printf("找到信息如下:\n");
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
}
}
if(pd==0)
printf("没有找到任何信息!\n");


}
void searchgrade(SJ stu[N]) //成绩查询
{
int i;
double search;
printf("请输入成绩:");
scanf("%lf",&search);
for(i=0;i<20;)
{
fread(&stu[i],sizeof(SJ),1,fp);
if((search-stu[i].grade)>=1e-10)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
while(!feof(fp))
{
i++;
fread(&stu[i],sizeof(SJ),1,fp);
if((search-stu[i].grade)>=1e-10)
{
pd=1;
printf("学号:%d 姓名:%s 班级:%d 性别:%s 生日:%s 成绩:%2.1lf \n\n",stu[i].num,stu[i].name,stu[i].bj,stu[i].sex,stu[i].bir,stu[i].grade);
putchar(10);
}
}
if(pd==0)
printf("对不起,没有找到您要的信息!\n");
}
}

/**************菜 单*****************/
void menu1(SJ stu[N])
{
int b;
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("无法打开文件!");
exit(0);
}
printf("****************************************\n");
printf("\t1----------按学号查询\n");
printf("\t2----------按姓名查询\n");
printf("\t3----------按成绩查询\n");
printf("****************************************\n");
putchar(10);
printf("\t请输入: ");
scanf("%d",&b);
switch(b)
{
case 1:
searchnum(stu);
break;
case 2:
searchname(stu);
break;
case 3:
searchgrade(stu);
break;
}
fclose(fp);
}
int menu(void)
{
int i;
printf("欢迎使用学生管理系统\n");
printf("****************************************\n");
printf("1--------------查询\n");
printf("2--------------排序\n");
printf("3--------------插入\n");
printf("4--------------删除\n");
printf("5--------------退出\n");
printf("****************************************\n");
putchar(10);
printf("\t请输入:");
scanf("%d",&i);
return i;
}


void main()
{
int a=0,b=0;
char c;
do
{
a=menu();
switch(a)
{
case 1:menu1(stu);break;
case 2:sort(stu);break;
case 3:insert(stu);break;
case 4:del(stu);break;
case 5:break;
}
printf("\n\t还要继续吗?(Y/N)");
do
{
c=getche();
putchar(10);
}while(c!='Y' && c!='y' && c!='N' && c!='n');
}while(c== 'y' || c == 'Y');
putchar(10);
printf("程序结束!\n");
}
「已注销」 2011-07-04
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<stdlib.h>
#define N 20
struct Student
{
int num;
char name[20];
int bj;
char sex[2];
char bir[20];
double grade;
};

typedef struct Student SJ;

void main()
{
int i;
FILE *fp;
SJ stu[20]={
20102801,"wangyali",1,"f","1992-1-5",34,\

20102802,"xietingfeng",1,"m","1992-1-6",45,\
20102803,"chenguanxi",1,"m","1992-3-7",79,\
20102804,"huafeng",1,"m","1992-11-8",99,\
20102805,"zhangqi",1,"f","1992-3-6",95.5,\
20102806,"miaoruolin",2,"m","1992-3-10",62.6,\

20102807,"dingyi",2,"f","1992-1-11",44,\
20102809,"zhangfeng",2,"m","1992-7-12",55,\
20102811,"wangxinya",2,"f","1992-3-13",46,\
20102815,"zhaoxiaofang",2,"f","1992-5-14",88.7,\
20102817,"pengzhigang",2,"m","1992-11-15",64,\
20102818,"lihong",3,"f","1992-1-16",93.2,\
20102821,"wanggongrui",3,"m","1992-4-17",91.4,\

20102822,"wangpeng",3,"m","1990-1-18",69.3,\
20102824,"zhangbozhi",3,"f","1992-1-19",95.8,\

20102826,"zhouruifa",3,"m","1992-1-20",93.9,\
20102829,"huxinger",3,"f","1992-2-21",64.6,\
20102831,"zhengjie",3,"f","1992-1-22",93.9,\
20102834,"yanzi",4, "f","1992-8-23",72.3,\
20102836,"lina",5,"f","1992-6-24",69.4};

if((fp=fopen("stu.dat","wb+"))==NULL)
{
printf("无法写入stu.dat文件!\n");
exit(0);
}
for(i=0;i<N;i++)
{
if(fwrite(&stu[i],sizeof(SJ),1,fp)!=1)
printf("第%d名同学的信息无法写入文件\n",i+1);
}
fclose(fp);
putchar(10);
}





这是生成二进制文件的代码,谢谢了。各位

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧