《C primer plus》一个有问题的Chapter 14.5

/*编写一个程序满足下面需求。
 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.

可以看到第二次和第四次并没有被输入值,直接打出一次Please enter your firstname就完事了。。

猜你喜欢

转载自blog.csdn.net/Jason6620/article/details/79479131