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

目录

  • 一、选择题
  • 二、编程题
    • 1、不要二
    • 2、把字符串转换成整数

一、选择题

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");

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

答案:A

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

char(*p)[16]

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;
}

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);
}

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;
};

A 24
B 28
C 16
D 18

答案:A
【C++】笔试训练(六)_第1张图片

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;
}

A 8
B 9
C 27
D 36

答案:D

二、编程题

1、不要二

入口:题目链接

题目描述:
【C++】笔试训练(六)_第2张图片
题目解析:
本题本质就是在二维数组中每个坐标去放蛋糕,一个坐标位置放了蛋糕,跟他欧几里得距离为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;
}

2、把字符串转换成整数

入口:题目链接

题目描述:
【C++】笔试训练(六)_第3张图片

题目解析:
本题本质是模拟实现实现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;
    }
};

你可能感兴趣的:(笔试训练,c++,算法,开发语言)