【C++笔试强训】第二天

选择题

解析:考查printf%后面-表示输出左对齐,输出左对齐30个字符格式为%-30f.后面表示精度。%e字符以指数形势输出,可以认为是double类型(也就是小数点后保留6位)的指数。为%f字符表示输出格式为double类型。所以上面题目要求的格式为%-30.4f

image-20230324164231422

C语言中要求我们掌握的各种输出如下:

整形输出:%d整型输出,%ld长整型输出,%u以十进制数输出unsigned型数据(无符号数);

进制输出:%o以八进制数形式输出整数,%x以十六进制数形式输出整数;

字符输出:%c用来输出一个字符,%s用来输出一个字符串;

浮点数输出:%f用来输出实数,以小数形式输出,%e以指数形式输出实数,%g根据大小自动选f格式或e格式,且不输出无意义的零。

解析:本题考查const修饰及指针相关知识。

指针常量:指针是个常量,即指针的指向不能改变,指针指向空间的内容可以改变;

常量指针:指针指向的空间是个常量,指针指向空间的值不能改变,指针的指向可以改变。

我们判断是指针常量还是常量指针通常是看const*所在的位置,如int *const p3 = &iconst后面紧跟的就是指针变量p3,这就是指针常量,指针的指向不能改变,指针指向空间的内容可以改变;而int const *p2 = &iconst后面紧跟的是*p2,此时就是常量指针,指针的指向可以改变指针,指向空间的值不能改变。

(1)中const修饰的是*p1,是常量指针,指针的值不能改变,指针的指向可以改变。只不过该指针没有给初始值,正确;

(2)中const修饰的是*p2,常量指针,指针的值不能改变,指针的指向可以改变,正确;

(3)中p2 = &j改变了指针p2的指向,正确;

(4)中const修饰的是p3,是指针常量即指针的指向不能修改,指向空间的内容可以修改,正确;

(5)中修改了p3指向空间的内容,没有修改指针指向,正确;

(6)中想修改p2指向空间的内容,但是p2是常量指针,不能够修改,错误;

(7)中修改了p3指针的指向,但是p3是指针常量,不能修改指针指向,错误。

所以本题中错误的就是(6)、(7)。

image-20230324170831066

解析:本题主要考查常量字符串。acXacY都是存在栈区的字符数组,acXacY的区别在于acX存在\0,而acY中不存在\0,所以acX的空间比acY的空间大。而szXszY字符指针指向的常量字符串是存在常量区(静态区)的,szXszY这两个字符指针指向的是同一个地址,常量区的内容只能读不能被修改,所以D错误。

image-20230324172039301

解析:数组名表示数组首元素的地址, int *b = a意思就是指针b指向b的地址,而b表示的数组首元素的地址;*b得到的就是数组中第一个元素即1, *b += 2就是将数组中第一个元素修改为3;b + 2表示的是数组中第3个元素即数组元素3的地址, *(b + 2) = 2表示的是将数组中第3个元素修改为2;b++则表示b此时指向的地址是数组中第2个元素的地址。经过上面的修改之后数组就变为[3,2,2,4]则输出语句中*b表示的就是数组中第2个元素,即2;*(b+2)表示的是第4个元素,即4。所以最后输出结果为2,4。

image-20230324173049049

解析:宏定义在程序预处理的时候是在需要的地方直接展开的,所以不会检查参数的正确性,但可以减少函数调用所需的栈帧和压栈的消耗,可以提高运算效率;宏的嵌套过多可能会出现优先级的问题,容易出错且可读性差。我们平常使用要尽量避免宏定义常量,可以使用const修饰的常量,有类型的检查。所以选B。

image-20230324173327758

解析:本题主要考查数组传参。数组传参形参可以是数组,也可以是指针。如下面例子:
int arr[10]传参,他的参数用数组接收可以是 int arr[]或者int arr[10];用指针接收是int* arr。
int* arr[10]传参,他的参数用数组接收是int* arr[10],用指针接收是int** arr

image-20230324173559973

解析:本题考查指针数组、函数指针及函数指针数组。

指针数组:存放指针的数组。

函数指针:int(*pf)(int,int)中,int是函数返回类型,pf是函数指针变量,(int,int)是函数的参数类型,在调用函数的时候可以通过函数指针int ret = (*pf)(a,b),使用函数指针时,也可以省略*int ret = pf(a,b)

函数指针数组:可以存放多个返回类型相同和参数相同的函数的地址。可以写成int(*pf[5])(int, int)形式。

根据题目描述,可以理解为该变量是一个数组,里面有10个元素,每个元素都是一个函数指针,该函数指针返回类型是整型,参数是整数。所以该数组为函数指针数组,所以选D。A表示的是一个指针数组,数组元素类型为int*;B表示一个数组指针,指向数组的指针,存放数组的地址,a是数组指针变量;C表示的是一个返回类型为int,函数参数为int的函数指针变量。

