目录
第6章 利用数组处理批量数据
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使用字符串处理函数
(1)数组是一个有序数据的集合;
(2)用一个数组名和下标来维一地确定数组中的元素;
(3)数组中的每一个元素必须是同一类型。
定义一维数组的一般格式:
类型符 变量名 [个数]
例如:int a[10];
注意:例如指定a[10],表示数组a有10个元素,下标由0-9,没有10。
int a[n];是不合法的,C语言不容许对数组的大小做动态的定义。
引用一维数组的一般格式:
变量名[下标];
例如:a[6];
对十个数值进行有小到大排序(起泡法)
起泡法基本思路是:每次将相邻的两数比较,将较小的调到前面。
代码:
#include
int main()
{
int a[10];
int i,j,t;
printf("input 10 numbers :\n");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++) //进行9次循环,实现9趟比较
for(i=0;i<9-j;i++) //在每一趟中进行9-j次比较
if(a[i]>a[i+1]) //相邻两个数比较
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers :\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
结果:
二维数组常称为矩阵(matrix)。把二维数组写成行(row)和列(column)的排列形式,可以有助于形象化地理解二维数组的逻辑结构。
类型说明符 数组名 [常量表达式] [常量表达式];
例如:float pay[3][6];
警告:float a[3, 4], b[5, 10]; //在一对方括号内不能写两个下标
二维数组的存储:用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
数组名[下标] [下标];
“下标”可以是整型常量或整型表达式。
数组元素可以出现在表达式中,也可以被赋值,如:b[1][2]=a[2][3]/2;
(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,6}};
1 0 0 0
5 6 0 0
0 0 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};
有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
int main()
{
int i,j,hang,lie,max;
int a[3][4]={1,2,3,4,6,7,8,9,-10,10,-5,2};
hang=0;
lie=0;
max=a[0][0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]>max)
{
hang=i;
lie=j;
max=a[i][j];
}
}
}
printf("最大为%d,位于:第%d行,第%d列\n",max,hang,lie);
}
C语言中没有字符串类型,也没有字符串变量,字符串是储存在字符数组中的。
例如:
char c[10];
c[0]=‘I’; c[1]=’ ‘;c[2]=‘a’;c[3]=‘m’;c[4]=’ ';c[5]=‘h’;c[6]=‘a’;c[7]=‘p’;c[8]=‘p’;c[9]=‘y’;
对字符数组初始化,最容易理解的方式是用“初始化列表”,把各个字符依次赋给数组中各元素。
char c[10]={′I′,′ ′ ,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′}; //把10个字符依次赋给c[0]~c[9]这10个元素
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即′\0′)。
像普通数组一样。
#include
int main()
{
char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
int i;
for(i=0;i<15;i++)
printf("%c",c[i]);
printf("\n");
return 0;
}
在C语言中,是将字符串作为字符数组来处理的。
在实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的长度。
为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符′\0′作为结束标志。
(1) 逐个字符输入输出。用格式符“%c”输入或输出一个字符。
(2) 将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串(string)的输入输出。
例如:
#include
int main()
{
char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
int i;
for(i=0;i<15;i++)
printf("%c",c[i]);
printf("\n");
return 0;
}
#include
int main()
{
char c[]="China";
printf("%s\n",c);
return 0;
}
注意:
(1) 输出的字符中不包括结束符′\0′。
(2) 用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
(3) 如果数组长度大于字符串的实际长度,也只输出到遇′\0′结束。
(4) 如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。
从键盘输入:
China↙
系统会自动在China后面加一个′\0′结束符。
例如:
char c[6];
scanf("%s",c);
如果利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。
从键盘输入:
How are you? ↙
由于有空格字符分隔,作为3个字符串输入。
例如:
char str1[5],str2[5],str3[5];
scanf("%s%s%s",str1,str2,str3);
从键盘输入:
How are you? ↙
由于系统把空格字符作为输入的字符串之间的分隔符,因此只将空格前的字符″How″送到str中。
char str[13];
scanf("%s",str);
scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名代表该数组第一个元素的地址(或者说数组的起始地址)。
注意:puts函数自动换行
引用:部分图片来源于《C程序设计(第五版)谭浩强 》附带课件。