我是个C的初学者也是爱好者,老师布置的问题有些问题有点不懂,希望能得到帮助,感激```
此程序在WIN-TC下中文DOS下运行!
希望能帮忙写详细些,代码加在哪等等! Thanks
问题一:为什么我在输入F2完成录入功能的时候,在输入成绩的时候输入中文它提示错误后,还保存上了,怎样改能不让他保存上呢?
问题二:如果我想在加入个F7。F8 需要怎样改呢?我想F7实现注销的功能!
#include"stdio.h"
#include"conio.h"
#include"dos.h"
#define NULL 0
#define ESC 0x001b
#define F1 0x3b00
#define F2 0x3c00
#define F3 0x3d00
#define F4 0x3e00
#define F5 0x3f00
#define F6 0x4000
struct stuType
{
char NO[11]; /*学好长度为10*/
char XM[10]; /*姓名长度为10,可以存储5个汉字*/
float CJ[4]; /*浮点型数组,包括4门成绩*/
};
int JY_NO2(char *stu_num)
{ int NO;
int stu_CJ;
char *p=stu_num;
if(strcmp(stu_num,"#")==0)return 1;
if(strlen(stu_num)!=10)
{
puts("\t\t\t学号长度不对!\n");
return 0;
}
while(*p!='\0')
{
NO=(int)*p;
if(NO<48||NO>57)
{
puts("\t\t\t非法学号!请重新输入!\n");
return 0;
}
else p++;
}
if(!(stu_CJ<48||stu_CJ>57))
{
puts("\t\t\t错误,请重新输入!\n");
return 0;
}
if(getchar()!='\n')
{
printf("\t\t\t学号长度大于10个!请重新输入");
do{}while(getchar()!='\n');
return 0;
}
return 1;
}
int JY_XM(char*stu_XM)
{ int PD;
char*p;
p=stu_XM;
while(*p!='\0')
{
PD=(int)*p;
if(PD>0)
{ puts("\t\t\t姓名只能用中文,请重新输入!\n");
return 0;
}
else p++;
}
if(getchar()!='\n')
{ printf("\t\t\t姓名长度大于5个!请重新输入!\n");
do{}while(getchar()!='\n');
return 0;
}
return 1;
}
void HelpMessage()
{
clrscr();
printf("\n\n\n\n\n\n\n\n");
printf("\t此程序是完全利用C语言开发的,该系统具有存储学生数据,按学号、\n 姓名查询,列出学生成绩和统计功能。\n");
printf("\t使用方法:系统输入数据后,将在当前目录中建立一个名为stu.dat文\n 件,用语保存输入的数据。学号输入只能用数字输入,并且学号只能是\n 10位。姓名输入符合中国人的姓名,只能用中文,\n 且最长为5个汉字。");
printf("\n\t此程序在Trubo C 2.0下通过,希望初学者能使用!");
getch();
}
int JY_NO(char*stu_num,FILE*fp)
{
struct stuType stud;
int NO;
char*p=stu_num;
if(strcmp(stu_num,"#")==0)return 1;
while(*p!='\0')
{
NO=(int)*p;
if(NO<48||NO>57)
{
puts("\t\t\t非法学号!请重新输入!\n");
return 0;
}
else p++ ;
}
if(strlen(stu_num)!=10)
{
puts("\t\t\t学号长度不对!\n");
return 0;
}
if(getchar()!='\n')
{
printf("\t\t\t学号长度大于10个!请重新输入!\n");
do{}while(getchar()!='\n');
return 0;
}
else
{
rewind(fp);
while(!feof(fp))
{
fread(&stud,sizeof(struct stuType),1,fp);
if(strcmp(stu_num,stud.NO)==0)
{
printf("\t\t\t学号重复,请重新输入!\n");
printf("\t\t\t语文成绩:%.1f\n",stud.CJ[0]);
printf("\t\t\t数学成绩:%.1f\n",stud.CJ[1]);
printf("\t\t\t英语成绩:%.1f\n",stud.CJ[2]);
printf("\t\t\t总评成绩:%.1f\n",stud.CJ[3]);
return 0;
}
}
}
return 1;
}
int JY_CJ(float stu_CJ)
{
if(stu_CJ<0||stu_CJ>100)
{
printf("\t\t\t输入错误,成绩只能在0~100之间!\n");
return 0;
}
return 1;
}
void CreatFile()
{
FILE*fp;
struct stuType stu,stu0={"","",} ;
fp=fopen("stu.dat","ab+");
if(fp==NULL)
{
printf("\t\t\t文件打开失败!\n\t\t\t按任意键返回...");
getch();
return;
}
else
{
while(1)
{
stu=stu0;
do
{ printf("\n\t\t\t请输入学号:");
scanf("%10s",stu.NO);
}
while(!JY_NO(stu.NO,fp));
if(strcmp(stu.NO,"#")==0)break;
do
{ printf("\n\t\t\t请输入姓名:");
scanf("%10s",stu.XM);
} while(!JY_XM(stu.XM));
do
{ printf("\n\t\t\t请输入语文成绩:");
scanf("%f",&stu.CJ[0]);
} while(!JY_CJ(stu.CJ[0]));
do
{ printf("\n\t\t\t请输入数学成绩:");
scanf("%f",&stu.CJ[1]);
} while(!JY_CJ(stu.CJ[1]));
do
{ printf("\n\t\t\t请输入英语成绩:");
scanf("%f",&stu.CJ[2]);
} while(!JY_CJ(stu.CJ[2]));
do
{ printf("\n\t\t\t请输入总评成绩:");
scanf("%f",&stu.CJ[3]);
} while(!JY_CJ(stu.CJ[3]));
fwrite(&stu,sizeof(struct stuType),1,fp);
}
}
fclose(fp);
}
void Search_XueHao()
{
{
FILE*fp;
int flag;
struct stuType stu,stud;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{
printf("\t\t\t文件打开失败!\n\t\t\t按任意键返回…");
getch();
return;
}
else
{
do
{
puts("\n\t\t\t输入#结束查询");
do
{
printf("\t\t\t请输入要查询的学号:");
scanf("%10s",stu.NO);
}
while(!JY_NO2(stu.NO));
if(strcmp(stu.NO,"#")==0)break;
flag=0;
rewind(fp);
while(fread(&stud,sizeof(struct stuType),1,fp))
{
if(strcmp(stu.NO,stud.NO)==0)
{
puts("\t\t\t该学生成绩如下:");
printf("\t\t\t学号:%s\n",stud.NO);
printf("\t\t\t姓名:%s\n",stud.XM);
printf("\t\t\t语文:%.1f\n",stud.CJ[0]);
printf("\t\t\t数学:%.1f\n",stud.CJ[1]);
printf("\t\t\t英语:%.1f\n",stud.CJ[2]);
printf("\t\t\t总评:%.1f\n",stud.CJ[3]);
flag=1;
}
}
if(flag==0)puts("\t\t\t无此学号!");
}
while(strcmp(stu.NO,"#")!=0);
}
fclose(fp);
}
}
void Search_XingMing()
{
{
FILE *fp;
int flag=0;
struct stuType stu,stud;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{
printf("\t\t\t文件打开失败!\n\t\t\t按任意键返…");
getch();
return;
}
else
{
do{
do{
printf("\t\t\t请输入要查询的学生姓名:");
scanf("%10s",stu.XM);
}
while(!JY_XM(stu.XM));
rewind(fp);
while(fread(&stud,sizeof(struct stuType),1,fp))
{
if(strcmp(stu.XM,stud.XM)==0)
{
puts("\t\t\t该学生成绩如下:");
printf("\t\t\t学号:%s\n",stud.NO);
printf("\t\t\t姓名:%s\n",stud.XM);
printf("\t\t\t语文:%.1f\n",stud.CJ[0]);
printf("\t\t\t数学:%.1f\n",stud.CJ[1]);
printf("\t\t\t英语:%.1f\n",stud.CJ[2]);
printf("\t\t\t总评:%.1f\n",stud.CJ[3]);
flag=1;
}
}
if(flag==0)puts("\t\t\t无此学生!");
puts("\t\t\t是否继续(y--继续,其他返回)?");
}
while(getch()=='y');
}
fclose(fp);
}
getch();
}
void ListFile(void)
{ FILE *fp;
int REC=0; /*记录学生人数*/
struct stuType stu;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打开失败!\n\t\t\t按任意键返回...");
getch();
//return 1;
}
else{ printf("\t\t\t学生成绩如下:\n");
printf("\t\t\t学号\t\t姓名\t语文\t数学\t英语\t总评\n");
rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ /*每读取一个长度的数据就输出*/
printf("\t\t\t%s",stu.NO);
printf("\t%s",stu.XM);
printf("\t%.1f",stu.CJ[0]);
printf("\t%.1f",stu.CJ[1]);
printf("\t%.1f",stu.CJ[2]);
printf("\t%.1f",stu.CJ[3]);
printf("\n");
REC++;
if(REC%20==0) /*每输出20个学生成绩,停一下*/
{ printf("\t\t\t请按任意键继续...\n");
getch();
}
}
}
fclose(fp); /*关闭文件*/
printf("\t\t\t请按任意键继续...");
getch();
}
void Statistics()
{ FILE *fp;
int REC=0,pass[4]={0},good[4]={0}; /*REC--记录个数,即人数,pass--及格人数,good--优秀人数*/
float highest[4]={0},score[4]={0}; /*highest--最高分,score--总分*/
struct stuType stu;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打开失败!\n\t\t\t按任意键返回...");
getch();
return;
}
else { rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ REC++;
score[0]=score[0]+stu.CJ[0]; /*语文*/
if(stu.CJ[0]>=60)pass[0]++;
if(stu.CJ[0]>=80)good[0]++;
if(highest[0]<stu.CJ[0])highest[0]=stu.CJ[0];
score[1]=score[1]+stu.CJ[1]; /*数学*/
if(stu.CJ[1]>=60)pass[1]++;
if(stu.CJ[1]>=80)good[1]++;
if(highest[1]<stu.CJ[1])highest[1]=stu.CJ[1];
score[2]=score[2]+stu.CJ[2]; /*英语*/
if(stu.CJ[2]>=60)pass[2]++;
if(stu.CJ[2]>=80)good[2]++;
if(highest[2]<stu.CJ[2])highest[2]=stu.CJ[2];
score[3]=score[3]+stu.CJ[3]; /*总评*/
if(stu.CJ[3]>=60)pass[3]++;
if(stu.CJ[3]>=80)good[3]++;
if(highest[3]<stu.CJ[3])highest[3]=stu.CJ[3];
}
if(REC==0) /*可以防止记录为0是REC作除数而造成的错误*/
{ printf("\t\t\t未输入学生记录!按任意键返回...");
getch();
return;
}
else{
printf("\t\t\t\t 语文\t 数学\t 英语\t 总评\n"); /*输出统计信息*/
printf("\t\t\t平均分: %.1f\t %.1f\t %.1f\t %.1f\n",score[0]/REC,score[1]/REC,score[2]/REC,score[3]/REC);
printf("\t\t\t最高分: %.1f\t %.1f\t %.1f\t %.1f\n",highest[0],highest[1],highest[2],highest[3]);
printf("\t\t\t优秀人数:%d\t %d\t %d\t %d\n",good[0],good[1],good[2],good[3]);
printf("\t\t\t及格人数:%d\t %d\t %d\t %d\n",pass[0],pass[1],pass[2],pass[3]);
}
}
fclose(fp);
printf("\n\t\t\t请按任意键继续...");
getch();
}
int Getkey(void)
{
int key;
key =bioskey(0);
if(key<<8)
{
key=key&0x00ff;
}
return key;
}
main()
{
int key;
struct date d;
getdate(&d);
clrscr();
printf("\n\n\n\n\n\n\n\n");
printf("\t\t\t*****************************\n");
printf("\t\t\t\t学生管理系统1.0\t\n");
printf("\t\t\t制作群:软件技术系统测试专业\n");
printf("\t\t\t制作人:...\n");
printf("\t\t\t制作时间:2006年11月21日\n");
printf("\t\t\t*****************************\n");
printf("\t\t\t按任意键继续...");
getch();
clrscr();
while(1)
{
printf("\n\n\n\n\n\n\n");
printf("\t\t\t*****************************\n");
printf("\t\t\t**\tF1--帮助**\t\n");
printf("\t\t\t**\tF2--输入数据并存入文件**\t\n");
printf("\t\t\t**\tF3--根据学号查询成绩**\t\n");
printf("\t\t\t**\tF4--根据姓名查询成绩**\t\n");
printf("\t\t\t**\tF5--输入文件内容**\t\n");
printf("\t\t\t**\tF6--统计及格和优秀人数**\t\n");
printf("\t\t\t**\tESC--退出系统**\t\n");
printf("\t\t\t*****************************\n");
printf("\n\t\t\t请输入选项\t\t%d年%d月%d日\n",d.da_year,d.da_mon,d.da_day);
printf("\n");
key=Getkey();
switch(key)
{
case F1:HelpMessage();break;
case F2:CreatFile();break;
case F3:Search_XueHao();break;
case F4:Search_XingMing();break;
case F5:ListFile();break;
case F6:Statistics();break;
case ESC:exit(1);break;
}
clrscr();
}
}
[此贴子已经被作者于2006-11-29 9:54:27编辑过]
----------------解决方案--------------------------------------------------------
先说清楚发到我邮箱!!!!!!!!!!!
你想做什么!我都没看出来!!!!!!!
我想我可以解决!!!!!!!!!!!
5857120581223826@163.com
----------------解决方案--------------------------------------------------------