C语言之数组(精讲)

目录

数组

数组的声明(使用数组前的准备)

访问数组(数组的使用方法)

数组的遍历

数组初始化

1.在声明变量时,除了必要的情况下,都需要对变量进行初始化。

2.我们还可以像下面在声明数组时不指定元素个数,数组会根据初始值的个数自动进行设置。

3.使用0对{}内没有赋初始值的元素进行初始化。

4.使用0对初始化数组内的全部元素

在初始化数组时,也有错误的操作

数组的复制

输入数组元素的值

对数组的元素进行倒序排列

 使用数组进行成绩处理

对象式宏

数组元素的最大值和最小值

赋值表达式的判断

数组的元素个数

 结语


学生的学籍号码、运动选手背后的号码、飞机高铁的座位号……在生活中我们经常遇到把具有相同性质的事物聚集在一起的情况,如果我们一个个列举就显得十分冗杂,不如统一使用号码来解决这个问题,比如输入成绩时,我们对学生进行编号,再按编号输入成绩,要是你在程序中输入一个一个学生的姓名呢?是不是很麻烦

接下来我们将为大家介绍为了提高相同效率而把具有相同类型的数据有序地组织起来的一种形式——数组。

数组

在没学数组之前让我们输入5个学生的成绩、总和及其平均分并显示出来,我们一定会声明5个变量通过printf与scanf函数进行输入输出,再次通过sum求和,进而求平均。

对于上述的处理,除了变量名不同外,执行的都是相同的操作,所以当数量超过一定数值时就不能再这样处理了。

擅长处理这类数据的就是数组,它通过号码把相同数据类型的变量集中起来进行管理。

注意

可以用数组实现相同类型的对象的集合。

统一类型的变量——元素集中起来,在内存上排成一条直线,这就是数组。

数组的声明(使用数组前的准备)

首先进行声明,数组的声明通过指定元素类型、变量名、元素个数来进行,并且[ ]中的元素个数必须是常量。

,,下面是声明数组a,是一个元素类型为int类型、元素个数为5的数组。

访问数组(数组的使用方法)

数组a的各个元素,都是int类型的对象,不允许一些元素是int类型一些元素是double类型。

对于数组内各个元素的访问(读取)都是自由的,访问元素使用的是“[ ]”称为下标运算符。[ ]中的操作数称为下标

下标表示是首个元素之后的第几个元素,而不是数组中的第几个元素。

 另外,数组声明中使用的[ ]仅仅是分隔符,而访问数组时使用的则是运算符。

下表运算符
a[b]                          从数组a的首个元素起,访问b个元素后的元素

例如,从第一个元素开始访问是a[0],第二个元素是a[1]……第n个元素是a[n-1],不存在a[-1]、a[n]这样就溢出了。

数组的遍历

创建一个元素类型为int类型,包含5个元素的数组,依次把1—5赋值给它们并且进行显示。

#include<stdio.h>

int main()
{
	int v[5];
	v[0] = 1;//下标:0 1 2 3 4 
	v[1] = 2;//元素:1 2 3 4 5
	v[2] = 3;
	v[3] = 4;
	v[4] = 5;

	    printf("v[0] = %d\n", v[0]);
		printf("v[1] = %d\n", v[1]);
		printf("v[2] = %d\n", v[2]);
		printf("v[3] = %d\n", v[3]);
		printf("v[4] = %d\n", v[4]);
	
	return 0;
}

接下来我们使用for语句对其进行简化修改:创建变量i,是i从0递增到5,执行5次循环

#include<stdio.h>

int main()
{
	int v[5];
	int i;
	
	for(i = 0; i < 5; i++)//为元素赋值
	{
		v[i] = i + 1;
	}
	for(i = 0; i < 5; i++)//显示元素的值
	{
		printf("v[%d] = %d\n", v[i], i);
	}
	
	return 0;
}

接下来我们来进一步显示它循环的过程:

i=1时,v[0]=0+1;

i=2时,v[1]=1+1;

………………

i=4时,v[4]=4+1;

 像这样,按顺序逐个查看数组的元素,就称为遍历

数组初始化

