当前位置: 首页 > news >正文

微软Visual Studio产品之Visual C++编程进阶——一维数组(画画版)

我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,我小时候喜欢看小人书(连环画),在那个没有电视、没有手机的年代,这是为数不多的课余生活方式这一。我画的不好,但是如果能帮大家理解编程语言,那我的目的就达到了,希望初学者少走弯路。下面我们就开始吧。

对于简单的问题,使用整型、字符型、浮点型这些简单的数据类型就可以了。但是,对于有些需要处理的数据,只用这些简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。比如要处理一个工厂的1000个零件数据,一个一个定义变量工作量不可想象,也没有反映出这些数据间的内在联系,实际上这些数据是具有相同的属性。

人们想出这样的办法:既然它们都是同一类性质的数据,就可以用同一个名字(如s)来代表它们,而在名字的右下角加一个数字来表示这是第几个数据。这个右下角的数字称为下标。一批具有同名的同属性的数据就组成一个数组(array),s就是数组名。

数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。用一个数组名(如s)和下标来唯一地确定数组中的元素。数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据放在同一个数组中。

C语言规定用方括号中的数字来表示下标,如用s[1000]表示s1000。将数组与循环结合起来,可以有效地处理大批量的数据,大大提高了工作效率。

一维数组是数组中最简单的,它的元素只需要用数组名加一个下标,就能唯一地确定。要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中有多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数组处理。例如,下面是对数组的定义:

int a[10];

它表示定义了一个整型数组,数组名为a,此数组有10个整型元素。

定义一维数组的一般形式为

类型符 数组名[常量表达式];

说明:数组名的命名规则和变量名相同,遵循标识符命名规则。在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,指定a[10],表示a数组有10个元素。

注意,下标是从0开始的,这10个元素是:a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。

请注意,按上面的定义,不存在数组元素a[10]。常量表达式中可以包括常量和符号常量,如“int a[3+5];”是合法的。不能包含变量,如“int a[n];”是不合法的。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。

例如,下面这样定义数组是不行的:

int n;
scanf("%d", &n) ;  //企图在程序中临时输入数组的大小
int a[n];

经过上面的定义,在内存中划出一片存储空间,存放了一个有10个整型元素的数组(如果用VisualC++,此空间大小为4*10=40字节)。可以看到,用一个“int a[10];”,就相当定义了10个简单的整型变量,显然简捷方便。

a数组
a[0]  a[1]  a[2]  a[3]  a[4]  a[5]  a[6]  a[7]  a[8]  a[9]

说明:如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式。如:

void func(int n)
{
  int a[100*n];  //合法,n的值从实参传来
}

在调用func函数时,形参n从实参得到值。这种情况称为“可变长数组”,允许在每次调用func函数时,n有不同的值。但是在执行函数时,n的值是不变的,数组长度是固定的。

如果指定数组为静态(static)存储方式,则不能用“可变长数组”。如:

static int a[100*n]:  //不合法,a数组指定为static存储方式

在定义数组并对其中各元素赋值后,就可以引用数组中的元素。应注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。

引用数组元素的表示形式为

数组名[下标]

例如,a[0]就是数组a中序号为0的元素,它和一个简单变量的地位和作用相似。“下标”可以是整型常量或整型表达式。每一个数组元素都代表一个整数值。

注意:定义数组时用到的“数组名[常量表达式]”和引用数组元素时用的“数组名[下标]”形式相同,但含义不同。

例如:

int a[10];   //这里的a[10]表示的是定义数组时指定数组包含10个元素
m=a[6];    //这里的a[6]表示引用a数组中序号为6的元素

例 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。

解题思路:显然首先要定义一个长度为10的数组,由于赋给的值是整数,因此,数组可定义为整型,要赋的值是0~9,有一定规律,可以用循环来赋值。同样,用循环来输出这10个值,在输出时,先输出最后的元素,按下标从大到小输出这10个元素。这个算法很简单,可以直接写出程序。

编写程序:

#include <stdio.h>
int main()
{int i, a[10];for(i=0; i<=9;i++)a[i]=i;for(i=9;i>=0; i--)printf("%d", a[i]);printf("\n")return 0;
}

运行结果:
9876543210