image-20230324175444037

解析:可以假设数组a中元素为"ABZ",则当i = 0时,即第一个元素A时,A选项中,元素下标为负数,排除;当i = 1即元素为B时,B中数组下标也为负数,排除;C选项中count数组下标随着i变化,当数组中元素相同时,并不会累加。如数组元素为"AAA"时,并不能统计出A的个数是多少。D中当a数组元素为"ABZ"时,count数组元素下标是逆着来的,也就是字符A在数组count中的下标表示为26,所以打印的时候先输出的是Z的个数,D正确。

image-20230324180517791

解析:本题考查结构体内存对齐和位段。题目中unsigned就是指unsigned int,位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。因为是unsigned int类型,所以每次开辟4个字节。刚开始存储a时开辟4个字节即32个bit位,使用19个还剩13个,大于b所要使用的11个bit位,b继续使用,使用之后还剩2个不够c使用,需要再开辟4个字节的空间,c使用4个bit之后还剩28个,不够d使用,再开辟4个字节用来存储d。此时已经使用12个字节;而char类型变量index需要1个字节,所以总共使用了13个字节,但是结构体必须是最大对齐数的整数倍,即必须是4的倍数,所以是16。

image-20230324181922707

解析:&数组名表示取的是整个数组的地址。所以&a取的就是整个数组的地址,数组a中有4个元素,所以数组a的大小就是16个字节,(&a + 1)表示跳过整个数组,指向数组后面的那个地址,ptr - 1表示的是指向数组中最后一个元素。所以结果为4。

编程题

1.排序子序列

image-20230323092421400

解析:暴力解法,一个一个遍历和比较,如1 2 3 3 2 1,最开始先拿1和2比较,再比较2和3,依次向后进行比较;当非递增非递减序列停止的时候count++。注意为了避免a[i+1]的越界,我们在数组后加一个零,因为由题干可知,所有的数据都比0大且0在第n个位置,所以不会对结果有影响。

从这道题可以抽象出来一个模型:在一个数组中截取一段连续的性质相同的序列,可以采用while–if–while模型。

while(A)
{
if(B)
{
   while(A&&B)
   {
     ++i;
   }
}
if(C)
{
   while(A&&C)
   {
     ++i;
   }
}
//.......
}

该模型的意思是,找到同时满足A和B的序列,其中A为i前进条件,B为元素所满足的条件。当序列中下一个元素不满足B的时候,同时退出while与if语句。方便查找满足另一个条件C的序列。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n = 0;
    cin >> n;
    vector<int> arr;
    //多开辟一个空间,防止越界情况的发生
    arr.resize(n+1);
    int i = 0;
    int count = 0;
    for(int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    i = 0;
    while(i < n)
    {
        //非递增序列
        if(arr[i] > arr[i+1])
        {
            while(i < n && arr[i] >= arr[i+1])  
            {
                i++;
            }
            count++;
            i++;
        }
        else if(arr[i] == arr[i+1]) //相等
        {
            i++;
        }
        else{
            //非递减序列
            while(i < n && arr[i] <= arr[i+1])
            {
                i++;
            }
            count++;
            i++;
        }
    }
    cout << count;
    return 0;
}

答案解析:基本思路和上面一样

  1. 本题依次比较整个数组

  2. a[i+1]>a[i] ,则进入非递减序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位
    置的判断

  3. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位
    置的判断

  4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减
    序列。
    本题注意点:本题开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n] = 0;
    a[n] = 0带来的影响,我们分为三种情况讨论:

  5. 若到a[n-1] 的最后一组是非递减序列,当i=n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入
    条件已经说明了(去看看题目输入条件描述),里面的循环结束,i++,count++,i==n,外面的循环结
    束。

  6. 若到a[n-1] 的最后一组是非递增序列,当i=n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入
    条件已经说明了(去看看题目输入条件描述),循环再走一次,i++, i== n,里面的循环结束,i++,
    count++,i==n+1,外面的循环结束。

  7. 第三种情况 1 2 1 2 1最后一个数是单独的情况,后面补个0,序列变成1 2 1 2 1 0,当走完全面的序列
    i==n-1时,a[i] > a[i+1],进入判断出一个非递增序列,count++,i++,循环结束。

  8. 也就是说数组最后一个位置多增加一个0,不会影响第1、2情况的判断,主要是帮助第3情况的正确判
    断。

