2022年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

news/2024/4/17 3:16:48/文章来源:https://blog.csdn.net/gozhuyinglong/article/details/132638627

在这里插入图片描述

C/C++编程(1~8级)全部真题・点这里

第1题:stack or queue

栈和队列都是常用的线性结构,它们都提供两个操作:
Push:加入一个元素。
Pop:弹出一个元素。
不同的是,栈是”先进后出”,而队列则是”先进先出”。
给出一个线性结构的进出顺序,判定这个结构是栈还是队列。
时间限制:1000
内存限制:65535
输入
第一行输入一个整数t,代表有t组测试数据 对于每组测试数据,第一行输入一个整数n,代表操作的次数。 随后输入n行,每行包含两个整数 type val。 当type = 1时,表示该次操作为push操作,val表示进入的数字。当type=2时,表示该次操作为pop操作,val代表出来的数字。 3<=n<=2000
输出
每组测试数据输出一行。 输出该组数据对应的线性结构,”Stack” 或者 “Queue”。 题目保证是栈或者队列的一种。
样例输入
2
6
1 1
1 2
1 3
2 3
2 2
2 1
4
1 1
1 2
2 1
2 2
样例输出
Stack
Queue

以下是一个用C语言实现的解答示例:

#include <stdio.h>#define MAX_SIZE 2000typedef struct {int data[MAX_SIZE];int top;
} Stack;typedef struct {int data[MAX_SIZE];int front;int rear;
} Queue;void initStack(Stack *stack) {stack->top = -1;
}void initQueue(Queue *queue) {queue->front = 0;queue->rear = -1;
}void pushStack(Stack *stack, int value) {stack->data[++stack->top] = value;
}int popStack(Stack *stack) {return stack->data[stack->top--];
}void enqueue(Queue *queue, int value) {queue->data[++queue->rear] = value;
}int dequeue(Queue *queue) {return queue->data[queue->front++];
}int main() {int t;scanf("%d", &t);while (t--) {int n;scanf("%d", &n);int type, val;int isStack = 1; // Assume it's a stack initiallyint isQueue = 1; // Assume it's a queue initiallyStack stack;Queue queue;initStack(&stack);initQueue(&queue);while (n--) {scanf("%d %d", &type, &val);if (type == 1) {pushStack(&stack, val);enqueue(&queue, val);} else if (type == 2) {if (isStack) {if (val != popStack(&stack))isStack = 0;}if (isQueue) {if (val != dequeue(&queue))isQueue = 0;}}}if (isStack && !isQueue)printf("Stack\n");else if (!isStack && isQueue)printf("Queue\n");}return 0;
}

这个程序首先定义了栈(Stack)和队列(Queue)的结构体,然后实现了初始化栈和队列的函数。接下来,根据输入的操作类型和值,通过调用相应的函数来模拟栈和队列的操作。在每次出栈或出队列的操作中,都会判断是否满足栈或队列的特性,如果不满足,则将相应的标志位(isStack和isQueue)设置为0。最后,根据标志位的值输出结果。

注意:该程序假设输入的操作序列要么是栈,要么是队列,不能同时满足栈和队列的特性。

第2题:栈的基本操作

栈是一种重要的数据结构,它具有push k和pop操作。push k是将数字k加入到栈中,pop则是从栈中取一个数出来。
栈是后进先出的:把栈也看成横向的一个通道,则push k是将k放到栈的最右边,而pop也是从栈的最右边取出一个数。
假设栈当前从左至右含有1和2两个数,则执行push 5和pop操作示例图如下:
push 5 pop
1
栈 1 2 -------> 1 2 5 ------> 1 2
现在,假设栈是空的。给定一系列push k和pop操作之后,输出栈中存储的数字。若栈已经空了,仍然接收到pop操作,
则输出error。
时间限制:1000
内存限制:65536
输入
第一行为m,表示有m组测试输入,m<100。 每组第一行为n,表示下列有n行push k或pop操作。(n<150) 接下来n行,每行是push k或者pop,其中k是一个整数。 (输入保证同时在栈中的数不会超过100个)
输出
对每组测试数据输出一行。该行内容在正常情况下,是栈中从左到右存储的数字,数字直接以一个空格分隔,如果栈空,则不作输出;但若操作过程中出现栈已空仍然收到pop,则输出error。
样例输入
2
4
push 1
push 3
pop
push 5
1
pop
样例输出
1 5
error

以下是一个用C语言实现的解答示例:

#include <stdio.h>
#include <string.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;
} Stack;void initStack(Stack *stack) {stack->top = -1;
}void push(Stack *stack, int value) {stack->data[++stack->top] = value;
}int pop(Stack *stack) {return stack->data[stack->top--];
}int isEmpty(Stack *stack) {return stack->top == -1;
}int main() {int m;scanf("%d", &m);while (m--) {int n;scanf("%d", &n);Stack stack;initStack(&stack);int i;char operation[5];int value;for (i = 0; i < n; i++) {scanf("%s", operation);if (strcmp(operation, "push") == 0) {scanf("%d", &value);push(&stack, value);} else if (strcmp(operation, "pop") == 0) {if (isEmpty(&stack)) {printf("error\n");break;} else {pop(&stack);}}}if (isEmpty(&stack))continue;while (!isEmpty(&stack)) {printf("%d ", pop(&stack));}printf("\n");}return 0;
}

