2024年最新【C++笔试强训】第二天_左对齐,4个精度(3),2024C C++常见面试题

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

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

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

A 1,3
B 1,2
C 2,4
D 3,2

我们一条语句一条语句分析,int *b = a,定义了一个指针b指向数组首元素

*b += 2 的优先级高于+=,所以b先解引用得到1,再1+2=3,所以数组首元素的值变为3

*(b+2)= 2,由于括号的优先级高,先向右偏移两个位置,再将所指向的元素改变为2;

b++ 从数组首元素偏移到下一位

所以现在数组的元素是 3 2 2 4 ,b指向第二个元素

所以这道题的答案是2 4,选C


💦第五题

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

A 宏定义不检查参数正确性,会有安全隐患
B 宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C 宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D 相对于函数调用,宏定义可以提高程序的运行效率

这道题主要是考验对宏的理解,宏是没有安全检测的,所以A正确

B选项恰好说反了,宏是没有安全检测的,并且在预处理阶段进行宏替换,所以是无法进行调试的,所以要尽量使用const常量

宏定义很容易导致优先级出错,所以C正确

宏定义相对于函数调用来说,没有创建函数栈帧,没有函数压栈的开销,是可以提高程序的运行效率,所以D是正确的

这道题的答案是B


💦第六题

有以下定义:

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

函数声明为:

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

则正确的函数调用形式是()
A sss(a,b);
B sss(char b[],int a[]);
C sss(b[],a[]);
D sss(b,a);

函数在调用的时候传入的参数如果是数组类型,调用的时候我们只需要传入数组名,即数组的地址

A的类型写反了,B传入的参数写了数据类型,这是不需要的的,C不应该加[]

这道题的答案是D


💦第七题

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

A int *a[10];
B int (*a)[10];
C int (*a)(int);
D int (*a[10])(int);

A选项[]的优先级高于*,所以表面这是一个数组,数组里面存放的是int类型的指针,是一个指针数组

B是一个数组指针,指向int类型的数组,大小为10

C是一个指针函数,这个函数有一个int参数,返回值类型是int

D是函数指针数组,有一个整形参数并返回一个int类型的值,满足题意

这道题的答案是D


💦第八题

以下 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", _____, _____);
	}
}

A ++count[a[i]-‘Z’]
‘Z’-i
count[‘Z’-i]

B ++count[‘A’-a[i]]
‘A’+i
count[i]

C ++count[i]
i
count[i]

D ++count[‘Z’-a[i]]
‘Z’-i
count[I]

先看A选项,a[i] - ‘Z’ 的ASCII值是小于0的,但是数组下标不能小于0,所以A是错误的

B选项和A同理,‘A’ - a[i]的ASCII值也是小于0

C选项用i做下标,但是i的值是取决于n的,所以这个字符数组有可能是比count记录的大的,所以不满足题意,会出现越界,所以c是错的

D选项就是每一个下标对应一个字母,所以可以用来统计字数,‘Z’ - i ,是对应的每个字母,count[i]存储的是每个字母出现的次数,所以D是对的

所以这道题的答案是D


💦第九题

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

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

则sizeof(struct A)的值为()

A 9
B 12
C 16
D 20

这道题的:数字表示位断,假设开辟4个字节,32个比特位,a占19个字节,如果b的位置够的话还是会放在这四个字节里面,不需要重新开辟空间。

请添加图片描述
根据内存对齐原则,所以得到这个结构体的长度为16字节

所以这道题的答案是16,选C


💦第十题

下面代码会输出()

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

A 4
B 1
C 2
D 3

这道题给了一个整形数组,定义了一个指针ptr,利用数组给他赋值,&a + 1 会偏移数组类型个大小,即从数组首元素偏移4位,指向最后一个数据的下一个位置,所以*(ptr-1)指向的是数组的最后一个位置

所以这道题的答案是4,选A


编程题

🔥第一题

链接:排序子序列

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

请添加图片描述

  • 解题思路;

首先子序列是非递增或是非递减的:
递增:1 2 3 4 5 6
递减:6 5 4 3 2 1
非递增:6 5 5 4 3 (前后两数可能相等)
非递减:1 2 2 3 4 (前后两数可能相等)

对数组a而言,就可以分为一下三种情况:
if (a[i] > a[i+1]) //即将进入非递增序列
if (a[i] == a[i+1] //相等时
if (a[i] < a[i+1]) //即将进入非递减序列

输入数组之后,开始遍历数组,如果数组满足非递增或者非递减,就进入对应的条件判断,然后此时如果i+1的元素依然满足对应的非递增或非递减,就直接i++,然后跳出之后进行count++,这就是一个排序子序列,如果相等的话就直接i++,这样执行下去,直到遍历结束,输出此时的count。

  • 代码演示:
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    int count = 0;
    cin >> n;
    vector<int> a;
    a.resize(n+1);
    a[n] = 0;
    
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    //数组当中已经存在数字
    
    int i = 0;
    while( i < n)
    {
        //进入非递减序列
        if(a[i] < a[i+1])
        {
            //注意i的值不可以一直加
            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;
}


🔥第二题

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

t++;//完成一组
i++;
}
}
cout << count << endl;
}




---


### 🔥第二题



[外链图片转存中...(img-52rVubMx-1715665000691)]
[外链图片转存中...(img-pYRS89YI-1715665000692)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值