【C/C++笔试练习】——数组名和数组名、switch循环语句、数据在计算机中的存储顺序、字符串中找出连续最长的数字串、数组中出现次数超过一半的数字

news2024/11/27 4:03:01

文章目录

  • C/C++笔试练习
    • 1.数组名和&数组名
      • (1)数组名和&数组名的差异
      • (2)理解数组名和指针偏移
      • (3)理解数组名代表的含义
      • (4)理解数组名代表的含义
    • 2.switch循环语句
      • (6)理解switch语句中的case特点
    • 3.数据在计算机中的存储顺序
      • (7)小端在计算机中的存储方式
    • 4.编程题
      • (8)字符串中找出连续最长的数字串
      • (9)数组中出现次数超过一半的数字

C/C++笔试练习

1.数组名和&数组名

(1)数组名和&数组名的差异

  以下C语言指令:

int a[5] = {1,3,5,7,9};
int *p = (int* )(&a+1);
printf(%d,%d”,*(a+1)*(p-1));

  运行结果是什么?

  A 2,1    B 3,1
  C 3,9    D 运行时崩溃

  

  数组名和&数组名在C和C++编程语言中具有不同的含义。

  数组名:数组名是用于引用数组的标识符。它可以是任何有效的标识符,通常用于对数组进行索引和访问数组元素。假设有一个名为“arr”的数组,就可以使用“arr[0]”来访问第一个元素,以此类推。

  &数组名:在C和C++中,&运算符用于获取变量的地址。因此,&数组名是用来获取数组的地址。这通常用于传递数组到函数或从函数返回数组。当你使用&数组名时,你实际上得到的是一个指向数组的指针。

  因此,数组名和&数组名的主要区别在于:数组名代表的是数组中的元素,而&数组名代表的是整个数组的地址。

在这里插入图片描述

  结合上面内容,所以这段C++的代码中,定义了一个包含5个整数的数组a,然后创建了一个指向整个数组类型的指针p,&a代表了取整个数组,(&a+1)代表指针需要跳过一个a的类型大小,此时的a是一整个数组,所以(&a+1)代表了向后偏移一个数值大小, 此时的p指向数组最尾段的下一个int类型的地址。

  然后打印* (a+1)和 * (p-1)),a是数组名,数组名不加修饰的,代表了数组首元素的大小,(a+1)表示地址向后偏移一个a类型大小的指针,此时的a为int,(a+1)就表示指向a数组的第二个元素,*(p-1)代表p向前移动一个数据类型大小,指向9,即可得到结果。

  
在这里插入图片描述
   答案选:C

             

(2)理解数组名和指针偏移

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

#include <stdio.h>
main() 
{
	char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;
	int i;
	i = 8;
	p = a + i;
	printf("%s\n", p - 3);
}

  A 6      B 6789
  C ‘6’    D 789

  首先,数组a被初始化为字符数组,包含10个元素,值为’1’到’9’和’\0’。然后创建一个指针p=a,此时的a不加&修饰,就表示数组的首元素地址 ‘1’ 元素的地址。然后对a+8,表示指向首元素的地址向后偏移8个数据类型大小,此时p指向9。(0和’\0’是一样的)

  在printf语句中,先将p向前移动3个位置,即指向了字符’6’,然后再打印字符串。输出的是从’6’开始的4个字符,即’6789’。

在这里插入图片描述

   答案选:B

             

(3)理解数组名代表的含义

   以下代码

char *ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;
cout<<ptr;

   代码执行之后的结果是?
   A Compiler error       B fg
   C efg              D defg

  结合上面的内容,我们容易知道ptr是一个char类型的指针,此时的ptr指向myString数组的首元素地址,对ptr+=5,ptr指针向后偏移5个指向元素类型大小的距离。此时的ptr指向f,cout<<ptr,表示打印这个ptr指针指向的字符串。

在这里插入图片描述

   答案选:B

             

(4)理解数组名代表的含义

   下面代码会输出()

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

  结合上面的内容,我们容易知道ptr是一个(int*)(&a+1)的指针,对&a+1,表示指针向后面偏移一整个数组的大小,此时ptr指针指向4元素的后面一个元素。

  要注意(&a+1)赋值给ptr的时候强转成了(int*)的指针,要注意此时指向整个数组的指针成为了指向一个数组元素的指针。 打印时对ptr-1表示指针,向前偏移一个(int*)类型大小,此时ptr指向4。

在这里插入图片描述
   答案选:A

             

2.switch循环语句

(6)理解switch语句中的case特点

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

#include <iostream.h>
int main()
{
	int x=3,y=3;
	switch(x%2)
	{
		case 1:
		switch (y)
		{
			case 0:
				cout<<"first";
			case 1:
				cout<<"second";
				break;
			default:
				cout<<"hello";
		}
		case 2:
		cout<<"third";
	}
	return 0;
}

  A second third      B hello
  C first second       D hellothird

   在这个程序中,当x%2的结果为1时,y的值为3,所以会先进入到(x%2)的case1中;然后y=3,case1和case2都不满足,直接default,打印hello,注意下面的语句没有break,所以程序会继续向下执行,进入到(x%2)中的case2,打印third。

   正常情况下,在C++中,每个case标签后都应该有一个break语句,来防止程序继续执行下一个case。如果没有break,程序将会继续执行下一个case的代码, 直到遇到break或者switch结束。