该程序首先定义了栈(Stack)的结构体,然后实现了初始化栈、入栈(push)、出栈(pop)以及判断栈是否为空的函数。

在主函数中,首先读取测试数据的数量m,然后通过循环处理每组测试数据。对于每组测试数据,首先读取操作的数量n。随后,通过循环逐行读取操作,并根据操作类型执行相应的操作。如果收到pop操作时栈已经为空,则输出"error",并跳出当前循环。在处理完n行操作后,如果栈不为空,则依次出栈并输出栈中的数字。

注意:根据题目要求,如果栈为空且仍然收到pop操作,则输出"error"。

第3题:发型糟糕的一天

农夫John 的N(1 ≤ N ≤ 80,000)只奶牛中,有一些也许正在经历发型糟糕的一天。每只奶牛对自己乱糟糟的发型都有自知之明,农夫John想知道所有奶牛能看到其他奶牛头顶的数量之和。
任意奶牛i身高记为 hi (1 ≤ hi ≤ 1,000,000,000),所有奶牛面向东方(本题示意图的右面)依次站成一条线。因此,奶牛i能够看到在它前面的(奶牛i+1,i+2…)所有身高比它低的奶牛,直到被一头比它高的奶牛挡住
考虑如下的例子:
= =
= - = Cows facing right ->
= = =
= - = = =
= = = = = =
1 2 3 4 5 6 奶牛#1 可以看见奶牛#2, 3, 4的头顶
奶牛#2 无法看到任何奶牛的头顶
奶牛#3可以看见奶牛#4的头顶
奶牛#4无法看到任何奶牛的头顶
奶牛#5可以看见奶牛#6的头顶
奶牛#6无法看到任何奶牛的头顶!
用ci表示奶牛i能够看到头顶的奶牛个数;请计算c1 至cN的和。对于上面这个例子,其和为:3 + 0 + 1 + 0 + 1 + 0 = 5。
时间限制:2000
内存限制:65536
输入
第1行:奶牛数N第2行至N+1行:第i+1行包含一个整数,表示奶牛i的高度
输出
第1行:c1 至cN的累加和
样例输入
6
10
3
7
4
12
2
样例输出
5

这个问题可以通过使用栈来解决。我们可以从左到右遍历奶牛的身高,维护一个递增的栈,栈中存储的是奶牛的身高。

对于每只奶牛,我们需要找到它能看到的头顶奶牛数量。我们可以从栈顶开始,比较当前奶牛的身高和栈顶奶牛的身高。如果当前奶牛的身高大于栈顶奶牛的身高,那么栈顶奶牛就不会被当前奶牛看到,我们可以将其从栈中弹出。在这个过程中,我们可以计算栈顶奶牛能看到的头顶奶牛数量,并将其累加到最终的结果中。

最后,我们将当前奶牛的身高入栈。重复以上步骤直到遍历完所有的奶牛。

以下是一个用C语言实现的解答示例:

