实验7数组 7.1一维数组 【实验目的】 1. 熟练掌握一维数组的定义和引用: 2.熟练掌握一维数组元素的初始化方法: 3. 熟练掌握一维数组的处理方法。 【相关知识点】 1.一维数组定义的一般格式: 一维数组定义的一般格式为: 类型说明符数组名数组长度]: 示例: int a[10]; /体定义一个一维数组a,共10个元素,每个元素都为整型*/ float k[5]; *定义一个一维数组k,共5个元素,每个元素都为单精度浮点型 一维数组定义要注意: (1)数组名必须为合法的标识符: (2)数组长度表示所定义数组的元素的个数,必须为整型常量表达式,不能为变量: (3)系统自动为数组分配连续的内存空间。空间大小为:数组长度×该类型数据在内存 所占用空间。 一维数组元素引用形式为: 数组名[下标] 下标可以是整型表达式,下标范围为0至数组长度-1。数组元素在内存中按下标递增的顺 序存放。 -114-
实验 7 数组 7.1 一维数组 【实验目的】 1. 熟练掌握一维数组的定义和引用; 2. 熟练掌握一维数组元素的初始化方法; 3. 熟练掌握一维数组的处理方法。 【相关知识点】 1. 一维数组定义的一般格式: 一维数组定义的一般格式为: 类型说明符 数组名[数组长度]; 示例: int a[10]; /*定义一个一维数组 a,共 10 个元素,每个元素都为整型*/ float k[5]; /*定义一个一维数组 k,共 5 个元素,每个元素都为单精度浮点型 */ 一维数组定义要注意: (1)数组名必须为合法的标识符; (2)数组长度表示所定义数组的元素的个数,必须为整型常量表达式,不能为变量; (3)系统自动为数组分配连续的内存空间。空间大小为:数组长度×该类型数据在内存 所占用空间。 一维数组元素引用形式为: 数组名[下标] 下标可以是整型表达式,下标范围为 0 至数组长度-1。数组元素在内存中按下标递增的顺 序存放。 - 114 -
2.一维数组的初始化方法: 一维数组的赋值可以在定义数组的同时完成,也可以定义完成后再赋值。在定义数组的 同时为元素赋值就是初始化赋值方法。 示例: inta[5]={2,4,6,8,10} inta[5]={2,4}: 初始化数组时,可以为全部元素赋值,也可以为部分元素赋值。部分赋值时未被赋值的 元素其初值为0。初始化时数据的个数不能超过数组长度。 3.一维数组的处理方法: 一维数组定义完成后,常需要对数组的元素逐一进行各种处理操作,比如常见的输入输 出等,通常采用循环语句来完成。 (1)一维数组元素的输入方法。一般采用单层循环结构。 示例: int a[5],i; printf("请输入5个整数:"), for(i=0,i<5;i+) scanf"%d",&ali]); 循环语句中的循环变量取值范围为0至数组长度-1,如在此例中,ⅰ从0开始到4结束, 逐一表示了数组元素的下标,同时,每执行一次循环体语句,就从键盘输入数据元素),循 环结束后,实现了对数组所有元素的赋值。 (2)一维数组元素的输出方法。与输入的方法类似。 示例: inta5]={2,4,6,8,10: for(i=0;i<5,i++) printf("%5d",ai)月 通过该语句,可以逐一地将数组的所有元素a在屏幕上显示输出。 -115-
2. 一维数组的初始化方法: 一维数组的赋值可以在定义数组的同时完成,也可以定义完成后再赋值。在定义数组的 同时为元素赋值就是初始化赋值方法。 示例: int a[5]={2,4,6,8,10}; int a[5]={2,4}; 初始化数组时,可以为全部元素赋值,也可以为部分元素赋值。部分赋值时未被赋值的 元素其初值为 0。初始化时数据的个数不能超过数组长度。 3. 一维数组的处理方法: 一维数组定义完成后,常需要对数组的元素逐一进行各种处理操作,比如常见的输入输 出等,通常采用循环语句来完成。 (1)一维数组元素的输入方法。一般采用单层循环结构。 示例: int a[5], i; printf("请输入 5 个整数:"); for(i=0; i<5; i++) scanf("%d",&a[i]); 循环语句中的循环变量取值范围为 0 至数组长度-1,如在此例中,i 从 0 开始到 4 结束, 逐一表示了数组元素的下标,同时,每执行一次循环体语句,就从键盘输入数据元素 a[i],循 环结束后,实现了对数组所有元素的赋值。 (2)一维数组元素的输出方法。与输入的方法类似。 示例: int a[5]={2,4,6,8,10}; for(i=0; i<5; i++) printf("%5d",a[i]); 通过该语句,可以逐一地将数组的所有元素 a[i]在屏幕上显示输出。 - 115 -
【实验任务】 一、程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误,针对一维数组这一节,主要有如下问题: 1)数组定义中数组长度使用变量: 2)数组元素下标范围不清楚,常误认为下标从1开始,到数组长度结束: 3)数组元素赋值方法错误。 针对上面的问题,查找下面程序中存在的问题,并改正调试。 1.打开c:c-programming\7八pg710l.cpp,该程序有小问题,程序结果不正确。请修改,使 程序能正确运行。修改后的程序以pg7101 ok.cpp保存。该源程序内容如下: #include void main(void) int i,n=5; float fIn]; printf("请输入5个实数:")方 for(i=0;i<5;i++) scanf"%f",&f[i])店 printf"这5个数为:"); for(i=0;i<5,i+) printf("%6.If",fi]), printf"n")方 } 了提示:如何发现问题? 编译该程序,系统报告3个编译出错信息,如图7.1.1所示。这3条信息都指示程序第5 行有错误,都描述数组的定义中数组长度非法。C语言规定,数组长度必须是整型常量,而 为整型变量,即使该变量己经定义,并且为其赋值了整型常量5,仍然不能作为数组定义中的 数组长度。 -116-
【实验任务】 一、程序改错 该部分实验主要训练学生读简单程序的能力,并在理解程序的基础上,改正程序中出现 的问题,这些问题都是初学者经常容易犯的错误,针对一维数组这一节,主要有如下问题: 1) 数组定义中数组长度使用变量; 2) 数组元素下标范围不清楚,常误认为下标从 1 开始,到数组长度结束; 3) 数组元素赋值方法错误。 针对上面的问题,查找下面程序中存在的问题,并改正调试。 1.打开 c:\c-programming\7\pg7101.cpp,该程序有小问题,程序结果不正确。请修改,使 程序能正确运行。修改后的程序以 pg7101_ok.cpp 保存。该源程序内容如下: #include void main(void) { int i, n=5; float f[n]; printf("请输入 5 个实数:"); for(i=0; i<5; i++) scanf("%f",&f[i]); printf("这 5 个数为:"); for(i=0; i<5; i++) printf("%6.1f",f[i]); printf("\n"); } 提示:如何发现问题? 编译该程序,系统报告 3 个编译出错信息,如图 7.1.1 所示。这 3 条信息都指示程序第 5 行有错误,都描述数组的定义中数组长度非法。C 语言规定,数组长度必须是整型常量,而 n 为整型变量,即使该变量已经定义,并且为其赋值了整型常量 5,仍然不能作为数组定义中的 数组长度。 - 116 -
--Configuration:pg7101 Win32 Debug- Compiling.-. pg7181.cpp c:\c-programming\7\pg7101.cpp(5):error C2057:expected constant expression c:\c-programning\7\pg7101.cpp(5):error C2466:cannot allocate an array of constant size B c:\c-programming\7\pg7101.cpp(5):error C2133:'f':unknown size Error executing cl.exe. 口编译调赋入查我文件1人查我文件2入结果7 图7.1.1程序编译后的错误信息 改正程序后的运行结果示例如图7.1.2所示: 四"C:\e-programming\7\Debug\pg7l0lok.exe'回☒ 晴输入5个实数:5.23.67.42.59.1 这5个数为: 5.23.67.4 2.59.1 Press any key to continue 图7.1.2pg7101_ok.cpp的运行结果 2.打开c:lc-programming7八pg7102.cpp,该程序有小问题,程序运行结果不正确。请修改, 使之能正确运行。修改后的程序以pg7102ok.cpp保存。该源程序内容如下: #include void main(void) int a[5]; printf("请输入5个整数:"); for(i=1;i<=5;i++) scanf("%d",&ali]); printf"这5个数为:"); for(i=1;i<=5;++ printf("%4d",ali]), printf("n")方 了提示:如何发现问题? 编译、链接该程序,系统未报告任何错误信息。但是运行该程序,正确输入5个整数之 后,输出结果却出现问题:最后一个整数和原来输入的数据不一致。主要原因在于数组定义: -117-
图 7.1.1 程序编译后的错误信息 改正程序后的运行结果示例如图 7.1.2 所示: 图 7.1.2 pg7101_ok.cpp 的运行结果 2.打开 c:\c-programming\7\pg7102.cpp,该程序有小问题,程序运行结果不正确。请修改, 使之能正确运行。修改后的程序以 pg7102_ok.cpp 保存。该源程序内容如下: #include void main(void) { int a[5]; printf("请输入 5 个整数:"); for(i=1; i<=5; i++) scanf("%d",&a[i]); printf("这 5 个数为:"); for(i=1; i<=5; i++) printf("%4d",a[i]); printf("\n"); } 提示:如何发现问题? 编译、链接该程序,系统未报告任何错误信息。但是运行该程序,正确输入 5 个整数之 后,输出结果却出现问题:最后一个整数和原来输入的数据不一致。主要原因在于数组定义: - 117 -
int a[5]; 表示数组a有5个元素,分别为a0、a1小、a[2]、a[3]、a4。而在程序中对数组的输入 和输出操作中对这5个元素的引用是从[1]至a5],导致数组下标越界。由于C语言对这种情 况并不报告语法错误,所以编译链接都正常,但是结果却出现了错误。 改正程序后的运行结果示例如图7.1.3所示: G四"C:\c-programming\7八Debug\pg7l02ok.exe'▣☒ 请输入5个整数:1278368255 这5个数为:1278368255 Press any key to continue 图7.1.3pg7102_ok.cpp的运行结果 3.打开c:lc-programming7pg7103.cpp,该程序是用10个数据初始化数组,并输出。该 程序有一个小问题,请修改,使程序能正确运行。修改后的程序以Pg7103ok.cpp保存。该源 程序内容如下: #include void main(void) int i,array[10]; array={3,12,5,7,11,32,46,26,9,27} printf("数组各元素值依次为:n")方 for(i=0,i<10,i++) printf("%4d",array[i]), printf"n")方 } 了提示:如何发现问题? 编译该程序,系统报告程序第5行,即: array=={3,12,5,7,11,32,46,26,9,27}: 有语法错误。该语句希望为数组arry初始化l0个整数。但是初始化是指在定义数组的 同时为其赋值,而程序在第4行己经完成了数组的定义,之后再赋值就是对数组赋初值,而 -118-
int a[5]; 表示数组 a 有 5 个元素,分别为 a[0]、a[1]、a[2]、a[3]、a[4]。而在程序中对数组的输入 和输出操作中对这 5 个元素的引用是从 a[1]至 a[5],导致数组下标越界。由于 C 语言对这种情 况并不报告语法错误,所以编译链接都正常,但是结果却出现了错误。 改正程序后的运行结果示例如图 7.1.3 所示: 图 7.1.3 pg7102_ok.cpp 的运行结果 3.打开 c:\c-programming\7\pg7103.cpp,该程序是用 10 个数据初始化数组,并输出。该 程序有一个小问题,请修改,使程序能正确运行。修改后的程序以 pg7103_ok.cpp 保存。该源 程序内容如下: #include void main(void) { int i,array[10]; array={3,12,5,7,11,32,46,26,9,27}; printf("数组各元素值依次为:\n"); for(i=0; i<10; i++) printf("%4d",array[i]); printf("\n"); } 提示:如何发现问题? 编译该程序,系统报告程序第 5 行,即: array={3,12,5,7,11,32,46,26,9,27}; 有语法错误。该语句希望为数组 array 初始化 10 个整数。但是初始化是指在定义数组的 同时为其赋值,而程序在第 4 行已经完成了数组的定义,之后再赋值就是对数组赋初值,而 - 118 -
不是初始化,因此程序中第5行的赋值方式是C语言所不允许的。 改正程序后的运行结果示例如图7.1.4所示: 四"C:\e-programming\7八Debug\pg7l03ok.exe'回☒ 数组各元素值依次为: 3125711324626927 ress any key to continue 图7.1.4pg7103_ok.cpp的运行结果 二、程序扩展 1.打开c.lc-programming\7八pg7201.cpp,该程序能够将从键盘上输入的10个整数中的所 有正整数之和输出。该源程序内容如下: #include void main(void) int a,i; int sum=0; printf("请输入10个整数:"); for(i=0,i0)sum+=a; printf("所有正整数的和为%dn",sum; } 要求:修改上面的程序,将10个整数的存储改为用数组实现,并增加统计正整数个数的 功能。修改结果源程序以pg7201a.cpp保存。 训练要点:首先读懂源程序处理该问题的思路:通过循环结构,输入一个数据并立即处 理该数据,然后再输入一个数据又立即处理该数据…如此反复10次完成题目要求。现在要 求改用数组来实现,则可以将数据的输入和处理分离开:先通过一个循环语句完成数据的输 -119-
不是初始化,因此程序中第 5 行的赋值方式是 C 语言所不允许的。 改正程序后的运行结果示例如图 7.1.4 所示: 图 7.1.4 pg7103_ok.cpp 的运行结果 二、程序扩展 1.打开 c:\c-programming\7\pg7201.cpp,该程序能够将从键盘上输入的 10 个整数中的所 有正整数之和输出。该源程序内容如下: #include void main(void) { int a,i; int sum=0; printf("请输入 10 个整数:"); for(i=0; i0) sum+=a; } printf("所有正整数的和为%d\n ",sum); } 要求:修改上面的程序,将 10 个整数的存储改为用数组实现,并增加统计正整数个数的 功能。修改结果源程序以 pg7201a.cpp 保存。 训练要点:首先读懂源程序处理该问题的思路:通过循环结构,输入一个数据并立即处 理该数据,然后再输入一个数据又立即处理该数据……如此反复 10 次完成题目要求。现在要 求改用数组来实现,则可以将数据的输入和处理分离开:先通过一个循环语句完成数据的输 - 119 -
入,再通过一个循环语句完成对数据的处理。通过对比,体会使用数组的意义。 修改后程序的运行结果如图7.1.5所示。 ex "C:\c-programming\7\Debug\pg7201a.exe" 回 情输入18个整数:54-2111-87-1413-210 正整数共有6个,和为56 Press any key to continue 图7.l.5pg7201a.cpp的运行结果 2.打开c:lc-programming7八pg7202.cpp,该程序能够输出10个实型数据中最小的数以及 它在数组中的下标。该源程序内容如下: #include void main(void) int i,index; float m,a[10]; printf("请输入l0个实型数据:n")方 for(i=0:i<10;i++) scanf("%f",&ali]); index=0; m=a[0]: for(i=1;i<10;++) if(a[i]<m) { m-ali]; index=i; } printf("最小的数为%5.lf,其下标为%dn",m,index), } 要求:修改程序,使得程序能够将找到的最小的数与将数组中第一个元素交换位置。修 -120-
入,再通过一个循环语句完成对数据的处理。通过对比,体会使用数组的意义。 修改后程序的运行结果如图 7.1.5 所示。 图 7.1.5 pg7201a.cpp 的运行结果 2.打开 c:\c-programming\7\pg7202.cpp,该程序能够输出 10 个实型数据中最小的数以及 它在数组中的下标。该源程序内容如下: #include void main(void) { int i,index; float m,a[10]; printf("请输入 10 个实型数据:\n"); for(i=0; i<10; i++) scanf("%f",&a[i]); index=0; m=a[0]; for(i=1; i<10; i++) if(a[i]<m) { m=a[i]; index=i; } printf("最小的数为%5.1f,其下标为%d\n ",m,index); } 要求:修改程序,使得程序能够将找到的最小的数与将数组中第一个元素交换位置。修 - 120 -
改后的程序以pg7202a.cpp保存。 训练要点:读懂程序中找到数组中最小元素及其下标的算法思路,然后在源程序找到结 果的代码行后面增加一组交换语句,将第一个元素(a[0])与最小值元素(a[index])的位置交 换即可。 修改后程序的运行结果如图7.1.6所示。 ex "C:\c-programming\7\Debug\pg7202a.exe" 回 请输入16个实型数据: 12.5 6.8 14.7 52.6 31.7 4.6 17.2 8.5 64.1 25.9 交换位置后结果为: 4.66.814.752.631.712.517.28.564.125.9 Press any key to continue 图7.1.6pg7202a.cpp的运行结果 三、程序编写 1.编写程序,输入一个正整数n(5≤n≤20),再输入n个整数,采用冒泡排序法将这n 个整数按照由大到小的顺序输出。编写的源程序以pg7301.cpp保存。 提示:冒泡排序法的思路如下: (1)比较第一个数与第二个数,若逆序,则交换:然后比较第二个数与第三个数:依次 类推,直至第n-1个数和第n个数比较完为止一第一趟冒泡排序,结果最小的数被 安置在最后一个元素位置上: (2)对前n-1个数进行第二趟冒泡排序,结果使次小的数被安置在第n-1个元素位置: (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束。 训练要点:掌握最基本的排序算法程序的编写。 程序运行结果参考示例如图717所示。 a"C:\c-programming\7\Debug\pg7301.exe" 回☒ 请输入正整数的个数:7 请输/?个整数:23435212481938 7个整数由天到小顺序为:12452 433823198 Press any key to continue -121-
改后的程序以 pg7202a.cpp 保存。 训练要点:读懂程序中找到数组中最小元素及其下标的算法思路,然后在源程序找到结 果的代码行后面增加一组交换语句,将第一个元素(a[0])与最小值元素(a[index])的位置交 换即可。 修改后程序的运行结果如图 7.1.6 所示。 图 7.1.6 pg7202a.cpp 的运行结果 三、程序编写 1.编写程序,输入一个正整数 n(5≤n≤20),再输入 n 个整数,采用冒泡排序法将这 n 个整数按照由大到小的顺序输出。编写的源程序以 pg7301.cpp 保存。 提示:冒泡排序法的思路如下: (1)比较第一个数与第二个数,若逆序,则交换;然后比较第二个数与第三个数;依次 类推,直至第 n-1 个数和第 n 个数比较完为止——第一趟冒泡排序,结果最小的数被 安置在最后一个元素位置上; (2)对前 n-1 个数进行第二趟冒泡排序,结果使次小的数被安置在第 n-1 个元素位置; (3)重复上述过程,共经过 n-1 趟冒泡排序后,排序结束。 训练要点:掌握最基本的排序算法程序的编写。 程序运行结果参考示例如图 7.1.7 所示。 - 121 -
图7.1.7pg7301.cpp的运行结果 2.编写程序,为整型数组array输入10个元素,将其中最大和最小的数从数组中删除, 并按照原来顺序输出其余8个元素。编写的源程序以pg7302.cpp保存。 训练要点:数组中最值的查找,以及数组中元素的删除操作。 程序运行结果参考示例如图7.1.8所示。 国"C:\c-programming\7八Debug\pg7302,exe 回☒ 晴输入10个整数:23219567213422393362 其余8个数为:2321567213423362 Press any key to continue 图7.1.8pg7302.cpp的运行结果 7.2二维数组 【实验目的】 1.熟练掌握二维数组的定义和引用: 2.熟练掌握二维数组元素的初始化方法: 3. 熟练掌握二维数组元素的处理方法。 【相关知识点】 1.二维数组定义的一般格式: 二维数组定义的一般格式为: 类型说明符数组名[行长度][列长度]: 示例: inta3[4;/*定义一个二维数组a,3行4列,共12个元素/ 二维数组元素引用形式为: 数组名[行下标][列下标] 下标可以是整型表达式,行下标范围为0至行长度-1,列下标范围为0至列长度-1。 二维数组元素按先行后列的方式的顺序方式在内存中存放。 2.二维数组的初始化方法: 在定义二维数组的同时,为二维数组元素赋值,称为二维数组的初始化,具体形式有以 -122-
图 7.1.7 pg7301.cpp 的运行结果 2.编写程序,为整型数组 array 输入 10 个元素,将其中最大和最小的数从数组中删除, 并按照原来顺序输出其余 8 个元素。编写的源程序以 pg7302.cpp 保存。 训练要点:数组中最值的查找,以及数组中元素的删除操作。 程序运行结果参考示例如图 7.1.8 所示。 图 7.1.8 pg7302.cpp 的运行结果 7.2 二维数组 【实验目的】 1. 熟练掌握二维数组的定义和引用; 2. 熟练掌握二维数组元素的初始化方法; 3. 熟练掌握二维数组元素的处理方法。 【相关知识点】 1.二维数组定义的一般格式: 二维数组定义的一般格式为: 类型说明符 数组名[行长度][列长度]; 示例: int a[3][4]; /*定义一个二维数组a,3 行 4 列,共 12 个元素*/ 二维数组元素引用形式为: 数组名[行下标][列下标] 下标可以是整型表达式,行下标范围为 0 至行长度-1,列下标范围为 0 至列长度-1。 二维数组元素按先行后列的方式的顺序方式在内存中存放。 2.二维数组的初始化方法: 在定义二维数组的同时,为二维数组元素赋值,称为二维数组的初始化,具体形式有以 - 122 -
下两种: (1)分行初始化 示例: inta[3][4]={1,2,3,4},{5,6,7,8;,{9,10,11,12}; *全部元素初始化*/ intb[3][4]={1,2,3,4},{0,{9,10}: 体部分元素初始化*/ 这种初始化方法,通过内层的若干个将数据赋值给指定的行。可以全部元素赋值,也可 以部分元素赋值。示例中的部分元素初始化,只对b数组第0行的全部元素和第2行的前两 个元素赋初值,其余元素的初值为0。 (2)顺序初始化 示例: inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} 按照数组元素在内存中的存放顺序,将}内的数据依次赋值给元素。 3.二维数组元素的处理方法: 般说来,一维数组对元素的遍历操作,常采用单层循环结构来实现。二维数组则采用 双重循环结构来实现:外层循环变量控制行下标的变化,内层循环变量控制列下标的变化。 (1)二维数组元素的输入 示例: int a[3][4]; int ij; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf("%d",&a[i][j]); (2)二维数组元素的输出方法 示例: ita[3][4]={1,2,3,4},{5,6,7,83,{9,10,11,12} int ij; for(i=0:i<3:i++) { for(0=0j4;j+) -123-
下两种: (1)分行初始化 示例: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; /*全部元素初始化*/ int b[3][4]={{1,2,3,4},{},{9,10}}; /* 部分元素初始化*/ 这种初始化方法,通过内层的若干个{}将数据赋值给指定的行。可以全部元素赋值,也可 以部分元素赋值。示例中的部分元素初始化,只对 b 数组第 0 行的全部元素和第 2 行的前两 个元素赋初值,其余元素的初值为 0。 (2)顺序初始化 示例: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 按照数组元素在内存中的存放顺序,将{}内的数据依次赋值给元素。 3.二维数组元素的处理方法: 一般说来,一维数组对元素的遍历操作,常采用单层循环结构来实现。二维数组则采用 双重循环结构来实现:外层循环变量控制行下标的变化,内层循环变量控制列下标的变化。 (1)二维数组元素的输入 示例: int a[3][4]; int i,j; for(i=0; i<3; i++) for(j=0; j<4; j++) scanf("%d",&a[i][j]); (2)二维数组元素的输出方法 示例: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i,j; for(i=0; i<3; i++) { for(j=0; j<4; j++) - 123 -