以下是我写的代码
#include
#include
typedef struct BirthDate {
int year;
int month;
int day;
}birthdate;
typedef struct Student{
unsigned int num;
char name[20];
unsigned char sex;
birthdate date;
int scores[4];
}student;
void ShowStuInfo( student*pstudent);
double Average(student*students,int N,int i);
int main()
{
int N;
printf("请输入学生数量\n");
scanf("%d",&N);
student* students;
int i;//学科代码
int count;//学生信息输入循环变量
double ave=0;
//分配学生结构体数组需要的内存
students=(student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for(count=0;count<N;count++)
{
ShowStuInfo(students);
}
//求某一学科的平均成绩
ave=Average(students,N,i);
printf("%lf",ave);
free(students);
return 0;
}
void ShowStuInfo(student*pstudent)
{
printf("请输入学号 姓名 性别 出生年-月-日\n");
scanf("%d %s %c %d-%d-%d",
&pstudent->num,
pstudent->name,
&pstudent->sex,
&pstudent->date.year,
&pstudent->date.month,
&pstudent->date.day);
printf("请输入各科成绩\n");
scanf("%d %d %d %d",
&pstudent->scores[0],
&pstudent->scores[1],
&pstudent->scores[2],
&pstudent->scores[3]
);
}
double Average(student*students,int N,int i)
{
int j;
double Ave;
for(j=0;j {
Ave+=students->scores[i];
}
Ave/=N;
return Ave;
}
以下是运行结果
求问哪错了
unsigned char sex,你一个汉字怎么能放在char类型。
1、性别输入是汉字,故 scanf %c 应变为%s, sex变量也应改为3个字节的数组。
2、ShowStuInfo(students);应改为 ShowStuInfo(&students[count]); 你这样永远输入的是第一个学生的信息。
3、ave=Average(students,N,i); i 没有赋值。
4、Average内部有错误,可能是你代码没有贴全了,你这样编译都不可能过了。
改了一下自己看看吧:
#include<cstdio>
#include<cstdlib>
#include<cstring>
typedef struct BirthDate {
int year;
int month;
int day;
}birthdate;
typedef struct Student{
unsigned int num;
char name[20];
unsigned char sex;
birthdate date;
int scores[4];
}student;
void ShowStuInfo(student*pstudent);
double Average(student*students, int N, int i);
int main()
{
int N;
printf("请输入学生数量\n");
scanf("%d", &N);
student* students;
int i;//学科代码
int count;//学生信息输入循环变量
double ave = 0;
//分配学生结构体数组需要的内存
students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
ShowStuInfo(&students[count]);
}
//求某一学科的平均成绩
for (int i = 0; i < 4;i++)
{
ave = Average(students, N, i);
printf("科目%d:%lf", i, ave);
}
free(students);
return 0;
}
void ShowStuInfo(student*pstudent)
{
printf("请输入学号 姓名 性别 出生年-月-日\n");
scanf("%d %s %c %d-%d-%d",
&pstudent->num,
pstudent->name,
&pstudent->sex,
&pstudent->date.year,
&pstudent->date.month,
&pstudent->date.day);
printf("请输入各科成绩\n");
scanf("%d %d %d %d",
&pstudent->scores[0],
&pstudent->scores[1],
&pstudent->scores[2],
&pstudent->scores[3]
);
}
double Average(student*students, int N, int i)
{
int j;
double Ave = 0;
for (j = 0; j<N;j++)
{
Ave += students[j].scores[i];
}
Ave /= N;
return Ave;
}
tudents=(student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for(count=0;count<N;count++)
{
ShowStuInfo(students);
}
你申请的是N个学生的地址空间,而你ShowStuInfo函数入参只是一个学生的结构指针,函数体里也是这样赋值的,这是最大问题。
成绩统计也是这个问题
Average内部有错误
应该是在void ShowStuInfo(student*pstudent)的scanf函数上,有%s 和%c,这些空格和回车都是算输入的。这样导致后面不用输出了,总之,C语言的scanf使用起来一定要注意。
#include
#include
#include
typedef struct BirthDate {
int year;
int month;
int day;
}birthdate;
typedef struct Student{
unsigned int num;
char name[20];
unsigned char sex;
birthdate date;
int scores[4];
}student;
void ShowStuInfo(student*pstudent);
double Average(student*students, int N, int i);
int main()
{
int N;
printf("请输入学生数量\n");
scanf("%d", &N);
student* students;
int i;//学科代码
int count;//学生信息输入循环变量
double ave = 0;
//分配学生结构体数组需要的内存
students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
ShowStuInfo(&students[count]);
}
//求某一学科的平均成绩
for (int i = 0; i < 4;i++)
{
ave = Average(students, N, i);
printf("科目%d:%lf", i, ave);
}
free(students);
return 0;
}
void ShowStuInfo(student*pstudent)
{
printf("请输入学号 姓名 性别 出生年-月-日\n");
scanf("%d %s %c %d-%d-%d",
&pstudent->num,
&pstudent->name,
&pstudent->sex,
&pstudent->date.year,
&pstudent->date.month,
&pstudent->date.day);
printf("请输入各科成绩\n");
scanf("%d %d %d %d",
&pstudent->scores[0],
&pstudent->scores[1],
&pstudent->scores[2],
&pstudent->scores[3]
);
}
double Average(student*students, int N, int i)
{
int j;
double Ave = 0;
for (j = 0; j<N;j++)
{
Ave += students[j].scores[i];
}
Ave /= N;
return Ave;
}
没注意你性别的输入,我是按英文输入的,改好了
#include<cstdio>
#include<cstdlib>
#include<cstring>
typedef struct BirthDate {
int year;
int month;
int day;
}birthdate;
typedef struct Student{
unsigned int num;
char name[20];
char sex[20];
birthdate date;
int scores[4];
}student;
void ShowStuInfo(student*pstudent);
double Average(student*students, int N, int i);
int main()
{
int N;
printf("请输入学生数量\n");
scanf("%d", &N);
student* students;
int i;//学科代码
int count;//学生信息输入循环变量
double ave = 0;
//分配学生结构体数组需要的内存
students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
ShowStuInfo(&students[count]);
}
//求某一学科的平均成绩
for (int i = 0; i < 4;i++)
{
ave = Average(students, N, i);
printf("科目%d:%lf", i, ave);
}
free(students);
system("pause");
return 0;
}
void ShowStuInfo(student*pstudent)
{
printf("请输入学号 姓名 性别 出生年-月-日\n");
scanf("%d %s %s %d-%d-%d",
&pstudent->num,
pstudent->name,
pstudent->sex,
&pstudent->date.year,
&pstudent->date.month,
&pstudent->date.day);
printf("请输入各科成绩\n");
scanf("%d %d %d %d",
&pstudent->scores[0],
&pstudent->scores[1],
&pstudent->scores[2],
&pstudent->scores[3]
);
}
double Average(student*students, int N, int i)
{
int j;
double Ave = 0;
for (j = 0; j<N;j++)
{
Ave += students[j].scores[i];
}
Ave /= N;
return Ave;
}
students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
ShowStuInfo(&students[count]);
}
这样虽然暂时可行,但可读性很差,你可以用一个指针数组来保存每个学生的结构指针,这只是个人意见,写代码要保持简洁,不然的话你过几天回过头来再
看自己写的代码一时半会都不一定看的明白。
students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
ShowStuInfo(&students[count]);
}