一道C语言题目 学生管理系统,求指导啊 谢谢了
这就是那个程序的代码,排序那里总是错误的。。
4-写入二进制文件程序.rar
(1.15 KB)
这个是那个二进制文件生成的代码。
程序代码:
#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"); }