C++| 匠心之作 从0到1入门学编程【免费】​yun.itheima.com

C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型、结构体类型和共用体类型。下面我们详细介绍下什么是数组?什么是数组
在程序中,经常需要对一批数据进行操作,例如,统计某个公司100个员工的平均工资。如果使用变量来存放这些数据,就需要定义100个变量,显然这样做很麻烦,而且很容易出错。这时,可以使用X[0]、X[1]、X[2]、…、X[99]表示这100个变量,并通过方括号中的数字来对这100个变量进行区分。
在程序设计中,使用X[0]、X[1]、X[2]、…、X[99]表示的一组具有相同数据类型的变量集合称为数组X,数组中的每一项称为数组的元素,每个元素都有对应的下标(n),用于表示元素在数组中的位置序号,该下标是从0开始的。
为了大家更好地理解数组,接下来,通过一张图来描述数组X[10]的元素分配情况。

从图中可以看出,数组X包含10个元素,并且这些元素是按照下标的顺序进行排列的。由于数组元素的下标是从0开始的,因此,数组X的最后一个元素为X[9]。
需要注意的是,根据数据的复杂度,数组下标的个数是不确定的。通常情况下,数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组、四维数组等。通常情况下,我们将二维及以上的数组称为多维数组。

一维数组的定义与初始化

一维数组指的是只有一个下标的数组,它用来表示一组具有相同类型的数据。在C语言中,一维数组的定义方式如下所示:

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

在上述语法格式中,类型说明符表示数组中所有元素的类型,常量表达式指的是数组的长度,也就是数组中存放元素的个数。

例:

