C++语言程序设计:第5章 数组_第1页
C++语言程序设计:第5章 数组_第2页
C++语言程序设计:第5章 数组_第3页
C++语言程序设计:第5章 数组_第4页
C++语言程序设计:第5章 数组_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第第5章章 数数 组组 本章学习的目的:本章学习的目的:1、掌握数组的概念、掌握数组的概念2、如何使用数组?、如何使用数组? 包括三个部分:一维数组、二维数组和字符数组包括三个部分:一维数组、二维数组和字符数组3、掌握基于数组的基本算法、掌握基于数组的基本算法 2第第5章章 数数 组组 5.1 一维数组的定义和应用一维数组的定义和应用 5.2 二维数组二维数组 5.3 字符数组字符数组 5.4 程序设计举例程序设计举例3数组的基本概念数组的基本概念一种复杂数据类型一种复杂数据类型 数组元素的数据类型称为数组的基类型。可以是前述的简数组元素的数据类型称为数组的基类型。可以是前述的简单类型,也可

2、是指针或构造类型。单类型,也可是指针或构造类型。 计算机系统根据数组定义给出的元素个数,为数组分配一计算机系统根据数组定义给出的元素个数,为数组分配一段连续的内存空间。同一数组的所有元素均保存在此,又因为段连续的内存空间。同一数组的所有元素均保存在此,又因为各元素同质,即所占内存字节数相等,故可以通过序号各元素同质,即所占内存字节数相等,故可以通过序号数数组下标组下标访问各数组元素。访问各数组元素。 在在C语言中,数据的类型除基本类型(整型、实型、字符语言中,数据的类型除基本类型(整型、实型、字符型)外,还有构造类型(数组、结构和共用体)。数组是一种型)外,还有构造类型(数组、结构和共用体)。

3、数组是一种简单的构造类型简单的构造类型同质构造类型。同质构造类型。 所谓数组,实际为一组同所谓数组,实际为一组同质质(相同数据类型相同数据类型)元素的有序集合。元素的有序集合。可通过相同的数组名和下标来唯一标识可通过相同的数组名和下标来唯一标识数组元素数组元素。类似:。类似:数组名数组名下标下标那么,如何区分并标识这一组同类型的数据?那么,如何区分并标识这一组同类型的数据?4数组的四大要素:数组的四大要素: 数组的名字,同变量标识符。但数组名后数组的名字,同变量标识符。但数组名后 不可少。不可少。 数组的类型,既数组的数组的类型,既数组的基类型基类型。 数组的结构,用于说明数组的维数和数组元素

4、的个数。数组的结构,用于说明数组的维数和数组元素的个数。 数组的存储类型。数组的存储类型。 数组的四大要素通过定义数组的说明语句通知编译系统。数组的四大要素通过定义数组的说明语句通知编译系统。如:如:static int array10; 在实际中,数组是用来保存一系列在实际中,数组是用来保存一系列相关的、有序的相关的、有序的数据,数据,如:数列、矩阵、行列式、一个班各门课的成绩、字符串等。如:数列、矩阵、行列式、一个班各门课的成绩、字符串等。55.1 一维数组的定义和应用一维数组的定义和应用 一维数组的定义方式为一维数组的定义方式为: : 存储类型存储类型 数据类型数据类型 数组名数组名 常

5、量表达式常量表达式;例如例如 : int a10;它表示数组名为它表示数组名为a a,数组有,数组有1010个元素。个元素。数组必须先有定义,然后再使用。数组必须先有定义,然后再使用。C+C+语言规定只能语言规定只能逐个引用数组元素而不能一次引用整个数组。逐个引用数组元素而不能一次引用整个数组。数组的长度数组的长度6说明说明:1.1. C+C+语言中引用数组元素时,下标语言中引用数组元素时,下标从从0 0开始,下标必须是整型量。开始,下标必须是整型量。 数组在内存中存储时,是按下标递增数组在内存中存储时,是按下标递增的顺序连续存储各元素变量的值。的顺序连续存储各元素变量的值。a0表示第一个元素

