首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求帮忙调试一个程序,该如何处理

2012-03-20 
求帮忙调试一个程序这是我写的一个简单的学生成绩管理系统,代码都在这了,大家帮忙看看错在哪里?为什么一调

求帮忙调试一个程序
这是我写的一个简单的学生成绩管理系统,代码都在这了,
大家帮忙看看错在哪里?为什么一调用子函数就出错哪?

[code=C/C++][/code]
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

#define N 50

struct student{
char *name;
char no[15];
int chinese;
int mathematic;
int english;
};
struct student Stu[N];

void total();
void average();
void sort();
void list();
void searchByNo();
void searchByName();

char *fname;//文件名
int main()
{
FILE *fp;
char c;
int i,n;//n为要输入学生的个数
char buff[120];//缓冲区
printf("请输入学生记录文件名:");
gets(buff);
fname = (char *)malloc(strlen(buff) + 1);
strcpy(fname,buff);
if((fp=fopen(fname,"r")) == NULL)//文件名若不存在
{
printf("此文件名不存在,是否创建?(y/n)\n");//提示是否创建
c=getchar();
if(c == 'y'||c == 'Y')//若输入y或Y则创建文件
{
if((fp=fopen(fname,"w+")) == NULL)
{
printf("创建失败!");
exit(1);
}
else
{
printf("请输入要记录的学生的个数:\n");
scanf("%d",&n);

for(i=0;i<n;i++)
{
fflush(stdin);
printf("输入学生姓名:\n");
gets(buff);
Stu[i].name = (char*)malloc(strlen(buff) + 1);
strcpy(Stu[i].name,buff);
printf("输入学生学号:\n");
scanf("%s",Stu[i].no);
printf("输入学生%s的语文成绩:\n",Stu[i].name);
scanf("%d",&Stu[i].chinese);
printf("输入学生%s的数学成绩:\n",Stu[i].name);
scanf("%d",&Stu[i].mathematic);
printf("输入学生%s的英语成绩:\n",Stu[i].name);
scanf("%d",&Stu[i].english);
fprintf(fp,"%s %s %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);
}

}
}
else if(c == 'n'||c=='N')//若输入n或N则推出
exit(2);
fclose(fp);
}

do
{
printf("\n输入相应的字母\n");
printf("t---------------------求各门课的总分\n");
printf("m---------------------求个门课的平均分\n");
printf("n---------------------按姓名寻找记录\n");
printf("c---------------------按学号寻找记录\n");
printf("l---------------------浏览全部学生成绩\n");
printf("s---------------------按总分由高到低显示学生信息\n");
printf("q---------------------推出\n");
c=getchar();
switch(c)
{
case't':
{
system("cls");
total();
}
break;
case 'm':
{
system("cls");
average();
}
break;
case 'n':
{
system("cls");
searchByName();
}
break;
case 'c':
{
system("cls");
searchByNo();
}
break;
case 'l':
{
system("cls");
list();
}
break;
case 's':
{
system("cls");
sort();
}
break;
default:
break;

}
}while(c != 'q');
printf("欢迎使用,再见!\n");
return 0;

}
/*total()函数求各门课总分*/
void total()
{
FILE *fp;
int i,totalmark1 = 0,totalmark2 = 0,totalmark3 = 0;
if((fp = fopen(fname,"r")) == NULL)
exit(0);
while(!feof(fp))
{
for(i = 0;;i++)
{
fscanf(fp,"%s %s %d %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);
totalmark1 += Stu[i].chinese;
totalmark2 += Stu[i].mathematic;
totalmark3 += Stu[i].english;
}
}
printf("语文的总分为 :%d\n",totalmark1);
printf("数学的总分为 :%d\n",totalmark2);
printf("英语的总分为 :%d\n",totalmark3);


fclose(fp);
}
/*average()函数求各门课平均分*/
void average()
{
FILE *fp;
int i = 0;
float average1 = 0,average2 = 0,average3 = 0;
if((fp = fopen(fname,"r")) == NULL)
exit(0);
while(!feof(fp))
{
for(i = 0;;i++)
{
fscanf(fp,"%s %s %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);
average1 += Stu[i].chinese;
average2 += Stu[i].mathematic;
average3 += Stu[i].english;
}
}
printf("语文的平均分为 :%f\n",average1/(i+1));
printf("数学的平均分为 :%f\n",average2/(i+1));
printf("英语的平均分为 :%f\n",average3/(i+1));
fclose(fp);
}
/*searchByName()函数完成按姓名寻找记录*/
void searchByName()
{
FILE *fp;
int i;
int flag = 0;//用flag做标记
char str[20];
if((fp = fopen(fname,"r")) == NULL)
exit(0);
printf("请输入要查找的名字:\n");
gets(str);
while(!feof(fp))
{
for(i = 0;;i++)
{
fscanf(fp,"%s %s %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);
if((strcmp(str,Stu[i].name)) == 0)
{
flag = 1;
printf("姓名为:%s\n",Stu[i].name);
printf("学号为:%s\n",Stu[i].no);
printf("分数为:\n");
printf(" 语文成绩为: %d\n",Stu[i].chinese);
printf(" 数学成绩为: %d\n",Stu[i].mathematic);
printf(" 英语成绩为: %d\n",Stu[i].english);
printf("总分为: %d\n",Stu[i].chinese+Stu[i].english+Stu[i].mathematic);
}
}
}
if(!flag)
printf(" %s 不存在记录中!\n");
fclose(fp);
}
/*searchByNo()函数完成按学号寻找记录*/
void searchByNo()
{
FILE *fp;
int i = 0;
int flag = 0;
char str[20];
if((fp = fopen(fname,"r")) == NULL)
exit(0);
printf("输入要查找的学号:\n");
gets(str);
while(!feof(fp))
{
for(i = 0;;i++)
{
fscanf(fp,"%s %s %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);
if((strcmp(str,Stu[i].no)) == 0)
{
flag = 1;
printf("姓名为:%s\n",Stu[i].name);
printf("学号为:%s\n",Stu[i].no);
printf("分数为:\n");
printf(" 语文成绩为: %d\n",Stu[i].chinese);
printf(" 数学成绩为: %d\n",Stu[i].mathematic);
printf(" 英语成绩为: %d\n",Stu[i].english);
printf("总分为: %d\n",Stu[i].chinese+Stu[i].english+Stu[i].mathematic);
}
}
}
if(!flag)
printf(" %s 不存在记录中!\n");
fclose(fp);
}
/*list()函数用来浏览全部学生成绩*/
void list()
{
FILE *fp;
int i;
if((fp = fopen(fname,"r")) == NULL)
exit(0);
while(!feof(fp))
{
for(i = 0;;i++)
{
fscanf(fp,"%s %s %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);
printf("姓名为:%s\n",Stu[i].name);
printf("学号为:%s\n",Stu[i].no);
printf("分数为:\n");
printf(" 语文成绩为: %d\n",Stu[i].chinese);
printf(" 数学成绩为: %d\n",Stu[i].mathematic);
printf(" 英语成绩为: %d\n",Stu[i].english);
printf("总分为: %d\n\n\n",Stu[i].chinese+Stu[i].english+Stu[i].mathematic);
}

}
fclose(fp);
}
/*sort()函数按总分由高到低显示学生信息*/
void sort()
{
FILE *fp;
int i = 0,j,k,m,total[N];
if((fp = fopen(fname,"r")) == NULL)
exit(0);
while(!feof(fp))
{
for(i = 0;;i++)
{
fscanf(fp,"%s %s %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);
total[i] = Stu[i].chinese + Stu[i].english + Stu[i].mathematic;
}


}
for(j = 0;j< i;j++)
{
m = j;
for(k = j+1;k <= i;k++)
if(total[m]<total[k]) m = k;//用m找出k之后的最大元素的下标
printf("姓名为:%s\n",Stu[k].name);
printf("学号为:%s\n",Stu[k].no);
printf("分数为:\n");
printf(" 语文成绩为: %d\n",Stu[k].chinese);
printf(" 数学成绩为: %d\n",Stu[k].mathematic);
printf(" 英语成绩为: %d\n",Stu[k].english);
printf("总分为: %d\n\n\n",Stu[k].chinese+Stu[k].english+Stu[k].mathematic);
}
fclose(fp);
}

[解决办法]
就拿 total函数中的这一句举例子
fscanf(fp,"%s %s %d %d %d %d",Stu[i].name,Stu[i].no,Stu[i].chinese,Stu[i].mathematic,Stu[i].english);

Stu[i].name只是一个指针变量,它不能存储输入的字符串。否则的话会发生内存访问异常,类似的错误还在其他函数中

你可以这样定义
struct student{
char name[20];//
char no[15];
int chinese;
int mathematic;
int english;
};

热点排行