C++语言程序设计电子教案6_第1页
C++语言程序设计电子教案6_第2页
C++语言程序设计电子教案6_第3页
C++语言程序设计电子教案6_第4页
C++语言程序设计电子教案6_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 数组 YYHYYH版版 6.1 一维数组一维数组 6.2 二维数组二维数组 6.3 字符数组字符数组 6.4 程序举例程序举例 许多同类数据的集合称为许多同类数据的集合称为数组数组 第第6 6章章 数数 组组教材上的教材上的第二章第二章2.6第6章 数组 YYHYYH版版 6.1 一一 维维 数数 组组 6.1.1 一维数组的定义和引用一维数组的定义和引用 引例引例6.1输入输入5个学生某门课的成绩,要求按与输入次序相反个学生某门课的成绩,要求按与输入次序相反的顺序输出。的顺序输出。#include void main() float s1, s2, s3, s4, s5; print

2、f(Enter five scores: ); scanf(%f , %f , %f, %f, %f, &s1, &s2, &s3, &s4, &s5); printf(nThe score in reverse order are: ); printf(%fn, s5); printf(%fn, s4); printf(%fn, s3); printf(%fn, s2); printf(%fn, s1); 显然,当学生人数很多时,显然,当学生人数很多时,程序质量就很差,用数组的程序质量就很差,用数组的方法质量就很好方法质量就很好(见例见例 6.2)。第

3、6章 数组 YYHYYH版版 6.1.2 数组的通用定义数组的通用定义: 说明说明 (1) 常量常量i的个数的个数( 的配对数的配对数)定义了维数;定义了维数; (2) 常量常量i的值定义了该维数的元素个数,的值定义了该维数的元素个数,表示数组长度表示数组长度i不能不能是变量也不能是包含变量的表达式是变量也不能是包含变量的表达式( (即即不允许定义动态数组不允许定义动态数组), ), 可以是常量或常量表达式。常量表达式应是整型数,不能是小可以是常量或常量表达式。常量表达式应是整型数,不能是小数。数。其上界为其值减其上界为其值减1,下界均为,下界均为0; (3) 此语句在内存中为指定的数组此语句

4、在内存中为指定的数组(按先行后列按先行后列)分配内存空间分配内存空间; (4) 数组的引用遵循数组的引用遵循“先定义,后使用先定义,后使用”的原则的原则; (5) 数组定义处代表数组整体,而使用处只能用数组元素数组定义处代表数组整体,而使用处只能用数组元素/数数组的下标变量。组的下标变量。类型类型 数组名数组名常量常量1 常量常量2,;第6章 数组 YYHYYH版版 (6)使用的下标不能大于使用的下标不能大于 数组长度数组长度-1-1,即不能越界。,即不能越界。 例如:例如: int a4, x34 定义了两个数组:有定义了两个数组:有a0至至a3(下标变量下标变量或数组元素或数组元素) 4个

5、元素的一维整型数组个元素的一维整型数组a4 ;有;有 x00、x01、 x23共计共计3*4=12个元素的二维整型数组个元素的二维整型数组x34; 又如定义又如定义处处int a20代表数组整体,使用处代表数组整体,使用处a19代表数组代表数组个体即第个体即第20个元素,但无元素个元素,但无元素a20且超界。且超界。 例如:例如:data4、datai+j、datai+都是合法的引用方式。都是合法的引用方式。 int n=10; int an; 是错误的。是错误的。 但但 #define N 10 或或const int N=10; int aN,nn+10; 是正确的。是正确的。第6章 数组

6、 YYHYYH版版例例 6.2 用数组实现例用数组实现例6.1。 #include void main() int i; float score5; printf(Enter five scores: ); for(i=0; i=0; i-) /循环反序输出循环反序输出5个成绩个成绩 printf(“%4.2f ”, scorei); /使用处使用处 定义单精度数组定义单精度数组(有有score0至至score4 5个元素个元素)注意注意(1)定义处定义处score5(代表数组整体代表数组整体)和使用和使用处的处的scorei (代表数组个体代表数组个体)是有别的;是有别的;(2)若将数若将数