在这里插入图片描述
   答案选:D

             

3.数据在计算机中的存储顺序

(7)小端在计算机中的存储方式

  假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?

#include <stdio.h>
int main()
{
	long long a = 1, b = 2, c = 3;
	printf("%d %d %d\n", a, b, c);
	return 0;
}

  A 1,2,3      B 1,0,2
  C 1,3,2      D 3,2,1

  在计算机中数据的存储分为大端和小端存储,什么是大端小端:

  大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

  小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

在这里插入图片描述

   答案选:B

   设计一个函数来判断当前机器的字节序:

void check_sys()
{
	int i = 1;
	if (*(char*)&i == 0)
	{
		cout << "大端";
	}
	else
	{
		cout << "小端";
	}
}

在这里插入图片描述

             

4.编程题

(8)字符串中找出连续最长的数字串

字符串中找出连续最长的数字串

  解题思路:

  遍历字符串,使用cur去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的数字串结束了,则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到ret。

#include <iostream>
using namespace std;

int main() {
    string str,ret,cur;
    cin>>str;
    for(int i=0;i<=str.size();i++)//遍历整个字符串
    {
        //如果是数字就加入到临时数字串cur中
        if(str[i]>='0'&&str[i]<='9')
        {
            cur+=str[i];
        }
        else//如果遇到了字符就和ret比较,保存较大的数字串
        {
            if(cur.size()>ret.size())
            {
                ret=cur;
                cur.clear();
            }
            else//如果cur比ret长,替换ret,否则重置cur
            {
                cur.clear();
            }
        }
    }
    cout<<ret;
    return 0;
}

             

(9)数组中出现次数超过一半的数字

  解题思路1:

  众数:就是出现次数超过数组长度一半的那个数字,如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。

class Solution {
  public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if (numbers.empty()) return 0;
// 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1
        int result = numbers[0];
        int times = 1; // 次数
        for (int i = 1; i < numbers.size(); ++i) {
            if (times != 0) {
                if (numbers[i] == result) {
                    ++times;
                } else {
                    --times;
                }
            } else {
                result = numbers[i];
                times = 1;
            }
        }
// 判断result是否符合条件,即出现次数大于数组长度的一半times = 0;
        for (int i = 0; i < numbers.size(); ++i) {
            if (numbers[i] == result) ++times;
        }
        return (times > numbers.size() / 2) ? result : 0;
    }
};

  

  解题思路2:

   数组排序后,如果符合条件的数存在,则一定是数组中间那个数。但是时间复杂度稍高。

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        sort(numbers.begin(),numbers.end());
        return numbers[numbers.size()/2];
    }
};

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

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

相关文章

FFmpeg 命令:从入门到精通 | ffplay 简单过滤器

FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器视频旋转视频反转视频旋转和反转音频变速播放视频变速播放音视频同时变速更多参考 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器 本节介绍了简…

【CFD小工坊】浅水方程的离散及求解方法

【CFD小工坊】浅水方程的离散及求解方法 前言基于有限体积法的方程离散界面通量与源项计算干-湿网格的处理数值离散的稳定性条件参考文献 前言 我们模型的控制方程&#xff0c;即浅水方程组的表达式如下&#xff1a; ∂ U ∂ t ∂ E ( U ) ∂ x ∂ G ( U ) ∂ y S ( U ) U…

十五、异常(4)

本章概要 Java 标志异常 特例&#xff1a;RuntimeException 使用 finally 进行清理 finally 用来做什么&#xff1f;在 return 中使用 finally缺憾&#xff1a;异常丢失 Java 标准异常 Throwable 这个 Java 类被用来表示任何可以作为异常被抛出的类。Throwable 对象可分为两…

JUC——并发编程—第二部分

集合类不安全 list不安全 //报错 java.util.ConcurrentModificationException public class ListTest {public static void main(String[] args) {List<String> list new CopyOnWriteArrayList<>();//并发下Arrayist边读边写会不安全的/*** 解决方案&#xff1a…

国庆作业 9月30 消息队列实现进程间通信

01_write.c&#xff1a; #include <myhead.h> #define MAX 1024//x消息结构体 typedef struct {long msgtype; //消息类型char msg[MAX]; //消息正文 }Msg;#define SIZE sizeof(Msg)-sizeof(long) //正文大小int main(int argc, const char *argv[]) {//1:创建一个key…

机器学习之单层神经网络的训练:增量规则(Delta Rule)

文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径&#xff0c;因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 &#xff08…

企业级磁盘阵列存储系统由硬到软全析

企业级磁盘阵列是由一组设备构成的存储系统,主要包括两种类型的设备,分别是控制器和扩展柜,其中控制器只有一台,扩展柜可以没有,也可以有多台。在EMC的Unity中分别称为DPE(Disk Processor Enclosure)和DAE(Disk Array Enclosure),在华为的OceanStor里面称为控制框和硬…

