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

Posted 小赵小赵福星高照~

tags:

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

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

一、选择题

  • 以下程序的运行结果是

    int fun(int a,int b)
    {
        if(a>b)
        	return(a+b);
        else
        	return(a-b);
    }
    int main()
    {
        int x = 3, y = 8, z = 6, r;
        r = fun (fun(x,y), 2 * z);
        printf(%d\\n”,r);
        return 0;
    }
    

    A. -48 B. 58 C. -58 D. -17

    答案解析:

    这个fun函数的调用,是一个嵌套调用,里面这个fun(x,y)执行的结果为-5,外面的就为fun(-5,12),返回的结果为-17

    • 一个8位的二进制整数,采用补码表示,且由3个“1”和5个“0”组成,则最小值为
      A. -127 B. -32 C. -125 D. -3

    答案解析:

    由3个“1”和5个“0”组成的补码,求最小值,因为是补码,这样组是最小的:10000011,因为最高位是符号位,先给个1,剩下两个1需要给在低位上,这样原码才会最小,它的反码为:10000010,原码为:11111101,该值为-125

    • int a = 4 , 则对于表达式 ++(a++) 的结果说法正确的是
      A. 结果为5 B. 结果为6 C. 结果为7 D. 以上都不是

    答案解析:

    a++是先使用后加加,故a++这个表达式的值为4,然后++(4),因为4是一个常量是不能修改的,故这是个错误的表达式。

    • 已知 x >= y and y >= z 为真,那么 x > z or y == z 值为
      A. 真 B. 假 C. 无法确定 D. x y z同为正数时为真

    答案解析:

    x >= y and y >= z 为真,那么x>=z也为真,那么x>z or x=z 就为真,又因为x=z等价于y=z,故x > z or y == z 值为真

    • 式子 7*15 = 133 成立,则用的是几进制
      A. 7 B. 8 C. 9 D. 11

    答案解析:

    首先不可能是7进制,7进制不可能有7出现,这种题就得一个一个试试,假如是8进制,那15化为十进制就是13,133化成十进制就是91,而13乘以7恰好就是91,故是8进制


二、填空题

  • 下列程序执行后输出的结果是___
int f(int a)
{
    int b = 0;
    static int c = 3;
    a = c++,b++;
    return (a);
}
int main()
{
    int a = 2, i, k;
    for (i = 0; i < 2; i++)
    {
    	k = f(a++);
    }
    printf(" % d\\n", k);
    return 0;
}

答案解析:

首先将a++作为参数传给f函数,函数内部定义了变量b和静态变量c,而a=c++,b++;这个代码会将c++赋给a,而不是b++,因为c是后置加加,故函数第一次调用返回的是3,然后第二次调用,注意c是静态变量,它会保留上次调用后c最后的值,c此时是4,因为c是后置加加,故a=4,返回赋值到k,故k为4

  • 写出函数指针,要求返回值是 void , 无参数

答案解析:

*void (Fun)()

因为是函数指针,它首先是一个指针,Fun先要和*结合,然后没有参数,故后面的括号什么而不写,返回值为void,在前面写void

想要多了解指针前往博主指针进阶的讲解:指针进阶

  • 以下程序的输出的结果是
int x = 3;
void inc()
{
    static int x = 1;
    x *= (x + 1);
    printf("%d",x);
    return;
}
int main()
{
    int i;
    for (i = 1; i < x; i++)
    {
    	inc();
    }
    return 0;
}

答案解析:

x=3,我们循环进行两次,第一次调用函数进去有一个静态变量x=1,x=(x+1)得x=2,第一次调用打印2,第二次调用,因为x是静态变量,会保留之前调用的值,x*=(x+1)得x=6,第二次调用打印6*

三、算法题

题目描述:

编写函数,要求逆置单链表(不带头结点)。

思路一:

思路一:
调整结点指针的方向,n1和n2倒方向,n3进行迭代

当n2为NULL时,返回n1即可,但是这里有一个问题,将n2->next=n1,我们怎么找n2的下一个结点呢?这里我们还需要用一个n3结点保存之前n2的next

代码如下:

struct ListNode* reverseList(struct ListNode* head)
{
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode* n1=NULL;
    struct ListNode* n2=head;
    struct ListNode* n3=head->next;
    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)//n3不为空时,将n3=n3->next
        {
        	n3=n3->next;
        }
    }
    return n1;
}

思路二:

头插法,定义一个新链表,newhead=NULL,原链表定义cur和next,next记录cur的下一个结点

代码如下:

struct ListNode* reverseList(struct ListNode* head)
{
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode* newhead=NULL;
    struct ListNode* cur=head;
    
    while(cur)
    {
        struct ListNode* next = cur->next;
        cur->next=newhead;
        newhead=cur;
        cur=next;
    }
    return newhead;
}

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

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

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

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

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

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

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