习题练习 C语言(暑期第四弹)

news2024/11/23 10:56:11

在这里插入图片描述

自我小提升!

  • 前言
  • 一、数组
  • 二、指针运算
  • 三、统计每个月兔子的总数
  • 四、双指针的应用
  • 五、判断指针
  • 六、珠玑妙算
  • 七、两数之和
  • 八、数组下标
  • 九、指针
  • 十、寻找峰值
  • 十一、二级指针
  • 十二、大端小端
  • 十三、无符号参数
  • 十四、数对
  • 十五、截取字符串
  • 总结


前言

重要的事说三遍!
学习!学习!学习!


一、数组

若有定义 int a[8]; ,则以下表达式中不能代表数组元素 a[1] 的地址的是( )
A: &a[0]+1
B: &a[1]
C:&a[0]++
D: a+1

题目解析:
D选项a计算时是首元素地址,再加1,就是a[1]的地址,AB明显对,C选项a[0]先和++结合,形成一个表达式,不能对表达式取地址,会报错
题目答案:
C


二、指针运算

以下选项中,对基本类型相同的两个指针变量不能进行运算的运算符是( )
A: +
B: -
C: =
D: ==

题目解析:
A错误,因为两个地址相加无意义也可能越界,所以规定不允许指针相加。B选项,可以求出两个数据元素储存位置之间的相
隔同数据类型的元素个数,C选项,赋值,没问题,D选项,判断两指针是否相同

题目答案:
A


三、统计每个月兔子的总数

题目链接:OJ链接
在这里插入图片描述

题目解析:
这道题的关键在于寻找数字之间的规律,如果细心的同学会发现这其实是一个斐波那契数列。第 n 个月的兔子数量实际上就是第 n-1 个斐波那契数。
在这里插入图片描述
题目答案:

#include <stdio.h>
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int sum1=1;
        int sum2=1;
        if(n<=2)
            printf("%d",sum2);
        else{
            for(int i=0;i<n-2;i++){
                int temp=sum1+sum2;
                sum1=sum2;
                sum2=temp;
            }
        }
        printf("%d",sum2);
    }
    return 0;
}

四、双指针的应用

有以下函数,该函数的功能是( )

int fun(char *s)
{
    char *t = s;
    while(*t++);
    return(t-s);
}

A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中

题目解析:
循环在*t为0时停止,同时t++,t最后会停在字符串结束的’\0’之后的一个位置,t作为尾部指针减去头部指针就是整个字符串占用内存的字节数,包含\0在内;而c答案字符串长度不包括最后的\0
题目答案:
B


五、判断指针

以下程序运行后的输出结果是( )

include <stdio.h>
int main()
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p = a + 5, *q = NULL;
    *q = *(p+5);
    printf("%d %d\n", *p, *q);
    return 0;
}

A: 运行后报错 B: 6 6 C: 6 11 D: 5 10

题目解析:
指针q初始化为NULL,接着又解引用指针q,是错误的,对NULL指针是不能解引用的。
题目答案:
A


六、珠玑妙算

题目链接:OJ链接
在这里插入图片描述

提示:
len(solution) = len(guess) = 4
solution和guess仅包含"R",“G”,“B”,"Y"这4种字符

题目解析:
遍历两个数组,统计猜中次数和伪猜中次数
猜中次数:若位置相同且颜色字符也相同在猜中次数计数器+1
伪猜中次数:颜色相同,但是在不同位置,这时候只需要除去猜中位置之外,统计两个数组中各个字符出现的数量,取较小的一方就是每种颜色伪猜中的数量了

题目答案:

