C及C++每日练习(2)

1.选择:

1.使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?

A.%-30.4e  B.%4.30e  C.%-30.4f  D.%-4.30

       在上一篇文章中,提到了对于打印字符串时,其打印模板%m.ns中各个字母的含义,对于m,表示输出的字符串的宽度,对于n表示在打印时,打印左起字符串的前n个字符。并且是右对齐,且字符不足时会自动补充空格。当字符串长度>n>m时,m失效,当n>字符串长度时,直接打印到结尾。

      对于本题,则是考察对于数字的打印格式。对于打印十进制的double,采用的格式是%m.nf

对于题目中的%m.ne,是表示按照指数类型打印。

    对于对齐问题,主要由m控制,表示右对齐打印m个字符。但是题目中要求左对齐,因此需要采用-m的形式。对于n,主要用于控制打印精度,即表示打印到小数点的后n位。

   因此,对于本体题目要求,对应答案C

2.请找出下面程序中有哪些错误()

int main(){ int i = 10; int j = 1; const int *p1;//(1) int const *p2 = &i; //(2) p2 = &j;//(3) int *const p3 = &i;//(4) *p3 = 20;//(5) *p2 = 30;//(6) p3 = &j;//(7) return 0; 
}

 A.1,2,3,4,5,6,7

B. 1,3,5,6

C.6,7

D.3,5

在正式讲解题目之前,首先需要介绍两个概念,即:指针常量、常量指针

对于常量指针:表示指针指向的内容是常量内容,因此,指针指向的内容不能被修改,也就是说,不能通过解引用的方式来改变指针指向的内容,但是,可以改变指针本身的指向。

对于指针常量:表示指针本身就是一个常量,指针的指向不能发生更改,但是可以通过解引用的方式改变空间中内容。

而对于如何区分指针常量和常量指针,可以通过const*的相对位置来判断。

例如,对于题目中的(1)const\, \, \, int *p1;因为const*前面,所以表示常量指针,即:p1指向的内容不能通过解引用进行修改,但是p1的指向可以修改。

对于题目中的(2)int \, \, \, const *p2 =&i表示常量指针,与(1)不同的是,此处进行了对于指针的初始化。

对于题目中的(3),表示改变指针p2的指向,由于p2是常量指针,故正确。

对于题目中的(4),此时*const前面,表示指针常量,即指针是一个常量,指针的指向不能被更改,但是指向的内容可以修改。

对于题目中的(5),表示对指针p3解引用,更改指针指向的内容,由于p3是一个指针常量,因此,可以更改指针指向的内容。正确。

对于题目中的(6),表示对指针p2解引用,修改指向的内容,由于指针式常量指针,即指针指向的内容是常量,可以修改指针的指向,但是不能更改指针指向的内容,因此错误。

对于题目中的(7),表示更改p3的指向,由于指针p3是指针常量,因此,指针指向不能被改变,所以错误。

因此答案选择C

3.下面叙述错误的是()

char acX[]="abc"; 
char acY[]={'a','b','c'}; 
char *szX="abc"; 
char *szY="abc";

A.acX与acY的内容可以修改

B. szX与szY指向同一个地址

C.acX占用的内存空间比acY占用的大

D. szX的内容修改后,szY的内容也会被更改

        对于代码的前两行,都是创建一个常量字符串,只不过采取的放肆不同,不过需要注意,在第一行代码中,由于是一个完整的字符串,因此,在字符串的末尾带有字符串的结束标志\0。但是第二行代码中,并不存在这个结束标志,因此,对于C选项,acX的大小大于acY的大小。

       对于A选项,可以通过数组下标进行更改,正确。

       对于B选项,由于两个指针指向的内容相同,因此正确。

       对于D选项,需要注意,题目说的是改变指针szX的内容,也就是修改指针指向的地址,并不是修改其指向的内容。所以错误。

因此选择D

4.在头文件及上下文均正常的情况下,下列代码的运行结果是()

int a[] = {1, 2, 3, 4};int *b = a; 
*b += 2;*(b + 2) = 2; 
b++;printf("%d,%d\n", *b, *(b + 2));

A.1,3

B. 1,2

C.2,4

D.3,2

对于上述代码,首秀按创建了一个指针b,指向了数组a的起始地址。随后,对于*b += 2;,需要注意,由于*的结合优先级高于+=,因此,这句代码表示的含义是,解引用,拿到数组中第一个数,随后对这个数+2,因此,此时的数组为:

int a[] = {3, 2, 3, 4};

