第六章 利用数组处理批量数据

原创
2020/10/17 13:41
阅读数 10

章节结构

  • 6.1 怎样定义和引用一维数组
    • 6.1.1 定义一维数组
    • 6.1.2 引用一维数组元素
    • 6.1.3一维数组的初始化
    • 6.1.4一维数组程序举例
  • 6.2 怎样定义和引用二维数组
    • 6.2.1 定义二维数组
    • 6.2.2 引用二维数组元素
    • 6.2.3 二维数组的初始化
    • 6.2.4 二维数组程序举例
  • 6.3 字符数组
    • 6.3.1 定义字符数组
    • 6.3.2 字符数组的初始化
    • 6.3.3 引用字符数组的元素
    • 6.3.4 字符串和字符串结束标志
    • 6.3.5字符数组的输入输出
    • 6.3.6使用字符串处理函数(8个)
      • puts函数——输出字符串的函数
      • gets函数——输入字符串的函数
      • strcat函数——字符串连接函数
      • strcpy和strncpy函数——字符串赋值函数
      • strcmp函数——字符串比较函数
      • strlen函数——测字符串长度的函数
      • strlw函数——转换为小写的函数
      • strupr函数——转换为大写的函数
    • 6.3.7 字符数组应用举例

6.1 怎样定义和引用一维数组

数组的特点:

  • 数组是一组有序数据的集合。 下标代表数据在数组中的序号。
  • 用一个数组名和下标来唯一确定数组中的元素
  • 数组中的每一个元素都属于同一个数据类型

