C Primer Plus 第六版(中文版)第十四章(14.18.6)编程练习答案

2021、02、01:再次发现有问题,各位不妨找一找

多次修改终于可以了,数组清零少了Id、姓、名的清零
分部走:1、创建一个结构体数组,对数组进行清零,防止有无用数据
2、对文本信息进行读取,该球员无上场信息读取下一个球员信息
3、计算安打率
4、遍历显示读取的文本信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 19

typedef struct
{
    int id;          //球员的编号
    char fname[LEN]; //球员的名;
    char lname[LEN]; //球员的姓;
    int stage_num;   //球员的上场次数;
    int hit_num;     //球员的击中数;
    int base_num;    //球员的走垒数;
    int rbi;         //球员的打点;
    float hit_rate;  //球员的安打率;
} TEAM;

void clean_trash(TEAM players[], int n);
int read_datas(TEAM players[], int n, FILE *fp);
void count_hit_rate(TEAM players[], int n);
void show_messages(TEAM players[], int n);

int main(void)
{
    FILE *fp;
    int len;
    TEAM players[LEN];

    if ((fp = fopen("datas.txt", "r")) == NULL)
    {
        fprintf(stderr, "Can't open file datas.txt.\n");
        exit(EXIT_FAILURE);
    }
    clean_trash(players, LEN);          //为累计数据之和做准备,清理内存;
    len = read_datas(players, LEN, fp); //统计文件中不同球员的数量;
    count_hit_rate(players, LEN);
    show_messages(players, LEN);
    if (fclose(fp) != 0)
    {
        fprintf(stderr, "Can't close file datas.txt.\n");
        exit(EXIT_FAILURE);
    }

    return;
}

void clean_trash(TEAM players[], int n)
{
    int i;

    for (i = 0; i < n; i++) //原数组内容全部清零
    {
        players[i].id = 0;
        players[i].stage_num = 0;
        players[i].hit_num = 0;
        players[i].base_num = 0;
        players[i].rbi = 0;
        memset(players[i].fname, 0 , LEN);
        memset(players[i].lname, 0 , LEN);
    }
}

int read_datas(TEAM players[], int n, FILE *fp)
{
    int ch = 0;
    int count = 0;
    float hit_rate;
    char fname[LEN], lname[LEN];
    int m, stage_num, hit_num, base_num, rbi;

    //fscanf如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
    count = fscanf(fp, "%d %18s %18s %d %d %d %d",
                   &m, fname, lname, &stage_num, &hit_num, &base_num, &rbi);

    while ((count == 7) && !feof(fp) && (ch < n))
    {
        if (players[m].stage_num == 0)//球员上场次数为0,就去访问下一个有效的球员信息数组
        {
            ch++;
        }

        players[m].id = m;
        strcpy(players[m].fname, fname); //把文本中的球员信息赋给m这个有效数组里去
        strcpy(players[m].lname, lname);
        players[m].stage_num += stage_num;
        players[m].hit_num += hit_num;
        players[m].base_num += base_num;
        players[m].rbi += rbi;
        //再次读取一下文本数据(有具体内容信息的数组)
        count = fscanf(fp, "%d %18s %18s %d %d %d %d",
                       &m, fname, lname, &stage_num, &hit_num, &base_num, &rbi);
    }
    return ch;
}

void count_hit_rate(TEAM players[], int n)
{
    int i;

    for (i = 0; i < n; i++)
    {
        players[i].hit_rate = (float)players[i].hit_num / (float)players[i].stage_num;
        //计算每个运动员的安打率;
    }
    return;
}

void show_messages(TEAM players[], int n)
{
    int i;

    printf("Datas for all players:\n");
    printf("Id   First_name   Last_name   Stage   Hit_rate   Base_num   RBI   Hit_rate\n");
    for (i = 0; i < n; i++)
    {
        printf("%d %12s %10s %5d %7d %11d %8d %8.2f\n",
               players[i].id, players[i].fname, players[i].lname,
               players[i].stage_num, players[i].hit_num, players[i].base_num,
               players[i].rbi, players[i].hit_rate);
    }
    return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《C Primer Plus第六版》是一本面向初学者的C语言教材,由Stephen Prata撰写。这本书深入浅出地介绍了C语言的基本概念、语法和应用,给读者提供了扎实的编程基础。 该书共分为27,每都有清晰的目标、易于理解的示例和练习题。从第一的入门介绍开始,到最后一的高级主题讨论,书中的内容依次递进,系统完整地覆盖了C语言的方方面面。本书有助于读者逐步掌握C语言的基础知识,从简单的输出语句到复杂的函数调用和指针使用。 《C Primer Plus第六版》的特点是其清晰的讲解风格和丰富的实例。作者通过通俗易懂的语言和生动形象的例子,帮助读者理解和掌握C语言的各种概念和语法。此外,书中还提供了许多练习题和编程项目,供读者巩固所学知识和提高编程能力。 作为一本经典的C语言教材,《C Primer Plus第六版》被广泛用于学校和个人学习。它不仅适用于初学者,也对有一定编程基础的读者有所帮助。读者通过学习本书,可以建立起对C语言编程的扎实基础,为深入学习其他编程语言打下坚实的基础。 综上所述,《C Primer Plus第六版》是一本权威、经典的C语言教材,通过清晰的讲解和丰富多样的示例帮助读者深入理解C语言的基本概念和应用。无论是初学者还是有一定编程基础的读者,都可以从中获益,打下良好的编程基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值