#include<iostream>
#include<vector>
using namespace std;
// 本题牛客测试用例不全,至少应该增加以下两组测试用例
// 输入:
// 4
// 1 3 2 3
// 输出:2
// 输入:
// 6
// 3 2 1 1 2 3
// 输出:2
int main()
{
    int n;
    cin >> n;
    // 注意这里多给了一个值,是处理越界的情况的比较,具体参考上面的解题思路
    vector<int> a;
    a.resize(n + 1);//这里有个坑,这个题越界了牛客测不出来,给n,并且不写a[n] = 0;不会报错,但是最好写上
    a[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++;
            i++;
        }
        else if (a[i] == a[i + 1])
        {
            i++;
        }
        else // 非递增子序列
        {
            while (i < n && a[i] >= a[i + 1]){
                i++;
        	}
            count++;
            i++;
        }
    }
    cout << count << endl;
    return 0;
}

2.倒置字符串

image-20230322102705216

解析:整体思路可以先将整个字符串逆置,再从前往后依次将每个单词逆置。使用string类中的getline函数输入字符串,再使用reverse函数将整个字符串逆置,这个函数有两个参数,参数为迭代器这里可以将迭代器理解为指针,``reverse函数要带上头文件algorithm。如上面示例,整个字符串逆置之后为.gnijieb ekil I`,再依次将每个单词逆置。注意不能越界。

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
    string s1;
    getline(cin,s1);//输入字符串
    //s1.begin()代表字符串开始位置,s1.end()代表字符串结束位置,这里可以将迭代器理解为指针,那么在字符串.gnijieb ekil I中s1.begin()指向开始位置'.',s1.end()指向字符串结尾即指向'\0'位置。
    reverse(s1.begin(),s1.end());//迭代器为左闭右开,即[s1.begin(),s1.end()),所以逆置的时候不包括'\0'
    for(int i = 0; i < s1.size(); i++)
    {
        int tmp = i;//tmp记录每次逆置的开始位置
        while(i < s1.size() && s1[i] != ' ')//当s1[i] == ' '时或者当i < s1.size(),结束循环,进行逆置
        {
            i++;
        }
        
        //逆置,字符串.gnijieb ekil I 
        //第一次逆置tmp = 0,i = 8,即s1[i] == ' ',左闭右开,即对[0,7]之间的字符串逆置,逆置之后字符串为beijing. ekil I;
        //第二次逆置,tmp = 9,i = 13,即s1[i] == ' ',左闭右开,即对[9,12]之间的字符串逆置,逆置之后字符串为beijing. like I;
        //第三次逆置,tmp = 14,i = 15,即i < s1.size()不成立,对[14]这个字符串进行处理,逆置之后字符串为beijing. like I;
        reverse(s1.begin() + tmp,s1.begin() + i); //左闭右开
    }
    cout << s1;
}

答案解析:

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

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

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

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

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

相关文章

JVM问题(二) -- 内存泄漏

1. 什么是内存泄漏&#xff1a; 2. 内存泄漏的理解&#xff1a; 严格来说&#xff0c;只有对象不会再被程序用到了&#xff0c;但是GC又不能回收他们的情况&#xff0c;才叫内存泄漏。 但是实际情况很多时候一些不太好的实践&#xff08;或疏忽&#xff09;会导致对象的生命周…

2023年3月华为HCIA认证新增题库(H12-811)

850、 SNMP报文是通过 TCP来承载的。 A、对 B、错 试题答案&#xff1a;[["B"]] 试题解析&#xff1a; 851、 Trunk端口可以允许多个 VLAN通过,包括 VLAN4096。 A、对 B、错 试题答案&#xff1a;[["B"]] 试题解析&#xff1a; 852、 RADIUS是实…

【websocket消息推送】前端+后端实现websocket消息推送的整个生命周期(附源码详解)

【写在前面】写这篇文章的原因主要还是博主在工作的过程中遇到了一个困难&#xff0c;就是客户端开了两个一模一样的窗口&#xff08;A和B&#xff09;&#xff0c;然后A窗口触发一个请求&#xff0c;请求后是推送到前端的&#xff0c;但是推送的消息只推给了B&#xff0c;而A没…

【C++笔试强训】第三天

选择题 解析&#xff1a;字符数组里面的最后一个字符是0&#xff0c;说明里面本身就是一个字符串——"123456789"&#xff0c;数组名表示数组首元素的地址&#xff0c;那么p a i指向的就是字符数组中元素9&#xff0c;那么p - 3就是指向元素6的地址&#xff0c;%s打…

在VScode中配置Python开发环境----需要注意的一个点:settings.json

在VScode中配置Python开发环境&#xff08;可以参考这个博主的方法&#xff09;&#xff1a; http://t.csdn.cn/L1jux 1、安装python 官网下载地址&#xff1a;https://www.python.org/ftp/python/3.8.0/python-3.8.0-amd64.exe 双击打开.exe文件 勾选 Add Python 3.8 to Pat…

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

文章目录一、前言二、理解2.1 DETR的理解2.2 DETR的细致理解2.2.1 Backbone2.2.2 Transformer encoder2.2.3 Transformer decoder2.2.4 Prediction feed-forward networks (FFNs)2.2.5 Auxiliary decoding losses2.3 更具体的结构2.4 编码器的原理和作用2.5 解码器的原理和作用…

刚刚,Frontiers in Psychology 取消on hold状态,但这本期刊仍在评估中

3月28日时&#xff0c;Frontiers in Psychology仍处于on hold状态。 就在刚刚&#xff01;小编查询Frontiers in Psychology时&#xff0c;发现Master Journal List中&#xff0c;期刊Frontiers in Psychology的on hold标识没有了&#xff0c;这表示期刊目前正被SSCI数据库收录…

独立部署基于apiKey或accessToken的GPT聊天工具

最近chat-GPT的强大功能让人新潮澎湃,大家都在讨论,都想尝试一下。。。 奈何用不了!自己整整,内附具体步骤,如何用手机验证码注册,如何自己搭一个前端,nodejs后端,可以访问自己的GTP。 先上图: 自己搭的: 官网: 步骤一、用个代理 因为没这个无法访问GPT官网 忍…

类与对象,对象在内存的存在形式,java方法

类是抽象的&#xff0c;概念的&#xff0c;代表一类事物&#xff0c;比如人类&#xff0c;猫类..即它是数据类型对象是具体的实际的&#xff0c;代表一个具体事物&#xff0c;即实例。类是对象的模板&#xff0c;对象是类的一个个体&#xff0c;对应一个实例 public class Targ…

Jenkins入门

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具 持续集成&#xff08;CI&#xff09;是在源代码变更后自动检测、拉取、构建和&#xff08;在大多数情况下&#xff09;进行单元测试的过程 可以简单将jenkins理解为一个代码部署工具。 在没有持续部署工具之前&#x…

【Redis进阶】Redis数据结构

文章目录1. 前言2. SDS2. 链表3. 压缩链表4. 哈希表5. 整数集合6. 跳表7. quicklist8. listpack1. 前言 Redis常用的数据结构为String&#xff0c;List&#xff0c;Hash&#xff0c;Set&#xff0c;Sorted Set。但这只是我们在用的时候键值对的表现形式&#xff0c;他们底层真…

《程序员面试金典(第6版)》面试题 08.05. 递归乘法

题目描述 递归乘法。 写一个递归函数&#xff0c;不使用 * 运算符&#xff0c; 实现两个正整数的相乘。可以使用加号、减号、位移&#xff0c;但要吝啬一些。 示例1: 输入&#xff1a;A 1, B 10 输出&#xff1a;10 示例2: 输入&#xff1a;A 3, B 4 输出&#xff1a;…

vue3使用useMouseInElement实现图片局部放大预览效果

1、首先要安装vueuse/core npm i vueuse/core2、实现过程如下&#xff1a; <template><div class"goods-image"><!-- 大图 --><div v-show"show" class"large" :style"[{backgroundImage:url(${images[currIndex]})…

Cursor,程序员的 AI 代码编辑助手

相信大家都或多或少地听说过、了解过 chatGPT &#xff0c;半个月前发布的 GPT-4 &#xff0c;可谓是 AI 赛道上的一个王炸 那么今天咸鱼给大家分享一个开源的 AI 代码编辑器——Cursor&#xff0c;让各位程序员在编程之路上一骑绝尘 &#x1f603; 介绍 Cursor 是一个人工智…

深度学习应用技巧4-模型融合:投票法、加权平均法、集成模型法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下&#xff0c;深度学习中的模型融合。它是将多个深度学习模型或其预测结果结合起来&#xff0c;以提高模型整体性能的一种技术。 深度学习中的模型融合技术&#xff0c;也叫做集成学习&#xff0c;是指同时使用多个…

209. 长度最小的子数组

209. 长度最小的子数组 力扣题目链接(opens new window) 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入…

Java实现查找文件

1 问题 如何利用java来查找文件&#xff1f; 2 方法 2.1定义一个查找类&#xff0c;设置两个参数&#xff08;查找的目录和文件后缀名&#xff09;&#xff0c;然后判断文件夹是否为空 2.2 判断是否是文件夹&#xff0c;如果是文件夹则将里面的文件放入数组进行遍历&#xff08…

【Python零基础学习入门篇①】——基本语法与变量

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&#x…

Redis 事务相关操作

Redis 作为一个非关系型内存数据库&#xff0c;也有事务定义 1. 事务的定义-ACID特性 A表示原子性&#xff1a;即事务是一个不可分割的实体&#xff0c;事务中的操作要么都完成&#xff0c;要么都不完成 C表示一致性&#xff1a;即事务前后数据完整性必须一致&#xff0c;假…

基于springboot实现数码论坛系统设计与实现演示【附项目源码+论文说明】

基于springboot实现数码论坛系统设计与实现演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…