【C++刷题集】-- day2

news2024/9/22 5:38:00

目录

选择题

单选

编程题

OR62 倒置字符串⭐

【题目解析】

【解题思路1】

【解题思路2】

【解题思路3】

排序子序列⭐

【题目解析】 

【解题思路】


选择题

单选

1、使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?

%-30.4e

%4.30e

%-30.4f

%-4.30f

正确答案:


解析:

来源:http://t.csdn.cn/Yz59M

转换说明符
转换说明符描述
%d有符号十进制整数
%i有符号十进制整数
%u无符号十进制整数
%o八进制整数
%x十六进制整数(小写字母)
%X十六进制整数(大写字母)
%f浮点数
%e用科学计数法表示的浮点数(小写字母e)
%E用科学计数法表示的浮点数(大写字母E)
%g根据数值的大小自动选择%f%e格式
%G根据数值的大小自动选择%f%E格式
%c单个字符
%s字符串
%p指针地址
%n将已打印字符数保存在整型指针中
%%打印一个百分号
  • %-m.nf
    • -m:前加号,表示左对齐(不加 号,为右对齐),m为对齐的宽度。
    • n:小数点后保留位数。

----------------------------------------------

2、请找出下面程序中有哪些错误()

int main() {
	int i = 10;
	int j = 1;
	const int* p1;//(1)
	int const* p2 = &i; //(2)
	p2 = &j;//(3)
	int* const p3 = &i;//(4)
	*p3 = 20;//(5)
	*p2 = 30;//(6)
	p3 = &j;//(7)
	return 0;
}

1,2,3,4,5,6,7

1,3,5,6

6,7

3,5

正确答案:


解析:

  • 常量指针:指针所指空间的值是不能发生改变的,不能通过指针解引用修改指针所指向的空间的值,但是指针的指向是可以发生改变的。
  • 指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值是可以发生的,可以通过指针解引用改变指针所指空间的值。
  • 区分:const与*的相对位置
    • const在*的左边 -- 常量指针
    • const在*的右边 -- 指针常量

(1) (2) 常量指针

(3) 常量指针的指向可以发生改变

(4) 指针常量

(5) 指针常量可以通过解引用改变所指空间的值

(6) 常量指针可以通过解引用改变所指空间的值

(7) 指针常量的指向可以发生改变

----------------------------------------------

3、下面叙述错误的是()

char acX[]="abc";
char acY[]={'a','b','c'};
char *szX="abc";
char *szY="abc";

acX与acY的内容可以修改

szX与szY指向同一个地址

acX占用的内存空间比acY占用的大

szX的内容修改后,szY的内容也会被更改

正确答案:


解析:

  • A、正确:acX与acY都是字符数组,定义的时候是在栈上开辟的,内容是可以被修改的。
  • B、正确:szX与szY都是指针,指向的是同一个常量字符串,所以指向的是同一个地址。
  • C、正确:"abc"与{'a', 'b', 'c'},第一个是字符串,第二个是字符数组,字符串是最后默认有一个 '\0' ,而这个 '\0' 最后也是会占一个空间的。
  • D、错误:szX的指向发生改变,根本就不会影响到szY的指向。

----------------------------------------------

4、在头文件及上下文均正常的情况下,下列代码的运行结果是()

int a[] = {1, 2, 3, 4};
int *b = a;
*b += 2;
*(b + 2) = 2;
b++;
printf("%d,%d\n", *b, *(b + 2));

1,3

1,2

2,4

3,2

正确答案:


解析:

int a[] = {1, 2, 3, 4};
int *b = a;

*b += 2;

        优先级高于 += 所以是首先对 b 解引用,获取到数组首元素,然后进行 += 2。

*(b + 2) = 2;

        先将指针 b 向后临时偏移 2 个指针类型大小 (int),然后解引用获取到数组第三个元素,并改为2。

        将b指向的内容更改为原指向的后 1 个指针类型大小 (int) 的位置。

b++;

printf("%d,%d\n", *b, *(b + 2));

----------------------------------------------

5、下列关于C/C++的宏定义,不正确的是()

宏定义不检查参数正确性,会有安全隐患

宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量

宏的嵌套定义过多会影响程序的可读性,而且很容易出错

相对于函数调用,宏定义可以提高程序的运行效率

