C语言题目强化-DAY09

题型指引

  • 一、选择题
  • 二、编程题


★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。


一、选择题

1、下列程序的输出是( )

#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[i]是二元数组中每一行首元素的地址,所以原数组可以分为:1,2,3//4,5,6//7,8,9//10,11,12这样4行3列的二维数组,p[3][2]=12,选项D正确。

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

正确答案:A
答案解析:设数组每一行有n个元素,从Oxf8b82140到Oxf8b8221c可以列出方程,n-5+4n+10=5n+5=220,结果n=43。所以X[7][7]的地址为2*43+43-5+8=1c4(注意是十六进制的计算)。

3、以下哪个选项可以正确描述sizeof(double) ( )

A: 一个整型表达式 B: 一个双精度型表达式 C: 一个不合法的表达式 D: 一种函数调用

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

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

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的值并没有改变;第二次输出的时候,a先赋值再加加,赋值给b的就是a原来的值,输出b的时候的还是’b’,选项A正确。

程序运行截图

C语言题目强化-DAY09_第1张图片

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

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

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

正确答案:A
答案解析:先计算4*5并赋值给x,x变为20,中间x*5并没有改变x的值,最后一项x+5值是25,也就是整个表达式的值,选项A正确。

二、编程题

1、自除数 是指可以被它包含的每一位数除尽的数。例如, 128 是一个自除数,因为 128 % 1 == 0 , 128 % 2 ==
0 , 128 % 8 == 0 。还有,自除数不允许包含 0 。给定上边界和下边界数字,输出一个列表,列表的元素是边界
(含边界)内所有的自除数。

leetcode【leetcode 题号:728. 自除数】

示例:
输入:上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
int* selfDividingNumbers(int left, int right, int* returnSize){
    //...
}
int isSelfDividing(int num) {		
    int tmp = num;
    while (tmp > 0) {
        int digit = tmp % 10;						//对余数的值进行判断
        if (digit == 0 || num % digit != 0) {		//余数不能为0且要不能被整除的时候,返回0
            return 0;
        }
        tmp /= 10;
    }
    return 1;										//如果都遍历完了都还没返回0,那么说明这个数是自除数
}

int* selfDividingNumbers(int left, int right, int* returnSize){
    int * arr = (int *)malloc(sizeof(int) * (right - left + 1));//开辟内存
    int j = 0;
    for (int i = left; i <= right; i++) {						//循环遍历left-right所有的数
        if (isSelfDividing(i)) {								//每个数进行函数包装单独判断
            arr[j] = i;
            j++;
        }
    }
    *returnSize = j;
    return arr;
}

代码思路:遍历从left-right之间的所有整数,对于每一个整数进行函数单独判断是否是自除数,需要注意的是余数为0的时候,这个数依然不能作为自除数。

2、给你一个长度为 n 的整数数组 nums ,其中 n > 1 ,返回输出数组 output ,其中 output[i] 等于 nums 中除
nums[i] 之外其余各元素的乘积。
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

leetcode【leetcode 题号:238. 除自身以外数组的乘积】

示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    *returnSize = numsSize;
    int mul = 1;
    int* output = (int*)malloc(numsSize * sizeof(int));
    int j = 0;
    for (int i = 0; i < numsSize; i++)
    {
        mul = 1;
        for (j = 0;  j < numsSize; j++)
        {
            if(j!=i)
            mul *= nums[j];
        }
        output[i] = mul;
    }
    return output;
}

代码思路:简单的循环判断题,其中需要注意的是函数参数有一个int* returnSize,这个参数的意思是向函数传递了返回数组的元素个数,也就是说外面定义了返回数组的长度,但是长度可能只是初始化了一下,所以我们在函数内部需要用指针访问去赋值一下,因为是malloc开辟的内存空间,数组的长度我们是不知道的也无法作为函数结果进行返回,因此只能通过解引用的方式进行值的修改。

你可能感兴趣的:(C语言题目强化练习,c语言,linux,开发语言)