【C/C++笔试练习】——常量指针和指针常量、结构体内存分配、统计输入的字母个数、排序子序列、倒置字符串

news2024/11/20 3:29:44

文章目录

  • C/C++笔试练习
    • 1.常量指针和指针常量
      • (1)常量指针和指针常量的定义
      • (2)判别常量指针和指针常量
      • (3)常量指针和指针常量的特性
    • 2.结构体内存分配
      • (4)计算结构体大小
      • (5)位段的内存分配计算
    • 3.完善程序
      • (6)统计输入大写字母的出现次数
    • 4.编程题
      • (7)排序子序列
      • (8)倒置字符串

C/C++笔试练习

1.常量指针和指针常量

(1)常量指针和指针常量的定义

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

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

  

  “常量指针”和“指针常量”是两种特殊类型的指针,它们有着各自的特性和用途。

  (1)常量指针(Constant Pointer):

  常量指针是指向常量的指针。这意味着你不能通过这个指针来改变它所指向的值,但你可以改变这个指针本身所指向的地址。例如:

int a = 5;  
int b = 10;  
int * const ptr = &a;  
*ptr = 10;  // 错误,不能修改ptr所指向的值  
ptr = &b;   // 正确,可以修改ptr所指向的地址

  (2)指针常量(Pointer Constant):

  指针常量是指常指针,即指针本身是个常量,不能改变它的指向,但它所指向的值可以改变。例如:

int a = 5;  
int b = 10;  
const int * ptr = &a;  
*ptr = 10;  // 错误,不能修改ptr所指向的值  
ptr = &b;   // 错误,不能修改ptr所指向的地址

  
  判别常量指针和指针常量我们可以通过const和*的位置来判断:

  int const * p:const 在 *p 前面为常量指针

  int * const p:* 在const前面为指针常量

在这里插入图片描述

  (6)int const *p2 = &i; 这里定义了一个指向 const int 的指针 p2,然后试图修改它指向的值 *p2 = 30;,这是不允许的,因为 *p2 是一个常量,此时const修饰的是p2指向的值,所以不能被修改。

  (7)int *const p3 = &i; 这里定义了一个 const 指针 p3,然后试图改变它的指向 p3 = &j;,这是不允许的,因为 p3 是一个常量指针,此时const修饰的是p3,是一个指针,所以不能改变它的指向。

   答案选:C

             

(2)判别常量指针和指针常量

   下面3段程序代码的效果一样吗()

int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

   A (2)=(3)       B (1)=(3)
   C (1)=(2)       D 都不一样

在这里插入图片描述
  通过上面的概念我们可以得到:(1)是常量指针(2)是常量指针(3)是指针常量

   答案选:C

             

(3)常量指针和指针常量的特性

   请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。

A.const int const *x = &y;
B.int * const x = &y;
C.const int *x = &y;
D.int const *x = &y;
E.const int * const x = &y;

在这里插入图片描述
   结合第(1)(2)对于常量指针和指针常量的介绍

   答案选:B

             

2.结构体内存分配

(4)计算结构体大小

   在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是()

struct A
{
	int a;
	short b;
	int c;
	char d;
};

struct B
{
	int a;
	short b;
	char c;
	int d;
};

   A 16,16       B 13,12
   C 16,12       D 11,16

结构体内存对齐

在这里插入图片描述

   答案选:C
  

(5)位段的内存分配计算

  在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类型元素,系统申请了四个字节即32个比特位,此时可以放下a和b总共30比特位,接下来的c占4比特位,前四个字节放不下了,所以再开辟四个新的字节空间放入c,接下来的的d占了29个比特位,第二个字节已经有了4个比特位,29+4=33>32放不下,所以再开辟四个字节。放入上面的5个元素时,struct A一共占13个字节,根据结构体对其规则,结构体的大小必须为最大对齐数的整数倍,所以还要申请3个字节,使其成为4的整数倍。

   答案选:C

             

3.完善程序

(6)统计输入大写字母的出现次数

   以下 C++ 函数的功能是统计给定输入中每个大写字母的出现次数(不需要检查输入合法性,所有字母都为大写),则应在横线处填入的代码为()

