暑假第九天之每天一些题系列

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第九天之每天一些题系列相关的知识,希望对你有一定的参考价值。

暑假第九天之每天一些题系列

一、选择题

  • 下面程序的输出结果为多少(32位机器上)

    void Func(char str_arg[2])
    {
        int m = sizeof(str_arg);
        int n = strlen(str_arg);
        printf("%d\\n", m);
        printf("%d\\n", n);
    }
    int main(void)
    {
        char str[] = "Hello";
        Func(str);
    }
    

    A. 5 5 B. 5 4 C. 4 5 D. 4 4

答案解析:

str是一个字符数组,将数组名传参传给Func,数组名是数组首元素地址将H的地址传过去,传地址就需要用指针来接收,其实函数参数本质上是个指针,大小为4或者8,则sizeof(str_arg)为4,strlen函数计算字符串长度时看的是\\0,我们遇到\\0会是在5个字符后,故strlen(srt_arg)为5

  • 1<<3+2 的值是____
    A. 32 B. 10 C. 16 D. 6

答案解析:

<<是左移操作符,1的二进制为:

00000000000000000000000000000001

加号的优先级高于左移操作符:故

1左移五位后(左边删除五位,右边补五个0):

00000000000000000000000000100000

  • 在小端序的机器中,如果

    union X
    {
        int x;
        char y[4];
    }a;
    a.x=0x11223344;//16进制
    

    A. a.y[0]=0x11 B. a.y[1]=0x11 C. a.y[2]=0x11
    D. a.y[3]=0x11 E. a.y[0]=0x22 F. a.y[3]=0x22

答案解析:

X是一个联合体,特点是里面的成员共用一块空间,因为是小端序的机器,a.x在内存中的存储为:44 33 22 11,

因为y数组和x共用一块内存空间,则y[0]=44,y[1]=33,y[2]=22,y[3]=11,故答案为:D

  • 阅读如下代码,请问: p 和 “hello,world” 存储在内存哪个区域____

    #include <stdio.hs>
    int main()
    {
        const char *p = "hello,world";
        return 0;
    }
    

    A. 栈,堆 B. 栈,栈 C. 堆,只读存储区 D. 栈,只读存储区

    答案解析:

p是一个局部变量,存储在栈区,而常量字符串存储在只读存储区

  • 空指针是指
    A. 所指向的空间位置未存放任何数据的指针
    B. 所指向的空间位置存放着数据0的指针
    C. 所指向的空间位置可用于存放任何类型数据的指针
    D. 所指向的空间位置就是地址0的指针

答案解析:

空指针是一个特殊的指针值。空指针是指可以确保没有指向任何一个对象的指针。通常使用宏定义NULL来表示空指针常量值。NULL就代表系统的0地址单元,空指针确保它和任何非空指针进行比较都不会相等,因此经常作为函数发生异常时的返回值使用。

二、填空题

  • 如下代码结果是多少 a=, x=

    int main()
    {
        int a,x;
        for(a = 0,x = 0; a<=1 && !x++; a++)
        {
        	a++;
        }
        printf("%d %d",a,x);
        return 0;
    }
    

答案解析:

++的优先级高于!,是后置++,故是先使用后++,!x++表达式的值为1,x变为1,进入循环,两次a++,a不符合循环进行的条件,退出循环,则此时a=2,x=1

  • 写一个宏,输入两个参数,返回较小的一个:_________

答案解析:

#define Min(X,Y) X<Y?X:Y
int main()
{
int a=10;
int b=20;
printf("%d\\n",Min(a,b));
}

使用三目操作符

  • 下面程序输出什么

    #include <stdio.h>
    int main()
    {
        int a[5] = {1, 2, 3, 4, 5};
        int* p1 = (int*)(&a + 1);
        int* p2 = (int*)((int)a + 1);
        int* p3 = (int*)(a + 1);
        printf("%d, %x, %d\\n", p1[-1], p2[0], p3[1]);
        return 0;
    }
    

答案解析:

&数组名是整个数组的地址,+1跳过整个数组,指向数组的最后一个元素的下一个位置,即p1指向这里,将a强制类型转化为int类型,则它+1只能跳过四个字节,即一个数组元素,即p2指向数组的第二个元素2,数组名为首元素的地址,+1指向第二个元素,即p3指向这里;p1[-1]等价于:*(p1-1),p1-1指向5的地址;p2[0]等价于:*p2,p2指向2的地址,因为以十六进制打印,故打印的应为:02000000,打印会将2前面的0省略掉;p3[1]等价于:*(p3+1),p3指向2的地址,+1指向3的地址,则最后打印分别为5,2000000,3。

三、算法题

题目描述:

输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18

思路:

我们定义一个当前和变量和最大和变量,最开始都初始化为0,当我们给当前和变量加上一个正数的时,和为增加,当我们加上一个负数的时候,和会减少,如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。如果当前得到的和是一个正数,则让他和之前保存的最大和比较,若大于最大和,则更新最大和变量。对于全都为负数的情况,那么子数组和最大就为数组中最大的那个元素

代码如下:

#include<stdio.h>
void Find(int* nums, int sz)
{
    int i = 0;
    int nsumcur = 0;
    int greatnsum = 0;
    for (i = 0; i < sz; i++)
    {
        nsumcur += nums[i];//当我们加上一个正数的时,和为增加,当我们加上一个负数的时候,和会减少,如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。

        if (nsumcur < 0)
        {
            nsumcur = 0;
        }
        if (nsumcur > greatnsum)//当前和大于之前保存的最大和时,更新最大和
        {
            greatnsum = nsumcur;
        }
    }
    //全都为负数的情况,那么子数组和最大就为数组中最大的那个元素
    if (greatnsum == 0)
    {
        greatnsum = nums[0];
        for (i = 0; i < sz; i++)
        {
            if (greatnsum < nums[i])
            {
                greatnsum = nums[i];
            }
        }
    }
    printf("%d\\n", greatnsum);
}
int main()
{
    int arr[] = { 1,-2,3,10,-4,7,2,-5 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    Find(arr, sz);
    return 0;
}

以上是关于暑假第九天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章

暑假第十天之每天一些题系列

暑假第四天之每天一些题系列

暑假第一天之每天一些题系列

暑假第二天之每天一些题系列

暑假第三天之每天一些题系列

暑假第十一天之每天一些题系列