【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

这道题考查输出的格式,要区分各种进制的表达格式

二进制:1010b

八进制:0123456

十进制:123

十六进制:0x123

%d是十进制,%o是八进制,%x是十六进制输出。%o代表的是八进制整型输出整数,数字前0代表八进制、0x代表16进制,因此m输出为123,十进制123转换为8进制为173,所以n输出为173,因此答案选C

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

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

按位或(有1就是1) 按位与(同1才为1) 按位异或(相同为0,不同为1)

一个一个看即可,选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修饰的考查,要求所指向的内存地址不能改变,内存中的值可以被改变:即x本身不能变,而*x解引用的值可以改变故选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 运行时崩溃

数组名只有在& 和 sizeof之后表示数组本身,其余都表示数组首元素的地址
&a是一个地址,类型为int(*)[5],&a + 1 是跨越了一个数组大小,p被强转为(int*),p-1指向9,*(a+1)是3 选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

这个自己展开一下就知道结果了选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的起始地址

数组名表示数组首元素的地址,数组除了放在&和sizeof之后才表示数组本身,所以这里的*a指的是首元素的地址也就是morning的地址
++m也就是偏移一个元素的大小,也就是指向了afternoon故选A

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

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

A 8
B 9
C 10
D 12

image-20221204160431254

所以9999的二进制有8个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);
}

下列程序执行后,输出的结果为()
A 41
B 67
C 109
D 177

cnt实际统计的是:斐波那契递归的总次数

在这里插入图片描述

答案选B

在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

结构体内存对齐:

第一个成员在与结构体变量偏移量为0的地址处。

其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的值为8

结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

image-20221204141102042

选C


编程题

计算糖果

在这里插入图片描述

这题一开始我的做法就是直接for循环进行嵌套,无脑强行求出结果:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int sum1, sum2, sum3, sum4;
    cin >> sum1 >> sum2 >> sum3 >> sum4;
    int a=0, b=0, c=0;
    int flag = 0;
    for (a = -30; a <=30; a++)
    {
        for (b = -30; b <= 30; b++)
        {
            for (c = -30; c <= 30; c++)
            {
                if ((a - b) == sum1 && (b - c) == sum2 && (a + b) == sum3 && (b + c) == sum4)
                {
                    cout << a << " " << b << " " << c << endl;
                    flag = 1;
                    break;
                }
            }
        }
    }
    if(flag == 0)
    {
        cout<<"No"<<endl;
    }
    return 0;
}

但是现在我们来看一看题目所给出的条件:

image-20221204124209422

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

进制转换

在这里插入图片描述

先考虑M是正负数问题,可以利用flag来标记一下.当M==0的时候也要处理一下。

然后创建两个字符串ret和table,ret用来存放结果,由于是利用拼接+=,所以最后的结果我们需要倒置一下,而table用来存储进制所代表的数字字母。最后再去一一求出M的每一位数字即可。

image-20221204130419375

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int M,N;
    cin>>M>>N;
    bool flag = true;
    string ret;
    string table = "0123456789ABCDEF";
    if(M<0)
    {
        M = -M;
        flag = false;
    }
    if(M == 0)
    {
        ret="0";
    }
    while(M)
    {
        ret+=table[M%N];
        M/=N;
    }
    if(flag == false)
    {
        ret+='-';
    }
    reverse(ret.begin(),ret.end());
    cout<<ret<<endl;
}
  • 40
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡的人1

佬的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值