第3章数组与字符申 ·19· 第3章数组与字符串 3.1一维数组 1.数组及其特点 实际处理的数据,往往不仅是一个,而是量大但性质相同的数据。例如,一个班的学生 成绩等等。它们是相同性质的数据。如果仍一个个加以说明,麻烦易错。改用数组,这就方 便多了。例如 int grade [n] 数组是相关变量的有序集合,其中所有的变量具有相同的数据类型。数组的特点: (1)各元素是同一种类型的变量。 (②)各元素按顺序排列,其位置由下标来确定。 (3)各元素可独立地作为一个基本变量被赋值和使用 2. 维数组说明和下标 (1)一维数组说明格式为: 类型说明符数组名[size] 其中,size为数组的大小,即组成该数组元素的个数。 (②)数组的下标 C语言中,数组的下标从0开始,到size一1为止。例如: intx「5 就有下标从0到4共5个元素,即:x[0],x[1],x[4]. 例3.1:产生斐波那契(Fibonacci)数列前16项 /program to generate the first 16 Fibonacci numbers * main( int Fibonacci [16],i: Fibonacci []=0: Fibonacci [1]=1: for(i=2:i<16:i++) Fibonacci [i]=Fibonacci [i-2]+Fibonacci [i-1]: for(i=0:i<16:i++) 执行结果: 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,510
第 3 章 数组与字符串 ·19· 第 3 章 数组与字符串 3.1 一维数组 1.数组及其特点 实际处理的数据,往往不仅是一个,而是量大但性质相同的数据。例如,一个班的学生 成绩等等。它们是相同性质的数据。如果仍一个个加以说明,麻烦易错。改用数组,这就方 便多了。例如: int grade[n]; 数组是相关变量的有序集合,其中所有的变量具有相同的数据类型。数组的特点: (1)各元素是同一种类型的变量。 (2)各元素按顺序排列,其位置由下标来确定。 (3)各元素可独立地作为一个基本变量被赋值和使用。 2.一维数组说明和下标 (1)一维数组说明格式为: 类型说明符 数组名[size] 其中,size 为数组的大小,即组成该数组元素的个数。 (2)数组的下标 C 语言中,数组的下标从 0 开始,到 size-1 为止。例如: int x[5] 就有下标从 0 到 4 共 5 个元素,即:x[0],x[1],.,x[4]。 例 3.1:产生斐波那契(Fibonacci)数列前 16 项 /* program to generate the first 16 Fibonacci numbers */ main() { int Fibonacci[16],i; Fibonacci[0]=0; Fibonacci[1]=1; for(i=2;i<16;i++) Fibonacci[i]=Fibonacci[i-2]+Fibonacci[i-1]; for(i=0;i<16;i++) printf(″%d,″,Fibonacci[i]); printf(″.\n″); } 执行结果: 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,510
·20. C程序设计要点分析与题解 3.2多维数组 多维数组说明格式为 类型说明符 数组名[size1][xize2]· [sizen]: 其中,sizel,size2,.,sizen为数组各维的大小。组成该组元素的总个数应为sizelXsize2 X.Xsizen。 例如: td[1o][20]: 说明这是一 10×2 数组,即 d[o][o]d[o][1]d[o][19] d[1][o]d[1][1]-d[1][19] d[9][o]d[9][1]d[9][19 例3.2将一个二维数组行和列元素互换,存入另一个二维数组里 /6-4*/ main ( static int a[2][3]=({l,2,3,{4,5,6: static int b[3][2],i.i: r printf("array a \n"): /*循环变量作为行坐标*/ for(j0:j=-2:j+) /循环变量作为列坐标* printf("%5d",a[i][j]); bi]fil=afi]ril: /行列互换* printf("\n") printf("array b:\n"): for(i=0:i(=2:i++) *循环变量作为行坐标*/ for(j=0:j<=1;j++) /体循环变量作为列坐标*/ printf(5d°,b[i][jl): printf("\n"):
·20· C 程序设计要点分析与题解 3.2 多维数组 多维数组说明格式为: 类型说明符 数组名[size1][xize2].[sizen]; 其中,size1,size2,.,sizen 为数组各维的大小。组成该组元素的总个数应为 size1×size2 ×.×sizen。 例如: int d[10][20]; 说明这是一个 10×20 二维数组,即: d[0][0]d[0][1].d[0][19] d[1][0]d[1][1].d[1][19] . d[9][0]d[9][1].d[9][19] 例 3.2 将一个二维数组行和列元素互换,存入另一个二维数组里 /*L6-4*/ main () { static int a[2][3]={{1,2,3},{4,5,6}}; static int b[3][2],i,j; printf("array a : \n"); for (i=0;i<=1;i++) /*循环变量作为行坐标*/ { for (j=0;j<=2;j++) /*循环变量作为列坐标*/ { printf("%5d",a[i][j]); b[j][i]=a[i][j]; /*行列互换*/ } printf("\n"); } printf("array b : \n"); for (i=0;i<=2;i++) /*循环变量作为行坐标*/ { for (j=0;j<=1;j++) /*循环变量作为列坐标*/ printf("%5d",b[i][j]); printf("\n"); } }
第3章数组与字符申 ·21· 3.3数组元素初始化 1.数组的初始化 C语言允许在说明时对全局数组和静态数组初始化,即给各个元素赋以初始值,例如: mainO static int counters [5]=(0,1,2,3,4}: static char [5]= 'c,'d','e'】 static int M[4]=i0.5,-3,-7,82,9,0.0.8,-7i2 10,20,1,14,{0,0,8,7,6}: static int x[5]={0,l,2}:/*后面两个默认为0*/ 1 当给出初始值的个数少于数组全部元素个数时,未列出的后若干个初始值默认为0 2.变长数组的初始化 有时,不直接给出数组大小,作为变长数组出现,也照样可以初始化。例如: static int a []=1,2,3,4,5): ststic f1oatf[]=(1.2,2.5,3.8,4.0 static char r word [] 1',1',0',0: static char error []=("read error\n"): 3.4字符串 字符串要用一维字符数组处理,实质上就是以空字符结尾的字符数组。 1.以空字符结尾的字符数组 空字符就是L,即'\0'。一个字符串可看成结尾为'10'的不定长的一维字符数 组。例如: ”a"等同于'a',\0 ”等同于0 ”等同于 "Hello八n"等同于'',e',1',’1',',',n',10 2.字符串常量 字符串常量是由一对双引号包括的除双引号之外的任何字符集合,也可看成一维的字符 数组常量。若要包括双引号必须加反斜线“\”。 3.字符串的初始化 可采用类似于变长数组初始化处理。 (1)变长数组初始化,例如: static int A[]=0,1,2,3,4) (②)字符串初始化,例如:
第 3 章 数组与字符串 ·21· 3.3 数组元素初始化 1.数组的初始化 C 语言允许在说明时对全局数组和静态数组初始化,即给各个元素赋以初始值,例如: main() { static int counters[5]={0,1,2,3,4}; static char letters[5]={′a′,′b′,′′c,′d′,′e′}; static int M[4][5]={{10,5,-3,-17,82},{9,0,0,8,-7}{32, 10,20,1,14},{0,0,8,7,6}}; static int x[5]={0,1,2}; /*后面两个默认为 0*/ . } 当给出初始值的个数少于数组全部元素个数时,未列出的后若干个初始值默认为 0。 2.变长数组的初始化 有时,不直接给出数组大小,作为变长数组出现,也照样可以初始化。例如: static int a[]={1,2,3,4,5}; ststic float f[]={1.2,2.5,3.8,4.0}; static char word[]={′H′,′e′,′1′,′1′,′o′,′ ′,′\0′}; static char error[]={″read error\n″}; 3.4 字符串 字符串要用一维字符数组处理, 实质上就是以空字符结尾的字符数组。 1.以空字符结尾的字符数组 空字符就是 NULL,即′\0′。一个字符串可看成结尾为′\0′的不定长的一维字符数 组。例如: ″a″等同于′a′,′\0′ ″″等同于′\0′ ″ ″等同于′′,′\0′ ″Hello!\n″等同于′H′,′e′,′1′,′1′,′o′,′!′,′\n′,′\0′ 2.字符串常量 字符串常量是由一对双引号包括的除双引号之外的任何字符集合,也可看成一维的字符 数组常量。若要包括双引号必须加反斜线“\”。 3.字符串的初始化 可采用类似于变长数组初始化处理。 (1)变长数组初始化,例如: static int A[]={0,1,2,3,4}; (2)字符串初始化,例如:
·22· C程序设计要点分析与题解 static char x[]=H','e','1','1','0','!','10'}: 由于是字符数组,可以直接用字符数组常量即字符串常量给出初始值,编译器将自动加 入空字符'10 显然,下面这样将更简便些: static char x []={Hello 4.字符串的显示 可用%s的格式显示一个以'0'结尾的字符串。系统显示字符串遇到空格符”0'时, 就结束该字符串的显示。例如: static ("Hello!": bs'\n 此语句的执行结果,将显示: Hello 5.字符串的输入 可用s的格式输入一个字符串。例如: char s1[20] scanf("%s",s1); 注意:·在s1前,不加“&”。 ·输入字符串时,遇到空格或回车则结束。 6.单字符的输入 用scanf0输入字符或字符串时,遇到空格或回车结束。这不便于文字处理,一般用 getchar0函数输入单字符。例如: include <stdio.h> main char ch ch=getchar() 7.转义字符 一些特殊字符,须用反斜线来转义,例如: 10 NUL 退格 回车换行 r 回车不换行 \t 横向制表 纵向制表 单引号 1" 双引号 换页 反斜线 例3.3输出一个钻石图形。 main /体第二维大小不能省略* ,’*, ,*,*1, ’,*1,'米, ’,*,’,’’,'*: int i,i:
·22· C 程序设计要点分析与题解 static char x[]={′H′,′e′,′l′,′l′,′0′,′!′,′\0′}; 由于是字符数组,可以直接用字符数组常量即字符串常量给出初始值,编译器将自动加 入空字符′\0′。显然,下面这样将更简便些; static char x[]={″Hello ″}; 4.字符串的显示 可用%s 的格式显示一个以′\0′结尾的字符串。系统显示字符串遇到空格符′\0′时, 就结束该字符串的显示。例如: static char x[]={″Hello!″}; printf(″%s\n″,x); 此语句的执行结果,将显示: Hello 5.字符串的输入 可用%s 的格式输入一个字符串。例如: char s1[20]; scanf(″%s″,s1); 注意:·在 s1 前,不加“&”。 ·输入字符串时,遇到空格或回车则结束。 6.单字符的输入 用 scanf()输入字符或字符串时,遇到空格或回车结束。这不便于文字处理,一般用 getchar()函数输入单字符。例如: #include <stdio.h> main { char ch; ch=getchar(); } 7.转义字符 一些特殊字符,须用反斜线来转义,例如: \0 NUL \b 退格 \n 回车换行 \r 回车不换行 \t 横向制表 \v 纵向制表 \′ 单引号 \″ 双引号 \f 换页 \\ 反斜线 例 3.3 输出一个钻石图形。 main () {static char diamond[ ][5]= /*第二维大小不能省略*/ {{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}}; int i,j;
第3章数组与字符串 ·23· for(i=0:i<5:i++) /*逐行*/ for (j-0:j5;j++) /*逐列* printf("%c",diamond[i][j]): printf("\n"); 1 运行结果: 米 例3.4统计输入的一段文字有多少个单词。 /*“L6-8*/ #include "stdio.h 00 char string[81]: int i,num=0,word=0; char c gets(string):/体输入一段文字到一维数组string/ for (i=0:(c=string[i])!=\O':i++) if(c=’)/*c为空格,没出现单词* word=0; else if(sord=0)/体c不为空格,但上次c为空格,出现单词/ word=1; numt+; /单词数累加*/ printf("There are %d words in the line\n',num); } 3.5字符串函数 一般C语言编译器都提供了字符串函数,放在文件string.h中,要使用字符串函数必须 加有包含文件string.h,即写成: #include <string.h>
第 3 章 数组与字符串 ·23· for (i=0;i<5;i++) /* 逐行 */ { for (j=0;j<5;j++) /*逐列*/ printf("%c",diamond[i][j]); printf("\n"); } } 运行结果: * * * * * * * * 例 3.4 统计输入的一段文字有多少个单词。 /*“L6-8 */ #include "stdio.h" main () { char string[81]; int i,num=0,word=0; char c; gets(string); /* 输入一段文字到一维数组 string */ for (i=0;(c=string[i])!='\0';i++) if (c==' ') /* c 为空格,没出现单词*/ word=0; else if (word==0) /* c 不为空格,但上次 c 为空格,出现单词 */ { word=1; num++; /*单词数累加*/ } printf("There are %d words in the line\n", num); } 3.5 字符串函数 一般 C 语言编译器都提供了字符串函数,放在文件 string.h 中,要使用字符串函数必须 加有包含文件 string.h,即写成: #include <string.h>