对于*(b + 2) = 2;,则是表示针对指针的地址进行加2,由于指针的类型为int,因此表示跳过8字节,对跳过后的地址进行解引用,再将这个值修改为2。因此,此时的数组为:

int a[] = {3, 2, 2, 4};

对于b++,表示修改指针b,使得其指向数组中的第二个元素的地址。

因此,再打印时,指针b指向数组中第二个元素的下标,此时进行打印,打印的值分别为2,4,答案选择C

5. 用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数()

A. int *a[10];

B. int (*a)[10];

C. int (*a)(int);

D. int (*a[10])(int);

本题目涉及到了三个概念:数组指针,指针数组,函数指针,对于数组指针。对于前二者的判断,只需要知道[]的结合优先级大于*即可。

例如对于选项A,由于结合性问题,因此a首先表示一个数组,数组的容量为10,其中保存了10int*类型的变量,因此表示指针数组。

对于选项Ba首先表示一个指针,这个指针指向了一个数组,数组可以存储10int类型的变量,因此是数组指针。

对于选项Ca表示一个指针,外部的括号()是函数指针的标志,因此表示一个函数,参数为一个整型参数。返回值类型为int

对于选项Da首先表示一个数组,这个数组存储的变量为指针,且指针为函数指针,返回值为整型,参数为一个整型参数,所以答案选择D

6.在32位cpu上选择缺省对齐的情况下,有如下结构体定义:

 struct A
{ 
unsigned a : 19;unsigned b : 11;unsigned c : 4; unsigned d : 29;char index; 
};

则sizeof(struct A)的值为()

A.9 B. 12 C.16 D.20

     需要注意,此时的变量是以位断的形式定义的,冒号后面的数组表示这个变量占有多少比特位。

     对于一个unsigned类型的变量,大小为4字节,因此会开辟4字节,即32比特位大小的空间,由于a,b占有的比特位小于32,因此对于二者只会开辟一次4字节大小的空间。

     对于c,由于此时第一次开辟的空间大小不足,因此会在开辟4字节大小的空间。对于d,由于此时的空间再次不足,因此会第三次开辟4字节空间。

   对于index,由于类型不同,因此会再开辟1字节的空间。

   最后,因为存在内存对齐机制,因此总空间大小必须是最大对齐数的整数倍,因此答案选择C

7.下面代码会输出()

int main(){ int a[4]={1,2,3,4}; int *ptr=(int*)(&a+1); printf("%d",*(ptr-1)); 
}

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

对于数组名,如果于sizeof,&结合,则表示整个数组,其他情况下均表示数组首元素地址。因此,此处的&a+1,表示跳过整个数组长度的内容。即数组最后一个内容的下一个位置。对于ptr-1,由于指针的类型int,因此为指向前四个字节的内容,也就是指向数组的最后一个元素的地址。,因此选择A

2. 编程:

2.1 倒置字符串:

倒置字符串_牛客题霸_牛客网 (nowcoder.com)

       原理较为简单,首先将给定的字符串整体进行逆置,例如对于图中给出的字符串,整体逆置后如下:

                                                      .gnijieb \, \, ekil\, \, I

      对于本题,可采用双指针法进行解决。具体解法如下:

   

     创建两个指针,分别为start,end,在最开始,两个指针均指向字符串的开头。这里由于使用string类创建一个对象s用于存放字符串,因此:start=s.start()=end

     建立循环,循环的条件是start<s.end()

    如果end的位置不指向字符串的结束位置,即:最后一个字符的下一个位置。并且对于*end !=' \, \, ',即不等于空,则让end指向下一个位置。

    如果*end ==' \, \, ',则将start,end两个指针区域内的字符串再次逆置。在逆置后,这里有两种情况,一是end <s.end(),则令start=end+1,再令end = start即可。如果end == s.end(),则表示,已经将整个字符串遍历结束,直接令start =end即可。此时start==s.end(),循环结束,输出字符串即可。对应代码如下:

#include <iostream>
#include<string>
#include<algorithm>
using namespace std;int main() 
{string s1;getline(cin,s1);reverse(s1.begin(),s1.end());auto start = s1.begin();while(start != s1.end()){auto end = start;while(*end != ' ' && end != s1.end()){end++;}reverse(start,end);if(end != s1.end()){start = end+1;}else {start = end;}}cout << s1;return 0;}

2.2 排序子序列:


排序子序列_牛客笔试题_牛客网 (nowcoder.com)

