暑假第十五天之每天一些题系列
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;
}
以上是关于暑假第十五天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章