7、组的内容逆置重放见后例组的内容逆置重放见后例6.8; (3)逆序输出方二逆序输出方二: for (i=0; i5; i+) printf(%4.2f , score4-i); 不管学生人数有多少,不管学生人数有多少,程序结构均一样。程序结构均一样。当当i=5时超界时超界比比较较第6章 数组 YYHYYH版版 6.1.3 一维数组的初始化一维数组的初始化 循环输入:数组在定义后,应先赋值循环输入:数组在定义后,应先赋值(初始化初始化)才可使用才可使用/处理。一般处理。一般用单重循环和赋值语句或输入语句使数组中的用单重循环和赋值语句或输入语句使数组中的元素得到值,称为对数组的初始化。元素得到值,称

8、为对数组的初始化。可直接初始化:在定义数组时同时对数组元素赋以初值。可直接初始化:在定义数组时同时对数组元素赋以初值。如:如:int s5=78, 87, 77, 91, 60; 结果是结果是 s0=78,s1=87,s2=77,s3=91, s4=60。 也可只给一部分元素赋值。也可只给一部分元素赋值。 例如:例如: int s5=78, 87, 77; 结果是结果是 s0=78, s1=87,s2=77, 其余其余元素的值为元素的值为0。第6章 数组 YYHYYH版版 若对全部数组元素赋初值时,可以不指定数组长度,但不若对全部数组元素赋初值时,可以不指定数组长度,但不可省方括号。例如:可省

9、方括号。例如: int s5=1, 2, 3, 4, 5; 可以写成可以写成 int s =1, 2, 3, 4, 5; 一维数组元素是按下标递增的顺序连续存放在连续的存贮一维数组元素是按下标递增的顺序连续存放在连续的存贮空间中。如空间中。如s数组在数组在内存中的存贮示意图如下所示。内存中的存贮示意图如下所示。 S0S1S2S3S4 例例 6.3 从键盘输入从键盘输入15个整数,并检查整数个整数,并检查整数10是否包含在这是否包含在这些数据中,若是的话,它是第几个被输入的。些数据中,若是的话,它是第几个被输入的。第6章 数组 YYHYYH版版 #include void main() int

10、i, flag, data15; flag=0; /定义判断定义判断15个数据中有否个数据中有否10 的标志的标志 printf(Input numbers: n); for (i=0; i15; i+) /循环输入循环输入15个数据个数据 scanf(%d, &datai); for (i=0; i15; i+) /循环判断循环判断15个数据有否个数据有否10 if (datai=10) printf(10 is inputed in the position %d.n, i+1); flag=1; /* 标记标记10在输入数据中在输入数据中 */ break; if(flag=0)

11、 printf(10 is not in numbers); 因因i是从是从0算起的,故算起的,故10的顺的顺序位置应是找到的序位置应是找到的i再加再加1。提问提问:去掉去掉“flag=1;”后对吗后对吗?问:问:可否可否置入此处,置入此处,但要加记但要加记位器。位器。第6章 数组 YYHYYH版版6.2 二二 维维 数数 组组 6.2.1 二维数组的定义和引用二维数组的定义和引用 二维数组的定义形式为二维数组的定义形式为 类型标识符类型标识符 数组名数组名常量表达式常量表达式常量表达式常量表达式; 类同一维数组。例如,类同一维数组。例如, int a32; 表示数组表示数组a是一个是一个32

12、(3行行2列列)的数组,共有的数组,共有32 =6个元素个元素(a00、a01、a10 、a21),每个元素都是,每个元素都是int型。型。 运行结果:运行结果: Input numbers: 12 13 23 89 77 90 56 1 6 11 5 9 10 17 6510 is inputed in the position 13. 对此类题,对此类题,若求第一个若求第一个10位置和位置和10的个数、求的个数、求奇偶数的和奇偶数的和等均是对批等均是对批量数据求某量数据求某些特征问题些特征问题的求解。的求解。第6章 数组 YYHYYH版版 二维数组的应用之一是矩阵和行列式。其中,左起第一二