#include <stdio.h>#define MAX_SIZE 80000typedef struct {int height;int count;
} Cow;typedef struct {Cow data[MAX_SIZE];int top;
} Stack;void initStack(Stack *stack) {stack->top = -1;
}void push(Stack *stack, Cow value) {stack->data[++stack->top] = value;
}Cow pop(Stack *stack) {return stack->data[stack->top--];
}Cow top(Stack *stack) {return stack->data[stack->top];
}int main() {int N;scanf("%d", &N);Cow cows[MAX_SIZE];int i;for (i = 0; i < N; i++) {scanf("%d", &(cows[i].height));cows[i].count = 0;}Stack stack;initStack(&stack);long long total = 0;for (i = 0; i < N; i++) {while (stack.top >= 0 && cows[i].height >= top(&stack).height) {cows[i].count += top(&stack).count + 1;pop(&stack);}total += cows[i].count;push(&stack, cows[i]);}printf("%lld\n", total);return 0;
}

该程序首先定义了奶牛(Cow)和栈(Stack)的结构体。奶牛结构体包含奶牛的身高和能看到的头顶奶牛数量,栈结构体用于存储奶牛。

在主函数中,首先读取奶牛的数量N,并初始化奶牛数组。然后,使用一个循环从输入中读取每只奶牛的身高,并将其存储在奶牛数组中。同时,初始化一个栈。

接下来,使用一个循环遍历奶牛数组。对于每只奶牛,我们从栈顶开始,比较当前奶牛的身高和栈顶奶牛的身高。如果当前奶牛的身高大于栈顶奶牛的身高,我们将栈顶奶牛从栈中弹出,并计算栈顶奶牛能看到的头顶奶牛数量。然后,将这个数量累加到当前奶牛的count属性中。重复以上步骤直到当前奶牛的身高小于等于栈顶奶牛的身高。最后,将当前奶牛入栈。

在遍历完所有奶牛后,我们将每只奶牛的count属性累加到总和total中,并输出结果。

注意:由于结果可能非常大,所以使用了long long类型来保存总和total。

第4题:合影效果

小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?
时间限制:1000
内存限制:65536
输入
第一行是人数n(2 <= n <= 40,且至少有1个男生和1个女生)。 后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数,单位米),两个数据之间以空格分隔。
输出
n个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后2位,相邻两个数之间用单个空格隔开。
样例输入
6
male 1.72
male 1.78
female 1.61
male 1.65
female 1.70
female 1.56
样例输出
1.65 1.72 1.78 1.70 1.61 1.56

这个问题可以通过对输入进行处理,并按照规定的顺序排列人的身高来解决。

首先,我们可以创建一个结构体来表示每个人,包括其性别和身高信息。

然后,我们可以根据输入的性别和身高信息,将男生和女生分别存储在两个不同的数组中。

接下来,我们可以对男生数组按照身高从矮到高进行排序,并对女生数组按照身高从高到矮进行排序。

最后,我们可以创建一个结果数组,按照排好序的顺序将男生和女生的身高依次填入。

以下是一个用C语言实现的解答示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_SIZE 40typedef struct {char gender[10];float height;
} Person;int compare(const void *a, const void *b) {Person *personA = (Person *)a;Person *personB = (Person *)b;if (strcmp(personA->gender, "male") == 0 && strcmp(personB->gender, "male") == 0) {return personA->height - personB->height;} else if (strcmp(personA->gender, "female") == 0 && strcmp(personB->gender, "female") == 0) {return personB->height - personA->height;} else if (strcmp(personA->gender, "male") == 0 && strcmp(personB->gender, "female") == 0) {return -1;} else {return 1;}
}int main() {int n;scanf("%d", &n);Person people[MAX_SIZE];Person males[MAX_SIZE];Person females[MAX_SIZE];int maleCount = 0;int femaleCount = 0;int i;for (i = 0; i < n; i++) {scanf("%s %f", people[i].gender, &(people[i].height));if (strcmp(people[i].gender, "male") == 0) {males[maleCount++] = people[i];} else {females[femaleCount++] = people[i];}}qsort(males, maleCount, sizeof(Person), compare);qsort(females, femaleCount, sizeof(Person), compare);float result[MAX_SIZE];int resultCount = 0;int maleIndex = 0;int femaleIndex = 0;for (i = 0; i < n; i++) {if (strcmp(males[maleIndex].gender, "male") == 0) {result[resultCount++] = males[maleIndex++].height;} else {result[resultCount++] = females[femaleIndex++].height;}}for (i = 0; i < n; i++) {printf("%.2f ", result[i]);}printf("\n");return 0;
}