1.在声明变量时,除了必要的情况下,都需要对变量进行初始化。

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

最后一个初始值加不加逗号都可以。

2.我们还可以像下面在声明数组时不指定元素个数,数组会根据初始值的个数自动进行设置。

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

3.使用0对{}内没有赋初始值的元素进行初始化。

int v[5] = {1, 2};//{1, 2, 0, 0, 0}

4.使用0对初始化数组内的全部元素

int v[0] = {0};//{0, 0, 0, 0, 0}

在初始化数组时,也有错误的操作

当初始值的个数超过超过数组的元素个数时,程序会发生错误。

int v[3] = {1, 2, 3, 4, 5};//初始化值过多

不能通过赋值语句进行初始化

int v[3];
v = {1, 2, 3};

数组的复制

我们把数组中的元素全部复制到另一个数组中。

#include<stdio.h>

int main()
{
	int i;
	int a[5] = {1, 2, 3};
	int b[5];
	
	for(i = 0; i < 5; i++)
	{
       b[i] = a[i] ;
	}
    puts("   a b");
	puts("   -------");
	for(i = 0; i < 5; i++)
	{
		printf("%4d%4d\n", a[i], b[i]);
	}
	return 0;
}

程序中的第一个for语句,作用是把a中的全部元素一次赋值给b中的元素

同时遍历两个数组,从b[0] = a[0]到b[4] = a[4]

C语言不支持基本赋值运算符,下面语句是错误的 

b = a;//不能为数组赋值

 注意

不能使用基本赋值运算符对数组进行赋值。数组的赋值必须通过使用循环语句对所有元素进行一一赋值。

第二个for语句时同时遍历两个数组,并且显示它们的值。

输入数组元素的值

从键盘中输入数组元素的值,并且一一显示它们。

#include<stdio.h>

int main()
{
	int i;
	int x[5];
	
	for(i = 0; i < 5; i++)
	{
		printf("x[%d]:", i);//输入元素的值
		scanf("%d", &x[i]);
	}
    puts("……………………");
	for(i = 0; i < 5; i++)
	{
		printf("x[%d]=%d \n", i, x[i]);//显示元素的值
	}
	return 0;
}

对数组的元素进行倒序排列

如果仅仅是按照顺序对数组内的元素赋值没有什么难度,接下来我们对数组的元素进行倒序排列。

我们创建5个元素的int类型的数组进行下列倒序排列

a[0]和a[4]交换;a[1]和a[3]交换;a[3]处在中间位置,顺序不发生改变

#include<stdio.h>

int main()
{
	int i;
	int a[5];
	for(i = 0; i < 5; i++)//为数组元素赋值
	{
		printf("a[%d]:", i);
		scanf("%d", &a[i]);
	}
	for(i = 0; i < 2; i++)//进行倒序排列
	{
		int temp = a[i];
		a[i] = a[4 - i];//交换a[i] 和a[4 - i]的数值
		a[4 - i] = temp;
	}
	puts("进行倒序排列");
	for(i = 0; i < 5; i++)
	{
		printf("[%d]=%d\n", i, a[i]);
	}
	return 0;
}

想要交换两个变量的值就必须引入一个中间变量来进行交换。

1.把a的值保存在temp中。

2.把b的值赋值给a。

3.把temp保存的值赋值给b。

不可以像下面一样进行赋值:

 a = b; b = a;这样a和b的值都会变为b的初始值。

 使用数组进行成绩处理

#include<stdio.h>

int main()
{
	int i;
	int sum;//5名学生分数的总和
	int tensu[5];//5名学生的分数
	
	for(i = 0; i < 5; i++)
	{
		printf("%2d号:", i + 1);
		scanf("%d", &tensu[i]);
		sum += tensu[i];
	}
	printf("总分:%5d\n", sum);
	printf("平均分:%5.1f\n", double(sum) / 5);
	
	return 0;
}

在这里我们仅仅是对5人的成绩进行运算,但是编写完程序后人数增加到8人呢?80人呢?800人呢?

在这里我们需要进行选择性替换(只替换需要替换的部分)

对象式宏

我们可以用对象式宏来解决上述问题

#include<stdio.h>

#define NUMBER 10//学生人数

int main()
{
	int i;
	int sum;//10名学生分数的总和
	int tensu[NUMBER];//10名学生的分数
	
	printf("请输入%d个学生的分数\n", NUMBER);
	
	for(i = 0; i < NUMBER; i++)
	{
		printf("%2d号:", i + 1);
		scanf("%d", &tensu[i]);
		sum += tensu[i];
	}
	printf("总分:%5d\n", sum);
	printf("平均分:%5.1f\n", double(sum) / NUMBER);
	
	return 0;
}

该程序的关键部分是#define指令

#define a b   将该指令的a替换为b

在这里,a称为宏名。为了易于与变量名区分我们通常用大写字母来表示。

在本程序中,宏名为NUMBER,被替换为10. 

在程序中使用宏,不仅能在一个地方进行统一管理,而且通过为常量定义名称还可以使程序更加易读,如果再加上注释,效果更明显。

程序中的10等常量被称为幻数(不清楚具体表示什么值),引入对象式宏后就可以消除程序中的幻数了。另外使用宏可以提高程序的质量。

 注意

不要在程序中直接使用数值,最好通过宏的形式定义出它们的名称。定义宏的时候不要忘记加上注释!

数组元素的最大值和最小值

我们来求出分数大最大值和最小值,即数组元素的最大和最小值

#include<stdio.h>

#define NUMBER 10//学生人数

int main()
{
	int i;
	int tensu[NUMBER];//5名学生的分数
	int max, min;
	
	printf("请输入%d个学生的分数\n", NUMBER);
	
	for(i = 0; i < NUMBER; i++)
	{
		printf("%2d号:", i + 1);
		scanf("%d", &tensu[i]);
	}
	
	min = max = tensu[0];
	
		for(i = 0; i < NUMBER; i++)
		{
			if(tensu[i] > max)  max = tensu[i];
			if(tensu[i] < min)  min = tensu[i];
		}
	printf("最高分:%d", max);
	printf("最低分:%d", min);
	
	return 0;
}

赋值表达式的判断

对于数值类型的判断我们在前面的数据类型讲到过,现在我们来看看什么是赋值表达式的判断?

在赋值时的判断结果中,与赋值后做操作数的类型和值相同,例如int n=2.22判断结果为n=2.

对于上面求最大值、最小值中由于赋值运算符=,具有结合性,所以可以看为

min = (max = tensu[0])

例如tensu[0]=20,那么min和max和值都为20.

C语言经常使用这样的赋值方法,如a = b =0就可以把0同时赋值给a和b,但是对于初始值的声明并不适用。

比如,int a = b = 0;不可这样进行初始化

应该这样,int a = 0, b = 0;当然也可以分开声明。

 我们把上面求求最大值的流程来写出来:

求tensu[0]—tensu[4]的最大值:

max = tensu[0];

if(tensu[1] > max) max = tensu[1];

if(tensu[2] > max) max = tensu[2];

if(tensu[3] > max) max = tensu[3];

if(tensu[4] > max) max = tensu[4];

 对与求最小值的流程也是一样这里我们便不再赘述了。

数组的元素个数

虽然通过定义宏来变更数组元素个数十分简单,但是每次都需要进行更改重新编译后执行,因此我们可以定义出一个较大的数组,从开头取出我们需要的部分。我们来对求学生分数进行下更改

#include<stdio.h>

#define NUMBER 80//人数上限

int mian()
{
	int i, j;
	int sum;//学生人数
	int tensu[NUMBER];//学生分数
	int bunpu[11] = {0};
	
printf("请输入学生人数");
	
	do
	{
		scanf("%d", &sum);       //选择学生的人数在复合的规定内
		if(sum < 1 || sum > NUMBER)
		{
			printf("请输入1—%d的数", NUMBER);
		}
	}while(sum < 1 || sum > NUMBER);
	
		printf("请输入学生的人数:%d\n", sum);
	
	for(i = 0; i < sum; i++)
	{
		printf("%2d号:", i + 1);
		do
		{
			scanf("%d", &tensu[sum]);     //输入学生成绩在1—100内
			if(tensu[sum] < 0 || tensu[sum] > 100)
			{
				printf("\a请输入1—100内的数值:\n");
			}
		}while(tensu[sum] < 0 || tensu[sum] > 100);
		bunpu[tensu[i] / 10]++;
	}
	
	puts("-----分布图-----");
	printf("		100:");
	
	for(j = 0; j < bunpu[10]; j++)//100分的分布图
	{
		putchar('*');
			putchar('\n');
	}

	
	for(j = 0; j < bunpu[10]; j++)//不到100分的分布图
	{
		printf("%3d - %3d:", i * 10, i * 10 + 9);
		putchar('*');
			putchar('\n');
	}
	

	return 0;
}

在本程序中,我们使用了int[11]数组bunpu来存放分数的分布。

求分布的表达式较为复杂,利用整数/整数舍去小数部分来进行递增的,如下

tensu[i] 为0—9时,bunpu[0]递增

tensu[i] 为10—19时,bunpu[1]递增

……………………………………

tensu[i] 为80—89时,bunpu[8]递增

tensu[i] 为90—99时,bunpu[9]递增

tensu[i] 为100时,bunpu[10]递增

通过上述循环,tensu[i]的分数就保存在数组bunpu中了。

 结语

数组就是我们向内存访问请求存放数据内存的地方,然后我们通过数组的声明为其确定类型、名称,再通过初始化后,通过进行下表运算符就可以对数组进行访问使用了,当然我们还可以不进行初始化,通过使用for循环对数组进行挨个赋值,再进行数组的遍历就可以使用了。

创建好数组后一般不能更改数组元素的个数,但是我们可以通过对象式宏来进行任意的对数组元素进行更改。

最后,天气渐冷,大家一定要做好保暖措施,锻炼身体,预防流感!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win10与 vm虚拟机win7共享文件夹创建

1:在win10&#xff08;主机&#xff09;电脑先随意共享一个文件夹 2&#xff1a;在win10&#xff08;主机&#xff09;上创建一个网络映射 右键此电脑选择映射网络驱动器 成功后会多出这个网络位置 3&#xff1a;win7虚拟机设置 在虚拟机中点击计算机右键添加一个网络位置

云HIS:新一代云架构医院信息管理系统源码(java语言)

云HIS信息管理云平台&#xff0c;提供全方位的临床系统应用&#xff0c;是国内领先的以云计算为基础&#xff0c;以云计算赋能医疗机构&#xff0c;是颠覆传统医疗信息化业态的技术与模式创新&#xff0c;以SaaS方式&#xff0c;为医疗机构提供信息系统服务&#xff0c;满足从医…

Scrapy爬虫数据存储为JSON文件的解决方案

什么是JSON文件 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人们阅读和编写&#xff0c;同时也易于机器解析和生成。它基于JavaScript Spark语言的一个子集&#xff0c;但独立于Smashing语言&#xff0c;因此在许多中…

【面试经典150 | 二叉树】翻转二叉树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

Linux 编译过程分析

文章目录 一、源码foo.hhello.cfoo1.cfoo2.c GCC 指令预处理命令hello.i 编译&#xff08;Compile only&#xff09;命令foo2.s 汇编命令readelfreadelf -hreadelf -Sreadelf -rreadelf -sstrip 链接 本文基于《深度探索Linux操作系统&#xff1a;系统构建和原理解析》 一、源…

2022年南美地区医疗机器人市场及全球概况报告

今天分享的是机器人系列深度研究报告&#xff1a;《2022年南美地区医疗机器人市场及全球概况报告》。 &#xff08;报告出品方&#xff1a;Apollo Reports&#xff09; 报告共计&#xff1a;172页 研究方法论 2.1通过桌面研究和内部存储库的假设 a)最初&#xff0c;各个类别…

深度学习实战64-黑白照片着色的模型应用,快速部署实现黑白图片快速上色的功能

大家好,我是微学AI,今天给大家介绍一下深度学习实战64-黑白照片着色的模型应用,快速部署实现黑白图片快速上色的功能。图片上色是一个具有多模态不确定性和高度不适定性的挑战性问题。直接训练深度神经网络通常会导致错误的语义颜色和低色彩丰富度。虽然基于Transformer的方…

从零开始学习 JS APL(六):完整指南和实例解析

学习目标&#xff1a; 1. 能够利用正则表达式校验输入信息的合法性 2. 具备利用正则表达式验证小兔鲜注册页面表单的能力 学习内容&#xff1a; 正则表达式 综合案例 阶段案例 学习时间&#xff1a; 周一至周五晚上 7 点—晚上9点周六上午 9 点-上午 11 点周日下午 3 点-下…

力扣11.盛最多水的容器

题目描述 思路 用双指针法。 每次向内移动较短的那个板&#xff0c;能带来更大的效益。 代码 class Solution {public int maxArea(int[] height) {int res 0;int i 0,j height.length - 1;while(i < j){res height[i] < height[j] ? Math.max((j - i) * height…

BearPi Std 板从入门到放弃 - 引气入体篇(7)(DAC)

简介 基于前面的文章, 缩略STM32CubeMx创建项目的过程&#xff0c;直接添加DAC相关初始化; 开发板 &#xff1a; Bearpi Std(小熊派标准板) 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 串口: Usart1 KEY1 : PB2 \ 上拉 \ 按下下降沿触发(一次)\ 用于增…

2024年MCM/ICM美国大学生数学建模竞赛备战指南

01 2024美赛基本要求 1.关于时间&#xff08;北京时间&#xff09; 比赛开始时间&#xff1a; 2024年2月2日6:00至 2024年2月6日9:00 提交截止时间&#xff1a;2024年2月6日10:00 结果发布时间&#xff1a;结果将于2024年5月31日或之前发布 2.关于规则 完整的解决方案现…

海上液化天然气 LNG 终端 ,数字孪生监控系统

液化天然气 (Liquefied Natural Gas&#xff0c;简称 LNG) 在能源转型过程中被广泛认可为相对较清洁的能源选择。 相对于传统的煤炭和石油燃料&#xff0c;LNG 的燃烧过程产生的二氧化碳 (CO2) 排放较低。LNG 的燃烧释放的二氧化碳排放较少&#xff0c;因此对应对气候变化和减…

ChatGPT哪些行业需要学习?

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

Modbus数据类型转换

前请提要: 从PLC读取的数值,不管是读正负整数还是正负浮点数,读取过来后都会变成UInt16,也就是Ushort类型 一、ushort(UInt16)转成 Int32 源代码方法: //ushort类型转Int32类型的方法private int ushortToInt32(ushort[] date, int start){//先进行判断,长度是否正确…

【算法题】一种字符串压缩表示的解压(js)

输入&#xff1a;2dff 输出 !error 两个d不需要压缩&#xff0c;故输入不合法 输入:4eA 输出:!error 全部由小写英文字母组成&#xff0c;压缩后不会出现&#xff0c;故输出不合法 function solution(str) {const error "!error";// 只能包含小写字母和数字 [^a-z0…

无需公网IP实现公网远程访问本地WebDAV服务

windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】 文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访…

踩坑记录:SpringBoot集成Dubbo和Nacos版本问题

一、概述 最近在整理依赖&#xff0c;原本用的springcloud提供的nacos&#xff0c;看到老早都不更新了&#xff0c;而且有些包冲突&#xff0c;就换了ali的&#xff0c;用的spring-boot版本是2.3.9.RELEASE&#xff0c;对应spring-cloud版本是Hoxton.SR12&#xff0c;dubbo用的…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换 Laplace Transform : X ( s ) L [ x ( t ) ] ∫ 0 ∞ x ( t ) e − s t d t X\left( s \right) \mathcal{L} \left[ x\lef…

现货黄金会面临哪些风险?

进行现货黄金投资&#xff0c;我们除了要了解怎么找到交易机会以外&#xff0c;也要知道我们交易会面临哪些风险&#xff0c;了解风险就是做到知己知彼&#xff0c;了解风险才能控制风险。控制住风险&#xff0c;才能为我们稳定盈利打好基础&#xff0c;那么下面我们就来看看在…

Linux入门笔记

1 Linux概述 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心…