6、表示第一个元素a1表示第二个元素表示第二个元素a9表示第十个元素表示第十个元素72.数组名表示数据存储区域的首地址。数组的数组名表示数据存储区域的首地址。数组的首地址也是第一个元素变量的地址。首地址也是第一个元素变量的地址。例如例如: int: int a5; a5;首地址:首地址:a a 或或 &a0&a0 重点注意:重点注意:数组名是一个地址常量(常量指针),数组名是一个地址常量(常量指针),不能给它赋值,也不能对它自加自减等对变量进行不能给它赋值,也不能对它自加自减等对变量进行操作的运算,因为它不是变量,不能作为操作的运算,因为它不是变量,不能作为左值左值 。错误案例:错

7、误案例: a=1,2,3,4,5a=1,2,3,4,5;3. 数组使用之前,必须定义其数据类型和存储类型。数组使用之前,必须定义其数据类型和存储类型。static long array20;以上定义语句中,数组以上定义语句中,数组array共有共有20个个long型元素,型元素,数据类型数据类型long决定了相邻两个元素内存空间首地址决定了相邻两个元素内存空间首地址差值为差值为4存储类型存储类型static决定了数组空间在静态全局数据决定了数组空间在静态全局数据区分配,而且在程序运行一开始就分配区分配,而且在程序运行一开始就分配scanf(“%d”,a);/给元素给元素a0输入整数输入整数a+

8、;a a1;/语法错误语法错误 &a/错误,错误,不是变量则不能取地址,因为没有不是变量则不能取地址,因为没有内存。注意数组的内存是指内存。注意数组的内存是指a0、a1等元素的等元素的内存,而没有给内存,而没有给a这个地址常量分配内存。这个地址常量分配内存。查看内存映像84.数组作为一个整体不能参加各种运算,参加数据处理的数组作为一个整体不能参加各种运算,参加数据处理的只能是数组的元素变量。只能是数组的元素变量。例例5.1 编程实现给数组按序输入数据,再反序输出。编程实现给数组按序输入数据,再反序输出。 #include void main( ) int i,a10; for(i=0;

9、iai; / scanf(%d,&ai); for(i=9;i=0;i-) /反相输出数组中的元素反相输出数组中的元素 coutai; / printf(%d,ai); 95. 数组定义时可以给出对应元素的初值。对于外部参照类和数组定义时可以给出对应元素的初值。对于外部参照类和static类数组叫做初始化,对类数组叫做初始化,对auto类数组则是赋初值。类数组则是赋初值。如如: static int: static int data5=2,4,6,8,10; data5=2,4,6,8,10;其作用是在其作用是在程序运行第一条指令之前程序运行第一条指令之前分别给分别给5 5个元素分配个

10、元素分配静态静态全局数据区的内存全局数据区的内存,并将对应数据以初始化方式写入分配的内,并将对应数据以初始化方式写入分配的内存。存。auto intauto int data5=2,4,6,8,10; data5=2,4,6,8,10;其作用是在其作用是在程序运行过程中程序运行过程中,动态分配内存空间(分配在,动态分配内存空间(分配在栈内栈内存存)给数组元素,然后执行赋值语句,完成给元素赋初值的动)给数组元素,然后执行赋值语句,完成给元素赋初值的动作。作。二者区别在确定初值的时刻点和内存种类均不同。二者区别在确定初值的时刻点和内存种类均不同。若定义数组时给出初值列表,则定义中可以不指定若定义数

11、组时给出初值列表,则定义中可以不指定数组长度数组长度, 即即: int data=2,4,6,8,10;若被定义的数组长度与提供初值的个数不相等,则若被定义的数组长度与提供初值的个数不相等,则数组长度不能省掉。数组长度不能省掉。 int b20=1,2,3,4,5;/只初始化前只初始化前5个元素,多余的个元素,多余的元素都是元素都是0 或残值(取决于存储类型)或残值(取决于存储类型) 。 106 . 数组定义时【】内为数组定义时【】内为,不能包含可变的量,不能包含可变的量,编译时编译时,编译器必须能够确定该表达式的取值。但定义后,编译器必须能够确定该表达式的取值。但定义后引用某个元素时用引用某