正确答案:


解析:

  • A、正确:宏定义是没有类型安全检测的。
  • B、错误:是恰恰的说反了,因为宏定义是没有类型安全检测的,并且是在预处理阶段进行的宏替换,所以是无法进行调试的,所以说我们要尽量使用const常量,而不是说避免使用const常量。
  • C、正确:因为宏的定义可能会导致运算符优先级的问题,会很容易导致出错。
  • D、正确:宏定义相对于函数调用,是没有创建函数栈帧和进行函数压栈的开销,所以是可以提高程序的运行效率的。

----------------------------------------------

6、有以下定义:

int a[10];
char b[80];

函数声明为:

void sss(char[],int[]);

则正确的函数调用形式是()

sss(a,b);

sss(char b[],int a[]);

sss(b[],a[]);

sss(b,a);

正确答案:


解析:

        函数在调用的时候,如果函数的参数是数组类型的话,在调用的时候传入数组名(数组的地址)就可以了。

  • A、错误:写反了。
  • B、错误:写了数据类型。
  • C、错误:不可以加[]。

----------------------------------------------

7、用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数()

int *a[10];

int (*a)[10];

int (*a)(int);

int (*a[10])(int);

正确答案:


解析:

  • A、错误:[]的优先级是高于*的,所以是一个存放int*类型的10个元素的指针数组
  • B、错误:由于加了(),所以a先和*进行结合也就是一个指针,然后指针指向的是一个带[]的int类型,所以指向的是数组,然后数组的大小为10,就是一个数组指针
  • C、错误:由于加了(),所以a先和*进行结合也就是一个指针,然后指针指向的是一个带()的int类型,所以指向的是函数。所以是一个函数指针,指向的是参数为int,返回值为int的一个函数。
  • D、正确:其在C的基础上将 (*a) 变为 (*a[10]) 其就会先与[]进行结合,表示一个数组,然后该数组存储的类型为int (*) (int),所以该数组存放的是函数指针,是一个函数指针数组,指向的是10个参数为int,返回值为int的一个函数。。

----------------------------------------------

8、以下 C++ 函数的功能是统计给定输入中每个大写字母的出现次数(不需要检查输入合法性,所有字母都为大写),则应在横线处填入的代码为()

void AlphabetCounting(char a[], int n) {
	int count[26] = {}, i, kind = 10;
	for (i = 0; i < n; ++i)
		_________________;
	for (i = 0; i < 26; ++i) {
		printf("%c=%d", _____, _____);
	}
}

++count[a[i]-'Z']

     'Z'-i

     count['Z'-i]

++count['A'-a[i]]

     'A'+i

     count[i]

++count[i]

     i

     count[i]

++count['Z'-a[i]]

     'Z'-i

     count[i]

正确答案:


解析:

  • A、错误:a[i]-'Z' <= 0
  • B、错误:'A'-a[i] <= 0
  • C、错误:i的值取决于n,而n又是字符数组的大小,不满足题意,而且会越界访问。
  • D、正确:'Z'-a[i] -> 'A'~'Z' = 25~0。

----------------------------------------------

9、在32位cpu上选择缺省对齐的情况下,有如下结构体定义:

struct A {
	unsigned a : 19;
	unsigned b : 11;
	unsigned c : 4;
	unsigned d : 29;
	char index;
};

则sizeof(struct A)的值为()

9

12

16

20

正确答案:


解析:

        是以位段的形式进行定义的,':' 后面的数子是表示该变量所占的bit位个数。

        由于第一个a是unsigned类型,所以是4字节(32bit),然后其会一一更具后续位断填充,直到空间不够就会开辟下一个变量的类型大小,继续放位断。

         但是由于内存对齐,所以最后的大小需要是最大宽度的整数倍,就是是4的整数倍,也就是16

----------------------------------------------

10、下面代码会输出()

int main() {
	int a[4] = { 1,2,3,4 };
	int* ptr = (int*)(&a + 1);
	printf("%d", *(ptr - 1));
}

4

1

2

3

正确答案:


解析:

        需要注意数组名取地址是数组指针,数组指针是指向数组首元素的,+1是向后指针类型的大小,也就是int * [4]整个数组的大小。

        最后printf打印中,由于ptr是int类型的指针,所以是向前移动一个int类型的距离,所以最后结果是4