在给出题解之前,首先解释以下题目中提出的两个概念,即:非递增序列,非递减序列。

对于非递增序列,可以看作不严格的递增序列,即存在前后相等元素的递增序列,例如:

                                                    1\, \, \, 2\, \, \, 2\, \, \, 3\, \, \, 3\, \, \, 4

对于非递减序列,可以看作不严格的递减序列,即存在前后相等元素的递减序列,例如:
                                                    5\, \, \, 4\, \, \, 4\, \, \, 3\, \, \, \, 2\, \, \, 2\, \, \, 1\,

      对于本题目的解法,首先利用vector实例化出对象v来接收输入元素,利用变量n接收输入元素数量:

     如果v[i] <v[i+1],则表示数组进入了非递增序列。

     如果v[i] >v[i+1],则表示数组进入了非递减序列

    对于v[i]==v[i+1]的情况,指向下一个元素即可。不做处理

     如果数组进入了上述序列,需要继续判断,如果出现了相反的情况,例如在非递增序列中,出现了v[i] > v[i+1],则表示这部分的数据不再满足非递增性,此时前面的数据构成了一个完成的非递增序列,因此让记录排序子序列数量的变量count++,再令i++,作为另一种序列的首个元素。如果没有出现相反的情况,则表示目前数据依旧满足非递增行,需要检测下一个数据,再令i++即可。

    不过对于条件的判断需要注意,对于下面的情况:1 \, \, \, 2\, \, \, 3\, \, \, 4,因为上面给出的序列是一个递增序列,因此当i==2时,此时v[i]==3,v[i+1]==4,然后令i++,此时i==3,对于v[i+1]会造成越界访问的问题。为了方便的解决这个问题,可以在实例化出对象v后,利用resize函数,扩容N+1数量的空间,并且将这些空间初始化为0。具体代码如下:
 

