c语言每日一练(9)

news2024/11/22 17:44:50

前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。

五道选择题:

1、以下 scanf 函数调用选项中, 错误的是( )

struct T
{
char name[20];
int age;
int sex;
} a[5], *pa=a;

A、scanf("%s",a[0].name);

B、scanf("%d", &pa[0].age);

C、scanf("%d",&(pa->age));

D、scanf("%d", pa->age);

解析:首先,你要明白scanf需要什么,它需要地址,你只要给它对应数据的地址,它就会根据地址对你所给的目标进行修改

选项A,通过结构体数组访问到结构体,再通过结构体访问到结构体成员,但它访问的是字符数组,而字符数组的本质就是指针,故A正确。选项B,使用结构体数组的方式访问结构体,再通过结构体访问结构体成员,不同于A的是它访问的是整型变量,整型变量没有字符数组那么特殊,因此要取地址,它也取了,故B正确。

选项C,使用->的方式取到了结构体成员,并取了地址,和B雷同,C正确。D选项,与C不同的就在于没有取地址,因此,scanf无法正确地执行,故D错误。

2、关于指针下列说法正确的是【多选】( )
A、 任何指针都可以转化为void * B、 void *可以转化为任何指针
C、 指针的大小为8个字节           D、 指针虽然高效、灵活但可能不安全

解析:C错误,因为指针的大小是随着平台的变化而变化的,当指针处于32位平台时,大小为4,为64位平台时位8,ABD没有问题。 

3、请指出以下程序的错误【多选】( )

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

A、1      B、2      C、3     D、4

 解析:代码1错误,因为得同时满足两个条件才会直接报错,但很显然,我们的目的是令num>0,p!=NULL,因此一个有误就得报错。

在语句GetMemory(&str,100);中传入str的地址,在语句char*str=NULL;中str初始化为空指针,但是str指针变量也有地址,所以参数char**p里面的p保存的是指针变量str的地址,所以调用GetMemory函数之后,动态开辟的空间的地址存放在了str中,在函数返回之后没有释放内存,但是这不会导致程序错误,只会导致内存泄漏。故代码2无误。

代码3错误,&str相当于是对地址的地址进行操作了,没操作到该操作的。代码4是正确的,相当于printf("hello");综上所述,选AC

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

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

A、 数组越界 B、 死循环 C、 栈溢出 D、 内存泄露

解析:选项A,观察代码可以看出创建的数组大小为255,因此,数组下标最大为244,i<=MAX的条件一定会令i达到255,会越界。选项B,每次循环i++,MAX的值是定值,好像不会造成死循环,但i是unsigned char型的,因此,i最大为255,当要超出255时就会像一个圆绕回到0,所以会导致死循环。

C选项,创建的临时变量,在栈中,应该会由系统自动释放,所以是不存在内存泄漏的问题。栈溢出:属于缓冲区溢出的一种。栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围,D选项,无稽之谈,我都没有申请空间,所以根本不会有内存泄漏。综上所述,答案为AB

5、请问下列程序的输出是多少( )

#include<stdio.h>
int main()
{
    unsigned char i = 7;
    int j = 0;
    for (; i > 0; i -= 3)
    {
        ++j;
    }
    printf("%d\n", j);
    return 0;
}

A、2     B、死循环    C、173    D、172

解析:unsigned char 型的范围为0~255,为负数的时候也会像圆一样绕回来,反着绕。观察代码,i被初始化为7,每次进行循环i-3,i>0循环继续,每次循环j++,最后打印出j,目标计算循环次数。i=7,循环到i=-2时,由于unsigned char的特殊性会令i=254,254/3=84余2,即i=2,再使i=-1,由于特殊性,i=255,255/3=85,i=0,循环结束。综上所述,循环次数为3+84+1+85=173,故选C

编程题1:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 思路:猜中次数很好计算,一次循环就可以计算出来,难的是伪猜中的次数。首先,猜中不能被算作伪猜中,那么一旦猜中,那两个被猜中的槽就可以看作配对成功,不用再考虑,可以把它们置为-1。在后期的判定中,一遇到-1便continue切换槽位即可,而一旦伪猜中成功,那两个槽也相当于废掉了,不能在同一个槽伪猜中多次,这是一个隐藏规则,所以把这两个槽也置为-1