编程题

OR62 倒置字符串⭐

倒置字符串_牛客题霸_牛客网 (nowcoder.com)

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

【题目解析】

        本题题意很简单,就是将一段字符串中的前后单词交换,以单词为单位逆置。

【解题思路1】

        多创建一个string变量,再遍历字符串,找出分界线' ',再输入多创建的string变量。这里我们使用了string中的substr。

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    // 注意这里要使用getline,cin>>s遇到空格就接收结束了
    getline(cin, str);

    // 额外开辟一个string变量用于逆置
    string ret_str;
    int len = 0;
    for(int i = str.size() - 1; i>=0; i--)
    {
        if(str[i] == ' ')
        {
            // 跳过空格,然后自行添加
            ret_str += str.substr(i + 1, len);
            ret_str += ' ';
            i--;
            len = 0;
        }
        len++;
    }
    // 最开始的单词
    ret_str += str.substr(0 , len);
    ret_str += ' ';
    cout << ret_str << endl;
}

【解题思路2】

        先将整个字符串逆置过来,再遍历字符串,找出每个单词,对单词逆置。这里我们使用了stl算法中的reverse,所以这里使用迭代器遍历string。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
    string str;
    // 注意这里要使用getline,cin>>s遇到空格就接收结束了
    getline(cin, str);

    // 翻转整个句子
    reverse(str.begin(), str.end());

    // 翻转单词
    string::iterator start = str.begin();
    while (start != str.end()) {
        string::iterator end = start;
        while (end != str.end() && *end != ' ')
            end++;
        reverse(start, end);
        if (end != str.end())
            start = end + 1;
        else
            start = end;
    }
    cout << str << endl;
    return 0;
}

【解题思路3】

        直接利用cin>>s接收输入,遇到空格就结束了,自然就分割开了每个单词,其次将每次接收到的单词拼接到之前串的前面就逆置过来了。

#include <iostream>
#include <string>
using namespace std;
// cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出
int main() {
    string str_tmp, str;
    cin >> str;
    while (cin >> str_tmp)
        str = str_tmp + " " + str;
    cout << str << endl;
    return 0;
}

排序子序列⭐

排序子序列_牛客笔试题_牛客网 (nowcoder.com)


        牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列。

【题目解析】 

        本题要求解的是排序子序列,排序子序列为非递增或者非递减,很多同学在这个非递增、非递减问题上很纠结,注意:非递减就是a[i]<=a[i+1],递减就是a[i]>a[i+1],非递增就是a[i]>=a[i+1],递增就是a[i]<a[i+1]。 其实这个不理解网上搜一下就理解了。

【解题思路】

解题思路:
  1. 本题依次比较整个数组。
  2. a[i+1]>a[i] ,则进入非递减序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位置的判断。
  3. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位置的判断。
  4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减序列。
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a;
    a.resize(n, 0);

    //读入数组
    int i = 0;
    for (i = 0; i < n; ++i)
        cin >> a[i];

    i = 0;
    int count = 0;
    while (i < n) 
    {
        if (a[i] < a[i + 1]) 
        {
            while (i < n && a[i] <= a[i + 1])
                i++;
            count++;
            if(i < n) i++;
        } 
        else if (a[i] == a[i + 1]) 
            i++;
        else 
        {
            // 非递增子序列
            while (i < n && a[i] >= a[i + 1])
                i++;
            count++;
            if(i < n) i++;
        }
    }
    cout << count << endl;
    return 0;
}

Note:需要注意上述的代码跑的通是由于越界了牛客测不出来

         i < n 的情况会导致 a[i] a[i+1] 的越界,并且我们需要注意到,并不是开辟 n + 1 就够了,而是要开辟 n + 2

#:最后一个子序列是非递减序列情况

         (i < n && a[i] <= a[i + 1]) 以情况循环至此,于是出现 a[i] > a[i + 1] ,所以会退出循环count++,但是此时 i = 2 < 3,i会继续++,所以是要开辟 n + 2 ! 

        此时就会因为 i = 3 = 3,而退出最外层循环。

#:最后一个子序列是非增减序列情况 

         (i < n && a[i] >= a[i + 1]) 以情况循环至此,于是出现 a[i] > a[i + 1] ,所以会继续循环,i会继续++,所以是要开辟 n + 2

        此时虽然照样满足 a[i] >= a[i + 1] 但是因为 i = 3 < 3,而退出 (i < n && a[i] >= a[i + 1]) 的循环count++,并退出最外层循环。

