实验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<stdio.h> 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<stdio.h> 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<stdio.h> 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<stdio.h> 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<stdio.h> 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<stdio.h> 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 -