微软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深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

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

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

相关文章

聚乙烯PE的特性有哪些?UV胶水能够粘接聚乙烯PE吗?

聚乙烯&#xff08;Polyethylene&#xff0c;PE&#xff09;是一种聚合物&#xff0c;是由乙烯&#xff08;ethylene&#xff09;单体通过聚合反应形成的合成塑料。以下是聚乙烯的一些主要化学特性&#xff1a; 1.化学式&#xff1a; 聚乙烯的基本化学式是 (C2H4)n&#xff0c;…

回归预测 | Matlab基于SO-BiLSTM蛇群算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-LSTM蛇群算法优化长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SO-BiLSTM蛇群算法优…

读《Open-Vocabulary Video Anomaly Detection》

2023 西北工业大学和新大 引言 视频异常检测(VAD)旨在检测不符合预期模式的异常事件&#xff0c;由于其在智能视频监控和视频内容审查等应用前景广阔&#xff0c;已成为学术界和工业界日益关注的问题。通过几年蓬勃发展&#xff0c;VAD 在许多不断涌现的工作中取得了重大进展。…

Jenkins+nexus

jiekins安装完成 1、安装java环境 [rootnexus ~]# tar -xf jdk-8u211-linux-x64.tar.gz -C /usr/local [rootnexus ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/jdk1.8.0_211 PATH$PATH:$JAVA_HOME/bin [rootnexus ~]# source /etc/profile.d/java.sh 必须要选择与n…

Linux笔记之右上角的网络连接图标的IP是本机IP还是远程主机的IP

Linux笔记之右上角的网络连接图标的IP是本机IP还是远程主机的IP? code review! 文章目录 Linux笔记之右上角的网络连接图标的IP是本机IP还是远程主机的IP?问题一&#xff1a;Linux笔记之右上角的网络连接图标上面的IP是本机IP还是远程主机的IP&#xff1f;问题二&#xff1…

PDF-XChange Editor v10.2.0.384

软件介绍 PDF-XChange Editor&#xff0c;号称打开速度最快最强大的PDF编辑器/PDF阅读器&#xff0c;PDF-XChange专注于PDF文档的编辑&#xff0c;打开PDF文件速度快&#xff0c;软件小功能强大&#xff0c;可以自定义制作PDF电子文档&#xff0c;具有创建&#xff0c;查看&am…

大学物理-实验篇(二)——用分光计测定三棱镜的折射率(光:特定频段电磁波、光线在介质界面折射、平行光与凸透镜)

目录 预备知识 光&#xff1a;特定频段电磁波 光线在介质界面折射 平行光与凸透镜 实验目的 实验仪器 实验原理 实验步骤 准备分光计 目镜调焦 刻度盘读数 测三棱镜顶角 测三棱镜最小偏向角 数据处理 预备知识 光&#xff1a;特定频段电磁波 光速&#xff1a;…

【REST2SQL】08 日志重构增加输出到文件log.txt

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 原来…

OSG加载STL模型

下载了2个简单stl模型&#xff0c;用基本的加载代码&#xff1b;直接可以加载&#xff1b; 查一点资料&#xff1b; 怎样在OSG中添加支持STL格式的模型文件&#xff1f; 使用OSG时&#xff0c;如果需要导入STL格式的模型文件&#xff0c;需要添加STL插件。 可以通过在代码中调…

将字符串中制表符\t替换为指定数量的空格 numpy.char.expandtabs()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将字符串中制表符\t 替换为指定数量的空格 numpy.char.expandtabs() [太阳]选择题 请问关于以下代码表述正确是&#xff1f; import numpy as np s 1\t2 print("【显示】s ",s) …

货拉拉智能监控实践:如何解决多云架构下的故障应急问题?

一分钟精华速览 在月活超千万的大规模业务背景下&#xff0c;货拉拉遭遇了多云环境下的监控碎片化、规划无序等问题。为了应对这些挑战&#xff0c;货拉拉开发了一站式监控平台——Monitor。该平台的部署有效地实现了对核心应用的监控和报警全覆盖&#xff0c;显著提高了应急响…

DLT:dlt-daemon示例解析2

DLT&#xff1a;dlt-daemon示例解析 回顾一下上期第一个示例打印DLT日志的流程。 这次来分析第二个示例。 目录dlt-daemon/examples/example2/下有以下文件 CMakeLists.txt dlt_id.h example2.c example2.xml 其中example2.xml编译用不到&#xff0c;里面描述了一些程序的…

致远OA getAjaxDataServlet XXE漏洞复现(QVD-2023-30027)

0x01 产品简介 致远互联-OA 是数字化构建企业数字化协同运营中台,面向企业各种业务场景提供一站式大数据分析解决方案的协同办公软件。 0x02 漏洞概述 致远互联-OA getAjaxDataServlet 接口处存在XML实体注入漏洞,未经身份认证的攻击者可以利用此漏洞读取系统内部敏感文件…

Aurora中显示中文

Aurora是可以在word里面作为插件使用&#xff0c;可以画一些三线表&#xff0c;是一款非常好用的工具&#xff0c;写论文必备。 我们可以通过现在excel里面创建表格&#xff0c;然后将excel转成latex格式&#xff0c;具体做法参考如下&#xff1a; Aurora Equation——Latex表…

2024年AMC8最后一周复习建议,以及往年真题练习和答案详解(5)

今天是1月12日&#xff0c;下周的今天就要正式举办AMC8的比赛了。最后一周该如何准备AMC8的竞赛呢&#xff1f; 六分成长的建议是&#xff1a; 1、以刷真题为主&#xff0c;把各种题型的解题思路、涉及到的知识点、公式再复习。如果遇到不懂的知识点再看教材或笔记。 2、每天…

Java填充Execl模板并返回前端下载

功能&#xff1a;后端使用Java POI填充Execl模板&#xff0c;并返回前端下载 Execl模板如下&#xff1a; 1. Java后端 功能&#xff1a;填充模板EXECL,并返回前端 controller层 package org.huan.controller;import org.huan.dto.ExcelData; import org.huan.util.ExcelT…

Cylinder3D论文阅读

Cylindrical and Asymmetrical 3D Convolution Networks for LiDAR Segmentation&#xff08;2020年论文&#xff09; 作者&#xff1a;香港中文大学 论文链接&#xff1a;https://arxiv.org/pdf/2011.10033.pdf 代码链接&#xff1a;https://github.com/xinge008/Cylinder3D …

Java21 如何使用switch case

1. Java8 和 Java21 Java8 引入字符串和枚举 Java21 可以返回值, yield关键字, switch 表达式, 模式匹配, null值处理 2. 代码案例 1. Java8 public static void java8() {String day "tuesday";switch (day) {case "monday":System.out.println("w…

梦想贩卖机升级版知识付费源码,包含前后端源码,非线传,修复最新登录接口问题

梦想贩卖机升级版&#xff0c;变现宝吸收了资源变现类产品的许多优势&#xff0c;并剔除了那些无关紧要的元素&#xff0c;使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持&#xff1a;视频、音频、图文、文档、会员、社群、用…

基于JavaWeb+BS架构+SpringBoot+Vue+Hadoop的物品租赁系统的设计与实现

基于JavaWebBS架构SpringBootVueHadoop的物品租赁系统的设计与实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目  录 I 1绪 论 1 1.1开发背景 1 1.2开发目的与意义 1 1.2.1开发目…