#include<stdio.h>
#include<stdlib.h>
int* masterMind(char* solution, char* guess, int* returnSize) {
    *returnSize = 2;
    //初始化返回的数组,因为我们仅仅只需要返回猜中次数和伪猜中次数,所以必定为2
    int* order = (int*)malloc(sizeof(int) * 2);
    //创建返回数组
    int i = 0; int j = 0;
    int count_true = 0;//猜中次数计数
    int count_false = 0;//伪猜中次数计数
    for (i = 0; i < 4; i++)
        //一共四个槽,所以solution和guess的数组大小都为4
    {
        if (solution[i] == guess[i])
        {
            count_true++;
            solution[i] = -1;
            guess[i] = -1;
            //由于猜中的槽,伪猜中的不能重复,所以置为-1,用来判定
        }
    }
        for (i = 0; i < 4; i++)
        {
            if (solution[i] == -1)
            {
                continue;
            }
            for (j = 0; j < 4; j++)
            {
                if (guess[j] == -1)
                {
                    continue;
                }
                if (solution[i] == guess[j])
                {
                    count_false++;
                    solution[i] = -1;
                    guess[j] = -1;
                }
            }
        }
        order[0] = count_true;
        //存放猜中次数
        order[1] = count_false;
        //存放伪猜中次数
        return order;
        //返回目标
    }

编程题2:

 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 

思路:暴力破解,没什么好说的,两个循环遍历完蛋

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    *returnSize = 2;
    //只用返回两个数,所以数组大小必定为2
    int* order = (int*)malloc(sizeof(int) * 2);
    //创建一个符合条件的数组
    int i = 0; int j = 0;
    for (i = 0; i < numsSize; i++)
    {
          for(j=i+1;j<numsSize;j++)
        {   //减少循环次数
            if (nums[i] + nums[j] == target)
                //找到目标,直接储存并返回
            {
                order[0] = i;
                order[1] = j;
                return order;
            }
        }
    }
    return NULL;//找不到返回空
}

  好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定位服务器CPU爆满的具体原因

1、查询CPU消耗的进程 使用top命令查看系统的CPU和内存使用情况 CPU一列是线程占用百分比 2、具体查看某个占分比大的进程 以为PId:7355为例&#xff0c; 执行top -Hp 7355&#xff0c;线程按照CPU使用率排序。 3、将线程PID转化为16进制 执行printf %x 7391&#xff0c;将…

三维模型OSGB格式轻量化重难点分析

三维模型OSGB格式轻量化重难点分析 在三维模型应用中&#xff0c;为了适应移动设备的硬件和网络限制等问题&#xff0c;OSGB格式轻量化处理已经成为一个重要的技术手段。但是&#xff0c;在实际应用中&#xff0c;OSGB格式轻量化仍然存在着一些重难点问题。下面将对这些问题进行…

视频云存储/安防监控/视频汇聚EasyCVR平台新增设备经纬度选取

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

Spring Clould 部署 - Docker

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; 初识Docker-什么是Docker&#xff08;P42&#xff0c;P43&#xff09; 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&…

两个案例熟悉String的基本操作

1、第一个案例 Java语言规范要求完全相同的字符串字面量&#xff0c;应该包含同样的Unicode字符序列&#xff08;包含同一份码点序列的常量&#xff09;&#xff0c;并且必须是指向同一个String类实例。 package string; public class StringTest4 {public static void main(St…

【3Ds Max】挤出命令的简单使用(实现二维变三维)

简介 在3ds Max中&#xff0c;"挤出"&#xff08;Extrude&#xff09;是一种常用的建模操作&#xff0c;用于在平面或曲面上创建立体几何形状。以下是使用3ds Max中的挤出命令的基本步骤&#xff1a; 创建基本几何形状&#xff1a; 在3ds Max中创建一个基本的几何形…

免费开源的vue+express搭建的后台管理系统

此项目已开源 前端git地址&#xff1a;exp后台管理系统前端: exp后台管理系统前端 后端git地址&#xff1a;express后台管理系统: express后台管理系统 安装运行 npm i yarn i 前端: npm run dev | yarn dev 后端: npm run start | yarn start 主要技术栈 前端后端名称版本名…

Ant Design Pro 前端脚手架 配置混合导航