12、个元素时用数组名数组名 下标下标 ,下标可以是任何量。下标可以是任何量。例如,下面这样定义是例如,下面这样定义是错误错误的的: (1) int n ; scanf(%d,&n); int an; (2) int n=20; int an; :C语言不支持语言不支持动态数组定义动态数组定义(数组定数组定义时必须预先指定数组义时必须预先指定数组的长度,数组的长度不的长度,数组的长度不能依赖于程序运行过程能依赖于程序运行过程中变量的值,因此常量中变量的值,因此常量表达式中不能有变量和表达式中不能有变量和函数调用函数调用)11【应用说明【应用说明】C语言中最常见的错误之一是数组元素的越界使语言

13、中最常见的错误之一是数组元素的越界使用用(访问数组元素的下标超出了对数组进行定义时规定的界限。访问数组元素的下标超出了对数组进行定义时规定的界限。下标越界将会非法地改变其它存储单元的内容,有时还会造成下标越界将会非法地改变其它存储单元的内容,有时还会造成严重的错误。严重的错误。【例【例】#include void main( ) int i ,a10;/auto局部数组定义局部数组定义 for (i=0; i10; i+) ai = i;/引用之前先赋引用之前先赋初值初值 for (i=0; i10; i+) printf(“a%2d=%dn”, i, ai);若不小心写成:若不小心写成:fo

14、r (i=0; i数组首地址数组首地址9876.3210aa+1*Ia+2*Ia+8*Ia+9*Ia0a1a2a8a9退出查看a10a+10*Ib注意:注意:a10语法正确,但语法正确,但不是数组不是数组a的元素,也就的元素,也就是说,是说,a10的存储空间不的存储空间不在数组在数组a的连续空间里,的连续空间里,实际上实际上a10就存放在数组就存放在数组a 的连续内存空间的下一的连续内存空间的下一个内存空间。个内存空间。下标的含下标的含义?义?a i 中中i代表前面有代表前面有i个元素个元素13小节 学习了数组的基本概念四大要素 学习了一维数组的定义、初始化以及元素的引用 定义数组的长度必须是

15、一个常数,不能出现变量名或函数调用 引用单个元素时的下标表示法 越界的了解14#include char str = “SSSWILTECH1111W1WALLMP1”;void main( ) int k; char c; for( k=2; (c=strk) !=0 ; k+) switch(c) case A: putchar(a); continue; case 1: break; case 1 : while( (c=str+k ) !=1 & c!=0) ; case 9: putchar(#); case E: case L: continue; default: put

16、char(c); continue ; putchar(*); puts(“”) ;15例例5.2 5.2 编程将一个从键盘输入的整数序列按编程将一个从键盘输入的整数序列按逆序逆序并显示,整数个数首先从键盘并显示,整数个数首先从键盘输入输入; ; 如要求输入如要求输入5 5个数,原来的顺序为个数,原来的顺序为8 8,6 6,5 5,4 4,1 1,要求改为,要求改为1 1,4 4,5 5,6 6,8 8。#include void main( ) int a100; int i,j,n,temp; scanf(%d,&n); /输入整数个数输入整数个数 printf(input the

17、 numbers:n); for(i=0;in;i+) /输入整数序列输入整数序列 scanf(%d,&ai); /*将整数序列依次从首尾向中间交换元将整数序列依次从首尾向中间交换元 素素, 从而实现逆序排列从而实现逆序排列*/ for( ; ij; ) temp=aj; aj=ai; ai=temp; printf(now the numbers are:n); /输出重排后的整数序列输出重排后的整数序列 for(i=0;in;i+) printf(%5d,ai); 该程序的运行结果为:该程序的运行结果为:5input the numbers:8 6 5 4 1now the num

18、bers are :1 4 5 6 8数组应用数组应用16例例5.4 5.4 编一程序要求对已知的编一程序要求对已知的N N个数,按从小到大进行排序个数,按从小到大进行排序 (1) (1) 选择排序法选择排序法思想思想: :分为分为n-1n-1轮次。每一轮次确定一个元素。具体如下轮次。每一轮次确定一个元素。具体如下: :第一轮次,在第一轮次,在a0an-1找出最小值,放在找出最小值,放在a0;第二轮次,在第二轮次,在a1an-1找出最小值,放在找出最小值,放在a1; 第第n-1轮次轮次,在在an-2和和an-1之中找最小值之中找最小值,放进放进an-2,余下余下an-1下面以下面以5 5个数为

19、例个数为例, ,用两种方法实现选择排序:用两种方法实现选择排序:17第一种方法第一种方法(选择选择法)法):假设已知数据序列为假设已知数据序列为: 10 : 10 12 7 6 812 7 6 8,则实现,则实现排序的操作情况见右图排序的操作情况见右图: :总结总结: 对对N N个数要进行个数要进行N-1N-1轮次排轮次排序,每一轮次比较次数随轮次数序,每一轮次比较次数随轮次数的增加而减小,的增加而减小,( (轮次数轮次数+ +次数次数=N)=N)依此可设计出程序依此可设计出程序:18算法描述 for( i=0; in-1; i + )/升序排序, 固定ai元素,从ai+1元素开始(直至元素a

20、n-1)逐个元素与ai比较大小,值小者放入ai元素空间中,完成第i轮次操作每处理一轮次,待比较元素的个数少1 上面的循环体对应第i轮次操作,需要比较(n-1)-(i+1)+1次2数比较判断: for( j=i+1; jaj ) a i 与a j 交换 for( j=i+1; ja j ) a i 与与a j 交换交换19#include #define N 10void main( ) int i,j,t; int a10; for ( i=0 ;i 10 ;i+) scanf(%d,&ai); for ( i=0 ;iN-1;i+) /以以ai为基准数为基准数对剩下的进行搜索对剩下的

