5. 出书最多

假定图书馆新进了m(10 ≤ m ≤ 999)本图书,它们都是由n(1 ≤ n ≤ 26)个作者独立或相互合作编著的。假设m本图书编号为整数(1到999),作者的姓名为字母('A'到'Z'),请根据图书作者列表找出参与编著图书最多的作者和他的图书列表。

时间限制:1000 内存限制:65536

输入

第一行为所进图书数量m,其余m行,每行是一本图书的信息,其中第一个整数为图书编号,接着一个空格之后是一个由大写英文字母组成的没有重复字符的字符串,每个字母代表一个作者。输入数据保证仅有一个作者出书最多。

输出

输出有多行: 第一行为出书最多的作者字母;

第二行为作者出书的数量; 其余各行为作者参与编著的图书编号(按输入顺序输出)。

样例输入

11

307 F

895 H

410 GPKCV

567 SPIM

822 YSHDLPM

834 BXPRD

872 LJU

791 BPJWIA

580 AGMVY

619 NAFL

233 PDJWXK

样例输出

P

6

410

567

822

834

791

233

【分析】

此题出现在2021年12月C语言二级考试中,出现在最后一题是在二级中相对较难的题目,需要考生耐心分析。

输入数据是每本书,以及每本书对应的作者名。此题中,有多本书和多个作者,他们的对应关系可能是:

存在一书对应多个作者,一个作者又对应多本书,是一种【多对多】的关系。

已知的是书号,以及相关联的作者,而输出则要求:输出书目最多的作者,关联的所有书号。

恰巧作者的名字都是字符,且选自26个大写字母,根据大写字母的有序性,我们考虑创建数组,作者名对应数组的下标,数组存储书号。但因为一名作者对应多个书号,所以仅仅是每位作者关联的书号,就需要一个一维数组存储,所以可以考虑二维数组 或者 结构体 完成作者书号的存储。

方案一:创建作者类型结构体

① 作者的结构体类型创建时,顺便定义了作者数组 au[ ] 。

struct Author                    //定义作者类型结构体
{int num;                   //num:关联书的数量 int book[1000];                //book[]:存储关联的书号
} au[26];

要明确作者名和下标的对应关系:

名为 'A' 的作者信息,存入 au[ 0 ] 中;

名为 'B' 的作者信息,存入 au[ 1 ] 中;

名为 'C' 的作者信息,存入 au[ 2 ] 中;

……

名为 'X' 的作者信息,存入 au[ 'X' - 'A' ] 中;

② 接下来用输入数据给 au[ ] 数组赋值,将每本书号,放入到其关联的作者 拥有的 book[ ] 数组中。

③ 寻找书目最多的作者下标;

④ 按输出格式,打印该作者的相关信息。

#include<stdio.h>
struct Author                   //定义作者类型结构体
{int num;                   //num:关联书的数量 int book[1000];                //book[]:存储关联的书号
} au[26];int main()
{int n, i, j, k, maxAu=0;  //k: 临时存书号  ; maxAu 书最多的作者编号 char s[27];                    //s[]: 临时存储输入字符串 scanf("%d",&n);for(i=0;i<n;i++){scanf("%d %s", &k, s);for(j=0;s[j]!='\0';j++)  {au[s[j]-'A'] . num++;   //给作者关联书号,收获书号+1 au[s[j]-'A'] . book[ au[s[j]-'A'].num ] = k;}            }for(i=0;i<26;i++)            //寻找书目最多的作者 {if(au[i].num > au[maxAu].num)   maxAu = i;     }printf("%c\n",maxAu+'A');printf("%d\n",au[maxAu].num);for(j=1; j<=au[maxAu].num; j++)printf("%d\n", au[maxAu].book[j] );return 0;
}

方案二:创建二维数组,存储每个作者的书目

经过前面的分析,我们可以创建二维数组,将每位作者关联的书号存一行,行下标对应作者的名字。

'A' 作者的信息存在第 0 行;

'B' 作者的信息存在第 1 行;

'C' 作者的信息存在第 2 行;

……

'X' 作者的信息则存在第 'X' - 'A' 行。

在读取输入数据的过程中,完成对二维数组的赋值。

以下是参考程序,和上面的结构体方案多有相似之处。

#include<stdio.h>
int author[26][100];                    // 作者数组,每一行存储一个作者的书目
int main()
{int n, i, j, k, m, maxAu=0, max=0;   //k: 临时存书号  ; maxAu:书最多的作者编号;max:最大的数量 char s[27];                          //s[]: 临时存储输入字符串 scanf("%d",&n);for(i=0;i<n;i++){scanf("%d %s", &k, s);for(j=0;s[j]!='\0';j++)  {m=0;while(author[s[j]-'A'][m]!=0)  m++;  //寻找下一个书号存放位 author[s[j]-'A'][m] = k;    //将书号分配给第 j 个作者 }               }for(i=0;i<26;i++)                    //寻找书目最多的作者 {m=0;while(author[i][m]!=0)           //计算当前作者的书目数 m++;                 if(m > max){maxAu = i;max = m;}    }printf("%c\n",maxAu+'A');printf("%d\n",max);for(j=0; j<max; j++)printf("%d\n", author[maxAu][j]);return 0;
}

方案三:创建书目结构体存储作者信息

此方案是学生的探索方案,以书为结构体对象,存储每本书的 编号、关联作者;

