版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第6 6章数组章数组 6.1 6.1 一维数组一维数组 6.2 6.2 二维数组二维数组 6.3 6.3 字符数组与字符串字符数组与字符串 编写程序时经常会碰到需要存储大量数据的情况,例如,编写程序时经常会碰到需要存储大量数据的情况,例如,某个班有某个班有3030名学生,要求输入名学生,要求输入3030个学生的考试成绩并计算平均个学生的考试成绩并计算平均成绩,找出有多少个学生的成绩高于平均成绩。程序需要先输成绩,找出有多少个学生的成绩高于平均成绩。程序需要先输入这些数据并存储起来,计算平均值后,然后用每个成绩与平入这些数据并存储起来,计算平均值后,然后用每个成绩与平均值比较,统计大于平均值
2、的数的个数。如果直接使用前面的均值比较,统计大于平均值的数的个数。如果直接使用前面的知识,那么需要定义知识,那么需要定义3030个变量。从实际角度出发,这是不可行个变量。从实际角度出发,这是不可行的,所以需要有一种好的方式去管理和存储大量数据。的,所以需要有一种好的方式去管理和存储大量数据。 包括包括C C语言在内的高级语言都提供称为数组来存储大量数语言在内的高级语言都提供称为数组来存储大量数据。据。 一维数组是数组中最简单的,只需要数组名与一个下标就一维数组是数组中最简单的,只需要数组名与一个下标就能唯一地确定数组元素。定义一维数组时需要说明:数组名、能唯一地确定数组元素。定义一维数组时需要
3、说明:数组名、数组元素的类型和数组元素的个数。其一般形式如下:数组元素的类型和数组元素的个数。其一般形式如下:数据类型说明符数据类型说明符 数组名数组名 整型表达式整型表达式;说明:说明:(1) (1) 数据类型说明符指定了数组中存放数据的数据类型。数据类型说明符指定了数组中存放数据的数据类型。(2) (2) 数组名的命名规则与变量名相同,遵循标识符命名规则。数组名的命名规则与变量名相同,遵循标识符命名规则。(3) (3) 数组名后面方括号中说明了数组可以存放的元素的个数,数组名后面方括号中说明了数组可以存放的元素的个数,通常是整型常量表达式。部分编译器也允许整型变量,但要求通常是整型常量表达
4、式。部分编译器也允许整型变量,但要求变量有确定的值。变量有确定的值。(4) (4) 数组定义后,其下标范围也就确定了。起始下标是数组定义后,其下标范围也就确定了。起始下标是0 0,最,最大下标是数组元素个数减大下标是数组元素个数减1 1。一维数组的存储一维数组的存储例如语句:例如语句:intint a10; a10;定义了一个数组名为定义了一个数组名为a a的数组,其中可以存放的数组,其中可以存放1010个个intint类型数据。类型数据。通过定义,在内存中分配了一段连续的内容空间,这段内存空通过定义,在内存中分配了一段连续的内容空间,这段内存空间的起始地址存放在数组名中,内存空间有间的起始地
5、址存放在数组名中,内存空间有1010个存储单元,每个存储单元,每个存储单元可以存放个存储单元可以存放1 1个个intint类型数据,该数组的下标范围是从类型数据,该数组的下标范围是从0 0到到9 9。一维数组的引用一维数组的引用定义一维数组后就可以在程序中使用。定义一维数组后就可以在程序中使用。C C语言规定:只能引用语言规定:只能引用数组的元素而不能一次引用整个数组和全部元素。数组的元素而不能一次引用整个数组和全部元素。引用数组元素的一般形式如下:引用数组元素的一般形式如下:数组名数组名 下标下标 说明:说明:(1) (1) 下标是整型表达式,如果是浮点数,则系统自动去掉小数下标是整型表达式
6、,如果是浮点数,则系统自动去掉小数部分。部分。(2) (2) 下标必须在合法的范围之内,即在下标必须在合法的范围之内,即在0 0到元素个数减到元素个数减1 1之间。之间。如果下标超出了合法范围,称为下标越界,有可能会导致程序如果下标超出了合法范围,称为下标越界,有可能会导致程序运行过程中发生错误。运行过程中发生错误。(3) (3) 一个数组元素的使用方式与同类型的简单变量相同。一个数组元素的使用方式与同类型的简单变量相同。例例6-16-1:从键盘输入:从键盘输入1010个整数存放到数组中,然后将该数组中元个整数存放到数组中,然后将该数组中元素进行逆序排列,最后输出数组的全部数据。素进行逆序排列
7、,最后输出数组的全部数据。思路分析:在程序定义一个能够存放思路分析:在程序定义一个能够存放1010个整数的数组,使用循个整数的数组,使用循环语句依次输入每一个元素。对数组元素进行逆序可以对数组环语句依次输入每一个元素。对数组元素进行逆序可以对数组的前一半元素进行循环,每次将第的前一半元素进行循环,每次将第i i个元素与其对应的第个元素与其对应的第9-i9-i个个元素进行交换。最后再使用循环语句依次输出所有元素。元素进行交换。最后再使用循环语句依次输出所有元素。 #include #include #define N 10 / #define N 10 /数组元素的个数数组元素的个数 intin
8、t main() main() intint i i, temp;, temp; intint aN; / aN; /定义数组定义数组 for(for(i i=0; =0; i iN; N; i i+) /+) /循环输入循环输入N N个整数个整数 scanfscanf(%d, &a(%d, &ai i); /); /输入第输入第i i个元素个元素 for( for(i i=0; =0; i i=(N-1)/2; =(N-1)/2; i i+) /+) /循环进行交换循环进行交换 temp = a temp = ai i; a ai i = aN-1-i; = aN-1-i;
9、aN-1-i = temp; aN-1-i = temp; for( for(i i=0; =0; i iN; N; i i+) /+) /循环输入循环输入N N个整数个整数 printfprintf(%d , a(%d , ai i); /); /输出第输出第i i个元素个元素 return 0; return 0; 1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 110 9 8 7 6 5 4 3 2 1一维数组的初始化一维数组的初始化定义数组的同时可以给数组的各个元素赋值,称为数组的初始定义数组的同时可以给数组的各个
10、元素赋值,称为数组的初始化。对一维数组进行初始化可以有以下几种形式。化。对一维数组进行初始化可以有以下几种形式。(1) (1) 在定义数组时,为数组全部元素赋予初值。例如:在定义数组时,为数组全部元素赋予初值。例如:intint a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;(2) (2) 定义数组时,可以给数组的部分元素赋值。例如:定义数组时,可以给数组的部分元素赋值。例如:intint a10 = 1, 2, 3, 4, 5; a10 = 1, 2, 3, 4, 5;(3) (3) 对数组的
11、全部元素赋初值时,可以省略数组定义中的数组对数组的全部元素赋初值时,可以省略数组定义中的数组长度。例如:长度。例如:intint a = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; a = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;例例6-26-2:使用数组存放:使用数组存放FibonacciFibonacci数列的前数列的前2020项,输出时每行输项,输出时每行输出出5 5个数。个数。思路分析:使用数组来存储处理思路分析:使用数组来存储处理FibonacciFibonacci数列,在概念上要更数列,在概念上要更加简洁和清晰,计算过程也更加容易理解。首先定义
12、一个可以加简洁和清晰,计算过程也更加容易理解。首先定义一个可以存放存放2020个整数的数组,令该数组的前个整数的数组,令该数组的前2 2个元素值为个元素值为1 1,然后循环,然后循环计算后面的每个数就可以了。计算后面的每个数就可以了。 #include #include intint main() main() intint i i; ; intint fib20 = 1, 1; / fib20 = 1, 1; /定义数组并初始化前定义数组并初始化前2 2项项 for(for(i i=2; =2; i i20; 20; i i+) /+) /循环计算数列的每循环计算数列的每1 1项项 fib
13、fibi i = fibi-2+fibi-1; = fibi-2+fibi-1; for( for(i i=0; =0; i i20; 20; i i+) /+) /循环输出数列的每循环输出数列的每1 1项项 printfprintf(%6d , fib(%6d , fibi i);); if(i+1)%5 = 0) if(i+1)%5 = 0) printfprintf(n);(n); return 0; return 0; 1 1 2 3 5 1 1 2 3 5 8 13 21 34 55 8 13 21 34 55 89 144 233 377 610 89 144 233 377 61
14、0 987 1597 2584 4181 6765 987 1597 2584 4181 6765例例6-36-3:从键盘输入:从键盘输入1010个整数,统计其中最大值出现次数。个整数,统计其中最大值出现次数。思路分析:解决该问题首先要从键盘上输入多个数据并存储到思路分析:解决该问题首先要从键盘上输入多个数据并存储到数组中。接下来需要解决两个问题,第一是要找到数组中的最数组中。接下来需要解决两个问题,第一是要找到数组中的最大值是什么;第二是统计该最大值共出现了多少次。大值是什么;第二是统计该最大值共出现了多少次。查找一个数组中的最大值时,通常先假设下标为查找一个数组中的最大值时,通常先假设下标
15、为0 0的元素是最大的元素是最大值,然后循环依次比较每个元素与最大值的关系,如果当前元值,然后循环依次比较每个元素与最大值的关系,如果当前元素的值更大,把最大值更新为当前数组元素。循环结束后,就素的值更大,把最大值更新为当前数组元素。循环结束后,就得到了数组的最大值。寻找数组的最小值的方法是类似的。得到了数组的最大值。寻找数组的最小值的方法是类似的。统计在数组中与变量统计在数组中与变量valuevalue的值相同的元素的个数,从下标为的值相同的元素的个数,从下标为0 0数组元素开始循环,依次比较每个元素是否与数组元素开始循环,依次比较每个元素是否与valuevalue相等,每找相等,每找到一个
16、相同的元素,计数变量就增加到一个相同的元素,计数变量就增加1 1。 #include #include intint main() main() intint i i, max, count;, max, count; intint a10; a10; for( for(i i=0; =0; i i10; 10; i i+)+) scanfscanf(%d, &a(%d, &ai i);); max=a0; / max=a0; /设设a0a0是当前最大值是当前最大值 for(for(i i=1; =1; i i10; max)max) max=a max=ai i; /; /如
17、果如果aai i 比比maxmax大,则大,则aai i 为当前最大值为当前最大值 count=0; / count=0; /最大值出现次数初始为最大值出现次数初始为0 0 for( for(i i=0; =0; i i10; 10; i i+)+) if(a if(ai i=max)=max) count+; / count+; /找到一个与找到一个与maxmax相同的值,计数加相同的值,计数加1 1 printfprintf(max=%d, count=%dn, max, count);(max=%d, count=%dn, max, count); return 0; return 0;
18、 23 4 43 8 19 43 28 17 22 4323 4 43 8 19 43 28 17 22 43 max=43, count=3max=43, count=3例例6-46-4:从键盘输入:从键盘输入1010个整数,使用冒泡法对这个整数,使用冒泡法对这1010个整数进行从个整数进行从小到大的排序。小到大的排序。思路分析:冒泡排序是一种比较简单的排序算法,对思路分析:冒泡排序是一种比较简单的排序算法,对n n个数进行个数进行升序排序,需要进行升序排序,需要进行n-1n-1趟比较和交换,排序的基本过程如下。趟比较和交换,排序的基本过程如下。第第1 1趟需要进行趟需要进行n-1n-1次比
19、较,依次对第次比较,依次对第1 1和第和第2 2个、第个、第2 2和第和第3 3个、个、第、第n-1n-1和第和第n n个比较,如果有不满足从小到大的就交换,个比较,如果有不满足从小到大的就交换,第第1 1趟完成后最大的数放到末尾;趟完成后最大的数放到末尾;第第2 2趟需要进行趟需要进行n-2n-2次比较,依次对第次比较,依次对第1 1和第和第2 2个、第个、第2 2和第和第3 3个、个、第、第n-2n-2和第和第n-1n-1个比较,如果有不满足从小到大的就交个比较,如果有不满足从小到大的就交换,第换,第2 2趟完成后第趟完成后第2 2大的数放到倒数第大的数放到倒数第2 2位;位;依次类推,第
20、依次类推,第n-1n-1趟就只需比较第趟就只需比较第1 1和第和第2 2个数个数1 1次。次。第第1 1趟:趟:第第1 1次判断:次判断:9 49 4 6 3 1 6 3 1 交换交换第第2 2次判断:次判断:4 4 9 69 6 3 1 3 1 交换交换第第3 3次判断:次判断:4 6 4 6 9 39 3 1 1 交换交换第第4 4次判断:次判断:4 6 3 4 6 3 9 19 1 交换交换第第1 1趟结果:趟结果:4 6 3 1 9 4 6 3 1 9 第第3 3趟:趟:第第1 1次判断:次判断:4 34 3 1 6 9 1 6 9 交换交换第第2 2次判断:次判断:3 3 4 14
21、1 6 9 6 9 交换交换第第3 3趟结果:趟结果:3 1 4 6 9 3 1 4 6 9 第第2 2趟:趟:第第1 1次判断:次判断:4 64 6 3 1 9 3 1 9 不交换不交换第第2 2次判断:次判断:4 4 6 36 3 1 9 1 9 交换交换第第3 3次判断:次判断:4 3 4 3 6 16 1 9 9 交换交换第第2 2趟结果:趟结果:4 3 1 6 9 4 3 1 6 9 第第4 4趟:趟: 第第1 1次判断:次判断:3 13 1 4 6 9 4 6 9 交换交换 第第4 4趟结果:趟结果:1 3 4 6 9 1 3 4 6 9 #include #include #de
22、fine N 10 / #define N 10 /参加排序的数据的个数参加排序的数据的个数 intint main() main() intint i i, j, temp;, j, temp; intint aN; aN; for( for(i i=0; =0; i iN; N; i i+)+) scanfscanf(%d, &a(%d, &ai i);); for( for(i i=0; =0; i iN-1; N-1; i i+) /+) /排序的趟排序的趟 for(j=0; jN-1-i; j+) / for(j=0; jaj+1) / if(ajaj+1) /如果相
23、邻数据不是升序如果相邻数据不是升序, , 则交换则交换 temp = aj; temp = aj; aj = aj+1; aj = aj+1; aj+1 = temp; aj+1 = temp; for( for(i i=0; =0; i iN; N; i i+)+) printfprintf(%d , a(%d , ai i);); return 0; return 0; 10 9 8 7 6 5 4 3 2 110 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 10 二维数组可以存储具有二维关系的相同类型大量数据。二二维数组
24、可以存储具有二维关系的相同类型大量数据。二维数组在使用时需要两个下标才能确定数组的元素,其定义的维数组在使用时需要两个下标才能确定数组的元素,其定义的一般形式如下:一般形式如下:数据类型说明符数据类型说明符 数组名数组名 整型表达式整型表达式整型表达式整型表达式;(1) (1) 数据类型说明符与数组名的定义与使用方式与一维数组类数据类型说明符与数组名的定义与使用方式与一维数组类似。似。(2) (2) 数组名后面的两个方括号中,第一个方括号说明二维数组数组名后面的两个方括号中,第一个方括号说明二维数组的行数,第二个方括号说明二维数组的列数。的行数,第二个方括号说明二维数组的列数。 (3) (3)
25、 二维数组的下标范围确定与一维数组类似,行下标和列下二维数组的下标范围确定与一维数组类似,行下标和列下标起始都是标起始都是0 0,最大下标是分别是行数减,最大下标是分别是行数减1 1和列数减和列数减1 1。例如:例如:intint a32; a32;定义的数组定义的数组a a是一个是一个3 3行行2 2列的列的intint型二维数组,一共存放型二维数组,一共存放6 6个元个元素。二维数组的逻辑结构示意图如图素。二维数组的逻辑结构示意图如图6-36-3所示,该数组行下标所示,该数组行下标范围是范围是0 0到到2 2,列下标范围是,列下标范围是0 0到到1 1。二维数组在内存中的实际存放时,数组元
26、素的排列是按照二维数组在内存中的实际存放时,数组元素的排列是按照“行行优先原则优先原则”存放的,即在内存中先按顺序存放第存放的,即在内存中先按顺序存放第0 0行的元素,行的元素,接着再存放第接着再存放第1 1行的元素,这样依次存放行的元素,这样依次存放第第0 0列列第第1 1列列第第0 0行行a00a00a01a01第第1 1行行a10a10a11a11第第2 2行行a20a20a21a21二维数组的引用二维数组的引用二维数组同样只能引用数组的元素而不能一次引用整个数组和二维数组同样只能引用数组的元素而不能一次引用整个数组和全部元素。引用二维数组元素的一般形式如下:全部元素。引用二维数组元素的
27、一般形式如下:数组名数组名 下标下标下标下标 说明:引用二维数组元素时,下标的数据类型、取值范围的规说明:引用二维数组元素时,下标的数据类型、取值范围的规则与一维数组相同。需要注意的是引用一个二维数组元素需要则与一维数组相同。需要注意的是引用一个二维数组元素需要同时使用行和列两个下标。同时使用行和列两个下标。例例6-56-5:从键盘输入:从键盘输入2 2行行3 3列的整型矩阵列的整型矩阵a a,将其转置后存入,将其转置后存入3 3行行2 2列的矩阵列的矩阵b b,输出矩阵,输出矩阵b b。思路分析:矩阵的转置操作是将存放矩阵的二维数组中元素的思路分析:矩阵的转置操作是将存放矩阵的二维数组中元素
28、的行和列进行互换,因此数组行和列进行互换,因此数组a a的行数等于的行数等于b b的列数,的列数,a a的列数等于的列数等于b b的行数。在对二维数组进行操作时,通常使用循环的双重嵌套的行数。在对二维数组进行操作时,通常使用循环的双重嵌套来处理数组的元素。来处理数组的元素。 #include #include intint main() main() intint a23, b32; a23, b32; intint i i, j;, j; printfprintf(Input matrix a:n);(Input matrix a:n); for( for(i i=0; =0; i i2;
29、2; i i+)+) for(j=0; j3; j+) for(j=0; j3; j+) scanfscanf(%d, &a(%d, &ai ij); /j); /输入数组输入数组a a的一个元素的一个元素 for( for(i i=0; =0; i i2; 2; i i+)+) for(j=0; j3; j+) for(j=0; j3; j+) bj bji i = a = ai ij;j; printfprintf(Matrix b:n);(Matrix b:n); for( for(i i=0; =0; i i3; 3; i i+)+) for(j=0; j2; j+)
30、for(j=0; j2; j+) printfprintf(%5d , b(%5d , bi ij); /j); /输出数组输出数组b b的一个元素的一个元素 printfprintf(n);(n); return 0; return 0; Input matrix a:Input matrix a:1 2 31 2 3 4 5 64 5 6 Matrix b:Matrix b: 1 4 1 4 2 5 2 5 3 6 3 6二维数组的初始化二维数组的初始化二维数组进行初始化可以有以下几种形式。二维数组进行初始化可以有以下几种形式。(1) (1) 分行对二维数组的全部元素进行初始化。例如:分行
31、对二维数组的全部元素进行初始化。例如:intint a32 = 1, 2, 3, 4, 5, 6; a32 = 1, 2, 3, 4, 5, 6;(2) (2) 也可以将初始化的所有数据写在一个花括号中,按数组元也可以将初始化的所有数据写在一个花括号中,按数组元素在内存中的排列顺序进行初始化。例如上面的初始化也可以素在内存中的排列顺序进行初始化。例如上面的初始化也可以写成如下形式。写成如下形式。intint a32 = 1, 2, 3, 4, 5, 6; a32 = 1, 2, 3, 4, 5, 6;(3) (3) 可以对二维数组的部分元素进行初始化。例如:可以对二维数组的部分元素进行初始化。
32、例如:intint a32 = 1, 0, 3, 5; a32 = 1, 0, 3, 5;(4) (4) 对二维数组的全部元素进行初始化时,可以省略数组第一对二维数组的全部元素进行初始化时,可以省略数组第一维的长度,但是第维的长度,但是第2 2维的长度不能省略。例如:维的长度不能省略。例如:intint a2 = 1, 2, 3, 4, 5, 6; a2 = 1, 2, 3, 4, 5, 6;inta2或或inta例例6-66-6:给定一个:给定一个3 3行行4 4列的整型数组列的整型数组a a,编写程序找出其中最小,编写程序找出其中最小的元素的值,以及它所在的位置。的元素的值,以及它所在的位
33、置。例如:例如:a3a34 = 1, 2, 3, 4, 9, 8, 10, 2, -10, 6, 5, 2;4 = 1, 2, 3, 4, 9, 8, 10, 2, -10, 6, 5, 2;思路分析:在二维数组中找最小值的方法与在一维数组是相似思路分析:在二维数组中找最小值的方法与在一维数组是相似的,同样也是先假设数组的第的,同样也是先假设数组的第1 1个元素个元素a00a00的值最小,然后的值最小,然后依次把二维数组中的所有元素与它进行比较,如果找到比当前依次把二维数组中的所有元素与它进行比较,如果找到比当前最小值还小的元素,则更新最小值和相应的下标值。对二维数最小值还小的元素,则更新最小
34、值和相应的下标值。对二维数组进行操作时,注意使用循环嵌套。组进行操作时,注意使用循环嵌套。 #include #include intint main() main() intint a34 = 1, 2, 3, 4, 9, 8, 10, 2, -10, 6, 5, 2; a34 = 1, 2, 3, 4, 9, 8, 10, 2, -10, 6, 5, 2; intint i i, j, row, col, min; /min, row, col, j, row, col, min; /min, row, col分别表示最小值及下标分别表示最小值及下标 row = col = 0; /row
35、 = col = 0; /设设a00a00为当前最小值为当前最小值 min = arowcol;min = arowcol; for( for(i i=0; =0; i i3; 3; i i+)+) for(j=0; j4; j+) for(j=0; j4; j+) if(a if(ai ijmin) /jmin) /找到比找到比minmin小的元素小的元素 row = row = i i; ; col = j; col = j; min = arowcol; min = arowcol; printfprintf(min=%(min=%d,rowd,row=%=%d,cold,col=%dn
36、, min, row, col);=%dn, min, row, col); return 0; return 0; min=-10,row=2,col=0min=-10,row=2,col=0例例6-76-7:生成杨辉三角的前:生成杨辉三角的前1010行并存放到二维数组中,然后输出杨辉三角。行并存放到二维数组中,然后输出杨辉三角。杨辉三角是按照如下规律排列的数据:杨辉三角是按照如下规律排列的数据:1 11 11 11 2 11 2 11 3 3 11 3 3 11 4 6 4 11 4 6 4 11 5 10 1 5 10 1010 5 1 5 1思路分析:首先通过观察可以知道,杨辉三角的第
37、思路分析:首先通过观察可以知道,杨辉三角的第n n行共有行共有n n个整数,个整数,因此如果要存放前因此如果要存放前1010行的杨辉三角,需要定义一个行的杨辉三角,需要定义一个1010行行1010列的二维数列的二维数组,例如杨辉数组取名为组,例如杨辉数组取名为yhyh。生成杨辉三角所有数据的过程实际是向二维数组中填写整数的过程。生成杨辉三角所有数据的过程实际是向二维数组中填写整数的过程。可以很容易发现,程序中需要填写的数组元素可以很容易发现,程序中需要填写的数组元素yhijyhij 的下标满足的下标满足j=ij=i,即只需要填写二维数组左下方这一半的数据。接着分析填入数,即只需要填写二维数组左
38、下方这一半的数据。接着分析填入数据的规律可以发现当列下标据的规律可以发现当列下标j j等于等于0 0或或i i时,时,yhijyhij 需要填写需要填写1 1;其他;其他情况下,情况下,yhijyhij 是是yhi-1j-1yhi-1j-1与与yhi-1jyhi-1j的和。的和。 #include #include #define N 10 #define N 10 intint main() main() intint yhyh1010;1010; intint i i, j;, j; / /下面的双层循环填写杨辉三角下面的双层循环填写杨辉三角 for(for(i i=0; =0; i iN
39、; N; i i+)+) for(j=0; j= for(j=0; j=i i; j+); j+) if(j=0 | j= if(j=0 | j=i i) ) yhyh i ij = 1;j = 1; else else yhyh i ij = j = yhyhi-1j-1+i-1j-1+yhyhi-1j;i-1j; / /下面输出杨辉三角下面输出杨辉三角 for(for(i i=0; =0; i iN; N; i i+)+) for(j=0; j= for(j=0; j=i i; j+); j+) printfprintf(%4d , (%4d , yhyh i ij);j); printf
40、printf(n);(n); return 0; return 0; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1例例6-86-8:计算:计算2 2行行3 3列的矩阵列的矩阵a a与一个与一个3 3行行4 4列的矩阵列的矩阵b b的乘积,存放的乘积,存放到到2 2行行4 4列的矩阵列的矩阵c c中。中。intint a23 = 1, 2, 3, 4, 5, 6; a23 = 1,
41、 2, 3, 4, 5, 6;intint b34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 3; b34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 3;思路分析:根据数学知识,两个矩阵进行乘法运算时,要求第思路分析:根据数学知识,两个矩阵进行乘法运算时,要求第1 1个矩阵的列数等于第个矩阵的列数等于第2 2个矩阵的行数,结果矩阵的行数等于第个矩阵的行数,结果矩阵的行数等于第1 1个矩阵的行数,列数等于第个矩阵的行数,列数等于第2 2个矩阵的列数。个矩阵的列数。具体的计算方法是第具体的计算方法是第1 1个矩阵的第个矩阵的第i i行与第行与
42、第2 2个矩阵的第个矩阵的第j j列的对列的对应元素的乘积之和是结果矩阵的元素应元素的乘积之和是结果矩阵的元素cijcij 。因此该程序中需。因此该程序中需要要3 3层的循环嵌套。层的循环嵌套。 #include #include intint main() main() intint a23 = 1, 2, 3, 4, 5, 6; a23 = 1, 2, 3, 4, 5, 6; intint b34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 3; b34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 3; intint c24; / c24
43、; /结果矩阵的行数等于结果矩阵的行数等于a a矩阵行数,列数等于矩阵行数,列数等于b b矩阵的列数矩阵的列数 intint i i, j, k;, j, k; / /下面循环嵌套计算下面循环嵌套计算a a* *b, b, 存入存入c c for( for(i i=0; =0; i i2; 2; i i+) /+) /i i表示表示a a和和c c的行的行 for(j=0; j4; j+) / for(j=0; j4; j+) /i i表示表示b b和和c c的列的列 c ci ij = 0;j = 0; for(k=0; k3; k+) /k for(k=0; k3; k+) /k表示表示a
44、 a的列和的列和b b的行的行 c ci ij = cj = ci ij + aj + ai ikk* *bkj; /bkj; /累加求和累加求和 printfprintf(Matrix a:n);(Matrix a:n); for( for(i i=0; =0; i i2; 2; i i+)+) for(j=0; j3; j+) for(j=0; j3; j+) printfprintf(%4d , a(%4d , ai ij);j); printfprintf(n);(n); printfprintf(Matrix b:n);(Matrix b:n); for( for(i i=0; =0
45、; i i3; 3; i i+)+) for(j=0; j4; j+) for(j=0; j4; j+) printfprintf(%4d , b(%4d , bi ij);j); printfprintf(n);(n); printfprintf(Matrix c:n);(Matrix c:n); for( for(i i=0; =0; i i2; 2; i i+)+) for(j=0; j4; j+) for(j=0; j4; j+) printfprintf(%4d , c(%4d , ci ij);j); printfprintf(n);(n); return 0; return 0;
46、 Matrix a: 1 2 3 4 5 6Matrix b: 1 2 3 4 5 6 7 8 9 5 4 3Matrix c: 38 29 29 29 83 68 71 74 C C语言中没有专门的字符串类型,使用字符数组来表示和语言中没有专门的字符串类型,使用字符数组来表示和存储字符串。存储字符串。 一维字符数组和二维字符数组定义的一般形式如下:一维字符数组和二维字符数组定义的一般形式如下:char char 数组名数组名 整型表达式整型表达式;char char 数组名数组名 整型表达式整型表达式整型表达式整型表达式;例如:例如:char c10;char c10;char d520;c
47、har d520;字符数组的初始化和引用字符数组的初始化和引用(1) (1) 初始化字符数组所有元素,例如:初始化字符数组所有元素,例如:char message5 = H, e, l, l, o;char message5 = H, e, l, l, o;(2) (2) 初始化字符数组的部分元素,例如:初始化字符数组的部分元素,例如:char message10 = H, e, l, l, o;char message10 = H, e, l, l, o;(3) (3) 当花括号中的初始值个数与数组长度相同时,可以省略定当花括号中的初始值个数与数组长度相同时,可以省略定义中的数组长度,例如:
48、义中的数组长度,例如:char message = H, e, l, l, o;char message = H, e, l, l, o;字符数组的引用字符数组的引用与其他类型数组一样,字符数组也可以使用如下形式引用数组与其他类型数组一样,字符数组也可以使用如下形式引用数组中的一个元素。中的一个元素。数组名数组名 下标下标 例例6-96-9:在一维数组中存放一串字符并进行输出。:在一维数组中存放一串字符并进行输出。 #include #include intint main() main() char char msgmsg = = W,e,l,c,o,m,eW,e,l,c,o,m,e, ,
49、,t,ot,o, ,C;, ,C; intint i i; ; for( for(i i=0; =0; i i12; 12; i i+)+) putcharputchar( (msgmsg i i);); putcharputchar(n);(n); return 0; return 0; Welcome to CWelcome to C字符串的存储字符串的存储C C语言中没有专门的字符串类型及相应的变量,使用字符数组语言中没有专门的字符串类型及相应的变量,使用字符数组来存放字符串。来存放字符串。在第在第2.3.42.3.4节字符串常量的介绍中提到,节字符串常量的介绍中提到,C C语言在字符串
50、常量的语言在字符串常量的后面自动加上一个后面自动加上一个00作为字符串的结束标记。同样,在使用作为字符串的结束标记。同样,在使用字符数组存放字符串时,也需要在字符串的后面加上这个结束字符数组存放字符串时,也需要在字符串的后面加上这个结束标记,因此存放字符串的字符数组的长度至少要比其存放的字标记,因此存放字符串的字符数组的长度至少要比其存放的字符串的长度大符串的长度大1 1。定义字符数组存放字符串时,可以使用如下两种初始化方式:定义字符数组存放字符串时,可以使用如下两种初始化方式:char char msgmsg = hello; = hello;char char msgmsg = hello
51、; = hello;字符串的输入方式字符串的输入方式(1) (1) 在循环语句中使用在循环语句中使用scanfscanf函数的函数的“%c”%c”格式控制字符逐个输入字符。例如格式控制字符逐个输入字符。例如下面的代码从键盘上输入一个长度为下面的代码从键盘上输入一个长度为1010的字符串,存放到字符数组的字符串,存放到字符数组msgmsg中。中。char msg80;char msg80;for(ifor(i=0; i10; i+) =0; i 0) 0) printf(Chinaprintf(China Chinesen); Chinesen);else else if(flagif(flag
52、 0) 0) printf(Chinaprintf(China Chinesen); Chinesen);else else printf(Chinaprintf(China = Chinesen); = Chinesen);运行上述代码的输出结果是:运行上述代码的输出结果是:China ChineseChina Chinese4. 4. 计算字符串长度函数计算字符串长度函数strlenstrlen函数调用的一般形式:函数调用的一般形式:strlenstrlen( (字符串字符串) )其作用是计算字符串的长度,结果以函数值的形式得到。字符其作用是计算字符串的长度,结果以函数值的形式得到。字符串
53、的长度是字符串中字符的个数,串的长度是字符串中字符的个数,不包括字符串结束标记不包括字符串结束标记00在内。可以计算字符串常量和字符数组中字符串的长度,例如:在内。可以计算字符串常量和字符数组中字符串的长度,例如:char str130 = China;char str130 = China;printf(%dnprintf(%dn, strlen(str1);, strlen(str1);printf(%dnprintf(%dn, , strlen(Chinesestrlen(Chinese););5. 5. 字符串大小写转换函数字符串大小写转换函数strlwrstrlwr和和struprs
54、truprstrlwrstrlwr函数和函数和struprstrupr函数调用的一般形式:函数调用的一般形式:strlwrstrlwr( (字符数组名字符数组名) )struprstrupr( (字符数组名字符数组名) )strlwrstrlwr函数的作用是将字符串中的所有大写字母转换成对应的函数的作用是将字符串中的所有大写字母转换成对应的小写字母。小写字母。struprstrupr函数的作用是将字符串中的所有小写字母转函数的作用是将字符串中的所有小写字母转换成对应的大写字母。换成对应的大写字母。例例6-106-10:从键盘输出一个字符串,不使用:从键盘输出一个字符串,不使用strlenstr
55、len函数,计算并函数,计算并输出该字符串的长度。输出该字符串的长度。思路分析:计算字符串的长度实际上就是统计一个字符串中共思路分析:计算字符串的长度实际上就是统计一个字符串中共有多少个字符,是一个典型的计数问题。这类问题使用循环结有多少个字符,是一个典型的计数问题。这类问题使用循环结构来实现,从字符串的第构来实现,从字符串的第1 1个字符开始计数,当碰到字符串结束个字符开始计数,当碰到字符串结束标记标记00为止。为止。 #include #include #include #include intint main() main() char char strstr81; /81; /定义字符
56、数组存放字符串定义字符数组存放字符串 intint length; length; printfprintf(Input a String:);(Input a String:); gets( gets(strstr); /); /输入一个字符串,存放在数组输入一个字符串,存放在数组strstr中中 length = 0; /length = 0; /长度初始值为长度初始值为0 0 while( while(strstrlength != 0)length != 0) length+; length+; printfprintf(length=%dn, length);(length=%dn,
57、 length); return 0; return 0; Input a String:welcome to Clength=12例例6-116-11:从键盘输入多个字符串,输入空字符串时,输出其中:从键盘输入多个字符串,输入空字符串时,输出其中最长的字符串及其长度。最长的字符串及其长度。思路分析:该问题实际是前面已经介绍过的求最大值的问题。思路分析:该问题实际是前面已经介绍过的求最大值的问题。主要问题在于如何应用字符串处理函数获得字符串长度和对字主要问题在于如何应用字符串处理函数获得字符串长度和对字符串进行赋值。另外,空字符串是指长度为符串进行赋值。另外,空字符串是指长度为0 0的字符串,
58、即该字的字符串,即该字符串第符串第1 1个字符就是结束标记个字符就是结束标记00,输入时直接按,输入时直接按回车键回车键就可以就可以输入空字符串。输入空字符串。 #include #include #include #include intint main() main() char char strstr80, max80;80, max80; intint maxlenmaxlen, , lenlen; ; printfprintf(Input String:n);(Input String:n); gets( gets(strstr); /); /输入第输入第1 1个字符串个字符串 st
59、rcpystrcpy(max, (max, strstr); /); /设该字符串目前最长设该字符串目前最长 maxlenmaxlen = = strlenstrlen( (strstr); /); /记录目前最长字符串的长度记录目前最长字符串的长度 while(while(strstr0 != 0) /0 != 0) /输入字符串不为空串时循环输入字符串不为空串时循环 gets( gets(strstr); /); /输入下一个字符串输入下一个字符串 lenlen = = strlenstrlen( (strstr);); if( if(lenlen maxlenmaxlen) /) /判断
60、是否长度更长判断是否长度更长 maxlenmaxlen = = lenlen; ; strcpystrcpy(max, (max, strstr);); printfprintf(String: %s , Length: %dn, max, (String: %s , Length: %dn, max, maxlenmaxlen);); return 0; return 0; Input String:CC+PythonJavaRubyString: Python , Length: 6例例6-126-12:从键盘输入一个字符串,统计并输出该字符串中共有:从键盘输入一个字符串,统计并输出该字符串中共有多少个单词。为简化问题,设单词之间用一个或多个空格
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校产学研合作基础培训
- 2025~2026学年广东省茂名市高州市北师大版六年级上册阶段练习(三)数学试卷【附答案】
- PHP后端面试题及详细答案(实战完整版)
- 引水隧洞衬砌及防渗堵漏施工方案
- 2027届山东省青岛市黄岛十中学数学八年级第一学期期末教学质量检测模拟试题含解析
- 地下车库地坪起砂处理方案
- 泵站检修工安全操作规程
- 清洁工具使用安全操作规程
- 2025-2026学年湖北省老河口市初中数学七年级期末上册高分通关高频易错题(附答案)
- 2026年二级建筑师古建筑保护模拟考试题库及解析
- 2026年保密培训考试题带答案(完整版)
- 中国邮政集团招聘考试历年真题
- 2026年一级造价师案例考试真题及答案
- JJF(石化)078-2023激光甲烷遥测仪校准规范
- 焦点解决技术
- 2025年中国互联网上网服务行业发展白皮书
- 铁道车辆构造与检修教学课件-单元六-车钩缓冲装置
- 抖音【服饰户外行业IP】山山而川-雪山篇招商方案
- 测绘安全生产事故报告及处置办法
- PICC导管继发异位案例分析
- 《烹饪化学》课件(共七章)
评论
0/150
提交评论