int array[5l;

上述代码定义了一个数组,其中,int是数组的类型,aray是数组的名称,方括号中的5是数组的长度。完成数组的定义后,只是对数组中的元素开辟了一块内存空间。这时,如果想使用数组操作数据,还需要对数组进行初始化。数组初始化的常见的方式有3种,具体如下

(1)直接对数组中的所有元素赋值,示例代码如下:

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

上述代码定义了一个长度为5的数组i,并且数组中元素的值依次为1、2、3、4、5。

(2)只对数组中的一部分元素赋值,示例代码如下

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

在上述代码中,定义了一个int类型的数组,但在初始化时,只对数组中的前3个元素进行了赋值,其他元素的值会被默认设置为

(3)对数组全部元素赋值,但不指定长度,示例代码如下:

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

在上述代码中,数组i中的元素有4个,系统会根据给定初始化元素的个数定义数组的长度,因此,数组i的长度为4。

注意

(1)数组的下标是用方括号括起来的,而不是圆括号;

(2)数组名的命名同变量名的命名规则相同;

(3)数组定义中,常量表达式的值可以是符号常量,如下面的定义就是合法的。

int a[N];      //假设预编译命令#define N 4,下标是符号常量

一维数组的引用

在程序中,经常需要访问数组中的一些元素,这时可以通过数组名和下标来引用数组中

的元素。一维数组元素的引用方式如下所示:

数组名 [下标];

在上述方式中,下标指的是数组元素的位置,数组元素的下标是从0开始的。例如,引用数组X的第3个元素的方式为X[2]为了帮助大家更好地理解数组元素的引用榜下业通计一个室例来演示,如下所示:

#include<stdio.h>
void main(int argc, char *argv[]){int x[5] = {2,3,1,4,6};int i;for (i = 0; i < 5; i++) {printf("%dn", 2 * x[i]);}
}

运行结果若下图所示:

在上面案例中,首先定义了一个数组x,然后通过下标的形式获取到数组中的元素,最后将元素乘以2后输出。

注意

数组的下标都有一个范围,即“0~[数组长度-1]”,假设数组的长度为6,其下标范围为0~5。当访问数组中的元素时,下标不能超出这个范围,否则程序会报错。

一维数组的常见操作

数组在编写程序时应用非常广泛,如经常需要对数组进行遍历、获取最值、排序等操作灵活地使用数组对实际开发很重要。接下来针对一维数组的常见操作进行详细的讲解,具体如下。

1、一维数组的遍历

在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。接下来使用for循环依次遍历数组中的元素,如下所示:

#include<stdio.h>
void main(int argc, char *argv[]){int x[5] = {2,3,1,4,6};int i = 0;for (i = 0; i < 5; i++) {printf("x[%d]:%dn", i, x[i]);}
}

运行结果如下:

在上面案例中,首先定义了一个长度为5的数组X,然后定义了一个变量,由于数组的下标范围为0-4,因此可以将i的值作为下标,依次去访问数组中的元素,并将元素的值输出。

2、一维数组的最值

在操作数组时,经常需要获取数组中元素的最值。接下来通过案例演示如何获得数组中最大的数值。

#include<stdio.h>
int main(int argc, char *argv[]){int x[5] = {2,3,1,4,6};int nMax = x[0];int i = 0;for (i = 0; i < 5; i++) {if (x[i] > nMax) {nMax = x[i];}}printf("max:%dn", nMax);return 0;
}
运行结果如下

在上面案例找那个实现了获取数组X最大值的功能。在第5行代码中假定数组中的第1个元素为最大值,并将其赋值给nMax,在第7~13行代码对数组中的其他元素进行遍历,如果发现比mMax值大的元素,就将最大值nMx设置为这个元素的值,这样,当数组遍历完成后,nMax中存储的就是数组中的最大值。

3、一维数组的排序

在操作数组时,经常需要对数组中的元素进行排序。接下来为大家介绍一种比较常见的排序算法一冒泡排序。在冒泡排序的过程中,不断地比较数组中相邻的两个元素,较小者向上浮、较大者往下沉,整个过程和水中气泡上升的原理相似,接下来,分步骤讲解冒泡排序的整个过程,具体如下。

第1步,从第1个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前1个元素比后1个元素大,则交换它们的位置。整个过程完成后,数组中最后1个元素自然就是最大值,这样也就完成了第1轮的比较。

第2步,除了最后1个元素,将剩余的元素继续进行两两比较,过程与第1步相似,这样就可以将数组中第二大的数放在倒数第2个位置。

第3步,依次类推,持续对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较为止。

了解了冒泡排序的原理之后,接下来通过一个案例来实现冒泡排序。

#include<stdio.h>
void main(int argc, char ** argv[]){int arr[5] = { 9,8,3,5,2 };int temp = 0;int i, j;printf("冒泡排序前:n");for (i = 0; i < 5; i++) {printf("%d ", arr[i]);}printf("n");for (i = 0; i < 5 - 1; i++) {for (j = 0; j < 5 - 1 - i; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}printf("冒泡排序后:n");for (i = 0; i < 5; i++) {printf("%d ", arr[i]);}printf("n");
}

在上面的案例中,通过嵌套for循环实现了冒泡排序。其中,外层循环用来控制进行多少轮比较,每一轮比较都可以确定1个元素的位置,由于最后1个元素不需要进行比较,因此,外层循环的次数为数组的长度-1,内层循环的循环变量用于控制每轮比较的次数,在每次比较时,如果前者小于后者,就交换两个元素的位置。下面通过一张动图来演示冒泡排血的运算过程。

二维数组的定义与初始化

在实际的工作中,仅仅使用一维数组是远远不够的,例如,一个学习小组有5个人,每个人有3门课的考试成绩,如果使用一维数组解决是很麻烦的。这时,可以使用二维数组,维数组的定义方式与一维数组类似,其语法格式如下:

类型说明符 数组名[常量表达式1] [常量表达式2];

在上述语法格式中,“常量表达式1”被称为行下标,“常量表达式2”被称为列下标。

例如,定义一个3行4列的二维数组,具体如下:

int a[3][4];

在上述定义的二维数组中,共包含3*4个元素,即12个元素。接下来,通过一张图来描述二维数组a的元素分布情况。

从图中可以看出,二维数组a是按行进行存放的,先存放a行,再存放a[1行、a2行,并且每行有4个元素,也是依次存放的。

完成二维数组的定义后,需要对二维数组进行初始化,初始化二维数组的方式有4种,具体如下。

(1)按行给二维数组赋初值。例如:

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

在上述代码中,等号后面有一对大括号,大括号中的第1对括号代表的是第1行的数组元素,第2对括号代表的是第2行的数组元素。

(2)将所有的数组元素按行顺序写在1个大括号内。例如

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

在上述代码中,二维数组a共有两行,每行有3个元素,其中,第1行的元素依次为1、2、3,第2行元素依次为4、5、6。

(3)对部分数组元素赋初值。例如:

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

在上述代码中,只为数组b中的部分元素进行了赋值,对于没有赋值的元素,系统会自动赋值为0,数组b中元素的存储方式如下所示。

(4)如果对全部数组元素置初值,则二维数组的第1个下标可省略,但第2个下标不能省略。例如

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

可以写为

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

系统会根据固定的列数,将后边的数值进行划分,自动将行数定为2。

二维数组的引用

二维数组的引用方式同一维数组的引用方式一样,也是通过数组名和下标的方式来引用数组元素,其语法格式如下:

数组名[下标] [下标];

在上述语法格式中,下标值应该在已定义的数组的大小范围内,例如,下面这种情况就是错误的。

int a[3][ 4];    //定义a为3行4列的二维数组
a[3][4]=3;    //对数组a第3行第4列元素赋值,出错在上述代码中,数组a可用的行下标范围是0~2,列下标是0~3,a[3][4]超出了数组的下标范围。为了帮助读者更好地掌握二维数组的引用,接下来,通过一个案例来演示二维数组的遍历。#include<stdio.h>
void main() {//申明并初始化数组int array[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };for (int i = 0; i < 3; i++)    //循环遍历{for (int j = 0; j < 4; j++)    //循环遍历{printf("[%d][%d]: %d", i, j, array[i][j]);}printf("n");    //每行添加换行字符}
}

运行结果如下

在上图中定义了一个二维数组aray,该数组有3行4列。当使用嵌套for循环遍历二维数组元素时,外层for循环用于变量数组的行元素,内层for循环用于遍历数组的列元素。从图中可以看出,程序依次将数组aray中的元素输出了。

二维数组的应用

熟悉了二维数组的定义和引用,接下来定义一个二维数组 StuScore[5][3],用来存放5名同学3门课程的成绩,并定义变量m表示学生,n表示第几门成绩,aver表示每名同学3门课程的平均成绩,sum表示每名同学3门课的总成绩,具体如下案例所示:

#include<stdio.h>
void main(int argc, char *argv[])
{int StuScore[5][3] = {//张同学{88, 70, 90},//王同学{80, 80, 60},//李同学{89, 60, 85},//赵同学{80, 75, 78},//周同学{70, 80, 80}};int m = 0, n = 0;int nStuTotalScore = 0;int nMathTotalScore = 0;int nChineseTotalScore = 0;int nEnglishToatalScore = 0;printf("个人总成绩:n");for (m = 0; m < 5; m++) {nStuTotalScore = 0;for (n = 0; n < 3; n++) {nStuTotalScore += StuScore[m][n];switch (n){case 0:{nMathTotalScore += StuScore[m][n];break;}case 1:{nChineseTotalScore += StuScore[m][1];break;}case 2:{nEnglishToatalScore += StuScore[m][2];}}}switch (m){case 0:{printf("张同学:%dn", nStuTotalScore);break;}case 1:{printf("王同学:%dn", nStuTotalScore);break;}case 2:{printf("李同学:%dn", nStuTotalScore);break;}case 3:{printf("赵同学:%dn", nStuTotalScore);break;}case 4:{printf("周同学:%dn", nStuTotalScore);break;}}}printf("小组数学总分: %d 小组数学平均分:%.2fn",nMathTotalScore, (double)nMathTotalScore / 5);printf("小组语文学总分: %d 小组语文平均分:%.2fn",nChineseTotalScore, (double)nChineseTotalScore / 5);printf("小组英语总分: %d 小组英语平均分:%.2fn",nEnglishToatalScore, (double)nEnglishToatalScore / 5);}

运行结果如下

上面案例中实现了计算小组各科平均分的功能。其中,第415行代码定义了一个二维数组,用来存储小组中每个成员的各科成绩。第25~45行代码通过遍历列下标获取每个小组不同学科的总分,第46~74行代码通过遍历行下标获取每个小组成员的总分,最后将小组不同学科的总分和平均分输出。

c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?相关推荐

  1. C语言中的一维数组和二维数组

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104344394 一 ...

  2. 【chatGPT】01 数组、二维数组在不同语言中的存储方式

    问:数组在C++中的存储方式是什么?Java呢?Python呢?可以举例吗? C++ 在C++中,数组是连续分配的内存单元,具有相同的类型和大小. C++会将数组的第一个元素存储在指向数组的指针中,因 ...

  3. C语言从青铜到王者——数组详解总结【一维数组、二维数组、字符数组、数组实例】

    所谓数组,是指将那些具有相同类型的.数量有限的若干个变量通过有序的方法组织起来的一种便于使用的形式.数组属于一种构造类型,其中的变量被称为数组的元素.数组元素的类型可以是基本数据类型,也可以是特殊类型 ...

  4. C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)

    C语言数组   数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等.   一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...

  5. C语言 一维数组、二维数组的创初始化、使用和存储

    目录 数组 一维数组 一维数组的创建和初始化 一维数组的定义 一维数组的初始化 完全初始化 不完全初始化 一维数组的使用 一维数组的使用代码示例 一维数组在内存中的存储 代码示例 二维数组 二维数组的 ...

  6. python定义二维数组_二维数组的定义、初始化和输出,C语言二维数组详解

    本节学习二维数组.二维数组与一维数组相似,但是用法上要比一维数组复杂一点.后面的编程中,二维数组用得很少,因为二维数组的本质就是一维数组,只不过形式上是二维的.能用二维数组解决的问题用一维数组也能解决 ...

  7. c语言的整形二维数组,C语言入门 — 数组,二维数组

    1.C语言入门 - 数组,结合上一篇文章<C语言入门 - 数组,一维数组>, 我们这里讲如何使用二维数组, 二维数组可以理解成多个一维数组组成的数组, 比如定义两个a[10]的数组可以这样 ...

  8. 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

    文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...

  9. 【C语言】数组(一维数组、二维数组)

    目录 一.一维数组 1.一维数组的创建(定义) 2.一维数组的初始化 3.一维数组的内存分配 二.二维数组 1.二维数组的创建(定义) 2.二维数组的初始化 3.二维数组的内存分配 三.数组越界 四. ...

最新文章

  1. 为何 short s1 = 1; 是对的,而 float f=3.4; 是错的?
  2. 简单电商购物程序(续1)
  3. 使用socket获取网卡信息
  4. exit(0)什么意思php,php – 文件中的exit(1)导致脚本状态码为0
  5. c 自定义实现string类 clear_有关类加载器的总结
  6. java8 大到小排序,屌炸天,JDK8的排序大法!!
  7. java字符连接字符串数组_Java中连接字符串的最佳方法
  8. client mysql 逗号_Mysql-Client编码问题
  9. Quartus17报错Top-level design entity “dff“ is undefined的解决办法
  10. 服务器端配置nodejs环境(使用pm2进程管理运行)
  11. php抓取视频教程,PHP抓取、分析国内视频网站的视频信息工具类_PHP
  12. NMAKE makefile内容和功能
  13. CodeMeter服务无法启动
  14. pandas 聚合 df.groupby.agg
  15. python计算平均数、众数、中位数、极差、方差、标准差……
  16. 最新ECS阿里云服务器租用价格表,优惠活动(实时更新)
  17. android 检查更新 卡住,阴阳师安装更新包卡住怎么办_安装更新包卡住解决办法...
  18. 使用 NodeBB 搭建的中文社区索引
  19. scala 惰性函数
  20. 用大白话说说JavaWeb相关技术

热门文章

  1. redis一般缓存什么样数据_门户数据展示_Redis缓存数据
  2. 一站式论文提升服务,助您顺利发文章!
  3. Science背靠背: NLR受体介导植物抗病反应新机制
  4. 喜报!清华社《晓肚知肠:肠菌的小心思》荣获“2018年度中国好书”奖
  5. 微生物常见20种培养基配方
  6. R语言plotly可视化:plotly可视化分裂的分组小提琴图、每个小提琴图内部分为两组数据、每个分组占小提琴图的一半(Split violin plot in R with plotly)
  7. R语言ggplot2可视化:使用ggplot2绘制按时间顺序排列的时间线图(chronological timeline plot)
  8. pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe)
  9. pandas删除dataframe中行内容全是0的数据行(remove rows with all zeros in dataframe)
  10. R语言编写自定义分组统计函数(customize statistics function)可视化分组箱图并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)