备战求战 | 笔试强训6

目录

一、选择题

二、编程题

三、选择题题解

四、编程题题解


一、选择题

1、十进制变量i的值为100,那么八进制的变量i的值为()

A. 146

B. 148

C. 144

D. 142

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

int I=1;
if(I<=0)
    printf("****\n") ;
else
    printf("%%%%\n");

A. %%

B. ****

C. 有语法错,不能正确执行

D. %%%%

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

char (*p)[16]

A. p是长度为16的字符指针数组

B. p是包含16个字符的字符串

C. p是指向长度为16的字符数组的指针

D. p是长度为16的字符数组

4、数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法

A. a[i][j]

B. *(a[i]+j)

C. *(*(a+i)+j)

D. *(a+i*4+j)

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

#include < iostream.h>
#define SQR(A) A*A
void main() 
{
    int x=6,y=3,z=2;
    x/=SQR(y+z)/SQR(y+z);
    cout< < x< < endl;
    return 0;
}

A. 5

B. 6

C. 1

D. 0

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

7、以下对C语言的”指针“描述不正确的是()

A. 32位系统下任何类型指针的长度都是4个字节

B. 指针的数据类型声明的是指针实际指向内容的数据类型

C. 野指针是指向未分配或者已释放的内存地址

D. 当使用free释放掉一个指针内容后,指针变量的值被置为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列元素的值

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

struct A
{
    long a1;
    short a2;
    int a3;
    int *a4;
};

A. 24

B. 28

C. 16

D. 18

二、编程题

1、不要二  题目链接

备战求战 | 笔试强训6_第1张图片

 2、把字符串转换成整数  题目链接

备战求战 | 笔试强训6_第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

题解:        

         此处有一个特殊的语法,当%%时,前面那个%充当转义作用,转义后面那个%,/也是转义符号,作用相同;只不过这里是一种特殊的转义符号,故选A;

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

char (*p)[16]

A. p是长度为16的字符指针数组

B. p是包含16个字符的字符串

C. p是指向长度为16的字符数组的指针

D. p是长度为16的字符数组

正确答案:C

题解:

         标识符p被小括号括起来了,因此先于*结合,表示p为给指针,指向的对象就是括号外的;指向一个有16个字符的数组;故选C;

4、数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法

A. a[i][j]

B. *(a[i]+j)

C. *(*(a+i)+j)

D. *(a+i*4+j)

正确答案:D

题解:        

         首先,我们要明确,a是一个二级数组,其类型是float (*a)[4],我们对其必须两次解引用才可以访问到对应的数组元素,故错误;

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

#include < iostream.h>
#define SQR(A) A*A
void main() 
{
    int x=6,y=3,z=2;
    x/=SQR(y+z)/SQR(y+z);
    cout< < x< < endl;
    return 0;
}

A. 5

B. 6

C. 1

D. 0

正确答案:D

题解:

        此处主要涉及宏的相关知识,宏函数中的参数不做计算,也不做类型检测,仅仅知识进行替换;我们将宏替换后,表达式为 x /= y + z * y + z / y + z * y + z;计算结果为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

题解:

         这里考察递归函数的计算;我们将函数展开,结果如下;

备战求战 | 笔试强训6_第3张图片

 展开时记住外面会有一个乘号;计算最后结果为29;故选C;

7、以下对C语言的”指针“描述不正确的是()

A. 32位系统下任何类型指针的长度都是4个字节

B. 指针的数据类型声明的是指针实际指向内容的数据类型

C. 野指针是指向未分配或者已释放的内存地址

D. 当使用free释放掉一个指针内容后,指针变量的值被置为NULL

正确答案:D

题解:

         当free释放一个指针内容以后,指针变量的值不做处理;

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

题解:

         之前我们讲过,一个二位数组第 i 行第 j 列的元素除了可以a[ i ][ j ]这样访问,还可以*(*(a + i) + j),这样访问,题目中,少了一次解引用,因此,代表第一行第二列元素的地址;故选B

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

struct A
{
    long a1;
    short a2;
    int a3;
    int *a4;
};

A. 24

B. 28

C. 16

D. 18

正确答案:A

题解:

        64位机器下,long int的大小为8字节,指针的大小也为8字节,因此按照前面学的结构体对齐规则,计算结果24,故选A

四、编程题题解

1、不要二

本题主要难点在于理解欧几里得距离,通过欧几里得公式,我们不难推算出如下;

备战求战 | 笔试强训6_第4张图片

备战求战 | 笔试强训6_第5张图片

        我们创建一个w行h列的二维数组,然后将其所有值初始化为1,代表这个格子放了蛋糕,然后我们每一次放蛋糕后,都计算出不能放蛋糕的格子;代码如下所示;

#include 
#include 
using namespace std;

int main() 
{
    int w, h;
    // count计数
    int count = 0;
    cin >> w >> h;
    vector> v(w, vector(h, 1));
    for(int i = 0; i < w; i++)
    {
        for(int j = 0; j < h; j++)
        {
            if(v[i][j] == 1)
            {
                count++;
                // 判断是否越界
                if(i + 2 < w)
                    v[i + 2][j] = 0;
                if(j + 2 < h) 
                    v[i][j + 2] = 0;
            }
        }
    }
    cout << count << endl;
}

 2、把字符串转换成整数

此题依次循环遍历字符串,按照题目要求写代码即可,并无什么算法;

class Solution 
{
public:
    int StrToInt(string str) 
    {
        int ret = 0;
        // 记录正负
        int flag = 1;
        for(int i = 0; i < str.size(); i++)
        {
            if(i == 0 && (str[i] == '+' || str[i] == '-'))
            {
                // 对首字符是-进行处理
                if(str[i] == '-')
                    flag *= -1;
            }
            else if(str[i] >= '0' && str[i] <= '9')
            {
                int num = str[i] - '0';
                ret = ret * 10 + num;
            }
            else
            {
                // 对于其他非法情况直接return 0
                return 0;
            }
        }
        return ret * flag;
    }
};

你可能感兴趣的:(笔试强训,数据结构)