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

举报
平凡的人1 发表于 2022/12/15 11:15:11 2022/12/15
【摘要】 @[toc] 选择题#include<iostream>#include<cstdio>using namespace std;int main(){ int m=0123, n=123; printf("%o %o\n", m, n); return 0;}程序运行后的输出结果是()A 0123 0173B 0123 173C 123 173D 173 173这道题考查输出的格式,要区分各...

@[toc]

选择题

#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;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。