实验四数组 4-1编写程序S4-1C。计算 fibonacci数列的前15个数,并将其存放到一维数 组f中,然后输出结果。 〖指导〗 (1) fibonacci数列具有以下特点:它的第一和第二个数分别是0和1,从第三 个数开始每个数是它前面两个数之和,如0112358132134 (2)用数组实现,即k}-tk-1}+k-2](k=2,…,14),因此可以用循环实现 fibonacci数列前15个数的计算 4-2读程序S4-2.C,说明程序的功能和输出结果,然后执行程序,验证结果的 正确性。 源程序S4-2C inta[B3][4}={4,6,3,-7},{5,2,7,-4},{8,6,4,-1} Int min, p,1,J; for(i=0<=2;计++) min=abs(aj[oD for(=0; j<=3: j+ if(abs(aj[l<min) i min=abs(aj[D: printf("%d\t (%d, %d)n, ai[], i,p) 〖指导〗 程序输出的是a[i[p]ip(i=0,1,2)的结果,因此要理解a[jp]ip在程序中 分别代表什么? 4-3完善程序S4-3C,使其能输出如下图形。 **孝** 源程序S4-3C
1 实验四 数 组 4-1 编写程序 S4-1.C。计算 fibonacci 数列的前 15 个数,并将其存放到一维数 组 f 中,然后输出结果。 〖指导〗 (1) fibonacci 数列具有以下特点:它的第一和第二个数分别是 0 和 1,从第三 个数开始每个数是它前面两个数之和,如 0 1 1 2 3 5 8 13 21 34 …。 (2) 用数组实现,即 f[k]=f[k-1]+f[k-2](k=2, …,14),因此可以用循环实现 fibonacci 数列前 15 个数的计算。 4-2 读程序 S4-2.C,说明程序的功能和输出结果,然后执行程序,验证结果的 正确性。 源程序 S4-2.C main() { int a[3][4]={{4,6,3,-7},{5,2,7,-4}, {8,6,4,-1}}; int min, p, i, j; for (i=0;i<=2; i++) { min=abs(a[i][0]); p=0; for(j=0;j<=3;j++) if(abs(a[i][j])<min) { min=abs(a[i][j]); p=j; } printf("%d\t (%d,%d)\n", a[i][p],i,p); } } 〖指导〗 程序输出的是 a[i][p],i,p(i=0,1,2)的结果,因此要理解 a[i][p],i,p 在程序中 分别代表什么? 4-3 完善程序 S4-3.C,使其能输出如下图形。 * * * * * * * * * * * * * * * * * * * * * * * * * 源程序 S4-3.C
maino static char a[F(*, * i int ij, k; char space for(i=0;i<5;i++) 〖指导〗 图形由5行5列组成,每个字符“*之间有1~2个空格。已给程序中的变量 space存放的是一个空格字符,for循环语句用于控制输出图形的行数。循环体中 应该完善的内容是每行5个字符“*”的输出。步骤如下 ①首先输出每行前面的空格,每一行前面的空格数是不同的,呈递增的规 律,可以考虑用一个循环实现。例如: for(=1j<=3*ij++) /*每行输出的空格数不同*/ printf("%c", space); ②按字符输出每一行的5个字符“*。例如: for(k=0; k<5; k++) printf("%3c";ak]);/*按3个字符宽度输出字符“*”*/ 4-4用一维数组编写程序S4-4C。从键盘上输入由5个字符组成的一个字符串, 然后输出该字符串。要求用两种方法实现:①按字符逐个输入输出;②按 字符串输入输出 〖指导〗 (1)按字符输入输出时,需要用循环语句实现。例如: for(i=0;i<5;i++) /*循环输入,这种输入方法系统不会自动在字符 串末尾加串结束符* scanf("%c", &str[iD); / str[i]=getchar(; * /*循环输出*/ printf("%c", str[iD; /*s putchar(str[i]) 为了在程序运行过程中知道何时该输入,可以在循环输入前用pitf函数输 出一个提示信息,例如: print("逐个输入字符:") (2)按字符串输入输出时,不需要用循环语句实现。例如: scanf("%s",str) /*或gets(str);这种输入方法系统会自动在字 符串末尾加串结束符* printf("%s", str) /*或puts(st),*
2 main() { static char a[]={ ′*′,′*′,′*′,′*′,′*′}; int i,j,k; char space=′′; for(i=0;i<5;i++) { } } 〖指导〗 图形由 5 行 5 列组成,每个字符“*”之间有 1~2 个空格。已给程序中的变量 space 存放的是一个空格字符,for 循环语句用于控制输出图形的行数。循环体中 应该完善的内容是每行 5 个字符“*”的输出。步骤如下: ① 首先输出每行前面的空格,每一行前面的空格数是不同的,呈递增的规 律,可以考虑用一个循环实现。例如: for(j=1;j<=3*i;j++) /* 每行输出的空格数不同 */ printf("%c",space); ② 按字符输出每一行的 5 个字符“*”。例如: for(k=0;k<5;k++) printf("%3c",a[k]); /* 按 3 个字符宽度输出字符“*” */ 4-4 用一维数组编写程序 S4-4.C。从键盘上输入由 5 个字符组成的一个字符串, 然后输出该字符串。要求用两种方法实现:①按字符逐个输入/输出;②按 字符串输入/输出。 〖指导〗 (1) 按字符输入输出时,需要用循环语句实现。例如: for(i=0;i<5;i++) /* 循环输入,这种输入方法系统不会自动在字符 串末尾加串结束符 */ scanf("%c",&str[i]); /* 或 str[i]=getchar(); */ for(i=0;i<5;i++) /* 循环输出 */ printf("%c ",str[i]); /* 或 putchar(str[i]); */ 为了在程序运行过程中知道何时该输入,可以在循环输入前用 printf 函数输 出一个提示信息,例如: printf("逐个输入字符:"); (2) 按字符串输入输出时,不需要用循环语句实现。例如: scanf("%s",str); /* 或 gets(str); 这种输入方法系统会自动在字 符串末尾加串结束符*/ printf("%s", str); /* 或 puts(str); */
(3)注意养成良好的编程习惯。在需要的地方显示提示信息,通常在输入/ 输岀前显示提示信息会使程序运行过程和结果清晰、明确。 4-5用二维数组编写程序S4-5C。输入3个字符串,然后反向输出每个字符串 以及字符串的长度。 〖指导〗 (1)定义一个二维数组,输入3个字符串的方法如下: for(k=0; k<3; k+ gets(strkD) / 9 scanf("%s",str[k]);*/ 这里的strk]是二维数组的一维表示形式,代表一个地址值。 (2)可以用下面两种方法实现反向输出每个字符串 ①从每个字符串末尾的字符开始输出,直至输出到第一个字符为止。 for(k=0; k<3; k++) {i=0; while(str[kIi=10)i++; /*求字符串的长度* for(=i, j>=0 j) printf("c";sr-ki);/*按字符进行输出* ②先排序,后输出 for(k=0; k<3; k++) while(str[kJ[l=10)i++ for(=0j≤i2j++) /*排序*/ i ch=str[k[; str[k0=str(k[i-1-1 str(kJ[i-j-1=ch printi("ng% dth string is%sn"k+l,stk]),/*按字符串输出*/ 4-6程序S4-6C是查询某学生是否为该班学生的程序,试填空完成该程序 源程序S46C #include <stdio h> mal { char class[58}={"王小华","张三","赵四","向玲","丁一"} i, flag= char name [8] printi("请输入要查询的学生姓名:"); (name) for(i=0;i<5;i++) /*与初始化中的5个人进行比较*/
3 (3) 注意养成良好的编程习惯。在需要的地方显示提示信息,通常在输入/ 输出前显示提示信息会使程序运行过程和结果清晰、明确。 4-5 用二维数组编写程序 S4-5.C。输入 3 个字符串,然后反向输出每个字符串 以及字符串的长度。 〖指导〗 (1) 定义一个二维数组,输入 3 个字符串的方法如下: for(k=0;k<3;k++) gets(str[k]); /* 或 scanf("%s",str[k]); */ 这里的 str[k]是二维数组的一维表示形式,代表一个地址值。 (2) 可以用下面两种方法实现反向输出每个字符串 ① 从每个字符串末尾的字符开始输出,直至输出到第一个字符为止。 for(k=0;k<3;k++) { i=0; while(str[k][i]!='\0') i++; /* 求字符串的长度 */ for(j=i;j>=0;j--) printf("%c",str[k][j]); /* 按字符进行输出 */ } ② 先排序,后输出。 for(k=0;k<3;k++) { i=0; while(str[k][i]!='\0') i++; for(j=0;j<i/2;j++) /* 排序 */ { ch=str[k][j]; str[k][j]=str[k][i-j-1]; str[k][i-j-1]=ch; } printf("\n%dth string is %s\n",k+1,str[k]); /* 按字符串输出 */ } 4-6 程序 S4-6.C 是查询某学生是否为该班学生的程序,试填空完成该程序。 源程序 S4-6.C #include <stdio.h> main() {char class[5][8]={"王小华","张三","赵四","向玲","丁一"}; int i, flag=0; char name [8]; printf("请输入要查询的学生姓名:"); gets (name); for(i=0;i<5;i++) /* 与初始化中的 5 个人进行比较 */
if() printf("%s是这个班的。hn"name); printf("s不是这个班的。Ⅶn"name); 〖指导〗 (1)字符串的比较要用 strcmpo函数,不能用相等运算符=”进行比较 (2)程序中的变量fag是一个控制参数,用于控制输出结果,它的初始值为 0。当for循环中的if语句中的判断条件为真,fag的值被改变为1。由此可见 如果查找结束时,fag的初始值0没有被改变,说明查找不成功,否则(即fag 的值改变为1)查找成功。 4-7编写程序S4-7C。用二维数组实现输出下面的杨辉三角形(要求输出前10 行)。 l11111ln 4641 510105 〖指导〗 可以定义一个二维数组,将计算得到的杨辉三角形中的值存放到二维数组 中,最后再输出该二维数组中的下三角形 算法实现步骤如下 ①将二维数组前N(10)行的第1列和主对角线上的元素赋值为1 ②计算二维数组第i行第j列元素的值a[a[1j-1]+ai-1j],即 for(i=2; K<N; i++) a[j[]=a[-1忑-1]a[i-j] ③输出二维数组的下三角形 4-8从键盘上输入一个字符,用折半查找法找出该字符在已排序的字符串a中 的位置。若该字符不在a中,则打印“该字符不在a中”。试完善程序S4-8C。 源程序S48C include <stdio h maino
4 if ( )= =0) flag=1; if ( ) printf("%s 是这个班的。\n",name); else printf("%s 不是这个班的。\n",name); } 〖指导〗 (1) 字符串的比较要用 strcmp()函数,不能用相等运算符“==”进行比较。 (2) 程序中的变量 flag 是一个控制参数,用于控制输出结果,它的初始值为 0。当 for 循环中的 if 语句中的判断条件为真,flag 的值被改变为 1。由此可见, 如果查找结束时,flag 的初始值 0 没有被改变,说明查找不成功,否则(即 flag 的值改变为 1)查找成功。 4-7 编写程序 S4-7.C。用二维数组实现输出下面的杨辉三角形(要求输出前 10 行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ┇ ┇ 〖指导〗 可以定义一个二维数组,将计算得到的杨辉三角形中的值存放到二维数组 中,最后再输出该二维数组中的下三角形。 算法实现步骤如下: ①将二维数组前 N(10)行的第 1 列和主对角线上的元素赋值为 1; ②计算二维数组第 i 行第 j 列元素的值 a[i][j]= a[i-1][j-1]+a[i-1][j],即 for (i=2;i<N;i++) for(j=1;j<=i-1;j++) a[i][j]= a[i-1][j-1]+a[i-1][j]; ③输出二维数组的下三角形。 4-8 从键盘上输入一个字符,用折半查找法找出该字符在已排序的字符串 a 中 的位置。若该字符不在 a 中,则打印“该字符不在 a 中”。试完善程序 S4-8.C。 源程序 S4-8.C # include <stdio.h> main()
char a "abcdefklmnp",ch; printf("Input a cha n") scanf("%c, &ch) printf("ch=%cIn"ch); f(bot> top)print.("该字符不在a中n") 〖指导〗 字符数组a中有11个有序的字符,由程序中的语句的判断条件bot>top 可知,被查元素所在区域的下界为bot,上界为 top. ch为给定值,完善程序的 算法步骤为 ①计算中间位置mid=( bot+top)2 ②若ch=a[mid],则查找成功,输出ch在已排序的字符串a中的位置,跳出 循环; ③若ch>a[mid],则在区域mid+1-top内进行二分查找。bot=mid+1,转向① 继续执行; ④若ch<amd],则在区域bot-mid-1内进行二分查找。top=mid-1,转向① 继续执行。 上述过程的实现可以用下面的循环实现 for(bot=0,top=10bot=top,)/*数组a的第1个元素的下标为0,最后 1个元素下标为10*/ i mid=(top+bot)/2 if(ch=amid i printf("The position is %d\n", mid+1); break; j else if (ch>a mid bot=mid+ else top=mid-1 4-9不用 strato函数,将两个字符串连接起来,试完善程序S49C。 源程序S49C i char sl[80], s2[40: int 1=0, j=0 printf("Enter s1: " ) printf("Enter s2: scanf("%s", S2)
5 { char a[12]="abcdefklmnp",ch; int i, top,bot,mid; printf("Input a character \n"); scanf("%c",&ch); printf("ch=%c\n",ch); if (bot >top) printf("该字符不在 a 中\n"); } 〖指导〗 字符数组 a 中有 11 个有序的字符,由程序中的 if 语句的判断条件 bot >top 可知,被查元素所在区域的下界为 bot,上界为 top。ch 为给定值,完善程序的 算法步骤为: ①计算中间位置 mid=(bot+top)/2; ②若 ch=a[mid],则查找成功,输出 ch 在已排序的字符串 a 中的位置,跳出 循环; ③若 ch>a[mid],则在区域 mid+1~top 内进行二分查找。bot=mid+1,转向① 继续执行; ④若 ch<a[mid],则在区域 bot~mid-1 内进行二分查找。top=mid-1,转向① 继续执行。 上述过程的实现可以用下面的循环实现。 for (bot=0,top=10;bot<=top;) /* 数组 a 的第 1 个元素的下标为 0,最后 1 个元素下标为 10 */ { mid=(top+bot)/2; if(ch==a[mid]) { printf("The position is %d\n",mid+1); break; } else if (ch>a[mid]) bot =mid+1; else top=mid-1; } 4-9 不用 strcat()函数,将两个字符串连接起来,试完善程序 S4-9.C。 源程序 S4-9.C main() { char s1[80],s2[40]; int i=0,j=0; printf("Enter s1:"); scanf("%s",s1); printf("Enter s2:"); scanf("%s",s2);