13、维数组的应用之一是矩阵和行列式。其中,左起第一个下标表示行数,第二个下标表示列数。个下标表示行数,第二个下标表示列数。图图 6.2 二维数组二维数组a32(先行后列先行后列)内存图内存图a00 a01a10a11a21图图 6.3 三例数组元素的排列方式三例数组元素的排列方式 第6章 数组 YYHYYH版版 6.2.2 二维数组的初始化二维数组的初始化 对二维数组初始化时,同样可在定义时一并初始化,可对二维数组初始化时,同样可在定义时一并初始化,可不分行不分行/组或分行组或分行/组赋值,例如:组赋值,例如: int a32=1, 2, 3, 4, 5, 6; /按行分段按行分段 int a32

14、=1, 2, 3, 4, 5, 6; /按行连续按行连续 int a =1, 2, 3, 4, 5, 6; int a =1, 2, 3, 4, 5, 6; /C不用而不用而C+少用少用(不明确不明确) 其中内其中内 代表一行赋代表一行赋值值的元素初值的元素初值: a00=1, a01=2, a10=3, a11=4, a20=5, a21=6 对应行列式:对应行列式:对对二维数组二维数组初始化,初始化,一一般般用双重循用双重循环和赋值语环和赋值语句或输入语句或输入语句使数组中句使数组中的元素得到的元素得到值。值。123 45 6等等价价第6章 数组 YYHYYH版版 也可只为部分元素赋值,例

15、如:也可只为部分元素赋值,例如:int a32=1, 2, 3, 4; 则:则:a00=1,a10=2,a11=3,a20=4而其而其余元素的初值将自动设为余元素的初值将自动设为0。 可将所有数据写在一个花括号内,按数组的排列顺序对可将所有数据写在一个花括号内,按数组的排列顺序对各元素按序赋初值。如:各元素按序赋初值。如:int a32=1, 2, 3, 4; 结果为:结果为:a00=1,a01=2,a10=3,a11=4,其余元素的值自,其余元素的值自动设为动设为0。 若对数组全部元素都赋初值,定义数组第一维的长度可若对数组全部元素都赋初值,定义数组第一维的长度可不指定,但对第二维长度不能省

16、;如:不指定,但对第二维长度不能省;如:int a 2=1, 2, 3, 4, 5, 6;此时;此时第一维的长度由实际数据确定:应是第一维的长度由实际数据确定:应是3。 如:如:int a32=4,5,6,7,8,9; int a2=4,5,6,7,8,9; 但是不能写为:但是不能写为:int a3=4,5,6,7,8,9; 第6章 数组 YYHYYH版版 例例 6.4 从键盘为一个从键盘为一个NN的整型数组输入数据,并将的整型数组输入数据,并将每一行每一行的最小值显示出来的最小值显示出来(如每行为城市中的一条运输费路经如每行为城市中的一条运输费路经)。 解解:设设N=6,先建立矩阵先建立矩阵

17、aNN(即输入即输入36个数据个数据),再定义一个一再定义一个一维数组维数组mN,用来保存用来保存矩阵中每行的最小值矩阵中每行的最小值,初值为每行的第一个初值为每行的第一个元素元素; 用双重循环处理用双重循环处理:示意图如下示意图如下(设定设定36个数个数) 23 35 12 89 128 9 213 135 62 819 18 99 32 53 21 98 218 19 73 65 112 80 28 109 123 135 112 189 118 219 223 325 102 819 108 119mN的的mi初值为初值为ai0 aNN 比较数比较数:外循环外循环i=0至至N-1 被较数