【网络模型】OSI七层网络模型、TCP/IP网络模型、键入网址到页面显示的过程、DNS是什么等重点知识汇总

目录 OSI 的七层模型 TCP/IP 网络模型 键入网址到网页显示发生了什么 你知道DNS是什么&#xff1f; OSI 的七层模型 简要概括 应用层&#xff1a;为用户的应用进程提供网络通信服务表示层&#xff1a;处理用户信息的表示问题&#xff0c;数据的编码&#xff0c;压缩和解压…

在枚举类中“优雅地”使用枚举处理器

使用枚举类的一大好处就是&#xff0c;代码易懂&#xff0c;方便自己或他人维护。如&#xff0c;枚举状态、异常等。 下面有两个类&#xff08;枚举类和实体类&#xff09;&#xff1a; package com.zhang.enums;import lombok.Getter;/*** Author lgz* Description* Date 202…

【生物信息学】基因差异分析Deg(数据读取、数据处理、差异分析、结果可视化)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具包 1. 定义一些阈值和参数 2. 读取数据 normal_data.csv部分展示 tumor_data.csv部分展示 3. 绘制箱型图 4. 删除表达量低于阈值的基因 5. 计算差异显著的基…

Git多账号管理通过ssh 公钥的方式,git,gitlab,gitee

按照目前国内访问git&#xff0c;如果不科学上网&#xff0c;我们很大可能访问会超时。基于这个&#xff0c;所以我现在的git 配置已经增加到了3个了 一个公司gitlab&#xff0c;一个git&#xff0c;一个gitee. 以下基于这个环境&#xff0c;我们来说明下如何创建配置ssh公钥。…

VBA技术资料MF63:遍历形状并改变颜色

【分享成果&#xff0c;随喜正能量】人生&#xff0c;一站有一站的风景&#xff0c;一岁有一岁的味道&#xff0c;你的年龄应该成为你生命的勋章而不是你伤感的理由。生活嘛&#xff0c;慢慢来&#xff0c;你又不差&#xff01;。 我给VBA的定义&#xff1a;VBA是个人小型自动…

【数据结构与算法】栈与队列相关算法的实现

目录 检查括号是否成对出现 反转字符串 循环队列的实现 使用队列实现栈 使用栈实现队列 检查括号是否成对出现 算法要求 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断该字符串是否有效。 有效字符串需满…

树莓派基本配置(2)

安装motion $sudo apt-get update $sudo apt-get install motion配置motion sudo nano /etc/default/motionsudo nano /etc/motion/motion.conf主要改这些参数 //让Motion作为守护进程运行 daemon on ... //用这个端口号来读取数据 stream_port 8081 ... //网络上其它主机…

2023年上海市安全员B证证模拟考试题库及上海市安全员B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年上海市安全员B证证模拟考试题库及上海市安全员B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;上海市安全员B证证模拟考试题库是根据上海市安全员B证最新版教材&#xff0c;上海市安全员B证大纲整理…

正点原子嵌入式linux驱动开发——TF-A使用

上一篇笔记STM32MP157芯片的开发环境&#xff0c;之后就直接简写为MP1。为了保证安全ARM推出了 Arm Trusted Firmware的可信固件&#xff0c;简称 TF-A。它是一个开源的软件&#xff0c;最早是用在Armv8-A&#xff0c;ST也在MP1里面使用到了TF-A。它的作用就是隔离硬件&#xf…

递推+模拟---想好如何存储?

递推模拟 输入输出问题CCF-CSP考试历年真题题型分类分组输入——可能有多组测试数据&#xff0c;对于每组数据 递推---从前面已知态--->后续未知态AcWing 3777. 砖块AcWing 1208. 翻硬币AcWing 1211. 蚂蚁感冒AcWing 3433. 吃糖果AcWing 821. 跳台阶 模拟202212-2-csp-训练计…

C语言--atoi函数详解及模拟实现

本篇概要 本篇博客主要讲述atoi函数的定义&#xff0c;用法及模拟实现。 文章目录 本篇概要1.atoi函数简介2.atoi函数的原型及参数3.atoi函数的使用举例4.atoi函数的模拟实现 1.atoi函数简介 atoi() 是 C语言的一个标准库函数&#xff0c;定义在<stdlib.h>头文件中。 at…

【RocketMQ】基本使用:Java操作RocketMQ(rocketmq-client)

【RocketMQ】基本使用&#xff1a;Java操作RocketMQ&#xff08;rocketmq-client&#xff09; 1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.3.2</version>…

公司知识库搭建步骤,知识库建设与运营的四个步骤分享

在知识管理方面&#xff0c;团队中的每一员&#xff0c;都像是一名独行侠&#xff0c;自己的知识&#xff0c;满足自己的需要&#xff0c;这其中&#xff0c;就造成了很多无意义的精力消耗。 公司知识库搭建必要性 比如&#xff0c;一名员工撰写一QA文档&#xff0c;并没有将它…