实验5 数组程序设计 一、 实验目的 (1) 加强对数组特点的了解,掌握一维数组的定义、初始化及其使用方法。 (2) 掌握字符串的输入与输出方法,熟悉常用的字符串操作函数。 (3) 掌握二维数组的定义、初始化及其使用方法。 (4) 进一步熟悉数组应用程序的设计方法。 二、 实验内容 1. 一维数组的输入与输出练习 修改例51的程序,使其在逆序输出数据时只输出其中的偶数。 附: 例51源程序 #include int main() { int i,a[10];/* 定义a数组 */ printf("Input: "); for(i=0;i<10;i++) scanf("%d",&a[i]);   /* 输入a[0]、a[1]、a[2]、…、a[9] */ printf("Output: "); for(i=9;i>=0;i--) printf("%d ",a[i]);   /* 输出a[9]、a[8]、a[7]、…、a[0] */ return 0; } 2. 一维数组的初始化及应用练习 修改例53的程序,使Fibonacci数列的前20个数依次存储在fib数组的fib[1]到fib[20]这20个元素中。 附: 例53源程序 #include int main() { int fib[20]={1,1},i;   /* fib数组的初始化 */ for(i=2;i<20;i++) fib[i]=fib[i-1]+fib[i-2];   /* 第i项为其紧邻的前两项之和 */ for(i=0;i<20;i++)   /* 控制输出每个数值 */ { printf("%-10d",fib[i]);   /* 输出第i个数值 */ if((i+1)%5==0)   /* 每输出 5个数之后换行 */ printf("\n"); } return 0; } 3. 字符串的输入与输出练习 修改例54的程序,将输出字符串的操作改为由printf()函数实现。 附: 例54源程序 #include #define N 100 int main() { char str[N];   /* 定义字符数组str,用于存储字符串 */ printf("String: "); gets(str);   /* 输入字符串,存储到str数组中 */ printf("Result: "); puts(str);   /* 输出str数组中的字符串 */ return 0; } 4. 二维数组的练习 修改例510的程序,将数组的其他元素用0填充。 附: 例510源程序 #include int main() { int a[4][4]={{1},{6,1},{8,7,1},{9,5,3,1}};/* 部分元素的初始化 */ int i,j; for(i=0;i<3;i++) for(j=i+1;j<4;j++) a[i][j]=a[j][i];   /* 利用下三角元素填充上三角元素 */ for(i=0;i<4;i++)   /* 输出填充后的二维数组a */ { for(j=0;j<4;j++) printf("%4d",a[i][j]); printf("\n"); } return 0; } 5. 一维数组的应用 修改例511的排序程序,实现对N个实数的降序排序。 附: 例511源程序 #include #define N 10 int main() { int a[N],i,j,temp; printf("Input data: "); for(i=0;ia[j+1])   /* 相邻元素前者大、后者小时将两元素值交换 */ {temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;} printf("Result: "); for(i=0;i=0;i--) if(a[i]%2==0) printf("%d ",a[i]); 2) 程序调试 在调试程序时,所用测试数据应包含以下情况。 (1) 在输入数据时偶数、奇数随机排列。 (2) 输入的数据都不是偶数。 (3) 输入的数据都是偶数。 (4) 输入数据时首、尾数据是偶数。 (5) 输入数据时首、尾数据不是偶数。 为提高测试效率,在定义a数组时可以使用符号常量N,在调试程序时将N定义为一个较小的值。例如,可以用以下宏命令将N定义为5。 #define N 5 2. 一维数组的初始化及应用练习 1) 程序分析 (1) 与例53的程序相比较,本实验中的fib数组定义与初始化发生变化。在例53的程序中,Fibonacci数列的前20个数依次存储在fib数组的fib[0]到fib[19]这20个元素中,fib[0]和fib[1]分别被初始化为数列的前两个值。现要求将数列的前两个值存储在fib[1]和fib[2]中,其他值在fib数组中依次存储,fib[0]闲置不用。以下语句可实现数组的定义与初始化: int fib[21]={0,1,1} 因为fib[0]并未使用,初始化为任何数值都不会影响数列在fib数组中的存储。 (2) 注意fib数组的长度变化。新的fib数组的长度是21,用于存储Fibonacci数列的元素为fib[1]到fib[20]。 2) 参考程序 程序如下: #include int main() { int fib[21]={0,1,1},i;   /* fib数组的初始化 */ for(i=3;i<=20;i++) fib[i]=fib[i-1]+fib[i-2];   /* 第i项为其紧邻的前两项之和 */ for(i=1;i<=20;i++)   /* 控制输出每个数值 */ { printf("%-10d",fib[i]);   /* 输出第i个数值 */ if(i%5==0)   /* 每输出5个数之后换行 */ printf("\n"); } return 0; } 3. 字符串的输入与输出练习 1) 程序分析 以下两种方法都可输出存储在字符数组str中的字符串。 (1) 使用专门的字符串输出函数puts(),一般调用形式为puts(str)。 (2) 使用printf()函数,一般调用形式为printf("%s",str)。 本实验只需将程序中的puts(str)替换为printf("%s",str)即可。 2) 程序调试 (1) 运行程序,输入不含空格的字符串,观察并分析程序的执行结果。 (2) 运行程序,输入中间含有空格的字符串,观察并分析程序的执行结果。 (3) 运行程序,输入以空格开头的字符串,观察并分析程序执行结果。 (4) 运行程序,输入一个空字符串(直接按Enter键),观察并分析程序的执行结果。 3) 问题思考 向字符数组str输入字符串的常用方法有两种,一是使用专门的字符串输入函数gets(),一般调用形式为gets(str); 二是使用scanf()函数,一般调用形式为scanf("%s",str)。请读者修改程序,用scanf()函数实现字符串的输入,然后使用上面的一组数据调试、运行程序,观察并分析程序的执行结果。 4. 二维数组的练习 1) 程序分析 在例510的程序中使用以下代码填充上三角中的各元素值: for(i=0;i<3;i++) for(j=i+1;j<4;j++) a[i][j]=a[j][i];   /* 利用下三角元素填充上三角元素 */ 用0填充上三角的各元素值相对简单,只需将a[i][j]=a[j][i]修改为a[i][j]=0即可。 2) 问题思考 以下程序实现的功能与本实验的要求相同,请读者注意比较这两个程序的异同。对于程序中static的作用将在第6章介绍。 #include int main() { static int a[4][4]={{1},{6,1},{8,7,1},{9,5,3,1}}; /* 二维数组的初始化 */ int i,j; for(i=0;i<4;i++) /* 输出二维数组a */ { for(j=0;j<4;j++) printf("%4d",a[i][j]); printf("\n"); } return 0; } 5. 一维数组的应用 1) 程序分析 (1) 修改数组定义,将a数组定义为float型(或double型),数组的输入与输出格式也相应修改。 (2) 在例511的程序中由以下代码实现排序过程。 for(i=1;ia[j+1])   /* 相邻元素前大后小时将两元素值交换 */ { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } (3) 在上述代码中,加阴影的代码决定了排序结果为升序排序。若将其修改为a[j] #define N 100 int main() { int a[N],i,n,m,counter=0; int flag=1;/* 是否全部出列的标志 */ scanf("%d%d",&n,&m);   /* n个队员,报数到m者出列 */ for(i=0;in的数据,观察并分析程序结果。 (7) 执行程序,输入一组满足n>100的数据,观察并分析程序结果。 7. 综合实验二(鞍点问题) 1) 编程分析 (1) 使用逐行扫描的方法在二维数组中查找鞍点。 (2) 对于每一行,首先找出该行的最大值元素,然后看该元素在其所在的列上是否为最小值,若是,则找到一个鞍点。 (3) 找到鞍点后输出元素值及其所在的行、列值。 2) 参考程序 程序如下: #include #define M 3 #define N 4 int main() { int a[M][N],i,j,k; printf("请输入二维数组的数据: \n"); for(i=0;ia[i][k]) k=j;   /* k记录当前的较大值所在列号 */ for(j=0;j int main() { float max(float,float);/* 函数声明 */ float a,b,c; printf("a,b,c: "); scanf("%f,%f,%f",&a,&b,&c); printf("max=%f\n",max(max(a,b),c));   /* 函数调用 */ return 0; } float max(float x,float y)   /* 定义求两个数中较大数的函数 */ { float m; m=x>y?x:y; return m; } 3. 递归函数练习 参考例610,编写用递归方法求累加和的函数sum(),并调用它计算10!。 附: 例610计算累加和∑ni=1i的递归函数源代码 long sum(int n) { if(n<0) return -1; else if(n==0) return 0; else if(n==1) return 1; else return sum(n-1)+n; } 4. 数组元素作函数参数练习 按以下要求修改例612的程序。 (1) 修改判断素数函数prime(),使得k为素数时函数返回值为0,k不是素数时函数返回值为1。 (2) 在主函数中调用修改后的prime(),求一个自然数数组中的素数。 附: 例612源程序 #define N 10 #include #include int main() { int prime(int);   /* 判断素数函数 */ int i,natural[N];   /* 定义整数数组 */ printf("Data: "); for(i=0;i