18、被较数:内循环内循环j=1至至N-19181928112102双重循环处理双重循环处理:用外循环用外循环i控制控制比较数比较数mi= ai0与内循环与内循环j的被比较数的被比较数aij比较大小比较大小,将小的放入将小的放入mi,直至内循直至内循环完环完,该行的最该行的最小值即已放如小值即已放如mi,外循环再外循环再循环下一轮。循环下一轮。第6章 数组 YYHYYH版版#define N 6/宏定义宏定义,使使N被置换为被置换为6#include void main() int aNN, mN, i, j; printf(Input numbers: n); for (i=0; iN; i+)

19、/双重循环输双重循环输 for (j=0; jN; j+)/入矩阵入矩阵36个个 scanf(%d, &aij); /数据数据 for (i=0; iN; i+) /双重循环求双重循环求 mi=ai0; /每行每行最小值最小值 for (j=1; jaij) mi=aij; printf(Min is: ); for (i=0; iN; i+) printf(%d , mi); 运行结果:运行结果: Input numbers: 12 3 4 67 22 98 23 61 19 20 83 78 5 7 12 1519 89 1 6 8 211 22 81 36 2 453 32 17

20、 19 11 5Min is: 3 8 3 1 2 5 程序如下程序如下:第6章 数组 YYHYYH版版 提问:提问:1、若置、若置每行每行最小值最小值”mi=ai0;”语句在别的地方如循语句在别的地方如循环之外环之外/前,如何?前,如何?2、内外循环的循环变量的初值、内外循环的循环变量的初值(如改如改j=1为为j=0)和终值可和终值可改变吗?改变吗?3、若求某行最小某列最大值、若求某行最小某列最大值(马鞍点马鞍点)如何?后讲。如何?后讲。4、若求每行的升序或降序、若求每行的升序或降序(排序排序)如何?后讲。如何?后讲。5、实例见、实例见“VC+实例实例/一般程序一般程序/数组数组(C和和C+

21、及应用及应用)求二维数组各行最小数组求二维数组各行最小数组(C+程序程序) 和和“求二维数组各求二维数组各行最小数组行最小数组(C程序程序)”及及“数组应用数组应用”。第6章 数组 YYHYYH版版 6.3 字字 符符 数数 组组 6.3.1 字符数组的定义和初始化字符数组的定义和初始化 定义类似前面介绍,格式:定义类似前面介绍,格式: char 数组名数组名常量表达式常量表达式; 如:如: char c6; 则定义则定义c为字符数组,为字符数组, 包含包含6个元素,每个个元素,每个元素为一个字符元素为一个字符(实际上是其对应的实际上是其对应的ASCII码码)。 赋值方法与一赋值方法与一般的一

22、维数组是一样的,例如:般的一维数组是一样的,例如: c0=s; c1=t; c2=r; c3=i; c4=n; c5=g; 6.3.2 用字符数组表示字符串用字符数组表示字符串 字符串常量是用双引号括起来的字符序列。字符串常量是用双引号括起来的字符序列。 在在C C语言中语言中, ,字符串是用一维字符数组来表示的字符串是用一维字符数组来表示的( (但在但在C+C+语言中语言中, ,是用数据是用数据类型类型CString来定义字符串变量的来定义字符串变量的) )。 第6章 数组 YYHYYH版版在表示一维字符数组时在表示一维字符数组时, ,是以一个字符串结束标志是以一个字符串结束标志00标识的自

23、动加上的。故一维字符数组长度共计有效字符标识的自动加上的。故一维字符数组长度共计有效字符个数个数+1+1个字符。例个字符。例“string”string”共有共有6 6个字符个字符, ,但在内存中但在内存中占占7个字节个字节, ,最后一个字节存放最后一个字节存放00。习惯上常如下表。习惯上常如下表示:示:char c=“stringchar c=“string;或;或char c=“string”char c=“string”; char char c=s,t,r,i,n,g,0c=s,t,r,i,n,g,0; 初始化后,初始化后,c c数组中每个元素的初值如下:数组中每个元素的初值如下: c

