作一个课程设计,但几段代码不报错,却死活运行不出预期的结果,本人也找不出错,求大神指点迷津
作一个课程设计,但几段代码不报错,却死活运行不出预期的结果,本人也找不出错,求大神指点迷津某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。
1. 从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。(程序f1当输入文件无东西时,输出为1,且每运行一次,count都会莫名其妙的加1,求解释啊0
2. 增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。(这段程序为什么写入文件后会成为乱码)
4. 计算每个学生的总分和平均分;(这段代码为什么会运行奔溃)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define L 32
#define N 6
#define M 30
#define LEN sizeof(struct student)
struct student
{
char name [L];
int num; ///学号
float ach[N]; ///成绩数组
struct student *next;
};
struct student stu[M];
int count=0,n,m,j,i,k;
char filename[L]={0};
int f1(int m,int n);
int f2(int m,int n);
int f4(int m,int n);
int main()
{
printf("please input number of student\n");
scanf("%d",&m);
printf("please input number of subject\n");
scanf("%d",&n);
printf("|| Welcome to the student achievement management system ||\n\n");
printf("MENU:\n1. Read from a file\n2. Append record manually\n4. Calculate total and average score of every student\n0 . Exit\n");
for(j;;j++)
{
printf("\n\nplease select an item from the menu\n");
scanf("%d",&i);
if(i==0)
break;
else
switch(i)
{
case 1: f1(m,n); break;
case 2: f2(m,n); break;
case 4: f4(m,n); break;
default: break;
}
}
printf("\n\nThank you for using the system\n\n"); ///退出界面
return 0;
}
int f1(int m,int n)
{
struct student card;
FILE *inputfile;
char filename[L]={0}; ///声明变量 存储文件名
printf("Please input filename to Open:\n"); ///提示输入文件名
getchar();
gets(filename); ///接收输入文件名
if((inputfile =fopen(filename,"r"))!=NULL) ///打开 并判断
{
printf("file open OK!\n\n"); ///成功则提示成功 并且关闭文件指针
while(! feof(inputfile))
{
fread(&card,LEN,1,inputfile);
count ++;
}
printf("The students totaled : %d\n",count-1);
fclose(inputfile);
return count;
}
else
printf("file open failed!\n"); ///打开失败则提示打开失败
return 0;
};
///f1函数的count计算结果与预期不符,未知原因
int f2(int m,int n)
{
struct student card;
FILE *file;
printf("请输入打开文件名:\n"); ///提示输入文件名
getchar();
gets(filename); ///接收输入文件名
if((file =fopen(filename,"a+"))!=NULL) ///打开 并判断
{
while(! feof(file))
{
fread(&card,LEN,1,file);
count ++;
}
for(count;count<=m;count++)
{
printf("请输入该学生的学号:\n");
scanf("%d",&stu[count].num);
r1: for(j=0;j<count;j++)
{
if(stu[j].num==stu[count].num)
{
printf("输入错误,请检查\n");
count --;
goto r1;
}
else
{
printf("请输入该学生的姓名:\n");
getchar();
gets(stu[count].name);
for(j=1;j<=n;j++)
{
printf("请输入该学生第%d门功课的成绩:",j);
scanf("%d",&stu[count].ach[j-1]);
}
}
}
fwrite(&card,LEN,1,file);
}
fclose (file);
}
else
printf("file open failed!\n"); ///打开失败则提示打开失败
};
int f4(int m,int n)
{
struct student card;
FILE *fp1,*fp2;
float zf[M]={0};
char nam[M][L]={0};
char inputfile[L]={0};
printf("请输入输入文件的名字:\n"); ///提示输入文件名
getchar();
gets(inputfile);
fp1=fopen(inputfile,"rb");
fp2=fopen("xuesheng.txt","w");
if(fp1==NULL)
{
printf("\n文件%s打开失败\n",filename);
exit(1);
}
for(i=0;(fread(&card,LEN,1,fp1))!=(int)NULL;i++)
{
nam[i][L]=card.name[L];
for(j=0;j<n;j++)
{
zf[i]=zf[i]+card.ach[j];
}
printf("%s的课程的总成绩为%.3f 平均分为%.3f\n",nam[i][L],zf[i],zf[i]/n);
fprintf(fp2,"%s %.3f %.3f\n",nam[i][L],zf[i],zf[i]/n);
}
fclose (fp1);
fclose (fp2);
return 0;
}