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

在这里插入图片描述

自我小提升!

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


前言

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


一、数组

若有定义 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])//位置和颜色完全一致则猜中数量+1arr[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)//1return;*p = (char*)malloc(num);return;
} 
int main()
{char *str = NULL;GetMemory(&str, 80); //2if(NULL != str){strcpy(&str, "hello"); //3printf(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.rhkb.cn/news/129427.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式系统常用的模式

分布式系统常用的模式 Ambassador 名称&#xff1a;“大使”模式 介绍&#xff1a;作为应用程序和其他服务的“中间人”&#xff0c;负责应用程序和其他服务之间的通信&#xff0c;包括日志、监控或重试处理等任务。 举例&#xff1a;K8S使用Envoy作为一个“大使”来简化服务…

Docker 搭建Redis 集群之路

前言 搞技术就是动手,动手再动手,实践出真知,毕竟最终是要解决问题的呢,废话不多讲,开搞,主要是为了记录一下,毕竟过程还是有点艰辛呢需求(target) Windows 电脑 装一个虚拟机用虚拟机构造Linux 系统下载Docker 搭建Redis 集群代码交互集群过关斩将 检查电脑是否开启…

初识Kafka

kafka 第一章、初识Kafka 原先&#xff1a; kafka&#xff0c;由LinkedIn公司采用Scala语言开发的一个多分区&#xff0c;多副本&#xff0c;基于Zookeeper协调的分布式消息系统&#xff0c;被捐献给Apache基金会。 现在 分布式流式处理平台。 高吞吐 可持久化 可水平扩展 …

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客 一些题目整理&#xff0c;附带大佬的解释 1.go中哪些值不能寻址& 常量&#xff08;const常量&#xff0c;字面值3.14&#xff0c;字符串“xxx”&#xff0c;函数或方法, map的val值&#xff09; golang中接…

JVM系列 运行时数据区

系列文章目录 第一章 运行区实验 文章目录 系列文章目录前言一、堆&#xff08;Heap&#xff09;1.1、新生代/Young区1.1.1、Eden区1.1.2、Survival区 1.2、年老代&#xff08;old区&#xff09; 二、虚拟机栈&#xff08;Stack&#xff09;2.1、栈顶缓存技术2.2、溢出2.3、栈…

83 # 静态服务中间件 koa-static 的使用以及实现

静态服务中间件&#xff1a;koa-static 中间件可以决定是否向下执行&#xff0c;如果自己可以处理&#xff0c;那么直接处理完毕结束&#xff0c;如果自己处理不了&#xff0c;next 方法会继续向下执行 新建 public 文件夹&#xff0c;里面添加 index.html、style.css 文件 …

图的学习,深度和广度遍历

一、什么是图 表示“多对多”的关系 包括&#xff1a; 一组顶点&#xff1a;通常用V&#xff08;Vertex&#xff09;表示顶点集合一组边&#xff1a;通常用E&#xff08;Edge&#xff09;表示边的集合 边是顶点对&#xff1a;(v, w)∈E&#xff0c;其中v,w∈V有向边<v, w&…

go开发之个微机器人的二次开发

简要描述&#xff1a; 设置某条朋友圈为隐私 请求URL&#xff1a; http://域名地址/snsSetAsPrivacy 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名…

CFTC可能比SEC更可怕,将监管炮口直接对准DeFi?

还未开始享受Uniswap在法庭上为DeFi行业带来的“胜利果实”&#xff0c;美国商品期货委员会&#xff08;CFTC&#xff09;在一个星期之后立即将其无情砸碎&#xff0c;并将其监管大炮直接对准了DeFi衍生品市场&#xff0c;乃至整个DeFi行业。 2023年9月7日&#xff0c;CFTC宣布…

leetcode 215.数组中第k大的元素

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;数组中第k大的元素 思路&#xff1a; 使用堆数据结构&#xff0c;大堆的堆顶是堆内最大的元素&#xff0c;也就是把当前堆 pop k - 1 次&#xff0c;第 k 次 top 出来的元素就是第 k 大的数。 代码&#xff1a; class …

Spring-MVC使用JSR303及拦截器,增强网络隐私安全

目录 一、JSR303 ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 常用注解 ( 4 ) 入门使用 二、拦截器 2.1 是什么 2.2 拦截器与过滤器的区别 2.3 应用场景 2.4 基础使用 2.5 用户登录权限控制 给我们带来的收获 一、JSR303 ( 1 ) 是什么 JSR 303是Java规范请求&#xff…

LeetCode 1126.查询活跃业务

数据准备 Create table If Not Exists Events (business_id int, event_type varchar(10), occurences int); Truncate table Events; insert into Events (business_id, event_type, occurences) values (1, reviews, 7); insert into Events (business_id, event_type, occu…

职场新人对测试用例的困惑

职场新人对测试用例的困惑无非有以下几点&#xff1a; 什么是测试用例&#xff0c;为什么要写测试用例&#xff1f; 不知道怎么写&#xff0c;写了也不知道写的是否完整。 一、什么是测试用例&#xff1f; 百科的释义&#xff1a; 测试用例是对一项特定的软件产品进行测试任…

【CSS系列】writing-mode —— 文字方向(水平/垂直;左右/右左)

文章目录 一、引子二、writing-mode1.语法horizontal-tb&#xff08;默认&#xff1a;水平方向&#xff0c;文字 从左到右&#xff0c;行 从上到下&#xff09;vertical-rl&#xff08;垂直方向&#xff0c;文字 从上到下&#xff0c;行 从右到左&#xff09;vertical-lr&#…

数字化转型背景下企业知识管理能力提升路径

近年来&#xff0c;科技不断进步&#xff0c;颠覆性技术&#xff08;例如 5G、云计算、物联网、大数据分析和人工智能等&#xff09;正在重新定义企业如何管理项目和运营效率。知识管理体系亦需要随着科技的进步而改变&#xff0c;以适应新的数字时代环境&#xff0c;并且高效知…

SpringMVC的简介及工作流程

一.简介 Spring MVC是一个基于Java的开发框架&#xff0c;用于构建灵活且功能强大的Web应用程序。它是Spring Framework的一部分&#xff0c;提供了一种模型-视图-控制器&#xff08;Model-View-Controller&#xff0c;MVC&#xff09;的设计模式&#xff0c;用于组织和管理Web…

微信小程序Day2笔记

1、WXML模板语法 1. 数据绑定 数据绑定的基本原则 在data中定义数据在WXML中使用数据 2. 在data中定义页面的数据 在页面对应的.js文件中&#xff0c;把数据定义到data对象中。 3. Mustache语法的格式 把data中的数据绑定到页面中渲染&#xff0c;使用Mustache语法&…

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…

【算法】二分查找算法——leetcode二分查找、搜索插入位置

文章目录 二分查找704. 二分查找35. 搜索插入位置 二分查找 二分查找算法是一种在有序数组中查找特定元素的搜索算法。算法的工作原理是&#xff0c;通过比较数组中间元素和目标值&#xff0c;如果目标值等于中间元素&#xff0c;那么查找结束。如果目标值小于或大于中间元素&a…

Linux驱动【day2】

mychrdev.c: #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h" unsigned int major; // 保存主设备号 char kbuf[128]{0}; unsigned int…