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

🔥博客主页:小王又困了

📚系列专栏:每日一练

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、选择题

📝1.第一题

📝2.第二题

📝3.第三题

二、编程题

📝1.第一题

📝2.第二题


🗒️前言:

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

一、选择题

📝1.第一题

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

cpp 复制代码
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.第三题

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

cpp 复制代码
#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的个数。

cpp 复制代码
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函数是对整数进行取绝对值。因为对一个位置加两个负号,就会变成正数,所以要取绝对值。

cpp 复制代码
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;
}

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

相关推荐
秋说31 分钟前
【PTA数据结构 | C语言版】一元多项式求导
c语言·数据结构·算法
Maybyy43 分钟前
力扣61.旋转链表
算法·leetcode·链表
我是苏苏44 分钟前
C#基础:Winform桌面开发中窗体之间的数据传递
开发语言·c#
斐波娜娜1 小时前
Maven详解
java·开发语言·maven
小码氓1 小时前
Java填充Word模板
java·开发语言·spring·word
暮鹤筠2 小时前
[C语言初阶]操作符
c语言·开发语言
卡卡卡卡罗特3 小时前
每日mysql
数据结构·算法
chao_7893 小时前
二分查找篇——搜索旋转排序数组【LeetCode】一次二分查找
数据结构·python·算法·leetcode·二分查找
蜉蝣之翼❉4 小时前
CRT 不同会导致 fopen 地址不同
c++·mfc
Boilermaker19924 小时前
【Java EE】Mybatis-Plus
java·开发语言·java-ee