21、进行搜索 for (j=; jaj) t = ai; ai = aj; aj = t; for ( i=0 ;i 10 ;i+) printf(%dt, ai);直接选择法直接选择法从从ai+1开始开始逐个比较,直逐个比较,直至至aN-1特点:固定特点:固定ai为比较和交换对象,交换次为比较和交换对象,交换次数多,低效!数多,低效!固定固定ai20第二种方法第二种方法已知数据序为已知数据序为: :101012 7 6 12 7 6 8 ,8 ,则实现排序的则实现排序的操作情况见右图操作情况见右图: :标签标签标签标签21总结总结: 对对N N个数要进行个数要进行N-1N-1轮排序,每一轮的比轮

22、排序,每一轮的比较次数随轮次数增加而减小较次数随轮次数增加而减小( (遍数遍数+ +次数次数=N)=N),相,相对上一种情况,对上一种情况,。对应的程序如下对应的程序如下 :22#include #define N 10void main() int i, j, min,t; int a10; for ( i=0 ;i 10 ;i+) scanf(%d,&ai); /min为标签,含义:最小元素下标为标签,含义:最小元素下标 for ( i=0 ;iN-1; i+) min=i; /初始默认第一元素最小初始默认第一元素最小 for ( j = i+1;jN;j+) /*遍历后续所有元素

23、,将其与遍历后续所有元素,将其与amin而不是而不是ai进行比较进行比较*/ if(aj amin) min =j; if(min!=i) t = ai; ai = amin; amin = t; for ( i=0 ;i 10 ;i+) printf(%dt, ai); 联想:找到标签找到标签所指元素所指元素和第一个和第一个元素交换元素交换23(2) (2) 交换排序法(分为冒泡交换排序法(分为冒泡 & & 沉底)沉底)思想思想:基本操作是基本操作是比较相邻两个数比较相邻两个数,通过交换操作实现前,通过交换操作实现前小后大(或反之)小后大(或反之)分为分为n-1n-1轮次。每

24、一轮次确定一个元素。具体如下:轮次。每一轮次确定一个元素。具体如下: 第一轮次,在第一轮次,在a0an-1找出最大值,放在找出最大值,放在an-1; 第二轮次,在第二轮次,在a0an-2找出最大值,放在找出最大值,放在an-2; 第第n-1轮次轮次,在在a0和和a1之中找最大值之中找最大值,放进放进a1 ,余下余下a024已知数据序为:10 12 7 6 8,则实现排序操作情况见图: 25总结总结: 对对N N个数要进行个数要进行N-1N-1轮次排序,每轮次比较次轮次排序,每轮次比较次数随轮次数的增加而减小数随轮次数的增加而减小( (轮次号轮次号+ +比较次数比较次数=N)=N),比,比较的顺

