• 【C++】笔试训练(六)


    一、选择题

    1、十进制变量i的值为100,那么八进制的变量i的值为()
    A 146
    B 148
    C 144
    D 142

    答案:C

    2、执行下面语句后的输出为

    int I = 1;
    if (I <= 0)
    	printf("****\n");
    else
    	printf("%%%%\n");
    
    • 1
    • 2
    • 3
    • 4
    • 5

    A %%
    B ****
    C 有语法错,不能正确执行
    D %%%%

    答案:A

    3、对于下面的C语言声明描述正确的一项是()

    char(*p)[16]
    
    • 1

    A p是长度为16的字符指针数组
    B p是包含16个字符的字符串
    C p是指向长度为16的字符数组的指针
    D p是长度为16的字符数组

    答案:C
    解析:char* p[16]:p是一个数组,该数组中放的是char * 类型的元素
    char(*p)[16]:p是一个指针,该指针只能指向长度为16的字符数组–>数组指针

    4、数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法
    A a[i][j]
    B *(a[i]+j)
    C ((a+i)+j)
    D (a+i4+j)

    答案:D

    5、下面程序的输出结果是__________。

    #include 
    #define SQR(A) A*A
    void main() {
    	int x = 6, y = 3, z = 2;
    	x /= SQR(y + z) / SQR(y + z);
    	cout << x << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    A 5
    B 6
    C 1
    D 0

    答案:D

    6、当n=5时,下列函数的返回值是()

    int foo(int n) {
    	if (n < 2) {
    		return n;
    	}
    	else
    		return 2 * foo(n - 1) + foo(n - 2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    A 5
    B 11
    C 29
    D 10

    答案:C

    7、以下对C语言的”指针“描述不正确的是()
    A 32位系统下任何类型指针的长度都是4个字节
    B 指针的数据类型声明的是指针实际指向内容的数据类型
    C 野指针是指向未分配或者已释放的内存地址
    D 当使用free释放掉一个指针内容后,指针变量的值被置为NULL

    答案:D
    解析:int * pa:pa指向的是int类型的空间。
    int * p = (int *)malloc(4);
    free ( p );
    free只是将p指向的空间释放了,并不会将p指针置为NULL

    8、 数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示()(从第0行开始)
    A a[1][0]+2
    B a数组第1行第2列元素的地址
    C a[0][1]+2
    D a数组第1行第2列元素的值

    答案:B
    解析:a+1:表示数组a中第1个元素的地址
    *( a + 1):表明数组a中的第一个元素
    a又是一个二维数组,二维数组中的每个元素都是一维数组, * (a+1) 实际是一个一维数组

    9、有一个如下的结构体:请问在64位编译器下用sizeof(struct A)计算出的大小是多少()

    struct A {
    	long a1;
    	short a2;
    	int a3;
    	int* a4;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    A 24
    B 28
    C 16
    D 18

    答案:A
    在这里插入图片描述

    10、下列代码,运行结果是()

    #include 
    using namespace std;
    int f(int n) {
    	if (n == 1)
    		return 1;
    	else
    		return (f(n - 1) + n * n * n);
    } 
    int main() 
    {
    	int s = f(3);
    	cout << s << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    A 8
    B 9
    C 27
    D 36

    答案:D

    二、编程题

    1、不要二

    入口:题目链接

    题目描述:
    在这里插入图片描述
    题目解析:
    本题本质就是在二维数组中每个坐标去放蛋糕,一个坐标位置放了蛋糕,跟他欧几里得距离为2的位置不能放蛋糕,这个就是关键点。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 。
    也就是说:如果(x1,y1)放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4的(x2,y2)不能放蛋糕。
    ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4看起来是一个无解的表达式,但是可以进行加法表达式分解:
    1+3=4
    3+1=4
    2+2=4
    0+4=4
    4+0=4
    分析前三个表达式是不可能的,因为(x1-x2) * (x1-x2)表达式结果不能等于2或3。
    也就是说( (x1-x2) * (x1-x2) 和(y1-y2) * (y1-y2) )两个表达式一个等于0,一个等于4。
    可以看出:假设放蛋糕的位置是(x1,y1),则不能放蛋糕的位置(x2,y2),满足 x1 == x2, y1 - y2 == 2或者x1 - x2 == 2, y1 == y2。

    解题思路:
    使用vector定义一个二维数组,resize开空间并初始化,每个位置初始化为1,表示当蛋糕,a[i][j]位置放蛋糕,则可以标记处a[i][j+2]和a[i+1][j]位置不能放蛋糕,遍历一遍二维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。

    代码展示:

    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
    	int w, h;
    	int count = 0;
    	cin >> w >> h;
    	vector<vector<int>> a;
    	a.resize(w);
    	for (auto& e : a)
    	{
    		e.resize(h, 1);
    	}
    	for (int i = 0; i < w; i++)
    	{
    		for (int j = 0; j < h; j++)
    		{
    			if (a[i][j] == 1)
    			{
    				count++;
    				if (i + 2 < w)
    				{
    					a[i + 2][j] = 0;
    				}
    				if (j + 2 < h)
    				{
    					a[i][j+2] = 0;
    				}
    			}
    		}
    	}
    	cout << count << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2、把字符串转换成整数

    入口:题目链接

    题目描述:
    在这里插入图片描述

    题目解析:
    本题本质是模拟实现实现C库函数atoi,不过参数给的string对象

    解题思路:
    把上次计算的结果 * 10,相当于10进制进位,然后加当前位的值。
    例如:“123”转换的结果是:
    sum=0
    sum10+1->1
    sum
    10+2->12
    sum*10+3->123
    本题的关键是要处理几个关键边界条件:

    1. 空字符串
    2. 正负号处理
    3. 数字串中存在非法字符

    代码展示:

    class Solution {
    public:
        int StrToInt(string str) {
            if (str.empty())
            {
                return 0;
            }
            int flg = 1;
            if (str[0] == '-') //处理负号
            {
                flg = -1;
                str[0] = '0'; //这里是字符'0',不是0
            }
            else if (str[0] == '+') //处理正号
            {
                flg = 1;
                str[0] = '0';
            }
    
            int sum = 0;
            for (int i = 0; i < str.size(); i++)
            {
                if (str[i] < '0' || str[i] > '9')
                {
                    sum = 0;
                    break;
                }
                sum = sum * 10 + str[i] - '0';
            }
            return flg * sum;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    ELK 日志分析系统介绍与部署
    Java编程:给定字符串数组,找出各个字符串中出现的公共字符。
    4.MidBook项目经验之MonogoDB和easyExcel导入导出
    全网最全JAVA面试八股文,终于整理完了
    利用postman完成JSON串的发送功能(springboot)
    Ubuntu系统安装MySQL主从模式集群(成功!)
    自媒体视频剪辑中的那些素材到哪里找?
    深度观察2024中国系统架构师大会(SACC)
    Linux namespace技术应用实践--调用宿主机命令(tcpdump/ip/ps/top)检查docker容器网络、进程状态
    调试linux内核(1): 环境准备和原理介绍
  • 原文地址:https://blog.csdn.net/Hush_H/article/details/133840348