程序分析:第1个for循环使a[0]~a[9]的值为0~9,第2个for循环按a[9]~a[0]的顺序输出各元素的值。

应当特别提醒的是:数组元素的下标从0开始,如果用“int a[10];”定义数组,则最大下标值为9,不存在数组元素a[10]。在定义数组的同时,给各数组元素赋值,这称为数组的初始化。可以用“初始化列表”方法实现数组的初始化,一共有四种形式,请大家记住。

(1)在定义数组时对全部数组元素赋予初值。例如:

int a[10]={0,1,2,3,4,5,6,7,8,9};

将数组中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。花括号内的数据就称为“初始化列表”。经过上面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。

(2)可以只给数组中的一部分元素赋值。例如:

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

定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0。

(3)如果想使一个数组中全部元素值为0,可以写成

int a[10]={0,0,0,0,0,0,0,0,0,0}; 

或int a[10]={0};  //未赋值的部分元素自动设为0

(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:

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

可以写成
int a[]={1,2,3,4,5};

在第2种写法中,花括号中有5个数,虽然没有在方括号中指定数组的长度,但是系统会相据花括号中数据的个数确定a数组有5个元素。但是,如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成

int a[10]={1,2,3,4,5);

只初始化前5个元素,后5个元素为0

说明:

如果在定义数值型数组时,指定了数组的长度并对之初始化,凡未被“初始化列表”指定初始化的数组元素,系统会自动把它们初始化为0。

如果是字符型数组,则初始化为'\0'。

如果是指针型数组,则初始化为NULL,即空指针。

一维数组程序举例

例 用数组来处理求 Fibonacci数列问题。

解题思路:如果用数组来处理,每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组元素中即可。

编写程序:

#include <stdio.h>int main()
{int i;int f[20]={1,1};  //对最前面两个元素[0]和[1]赋初值1for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];  //先后求出f[2]~f[19]的值for(i=0;i<20;i++){if(i%5==0) printf("\n");  //控制每输出5个数后换行printf("%12d", f[i])  //输出一个数}printf("\n");return 0;
}

运行结果:
  1  1  2  3  5
  8  13  21  34  55
  89  144  233  377  610
  987  1597  2584  4181  6765

程序分析:为节约篇幅,程序只计算20个数。定义数组长度为20,对最前面两个元素f[0]和f[1]均指定初值为1,根据数列的特点,由前面两个元素的值可计算出第3个元素的值,即:
f[2]=f[0]+[1] 

在循环中可以用以下语句依次计算出[2]~f[19]的值
[i]=[i-2]+[i-1]

if语句用来控制换行,每行输出5个数据。


例 对10个数字按由小到大的顺序排列。

解题思路:这种问题称为数的排序(sort)。排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小。可以把这个题目抽象为一般形式“对n个数按升序排序”。

排序方法是一种重要的、基本的算法。排序的方法很多,本例用“冒泡法排序”。基本思路是:每次将相邻两个数比较,将小的调到前头。若有6个数:19,18,15,14,12,10。第1次先将最前面的两个数18和19对调。第2次将第2和第3个数(19和15)对调……如此共进行5次,得到18-15-14-12-10-19的顺序,可以看到:最大的数19已“沉底”,成为最下面一个数,而小的数“上升”。最小的数10已向上“浮起”一个位置。经过第1趟(共5次比较与交换)后,已得到最大的数19。然后进行第2趟比较,对余下的前面5个数(18,15,14,12,10)进行新一轮的比较,以便使次大的数“沉底”。按以上方法进行第2趟比较,经过这一趟4次比较与交换,得到次大的数18。

按此规律进行下去,可以推知,对6个数要比较5趟,才能使6个数按大小顺序排列。在第1趟中要进行两个数之间的比较共5次,在第2趟过程中比较4次……第5趟只须比较1次。如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。这如同水底的气泡逐步冒出水面一样,故称为“冒泡法”。


编写程序:

#include <stdio. h>
int main()
{int a[10];int i,j,t;printf("input 10 numbers \n");for (i=0;i<10;i++ )scanf("%d",&a[i]) ;printf("\n");forj=0;j<9:j++)  //进行9次循环,实现9趟比较for(i=0;i<9-j;i++)  //在每一趟中进行9-j次比较if (a[i]>a[i+1] )  //相邻两个数比较{t=a[i]; a[i]=a[i+1]; a[i+1]=t;}printf("the sorted numbers \n");for(i=0;i<10;i++)printf("%d", a[i])printf("\n");return 0;
}