25、序是从前往后较的顺序是从前往后。根据算法描述可以写出程序如下根据算法描述可以写出程序如下: 26算法描述 for( i=1; i=n-1; i + )/升序排序, 从a0元素开始两两相邻数比较大小,按先小后大交换次序,把当前这组数中最大值交换至最后元素an-i 中,完成第i轮次每处理一轮次,当前这组数个数少1 上面的循环体对应的第i轮次操作,需要频繁的相邻数比较判断: for( j=1; jaj )/不满足先小后大条件,则交换 aj-1与aj交换 for( j=1; jaj ) aj-1与与aj交换交换27#include #define N 10void main() int i,j,t;

26、/定义变量和数组定义变量和数组 int a10; for ( i=0 ;i 10 ;i+) /依次输入依次输入10个数个数 scanf(%d,&ai); for (i=1; i=N 1; i+) /*对剩下的数据冒泡排序,将该次最大对剩下的数据冒泡排序,将该次最大值放到上次排序最大值之前值放到上次排序最大值之前*/ for (j=1; jaj) / 递减用递减用 t = aj; aj = aj-1; aj-1 = t; for ( i=0 ;i 10 ;i+) printf(%dt, ai); 28#include #define N 10void main() int i,j,t;

27、/定义变量和数组定义变量和数组 int a10; for ( i=0 ;i 10 ;i+) /依次输入依次输入10个数个数 scanf(%d,&ai); for ( i=0 ;iN-1; i+) for (j=0;jaj+1) t = aj; aj = aj+1; aj+1 = t; for ( i=0 ;i 10 ;i+) /输出排序后的数输出排序后的数 /组组 printf(%dt, ai); 29沉底法: for (i=1; i=N 1; i+) for (j=1; jitemj) / 递减时改为 temp = itemj-1; itemj-1 = itemj; itemj =

28、temp; 冒泡法: for (i=1; i=i; j-) if (itemj-1itemj) / 递减时改为 temp = itemj-1; itemj-1 = itemj; itemj = temp; for (i=0; iN - 1; i+) for (j=0; jitemj+1) 。 for (i=0; ii ; j+) if (itemjitemj+1) 。 305.2 二维数组二维数组 将一维概念推广,可得多维数组。将一维概念推广,可得多维数组。 存储类型存储类型 数据类型数据类型 数组名数组名 常量表达式常量表达式11常量表达式常量表达式2 2 ; ;【例【例】 char a23

29、; /2 维,维,23=6个元素个元素 int b234; /3 维,维,23 4=24个元素个元素 C语言表示多维数组的方法与有些语言不同,每一维单独用一个语言表示多维数组的方法与有些语言不同,每一维单独用一个 表示,这表示,这种表示方法有助于把多维数组理解为特殊的一维数组。如:种表示方法有助于把多维数组理解为特殊的一维数组。如:int a23=int a03, a13;/两个一维数组,数组名两个一维数组,数组名a0,a1类似类似int a234理解为:理解为:2个二维数组个二维数组a0,a1(各有各有3*4个元素个元素)6个一维数组个一维数组a00,a01,a02,a10,a11,a12,

30、各有各有4个元个元素素 315.2 二维数组二维数组几个问题:几个问题:1、多维数组的、多维数组的“维维”不止一个,访问时对应不止一个,访问时对应有多个下标,每一维下标的含义是什么?有多个下标,每一维下标的含义是什么?2、在内存中按照什么样的顺序来存储数组中、在内存中按照什么样的顺序来存储数组中的元素?(即谁先存储在低地址内存,谁的元素?(即谁先存储在低地址内存,谁后存储在高地址内存?)后存储在高地址内存?)3、如何通过多维数组名与每一维下标一起使、如何通过多维数组名与每一维下标一起使用来获取元素的内存地址?用来获取元素的内存地址?32对于多维数组第一个对于多维数组第一个 代表第一维,第二个代

