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