运行结果:
input 10 numbers :
30 68 90 03 120 88 65 99 158 24
the sorted numbers
3 24 30 65 68 88 90 99 120 158

程序分析:当执行外循环第1次循环时,j=0,然后执行第1次内循环,此时i=0,在if语句中将a[i]和a[i+1]比较,就是将a[0]和a[1]比较。执行第2次内循环时,i=1,a[i]和a[i+1]比较,就是将a[1]和a[2]比较……执行最后一次内循环时,i=8,a[i]和a[i+1]比较,就是将a[8]和a[9]比较。这时第1趟过程完成了。当执行第2次外循环时,j=1,开始第2趟过程。内循环继续的条件是i<9-j,由于j=1,因此相当于i<8,即i由0变到7,要执行内循环8次。其余类推。

但是由于数据库等技术的发展,这个数组在实际的运用中,并不是用来存放大量结构化数据的,比如你要做一个电商软件,不可能用数组来存放大量电商数据,比如订单、购买记录等等。

目前数组主要用在操作系统内核、中间件领域、程序中的数据结构组合使用、临时使用的同质数据、缓存结构等地方,这一点大家一定要注意。

如果你有志向研究系统底层软件,请好好学习数据结构。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

相关文章:

微软Visual Studio产品之Visual C++编程进阶——一维数组(画画版)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;我小时候喜欢看小人书&#xff08;连环画&#xff09;&#xff0c;在那个没有电视、没有手机的年代&#xff0c;这是…...

Moonbeam生态项目分析 — — 下一代DeFi协议HydraDX

作者&#xff1a;David 概览 HydraDX是一个基于Substrate区块链框架构建的DeFi协议&#xff0c;旨在为波卡带来大量流动性。HydraDX的特色服务&#xff0c;HydraDX Omnipool&#xff0c;是一种创新的自动化做市商&#xff08;AMM&#xff09;&#xff0c;通过将所有资产组合在…...

Spark九:Spark调优之Shuffle调优

Spark shuffle调优方法 map端和reduce端缓存大小设置&#xff0c;reduce端重试次数和等待时间间隔&#xff0c;以及bypass设置 学习资料&#xff1a;https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、map和reduce端缓冲区大小 1.1 map端 在Spark任务运行过程中&…...

linux c多线程优先级

在 Linux 系统中&#xff0c;可以使用 pthread_setschedparam 函数来设置线程的优先级。该函数需要传入一个指向 pthread_t 类型的线程 ID&#xff0c;以及一个指向 struct sched_param 类型的结构体对象。struct sched_param 结构体包含了线程的优先级信息。 下面是一个示例代…...

Redis在项目开发中的应用

Spring Boot集成Redis构建博客应用 在这个示例中&#xff0c;我们将展示如何使用Spring Boot和Redis构建一个简单的博客应用&#xff0c;包括文章发布、点赞和评论功能。 1. 添加依赖 首先&#xff0c;我们需要在pom.xml文件中添加Spring Boot和Redis的依赖项。 <!-- Sp…...

mapper向mapper.xml传参中文时的乱码问题

1.起因&#xff1a; 在idea中进行模糊查询传参时&#xff0c;发现在idea中查中文查不出记录&#xff0c;在navicate中可以查出来。 2.猜测&#xff1a; 1.idea中的编码问题导致的乱码。 2.idea和navicate的编码一致性导致的乱码。 3.mapper向mapper.xml传参后出现乱码。 3.解…...

基于Docker官方php:7.1.33-fpm镜像构建支持67个常见模组的php7.1.33镜像

实践说明&#xff1a;基于RHEL7(CentOS7.9)部署docker环境(23.0.1、24.0.2)&#xff0c;所构建的php7.1.33镜像应用于RHEL7-9(如AlmaLinux9.1)&#xff0c;但因为docker的特性&#xff0c;适用场景是不限于此的。 文档形成时期&#xff1a;2017-2023年 因系统或软件版本不同&am…...