struct Book {int num;char writer[300];
}book[999];

将输入数据存储在 结构体数组 book[ ] 中;

接下来的寻找出书最多的作者,则需要遍历 book 中的 writer[ ] 数组,分别计算每一位作者关联的图书数量,记录最大关联数 和 作者名 。

思路上非常清晰,但麻烦最后一步,在输出关联书目的时候,还要遍历一次整个 book 中的 writer[ ] 数组。

#include <stdio.h>
#include <string.h>
struct Book {int num;char writer[300];
} book[999];
int main( ) {int m,i,j,xb,large;char large2;int flag[26]={0};scanf("%d",&m);for(i=0;i<m;i++)scanf("%d %s",&book[i].num,&book[i].writer);for(i=0;i<m;i++){for(j=0;j<strlen(book[i].writer);j++)flag[book[i].writer[j]-65]++;}large=flag[0];    for(i=0;i<26;i++)if(flag[i]>large){xb=i;large=flag[i];}        large2=xb+65;printf("%c\n%d\n",large2,large);for(i=0;i<m;i++)for(j=0;j<strlen(book[i].writer);j++)if(book[i].writer[j]==large2) {printf("%d\n",book[i].num);break; }return 0;
}

出书最多 [2021年12月 电子学会C语言编程等级考试二级真题解析]相关推荐

  1. 电子学会青少年软件编程 Python编程等级考试二级真题解析(选择题)2021年12月

    2021年12月Python编程等级考试二级真题解析 选择题(共25题,每题2分,共50分) 1.执行以下程序,运行结果是 a = [33,55,22,77] a.sort() for i in a: ...

  2. 电子学会青少年软件编程 Python编程等级考试二级真题解析(判断题)2020年12月

    2020年12月Python编程等级考试二级真题解析 判断题(共10题,每题2分,共20分) 26.执行以下代码,输入数字99,运行结果是:ok 答案:错 考点分析:考查数据类型,input函数的返回 ...

  3. 电子学会青少年软件编程 Python编程等级考试二级真题解析(选择题)2022年3月

    2022年3月Python编程等级考试二级真题解析 选择题(共25题,每题2分,共50分) 1.关于Python中的列表,下列描述错误的是 A.列表是Python中内置可变序列,是若干元素的有序集合 ...

  4. python计算圆的面积和周长 青少年编程电子学会python编程等级考试二级真题解析2021年3月

    目录 python计算圆的面积和周长 一.题目要求 1.编程实现 2.输入输出 3.评分标准 二.解题思路 1.案例分析 2.流程分析 三.程序代码 四.运行结果 五.考点分析 python计算圆的面 ...

  5. python日期计算器 青少年编程电子学会python编程等级考试二级真题解析2021年12月

    目录 python日期计算器 一.题目要求 1.编程实现 2.输入输出 3.评分标准

  6. python输出唐诗 青少年编程电子学会python编程等级考试二级真题解析2021年12月

    目录 python输出唐诗 一.题目要求 1.编程实现 2.输入输出 3.评分标准

  7. python剔除数字 青少年编程电子学会python编程等级考试二级真题解析2020年12月

    目录 python剔除数字 一.题目要求 1.编程实现 2.输入输出 3.评分标准

  8. python统计单词出现次数 青少年编程电子学会python编程等级考试二级真题解析2022年3月

    目录 python统计单词次数 一.题目要求 1.编程实现 2.输入输出 3.评分标准</

  9. python乘车费用 青少年编程电子学会python编程等级考试二级真题解析2020年6月

    目录 python乘车费用 一.题目要求 1.编程实现 2.输入输出 3.评分标准

最新文章

  1. 【 MATLAB 】legend 的使用简析
  2. 去除cpp中注释的小程序
  3. 添加新闻在分层里的实现
  4. 防止数据中心停机需要采取什么措施
  5. leetcode689:Maximum Sum of 3 Non-Overlapping Subarrays
  6. cube云原生机器学习平台-架构(四)
  7. joson返回数据库的时间格式在前台用js转换
  8. 一阶滞后环节matlab,一个一阶惯性带有滞后环节的PID仿真程序
  9. 车型代号对照表_车型和VIN代号对照表3.24.doc
  10. 网络协议基础05--数据链路层
  11. 皇家每羊历险记(二)——地形制作
  12. 自学C语言入门教程(上)
  13. Linux-CentOS 安装配置ExifTool
  14. kafka java实战_Kafka KSQL实战 PDF 下载
  15. fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared
  16. 调用百度AI接口实现图片文字识别
  17. 印度最大IT公司与IIT联手研究5G和AI 他们有什么优势
  18. 关于巨量算数jsvmp简单还原signature思路
  19. Mob秒验(一键登录注册)是什么意思?
  20. 国内外软件成分分析SCA产品评测

热门文章

  1. [词一首]【相思难断】
  2. 芯片解密STM32F100VB 芯片基本特性
  3. h5如何做微信公众号支付
  4. CCleanner下载安装教程
  5. 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛 1005 Lunch (杭电 6892)
  6. 怎样把PDF图片旋转90度
  7. python普通常量_以下属于Python普通常量的是(
  8. QListWidgt QListView QTableWidget QTableView 去掉虚线框
  9. 【转】利用Windows API调用摄像头
  10. 智能垃圾桶语音芯片应用设计方案介绍,WT588F02B-8S