实验四数组 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=0 j) printf("c";sr-ki);/*按字符进行输出* ②先排序,后输出 for(k=0; k 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=0;j--) printf("%c",str[k][j]); /* 按字符进行输出 */ } ② 先排序,后输出。 for(k=0;k 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 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,转向① 继续执行; ④若cha 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,转向① 继续执行; ④若 cha[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);
printf("rEsult is: %s"S1) 〖指导〗 从定义字符数组的大小可知,应该把s2连接到s1的后面。将s2连接到sl 后面的算法步骤如下: ①确定sl的串尾位置,即 while(s1[]l=0)i++ ②将s2连接到s1后面,即 while(s2[]=0)sli++}=s2[++]; ③在sl的串尾加结束符(如果不加结束符,输出时可能在串的末尾有非法字 符),即 SI[=O 4-10程序S4-10C的功能是找出数组x中的最小值和次小值,并分别将其与x[o] 和ⅹ[]交换。调试程序,使其能够运行出正确的结果。 注意:不能增加行或删除行,也不能更改程序的结构 源程序S4-10C maino {intx[}={5,8,76,2,7,3,90,4} int i, t, m1=0. m2=0. min1=32767. min 2=32767 for(i=1;i<10;i++ if(xi]<min1) minz-min I; m2=m1; minI=x0]; ml=i else if(x[k<min2) i min2=x[i m2=1 t=x[O]; x[]=x[0]; xm1=t; t=x[l; x[m2]=x[1]; x[m2]=t for(i=1;i<10;i++) pr getch0: 〖指导〗 最好采用分段检查的方法,确定岀错的范围。该程序的调试中要注意数组元 素的正确使用,正确地交换和正确地输出
6 printf("\nResult is:%s",s1); getch(); } 〖指导〗 从定义字符数组的大小可知,应该把 s2 连接到 s1 的后面。将 s2 连接到 s1 后面的算法步骤如下: ①确定 s1 的串尾位置,即 while(s1[i]!='\0') i++; ②将 s2 连接到 s1 后面,即 while(s2[j]!='\0') s1[i++]=s2[j++]; ③在 s1 的串尾加结束符(如果不加结束符,输出时可能在串的末尾有非法字 符),即 s1[i]='\0'; 4-10 程序S4-10.C的功能是找出数组x中的最小值和次小值,并分别将其与x[0] 和 x[1]交换。调试程序,使其能够运行出正确的结果。 注意:不能增加行或删除行,也不能更改程序的结构, 源程序 S4-10.C main() { int x[]={5,8,7,6,2,7,3,9,0,4}; int i,t,m1=0,m2=0,min1=32767,min2=32767; for(i=1;i<10;i++) if(x[i]<min1) { min2=min1; m2=m1; min1=x[i]; m1=i; } else if(x[i]<min2) { min2=x[i]; m2=i; } t=x[0];x[m1]=x[0];x[m1]=t; t=x[1];x[m2]=x[1];x[m2]=t; for(i=1;i<10;i++) printf("%3d",x); getch(); } 〖指导〗 最好采用分段检查的方法,确定出错的范围。该程序的调试中要注意数组元 素的正确使用,正确地交换和正确地输出
*4-11编写程序S4-11C,模拟用户注册和登录的过程,登录时要进行身份 验证。(注有“*”的实验题可以选做) 〖指导〗 (1)用户注册通常是输入用户名和密码,以及一些个人资料,注册成功后给 予“注册成功!”的提示信息。用户以后登录时只需输入用户名和密码。 (2)可以用分支语句实现菜单的选择。例如,显示界面: 注册 2登录 0退出 请选择(0~2): (3)输入信息可以用数组存放
7 *4-11 编写程序 S4-11.C,模拟用户注册和登录的过程,登录时要进行身份 验证。(注有“*”的实验题可以选做) 〖指导〗 (1) 用户注册通常是输入用户名和密码,以及一些个人资料,注册成功后给 予“注册成功!”的提示信息。用户以后登录时只需输入用户名和密码。 (2) 可以用分支语句实现菜单的选择。例如,显示界面: 1 注册 2 登录 0 退出 请选择(0~2): (3) 输入信息可以用数组存放