int* masterMind(char* solution, char* guess, int* returnSize){
    *returnSize=2;
    static int arr[2]={0};
    arr[0] = 0; arr[1] = 0;//静态空间不会进行二次初始化因此每次重新初始化,可以使用memset函数
    int solu[26]={0};//26个字符位 solution 四种颜色数量统计
    int gue[26]={0};//26个字符位 guess 四种颜色数量统计
    for(int i=0;i<4;i++){
        if(solution[i]==guess[i])//位置和颜色完全一致则猜中数量+1
            arr[0]++;
        else{
            solu[solution[i]-'A']+=1;///统计同一位置不同颜色的两组颜色数量,伪猜中不需要对应位置相同,只需要有对应数量的颜色就行
            gue[guess[i]-'A']+=1;
        }
    }
    for(int i=0;i<26;i++){//在两个颜色数量统计数组中查看颜色数量,取相同位置较小的一方就是为猜中数量
        arr[1]+=(solu[i]<gue[i]?solu[i]:gue[i]);
    }
    return arr;
}

七、两数之和

题目链接:OJ链接
在这里插入图片描述

题目解析:
本题的基本思想是双重遍历思想
但是必须根据条件做出相应调整,防止浪费时间

题目答案:

int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
    * returnSize=2;
    static int arr[2]={0};
    memset(arr, 0x00, sizeof(arr));//静态空间不会二次初始化,因此手动初始化
    for(int i=0;i<numbersLen;i++){
        if (numbers[i] > target)//一旦大于目标数,可以直接跳过
            continue;
        for(int j=i+1;j<numbersLen;j++){//配对的数直接从i+1开始,防止出现重复配对,造成时间浪费
            if(numbers[i]+numbers[j]==target){
                arr[0]=i+1;
                arr[1]=j+1;
                return arr;
            }
        }
    }
    * returnSize=0;
    return NULL;
}

八、数组下标

有如下代码,则 *(p[0]+1) 所代表的数组元素是( )

int a[3][2] = {1, 2, 3, 4, 5, 6}, *p[3];
p[0] = a[1];

A: a[0][1]
B: a[1][0]
C: a[1][1]
D:a[1][2]

题目解析:
p是一个指针数组,p[0] = a[1];此处a[1]是二维数组的第二行的数组名,数组名表示首元素的地址,a[1]是a[1][0]的地址,所以p[0]中存储的是第2行第1个元素的地址,p[0]+1就是第二行第2个元素的地址,*(p[0]+1)就是第二行第二个元素了。所以C正确。
题目答案:
C


九、指针

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

题目解析:
C选项,指针占几个字节要看平台,64位环境下8个字节,32位环境下4个字节
题目答案:
ABD


十、寻找峰值

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目解析:
二分思想,
中间比右边大,认为从右往左半边递增,则把 right 不断向左靠拢 right=mid ,注意不能是 mid-1 ,因为这个位置有可能就是峰值点。
直到遇到中间比右边小了,意味着数据开始递降了,则 left 向右偏移, left=mid+1 ; 而一旦 mid+1 位置大于了right ,意味着刚好这个 mid+1 位置,是一个左半边-右往左递降,右半边-右往左递增的点,就是一个峰值点。

题目答案:

int findPeakElement(int* nums, int numsLen ) {
    //边界情况处理,1个元素前后都是负无穷 以及 0号位置大于1号位置,-1位置负无穷的情况
    if (numsLen == 1 || nums[0] > nums[1]) return 0;
    //末尾位置数据大于上一个位置数据,而nums[numsLen]负无穷的情况
    if (nums[numsLen - 1] > nums[numsLen - 2]) return numsLen - 1;
    int left = 0, right = numsLen - 1, mid;
    while (left < right) {
        mid = left + (right - left) / 2;
        if (nums[mid] < nums[mid + 1])//中间比右边小,意味着右边肯定有个峰值
            left = mid + 1;
        else //否则在左边包括当前位置肯定有个峰值
            right = mid;
    }
    return left;
}

十一、二级指针

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

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处两种情况之一成立都是要返回的,应该用或,此处用与错误。在语句GetMemory(&str,100);中传入str的地址,在语句char*str=NULL;中str初始化为空指针,但是str指针变量也有地址,所以参数char**p里面的p保存的是指针变量str的地址,所以调用GetMemory函数之后,动态开辟的空间的地址存放在了str中,在函数返回之后没有释放内存,但是这不会导致程序错误,只会导致内存泄漏。第3处用&str是错的,应该直接用str,是刚申请下来的空间首地址,可以用来接收字符串的copy。
题目答案:
AC