该程序首先定义了一个表示人的结构体(Person),其中包括性别和身高属性。

在主函数中,首先读取人数n,并创建用于存储所有人的数组(people)以及男生(males)和女生(females)的数组。

然后,使用一个循环从输入中读取每个人的性别和身高,并将其存储在对应的数组中。

接下来,使用qsort函数对男生和女生的数组进行排序,排序规则由compare函数定义。compare函数首先比较性别,如果都是男生或女生,则按照身高从矮到高或从高到矮排序;如果一个是男生一个是女生,则男生在前,女生在后。

最后,创建一个结果数组(result)和一个计数变量(resultCount),并使用两个索引变量(maleIndex和femaleIndex)分别指向男生数组和女生数组的起始位置。使用一个循环将男生和女生的身高按照排好序的顺序依次填入结果数组,并增加计数变量的值。

最后,使用一个循环输出结果数组中的身高,保留两位小数,并用空格隔开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_165826.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lambda表达式第三版

1、函数式编程思想概述 在数学中&#xff0c;函数就是有输入量、输出量的一套计算方案&#xff0c;也就是”拿数据做操作“面向对象思想强调”必须通过对象的形式来做事情“函数式思想则尽量忽略面向对象的复杂语法&#xff1a;”强调做什么&#xff0c;而不是以什么形式去做&a…

STM32F4XX/APM32F4XX USB OTA升级

近期在研究USB CDC协议&#xff0c;使用USB Virtual Port Com功能与上位机通讯做了OTA功能。开发平台&#xff1a;MDK529 开发硬件&#xff1a;APM32F411 首先看下手册Flash分布&#xff0c;Flash总共8个扇区。 接下来进行Flash分区。 扇区 0 和 扇区 1做Boo区。 扇区 2做APP跳…

添加YDNS免费的ipv6动态域名解析

背景 又到了一年一度的dns域名到期&#xff0c;寻找替代了&#xff0c;前几年用了阿里、华为的免费域名&#xff0c;支持了几个搭建在NAS上的微服务&#xff1b;一旦涉及到域名续费&#xff0c;价格就比首年上去了不少&#xff0c;所以&#xff0c;打算找个长期的免费域名。 搜…

学信网学历电子注册备案表 下载方法

如果你需要成人高考的专升本 那么就会需要 学信网学历电子注册备案表 全称叫 教育部学历证书电子注册备案表 是学信网依托全国高等教育学生信息数据库&#xff0c;对学生的学历信息提供的在线验证报告&#xff0c;是我们验证学历真伪的一份报告 学历电子注册备案表在 考研、考…

企业如何充分借助大数据下精准营销?

技术的发展和智能终端的普及移动互联网用户的大规模增长使移动互联网快速发展&#xff0c;使中国移动互联网软件进入移动互联网时代越来越多地涉及到改变生活大家习惯。移动互联网时代的到来也意味着大数据时代的到来。精准营销数据方法&#xff0c;移动互联网和大数据的兴起不…

Unity通过偏移UV播放序列帧动画

大家好&#xff0c;我是阿赵。   在Unity引擎里面用shader播放序列图&#xff0c;估计很多人都有用到了&#xff0c;我自己而已写过好几个版本。这里大概介绍一下。 一、原理 先说目的&#xff0c;我现在有一张这样的图片&#xff1a; 这张图片上面&#xff0c;有9个格子&a…

Power View

界面 切换可视化效果 对于已经上传到透视表的数据&#xff0c;选择power view&#xff0c;形成表格后。

vcruntime140_1.dll丢失的三个修复方法,【vcruntime140_1修复工具下载】

大家好&#xff01;今天&#xff0c;我将为大家介绍一个关于计算机vcruntime140_1.dll丢失的问题。在我们的日常生活和学习中&#xff0c;计算机出现问题是常有的事情。有时候&#xff0c;我们可能会遇到一些令人头疼的问题&#xff0c;比如vcruntime140_1.dll丢失。那么&#…

利用frps搭建本地自签名https服务的透传

nginx的搭建就不介绍了&#xff0c;教程很多&#xff0c;基本上油手就会。 在本例中&#xff0c;frp服务器的域名是 www.yourfrp.com&#xff0c;同时也是反向代理nginx服务器; 本地网站要用的域名&#xff1a; test.abcd.com 请事先将 test.abcd.com 解析到 frp所在服务器…