31、表第一维,第二个 代表第二维,代表第二维,依次类推。依次类推。按照下标的变化顺序来理解多维数组的存储顺序:按照下标的变化顺序来理解多维数组的存储顺序:最右边的最右边的下标最先变化(或者说变化最快)最左边的下标最后变化。下标最先变化(或者说变化最快)最左边的下标最后变化。对于二维数组我们可以理解为行列式或矩阵排列,对于第一对于二维数组我们可以理解为行列式或矩阵排列,对于第一维可以理解为行,第一维长度表示行数;第二维可以理解为列,第维可以理解为行,第一维长度表示行数;第二维可以理解为列,第二维长度表示列数;二维长度表示列数;对于二维数组对于二维数组 int a33:第一列第一列 第二列第二列 第三

32、列第三列每一行数据可以理解每一行数据可以理解为一维数组为一维数组第一行第一行 a00 a01 a02 int a0 3第二行第二行 a10 a11 a12 int a1 3第三行第三行 a20 a21 a22 int a2 3 33a22a21a20a12a11a10a02a01a00计算机的内存为一维空间。对于计算机的内存为一维空间。对于C语言的数语言的数组,其在内存中的存储顺序如右图所示,按行存组,其在内存中的存储顺序如右图所示,按行存放,先顺序存放第一行的元素,再顺序存放第二放,先顺序存放第一行的元素,再顺序存放第二行的元素,依次类推。每行的元素存放顺序是按行的元素,依次类推。每行的元素

33、存放顺序是按表示列号的下标递增顺序排列。下标变化规律:表示列号的下标递增顺序排列。下标变化规律:先变列下标,再变行下标先变列下标,再变行下标推而广之:推而广之:先变先变的下标,再变的下标,再变下标下标, . , 最最后变后变下标。下标。对二维数组来讲,行下标含义为前面已经存储的行数,对二维数组来讲,行下标含义为前面已经存储的行数,列下标含义为当前行中已经存储的列数。列下标含义为当前行中已经存储的列数。元素元素aij的内存单元的地址计算为:的内存单元的地址计算为: a i*一行的字节数一行的字节数 当前行前面当前行前面j个元素字节数个元素字节数34对于三维数组 int a233在内存中的存储顺序

34、: a022a021a020a012a011a010a002a001a000a122a121a120a112a111a110a102a101a100第第1个一维数组,个一维数组,名字名字a00第第2个一维数组,个一维数组,名字名字a01第第3个一维数组,个一维数组,名字名字a02第第4个一维数组,个一维数组,名字名字a10第第5个一维数组,个一维数组,名字名字a11第第6个一维数组,个一维数组,名字名字a1235多维数组的初始化多维数组的初始化: 按行对全部元素赋初值 static int a33 = 1, 2, 3, 4, 5, 6, 7, 8, 9;/用表示一行,每一行相当于一维数组,用括

35、起来。 按数组元素的存储顺序依次对全部元素赋初值 static int a33 = 1, 2, 3, 4, 5, 6, 7, 8, 9;1-a00,2-a01,4-a10.多维数组的引用多维数组的引用:同一维数组的引用类似,如:a2*m-12*n-1, b33.多维数组仍不允许整体引用。注意:下标取值范围为注意:下标取值范围为 0每维长度每维长度 1,不要越界。,不要越界。36 对部分元素赋初值 static int a33 = 1, 5, 9;等效于 static int b32=0,2,3;/第三行全部为0 static int c32=0,1,2,3;/隔行赋值,若不写,/则后面行被认为

36、是第二行 static int d4=1,2,3,4,5,6,7,8,9,10,11,12;/若提供了初值,则第一维长度可省略,这里表示有三行(因为每行有4个数据) static int e4=0,0,3,0,10;/表示三行00900500137 static int c234= 0,1,2,3,4,5,6,7,8,9,10,11, 0,1,2,3,4,5,6,7,8,9,10,11 ;/两个二维数组 注:可以缺省第一维的长度(前提是提供全部初始化数据),不可缺省第二维甚至更高维的长度,全缺省则不知几行几列。由于二维数组与行对象紧密相连,在后面要讲到二维数组名就是行指针。注意由于是静态类型注

