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′))