24、0=sc0=s,c1=t,c2=rc1=t,c2=r,c3=ic3=i,c4=nc4=n,c5=g c5=g , c6=0 c6=0 等价等价(三种三种方式方式)第6章 数组 YYHYYH版版 例例 6.5 检测某一给定字符串中的字符数检测某一给定字符串中的字符数,不包括结束符不包括结束符0。 #include “stdio.h”void main() static char str =string; int i=0; while (stri! =0) i+; printf(The length of string is: %dn, i); 运行结果:运行结果: The length of s

25、tring is : 6 循环体循环体第6章 数组 YYHYYH版版6.3.3 字符数组的输入和输出字符数组的输入和输出 (1) 采用采用“%c”格式符逐个输出。格式符逐个输出。 例例6.5中的中的str数组,数组, 若执行若执行: : str =“string”; printf(%c, str5); (2) 采用采用“%s”格式符,可用格式符,可用字符数组名对字符数组名对整个字符串一次整个字符串一次输入输出。输入输出。 例例6.5中的中的str数组改为数组改为 printf(%s, str); (3)采用采用“%s”格式符格式符, scanf函数函数用用字符数组名对字符数组名对整个字符串整个

26、字符串一次输入一次输入。例:。例:输出结果为输出结果为:g输出结果为输出结果为:string运行:运行:Welcome you Welcome you注意:对字注意:对字符数组无符数组无&#include stdio.hvoid main() char str10; scanf(%s,str); printf(%s,str);第6章 数组 YYHYYH版版 6.3.4 常用字符串处理函数常用字符串处理函数 需先用#include 和和 #include 包含其函数功能。 1) gets 字符串输入函数(sstring) 调用形式: gets(字符数组字符数组) 功能:从终端输入一个字符

27、串直至按回车键并赋给字符数组名, 且得到一个函数值,该函数的返回值是字符数组的起始地址。 注意注意(1)输入gets(字符数组)与输入一个字符的同类函数getch()、getche()、getchar()的异同;(2)输入gets(字符数组)与输出puts(字符串)及输入一个字符的同类函数getch()、getche()、getchar()与输出一个字符的函数putch()、 putchar()是配对的互逆函数(详见第三章输入输出内容);第6章 数组 YYHYYH版版(3)凡是作为数组的输入,均可用指针,如gets(字符数组的指字符数组的指针针)。 2) puts 字符串输出函数 调用形式:

28、puts(字符串) 功能:将一字符串(以0为结束符)输出到终端。 输出时将字符串结束标志转换成n,即输出完毕后换行。 3) strcmp 字符串比较函数(cmp-compare) 调用形式: strcmp(字符串1,字符串2) 功能:将两个字符串从左至右逐个进行比较(按ASCII码值大小比较),直到出现不同的字符或遇到0为止。 比较的结果赋给函数(值): 函数值=0表示字符串1=字符串2;函数值0表示字符串1字符串2;函数值0表示字符串1字符串2。第6章 数组 YYHYYH版版4) strcpy 字符串拷贝函数(cpy-copy) 调用形式: strcpy(字符数组1,字符串2) 或 strc

29、py(字符数组1,字符串2, n) 功能:将字符串2拷贝到字符数组1中去。 说明:字符数组1必须定义得足够大,以便容纳被拷贝的字符串;也可以用strcpy函数将字符串2前若干个字符拷贝到字符数组1中去(即调用形式二),其中n为取前n个字符,另外参数可是指针(后同)。例如,strcpy(str1, str2, 2); 即是将str2中前2个字符拷贝到str1中,然后再加一个0。 5) strcat 字符串连接函数(cat-connact) 调用形式: strcat(字符数组1,字符数组2) 功能:将字符数组2中字符串接到字符数组1中字符串的后面,结果放在字符数组1中,函数的返回值是字符数组1的地

30、址。 第6章 数组 YYHYYH版版说明:字符数组1必须足够大, 以便容纳连接后的新字符串。 6) strlen 字符串长度测试函数(len-length) 调用形式: strlen(字符串) 功能: 测试字符串的长度, 函数的返回值为字符串的实际长度(不包括0)。 7) strlwr 字符串转换函数(lwr-lower) 调用形式: strlwr(字符串) 功能: 将字符串中大写字母转换成小写字母。 8) strupr 字符串转换函数 调用形式: strupr(字符串) (upr-uper) 功能: 将字符串中的小写字母转换成大写字母。第6章 数组 YYHYYH版版例例 6.6 有三个字符串

