扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
#include stdio.h
创新互联建站主营柳江网站建设的网络公司,主营网站建设方案,成都APP应用开发,柳江h5重庆小程序开发搭建,柳江网站营销推广欢迎柳江等地区企业咨询
#define N 5
void input_stu(struct Stu *stu);
void output_avg(struct Stu *stu);
struct Stu
{
int id;
char name[10];
int sex;
float math;
float eng;
float c;
};
int main()
{
struct Stu stu[N];
input_stu(stu);
output_avg(stu);
return 0;
}
void input_stu(struct Stu *stu)
{
int i = 1;
do
{
printf("请输入第%d个学生的姓名 学号 性别 数学成绩 英语成绩 C语言成绩:", i);
struct Stu *s = stu + i - 1;
scanf("%s %d %d %f %f %f", s-name, s-id, s-sex, s-math, s-eng, s-c);
i++;
} while (i = N);
}
void output_avg(struct Stu *stu)
{
int i = 1;
printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s","学 号", "姓 名", "性 别", "高 数", "英 语", "C", "平均分");
struct Stu *s = stu + i - 1;
float math_avg = stu-math, eng_avg = stu-eng, c_avg = stu-c;
putchar(10);
do
{
struct Stu *s = stu + i - 1;
math_avg = ((i - 1)*math_avg + s-math) / i;
eng_avg = ((i - 1) * eng_avg + s-eng) / i;
c_avg = ((i - 1)*c_avg + s-c) / i;
printf("%-8d%-8s%-8s%-8.1f%-8.1f%-8.1f%-8.1f",
s-id, s-name, s-sex == 1 ? "男" : "女", s-math, s-eng, s-c, (s-math + s-eng + s-c) / 3);
putchar(10);
i++;
} while (i = N);
printf("%-12s%-12s%-12s%", "数学平均分", "英语平均分", "C平均分");
putchar(10);
printf("%-12.1f%-12.1f%-12.1f", math_avg, eng_avg, c_avg);
}
第一题中的name为什么是sundan
第一题中的num为什么该值:()
注意了,压根没有使用f的返回值,f也没有返回值(void)
第二题(不再画图了),main中的s[0]与f中的p压根是两个内存区域(当然了,传参数时,将s[0]内存区域的内容拷贝到了p内存区域),所以显然,在f中修改内存区域p,自然不会影响main中的内存区域s[0],因此s[0]亦然保持本来的值。(即20041, 703)
#include stdio.h
#include stdlib.h
struct Student
{
int num;
char name[20];
float score[3];
float aver;
};
void input(struct Student stu[])
{
int i;
printf("请输入各学生学号名字三科分数:\n");
for(i=0;i3;i++)
{
scanf(" %d %s %f %f %f", stu[i].num, stu[i].name,
stu[i].score[0], stu[i].score[1], stu[i].score[2]);
stu[i].aver=float((stu[i].score[0] + stu[i].score[1] + stu[i].score[2])/3.0);
}
}
int max(struct Student stuTmp[])
{
int i, j;
float temp = NULL;
int maxNum = 0;
struct Student stu[3];
stu[0].aver = stuTmp[0].aver;
stu[0].num = stuTmp[0].num;
stu[1].aver = stuTmp[1].aver;
stu[1].num = stuTmp[1].num;
stu[2].aver =stuTmp[2].aver;
stu[2].num = stuTmp[2].num;
for (j = 0; j 3; j++)
for (i = 0; i 3 - j; i++)
{
if(stu[i].aver stu[i + 1].aver)
{
temp = stu[i].aver;
maxNum = stu[i].num;
stu[i].aver = stu[i + 1].aver;
stu[i].num = stu[i+1].num;
stu[i + 1].aver = temp;
stu[i + 1].num = maxNum;
}
}
return maxNum;
}
void output(struct Student stu[])
{
int i;
for (i = 0; i 3; i++)
{
printf("学号%d 姓名%s 三科成绩%f %f %f平均分%f\n",
stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].aver);
}
}
int main()
{
Student stumain[3];
int num;
input(stumain);
num = max(stumain);
printf("max is:%d %s %f %f %f\n", stumain[num].num, stumain[num].name,
stumain[num].score[0],stumain[num].score[1],stumain[num].score[2], stumain[num].aver);
output(stumain);
system("pause");
return 0;
}
我认为你是初学C/C++,因为你在main函数中的函数调用竟然是函数原型声明的方法来调用,如果是初学,语法基础尚未学好怎么就开始结构体等的学习了?
错误:
1:main函数中的函数调用语法错误。
2:结构体没有在main函数或其他地方实例化就试图作为参数使用。
3:output函数没有使用循环输出,将会导致只输出一个学生的信息。
4:排序算法错误(你想使用冒泡吧?)。
5:input函数接收输入错误,应该在for循环中使用大括号,把平均值的计算包括进去,不然全部输入结束后,平均值只计算了一个,其他的两个是随机值。
朋友,建议你再复习一下C语言的基础知识。
另外,排序函数中,我使用了较为繁杂的方式排,你学好了以后可以考虑使用指针排,简洁些。
首先,
在函数
double
ave(double
g.gr1,double
g.gr2,double
g.gr3)
{
ave=(g.gr1+g.gr2+g.gr3)/3.0;
return
ave;
}
中,用到局部变量ave,但是并未定义。(此变量ave与主函数的变量ave不同,不能混淆)。
为了避免混淆,函数名与变量名最好不要用同样的名字,以免自己都不清楚。
另外,结构体中
char
name;难道名字只有一个字符吗?好歹也该设一个字符数组吧。否则,只要你在这一部分输入字符超过一个就会造成越界,影响整个程序的运行。
scanf("%d%s",g.num,g.name);这一句,g.name前遗漏了符号。
在主函数里声明函数
double
ave(g.gr1,g.gr2,g.gr3)时,各个变量要说明类型。并且,不应该在主函数内部声明,该声明应该放在外部。最好的方式时,把主函数中要调用的函数放在主函数之前,这样也省去了声明的麻烦。
#includestdib.h一句有误,其实可以不需要,或者改为#includestdlib.h。
还有一个问题,在英文里,标点符号后面需要有一个空格。
从这里的程序来看,你对结构体基本上都掌握了,但是最基础的部分却不太扎实。不如形参与实参,变量的作用域、定义与声明等。都是前几章的内容。
另外,需要在运行时输入的程序,一定要有足够的提示信息。
修改后的程序如下,经过试验,可以正常运行。
#includestdio.h
//#includestdlib.h
typedef
struct
student
{
int
num;
char
name[20];
double
gr1,
gr2,
gr3;
}
student;
double
average(double
a,
double
b,
double
c)
{
double
t;
t=(a+b+c)/3.0;
return
t;
}
int
main(void)
{
//struct
student
g;
double
ave;
//double
ave(g.gr1,g.gr2,g.gr3);
/*定义的函数表示在这里出错了,书不在靠边,这里确实不能确实啥情况。。。*/
printf("\n
Please
input
the
Student
number
and
the
name:
\n");
scanf("%d
%s",
(g.num),
g.name);
printf("\n
Please
input
the
score
of
3
courses:
\n");
scanf("%lf
%lf
%lf",
(g.gr1),
(g.gr2),
(g.gr3));
printf("\n
The
information
input
is
as
below:");
printf("\n
Student
number:
%d;
",
g.num);
printf("\n
Student
name:
%s;
",
g.name);
printf("\n
The
score
of
3
courses:
%lf,
%lf,
%lf.
",
g.gr1,
g.gr2,
g.gr3);
ave=average(g.gr1,
g.gr2,
g.gr3);
printf("\n
The
average
is
%lf.\n",
ave);
//system("pause");
return
0;
}
运行结果如下:
Please
input
the
Student
number
and
the
name:
123456
Michel
Please
input
the
score
of
3
courses:
21.5
210.6
39.6
The
information
input
is
as
below:
Student
number:
123456;
Student
name:
Michel;
The
score
of
3
courses:
21.500000,
210.600000,
39.600000.
The
average
is
90.566667.
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流