信息学奥赛初赛天天练-22-C++基础关键字、进制转换、结构体与联合体的实用技巧大揭秘

本文主要是介绍信息学奥赛初赛天天练-22-C++基础关键字、进制转换、结构体与联合体的实用技巧大揭秘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PDF文档公众号回复关键字:20240607

在这里插入图片描述

单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)

1 在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?( )

A unsigned

B const

C static

D mutable

2 八进制数12345670(8) 和07654321(8)的和为( )

A 22222221(8)

B 21111111(8)

C 22111111(8)

D 22222211(8)

3 阅读下述代码,请问修改data的value成员以存储3.14,正确的方式是( )。

union Data{int num;    float value;    char symbol;
};
union Data data;

A data.value = 3.14;

B value.data = 3.14;

C data->value = 3.14;

D value->data = 3.14;

9 数101010(2)和166(8)的和为( )

A 10110000(2)

B 236(8)

C 158(10)

D A0(16)

2 相关知识点

1) C++ 关键字

unsigned 关键字

用于声明无符号整数类型。无符号整数类型只能表示非负整数,即它们的值总是大于或等于零

例如

short是16为二进制组成,第1位是符号位,表示范围-32768~32767之间
unsigned short是16为二进制组成,无符号位, 表示范围0~65535之间

#include<bits/stdc++.h>
using namespace std;
/*无符号关键字short是16为二进制组成,第1位是符号位,表示范围-32768~32767之间unsigned short是16为二进制组成,无符号位, 表示范围0~65535之间
*/ 
int main(){short a=32769;//超出了short的范围 unsigned short b=32769;//在范围内可以正常表示 cout<<"a的值为:"<<a<<endl; //输出不正确 cout<<"b的值为:"<<b<<endl;return 0;
}
/* 
a的值为:-32767 
b的值为:32769
*/

static 关键字

在 C 和 C++ 中,当变量被声明为 static 时,它会在程序的整个执行期间存在,而不仅仅是定义它的代码块(例如函数)的执行期间。这意味着 static 变量在函数调用之间保持其值

主要在不同作用域或对象之间共享数据

const 关键字

在 C++ 中,const 是一个类型修饰符,用于指定一个变量或对象的值是不可更改的。这意味着一旦为 const 变量分配了初始值,就不能再对其进行修改

#include<bits/stdc++.h>
using namespace std;
const int a=10; 
int main(){//改变const 关键字修饰变量的值 编译会出错 a=3;// [Error] assignment of read-only variable 'a' cout<<a;return 0;
}

mutable 关键字

在声明const的成员函数,不能修改成员变量,如果成员函数声明时加 mutable则可以修改

#include <iostream>
using namespace std;class Test {
public:Test(int c):counter(c){}//构造函数 并为counter字段赋值 /* 声明为const函数,表示不会修改类的成员属性,但是mutable的属性除外 */int getValue() const;
private:mutable int counter;
};int Test::getValue() const {counter++;  // 允许在 const 成员函数中修改 mutable 成员变量return counter;
}int main()
{Test mc = 1;cout << mc.getValue() << endl;return 0;
}

2) 进制转换

R进制转十进制

按权展开,但要注意各个位的权,最低位(最右边)的权是0次方,权值为1

(11010110)2=1×2^7+1×2^6+0×2^5+1×2^4+0×2^3+1×2^2+1×2^1+0×2^0=(214)10

十进制整数转R进制

十进制小数转R进制

二进制转八进制

二进制转换成八进制的方法是,取三合一法,即从二进制的小数点为分界点,向左(或向右)每三位取成一位

(1010 0100)B = (010 001 100 )B=(244)O

八进制转二进制

二进制转换成八进制的反向操作

(244)O=(010 001 100 )B=(1010 0100)B

二进制转十六进制

二进制转换成十六进制的方法是,取四合一法,即从二进制的小数点为分界点,向左(或向右)每四位取成一位

(10100100)B = (1010 0100)B = (A4)H

十六进制转二进制

二进制转换成十六进制的反向操作

(A4)H = (1010 0100)B =(10100100)B

3) 不同进制加法

进制不同不能直接相加,需转换成相同进制再进行相加

二进制相加

//类似十进制相加,不同的是逢二进一
5+9=14
(5)10=(0101)2,(9)10=(1001)20101
+1001
------1110
二进制 1110 转10进制
(1110)2=1*2^3+1*2^2+1*2^1=14

八进制相加

//类似十进制相加,不同的是逢8进一
5+9=14
(5)10=(5)8,(9)10=(11)205
+11
------16
八进制 16 转10进制 
(16)8=1*8^1+6*8^0=8+6=14

4) struct 结构体

struct 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,是一种复合数据类型,结构类型

#include<bits/stdc++.h>
using namespace std;
//定义一个结构体,可以把多个不同的变量 组织在一起 
struct stu{string no;//学号 string name;//姓名 int age;//年龄 
}; int main(){stu stu1;stu1.no="001";//001赋值给stu1的nostu1.name="张三";//张三赋值给stu1的namestu1.age=18;//18赋值给stu1的agecout<<"学号:"<<stu1.no<<endl;//输出结构体stu1的学号cout<<"姓名:"<<stu1.name<<endl;//输出结构体stu1的姓名cout<<"年龄:"<<stu1.age;//输出结构体stu1的年龄return 0;
}