6.1.1定义一维数组

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

  • (1)数组名的命名规则和变量名相同,遵循标识符命名规则
  • (2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式表示元素的个数,即数组长度。(在引用时则表示的不是个数而是索引,最大值应为元素个数-1,从零算起)
  • (3)常量表达式中可以包括常量符号常量,也可以是这一类的表达式。但不能有变量,且必须是整型表达式
    C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值

6.1.2怎样引用一维数组元素

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

引用数组元素的形式为: 数组名[下标]

数组元素的遍历:通过一个for循环即可实现

   for (i=0;i < L.length;i++)

一维数组的初始化

数组的初始化:定义数组的同时给各数组元素赋值。
初始化的方法4种
“全元赋,部元赋,全赋零,不指全赋”

  • 在定义数组时对全部数组元素赋予初值
    int a[5] = {1,2,3,4,5}
  • 可以只给数组中的一部部分元素赋值
    int a[10] = {1,2,3,4,5}
  • 让一个数组中全部元素值为0
    int a[10] = 0;
  • 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度 int a[] = {1,2,3,4,5}

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

6.2 怎样定义和引用二维数组

二维数组常称为矩阵(matrix),把二维数组写成行(row)和列(column)的排列形式可以形象化的理解二维数组的逻辑结构

6.2.1 怎样定义二维数组

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

C语言中,二维数组中元素排列的顺序是按行存放的。多维数组也是如此。

即在内存中先顺序存放第1行的元素,接着再存放第2行的元素。

6.2.2 怎样引用二维数组的元素

二维数组元素表示形式为: 数组名[下标][下标]

  • 下标必须是整型表达式
  • 引用数组元素时,下标值应在已定义的数组大小的范围内
  • 注意定义数组时的下标和引用数组元素的下标的区别
  • 二维数组元素的遍历:使用嵌套的for循环即可,外循环负责,即第1维;内循环负责,即第2维(外行内列

6.2.3 二维数组的初始化

二维数组的初始化有5种,总结就是第2维的下标不能省 “二维,分行赋;部元赋,又可分行赋;部元赋,1省需分行赋,全元赋,1省2不省;全赋花括号;“

  • (1)分行给二维数组赋初值
    int a[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
  • (2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。
  • (3)可以对部分元素赋初值,也可以对各行中的某个元素赋初值,也可以对某几行元素赋初值
    int a[3][4] = {{1},{2},{5}};
  • (4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省
  • (5)在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值
    int a[][3] ={{3,4,},{1,3,4},{}}

6.3 字符数组

C语言没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。

6.3.1 怎样定义字符数组

用来存放字符数组的数组就是字符数组。在字符数组的一个元素内存放一个字符
定义字符数组的方法与定义数值型数组的方法类似 : char a[3]

6.3.2 初始化字符数组

初始化字符数组4法

  • 最容易理解的方法初始化列表,把各个字符依次付给数组中各元素。
    char a[10] ={'I',' ','a','m',' ',h','a','p','p','y',}; //也合法,因为系统在处理字符串常量存储时,会自动增加一个'\'
    char a[11] ={'I',' ','a','m',' ',h','a','p','p','y','\0'};
  • 定义时可以省略数字长度,如果提供的初值个数与预定的数组长度相同
  • 也可以定义和初始化一个二维字符数组
  • 用字符串常量来使字符数组初始化,此时花括号也可以省略
    char c[] = {"I am happy"}; //注意数组长度为11,而不是10,因为还有一个字符串结束符'\0' char c[] = "I am happy"; //
    使用字符串常量初始化字符数组,和使用单个字符作为字符数组的初值,区别就是前者生成的数组长度比后者多一位,因为前者生成字符数组时,会自动在末尾加一个字符串结束符。

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

和普通数组引用数组元素一样: 数组名[常量表达式]

遍历数组元素: for循环,嵌套的for循环

6.3.4 字符串和字符串结束标志

在C语言中,是将字符串作为字符数组来处理的
实际工作中,往往关注的是字符串的有效长度,而不是字符数组的长度。

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

C系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符
在程序中往往通过检测'\0'的位置来判断字符串是否结束。
在定义字符数组时,保证数组长度始终大于字符串长度

如“C program”共有9个字符,字符串是存放在一维数组中的,在数组中它占10个字节,最后一个字节'\0'是由系统自动加上去的。
'\0'代表ASCII码为0的字符,是一个“空操作符”,不显示,注意和空格字符不同

字6.3.5 符数组的输入输出

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

  • (1)逐个字符输入输出。用格式字符串“%c”输入输出一个字符
  • (2)将整个字符串一次输入或输出。使用格式字符串“%s”输入输出一个字符串
  • 不管怎么样记住在内存中存储字符串一定是由'\0'作为字符串结束标志的

说明:

  • (1)输出的字符中不包括结束符'\0',该字符不显示
  • (2)用“%s“格式字符串输出字符串时,printf函数中的输出表列字符数组名,而不是数组元素名。 printf("%s",array) // 不能是array[0]
  • (3)如果数组长度大于字符串的实际长度,也只能输出到遇'\0'时输出就结束
  • (4)如果一个字符数组中包含一个以上的‘\0’,遇到第一个'\0'时输出就结束
  • (5)可以用scanf函数输入一个字符串scanf("%s",c) //数组名就是地址
    如果利用一个scanf函数输入多个字符串,应在输入时以空格分隔

使用字符串处理函数

C语言编译系统提供的常见9个字符串处理函数
puts函数、gets函数
strlwr函数、strupr函数 strcat函数、
strcmp函数、strlen函数
strcpy函数和strncpy函数

  • (1)puts函数——输出字符串的函数

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

  • 用puts函数输出的字符串中可以包含转义字符。
char str[] = {"China\nBeijing"};
puts(str);
----------
输出:
China
Beijing
  • 在用puts输出时将字符串结束标志'\0'转换成'\n',即输出完字符串后换行
  • (2)gets函数——输入字符串的函数

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

gets(str);  // str是已定义的字符数组
如果从键盘输入
Computer此处按下enter键  
将输入的字符串“Computer”送给字符数组str
(注意这里,**送给数组的共有9个字符,而不是8个字符**),
  返回的函数值是字符数组str的第一个元素的地址。

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

  • (3) strlwr函数
    strlwr(字符串),将字符串中大写字母换成小写字母

  • (4)strupr函数
    strupr(字符串),将字符串中小写字母换成大写字母

  • (5)strcat函数——字符串连接函数
    strcat(字符数组1,字符数组2)
    其作用是把两个字符数组中的字符串连接起来,把字符串2街道字符串1的后面
    结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址

  • 字符数组1必须足够大,以便容纳连接后的字符串。
  • 连接前两个字符串的后面都有'\0',连接时将字符串1后面的'\0'取消,只在新串最后保留'\0'
  • (6)strcmp函数——字符串比较函数
    strcmp(字符串1,字符串2)
    对于两个字符串比较只能使用if (strcmp(str1,str2) > 0)
  • (7) strlen函数——测字符串长度的函数
    strlen(字符数组)
    函数的值为字符串中的实际长度(不包括'\0'在内)
    也可以直接测试字符串常量的长度,即strlen("China");
  • (8)strcpy和strncpy函数——字符串复制函数
    strcpy(字符数组1,字符串2)
  • 字符数组1必须定义得足够大,以便容纳被赋值的字符串2.字符数组1的长度不应小于字符串2的长度
  • “字符数组1“必须写成数组名形式(如str1),"字符串2"可以是字符数组名,也可以一个是字符串常量
  • 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。字符数组名是一个地址常量,它不能改变值,正如数值型数组名不能被赋值一样

下面两种都是错误的
str1 = ”China"; // 试图将一个字符串常量直接赋值给一个字符数组
str1 = str2; // 试图将一个字符数组直接赋值给一个字符数组
只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素

char a[5],c1,c2;
c1 = 'A';c2 = 'B';
a[0] = 'C'; a[1] = 'h'; a[2] = 'i';a[3] = 'n';a[4] = 'a';
  • 可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。

strncpy(str1,str2,2); 作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符。但复制的字符个数n不应多于str1中原有的字符(不包括'\0')

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部