#:最后一个子序列是单数字情况

         (i < n && a[i] <= a[i + 1]) 以情况循环至此,于是出现 a[i] > a[i + 1] ,所以会退出循环count++,但是此时 i = 1 < 3,i会继续++。

        接下就又是一个 a[i] > a[i + 1] 。然后会继续循环,所以是要开辟 n + 2

        此时虽然照样满足 a[i] >= a[i + 1] 但是因为 i = 3 < 3,而退出 (i < n && a[i] >= a[i + 1]) 的循环count++,并退出最外层循环。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a;
    a.resize(n + 2, 0);

    //读入数组
    int i = 0;
    for (i = 0; i < n; ++i)
        cin >> a[i];

    i = 0;
    int count = 0;
    while (i < n) 
    {
        if (a[i] < a[i + 1]) 
        {
            while (i < n && a[i] <= a[i + 1])
                i++;
            count++;
            if(i < n) i++;
        } 
        else if (a[i] == a[i + 1]) 
            i++;
        else 
        {
            // 非递增子序列
            while (i < n && a[i] >= a[i + 1])
                i++;
            count++;
            if(i < n) i++;
        }
    }
    cout << count << endl;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

儿童教育软件推荐

1、出口算题系统 胡迪数学运算练习 2、迪乐姆是上海和盛实业集团有限公司注册的教育品牌&#xff0c;涵盖人工智能、科学、艺术、运动、创造力等多元教育领域&#xff0c;提供自主知识产权的全套课程产品、师资培养体系、环境创设实施等一站式素质教育个性化服务。 [1] 截止到…

【Proteus仿真】51单片机串口输出实验

【Proteus仿真】51单片机串口输出实验 &#x1f4cc;相关篇《【Proteus仿真】51单片机Blink点灯实验》&#x1f516;Proteus仿真基础实验-串口输出。&#x1f33f;Proteus8.12平台&#x1f33f;本实验代码基于VSM Studio&#xff0c;采用SDCC编译器。&#x1f33f;调试串口波特…

计算机图形学-GAMES101-12阴影

Shadow mapping 问题的提出 我们之前在进行着色时&#xff0c;对于每个物体仅考虑自己&#xff0c;而不考虑其他物体对它的影响。限定在光栅化中&#xff0c;如何解决阴影问题呢&#xff1f;阴影能被摄像机看到&#xff0c;但不能被光源所照亮。经典的Shadow mapping只能处理…

POSTGRESQL EDB 企业版 PG 15 独有功能

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

基于SpringBoot的人事管理系统的设计与实现

背景 人事管理管理方面的任务繁琐,以至于公司每年都在人事管理这方面投入较多的精力却效果甚微,人事管理系统的目标就是为了能够缓解人事管理工作方面面临的压力,让人事管理方面的工作变得更加高效准确。 系统架构 考虑到实际生活中在人事管理方面的需要以及对该系统认真的分…

由浅入深Netty粘包与半包解决方案

目录 1 粘包现象2 半包现象3 现象分析4 解决方案4.1 方法1&#xff1a;短链接4.2&#xff1a;方法2&#xff1a;固定长度4.3 方法3&#xff1a;固定分隔符4.4 方法4&#xff1a;预设长度 1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log Logg…

ARM的基本数据处理指令与条件代码的使用

最开始在此介绍一下CPSR寄存器中 N、Z、C、V 4位的作用&#xff1a; Bit[28]&#xff08;V&#xff09;&#xff1a; 当运算器中进行加法运算且产生符号位进位时该位自动置1&#xff0c;否则为0 当运算器中进行减法运算且产生符号位借位时该位自动置0&#xff0c;否则为1 …

js 多个小程序之间互相跳转,a小程序带参跳转到b小程序中

小程序中实现两个或者多个小程序之间互相跳转&#xff0c;a小程序带参跳转到b小程序中。 官方入口&#xff1a;wx.navigateToMiniProgram(Object object) https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html 实现步骤&#xff1a; …

English Learning - L3 综合练习 3 VOA-Food 2023.05.17 周三

