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

发布于:2022-10-15 ⋅ 阅读:(695) ⋅ 点赞:(0)

🎇C++笔试强训


  • 博客主页:一起去看日落吗
  • 分享博主的C++刷题日常,大家一起学习
  • 博主的能力有限,出现错误希望大家不吝赐教
  • 分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。

在这里插入图片描述

💦🔥


选择题

💦第一题

有以下程序

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

int main(){
	int m=0123, n=123;
	printf("%o %o\n", m, n);
	return 0;
}

程序运行后的输出结果是()

A 0123 0173
B 0123 173
C 123 173
D 173 173

这道题主要是对进制位的考验

请添加图片描述

m原本就是八进制,所以%o打印还是123,0是不需要打印的,n是十进制,转换八进制即123不断除8,直到商为0;

请添加图片描述

所以这道题的答案选C


💦第二题

以下哪个选项一定可以将flag的第二个bit置0()

A flag&=~2
B flag|=2
C flag^=2
D flag>>=2

这道题主要是考验按位运算,并且是在比特位上计算的

请添加图片描述

我们假设给falg一个值,看看如何可以将第二个比特位置0,且题目的意识是只变第二个比特位,其他位不变

请添加图片描述

这道题的答案是A


💦第三题

请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。

A const int const *x = &y;
B int * const x = &y;
C const int *x = &y;
D int const *x = &y;
E const int * const x = &y;

这里有const,我们来了解两个概念:

  • 常量指针:指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变。
  • 指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值可以发生改变,可以通过指针解引用改变指针所指空间的值。

区分:const *的相对位置

  • const 在 * 的左边,常量指针
  • const 在 * 的右边,指针常量

请添加图片描述

这道题的答案是B


💦第四题

以下C语言指令:

int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(%d,%d”,*(a+1)*(p-1));

运行结果是什么?

A 2,1
B 3,1
C 3,9
D 运行时崩溃

这道题主要是对指针以及数组的考验,在前两天的笔试强训中也有类似的题目

请添加图片描述

这道题的答案选C


💦第五题

二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。

A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0

这道题有两种解法

  • 第一种:

不知道有多少行多少列的情况下,用二元一次方程组解决

请添加图片描述

  • 第二种

注意观察,指针指向数组列相同的情况下,相减就是中间元素的个数

请添加图片描述

这道题的答案选A


💦第六题

根据下面递归函数:调用函数Fun(2),返回值是多少()

int Fun(int n)
{
	if(n==5)
	return 2;
	else
	return 2*Fun(n+1);
}

A 2
B 4
C 8
D 16

这道题是对于函数递归的理解的考验,这道题需要我们一次一次递归进行算

请添加图片描述

这道题最终的答案是16,选D


💦第七题

以下程序的输出结果是:

#include <iostream>
using namespace std;
void func(char **m){
	++m;
	cout<<*m<<endl;
}
int main(){
	static char *a[]={"morning", "afternoon", "evening"};
	char **p;
	p=a;
	func(p);
	return 0;
}

A afternoon
B 字符o的起始地址
C 字符o
D 字符a的起始地址

这道题主要是对二级指针和指针数组的考验,仔细分析
请添加图片描述

这道题的答案是A


💦第八题

求函数返回值,输入x=9999

int func(int x){
	int count=0;
	while (x)
	{
		count++;
		x=x&(x-1);//与运算
	}
	return count;
}

8
B 9
C 10
D 12

这道题主要是看循环的次数,我们可以先假设一个输入值

请添加图片描述

所以只需要看9999的二进制中有多少个1即可

所以这道题的答案选A


💦第九题

#include <stdio.h>
int cnt = 0;
int fib(int n) {
	cnt++;
	if (n == 0)
		return 1;
	else if (n == 1)
		return 2;
	else
		return fib(n - 1) + fib(n - 2);
}
void main() {
	fib(8);
	printf("%d", cnt);
}

这道题第一眼看着就是个斐波那契数列,也是对于递归理解的考验,我们只需要依次进行推导那就可以得出最终结果了

请添加图片描述


💦第十题

在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是()

struct A
{
	int a;
	short b;
	int c;
	char d;
};
struct B
{
	int a;
	short b;
	char c;
	int d;
};

A 16,16
B 13,12
C 16,12
D 11,16

这道题主要是考验结构体的内存对齐,我们到时可以去了解三个问题

  • 结构体为什么要对齐
  • 结构体是如何进行对齐的
  • 如果想要让结构体任意字节对齐该如何处理

请添加图片描述

这样我们可以进行计算第一个结构体的值为16
请添加图片描述

第二个结构体的值12

请添加图片描述

所以这道题的答案是C


编程题

🔥第一题

链接:计算糖果
请添加图片描述

  • 解题思路:

这是这四天来最简单的一道题,就是直接把条件给出来了。

1、A - B = a 2、B - C = b 3、A + B = c 4、B + C = d 这道题目的实质是:判断三元一次方程组是否有解及求解, 这里是小学生都会的问题了^^ 1+3可以得到A=(a+c)/2;4-2可以得到C=(d-b)/2;

2+4可以得到B2=(b+d)/2,3-1可以得到B1=(c-a)/2;

如果B1不等B2则表达式无解

  • 代码演示:
#include<iostream>
using namespace std;
int main() {
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    int A = (a + c) / 2;
    int C = (d - b) / 2;
    int B1 = (c - a) / 2;
    int B2 = (b + d) / 2;
    if (B1 != B2)
        cout << "No";
    else
        cout << A << " " << B1 << " " << C;
    return 0;
}

🔥第二题

链接:进制转换

请添加图片描述

  • 解题思路:

本题思路很简单,首先想清楚原理:N进制数,每个进制位的值分别是X0N0,X1*N1, X2N^2…,X0,X1,X2就是这些进制位的值,就是就是进行取模余数就是当前低进制的位的值是多少,通过除掉进制数,进入下一个进制位的计算。

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

int main() 
{
    string s, table = "0123456789ABCDEF";
    int m,n;
    cin >> m >>n;
    
    if( m == 0)
    {
        cout << 0;
        return 0;
    }

    bool flag = false;
    if(m < 0)
    {
        m = -m;
        flag = true;
    }

    while(m != 0)
    {
        s = s+ table[m%n];
        m /= n;
    }

    if(flag == true)
    {
        s += "-";
    }
    
    reverse(s.begin(),s.end());
    cout << s << endl;
}


网站公告

今日签到

点亮在社区的每一天
去签到