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

Posted 小赵小赵福星高照~

tags:

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

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

一、选择题

  • 以下程序运行结果是
int main()
{
    char a[] = "123456789" , *p = a;
    int i = 0;
    while (*p)
    {
        if (i%2 == 0) *p = '!';
        i++ ;p++;
    }
    puts(a);
    return 0;
}

A. 1!3!5!7!9 B. !1!3!5!7!9! C. !2!4!6!8! D. 2!4!6!8

答案解析:

在数组下标为偶数的地方会被改为!,奇数位不变,故答案为C

  • 以下程序运行结果是
int main()
{
    char str[] = "ABCDEFG";
    char *p1, *p2;
    p1 = "abcd"; p2 = "efgh";
    strcpy (str+1, p2+1 );
    strcpy (str+3, p1+3 );
    printf("%s\\n", str);
    return 0;
}

A. Afgd B. AfgdEFG C. Abfhd D. Afghd

答案解析:

strcpy (str+1, p2+1 )后str变为Afgh

strcpy (str+3, p1+3 )后str变为Afgd

strcpy是会将\\0也会拷贝进去的

  • 阅读以下函数,此函数的功能是
int fun( char *s1, char *s2 )
{
    int i = 0 ;
    while( s1[i] == s2[i] && s2[i] != \\0')
    	i++;
    return ( s1[i] == '\\0' && s2[i] == '\\0' ) ;
}

A. 将 s2 所指字符串赋给 s1
B. 比较 s1 和 s2 所指字符串的大小,若 s1 比 s2 的大,函数值为 1 ,否则函数值为 0
C. 比较 s1 和 s2 所指字符串的长度,若 s1 比 s2 的长,函数值为 1 ,否则函数值为 0
D. 比较 s1 和 s2 所指字符串是否相等,若相等,函数值为 1 ,否则函数值为 0

答案解析:

该函数的作用是比较 s1 和 s2 所指字符串是否相等,若相等,函数值为 1 ,否则函数值为 0;因为while循环出来,要么是他们两不相等了,要么是s1、s2等于\\0了,要是他们两不相等的话,必有其中一个不为\\0,则返回的是0,要是s1、s2等于\\0了则他们两相等,返回1

  • 若有以下说明语句
struct student
{
    int num;
    char name[32];
    float score;
}stu;

则下面的叙述不正确的是
A. struct 是结构体类型的关键字
B. struct student 是用户定义的结构体类型
C. num, score 都是结构体成员名
D. stu 是用户定义的结构体类型名

答案解析:

struct 是结构体类型的关键字,正确;BC选项也正确,D选项stu是结构体变量,而不是用户定义的结构体类型名

  • 在 C 语言中,函数的数据类型是指____

A. 函数返回值的数据类型
B. 函数形参的数据类型
C. 调用该函数时的实参的数据类型
D. 任意指定的数据类型

答案解析:

函数的数据类型是指函数返回值的数据类型

二、填空题

  • 下列代码段打印结果是
int main()
{
    unsigned int a = 0xFFFFFFF7;
    unsigned char i = (unsigned char)a;
    char *b = (char *)&a;
    printf("%08x,%08x",i,*b);
    return 0;
}

答案解析:

将a强制类型转换为无符号的char赋给i,这里要发生截断,只能存进去8个字节,即i的内存是F7,printf打印i时,这里会发生整形提升,i是无符号的char,高位补0,故最后打印的是:000000f7;b指向的是a的一个字节内容,*b只能访问一个字节,VS内存是小端存储,高位在高地址,低位在低地址,a内存中的存储为F7FFFFFF,*b拿到a的第一个字节,即F7,但是在printf打印时这里发生了提升,b指向的内容是有符号的char,即*b是有符号的char,因为它是有符号的,前面补的是符号位,故最后打印的是fffffff7

  • 下面程序运行结果是____
int main()
{
    int j=4;
    int i=j;
    for ( ; i<=2*j; i++ )
    {
        switch ( i/j )
        {
        case 0:
        case 1:
        	printf("*");
        	break;
        case 2:
        	printf("#");
        }
	}
	return 0;
}

答案解析:

当i=4、5、6、7时,i/j都为1,即打印4个*,当i为8时,i/j=2,即打印#,故最后打印的是****#

  • 下面的程序运行结果是
int main()
{
    int x = 1, y = 012;
    printf("%d",y*x++);
    return 0;
}

答案解析:

y这样表示是8进制的数组字,十进制为10,y*x++,是后置++,故答案是10

三、算法题

题目描述:

如何快速查找到一个单链表的中间位置?编写函数实现

思路:

快慢指针,慢指针一次走一步,快指针一次走两步,当链表长度为奇数时,快指针的next为空时停止,此时的慢指针就为中间位置,当链表长度为偶数时,中间位置有两个结点,我们取第二个结点,快指针为空时停止,此时的慢指针就为就为中间位置。

slow一次走1步,fast一次走2步,fast走到结尾时,slow就走到了中间结点

但是当时偶数个结点呢?题目的要求是返回:如果有两个中间结点,则返回第二个中间结点。

经过画图理解,发现:

fast走到NULL时,slow到达第二个中间结点。

故循环终止的条件应为fast不为NULL并且fast->next不为NULL

代码如下:

struct LinkNode* FindMid(struct LinkNode *phead)
{
    if(phead==NULL)
    {
        return NULL;
    }
    struct LinkNode*slow,*fast;
    slow=fast=phead;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next;
    }
    return slow;
}

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

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

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

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

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

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

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