void AlphabetCounting(char a[], int n) 
{
	{
		int count[26] = {}, i, kind = 10;
		for (i = 0; i < n; ++i)
		_________________;
		for (i = 0; i < 26; ++i) {
		printf("%c=%d", _____, _____);
	}
}

  A ++count[a[i]-‘Z’]     B ++count[‘A’-a[i]]
   ‘Z’-i           ‘A’+i
   count[‘Z’-i]       count[i]

  C ++count[i]      D ++count[‘Z’-a[i]]
   i           ‘Z’-i
   count[i]        count[i]

   们需要统计给定输入中每个大写字母的出现次数。给定的输入是一个字符数组a,数组长度为n。

   首先,我们定义一个长度为26的整型数组count,用来存储每个大写字母出现的次数。数组下标0对应字母’A’,下标1对应字母’B’,以此类推,下标25对应字母’Z’。

   接下来,我们遍历输入字符数组a中的每个字符。对于每个字符,我们可以将其与字符’Z’做差,得到对应的数组下标,然后将对应的计数器加1。

   最后,我们遍历计数器数组count,输出每个字母和其出现的次数。

   答案选:D

             

4.编程题

(7)排序子序列

排序子序列

  解题思路:

  (1)应该依次比较整个数组

  (2)a[i+1]>a[i] ,则进入非递减序列判断, 直到遍历到下一个值不大于等于为止count++,然后进行下一位置的判断

  (3)a[i+1]<a[i],则进入非递增序列判断, 直到遍历到下一个值不小于等于为止count++,然后进行下一位置的判断

  (4)a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减序列。

#include <iostream>
#include<vector>
using namespace std;

int main() {
    int n=0;
    cin>>n;
    vector<int> v(n,0);
    for(int i=0;i<n;i++)
    {
        cin>>v[i];
    }
    //遍历整个vector
    int i=0;
    int count=0;
    while(i<n)//如果有递增或者递减情况改变,计数器++
    {
        if(v[i]>v[i+1])//递减序列
        {
            while(i<n&&v[i]>=v[i+1])
            {
                i++;//满足递减情况就一直向后移动
            }

            //不满足了直接退出,count++
            count++;
            i++;//寻找下一段子序列的情况
        }
        else if(v[i]<v[i+1])//递增序列
        {
            while(i<n&&v[i]<+v[i+1])
            {
                i++;//满足递增情况就一直向后移动
            }

            count++;
            i++;
        }
        else//相等的元素直接向后走
        {
            i++;
        }
    }
    cout<<count;
    return 0;
}

             

(8)倒置字符串

倒置字符串

  解法一:

  先将整个字符串逆置过来,再遍历字符串,找出每个单词,对单词逆置。这里我们使用了stl算法中的reverse,所以这里使用迭代器遍历string。

#include <algorithm>
#include <iostream>
using namespace std;
 
int main() {
    string str;
    getline(cin,str);
    reverse(str.begin(),str.end());//整体反转
    //再进入循环单个反转
    string::iterator start=str.begin();
    while(start!=str.end())
    {
        auto end=start;
        while(*end!=' '&&end!=str.end())
        {
            end++;//找单个单词
        }
 
        //找到后反转单个单词
        reverse(start,end);
 
        //更改start和end的位置,使其指向下一个位置
        if(end!=str.end())
        {
            start=end+1;
        }
        else
        {
            start=end;
        }
    }
    cout<<str;
    return 0;
}

  
  解法二:

  直接利用cin>>s接收输入,遇到空格就结束了,自然就分割开了每个单词,其次将每次接收到的单词拼接到之前串的前面就逆置过来了。

#include <iostream>
#include <string>
using namespace std;

// cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出
int main()
{
	string s1, s2;
	cin >> s2;
	while (cin >> s1)
	s2 = s1 + " " + s2;
	cout << s2 << endl;
	return 0;
}

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

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

相关文章

【计算机】CPU,芯片以及操作系统概述

1.CPU 什么是CPU? CPU&#xff08;Central Processing Unit&#xff09;是计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元&#xff0c;相当于系统的“大脑”。 CPU的工作流程&#xff1f; CPU 的工作流程分为以下 5 个阶段&#xff1a;取指令…

C++ -- 学习系列 关联式容器 set 与 map

一 关联式容器是什么&#xff1f; c 中有两种容器类型&#xff1a;关联式容器与序列式容器&#xff08;顺序容器&#xff09; 关联式中的容器是按照关键字来存储与访问的&#xff0c;序列式容器&#xff08;顺序容器&#xff09;则是元素在容器中的相对位置来存储与访问的。…

C++标准模板(STL)- 类型支持 ()

对象、引用、函数&#xff08;包括函数模板特化&#xff09;和表达式具有称为类型的性质&#xff0c;它限制了对这些实体所容许的操作&#xff0c;并给原本寻常的位序列提供了语义含义。 附加性基本类型及宏 实现定义的空指针常量 NULL 定义于头文件 <clocale> 定义于…

2.类与对象 拜访对象村

2.1 椅子大战 在图形接口画出正方形、圆形与三角形。当用户选点图形时&#xff0c;图形需要顺时针转360并依据形状的不同播放播放不同的AIF文件。胜者可以坐上名贵宝椅。 面向过程&#xff1a; rotate(shapeNum) {//旋转360 } playSound(shapeNum) {//查询播放哪个AIF文件//播…

嵌入式Linux应用开发-驱动大全-同步与互斥②

嵌入式Linux应用开发-驱动大全-同步与互斥② 第一章 同步与互斥②1.3 原子操作的实现原理与使用1.3.1 原子变量的内核操作函数1.3.2 原子变量的内核实现1.3.2.1 ATOMIC_OP在 UP系统中的实现1.3.2.2 ATOMIC_OP在 SMP系统中的实现 1.3.3 原子变量使用案例1.3.4 原子位介绍1.3.4.1…

pyqt5使用经验总结

pyqt5环境配置注意&#xff1a; 安装pyqt5 pip install PyQt5 pyqt5-tools 环境变量-创建变量名&#xff1a; 健名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH 值为&#xff1a;Lib\site-packages\PyQt5\Qt\plugins pyqt5经验2&#xff1a; 使用designer.exe进行设计&#xff1…

Maven - MacOS 快速安装

配置信息 Maven 版本&#xff1a;3.6.3Maven 地址&#xff1a;Index of /dist/maven/maven-3IDEA&#xff1a;2023 Tips&#xff1a;Maven 版本最好不要超过 3.8.0&#xff0c;最新版 Maven 会不兼容一些配置信息。上面的 Maven 地址里可以选择自己想下载的版本&#xff08;这…

【源码】hamcrest 源码阅读及空对象模式、模板方法模式的应用

文章目录 前言1. 类图概览2. 源码阅读2.1 抽象类 BaseMatcher2.1 接口 Description提炼模式&#xff1a;空对象模式 2. 接口 Description 与 SelfDescribing 配合使用提炼模式 模板方法 后记 前言 hamcrest &#xff0c;一个被多个测试框架依赖的包。听说 hamcrest 的源码质量…

【maven】idea中基于maven-webapp骨架创建的web.xml问题

IDEA中基于maven-webapp骨架创建的web工程&#xff0c;默认的web.xml是这样的。 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name…

go语法入门2

字符串 使用双引号或反引号引起来的任意个字符。它是字面常量。 func main() {var a "abc\n测试" // \n换行fmt.Println(a) } abc 测试func main() {var a "abc\n\t测试" \\换行后在tabfmt.Println(a) } abc测试func main() {var a abc测试 …

CppCheck静态代码检查工具教程【Windows和Linux端】

目录 1、背景 2、特性介绍 2.1、检查结果 2.2、检查范围 2.3、支持的检查规则&#xff08;列举一些&#xff09;: 2.4、自定义规则 3、linux 端 4、windows 端 1、背景 最近调研了几款 c/c 代码静态检查工具&#xff0c;包括 cppcheck、cpplint、cppdepend、splint、ts…

cmip6数据处理之降尺度

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;也被称为全球环流模型或全球大气模型&#xff0c;是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…

分享Arduino环境下加速下载 第三方库或芯片包

Content 问题描述问题解决 问题描述 众所周知&#xff0c;由于网络的问题&#xff0c;导致Arduino里面的包下载速度非常慢&#xff0c;甚至下了非常久&#xff0c;最后也还是出现下载失败的情况。 有的人打开了加速器&#xff0c;但是也依旧是速度非常慢&#xff0c;为什么呢…

OpenGLES:绘制一个混色旋转的3D圆柱

一.概述 上一篇博文讲解了怎么绘制一个混色旋转的立方体 这一篇讲解怎么绘制一个混色旋转的圆柱 圆柱的顶点创建主要基于2D圆进行扩展&#xff0c;与立方体没有相似之处 圆柱绘制的关键点就是将圆柱拆解成&#xff1a;两个Z坐标不为0的圆 一个长方形的圆柱面 绘制2D圆的…

【列表渲染+收集表单数据+过滤器+内置指令+自定义指令】

列表渲染收集表单数据过滤器内置指令自定义指令 1 列表渲染1.1 基本列表1.2 key的作用与原理1.3 列表过滤1.4 列表排序1.5 Vue监测数据改变的原理 2 收集表单数据3 过滤器4 内置指令4.1 v-text指令4.2 v-html指令4.3 v-cloak指令4.4 v-once指令4.5 v-pre指令 5 自定义指令 1 列…

【网络安全---sql注入(2)】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。

前言 本篇博客主要是通过piakchu靶场来讲解如何通过SQL注入漏洞来写入文件&#xff0c;读取文件。通过SQL输入来注入木马来getshell等&#xff0c;讲解了比较详细的过程&#xff1b; 如果想要学习SQL注入原理以及如何进行SQL注入&#xff0c;我也写了一篇详细的SQL注入方法及…

毅速3D打印:深骨位零件制造首选3D打印

在模具制造领域&#xff0c;深骨位零件由于其复杂形状和结构&#xff0c;传统的加工方法往往难以满足生产要求&#xff0c;导致产品不良问题频繁出现。而如今&#xff0c;随着3D打印技术的普及&#xff0c;深骨位零件在3D打印面前变得不再困难。 3D打印是一种快速成型技术&…

2120 -- 预警系统题解

Description OiersOiers 国的预警系统是一棵树&#xff0c;树中有 &#xfffd;n 个结点&#xff0c;编号 1∼&#xfffd;1∼n&#xff0c;树中每条边的长度均为 11。预警系统中只有一个预警信号发射站&#xff0c;就是树的根结点 11 号结点&#xff0c;其它 &#xfffd;−1…

10.1 调试事件读取寄存器

当读者需要获取到特定进程内的寄存器信息时&#xff0c;则需要在上述代码中进行完善&#xff0c;首先需要编写CREATE_PROCESS_DEBUG_EVENT事件&#xff0c;程序被首次加载进入内存时会被触发此事件&#xff0c;在该事件内首先我们通过lpStartAddress属性获取到当前程序的入口地…