题目要求:
1)有n个学生,每个学生信息有:学号、姓名 、年龄、入学成绩。 按上述列出的学生属性试定义结构体类型 struct student,并给该类型起别名为STUD。
2) 在主函数中定义一个能容纳5个学生的结构体数组s,并对其中前4个学生用初始化方式提供初值,初值自己拟定。
3) 编写一个函数,完成从键盘输入一个学生信息,要求用地址传递方式传回这个学生信息
4)调用上述输入学生信息函数,完成对第5个学生信息的输入。
5)编写函数输出n个学生学生信息。格式要求每一行一个学生信息,每列之间有间隔。
6)已知有n个学生,试编写函数完成计算所有学生的平均年龄并返回这个平均值。
7)已知有n 个学生的信息,编写函数完成将所有年龄加1,要求用结构体指针完成对该数组的修改。调用输出学生信息函数查看调用上述修改年龄函数后,学生年龄的变化。
代码实现:
1.起别名,那肯定是typedef struct student{...}STUD;
2.在主函数中创建结构体数组即可,如:STUD s[5];
在主函数中拟定前四名学生的初始值,直接在主函数中赋值即可,如:s[0].sno=001;
3.编写函数键入学生信息
void InputStud(STUD* p)//不需要返回值
{
printf("提示输入内容");
scanf("%d",&p->结构体元素类型) ;//输入int型数据,其他类推,字符串用gets()也可
}
4调用函数完成对第五个学生信息的输入,只要函数没错应该就没问题.另外,别忘了数组第五个元素标号是4就行。
5.因为定义s是数组名,所以直接PrintStud(s,5),将这个数组的内存地址传进去就行.
6.这个不用再说了,直接上就行。
7.将结构体数组名传给p,STUD*p就是结构体指针,p是数组名,也就是s[0]的地址,p+i就是s[i]的地址,所以要用(p+i)->age++;别忘了for循环,最后再用第5)中写的PrintStud函数打印结构体数组就行.
#include<stdio.h>
typedef struct student
{
char sno[4];
char name[8];
int age;
float enscore;
}STUD;
void InputStud(STUD *p){
printf("请输入学号:");
gets(p->sno);
printf("请输入姓名:");
gets(p->name);
printf("请输入年龄:");
scanf("%d",&p->age);
printf("请输入入学成绩:");
scanf("%f",&p->enscore);
}
void PrintStud(STUD *s,int n)
{
int i;
printf("学号 姓名 年龄 入学成绩\n");
for(i=0;i<n;i++)
{
printf("%4s%6s%5d%8.0f\n",s[i].sno,s[i].name,s[i].age,s[i].enscore);
}
}
int AvgStud(STUD *s,int n)
{
float aveage=0;
int i;
for(i=0;i<n;i++)
aveage+=s[i].age;
aveage/=n;
return aveage;
}
void AgePlusOne(STUD *p,int n)
{
int i;
for(i=0;i<n;i++)
{
(p+i)->age++;
}
}
int main()
{
STUD s[5]={
{"001","张三",19,80},
{"002","李四",18,80},
{"003","王五",17,80},
{"004","老六",18,80},
};
InputStud(&s[4]);
PrintStud(s,5);
printf("平均年龄为:%.1f\n",AvgStud(s,5));
printf("\n");
AgePlusOne(s,5);
PrintStud(s,5);
return 0;
}