31、,要求找出其中最大者。 #include #include void main() char string2; char str32; int i; for (i=0; i0) strcpy(string, str0); else strcpy(string, str1); if (strcmp(str2, string)0) strcpy(string, str2); printf(n the largest string is : %sn, string); 运行结果: CHINAHOMEA CHINESEthe largest string is: HOME 实例见实例见“VC+教程教程

32、VC+实例实例一般程序一般程序/C+字符串组字符串组”第6章 数组 YYHYYH版版 *例例6.7 用选择排序法对数组中的用选择排序法对数组中的N个整数排序,设个整数排序,设升序升序(由小由小到到大大)输出。输出。 解:设解:设N=6,先建立一个一维数组,先建立一个一维数组aN(即输入即输入6个数据个数据),用,用逐步选第一小逐步选第一小(其下标其下标k=0)、第二小、第二小(其下标其下标k=1)、第三小、第三小(其下其下标标k=2)(最后一个是最大的最后一个是最大的)的排队的排队/序法;每步用双重循环比序法;每步用双重循环比较交换法处理。定义一个较交换法处理。定义一个用来保存用来保存数据中第

33、几数据中第几(k+1)小的记位小的记位(置置)器器(变量变量)k,总是用外循环控制的比较数,总是用外循环控制的比较数ak(初值初值ak=ai)与内与内循环的被比较数循环的被比较数aj比较大小,若被比较数比较大小,若被比较数aj小于小于比较数比较数ak,则记住位置则记住位置/下标下标k=j,直至内循环完,再将,直至内循环完,再将ak与与ai利用中间利用中间变量变量t进行交换,那末第进行交换,那末第k+1小的数即在正确的位置小的数即在正确的位置ai;外循环外循环再循环下一轮再循环下一轮。即采用。即采用双重循环双重循环选择排序法选择排序法(示意图如下示意图如下):6.4 程程 序序 举举 例例 第6

34、章 数组 YYHYYH版版 9 35 12 89 128 23 9 12 35 89 128 23 9 12 23 89 128 35 9 12 23 35 128 89 9 12 23 35 89 128比较数比较数:外循环外循环i=0至至N-2,也也是是k的的初值初值被较数被较数:内循环内循环j=i+1至至N-1a6: 23 35 12 89 128 9230 351 122 893 1284 95例例:当当第第一一次次外循环外循环i=0时时,初值初值k= i=0,此时内此时内循环循环j=1至至5即要找出第即要找出第i=0小的小的:用双重循环处用双重循环处理:理:若被比较若被比较数数aj小

35、于小于比比较数较数ak (初值初值ak=ai),则,则记住位置记住位置/下标下标k=j,直至内,直至内循环完,再将循环完,再将ak与与ai利用利用中间变量中间变量t进行进行交换交换比较比较(1)j=1时时,a0a2,k=2;(3)j=3,a2a3,k=2不变不变; (4) j=4,a2a5, k=5;若若i=k,则则ai与与ak交换交换(即即23和和9交换交换)a0 a1 a2 a3 a4 a5第6章 数组 YYHYYH版版 #include #define N 10 void main() int aN, i, j, k, t; printf(Input %d number: n, N);