Type-C PD充电器受电端sink诱骗取电汇总:小家电应用5V9V12V15V20V28V

小家电产品、美容产品、电动产品等升级采用Type-C接口&#xff0c;在Type-C接口上使用Type-C取电芯片&#xff0c;即可使用快速充电器的5V、9V、12V、15V、20V供电&#xff0c;无需再配充电器&#xff0c;各类品牌的充电器都可以支持。目前充电器常见的USB-PD功率为&#xff1a…...

禁用code server docker容器中的工作区信任提示

VSCode 添加受限模式&#xff0c;主要是防止自动运行代码的&#xff0c;比如在vscode配置的task和launch参数是可以运行自定义代码的。如果用VScode打开未知的工程文件就有可能直接运行恶意代码。 但是当我们的实验基础模板文件可控的情况下&#xff0c;要想禁用code server do…...

JSON格式插件-VUE

JsonEditor 安装&#xff1a; npm i bin-code-editor -S引入&#xff1a; import Vue from vue; import CodeEditor from bin-code-editor; import bin-code-editor/lib/style/index.css; import App from ./App.vue; Vue.use(CodeEditor); new Vue({el: #app,render: h > …...

dubbo的springboot集成

1.什么是dubbo&#xff1f; Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo …...

【人工智能】智能电网:未来能源的革命

未来能源的革命 智能电网革命的意义在于将电力行业从传统的集中式发电和集中式输配电模式转变为智能化、分布式、互动式的能源网络。 现在我们从以下方面详细认真的了解一下智能电网&#xff1a; 智能变电站&#xff0c;智能配电网&#xff0c;智能电能表&#xff0c;智能交互…...

【AIGC】一组精美动物AI智能画法秘诀

如何使用AI绘画&#xff0c;从以下角度&#xff0c;依据表格内容梳理&#xff0c;表格如下&#xff1a; 外貌特征物种姿势特征描述场景风格技术描述小巧可爱幼小浣熊倚在桌子上具有人形特征中世纪酒馆电影风格照明8k分辨率细节精致毛茸茸手持咖啡杯Jean-Baptiste Monge的风格蓝…...

JS 高频面试题

JS 的数据类型有哪些&#xff0c;有什么区别 基本数据类型&#xff08;Undefined、Null、Boolean、Number、String、Symbol&#xff09; 引用数据类型&#xff08;对象、数组和函数&#xff09; 区别&#xff1a; 原始数据类型直接存储在栈&#xff08;stack&#xff09;中的简…...

linux—多服务免密登录

文档结构 概念简介配置操作 概念简介 配置操作 场景&#xff1a;在部署gp集群时&#xff0c;希望 master 节点可以使用gpadmin用户可以实现免密登录 slave1和 slave2 节点&#xff1b; step_1: IP映射 xx.xx.xx.101 server-slave1 xx.xx.xx.102 server-slave2说明&#x…...

【MySQL】数据库之MHA高可用

目录 一、MHA 1、什么是MHA 2、MHA 的组成 3、MHA的特点 4、MHA的工作原理 二、有哪些数据库集群高可用方案 三、实操&#xff1a;一主两从部署MHA 1、完成主从复制 步骤一&#xff1a;完成所有MySQL的配置文件修改 步骤二&#xff1a;完成所有MySQL的主从授权&#x…...

ffmpeg 改变帧率,分辨率,时长等命令

ffmpeg -i elva.mp4 -ss 00:00:20 -t 00:00:30 -c:v copy -c:a copy output1.mp4 视频截取&#xff0c;开始时间和时长,-ss 00:00:20 -t 00:00:30 ffmpeg -i output1.mp4 -c:v libx265 output265.mp4 -c:v libx265,264转265 ffmpeg -i output1.mp4 -c:v libx264 output264.mp4 …...

烟火检测AI边缘计算智能分析网关V4在安防项目中的应用及特点

一、行业背景 随着社会和经济的发展&#xff0c;公共安全和私人安全的需求都在不断增长。人们需要更高效、更准确的安防手段来保障生命财产安全&#xff0c;而人工智能技术正好可以提供这种可能性&#xff0c;通过智能监控、人脸识别、行为分析等手段&#xff0c;大大提高了安防…...