springboot web开发springmvc自动配置原理

前言 我们也知道springboot启用springmvc基本不用做什么配置可以很方便就使用了但是不了解原理,开发过程中遇到点问题估计就比较头疼,不管了解的深不深入,先巴拉一番再说… 下面我们先看看官网…我的版本是2.3.2版本,发现官网改动也比较大…不同版本自己巴拉下吧,结构虽然变化…

vue项目——表情选择器

组件库地址&#xff1a;https://www.npmjs.com/package/emoji-mart-vue 1、下载 npm install --save emoji-mart-vue 2、引入 import { Picker } from emoji-mart-vueexport default {components: {Picker} }3、使用 <picker set"emojione" /> <picker …

kafka详解一

kafka详解一 1、消息引擎背景 根据维基百科的定义&#xff0c;消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息&#xff0c;实现松耦合的异步式数据传递. 即&#xff1a;系统 A 发送消息给消息引擎系统&#xff0c;系统 B 从消息引擎系统中读取 A…

又一关键系统上线,理想车云和自动驾驶系统登陆OceanBase

8 月 1 日&#xff0c;理想汽车公布 7 月交付数据&#xff0c;理想汽车 2023 年 7 月共交付新车 34,134 辆&#xff0c;同比增长 227.5%&#xff0c;并已连续两个月交付量突破三万。至此&#xff0c;理想汽车 2023 年累计交付量已经达到 173,251 辆&#xff0c;远超 2022 年全年…

protues仿真时有时候串口虚拟中端不弹窗的问题

在使用proteus的时候&#xff0c;有时候你会发现点击调试开始运行后&#xff0c;串口虚拟终端没有自动弹窗的问题&#xff0c;其实照成这种现象的原因是你在使用的过程中移动了器件位置或者是对整个视窗使用鼠标滚动进行缩放了&#xff0c;如果要重新弹窗则需要进行以下操作: …

以antd为例 React+Typescript 引入第三方UI库

本文 我们来说说 第三方UI库 其实应用市场上的 第三方UI库都是非常优秀的 那么 react 我们比较熟的肯定还是 antd 我们还是来用它作为演示 这边 我们先访问他的官网 https://3x.ant.design/index-cn 点击开始使用 在左侧 有一个 在 TypeScript 中使用 通过图标我们也可以看出…

2022年03月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:多项式相加 我们经常遇到两多项式相加的情况, 在这里, 我们就需要用程序来模拟实现把两个多项式相加到一起。 首先, 我们会有两个多项式,每个多项式是独立的一行, 每个多项式由系数、 幂数这样的多个整数对来表示。 如多项式 2…

一个面向MCU的小型前后台系统

JxOS简介 JxOS面向MCU的小型前后台系统&#xff0c;提供消息、事件等服务&#xff0c;以及软件定时器&#xff0c;低功耗管理&#xff0c;按键&#xff0c;led等常用功能模块。 gitee仓库地址为&#xff08;复制到浏览器打开&#xff09;&#xff1a; https://gitee.com/jer…

Spring Boot日志基础使用 设置日志级别

然后 我们来说日志 日志在实际开发中还是非常重要的 即可记录项目状态和一些特殊情况发生 因为 我们这里不是将项目 所以 讲的也不会特别深 基本还是将Spring Boot的日志设置或控制这一类的东西 相对业务的领域我们就不涉及了 日志 log 初期最明显的作用在于 开发中 你可以用…

Java智慧工地源码 智慧工地APP源码

Java智慧工地源码 智慧工地APP源码 系统定义&#xff1a; 智慧工地信息化管理平台是依托计算机信息、网络通讯、物联网、系统集成及云计算技术&#xff0c;通过数据采集、信息动态交互、智能分析&#xff0c;建立起来的一套集成的项目建设综合管理系统。实现项目管理信息化、网…

【重要】NAND Flash基础知识简介

NAND Flash是一种非易失存储介质&#xff08;掉电后数据不会丢失&#xff09;&#xff0c;常见的U盘、TF卡/SD卡&#xff0c;以及大部分SSD&#xff08;固态硬盘&#xff09;都是由它组成的。 本文主要介绍其组成及工作原理。 为了表述方便&#xff0c;后面所说的Flash仅指NAN…