10.20复习

文章目录

  • 前言
  • 一.选择题
    • 1.第一题
    • 2.第二题
    • 3.第三题
    • 4.第四题
    • 5.第五题
    • 6.第六题
    • 7.第七题
    • 8.第八题
    • 9.第九题
    • 10.第十题
  • 二.编程题
    • 1.第一题
    • 2.第二题
    • 3.第三题
    • 4.第四题


前言


一.选择题

1.第一题

1、如下程序的运行结果是( )

char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c);

A: ‘a’ ‘b’ B: ab\0c\0 C: ab c D: ab

解析 c
以字符串形式打印,\0结束

2.第二题

2、若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )
A: a[2][0] B: a[2][3] C: a[0][3] D: a[1>2][1]

解析 D
其他数组存在越界

3.第三题

3、在下面的字符数组定义中,哪一个有语法错误( )
A: char a[20]=“abcdefg”; B: char a[]=“x+y=5.”; C: char a[15]; D: char a[10]=‘5’;

解析 D
D中的’5’是一个字符常量,不能给字符型数组a初始化

4.第四题

4、下列定义数组的语句中正确的是【多选】( )
A:

#define size 10
char str1[size], str2[size+2];

B: char str[]; C: int num[‘10’]; D: int n=5; int a[n][n+2];

答案解析:
正确答案:AC
A选项:宏替换,没问题;B选项:非法定义,一维数组必须定义数组元素个数;C选项:字符’0’,转换成十进制为48,所以该选项最终为int num[48];D选项:错误,数组定义下角标不能为变量,注:C99标准中支持了使用变量,这里不做特殊考虑。

5.第五题

5.已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( )
在这里插入图片描述

答案解析:
正确答案:BC
*(x+i)等价于下x[i];
b c 问题都是一样的 等价于
*(x+i+j)越界了

6.第六题

6.下列程序的输出是( )

#include
int  main()
{
  int a [12]= {1,2,3,4,5,6,7,8,9,10,11,12}*p[4],i;
  for(i=0;i<4;i++)
    p[i]=&a [i*3];
  printf("%d\n",p[3][2]);
  return 0;
}

A: 上述程序有错误 B: 6 C: 8 D: 12

答案解析:
正确答案:D
p是一个指针数组,p[i] = &a[i*3]相当于是把数组a每3个一组分开并把每组的首地址存在p数组,此时p类似一个4行3列的二维数组,p[3][2]就是4行第3个元素12

7.第七题

7、二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为( )
A: Oxf8b821c4 B: Oxf8b821a6 C: Oxf8b82198 D: Oxf8b821c0

答案解析:
正确答案:A
假设每行有n个元素:那x[9][9]元素的地址 - x[4][4]元素的地址 = 0x21c-0x140=5n+5(21c和140是地址末三位的十六进制数),这里n是43,假设x[7][7]的地址是z,x[7][7]元素的地址 - x[4][4]元素的地址 = z-0x140 = 3n+3,z= 3n+3+140 = 3*43+3+0x140 = 0x84+0x140 = 0x1c4,看地址的尾数,选择A

8.第八题

8、以下哪个选项可以正确描述 sizeof(double) ( )
A: 一个整型表达式 B: 一个双精度型表达式 C: 一个不合法的表达式 D: 一种函数调用

答案解析:
正确答案:A
sizeof是C语言中的一个操作符,不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数,结果是无符号整数,因此可以把它看作是整型表达式。所以选择A

9.第九题

9、下列代码运行后的结果是什么( )

int main()
{
  char a = 'a',b;
  printf("%c,", ++a);
  printf("%c\n", b = a++);
  return 0;
}

A: b,b B: b,c C: a,b D: a,c

答案解析:
正确答案:A
变量a里边存的是字符’a’,第一次输出先加加再输出,输出的是’b’;第二次输出的时候,a先赋值再加加,赋值给b的就是a原来的值,输出b的时候的还是’b’

10.第十题

10、以下逗号表达式的值为( )

(x = 4 * 5 , x * 5) , x + 5;

A: 25 B: 20 C: 100 D: 45

解析 A
逗号表达式,从前到后依次计算子表达式,而结果是最后一项的值,所以原式中括号可以去掉,x的值被赋值为20,x*5不改变x的值,因此输出25

二.编程题

1.第一题

10.20复习_第1张图片

#include 
int main()
{
    char a[500]={0};
    char b[128]={0};
    scanf("%s",a);
    int i=0;
    int sum=0;
   while(a[i])
   {
       b[a[i]]=1;//桶排序将值赋值为1,相加就是数量和
       i++;
   }
    for(i=0;i<128;i++)
    {
        sum+=b[i];

    }
    printf("%d",sum);
    return 0;

}

2.第二题

10.20复习_第2张图片



int majorityElement(int* nums, int numsSize)
{
    int count=1;
    int i=0;
    int cmp=nums[0];
    for(i=1;i<numsSize;i++)
    {
        if(cmp==nums[i])
        {
            count++;
        }
        else
        count--;
        if(count==0)
        {
            cmp=nums[i+1];
        }
    }
    return cmp;

}

3.第三题

10.20复习_第3张图片

int* selfDividingNumbers(int left, int right, int* returnSize)
{
   int  static arr[10000] ;
    int i=0;
    * returnSize=0;
    for(i=left;i<=right;i++)
    {
        int num=i;
        while(num)
        {
            int number=num%10;
            if(number==0||i%number!=0)
            {
                break;
            }
            num/=10;

        }
        if (num == 0) 
        {
            arr[(*returnSize)++] = i;
        }
        
    }
   
    return arr;

}

4.第四题

10.20复习_第4张图片

int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    int *ret = (int *)malloc(numsSize *sizeof(int));
    int left=1,right=1;
    * returnSize=numsSize;

    int i=0;
    for(i=0;i<numsSize;i++)
    {
        ret[i]=left;
        left*=nums[i];
    }
    for(i=numsSize-1;i>=0;i--)
    {
        ret[i]*=right;
        right*=nums[i];
    }
    return ret;
    }

10.20复习_第5张图片

你可能感兴趣的:(刷题日记,c语言)