#include <iostream>
#include<vector>
using namespace std;int main() {int n = 0;cin >> n;vector<int> v;v.resize(n+1,0);for( int i = 0; i < n; i++){cin >> v[i];}int count = 0;int i = 0;while( i < n)  {//进入非递减if( v[i] < v[i+1]){while( i < n && v[i] <= v[i+1]){i++;}count++;i++;  }else if( v[i] == v[i+1]){i++;}else{while( i < n && v[i] >= v[i+1]){i++;}count++;i++;}}cout << count;return 0;}

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

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

相关文章

变老特效哪个app可以拍?深入探索变老效果的应用

随着科技的进步和智能手机的普及&#xff0c;各种摄影应用如雨后春笋般涌现&#xff0c;为我们提供了前所未有的创意拍摄体验。其中&#xff0c;变老特效因其独特的魅力&#xff0c;吸引了众多用户的关注。这种特效能够让我们在短时间内看到自己老去的模样&#xff0c;既有趣又…

JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码

J2EE&#xff08;Java 2 Platform Enterprise Edition&#xff09;是指“Java 2企业版”&#xff0c;B/S模式开发Web应用就是J2EE最核心的功能。 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在日常的生活中&#xff0c;经常会使用…

强大的ps 命令 -o 自定义输出内容选项

强大的ps 命令 -o 自定义输出内容选项 1、ps命令介绍和作用2、问题描述 1、ps命令介绍和作用 ps 是一个 Unix 和类 Unix 操作系统中常用的命令&#xff0c;用于显示当前运行的进程信息。ps 命令的作用包括&#xff1a; 查看进程信息&#xff1a; ps 命令可以列出当前系统中正…

数据结构之顺序表及其实现!

目录 ​编辑 1. 顺序表的概念及结构 2. 接口的实现 2.1 顺序表的初始化 2.2 检查顺序表容量是否已满 2.3 顺序表的尾插 ​编辑 2.4 顺序表的尾删 2.5 顺序表的头插 2.6 顺序表的头删 2.7 顺序表在pos位置插入 2.8 顺序表在pos位置删除 2.9 顺序表的查找 2.10 顺…

考研数学——高数:多元函数微分法及其应用

因为复习阶段全篇很细节的写下来一来比较费时间&#xff0c;二容易导致为了记笔记而记。 接下来的内容只会保留上课中比较有意义的地方&#xff0c;以及有自己助于理解的想法 全微分 助记&#xff1a; 证明是否可微&#xff0c;首先判断两个偏导数是否存在&#xff0c;不存在则…

中文版国产Figma简单好上手

在过去的两年里&#xff0c;国内外协同办公室发展迅速。一方面&#xff0c;它是由突如其来的疫情推动的&#xff0c;另一方面&#xff0c;它是科学技术不断进步的必然结果。在市场的推动下&#xff0c;市场上出现了越来越多的协同办公软件&#xff0c;使工作场所的工作更加高效…

插入排序和归并排序

插入排序&#xff0c;Insertion Sort. 给出伪代码 for i 1,2,...,n-1Insert A[i] into Sorted array A[0:i-1]by swaping down to the correct position. 冒泡排序 冒泡排序就是一种插入排序算法。 i ← 1 while i < length(A)j ← iwhile j > 0 and A[j-1] > A…

CorelDRAW2024专业级图形设计矢量图形设计软件

CorelDRAW2024是一款功能强大的矢量图形设计软件&#xff0c;适用于专业级图形设计作品的设计师和创作者。它提供了智能对象、布局、插图和模板等功能&#xff0c;可以帮助用户快速创建高质量的设计作品。 这款软件的用户界面直观且易于使用&#xff0c;允许用户快速访问和管理…

184基于matlab的相关向量机(RVM)回归和分类算法

基于matlab的相关向量机&#xff08;RVM&#xff09;回归和分类算法。该算法基于贝叶斯稀疏核⽅法&#xff0c;避免了支持向量机&#xff08;SVM&#xff09;的主要局限性。RVM关键是为每个权参数 都引入一个单独的超参数 &#xff0c;而不是一个共享超参数。程序已调通&#x…

力扣hot100:42.接雨水(双指针/动态规划/贪心)

什么时候能用双指针&#xff1f; &#xff08;1&#xff09;对撞指针&#xff1a; ①两数和问题中可以使用双指针&#xff0c;先将两数和升序排序&#xff0c;可以发现规律&#xff0c;如果当前两数和大于target&#xff0c;则右指针向左走。 ②接雨水问题中&#xff0c;左边最…

【Web】浅聊JDBC的SPI机制是怎么实现的——DriverManager

目录 前言 分析 前言 【Web】浅浅地聊JDBC java.sql.Driver的SPI后门-CSDN博客 上篇文章我们做到了知其然&#xff0c;知道了JDBC有SPI机制&#xff0c;并且可以利用其Driver后门 这篇文章希望可以做到知其所以然&#xff0c;对JDBC的SPI机制的来源做到心里有数 分析 先是…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

(文末送书)《低代码平台开发实践:基于React》

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

PCM会重塑汽车OTA格局吗(2)

目录 1.概述 2. PCM技术视角下的OTA 3.小结 1.概述 上一篇文章&#xff0c;我们着重讲解了OTA的概述内容&#xff0c;和意法半导体推出的跨域融合MCU的四大特征&#xff0c;其中就包含了OTA技术。 他们针对OTA做了比较创新的设计&#xff0c;在总的可用memory容量不变情况…

2024最新Android开发面试解答,学海无涯

一个程序员&#xff0c;如果不想35 岁被淘汰&#xff0c;请把它当成一种信仰&#xff01; 25岁&#xff0c;一个北漂程序员&#xff0c;入职三年&#xff0c;Android中级工程师&#xff0c;月薪15k&#xff0c;965的工作经常干成996&#xff0c;比起老家的同龄人&#xff0c;我…

15-Linux部署HBase集群

Linux部署HBase集群 简介 HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。 和Redis一样&#xff0c;HBase是一款KeyValue型存储的数据库。 不过和Redis设计方向不同 Redis设计为少量数据&#xff0c;超快检索HBase设计为海量数据&#xff0c;快速检索 HB…

数据结构:排序算法+查找算法

一、概念 程序数据结构算法 1.算法的特性和要求 特性&#xff1a; 确定性&#xff08;每次运行相同的输入都是同样的结果&#xff09;、有穷性、输入、输出、可行性 设计要求&#xff1a; 正确性、高效率、低存储、健壮性、可读性 2.时间复杂度 3.常见排序算法的时间复杂…

LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

视频二维码加密怎么设置?验证密码看内容的二维码做法

现在为了保障内容的私密性&#xff0c;很多人会采用生成二维码的方式来展现或者传递自己的内容&#xff0c;比如文件、视频、音频等等。如果我们想要制作一个视频二维码&#xff0c;并且给二维码加密后需要输入正确密码才能查看视频内容&#xff0c;这种类型的二维码的制作方式…

就业班 2401--3.5 Linux Day11--DNS解析

DNS域名解析服务 少壮不努力&#xff0c;老大徒伤悲。一、 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;…