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 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 (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个人进行比较 */ 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() 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); 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(); } 〖指导〗 最好采用分段检查的方法,确定出错的范围。该程序的调试中要注意数组元 素的正确使用,正确地交换和正确地输出。 7 *4-11 编写程序S4-11.C,模拟用户注册和登录的过程,登录时要进行身份 验证。(注有“*”的实验题可以选做) 〖指导〗 (1) 用户注册通常是输入用户名和密码,以及一些个人资料,注册成功后给 予“注册成功!”的提示信息。用户以后登录时只需输入用户名和密码。 (2) 可以用分支语句实现菜单的选择。例如,显示界面: 1 注册 2 登录 0 退出 请选择(0~2): (3) 输入信息可以用数组存放。