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) 输入信息可以用数组存放。