37、意由于是静态类型(static),故其元素不给初始值时初始值,故其元素不给初始值时初始值默认为默认为0(对于整型数对于整型数)。若非静态类型或非外部参照类型,则。若非静态类型或非外部参照类型,则其元素的初始值随机。其元素的初始值随机。38【例【例】将将 2 维数组维数组a23中的元素按其存储顺序复制到中的元素按其存储顺序复制到 1 维数组维数组b6中。中。 #include void main ( ) static int a23 = 1, 2, 3, 4, 5, 6; int b6, i, j; for (i=0; i2; i+) /对于三维数组对于三维数组a234,有,有 / bi*3*4

38、+j*4+k=aijk for (j=0; j3; j+) bi*3+j = aij; for (i=0; i6; i+) printf(“b%2d = %dn”, i, bi); 39#include void main( ) int a234, d1,d2,d3, i, j, k, minnum; / 3 维数组维数组a for (i=0; i2; i+) for (j=0; j3; j+) for (k=0; k4; j+) scanf(“%d”, &aijk); / 为数组赋值为数组赋值 minnum = a000; d1=0,d2=0,d3=0; for (i=0; i2;

39、i+)/可以与上一个循环共用同一个循环变量,可以与上一个循环共用同一个循环变量, for (j=0; j3; j+) /但要注意循环变量清零(初值问题)但要注意循环变量清零(初值问题) for (k=0; k aijk) minnum = aijk; / 选择最小值选择最小值 d1=i, d2=j, d3=k; printf(“min = %d, x=%d,y=%d,z=%dn”, minnum,d1,d2,d3);【例【例】查找数组查找数组a234中的中的最小元素,及相应坐标。最小元素,及相应坐标。将将 改为改为 ,则选择最大值,则选择最大值40例例5.6 5.6 输入一个输入一个4 44

40、4的整数矩阵的整数矩阵, ,然后将之转置并显示这个然后将之转置并显示这个转置后的矩阵。转置后的矩阵。1615141312111098765432116128415117314106213951 分析:以主对角线为对称轴,交换所有对称点元素。如下图所示: 161514131211109876543211612841511731410621395141 程序如下:#include#define SIZE 4void main( ) int dataSIZESIZE,i,j,d; for(i=0;iSIZE;i+) /输入矩阵中的值 for(j=0;jSIZE;j+) scanf(%d,&d

41、ataij); for(i=0;iSIZE-1;i+) /矩阵转置 for(j=i+1;jSIZE;j+) /交换所有对称点元素 d=dataij; dataij=dataji; dataji=d; for(i=0;iSIZE;i+) printf(n); for(j=0;jSIZE;j+) printf(%4d,dataij); const int SIZE=4;42例例5.7 5.7 计算如下所示两个矩阵的乘积计算如下所示两个矩阵的乘积: : 132229182711205321372661709333534510180250651325分析: 在编程之前,我们必须了解下面的数学常识:(1

42、)第一个矩阵的列数必须等于第二个矩阵的行数,一个m行n列的矩阵乘以一个n行p列的矩阵,其结果是一个m行p列的矩阵。 (2)若矩阵A乘以矩阵B,则结果矩阵C中每个元素的值为: Cij = n1kkjikba 43根据分析可编写程序如下:#includevoid main( ) int valueA34=2,3,-5,0, /数组初化 12,-1,27,8, 91,22,-32,1; int valueB45= 25,13,65,0,5, -2,0,18,10,45, 53,33,3,9,0, 7,61,26,-37,-1; int valueC35=0; /VC6初始化结果矩阵 int i,j,

43、k; /按照公式将矩阵相乘 for(i=0;i3;i+) for(j=0;j5;j+) for(k=0;k4;k+) valueCij+=valueAik*valueBkj; for(i=0;i3;i+) /输出结果矩阵 for(j=0;j5;j+) printf(%5d,valueCij); printf(n); 程序的运行结果:221 139 169 15 145 1789 1535 1051 63 7 542 188 6241 105 144444例例5.8 5.8 输出下列形式的杨辉三角形的前输出下列形式的杨辉三角形的前1010行。行。1 11 11 11 2 11 2 11 3 3

