/*编写一个程序满足下面需求。
a.外部定义一个有两个成员的结构模板name:一个字符串储存名,一个字符串储存姓
b.外部定义一个有3个成员的结构模板student:一个name类型的结构,一个grade数组储存3个浮点型分数,一个变量储存3个分数的平均数
C.在main()函数中声明一个内涵CSIZE=4个student类型的结构数组,并初始化这些结构的名字部分。用函数执行g,e,f和g中描述的任务
d.以交互的方式获取每个学生的成绩,提示用户输入学生的姓名和分数。把分数储存到grade数组相应的结构中。可以再main()中其他函数中用循环完成。
e.计算每个结构的平均分,并把计算后的值赋给合适的成员
f.打印每个结构的信息
g.打印班级的平均分,及所有结构的数值成员的平均值*/
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define CSIZE 4
# define LEN 10
char s_gets(char *st,int n);
struct name
{
char fname[LEN];
char lname[LEN];
};
struct student
{
struct name boy;
float grade[3];
float ave;
};
int main(void)
{
struct student guy[CSIZE]=
{
{.boy.fname="Jason",.boy.lname="Bourne"},
{.boy.fname="LeBorn",.boy.lname="James"},
{.boy.fname="Kevin",.boy.lname="Durant"},
{.boy.fname="Kyre",.boy.lname="Ivring"}
};
int i,j,n;
for(i=0; i<CSIZE; i++)
{
char person[LEN];
puts("Please enter your first name:");
//共有四次循环,但第二次与第四次只执行到这,不知为何
s_gets(person,LEN);
for(j=0; j<CSIZE; j++)
{
float sum=0;
if(strcmp(guy[j].boy.fname,person)==0)//输入的firstname依次与其结构内对比,若相同则键入此学生的成绩并计算平均分
{
printf("Please enter your score:\n");
for(n=0; n<3; n++)
{
scanf("%f",&guy[j].grade[n]);//输入成绩
sum+=guy[j].grade[n];
}
guy[j].ave=sum/3.0;//计算平均值
//printf("%.2f %d\n",guy[j].ave,j);
}
}
}
for(i=0; i<CSIZE; i++)
{
printf("%s %s,your scores of three course are :%.1f %.1f %.1f.And your averge is %.1f.\n",
guy[i].boy.fname,guy[i].boy.lname,guy[i].grade[0],guy[i].grade[1],guy[i].grade[2],guy[i].ave);//输出
}
return 0;
}
char s_gets(char *st,int n)
{
char *find;
char *ret_val;
ret_val=fgets(st,n,stdin);
if(ret_val)
{
find=strchr(st,'\n');
if(find)
*find='\0';
else
while(getchar()!='\n')
continue;
}
return ret_val;
}
看了许多博客都是直接输入分数然后直接计算,按照顺序来的,个人想通过名称匹配后再输入相应的分数然后进行平均处理,可在第一次和第三次输入内容完成后,第二次和第四次没有执行内循环,不知为何,先存疑。
输出内容如下:
Please enter your first name:
Jason
Please enter yout score:
33 44 55
Please enter your firstname:
Please enter your firstname:
Kevin
Please enter your score:
33 22 11
Please enter your firstname:
Jason Bourne,your scores of three course are :33.0 44.0 55.0.And your averge is 44.0.
LeBorn James,your scores of three course are :0.0 0.0 0.0.And your averge is 0.0.
Kevin Durant,your scores of three course are :22.0 33.0 44.0.And your averge is 33.0.
Kyre Ivring,your scores of three course are :0.0 0.0 0.0.And your averge is 0.0.
LeBorn James,your scores of three course are :0.0 0.0 0.0.And your averge is 0.0.
Kevin Durant,your scores of three course are :22.0 33.0 44.0.And your averge is 33.0.
Kyre Ivring,your scores of three course are :0.0 0.0 0.0.And your averge is 0.0.
可以看到第二次和第四次并没有被输入值,直接打出一次Please enter your firstname就完事了。。