36、for (i=0; iN; i+) /循环输入元素的值循环输入元素的值 scanf(%d, &ai); printf(n); /换行换行 for (i=0; iN-1; i+) /*外循环外循环,控制控制N-1轮比较轮比较, 即找即找N-1遍遍*/ k=i; /*用用k记住每次找第记住每次找第i+1小的数的下标小的数的下标 */ for (j=i+1; jN; j+) /内循环控制被比较数的比较次数内循环控制被比较数的比较次数第一次找最第一次找最小的小的;第二第二次找次小次找次小的的;第第N-1次找第次找第N-1小的小的(剩下剩下一个是最大一个是最大的的);程序如下程序如下:问题问题(

37、1)改改iN-1为为iN可否可否? 对对C (2)改改ji+1为为ji可否可否? 循环变量:循环变量:i, j;记;记位器:位器:k;中间变量。;中间变量。第6章 数组 YYHYYH版版 if(ajak) k=j; /若被比较数若被比较数(后面数后面数)小于第小于第i+1=k+1小的小的 if (i!=k) /如所找第如所找第(k+1)小的数不是本身小的数不是本身 t=ak; /则将则将ai和和ak ak=ai; /通过通过t进行进行 ai=t; /三角交换三角交换 printf(The sorted numbers: n); for (i=0; iN; i+) printf(%d , ai)

38、; 运行结果:运行结果: Input 10 numbers: 4 6 7 10 13 2 1 9 20 3 The sorted numbers: 1 2 3 4 6 7 9 10 13 20 数数(即即ak),则记住其位置则记住其位置(内循环内循环i+1至至N-1次次)说明:说明:此例为选择排序法;另法比较交换法:不用变量此例为选择排序法;另法比较交换法:不用变量k,将将ai和和aj通过通过t进行三角交换放在内循环中即可进行三角交换放在内循环中即可(即去掉即去掉if语语句,比较区别:频繁交换句,比较区别:频繁交换);实例见实例见“VC+实例实例一般程序一般程序/数组数组(C和和C+及应用及应

39、用)数组排序数组排序” (此例为降序排序此例为降序排序)。1、去掉、去掉if (i!=k)可否可否?2、求最大求最大/小数及其个数等?小数及其个数等?第6章 数组 YYHYYH版版 按以下箭头所指的形式,将两个元素中的内容对调即可。若按以下箭头所指的形式,将两个元素中的内容对调即可。若用用i,j分别代表进行对调的两个元素的循环下标,则需要确定分别代表进行对调的两个元素的循环下标,则需要确定i和和j的关系的关系(即即j=N-i-1)和确定和确定i变变化的范围即可。化的范围即可。 j=N-i-1 例例6.8 将数组将数组a的内容逆置重放的内容逆置重放:要求不另外开辟数要求不另外开辟数组组,只能借只

40、能借助于一个临时存贮单元。分析助于一个临时存贮单元。分析:假定假定a数组有数组有8个元素存放如下:个元素存放如下: 第6章 数组 YYHYYH版版 #include #define N 8 void main() int aN, i, j, p, t; /定义循环变量、中间点、交换变量定义循环变量、中间点、交换变量 printf(Input %d number to the array: , N); for(i=0; iN; i+) scanf(%d, &ai); p=N/2-1;/求中间点的前一个点下标求中间点的前一个点下标(对奇偶对奇偶)作为循环的终值作为循环的终值 for (i=

41、0; i=p; i+) j=N-i-1; /求对应点求对应点 t=ai; ai=aj; aj=t; printf(nThe array has been inverted: ); for(i=0; iN; i+) printf(%d , ai); 运行结果:运行结果: Input 8 number to the array: 4 7 2 8 12 5 10 3 The array has been inverted: 3 10 5 12 8 2 7 4 注意:注意:如果循环改为如果循环改为for(i=0; i=N; i+),则逆置重放了两次,则逆置重放了两次(还还原了原了)。对矩阵逆置重放也用

42、同样方。对矩阵逆置重放也用同样方法。法。对奇偶的中间点略有区别。对奇偶的中间点略有区别。程序如下程序如下:注意事项:单击注意事项:单击第6章 数组 YYHYYH版版例例 6.9 将字符串s转换成相应的双精度浮点数。#include void main() char s8; double val, power, number; int i, sign; printf(Input string of a number: ); gets(s); i=0; sign=1; if (si=+ | si=-) /*sign处理符号处理符号 */ sign=(si+= =+)?1: -1; for (val

