我想编一个学生数据表,能够进行文件操作(追加记录之用),编译时,不稳定。请高人指点。
要求:
1、记录学生的学号、姓名、性别、成绩。
2、能够追加记录
3、可以查看
4、按成绩排序。
思路以下:
主菜单(main()):录入数据请按1(writein())(数据文件G:\DATA
查看数据请按2(fine())
排序请按3(taxis())
退出请按其它键!
另外建立一个文件G:\NOTE用于记录学生的记录数(学生人数)用了两个函数:录入完毕时写记录数和记录开始时读记录数。
问题:1、如何初始化读记录数函数N。初始用feof函数判断是否有记录数,但返回值始终是0,后自己测验后为-1,故不用函数而直接用-1。
2、设计自动生成序列数作为学号,付值不到!
3、如何将性别记为枚举数和共同体?
问题之处用蓝色色标出,请高人指点指点小弟。
#include"stdio.h"
#include"conio.h"
struct stu
{char num[2];
char name[10];
char sex[2];(如何将性别记为枚举类和共同体?)
int score;
}ina[10];
FILE *np,*fp;
main()
{char a;/*主界面*/
void taxis();
void writein();
void find();
void noten(int a);
int readn();
clrscr();
printf("录入数据请按1\n\n查看数据请按2\n\n排序请按3\n\n退出请按其它键!\n");
a=getch();
putchar(a);
switch(a)
{case '3': taxis();break;
case '1': writein();break;
case '2': find();break;
default: exit();}
}
void noten(int a)/*写记录个数存放在n中*/
{int n;
n=a;
np=fopen("g:\NOTE","w");
/*if(np==NULL)
printf("无法创建军记录数N。");*/
fputc(n,np);
printf("记录时n=%d",n);
getch();
fclose(np);
}
int readn()/*读记录个数存放在n中*/
{int n;
np=fopen("g:\\NOTE","r");
n=(int)(fgetc(np));
if(n==-1)n=0;
printf("读取时n=%d",n);/*调试用*/
getch();
fclose(np);
return n;
}
void writein()/*录入数据*/
{int i,n,m,p,q;
char a;
n=readn();
a=getch();
if(a==9)exit(0);
clrscr();
printf("\n开始录入学生资料。完成录入请按“Tab”键。\n");
m=n;
do
{printf("学号:%d",n+1);
ain[n]=n+1;(付值不了,编译错误!!)
printf("\t姓名:");
scanf("%s",&ina[n].name);
printf("\t性别:");
scanf("%s",&ina[n].sex);
printf("\t成绩:");
scanf("%d",&ina[n].score);
n++;
a=getch();
}while(a!=9);
fp=fopen("g:\\DATA","at+");
for(i=m+1;i<n;i++,m++)
fwrite(&ina[i],sizeof(struct stu),1,fp);
fclose(fp);
noten(n);
main();
}
void find()/*浏览数据*/
{int n,i;
clrscr();
fp=fopen("g:\\DATA","r");
n=readn();
fread(ina,sizeof(struct stu),n,fp);
for(i=0;i<n;i++)
printf("\n学号:%s\t姓名:%s\t性别:%s\t成绩:%d\n",ina[i].num,ina[i].name,ina[i].sex,ina[i].score);
fclose(fp);
printf("\n按任意键返回上一层.");
getch();
main();
}
void taxis()
{int i,j,n,a[10],b[10],m;
clrscr();
printf("按成绩排序得。\n");
np=fopen("g:\\NOTE","r");
if(np==NULL)printf("无法读取记录数N。");
n=fgetc(np);
fclose(np);
fp=fopen("g:\data","r");
fread(ina,sizeof(struct stu),n,fp);
fclose(fp);
for(i=0;i<n;i++)
b[i]=ina[i].score;
for(i=0;i<n;i++)
a[i]=i;
for(i=0;i<n-1;i++)
{for(j=i+1;j<n;j++)
{if(b[i]<b[j])
{m=b[i];
b[i]=b[j];
b[j]=m;
m=a[i];
a[i]=a[j];
a[j]=m;}}
}
for(j=0;j<n;j++)
{i=a[j];
printf("学号:%s\t姓名:%s\t性别:%s\t成绩:%d\n",ina[i].num,ina[i].name,ina[i].sex,ina[i].score);
}
printf("按任意键返回主菜单。");
getch();
main();
}
----------------解决方案--------------------------------------------------------