1
实验三 控 制 结 构
3-1 阅读下面程序(S3-1.C),说明该程序的功能,写出执行过程及结果。
源程序S3-1.C
#include "stdio.h"
main()
{
int day;
printf ("请输入要查询的星期:\n");
scanf ("%d",&day);
if (day==1)
printf("上午:英语,数学,政治,体育 下午:法律\n");
else if (day==2)
printf("上午:物理,计算机,美术 下午:音乐\n");
else if (day==3)
printf("上午:英语,数学,语文 下午:锻炼\n");
else if (day==4)
printf("上午:计算机,物理,形势 下午:班会\n");
else if (day==5)
printf("上午:写作,实习 下午:听力\n");
else if (day==6 ||day==7)
printf("休息\n");
else
printf("非法输入\n");
}
3-2 将程序S3-1.C用switch语句改写并实现。
〖指导〗
(1) 在switch语句中,case 后面只能是一个常量。不能将switch语句表示为:
switch(day)
{ case day==1: printf("上午:英语,数学,政治,体育 下午:法律
\n");
case day==2: printf("上午:物理,计算机,美术 下午:音乐\n");
case day==3: printf("上午:英语,数学,语文 下午:锻炼\n");
……
}
(2) 下面程序段中switch语句中的case后面的表示都是错误的。
int x;
2
scanf("%d",&x);
switch(x)
{ case x:
case x+1:
case x+2:
}
3-3 求水仙花数。如果一个3位数的个位数、十位数和百位数的立方和等于该
数自身,则称该数为水仙花数。编程(S3-3.C)求出所有水仙花数,并写
出输出结果。
〖指导〗
该算法的描述如下:
①假设a,b,c分别为一个3位数x的个位、十位和百位上的数,那么,当
a
3
+b
3
+c
3
=x时,称x为水仙花数。
3②位数从100~999,要判断其中的每一个数是否是水仙花数,可以用循环
实现。
方法1:
for(n=100;n<=999;n++)
{ i=n/100; /* 取出n的百位数 */
j=n/10-i*10; /* 取数n的十位数 */
k=n%10; /* 取出n的个数 */
if(n==i*i*i+j*j*j+k*k*k)
printf("%d=%d^3+%d^3+%d^3\n",n,i,j,k);
}
方法2:
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
{ x= a*100+b*10+c;
if(a*a*a+b*b*b+c*c*c==x)
printf("%d=%d^3+%d^3+%d^3\n",x,a,b,c);
}
3
3-4 如果程序的执行结果是:
* 1 2 3 4 5 6 7 8 9
1 1
2 2 4
3 3 6 9
4 4 8 12 16
5 5 10 15 20 25
6 6 12 18 24 30 36
7 7 14 21 28 35 42 49
8 8 16 24 32 40 48 56 64
9 9 18 27 36 45 54 63 72 81
试编写打印该九九乘法表的程序(S3-4.C)。
〖指导〗
把结果输出到屏幕上时,是按行输出的。首先输出第一行,然后再依次输
出下面各行。从第二行开始的输出结果是有规律可寻的。从第2行第2列开始的
输出结果是一个下三角形,下三角形就是一个九九乘法表。九九乘法表中的每个
数就是它所在的行号(对应第1行上的数)和列号(对应第1列上的数)相乘的
结果。
编程时,可以按以下步骤编写程序:
①输出第1行
printf(" * ");
for(i=1;i<=9;i++)
printf("%4d",i);
②用两重循环输出九九乘法表。先输出行号i,再输出该行的i个数
for(i=1;i<=9;i++)
{ printf("%4d",i);
for(j=1;j<=i;j++)
{ p=i*j;
printf("%4d",p);
}
注意:每输出一行都要换一次行,否则结果就输出在同一行上了。
3-5 阅读下面的程序(S3-5.C),试说明程序的功能和运行结果?
源程序S3-5.C
#include<stdio.h>
main()
{
int t,n,i,j,k;
4
static int count,sum;
printf("请输入一个短整型数: ");
scanf("%d",&n);
t=n;
do{
t/=10;
count++;
}while(t!=0);
t=n;
for(i=count;i>1;i--)
{ k=1;
for(j=1;j<i;j++)
k=k*10;
t=n/k;
n=n-k*t;
printf("%d%c",t, '+');
sum=sum+t;
}
sum+=n;
printf("%d=%d\n",n,sum);
}
〖指导〗
对于初学者来说,读程序时把一个具体的数据带入程序中去读,更便于程序
的理解。对于上面的程序,可以假设输入给n的数据为1234,然后再把1234带
到程序中去读。
对于程序S3-5.C,关键是要理解do-while循环语句和for循环语句的功能。
3-6 编写程序S3-6.C,实现用二分法求2x
3
-4x
2
+3x-6=0在-10~10之间的根。
〖指导〗
(1) 二分法的求根算法
①已知x1和x2分别为求值区间的两个端点。先求当前中点x0(即二分求
值区间):x0=(x1+x2)/2
②用if…else结构把f1与f2中与f0同号者以及对应的求值点用中点的相
关值迭代。
③在循环终端,系统自动检测误差条件式,如果为真,重复一次循环,直到
为假才终止。
(2) 算法实现的具体步骤
①输入x1,x2;
②根据2x
3
-4x
2
+3x-6计算f1和f2;
5
f1=2*x1*x1*x1-4*x1*x1+3*x1-6
f2=2*x2*x2*x2-4*x2*x2+3*x2-6
③计算x0和f0;
x0=(x1+x2)/2
f0=2*x0*x0*x0-4*x0*x0+3*x0-6
④判断,如果f0*f1<0,则x2=x0,f2=f0;否则x1=x0,f1=f0;
⑤如果fabs (f0)>=1e-5,转去执行③,否则执行⑥;
⑦输出方程的根。
3-7 完善程序S3-7.C。输入一串字符,以“#”符号作为输入结束标志,显示其中
字母和数字的个数,写出程序的执行过程和结果。
源程序S3-7.C
main()
{
char ch;
int ch_num, dig_num;
ch_num=dig_num=0;
do
{
} while (ch!= ′#′);
printf("The number of chars is%d。\n",ch_num);
printf("The number of digital is%d。\n",dig_num);
}
〖指导〗
给出的程序中有变量的定义和赋初值,有结果的输出。因此,要完善的是
do-while循环体中的内容,其算法实现步骤为:
①输入一个字符给ch;
②判断ch是否为字母,如果是字母,则ch_num++;如果是数值,则
dig_num++。
循环执行①和②,直到输入#,循环结束,程序输出结果。
提示:
判断ch是否为字母,可以用下面语句:
if((ch>=′A′)&&(ch<=′Z′)||(ch>=′a′)&&(ch<=′Z′))
判断ch是否为数字字符,可以用下面语句:
if ((ch>=′0′)&& (ch<=′9′))