笔试强训day6

这篇博客主要介绍了C语言的基础知识,包括十进制与八进制的转换,条件判断语句的执行,指针的声明和使用,二维数组的操作,结构体的内存对齐,以及递归函数的应用。同时,还提供了两道编程题,一道涉及二维数组的蛋糕放置问题,另一道是实现字符串转整数的功能,强调了不允许使用库函数。这些内容涵盖了C语言的重要概念和基本算法思维。
摘要由CSDN通过智能技术生成

一. 单选

1. 十进制变量i的值为100,那么八进制的变量i的值为()
A.146
B 148
C 144
D 142
100/8=12   12/8=1    1/8=0
100%8=4   12%8=4  1%8=1
倒着算,即得144
2.执行下面语句后的输出为
int I=1;
if(I<=0)
    printf("****\n") ;
else
    printf("%%%%\n");
A %%
B ****
C 有语法错,不能正确执行
D %%%%
字符串有一定规定,%后跟上特性的字符才代表一定的格式化,比如:%d %f ...
而%Q-->无效格式-->编译器会忽略%,printf("%Q);//直接输出Q
以此类推,printf(" %% %% "\n);//打印%%
3. 对于下面的C语言声明描述正确的一项是()
char (*p)[16]
A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
char* p[16]:p是长度为16的字符指针数组
[ ]的优先级高于* ,所以加上()表示p与*先结合,所以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+i*4+j)
a[i][j]是一个二维数组,
其中a[i]指向第i行,*(a[i]+j)表示第i行的第j个元素;
a+i,表示数组a中的第i个元素的地址,*(a+i)表明数组a中的第i个元素,所以*(*(a+i)+j)表示第i行的第j个元素;
同理,a+i*4+j,表示数组a中的第i*4+j个元素的地址,*(a+i*4+j)则是它的元素,而数组float a[3][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;
}
A 5
B 6
C 1
D 0
注意:#define语句中 A*A并未使用()
x/=SQR(y+z)/SQR(y+z);
x/=3+2*3+2/3+2*3+2-->x/=3+6+0+6+2-->x/=17-->6/=17
所以x=0
6. 当n=5时,下列函数的返回值是() i
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
当n=5时,此函数进入递归调用

7. 以下对C语言的”指针“描述不正确的是()
A 32位系统下任何类型指针的长度都是4个字节
B 指针的数据类型声明的是指针实际指向内容的数据类型
C 野指针是指向未分配或者已释放的内存地址
D 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
在64位系统下任何类型指针的长度都是8个字节
int* pa; //pa将来指向的是int类型的空间
int* p=(int*)malloc(4); free(p); //free只是将p指向的空间释放了,并不会将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列元素的值
a+i:表示数组a中的第i个元素的地址;
*(a+i):表明数组a中的第i个元素;
a是一个二维数组,二维数组中的每个元素都是一维数组
*(a+1):实际是个一维数组,*(a+1)+2,则表示a数组第i行第2列元素的地址
9. 有一个如下的结构体:
struct A{
        long a1;
        short a2;
        int a3;
        int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少()
A 24
B 28
C 16
D 18
首先,在64位编译器下的结构体最大对齐数是8,,而结构体的整体大小为最大对齐数的整数倍,所以排除B D选项
其次指针在64位编译器下所占大小为8个字节,其成员变量内存对应大小分别为4 2 4 8
对其规则是第一个成员在与结构体变量偏移量为0的地址处,其他成员变量对齐到对齐数的整数倍地址处
所以算得最后结果是28.
10.运行结果是()
#include <iostream>
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 

s=f(2)+3*3*3

f(2)=f(1)+2*2*2

f(1)=1

所以s=1+8+27=36

 

二. 编程

1. ACM编程题 标题:不要二 | 时间限制:1秒 | 内存限制:32768K
二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一
块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
思路,即 两个格子坐标(x1,y1),(x2,y2)的欧几里得距离不能为4,其中,4可由以下部分组成
0+4=4
1+3=4 //不满足
2+2=4 //不满足
3+1=4 //不满足
4+0=4
即当x1==x2时,y1-y2=2,y1=y2-2
   当y1==y2时,x1-x2=2,x1=x2-2
#include <iostream>
#include<vector>
using namespace std;

int main() {
    int w, h;
    cin >> w >> h;
    vector<vector<int>> a;
    a.resize(w);
    for (auto& e : a) {
        e.resize(h, 1);//将二维数组初始化为1
    }
    int count = 0;
    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. 完善核心代码 标题:把字符串转换成整数 :将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0

class Solution {
public:
    int StrToInt(string str) {
        //getline(cin,str);
        if(str.empty())
            return 0;

        int flag=1;//标记正负数
        if(str[0]=='-')
        {
            flag=-1;
            str[0]='0';
        }
        else if(str[0]=='+')
        {
            flag=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';//在ASCII中,'1'-'0'=1
        }
        return sum*flag;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值