拒绝摆烂!C语言练习打卡第五天

简介: 拒绝摆烂!C语言练习打卡第五天



🗒️前言:

在前面我们学习完C语言的所以知识,当然练习巩固也不能落下。俗话说:“无财之谓贫,学而不能行之谓病。”可见实践对我们学习的重要。接下来就让小王带着大家进行练习,巩固我们C语言的学习。

一、选择题

📝1.第一题

请指出以下程序哪步有错误【多选】( )

void GetMemory(char** p, int num)
{
    if (NULL == p && num <= 0)//1
    {
        return;
    }
    *p = (char*)malloc(num);
    return;
} 
int main()
{
    char* str = NULL;
    GetMemory(&str, 80); //2
    if (NULL != str)
    {
        strcpy(&str, "hello"); //3
        printf(str); //4
    } 
    return 0;
}

💡解题思路:

  • 代码1错误:通过观察代码我们可以知道这个函数的功能是要动态开辟空间,num 是开辟空间的大小不能为0,p 是二级指针不能为空指针,这两个条件有一个不满足,程序就会出错,所以应该使用 || 。
  • 代码2正确:在代码2中传入 str 的地址,在语句 char*str=NULL;中str初始化为空指针,但是 str 指针变量也有地址,所以 p 保存的是指针变量 str 的地址,所以调用GetMemory函数之后,动态开辟的空间的地址存放在了str中。
  • 代码3错误:这里是要进行字符串的拷贝,要传递的是字符串的地址,而这里使用了&符号,传递的是地址的地址,所以是错误的。

📝2.第二题

已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( )

A、*(X[i]+j)    B、*(X+i)[j]     C、*(X+i+j)        D、*(*(X+i)+j)

💡解题思路:

X [ i ][ j ]表示取二维数组的第 i 行,第 j 列

  • A选项:在二维数组中X[ i ]表示的是第 i 行首元素的地址,再加 j,表示找到第 i 行的第 j 个元素的地址,在解引用就可以找到这个元素啦。
  • B选项:我们知道数组名是首元素的地址所以 X 是二维数组第一行的地址,加 i 找到第 i 行,这里要注意 ()、[] 的优先级比 * 的优先级高,所以 * 最后执行。由 arr[i]=*(arr+i),可得 *(*( (X+i)+j) ),这样是错误的。
  • C选项:X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了,也是错误的。
  • D选项:*(X+i) 等价于 X[ i ], *(X[ i ]+j) 就等价于 X[ i ][ j ]。

📝3.第三题

下面这个程序执行后会有什么错误或者效果【多选】( )

#define MAX 255
int main()
{
    unsigned char A[MAX], i;
    for (i = 0; i <= MAX; i++)
    {
        A[i] = i;
    }
  return 0;
}

💡解题思路:

  • 我们通过观察代码可以看到数组的大小为255,所以它的下标是 0-254,i<=MAX 条件都满足,i=255,进入循环 A[255]=i 会出现越界访问。
  • A是无符号字符型,它的取值范围是 0-255,255在加1时,就会变成0重新循环,所以程序会陷入死循环

二、编程题

📝1.第一题

💡解题思路:

我们要统计连续1的个数,使用一个计数器,当遇到连续的1时就++,遇到0时,将计数器清0,重新记录连续1的个数。每次连续的个数记录起来,与上一次的比较,如果当前的个数大于之前的个数就替换,如果不大于就不替换,最终就可以得到最大连续1的个数。

int findMaxConsecutiveOnes(int* nums, int numsSize)
{
    int count = 0;
    int max = 0;
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] == 1)
        {
            count++;
        }
        else
        {
            count = 0;
        }
        if (count > max)
        {
            max = count;
        }
    }
    return max;
}

📝2.第二题

💡解题思路:

我们遍历数组中的每个元素,数组元素的绝对值为几,就把数组第几个元素置为负数,也就是n-1下标的元素。因为数组的元素是1~n,下标的元素是0~n-1。

abs函数是对整数进行取绝对值。因为对一个位置加两个负号,就会变成正数,所以要取绝对值。

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
    *returnSize = 0;
    int* new = (int*)malloc(sizeof(int) * numsSize);
    for (int i = 0; i < numsSize; i++)
    {
        //把(元素-1)作为下标
        int index = abs(nums[i]) - 1;
        //将下标对应的值置为负数
        //这里取绝对值是防止对重复的位置置为负数
        nums[index] = -abs(nums[index]);
    }
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] > 0)
        {
            new[*returnSize] = i + 1;
            (*returnSize)++;
        }
    }
    return new;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

相关文章
|
6月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
46 0
|
6月前
|
C语言
C语言指针——练习
C语言指针——练习
|
5月前
|
C语言
C语言练习代码第一篇
C语言练习代码第一篇
|
6月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
52 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
5月前
|
C语言
|
6月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
19 0
|
5月前
|
编译器 C语言
|
5月前
|
C语言
|
6月前
|
存储 C语言
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(中)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
37 0
|
6月前
|
C语言
C语言递归练习
C语言递归练习
28 0