5) union 联合体

在 C++ 中,union 是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。union 可以帮助节省内存,因为它们使用相同的内存空间来存储不同的数据类型,但是只能同时存储其中一个

在定义 union 时,所有成员共享同一块内存空间。当为 union 的某个成员赋值时,会覆盖 union 中已有的值。这也是 union 的一个特点:它不会记录哪个成员是当前有效的,因此在使用 union 时,需要确保对应的成员是正确的

#include <iostream>
using namespace std;
/*定义union联合体,联合体内多个变量共享内存内存大小和占用空间最大的变量相同同一时刻只有一个变量的值是有效的 
*/ 
union MyUnion {int i;double d;char c;
};int main() {MyUnion u;u.i = 42;//给联合体变量i赋值 cout << "联合体变量i的值:" << u.i << endl;//输出42,其他2个变量d和c无效 u.d = 3.14159;//给联合体变量d赋值cout << "联合体变量d的值:" << u.d << endl;//输出3.14159,其他2个变量i和c无效u.c = 'A';//给联合体变量d赋值cout << "联合体变量c的值:" << u.c << endl;//输出A,其他2个变量i和d无效return 0;
}

6) 结构体(struct)和联合体(union)区别

在 struct 中,每个成员都有自己的内存空间,在 union 中,所有成员共享同一块内存空间,union 的大小取决于其最大的成员

struct 中的成员可以同时存在,每个成员都有自己的地址,union 中的成员共享相同的内存,同一时刻只能存储一个成员的值

struct 的大小等于其所有成员大小的总和,每个成员都有独立的内存空间,union 的大小等于其最大成员的大小,各变量共享内存

#include <iostream>
using namespace std;
/*定义结构体 MyStruct内包括3个变量,这3个变量被组织到一起,可以同时使用 
*/ 
struct MyStruct {//占用空间必须是最大占用空间变量的整数倍 
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8) int i;
//d 占用8个字节 (8) double d;
//c 占用1个字节 需要补7个字节到8个字节 (8) char c;
};//所以 MyStruct总共占用24个字节 struct MyStruct1 {//占用空间必须是最大占用空间变量的整数倍 
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8) int i;
//d 占用8个字节  (8) double d;
//用4个字节 和后面c一起补足8个字节 (j,c一起再补足3个字节)  (8) int j;
//c 占用1个字节 char c;
};//所以 MyStruct1总共占用24个字节struct MyStruct2 {//占用空间必须是最大占用空间变量的整数倍
//i 占用4个字节 需要补4个字节够8个字节,因为后面够8个字节 (8) int i; 
//d 占用8个字节  (8)double d;
//j用4个字节 补足8个字节  (8) int j;
//d1 占用8个字节  (8)double d1;
//c 占用1个字节 补足8个字节  (8)  char c;
};//所以 MyStruct1总共占用40个字节/*定义一个联合体 MyUnion内包括3个不同类型变量 这3个变量同时只能使用一个 占用空间,联合体变量占用空间最大的变量 
*/ 
union MyUnion {int i;//i占用4个字节 double d;//d占用8个字节 char c;//c占用1个字节 
};//联合体占用空间为8个字节 int main() {cout << "struct占用内存空间大小:" << sizeof(MyStruct) << " bytes" << endl;cout << "struct1占用内存空间大小:" << sizeof(MyStruct1) << " bytes" << endl;cout << "struct2占用内存空间大小:" << sizeof(MyStruct2) << " bytes" << endl;cout << "union占用内存空间大小:" << sizeof(MyUnion) << " bytes" << endl;MyStruct s;s.i = 42;s.d = 3.14;s.c = 'A';cout << "Struct的值: " << s.i << ", " << s.d << ", " << s.c << endl;MyUnion u;u.i = 42;cout << "联合体i的值: " << u.i << endl;u.d = 3.14;cout << "联合体重新赋值后d的值: " << u.d << endl;return 0;
}

3 思路分析

1 在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?( )

A unsigned

B const

C static

D mutable

答案 B

分析

unsigned 为无符号,只影响数据类型的取值范围

const 为不可修改关键字,const在变量前,此变量为常量,不能修改,修改编译会报错

static 为静态变量,被static关键字修饰后,可以在多个对象直接共享此变量,都可以修改

mutable 和const配合使用,在定义为const的函数使用mutable关键词修饰的变量,可以修改

2 八进制数12345670(8) 和07654321(8)的和为( )

A 22222221(8)

B 21111111(8)

C 22111111(8)

D 22222211(8)

答案 D

分析

由于相加的2个数都是8进制,因此可以直接相加,逢八进一

 12345670
+07654321
---------22222211

3 阅读下述代码,请问修改data的value成员以存储3.14,正确的方式是( )。

union Data{int num;    float value;    char symbol;
};
union Data data;

A data.value = 3.14;

B value.data = 3.14;

C data->value = 3.14;

D value->data = 3.14;

答案 A

Union 为联合体,和 struct 类似,赋值应用.运算符

9 数101010(2)和166(8)的和为( )

A 10110000(2)

B 236(8)

C 158(10)

D A0(16)

答案 D

转换统一进制后再计算

这篇关于信息学奥赛初赛天天练-22-C++基础关键字、进制转换、结构体与联合体的实用技巧大揭秘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041269

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi