利用数组处理批量数据

news/2024/10/23 0:32:10

数组是一组有序数据的集合。数组中各数据的排列有一定规律,下标代表数据在数组中的序号

用一个数组名和下标来唯一的确定数组中的元素

数组中的每一个元素都属于同一个数据类型。不能把不同类型的数据放在同一个数组中

将数组和循环结合起来,可以有效的处理大批量的数据

怎样定义和引用一维数组

一维数组是数组中最简单的,它的元素只需要用数组名加一个下标,就能唯一的确定

怎样定义一维数组

要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中有多少元素,属于哪个数据类型。否则计算机不会自动的把这一批数据作为数组处理。

定义一维数组的一般形式:类型符 数组名[常量表达式]

数组名的命名规则和变量名相同,遵循标识符命名规则

在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度

常量表达式中可以包括常量和符号常量,不能包含变量。也就是说C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。

//如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式,如:
void func (int n)
{int a[2 * n];    //合法,n 的值从实参传来
}
//在调用 func 函数时,形参 n 从实参得到值。这种情况称为“可变长数组”,允许在每次调用 func 函数时,n 有不同的值
//但是在执行函数时,n 的值是不可变的,数组长度是固定的
//如果指定数组为静态(static)存储方式,则不能用“可变长数组”

怎样引用一维数组元素

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

引用数组元素的表示形式:数组名[下标]“下标”可以是整型常量或整形表达式

//定义数组时用到的“数组名[常量表达式]”和引用数组元素时用的“数组名[下标]”形式相同,但是含义不同
int a[10];    //定义数组时指定数组包含10个元素
t = a[6];    //a数组中序号为6的元素

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


//对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出#include <stdio.h>int main(void)
{int arr[10];for (int i = 0; i < 10; i++)arr[i] = i;for (int i = 9; i >= 0; i--)printf("%d\t", arr[i]);printf("\n");return 0;
}

运行结果:

数组元素的下标是从0开始的

一维数组的初始化

为了使程序简洁,常在定义数组的同时,给各数组元素赋值,这称为数组的初始化。可以用“初始化列表”方法实现数组的初始化

  1. 在定义数组时,对全部数组元素赋予初值int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }将数组中元素的初值顺序放在一堆花括号内,数据间用逗号分隔 。花括号内的数据就称为“初始化列表”
  2. 可以只给数组中的一部分元素赋值int a[10] = { 0, 1, 2, 3, 4 }定义数组有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 }

如果数组长度与提供初值的个数不一致时,则方括号中的数组长度不能省略

如果在定义数值型数组时,指定了数组的长度并对之初始化,凡未被“初始化列表”指定初始化的数组元素,系统会自动把它们初始化为0(如果是字符型数组,则初始化为‘\0’,如果是指针型数组,则初始化为NULL,即空指针)

怎样定义和引用二维数组

二维数组通常称为矩阵。把二维数组写成行和列的排列形式,可以有助于形象化的理解二维数组的逻辑结构

怎样定义二维数组

二维数组定义的一般形式为:类型说明符 数组名[常量表达式][常量表达式];

C语言对二维数组采用这样的定义方式,使得二维数组可以被看作是一种特殊的一维数组:它的元素又是一个一维数组。

C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,接着再存放第二行的元素...

用矩阵形式表示二维数组,是逻辑上的概念,能形象的表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。

C语言还允许使用多维数组,多维数组元素在内存中排列的顺序为:第一维的下标变化最慢,最右边的下标变化最快

怎样引用二维数组的元素

二维数组元素的表示形式:数组名[下标][下标]下标应是整型表达式

数组元素可以出现在表达式中,也可以被赋值

在引用数组元素中,下标值应在已定义的数组大小的范围内。

二维数组的初始化

可以用“初始化列表”对二维数组初始化

  1. 分行给二维数组赋初值:int a[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }};这种赋初值方法比较直观,把第一个花括号内的数据给第一行的元素,第二个花括号内的数据给第二行的元素...即按行赋值
  2. 可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值:int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };效果和第一种方法相同,但是这种不直观,容易遗漏,不易检查
  3. 可以对部分元素赋初值:int a[3][4] = { { 1 }, { 5 }, { 9 } };未赋值元素自动赋0,对非0元素少时方便
  4. 如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维度的长度可以不指定,但是第2维度的长度不能省int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };可以写成int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
  5. 在定义时也可以只对部分元素赋初值而省略第1维长度,但应分行赋初值int a[][4] = { { 1, 2, 3, 4 }, {}, { 9, 10, 11, 12 }};

C语言在定义数组和表示数组时采用 a[][] 这种两个方括号的方式,对数组初始化时十分有用,概念清楚,使用方便,不易出错

二维数组程序举例

例:将一个二维数组行和列的元素互换,存到另一个二维数组中


//将一个二维数组行和列的元素互换,存到另一个二维数组中#include <stdio.h>int main(void)
{int arr_a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };int arr_b[3][2] = { 0 };for (int i = 0; i < 3; i++){for (int j = 0; j < 2; j++)arr_b[i][j] = arr_a[j][i];}printf("arr_a\n");for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++)printf("%d\t", arr_a[i][j]);printf("\n");}printf("\narr_b\n");for (int i = 0; i < 3; i++){for (int j = 0; j < 2; j++)printf("%d\t", arr_b[i][j]);printf("\n");}return 0;
}

运行结果:

例:有一个 3 * 4 的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号


//有一个 3 * 4 的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号#include <stdio.h>int main(void)
{int arr[3][4] = { { 1, 2, 3, 4 }, {9, 8, 7, 6 }, { -10, 10, -5, 2 } };int iMax = arr[0][0], iCol = 0, iRow = 0;for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++)(iMax > arr[i][j]) ? (iMax = iMax) : (iMax = arr[i][j], iRow = i, iCol = j);}printf("iMax = %d\niRow = %d\niCol = %d\n", iMax, iRow, iCol);return 0;
}

运行结果:

字符数组

字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节

由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种

C语言没有字符串类型,字符串是存放在字符型数组中

怎样定义字符数组

用来存放字符数据的数组是字符数组

字符数组中的一个元素存放一个字符

定义字符数组的方法与定义数值型数组的方法类似

由于字符型数据是以整数形式(ASCII代码)存放的,因此可以用整型数组它存放字符数据

字符数组的初始化

对字符数组初始化,最容易理解的方式是用“初始化列表”,把各个字符依次赋值给数组中各元素char c[10] = { 'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y' };

如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。

如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。