十二、大端小端

请问下列代码的输出结果有可能是哪些【多选】( )

#include <stdio.h>
typedef union
{
    int a;
    struct
    {
        short b;
        short c;
    };
}X;
int main()
{
    X x;
    x.a = 0x20150810;
    printf("%x,%x\n", x.b, x.c);
    return 0;
}

A: 2015,810 B: 50810,201 C: 810,2015 D:`20150,810

题目解析:
对于0x20150810
如果按照大端模式存储:从低地址到高地址:20 15 08 10 输出从低地址到高地址:20 15 08 10
如果按照小端模式存储:从低地址到高地址:10 08 15 20 输出从高地址到低地址:08 10 20 15
此数以int类型赋值给联合体x.a,而以结构成员b和c分开访问,分别拿到低地址的2个字节和高地址的2个字节,大端下是2015和810,小端下是810和2015

在这里插入图片描述

题目答案:
AC


十三、无符号参数

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

#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: 内存泄露

题目解析:
数组下标越界:数组大小255,但是当a[255]就是256个元素,导致越界了。死循环:这个是因为无符号字符型的变量大小在0-255之间,所以说i永远不可能大于255的,是个死循环。内存泄漏:创建的临时变量,在栈中,应该会由系统自动释放,所以应该是不存在内存泄漏的问题。栈溢出:属于缓冲区溢出的一种。栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围
题目答案:
AB


十四、数对

题目链接:OJ链接
在这里插入图片描述

题目解析:
假设输入 n=10 , k=3 ;
当 y <=k 时,意味着任何数字取模y的结果都在 [0, k-1]之间,都是不符合条件的。
当 y = k+1=4 时,x符合条件的数字有 3,7
当 y = k+2=5 时,x符合条件的数字有 3,4,8,9
当 y = k+3=6 时,x符合条件的数字有 3,4,5,9,10
当 y = k+n时,
x小于y当前值,且符合条件的数字数量是:y-k个,
x大于y当前值,小于2*y的数据中,且符合条件的数字数量是:y-k个
从上一步能看出来,在y的整数倍区间内,x符合条件的数量就是 (n / y) * (y - k)个
n / y 表示有多少个完整的 0 ~ y区间, y - k 表示有每个区间内有多少个符合条件的数字
最后还要考虑的是6…往后这种超出倍数区间超过n的部分的统计
n % y 就是多出完整区间部分的数字个数,其中k以下的不用考虑,则符合条件的是 n % y - (k-1) 个
这里需要注意的是类似于9这种超出完整区间的数字个数 本就小于k的情况,则为0
最终公式:(n / y) * (y - k) + ((n % y < k) ? 0, (n % y - k + 1));

题目答案:

#include <stdio.h>
int main() {
    long n, k;
    while (scanf("%ld %ld", &n, &k) != EOF) {
        if (k == 0) {
            printf("%ld\n", n * n);//任意数对的取模结果都是大于等于0的
            continue;
        }
        long count = 0;
        for (long y = k + 1; y <= n; y++) {
            count += ((n / y) * (y - k)) + ((n % y < k) ? 0 : (n % y - k + 1));
        }
        printf("%ld\n", count);
    }
    return 0;
}

十五、截取字符串

题目链接:OJ链接
在这里插入图片描述

题目答案:

#include <stdio.h>
#include<string.h>
int main() {
    char str[1001]={0};
    int k;
    while (scanf("%s %d", str, &k) != EOF) {
        char*ptr1=str;
        char*ptr2=str+k-1;
        while(ptr1<=ptr2){
            printf("%c",*ptr1);
            ptr1++;
        }
    }
    return 0;
}

还有一种更简洁的方法
题目解析:
截取字符串前 n 个字符,只需要将数组 n 下标位置的数据替换为字符串结尾标志即可

#include <stdio.h>
int main()
{
    char str[101];
    while(scanf("%s", str) > 0) {
        int n;
        scanf("%d", &n);
        str[n] = '\0';
        printf("%s\n", str);
    }
    return 0;
}

总结

重要的事说三遍!
成功!成功!成功!
暑假期间所有的题目就到此为止啦!
让我们一起迎接下一个阶段的学习吧!

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

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

相关文章

【校招VIP】JAVA语言考点之多线程实现相关

考点介绍&#xff1a; 多线程是JAVA校招中出现频度比较高的考点&#xff0c;本专题需要熟悉四种多线程的实现方式&#xff0c;并深入对比和区别。另外&#xff0c;对线程的状态和变化的相关题型也进行了分析。 JAVA语言考点之多线程实现相关-相关题目及解析内容可点击文章末尾…

CSS:实现文字溢出显示省略号且悬浮显示tooltip完整信息

组件&#xff1a; element ui中的tooltip组件 思路&#xff1a;通过ref获取宽度进行判断&#xff0c;当子级宽度大于对应标签/父级宽度显示tooltip组件 <div class"bechmark-wrap"><ul ref"bechmarkUl"><liv-for"(item,index) in comp…

SVN 索引版本与打包版本号不匹配

今天突然遇到了一个问题&#xff0c;SVN上传不了&#xff0c;错误提示如下&#xff1a; 解决方法&#xff1a; 1.其实&#xff0c;这是SVN库不小心搞坏了&#xff0c;只能重新再创建一个SVN仓库了。

Java jvm 内存溢出分析

1.如何分析jvm内存溢出呢 我们经常用visualVm监控Jvm的内存&#xff0c;cpu&#xff0c;线程的使用情况&#xff0c;通常可以根据内存不断增长来判断内存是否存在不释放。但是我们不可能时时盯着去看&#xff0c;这里涉及jvm堆内存配置&#xff0c;堆内存参数配置和调优会在其…

mongodb数据库操作

1、启动mongodb /usr/local/mongodb/bin/mongod --dbpath /var/mongodb/data/--logpath /var/mongodb/logs/log.log &在mongodb启动命令中 --dbpath 指定mongodb的数据存储路径 --logpath 指定mongodb的日志存储路径 2、停止mongodb 第一步先进入mongo命令行模式 第二…

nvm管理多个版本的nodejs

1. 已经安装过nodejs在安装nvm的步骤 1.安装nvmhttps://github.com/coreybutler/nvm-windows/releases 2.nvm安装位置 2.nvm管理的nodejs安装位置 4.最终的安装结构 备注&#xff1a;nodejs安装 2.使用nvm安装管理nodejs 2.1配置下载镜像&#xff1a; 找到nvm安装路径…

sonarqube版本升级

官方文档&#xff1a;Upgrade guide 步骤1、停止原有sonarqube服务&#xff0c;如果是docker部署的直接停掉容器并删除 步骤2、部署最新版sonarqube&#xff0c;保留原有配置 步骤3、访问sonarqube web 显示维护中&#xff0c;根据官方给出的升级方法&#xff0c;在sonarqub…

如何从公司或学校远程访问家里的电脑?

在某些情况下&#xff0c;我们需要远程访问另一台电脑&#xff0c;如在公司访问家里电脑的文件。那么&#xff0c;如何才能从公司或学校远程访问家里的电脑呢&#xff1f;这就需要用到远程访问软件了。 什么是远程访问软件&#xff1f; 远程访问软件是一种允许从本地电脑远…

python基础教程: while 循环语句用法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一.while 循环结构 特征: 减少代码冗余,提升代码效率 语法: while 条件表达式:code1code2...1.初始化一个变量 2.写上…

高速文件扫描仪:从繁琐到高效的革命性转变

高速文件扫描仪是办公设备中的重要一员&#xff0c;其主要功能是将纸质文件快速转换为数字格式&#xff0c;从而方便存储、传输和管理。那么&#xff0c;这个设备是如何起源并逐步发展起来的呢&#xff1f; 随着信息技术的不断推进&#xff0c;人们对数字化办公的需求变得越来…

Windows 10压缩卷参数错误怎么办?

压缩卷显示参数错误&#xff0c;这种情况很多用户都遇到过&#xff0c;遇到这种情况表示分区表信息与实际信息不符。因此&#xff0c;Windows不允许您对此驱动器进行任何更改&#xff0c;包括缩小卷大小。导致此问题的原因有很多&#xff0c;例如&#xff1a;病毒攻击、文件系统…

【验证码逆向专栏】房某下登录滑块逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

《数字图像处理-OpenCV/Python》连载(5)图像的显示

《数字图像处理-OpenCV/Python》连载&#xff08;5&#xff09;图像的显示 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为了方便初学…

Discourse 的系统日志

Discourse 提供了较为完善的日志查看方式。 用得最多的可能就是 Logster 的基于 Web 的 UI 了。 Logster Discourse 的错误日志面板用的是 logster&#xff0c;采集的是 Rails/Rack 的日志&#xff0c;正常应该用 Rails::Logger 但是 discourse 做了封装。 正常的访问地址为…

《程序员职场工具库》必须及格的职场工具 —— PPT 系列1

这是《程序员职场工具库》系列文章&#xff0c;在阅读本文之前&#xff0c;建议先阅读 《程序员职场工具库》 工具导论。 前言 如果做个跟 PPT 相关的调查问卷&#xff0c;估计大部分的程序员都会避之唯恐不及。因为每次谈起 PPT 工具&#xff0c;总会让我们想起很多不太好的回…

Python数据分析实战-依次遍历dataframe每一行,对某字段进行分析处理并新增一列(附源码和实现效果)

实现功能 依次遍历每一行&#xff0c;在某列包含某个元素时新增一列进行标记 实现代码 def province_distribution_of_colleges(self, file):df pd.read_excel(os.path.join(self.datapath, file))df1 dfhua_bei [北京市,天津市,河北省,山西省,内蒙古自治区]dong_bei [辽…

vue: 使用下拉树组件@riophae/vue-treeselect

前言: 在vue中, 因为element-ui 2.X是没有tree-select组件的&#xff0c;到了element-plus就有了 riophae/vue-treeselect是一个基于 Vue.js 的树形选择器组件&#xff0c;可以用于选择树形结构的数据。它支持多选、搜索、异步加载等功能&#xff0c;可以自定义选项的样式和模…

2023如何推广外贸独立站?

答案是&#xff1a;2023外贸独立站推广可以选择谷歌SEO谷歌Ads双向运营。 在2023年&#xff0c;外贸独立站的推广方式已经不再是过去简单的搜索引擎优化或广告推送。 现代的推广手段需要更多地涵盖多样性和针对性&#xff0c;从而确保可持续的客流和利润增长。 本文将深入探…

IP6510 为“快充”而生 支持PD及各种快充协议芯片多口快充解决方案

IP6510深力科是一款集成同步开关的降压转换器、支 持 9 种输出快充协议、支持 Type-C 输出和 USB PD 协议&#xff0c;为车载充电器、快充适配器、智能排插提供 完整的解决方案。 IP6510 内置功率 MOS&#xff0c;输入电压范围是 4.5V 到 32V&#xff0c;输出电压范围是 3V 到…

MySQL表空间

MySQL表空间 文章目录 MySQL表空间1. MySQL中的表1.1 IOT表1.2 InnoDB逻辑存储结构2. 独立表空间2.1 段 segment2.1.1 段的概念2.1.2 段的分类2.1.2.1 叶子节点段主要结构2.1.2.2 非叶子节点段2.1.3 碎片区2.2 区2.2.1 区的概念2.2.2 区的结构2.2.2.1 XDES Entry结构2.3 页2.3.…