43、=0; si=0& si=0& si=9;i+) /处理小数数字处理小数数字 val=10*val+si-0; power*=10; number=sign*val/power; printf(nnumber=%fn, number); *例例 6.10 对对3行行4列的矩阵,找出在行上最列的矩阵,找出在行上最小小/大,在列上最大大,在列上最大/小小的元素的元素(马鞍点马鞍点)。若没有这样的元素,则打印出相应的信息。若没有这样的元素,则打印出相应的信息。 方一方一根据根据行上最行上最小小列上最大马列上最大马鞍点的定义,每行都可能有一鞍点的定义,每行都可能有一个个马马鞍点,故要逐

44、行查找;查找第鞍点,故要逐行查找;查找第i行行for(i=0;iM;i+)马马鞍点鞍点的过程序可分为两个步骤:的过程序可分为两个步骤:找出第找出第i行最小值的列位置行最小值的列位置k;判断第判断第i行第行第k列元素在第列元素在第k列是否最大。如果最大则是鞍列是否最大。如果最大则是鞍点;如果不是,则第点;如果不是,则第i行中无鞍点。这里判断是否为第行中无鞍点。这里判断是否为第k列最列最大值的方式:看是否在第大值的方式:看是否在第k列有比列有比aik大的值。大的值。运行结果:运行结果: Input string of a number: -234.55number=-234.550000第6章 数

45、组 YYHYYH版版#define M 3#define N 4#include void main( ) int aMN; /定义定义3行行4列矩阵列矩阵 int i,j,k,m,flag=0; printf(“nplease enter array(12个个) :n); for(i=0;iM;i+) /*双重循环输入双重循环输入3*4=12个数组元素个数组元素*/ for(j=0;jN;j+) scanf(%d,&aij); for(i=0;iM;i+) /对每行对每行 k=0; /初始设第初始设第i行第行第k列为该行最小列为该行最小 for(j=1;jN;j+) /*找第找第i行

46、的最小元素,行的最小元素,k为其列标为其列标*/ if (aijaik) k=j; /循环完后循环完后aik即为该行最小即为该行最小 定义循变定义循变i,j和列循变和列循变m、记列位置器记列位置器k、马鞍点标、马鞍点标记记flag(初设初设0表示无表示无)。第6章 数组 YYHYYH版版 方二方二行上最行上最大大列上最小马列上最小马鞍点鞍点#include void main() int a34, i, j, c, k, rmax, find; printf(The matrix is: n); for(i=0; i3; i+)/双重循环输入数据双重循环输入数据 for(j=0; j4; j+

47、) scanf(%d, &aij); for(m=0;maik) break; /若有元素比若有元素比aik大则下一行大则下一行 if (m=M) /若第若第k列无元素比列无元素比aik大大,该元素是鞍点该元素是鞍点, flag=1;printf(马鞍点马鞍点: a%d%d=%dn,i,k,aik); /且置且置flag为为1表示找到鞍点并输出表示找到鞍点并输出 if(flag=0) printf(“n无无马鞍点马鞍点. ”); /*整个矩阵不存在鞍点整个矩阵不存在鞍点, 输出输出“无无马鞍点马鞍点.” */因因m=M说明说明m=0;mM循环完后循环完后break未被执行未被执行过,即

48、第过,即第k列无元素比列无元素比aik大。大。注意:注意:对马鞍点是行对马鞍点是行最小列最大和行最大最小列最大和行最大列最小可能求出的元列最小可能求出的元素不同素不同(可和方二比较可和方二比较)第6章 数组 YYHYYH版版 find=0; i=0; /* find为为1,标志找到了鞍点标志找到了鞍点*/ while(i3 & (find= =0) /* 外循环查三行外循环查三行 */ rmax=ai0; c=0; /设马鞍点初始值设马鞍点初始值 for(j=1; j4; j+) if (rmaxaij) /*某行最大值某行最大值ramx, 所在列号所在列号c*/ rmax=aij; c=j; find=1; k=0; while(k3 & find=1) /内循环查内循环

温馨提示

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

评论

0/150

提交评论