如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定位空字符(即'\0'

如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度

怎样引用字符数组中的元素

可以引用字符数组中的一个元素,得到一个字符

例:输出一个已知的字符串


//输出一个已知的字符串#include <stdio.h>int main(void)
{char arrCh[] = { 'I', ' ', 'a', 'm', ' ', 'a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't', '.' };for (int i = 0; i < 15; i++)printf("%c", arrCh[i]);printf("\n");return 0;
}

运行结果:

字符串和字符串结束标志

在C语言中,是将字符串作为字符数组来处理的

C语言规定了一个“字符串结束标志”,以字符'\0'作为结束标志,在遇到字符'\0'时,表示字符串结束,把它前面的字符组成一个字符串

C系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符

有了结束标志'\0'后,字符数组的长度就显得不那么重要了。在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。

如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串的长度

'\0'代表ASCII码为 0 的字符,从ASCII码表中可以查到,ASCII码为 0 的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志

可以用字符串常量来使字符数组初始化char c[] = { "I am happy" };等价于char c[] = "I am happy";等价于char c[] = { 'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '\0' };

字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',是否需要加'\0'完全根据需要决定

由于系统在处理字符串常量存储时会自动加一个'\0',因此为了使处理方法一致,便于测定字符串的实际上度,以及在程序中作相应的处理,在处理字符数组中也常常人为的加上一个'\0'

字符数组的输入和输出

字符数组的输入输出可以有两种方法:

  1. 逐个字符输入输出,用格式符"%c"输入或输出一个字符
  2. 将整个字符串一次输入输出,用"%s"格式符,意思是对字符串的输入输出

输出的字符中不包括结束符'\0'

"%s"格式符输出字符串时,printf 函数中的输出项是字符串数组名,而不是数组元素名

如果数组长度大于字符串的实际长度,也只输出到遇'\0'结束

如果一个字符串数组中包含一个以上'\0'则遇到第一个'\0'时输出结束

可以用 scanf 函数输入一个字符串scanf("%s", c);c 是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度

//如果利用一个 scanf 函数输入多个字符串,则应在输入时以空格分隔
char str1[5], str2[2], str3[5];
scanf("%s %s %s", str1, str2, str3);

scanf 函数中的输入项如果是字符数组名,不要再加地址符&因为在C语言中数组名代表该数组的起始地址

使用字符串处理函数

在C函数库中提供了一些用来专门处理字符串的函数

puts 函数--输出字符串的函数

一般形式:puts(字符数组)其作用是将一个字符串(以'\0'结束的字符序列)输出到终端

用 puts 函数输出的字符串中可以包含转义字符

char str[] = "China";
puts(str);
//输出 China

gets 函数--输入字符串的函数

一般形式:gets(字符数组)其作用是从终端输入一个字符串得到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址

char str[1024];
gets(str);
//在终端获取字符串存储在 str 中

一般利用 gets 函数的目的是向字符数组输入一个字符串,而不大关心其函数值

puts 和 gets 函数只能输出或输入一个字符串

strcat 函数--字符串连接函数

其一般形式:strcat(字符数组1, 字符数组2)其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值--字符数组1的地址

char str1[100] = "People's Republic of ";
char str2[] = "China";
printf("%s", strcat(str1, str2));
//输出 People's Republic of China

字符数组1必须足够大,以便容纳连接后的新字符串

连接前两个字符串的后面都有'\0'连接时将字符串1后面的'\0'取消,只在新字符串最后保留'\0'

strcpy 和 strncpy 函数--字符串复制函数

其一般形式:strcpy(字符数组1, 字符数组2)其作用是将字符串2复制到字符数组1中去

char str1[10], str2[] = "China";
strcpy(str1, str2);
//str1 = "China"

字符数组1必须定义的足够大,以便容纳被赋值的字符串2;字符数组1的长度不应小于字符串2的长度

“字符数组1”必须写成数组名的形式,“字符数组2”可以是字符数组名,也可以是一个字符串常量

不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组,只能用 strcpy 函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素

可用用 strncpy 函数将字符串2中前面n个字符赋值到字符数组1中去

strcmp 函数--字符串比较函数

其一般形式:strcmp(字符串1, 字符串2)其作用是比较字符串1和字符串2

字符串比较的规则是:将两个字符串自左向右逐个字符相比(按ASCII码值大小比较)直到出现不同的字符或遇'\0'为止

如果全部字符相同,则认为两个字符串相等

若出现不相同的字符,则以第一对不相同的字符的比较结果为准

比较的结果由函数值返回:

  • 如果字符串1=字符串2,则返回0
  • 如果字符串1>字符串2,则函数值是一个正整数
  • 如果字符串1<字符串2,则函数值是一个负整数

strlen 函数--测字符串长度的函数

其一般形式:strlen(字符数组)它是测试字符串长度的函数,函数值为字符串中的实际长度(不包括'\0'在内)

strlwr 函数--转换为小写的函数

其一般形式:strlwr(字符串)其作用是将字符串中大写字母换成小写字母

strupr 函数--转换为大写的函数

其一般形式:strupr(字符串)其作用是将字符串中小写字母换成大写字母

在使用字符串处理函数时,应当在程序文件的开头用#include <string.h>

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

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

相关文章

执行yum install 的时候提示【没有可用的软件包】的解决方案

这种情况,可能是yum 源不正确的问题,解决方案如下: 1.执行cd /etc/yum.repos.d,进入这个目录下,查看文件是否存在并检查文件内容的正确性 2、CentOS-Base.repo文件可以在网上下载一个,以下是范文# CentOS-Base.repo # # The mirror system uses the connecting IP addres…

newc++file.cpp在哪

本人的newc++file.cpp文件在C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\VC\VCProjectItems可以在这个cpp文件里面自己选择是否写#define _CRT_SECURE_NO_WARNINGS 如果写了,则在visual studio中新建的cpp文件都有这个这个预处理命令主要是为…

Android13冻结进程分析:如何提高设备性能和用户体验

本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗。 文章讨论了如何合理分配资源,包括CPU、内存等,以提高设备性能和用户体验。此外,文章还提到了冻结进程对应用程序线程的影响,并介绍…

一图总结sql语言的最常用知识

一, 五大类sql语言DDL Data Definition Language, 数据定义语言,用于定义不同的数据字段、数据库、表、列、索引。如:create、drop、alter等DML Data Manipulation Language,数据操作语言,用于添加、删除、修改、查询数据的完整性。如:insert、 update 、 delete 等DQL Data…

10/22二叉树 求度为1的结点个数

include using namespace std; typedef struct BiNode { char data; struct BiNode* lchild, * rchild; }BiTNode, * BiTree; void CreateBiTree(BiTree& T)//创建一个二叉树 { char ch; cin >> ch; if (ch == #) T = NULL; else { T = new BiTNode; T->data = c…

初识封装

1.理解:“高内聚,低耦合” 高内聚即是说在内部繁琐的代码细节都由我们自己一人完成,包装起来,不让他人看见。而低耦合则是给用户一些较低的权限去使用软件。 2.铭记:属性私有,get/set 3.private:用于私有属性,与public形成反差,私有后的属性无法被随意调用。 如图: 4…

软件工程团队作业

需求规格说明书 0. 目录需求规格说明书0. 目录 1. 引言1.1 目的 1.2 背景 1.3 定义 1.4 参考文献2. 项目概述2.1 产品背景 2.2 产品描述 2.3 产品功能 2.4 未来市场2.5 应用目标与作用范围2.6 用户场景 2.7 假设与约束2.7.1 假设 2.7.2 约束3. 具体需求3.1 外部接口需求3.1.1 用…

《使用Gin框架构建分布式应用》阅读笔记:p108-p126

《用Gin框架构建分布式应用》学习第8天,p108-p126总结,总计18页。 一、技术总结 1.Redis eviction policy (1)什么是 eviction policy? The eviction policy determines what happens when a database reaches its memory limit. (2)配置示例 在redis.conf中配置。 maxmemor…