有效的回文

常用方法就是双指针。使用两个指针从字符串的两端向中间移动&#xff0c;同时比较对应位置的字符&#xff0c;直到两个指针相遇。由于题目忽略非字母和非数字的字符且忽略大小写&#xff0c;所以跳过那些字符&#xff0c;并将字母转换为小写&#xff08;或大写&#xff09;进行…...

Electron快速上手

Electron 目录 简介 打包简单的html/css/javascript项目 打包Vue2项目 打包Vue3项目 简介 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows…...

华为“纯血”鸿蒙加速进场 高校、企业瞄准生态开发新风口

近日&#xff0c;华为终端BG CEO、智能汽车解决方案BU董事长余承东在2024年新年信中提出&#xff0c;开启华为终端未来大发展的新十年。 他特别提到&#xff0c;未来要构建强大的鸿蒙生态&#xff0c;2024年是原生鸿蒙的关键一年&#xff0c;将加快推进各类鸿蒙原生应用的开发…...

抖音百科怎么创建?头条百科的规则和技巧

在玩抖音的时候&#xff0c;不知道注意到抖音的搜索结果没有&#xff0c;有时候会去搜索框搜索一个品牌或人物名称&#xff0c;搜索框下面翻几下大概率就会出现百科词条&#xff0c;这个词条就是抖音百科。抖音的百科属于头条百科&#xff0c;因为这两个平台都属于字节跳动旗下…...

leetcode10-困于环中的机器人

题目链接&#xff1a; https://leetcode.cn/problems/robot-bounded-in-circle/description/?envTypestudy-plan-v2&envIdprogramming-skills 思路&#xff1a; 首先&#xff0c;题目要寻找的是成环的情况。 1.如果经历一次指令后的方向仍为北方&#xff0c;要使得机器人循…...

Linux-shell简单学习

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…...

CMake入门教程【高级篇】qmake转cmake

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2.qmake与cmake的差异3. qmake示例4.qmake转cmake示例5.MOC、UIC和RCC…...

c#图片作为鼠标光标

图片转换为鼠标光标代码如下&#xff1a; private void Form1_Load(object sender, EventArgs e) {//button1.Cursor System.Windows.Forms.Cursors.Hand;Bitmap bmp new Bitmap("780.jpg");Cursor cursor new Cursor(bmp.GetHicon());button1.Cursor cursor;} …...

微信小程序swiper实现层叠轮播图

在微信小程序中,需要实现展示5个&#xff0c;横向层叠的轮播图效果&#xff0c;轮播图由中间到2侧的依次缩小.如下图 使用原生小程序进行开发,没有使用Skyline模式&#xff0c;所以layout-type配置项也无效。所以基于swiper组件进行调整。 主要思路就是设置不同的样式&#xff…...

揭露欧拉骗局第二篇:逼近公式“Σ1/n=lnn+C”。

Σ1/nlnnC是欧拉为调和级数创造(注意是创造、而不是发现)的“逼近公式”&#xff0c;它在欧系大名鼎鼎&#xff0c;因为它解决了欧洲人百筹莫展的“调和级数求和问题”。 “lnnC”是欧拉的发明&#xff0c;欧拉认为n→∞时&#xff0c;Σ1/nlnn常数&#xff0c;这个常数就是欧…...

MYSQL的学习——单行函数详解

目录 1. 数值函数 1) 基本函数 2) 角度与弧度互换函数 3) 三角函数 4) 指数与对数函数 5) 进制间的转换 2. 字符串函数 3. 日期和时间函数 1) 获取日期、时间 2) 日期与时间戳的转换 3) 获取月份、星期、星期数、天数等函数 4) 日期的操作函数 5) 时间和秒钟转换的…...

深度解析Cron表达式:精确控制任务调度的艺术

深度解析Cron表达式&#xff1a;精确控制任务调度的艺术 希望我们都可以满怀期待的路过每一个转角 去遇见 那个属于自己故事的开始 去追寻那个最真实的自己 去放下 去拿起 安然&#xff0c;自得&#xff0c;不受世俗牵绊… 导言 在计算机科学领域&#xff0c;任务调度是一项关…...