English Learning - L3 综合练习 3 VOA-Food 2023.05.17 周三 句 1句 2句 3句 4句 5句 6句 7句 8句 9句 10句 11句 12句 13句 14句 15结尾&#xff1a;注意力和记忆力&#xff0c;都是需要开垦的 句 1 注意后面的介词短语是当定语的 我们提供更多有关食物的表达。 they are f…

21 排序

文章目录 排序排序的基本概念排序方法的分类 插入排序直接插入排序性能分析代码实现 折半插入排序性能分析代码实现 希尔排序性能分析代码实现 交换排序冒泡排序分析和改进拓展&#xff08;提高冒泡效率的方法&#xff09;短路冒泡代码实现双向冒泡法&#xff08;鸡尾酒排序&am…

跟着NC学cfDNA全基因组片段化丰度谱分析

继续我们的跟着NC学系列&#xff0c;前面分享的是关于16S扩增子测序和宏基因组数据分析的。考虑到我们有许多小伙伴是做人类基因组方面的&#xff0c;这次分享一篇癌症早筛方面的&#xff0c;血液DELFI全基因组片段化丰度谱检测的分析框架。题目是&#xff1a;Detection and ch…

Fast-RCNN网络详解

文章目录 一、前言二、Fast-RCNN原理步骤2.1候选区域的生成2.2.ROI Pooling层2.3.分类器2.4.边界框的预测2.5.损失计算2.5.1.分类损失2.5.2.边界框回归损失 三、总结参考博客与视频、代码 一、前言 前面学习了SS算法、R-CNN网络&#xff0c;接下来继续学习Fast-RCNN网络。 本…

KingbaseES V8R3 备份恢复系列之 -- sys_rman备份过程分析

​ 案例说明&#xff1a; 本案例通过对KingbaseES sys_rman物理备份过程的详细描述&#xff0c;有助于在执行sys_rman过程中发生故障的分析。适用版本&#xff1a; KingbaseES V8R3 一、sys_rman执行过程简介 1. 调用select sys_start_backup()开始备份&#xff0c;sys_start_b…

028python-配置文件

配置文件&#xff1a;以properties 、config、ini、log4j等结尾的都是配置文件&#xff0c;里面的参数改一下&#xff0c;项目就可以按照不同的方式执行出来&#xff1b; configparser 可以去读取配置信息&#xff0c;configparser里面的类模块ConfigParser&#xff1b;配置文件…

SpringMVC 笔记

1. SpringMVC 简介 1.1 什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff…

Linux安装Docker(这应该是你看过的最简洁的安装教程)

Docker是一种开源的容器化平台&#xff0c;可以将应用程序及其依赖项打包成一个可移植的容器&#xff0c;以便在不同的环境中运行。Docker的核心是Docker引擎&#xff0c;它可以自动化应用程序的部署、扩展和管理&#xff0c;同时还提供了一个开放的API&#xff0c;可以与其他工…

一文带你了解MySQL之连接原理

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 搞数据库一个避不开的概念就是Join&#xff0c;翻译成中⽂就是连接。相信很多小伙伴初学连接的时候有些一脸懵&#xff0c;理解了连接的语义之后又可能不明白各个表中的记录到底是怎么连起…

用iOS版ChatGPT第一步:手把手带你注册美区Apple ID!(史上最简单)

大家好&#xff0c;我是鸟哥。 前两天ChatGPT官方毫无征兆的上线了iOS版&#xff0c;和网页版的相比功能和响应速度都提升了N个档次&#xff0c;具体看这篇文章&#xff1a;iOS版ChatGPT突然上线&#xff01;Plus用户笑疯了&#xff01; 但是呢&#xff0c;目前iOS版只在美区…

玩客云刷NAS

测试路由器支持IPV6 参考 这里 我用的是TPlink WDR7660 支持IPV6 主要设置桥模式 玩客云刷写固件 参考 这里 还有这里 玩客云固定IP 参考这里 sudo armbian-config 选择Network 选择有线网络->ip 选择static 然后根据自己情况进行设置 点击OK即可 更新国内源 参考这里 证书…

那就别担心了(DFS优化)30行代码简单易懂

下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题&#xff0c;其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”&#xff0c;即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题&#xff08;开玩笑的&#xff0c;千万别以为这是真正的逻辑…