【基础强训】day4

一、选择题

🌈第1题 

有以下程序
#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

答案:C

解析:这个就是考%d, %o,%x是啥意思 .

%d:十进制打印,%o八进制打印,%x十六进制打印

这里的进制也有一些格式:

  • 二进制格式:101011110b,二进制中数是0,1加一个b代表是二进制。
  • 八进制格式:0123,八进制必须以0开始作为8进制标志且数不能超过8。
  • 十进制格式:12479。
  • 16进制格式:0x123,123h都是16进制的表示方法。

所以这个题里面m就是8进制数字, %o打印还是0123,而123则是10进制表示,十进制转8进制就是一直除8,这个就不算了。



 🌈第2题:

以下哪个选项一定可以将flag的第二个bit置0()
A flag&=~2    B flag|=2
C flag^=2     D flag>>=2

答案:A

 这个就是考三个按位操作符:按位与(&),按位或(|),按位异或(^)

  • 按位与&: 有0则0,全1为1
  • 按位或|:有1为1,全0为0
  • 按位异或^: 相同为0,相异为1

那这个按位或不可以,flag第二位如果是1就一定不可以,所以只会用到按位与和异或。

我们算一下A:   2: 0000 0010,~2:  1111 1101

flag&=~2----->flag=flag&~2

      xxxx xxyx

&    1111 1101     所以无论y是1还是0,flag第二位一定是0(有0则0). A选项正确,B选项排除。

C选项:y是1的话就不能,所以C选项也是错的。 D选项就不看了。



🌈第3题:

请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。
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;

答案:B

这个不还是指针常量和常量指针吗,老生常谈,更新的前三次中就重复了两次。

  • 常量指针(const*):指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变。
  • 指针常量(*const):指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值可以发生改变,可以通过指针解引用改变指针所指空间的值。

不分析了。 



🌈第4题:

以下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 运行时崩溃

答案:C

这个题中有一个概念必须弄明白:出现数组名时什么时候代表数组本身什么时候代表首元素地址。

如果数组名在&,sizeof(&A, sizeof(a) )之后代表数组本身,其他情况代表首元素地址。

也就是说&a也算一个地址,这个地址的类型是int(*)[5]的数组指针

那给这个类型+1是不是直接跨越了一个完整数组,直接到9的下一位,所以此时p指向9的下一位。

所以*(a+1)是3,*(p-1)是9。

所以答案是C



🌈第5题:

 二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存
储地址为Oxf8b8221c,则X[7][7]的存储地址为()。
A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0

 答案:A

xdm,这个题属实没看懂,就不讲了。



🌈第6题:

根据下面递归函数:调用函数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

这个题一点技术含量都没有

2*Func(30=)=2*2*Func(4)=2*2*2*Func(5)=4*4=16



🌈第7题:

以下程序的输出结果是:
#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的起始地址

答案:A

数组名代表首元素地址,*a就代表首元素morning的地址,而morning的类型是char*

p必须使用指针,因为此时a已经是一级指针了。

被调到func函数中,++m,此时指针就往后面偏移了一个元素,指向afternoon,注意啊不是单单指向一个字符。所以再对m解引用后是afternoon。



🌈第8题:

求函数返回值,输入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

答案:A

高中做过找规律的题把,这个也是找规律。

  1. 先输入一个x=8试试水,进入循环count++,count=1;8:1000,7:0111--------->8&7=0000,所以count=1,此时x转换为二进制数中的1个数是1,count是1。
  2. 再令x=7,count=1,7&6=0110=6 ;count+1=2,,6&5=0100=4;count+1=3,4&3=0;跳出循环。
  3. 看这两个结果,如果说x转换为2进制数,这个数中有几个1那么count就是几。
  4. 所以把9999转换为二进制:10011100001111,8个1,所以count是8。


🌈第9题:

#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

答案:B

单纯考递归的,上面有解析,这个就是直接带入套的。



🌈第10题:

在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

答案:C

这个考的是内存对齐 

我们就简单说个sizeof(A)




 二、编程题

🌈1.计算糖果

这个思路很是简单:

我家上二年级的大侄子都会,带入硬解呗。

#include<iostream>
using namespace std;
int main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int A=(a+c)/2;
int C=(d-b)/2;
int B1=(c-a)/2;
int B2=(b+d)/2;
if(B1!=B2)
cout<<"No";
else
cout<<A<<" "<<B1<<" "<<C;
return 0;
}


🌈2.进制转换

 思路解析:

  • 这个题的思路不难,也可以用到很是简单来描述。
  1. 十进制转化为N进制就用M模N并且得到一个数,把这个数存到一个新的字符串中,
  2. 然后用M/N,转入下一轮计算,然后继续M%N,一直进行循环,直到M/N=0结束。
  3. 再把存到新数组中的;每个数字进行逆序就是所求进制数了。
  4. 这个题中值得注意的是负数的情况。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    string s = "",table = "0123456789ABCDEF";
    int m, n;
    cin>>m>>n;
    
    //注意当m<0的时候
    bool flag = false;
    if(m < 0)
    {
        m = -m;
        flag = true;
    }
    //注意当m=0的时候
    if(m == 0)
    {
        s = "0";
    }

    while(m)
    {
        s += table[m%n];
        m /= n;
    }
    
    if(flag == true)
    {
        s += '-';
    }

    //逆置字符串 :3 2 1 -
    reverse(s.begin(), s.end());
    cout<<s<<endl;
}

xdm,用函数reverse进行排序一定要加头文件#include<algorithm>

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值