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

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;
}

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

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

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

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

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

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

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