Ant Design Pro脚手架 点击查看阅读 混合导航&#xff1a; 顶部导航和侧边栏导航实现联动效果&#xff0c;点击不同的顶部导航按钮会显示对应的子菜单项。 实现点&#xff1a; 1. 路由的配置 菜单展示 我们可以在 route 中进行 menu 相关配置&#xff0c;来决定当前路由是否…

传递给Java方法的参数必须完成初始化

说明 在调用Java方法的时候&#xff0c;传递给方法的参数必须经过初始化&#xff0c;否则会编译报错。 指向对象的变量&#xff0c;指向一个对象实例就是初始化&#xff1b;赋值为null也是初始化。 代码示例 没有初始化的变量传递给方法编译报错&#xff0c;初始化的编译通过…

QTableWidget使用

QTableWidget介绍 QTableWidget是Qt框架中的一个表格控件&#xff0c;用于显示二维表格数据。它是基于QTableView和QStandardItemModel的封装&#xff0c;提供了更简单的接口和功能。 QTableWidget主要具有以下特点&#xff1a; 二维数据表示&#xff1a;QTableWidget以行和列…

ruoyi-cloud 服务间的调用,OpenFeign的使用

1. 在公共包内添加实体类 2.在 com.ruoyi.common.core.constant 添加如下代码 package com.ruoyi.common.core.constant; public class ServiceNameConstants {/*** 药材服务的serviceid &#xff08;生产者 nacos内注册应用名&#xff09;*/public static final String DRUG_…

AI极客日报0818 - AI帮助中风患者重新行走

&#x1f440;AI 日报合集 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 有了人工智能&#xff0c;似乎没有什么是我们解决不了的。人工智能的一项新突破让瘫痪的中风幸存者能够通过“智能裤子”再次行走。让我们深入了解…… 今日要点: **&#x1f456;惊艳&#xff01…

QT实现天气预报

1. MainWindow类设计的成员变量和方法 public: MainWindow(QWidget* parent nullptr); ~MainWindow(); protected: 形成文本菜单来用来右键关闭窗口 void contextMenuEvent(QContextMenuEvent* event); 鼠标被点击之后此事件被调用 void mousePressEvent(QMouseEv…

系统架构设计师之软件架构风格

系统架构设计师之软件架构风格

学习心得02:QT6

以前也多少接触过QT。只是因为工作并不需要深入了解&#xff0c;所以是简单试用。现在有时间了&#xff0c;专门买了本书&#xff0c;从头到尾看了一番。因为是补充知识&#xff0c;所以范例、操作也没有实际操作。 QT使用的语言是C。比较特殊的地方是信号和槽。

11----图片

在Markdown中&#xff0c;可以通过简单的语法插入图片。 一、普通的添加图片&#xff1a;![图片描述](图片链接) 下面的代码&#xff0c;在上一节生成超链接的代码&#xff08;链接到网站&#xff09;前面添加一个感叹号(!)&#xff0c;同时把链接换成图片地址。 其中&#xf…

[PCIE 5.0] 第5代PCIe SSD 发展前沿(2023 Q2 更新)

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,禁止转载,如有误请留言。 1 什么是 PCIe 5.0? 第 5 代快速周边组件互连称为 PCI Express 5.0。它也称为第 5 代 PCIe、PCIe 5、PCI v5 或简称为 PCIe 5.0。 2 PCIE5.0 速度 2.1 PCIE5.0 极限速度 从PCIe 4.0更新到…

【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发&#xff0c;需要用到集列表&#xff0c;也就是SetList这个控件&#xff0c;然而网上相关的资料和范例实在是太少&#xff0c;有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG&#xff08;NX&#xff09;二次开发 BlockUI 集列表使用方法》&#xff0…

vite+vue3 自动按需导入element-plus

安装element npm install element-plus自动导入 安装自动导入的插件: npm install -D unplugin-vue-components unplugin-auto-import配置 vite.config.js文件&#xff1a; import { defineConfig } from vite import AutoImport from unplugin-auto-import/vite import C…

Axios使用CancelToken取消重复请求

处理重复请求&#xff1a;没有响应完成的请求&#xff0c;再去请求一个相同的请求&#xff0c;会把之前的请求取消掉 新增一个cancelRequest.js文件 import axios from "axios" const cancelTokens {}export const addPending (config) > {const requestKey …