【笔记】第六章 利用数组处理批量数据
主要内容
掌握一维、二维数组的定义和引用方法、存储结构和初始化方法。
掌握有关一维数组的有关算法。
掌握数组的运算。
6.1 一维数组的定义和引用
6.2 二维数组的定义和引用
6.3 字符数组
6.1 一维数组的定义和引用
1、数组:
是一组具有相同数据类型的数据的有序集合。
1、定义格式:
类型说明符 数组名[常量表达式];
类型说明符 数组名[常量表达式][常量表达式];
常量表达式中可以包括常量和符号常量,但不能包含变量。(没有vector!)
2、一维数组在内存中的存放
(1)数组是一种引用数据类型。
数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。
数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。
与所有引用变量相同的是,引用变量是访问真实对象的根本方式。也就是说,如果我们希望在程序中访问数组,则只能通过这个数组的引用变量来访问它。
实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。
(2)一维数组在内存中的存储示意图:
(3)二维数组中的元素在内存中的存放
排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素…
4、引用方式:
数组名[下标]
数组名[下标][下标]
下标可以是整型常量或整型表达式。
5、一维数组 元素初始化 实现方法:
(1)在定义数组时对数组元素赋以初值。
int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2)可以只给一部分元素赋值。
int a[10]={0,1,2,3,4};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][4]={{1},{5},{9}};
(3)全部元素值为0
int a[10]={0,0,0,0,0,0,0,0, 0,0}; 或 int a[10]={0};
(4)一维数组
在对全部数组元素赋初值时,可以不指定数组长度。
例如: int a[]={1,2,3,4,5};
(5)二维数组
如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
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};
(6)字符数组
除了以上方法外,还有“用字符串常量来使字符数组初始化”
char c[]={″I am happy″};
char c[]=“I am happy″; 它与下面的数组初始化等价
若未进行初始化,则各元素的值不可预料。
系统也可以按照初始化个数,确定数组长度(末尾无空字符)
6、字符数组
(1)字符串结束标志
以字符′\0′作为字符串结束标志。′\0′代表ASCII码为0的字符,不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。
用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
如果有一个字符串,前面9个字符都不是空字符(即′\0′) ,而第10个字符是′\0′,则此字符串的有效字符为9个。
系统对字符串常量也自动加一个′\0′作为结束符。
(2)若初始个数小于长度,则其余元素自动定为'\0'
字符数组并不要求它的最后一个字符为′\0′,甚至可以不包含′\0′。
(3)想用一个新的字符串代替原有的字符串,需要添加′\0′
(4)输入输出:
①逐个字符输入输出。用格式符“%c”输入或输出一个字符。
②将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。
如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。
(5)scanf:遇到空格或者换行暂停输入
不用加地址符&,因为在C语言中数组名代表该数组的起始地址。
正确写法:scanf(″%s″,str);
(6)printf(″%d″,c); 输出数组c的起始地址
7、字符串处理函数
#include <string.h> puts(str)---输出字符串 //与 printf("%s",str); 作用相同 gets(str)---输入字符串 strlen(p) -取字符串长度 strcpy(p, p1)-复制字符串 strncpy(p, p1, n)-复制指定长度字符串 strcat(p, p1)-附加字符串 strncat(p, p1, n)-附加指定长度字符串 //“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是一个字符串常量。如strcpy(str1,″China″); //不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的: //str1=″China″; //str1=str2; strcmp(p, p1)-比较字符串 //如果字符串1=字符串2,函数值为0。 //如果字符串1>字符串2,函数值为一正整数。 strlwr(str)----转换为小写 strupr(str)----转换为大写
其他知识点总结:
(1)
%5d 表示所有数据右对齐,不足五位则空格补全
%-5d 表示右对齐
(2)四大排序
1.冒泡排序
for(j=0;j<n;j++) for(i=0;i<n-j;i++) if (a[i]>a[i+1]) swap(a[i],a[i+1]);