暑假第八天之每天一些题系列
Posted 小赵小赵福星高照~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第八天之每天一些题系列相关的知识,希望对你有一定的参考价值。
暑假第八天之每天一些题系列
一、选择题
- 若有定义 typedef char STRING[255]; STRING s; 则 s 是
A. 字符指针数组变量
B. 字符数组变量
C. 字符变量
D. 字符指针变量
答案解析:
typedef char STRING[255];将char类型重定义为STRING[255],而STRING s就相当于是char s[255];,s是字符数组变量
- 若有定义语句: int a = 10; double b = 3.14; 则表达式 ‘A’+a+b 的类型是
A. char B. int C. double D. float
答案解析:
char+int+double,这里的考点和前面几天的一些题一样,还是算术转化最终会转化为double型
- *int p[4] 与选择项中的等价
A. int p[4] B. int *p C. int *(p[4]) D. int (*p)[4]
答案解析:
*int p[4]是指针数组,A选项是数组,B选项是指针,C选项是指针数组,D选项是数组指针,故只有C和int *p[4]等价
-
关于代码 char acX[] = “abcdefg”; char acY[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’}; ,如下说法正确的
是A. 数组 acX 和数组 acY 等价
B. 数组 acX 和数组 acY 的长度相同
C. 数组 acX 的长度大于数组 acY 的长度
D. 数组 acX 的长度小于数组 acY 的长度
答案解析:
A显然是错误的,acX是以字符串的形式初始化,故acX当中还有\\0,acY是以字符的形式初始化,故acY当中没有\\0;数组acX的长度为8,而acY的长度为7,故C是正确的。
-
如下代码的运行结果是____
char s[]="\\\\123456\\123456\\t"; printf("%d\\n",strlen(s));
A. 12 B. 13 C. 16 D. 以上都不对
答案解析:
\\xxx与\\t都是转义字符,\\xxx,就是将转义字符取消掉了,就不转义了,\\是一个字符,123456是六个字符,\\123是一个字符,456是三个字符,\\t是一个字符,一个12个字符
二、填空题
-
如下代码的运行结果是
#include<stdio.h> int main() { int s = 0,n; for(n=0; n<4; n++) { switch(n) { default:s+=4; case 1:s+=1; case 2:s+=2; case 3:s+=3; } } printf ("%d\\n",s); return 0; }
答案解析:
当n=0时,switch语句进入default,因为没有break,故会一直往下执行case,执行完后,s=10,当n=1时,switch语句执行case 1,因为没有break,故会一直往下执行case,执行完后,s=16,当n=2时,switch语句执行case 2,因为没有break,故会一直往下执行case,执行完后,s=21,当n=3时,switch语句执行case 3,执行完后,s=24,故最后s为24
-
有如下代码
char *pcColor = "blue1"; char acColor[] = "blue1";
strlen(pcColor) =
strlen(acColor) =
sizeof(pcColor) =
sizeof(acColor) =
答案解析:
pcColor是字符指针,它里面存放的是字符串首字符的地址,acColor是字符数组,strlen计算的是字符串长度,故strlen(pcColor) = 5,strlen(acColor) = 5,sizeof是操作符,计算占用空间的大小,因为pcColor是指针,故在32位平台下是4字节,64位平台下是8字节,故sizeof(pcColor) = 4或者8,我们常说数组名是首元素的地址,但是有例外:sizeof(数组名)表示整个数组的地址,sizeof(acColor)计算的是整个数组的大小,这里需要考虑\\0的存在,故sizeof(acColor) = 6
-
如下代码的输出结果是
int main () { unsigned long ulA = 0x11000000; printf("%x\\n",*(unsigned char *)&ulA); return 0; }
答案解析:
无符号字符类型的指针解引用访问1个字节,在vs平台下是小端存储,小端存储是低位放在低地址,高位放在高地址,那么解引用首先访问的是低位的1个字节的内存,就是访问到0x11000000的00,以十六进制打印就是0。
三、算法题
题目描述:
编写函数: 求数组中元素出现次数超过数组长度一半的数字。如: {1,2,3,2,2,2,5,4,2} 数字 2 为超过数组长度一半的数字。
解法一思路:
不管数组长度是偶数还是奇数,超过一半数组长度的数字元素都一定是数组中间的那个元素,那么我们只需要将原来的数组进行从小到大或者从大到小的排序,最后我们要找的数字就是中间的那个元素。
代码如下:
#include<stdio.h>
void sort(int arr[], int sz)
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int FindMid(int arr[], int k)
{
sort(arr, k);
int Mid = arr[k/2];
return Mid;
}
int main()
{
int arr[] = {5,5,5,2,1,8,9,5,5,5};
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = FindMid(arr,sz);
printf("%d\\n", ret);
return 0;
}
解法二思路:
该数字个数超过数组长度一半,那么这个个数一定大于数组剩余元素的个数之和,因此当我们遍历到下一个数字的时候,如果相同,次数加一,不同次数减一,直到0。如果为0,那么保存下一个数字,并把次数设置为1,找的就是最后设置为1的数字
int FindNum(int arr[],int sz)
{
int cur=0;
int i=0;
int count=0;
for(i=0;i<sz;i++)
{
if(count==0)//说明前面没有保存的数字出现的次数等于当前和他不同值的个数
{
cur=arr[i];//5 9 5
count=1;
}
else if(arr[i]==cur)
{
count++;//2 3
}
else
{
count--;//2 1 0 0
}
}
return cur;
}
int main()
{
int arr[] = {5,5,5,2,1,8,9,5,5,5};
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = FindNum(arr,sz);
printf("%d\\n",ret);
return 0;
}
以上是关于暑假第八天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章