44、11 3 3 11 4 6 4 11 4 6 4 1 .分析:杨辉三角形是 展开后各项的系数,有以下规律:(1)各行的第一个数都是1,即ai0=1;(2)各行的最后一个数都是1,即aii=1;(3)从第3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列两个数之和,可以这样表示:aij=ai-1j-1+ai-1j,其中i为行数,j为列数。 nba)( aij=ai-1j-1+ai-1j45程序如下:include void main( ) int a1010; int i,j;/*将第一列和对角线上的元素赋值为1*/ for(i=0;i10;i+) ai0=1; aii=1

45、; for (i=2;i10;i+) for (j=1;ji;j+) /按规律求数组元数aij的值 aij=ai-1j-1+ai-1j; for(i=0;i10;i+) for(j=0;j=i;j+) printf(%5d,aij); printf(n); 465.3 字符数组 1. 一维字符数组与单个字符串 存放字符的数组是字符数组,字符数组中每一个元素存放一个字符。可以这样定义: auto char string20; 对于一个长度为n的字符数组,它可以存储长度不超过n-1个字符的字符串,最后一个元素是为了在字符串末尾存入一个空字符0,这个空字符是字符串结束的标志,所以:字符串的最大长度不

46、得超过数组长度减1 47字符数组的初始化可以:1)、逐个元素指出其初值char string20= s, t, r, o, n, g, 0;char string20= s, t, r, o, n, g ;如果要用这种字符数组存放字符串,在指定初值时,必须在最后一个值之后必须明确地写上0。 这样上面的初始化等效于下面的赋值语句: string0= s; string1= t; string2= r; . .string6= 0;482)、用字符串文字量初始化字符数组: char string =“hello“; 在内存处理中,它的存储状态如下:再例如:char string20=hello;

47、printf(%s,string);虽然数组的元素个数变成了20,但也只能输出“hello”这几个字符,而不是输出20个字符,因为有字符串结束标志0 。 h e l l o 0“hello“; /花括号可以缺省花括号可以缺省49字符数组的引用、赋值和其它运算必须逐个元素进行 ,不过它可以通过字符数组名由函数scanf和函数printf函数用s输入和输出整个字符串。像上面定义的数组,我们可以这样输入:scanf(%s,string);输出字符串可以用这样的语句:printf(“%sn”,string); 由于string是数组 string20的首地址,所以前面不能加&符号 。回顾%s格

48、式说明符的含义50 如果函数利用一个scanf函数输入多个字符串,则以空格分隔。例如: char string15,string25,string35; scanf(%s%s%s,string1,string2,string3);如果输入为: How are you? 回车数组的存储状态如下图,未被赋值的元素的值依赖于数组的存储类型 。How00are00you?0 51例例 计算字符串的长度计算字符串的长度void main( void ) int i=0; char string20=“Hello C+:)”; /统计字符个数,如果字符不等于0则循环 while(stringi!=0) /

49、计数i加1 i+; printf(“Total characters are %dn”,i); /输出个数计数值1052例例5.9 5.9 计算字符串的长度计算字符串的长度int strlen(char string ) int i=0; /统计字符个数,如果字符不等于0则循环 while(stringi!=0) /计数i加1 i+; return(i); /返回个数计数值 532. 二维字符数组与多个字符串 表示多个字符串的二维字符数组可以看成是以字符串为元素的一维数组。字符串数组是特殊的二维字符数组,它的每一行元素中都含有字符串结束符0。 54例例5.11 5.11 下面的例子说明二维数组的定义和初始化以及和多个字符串下面的例子说明二维数组的定义和初始化以及和多个字符串的关系。的关系。有两种方法进行初始化,我们可以加以比较:【方法一】 char string310= pascal , cobol , fortran ;初始化后数组的存储状态如下:pascal0 cobol0 fortran0 注意:每一个字符串的长度不能超过9,因为还要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论