


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 8 章 循环结构习题解答填空。题 8.1 】 C题 8.2 】 5*6=30 , 0题 8.3】 k=s=0 , aik*bkj , printf("n")题 8.4 】 17题 8.5 】 6题 8.6 】 c1!=' '&&c2=' '题 8.7 】 s=s+a/b, t=a , a=a+b, b=t题 8.8 】 不确定题 8.9 】 x>=0 x>max x<min题 8.10 】 2选择。题 8.11 】 B题 8.12 】 B题 8.13 】 C (答案 c 改为: c. 8,22 )题 8.
2、14 】 A题 8.15 】 CA)题 8.16 】 A (题目有错,如果将 if(x!>0) y=1; 这一行去掉,则答案为 题 8.17 】 B题 8.18 】 D编程。题 8.19 】 求两个正整数的最大公约数和最小公倍数#include <stdio.h> void main()int a,b,r,sa,sb; printf("Input two integer numbers:n"); scanf("%d%d",&a,&b);sa=a;sb=b; if(a<b)r=a;a=b;b=r;r=a%b;whil
3、e(r!=0)a=b;b=r; r=a%b;printf("The greatest common divisor:%dn",b); printf("The lowest common multiple:%dn",sa*sb/b); getch();【题 8.20】 判断输入的某个数是否为素数。若是,输出YES,否则输出 NO 。#include <math.h>void main()int i,x,yes,a;printf("Enter integer number:");scanf("%d",&am
4、p;x);yes=1;i=2;a=(int)sqrt(double)x);while(yes&&i<=a)if(x%i=0) yes=0;i=i+1;printf("%d ",x);if(yes)printf("YESn");elseprintf("NOn");getch();【题 8.21】 编写程序,统计某 C 源程序中标识符的个数 解:程序的关键是如何判断标识符。 由标识符定义知它由字母、 数字和下划线组成且第一个 字符不能是数字。 inword 变量记录当前字符的状态, inword=1 表示当前字符在标
5、识符内, inword=0 表示当前字符不在标识符内, inquota 变量记录当前字符是否在引号内 (设不考虑 引号嵌套的情况) ,本题只能由键盘输入若干行源程序。参考程序如下:#include <stdio.h> main() int c,num,inquota=0,inword=0;num=0;while (c=getchar()!=EOF) if ( (c=''')|(c='"') ) if (inquota=1) inquota=0;else inquota=1;else if ( !(c>='a')
6、&&(c<='z')|(c>='A')&&(c<='Z') |(c>='0')&&(c<='9')|(c='_') ) if (inword=1)&&(inquota=0) inword=0;num+;else if ( (inword=0)&&(inquota=0) if (!(c>='0')&&(c<='9') inword=1
7、; /* whle */ printf("num=%dn",num);题 8.22】设有十进制数字 a, b, c, d, e,求满足下列式子: abc*e=dcba (a 非 0,e 非 0 非 1)的最大的 abcd 。#include <stdio.h>main()int a,b,c,d,e,max=0,x,y,z;for(a=1;a<=9;a+)for(b=1;b<=9;b+) for(c=1;c<=9;c+) for(e=1;e<=9;e+)for(d=1;d<=9;d+)x=a*1000+b*100+c*10+d;y=d
8、*1000+c*100+b*10+a;z=x*e; if(z=y)&&(max<x)&&(a!=b)&&(b!=c)&&(c!=d) max=x;printf("nmax=%dn",max);【题 8.23】 打印高和上底均为 5 的等腰空心梯形。解:注意打印位置和行数、 列数的关系, 每行打印字符个数比上一行多 2。内容分为三部分, “* ”串、空格串、 “*”串。参考程序如下:#include <stdio.h>main() int s1,s2,s3; /* 三部分起始位置 */ int
9、n1,n2=0,n3=0;/* 三部分的长度 */int i,j;s1=10; n1=5; s2=s1+n1; n2=0; s3=s2+n2;for (i=1;i<=5;i+) for (j=1;j<s1;j+) putchar(' ');for (j=s1;j<s1+n1;j+) putchar('*');for (j=s2;j<s2+n2;j+) putchar(' ');for (j=s3;j<s3+n3;j+) putchar('*');putchar('n');if (i&l
10、t;4) if (i=1)n2=n1;elsen2=n2+2; s2=s1;s1=s1-1; n1=1; s3=s3+1; n3=1;else s1=s1-1; n1=n1+n2+n3+2;s2=s1+n1; n2=0;s3=s2+n2; n3=0;getch();【题 8.24】 用循环结构编写程序,计算 的近似值,公式如下:/4 1 1/3 + 1/5 1/7 + 直到最后一项的绝对值小于 10-6 为止。解:循环结构是这类近似计算常用的结构, 本题在循环时需要保持一个累计结果的变量, 每 次计算当前项时, 需要变号操作, 类似本题的结束控制使用 while 和 do_while 结构比较
11、合适。 注意当前项计算值和循环控制变量的关系,参考程序如下:#include <stdio.h>#include <math.h>main() float pi,t,n;int sign=1;pi=0.0; n=1.0; t=1.0;while (fabs(t) >= 1e-6) t=sign/n;pi+=t;n+=2;sign=-sign;pi=pi*4;printf("pi = %fn",pi);getch();【题 8.25】用牛顿迭代法求下面方程在 x=1.5 附近的根。2x3-4x2+3x-6 = 0解:牛顿迭代法先任意设定一个与真实
12、的根接近的值x0 作为第一次近似根, 由 x0 求出 f(x0) ,过( x0,f(x0) )点做 f(x) 的切线,交 x 轴于 x1,把它作为第二次近似根,再由 x1 求出 f(x1) , 过( x1,f(x1) )点做 f(x)的切线,交 x轴于 x2,把它作为第三次近似根 如此知道足够接近真 正的根 xn 为止。牛顿迭代公式为: x1=x0- f(x0)/f '(x0) 由于第一次近似根不可能取到真实的根,循环体至少执行一次,使用 do_while 循环结 构实现迭代较好。参考程序如下:#include <stdio.h>#include <math.h>
13、; main() double x1,x0,fd,f1;x0=1.5;do x1=x0; f1=(2*x1-4)*x1+3)*x0-6; fd=(6*x1-8)*x1+3;x0=x1-f1/fd; while(fabs(x1-x0)>=1e-5);printf("The root is %lfn",x0);【题 8.26】 一根长度为 133米的材料,需要截成长度为 19米和 23 米的短料,求两种短料 各截多少根时,剩余的材料最少?# include<stdio.h>void main()int a,b,n1,n2;float sum,temp; sum
14、=133;for(a=1;a<=133/19;a+) for(b=1;b<=133/23;b+) temp=133-a*19-b*23;if (temp>=0)&&(temp<sum) sum=temp; n1=a; n2=b; printf( “%f,%f ”,n1,n2); getch();【题 8.27】 某次大奖赛,有七个评委对参赛者打分,编写程序对一名参赛者,输入七个评 委对参赛者打出的评分数,去掉一个最高分和一个最低分,输出参赛者的平均分。#include<stdio.h>main()int i,a8,max,min,sum=0;
15、float aver;for(i=1;i<=7;i+) printf("please input the %dth score:",i); scanf("%d",&ai);sum=sum+ai;max=a1;min=a1;for(i=2;i<=7;i+)if (max<ai) max=ai;if (min>ai) min=ai;aver=(sum-max-min)/5;printf("the average:%f",aver);getch();30【题 8.28】 一位百万富翁遇到一陌生人,陌生人找他谈
16、一个换钱计划,该计划如下:我每 天给你十万元,而你第一天只需给我一分钱,第二天我仍给你十万元,你给我二分钱,第 三天我仍给你十万元, 你给我四分钱你每天给我的钱是前一天的两倍, 直到满一个月 天),百万富翁很高兴,欣然接受了这个契约。请编写一个程序计算这一个月中陌生人给了 百万富翁多少钱,百万富翁给陌生人多少钱。解:设变量 s 和 t (分别为 long 型)分别记录百万富翁给陌生人的钱和陌生人给百万富翁 的钱,第一天时:s=1( 以分为单位 )t=100000 (以元为单位)k=1;然后用 for 循环: 2 到 30,其循环体是:k=2k( 每天翻一倍 )s=s+kt=t+100000循环
17、体结束后将 s/100 ,将以分为单位转换为以元为单位。#include<stdio.h>main()long int i,s=1,k=1,t=100000;for (i=2;i<=30;i+)k=2*k;s+=k;t+=100000;printf("m give fu:%ldn",t);printf("fu give m:%ld",s/100);getch();【题 8.29】 以下程序是求矩阵 a,b 的乘积, a 为 3×2 型矩阵, b 为 2×2 型矩阵。先从键盘 输入矩阵 a 和 b的各个元素值,经过运算
18、后将结果存入矩阵c 中并按矩阵形式输出。#include<stdio.h>main()int i,j,k,s,a32,b22,c32; printf("please input 6 numbers for array a:"); for(i=0;i<3;i+)for(j=0;j<2;j+) scanf("%d",&aij);printf("please input 4 numbers for array b:"); for(i=0;i<2;i+)for(j=0;j<2;j+) scanf(&
19、quot;%d",&bij);for(i=0;i<3;i+) for(j=0;j<2;j+) for(k=s=0;k<2;k+) s+=aik*bkj; cij=s;for(i=0;i<3;i+) for(j=0;j<2;j+) printf("%6d ",cij); printf("n");getch();【题 8.30】 某人有 5张 2角和 4张 3角的邮票,使用这些邮票能组合出多少种不同面值的 邮资。解:使用全局数组保存邮资面值。这是典型的穷举实例, 2 角邮票和 3 角邮票的穷举范围为 5 张和
20、4 张,参考程序如下:#include <stdio.h>int a100;main() int i,j,k,s,n=0;for (i=0;i<=5;i+)for (j=0;j<=4;j+) s=i*2+j*3;for (k=0;ak!=0;k+)if (s=ak) break;if (ak=0&&s>0) ak=s;n+; printf("n%d kinds:",n); for (k=0;ak;k+) printf("%3d,",ak);题 8.31 】 设计函数,在二维数组中产生如下形式的杨辉三角形。11
21、 11 2 11 3 3 11 4 6 4 1解:扬辉三角形各行数据规律:( 1) 每行第一个和最后一个数都是 1( 2) 从第 3 行起,除第一和最后一个数外,其余的数都是上一行同列和前一列 两个数的和。定义函数,将扬辉三角形的数据保存在二维数组中。参考程序如下:#include <stdio.h>#define N 10void yanghui(int aN,int n) int i,j;for (i=0;i<n;i+) ai0=1; aii=1;for (i=2;i<n;i+)for (j=1;j<i;j+) aij=ai-1j-1+ai-1j;main()
22、 int i,j,n,aNN; printf("Enter n:"); scanf("%d",&n); yanghui(a,n);for (i=0;i<n;i+) for (j=0;j<=i;j+) printf("%d ",aij); printf("n");【题 8.32】 一个盒子中放有 12个球,其中 3个红的, 3个白的, 6个黑的,从中任取 8个 球,球共有多少种不同的颜色搭配。解:设任取红球个数为 i, 白球个数为 j, 黑球个数为 8-i-j, i、j、k 的不同组合既是所求的颜
23、 色搭配。参考程序如下:#include <stdio.h>main()int i,j,count=0;printf(" red white black:n");for (i=0;i<=3;i+)for (j=0;j<=3;j+)if (8-i-j)<=6)printf("%2d: %d %d %dn",+count,i,j,8-i-j);【题 8.33】 求不超过 1000 的回文素数。解:关键点是构造回文整数和判断素数,不超过 1000 的回文数包括两位和三位数,这里用 穷举法构造一个整数,并求出与其对应的反序数,两者相
24、同既是回文数。参考程序如下:#include <stdio.h>int prime(int n) int i;for (i=2;i<n/2;i+)if (n%i=0)return 0;return 1;main()int i,j,k,s,t;printf("Follow is output:n");for (i=0;i<=9;i+)for (j=0;j<=9;j+)for (k=0;k<=9;k+) s=i*100+j*10+k; t=k*100+j*10+i; if (i=0&&j=0)t/=100;else if (i
25、=0)t/=10;if (s>10 && s=t && prime(s)printf("%d ",s);【题 8.34】 自守数是指一个数的平方的尾数等于该数自身的自然数。如:762=5776,求出2000000 以内的自守数。自守数考虑积解:乘法运算中积是由乘数中的每一位和被乘数相乘的部分积相加后得到的,的最后几位(由数字位数决定) ,并不是每一个部分积的每一位都会对积的后几位有影响, 对积的后 n 几位产生影响的部分积为:第一个部分积:被乘数最后 n 位 * 乘数倒数第 1 位 第二个部分积:被乘数最后 n-1 位 * 乘数倒数第
26、2 位 第三个部分积:被乘数最后 n-2 位 * 乘数倒数第 3 位将以上部分积的后 n位求和后截取后 n 位就是 n位数乘机的后 n位。参考程序中 n 是所考虑 的自守数的可能范围, k 是 n 的位数, 循环中为截取被乘数的系数, kk 是截取部分积时的系 数, m用于累计部分积的最后 n位,i 是截取乘数相应位时的系数:#include <stdio.h>main()long i,k,kk,n,m;printf("Follow is output:n");for (n=0;n<2000000;n+) for (m=n,k=1;(m/=10)>0
27、;k*=10);kk=k*10;m=0;i=10;while (k>0) m=(m+(n%(k*10)*(n%i- n%(i/10)%kk;k/=10;i*=10;if (n=m)printf("%ld ",n);【题 8.35】 输入自然数 n,将 n 分解为质因子连乘的形式输出。例如,输入756,则程序显示为 756=2*2*3*3*3*7 。#include <stdio.h>main()int n,k=2,first=1;printf("Input n=");scanf("%d",&n);while(
28、k<=n)if(n%k=0)if(first)printf("%d=%d",n,k);first=0;else printf("*%d",k);n/=k;else k+; printf("n");getch();【题 8.36】 编写程序,输出以下图案:#include<stdio.h>main()int i,j,k;for (i=1;i<=4;i+) for(j=1;j<=20-i;j+) printf(" "); for(k=1;k<=2*i-1;k+) printf(&qu
29、ot;*"); printf("n"); for(i=3;i>0;i-) for(j=1;j<=20-i;j+) printf(" "); for(k=1;k<=2*i-1;k+) printf("*"); printf("n"); getch();【题 8.37】 求 Sn=a+aa+aaa+ +aaa a 的值。例如当 a=2,n=4 时, Sn=2+22+222+2222 。a 和 n 由键盘输入。#include<stdio.h>main()int a,n,i,t=0
30、,sn=0; printf("Enter a and n:"); scanf("%d,%d",&a,&n);for(i=1;i<=n;i+)t=t*10+a;sn+=t;printf("sn=%d",sn); getch();【题 8.38】 假定某地区 1996 年的人口为 12.3 亿人,求在人口增长率分别为 2% , 1.5% ,1% ,0.5% 时,该地区哪一年人口达到 13 亿?。#include<stdio.h>main()float ren,r;int i;ren=12.3;printf
31、(" 请输入增长率 :0.02,0.015,0.01,0.005 其中之一 n"); scanf("%f",&r);for (i=1997;ren<13;i+) ren=ren*(1+r);printf("%d 年 ,人口 :%f",i,ren);getch();【题 8.39】 一个数如果等于其每一个数字立方之和,则此数称为阿姆斯特朗数。如 407 就 是一个阿姆斯特朗数, 因为:407=43+03+73。要求输出 100到 999之间所有的阿姆斯特朗数。 #include<stdio.h> main()i
32、nt i,a,b,c;printf("The armstrong numbers betwin 100 and 999: "); for(i=100;i<=999;i+) a=i/100; b=(i-a*100)/10; c=(i-a*100-b*10); if(i=a*a*a+b*b*b+c*c*c) printf("%d ",i);getch();【题 8.40】 有一数字灯谜如下:A B C D- ) C D CABCD 均为一位非负整数,要求找出 ABCD 各值#include<stdio.h>main()int i,a,b,c
33、,d;for(a=0;a<=9;a+) for(b=0;b<=9;b+) for(c=0;c<=9;c+)for(d=0;d<=9;d+) if(a*1000+b*100+c*10+d)-(c*100+d*10+c)=(a*100+b*10+c) printf("a=%d, b=%d, c=%d, d=%dn",a,b,c,d);getch();【题 8.41】 打印九九乘法表。 分析:一般二维表格可用双重循环处理,输出。若要输出九九乘法表,只需设两个循环 变量 i 和 j 分别来控制行和列的输出即可。#include "Stdio.h&q
34、uot;int main(void)int i,j;for(i=1;i<10;i+) printf("%4d",i); printf("n n");for(i=1;i<10;i+) for(j=1;j<10;j+) if(j!=9) printf("%4d",i*j); else printf("%4dn",i*j); getch();【题 8.42】 计算 1! +2! +3 ! + +n!的值, n 值由键盘输入。#include "Stdio.h"main()int i,
35、j,n;double m,s=0; printf("Enter n:"); scanf("%d",&n);for(i=1;i<=n;i+) for(j=1,m=1;j<=i;j+) m*=j;s+=m; printf("result is: %g",s); getch();【题 8.43】 从键盘上输入若干个学生的成绩,当成绩小于等于 0 时结束输入。计算出平均 成绩,并输出不及格的成绩和人数。解:用输入负数表示输入结束。参考程序如下:#include <stdio.h>main() float sco
36、re200,ave,sum,x;int i,n,count; printf("Enter score:"); scanf("%f",&x); n=0; sum=0.0;while (x>0&&n<200) sum+=x;scoren+=x; scanf("%f",&x);ave=sum/n; printf("average= %fn",ave); for (count=0,i=0;i<n;i+)if (scorei<60) printf("%fn&q
37、uot;,scorei); count+; printf("%d not passn",count);【题 8.44】 下面是 5×5 的螺旋方阵,编程生成 n× n的螺旋方阵。1 234516 171819615 242520714 232221813 1211109解:本螺旋方阵的特点是顺时针排列从1开始的自然数, 圈数为 n/2 ,每一圈从左上角开始,产生的方阵数据放在 n×n的二维数组中,注意 4 个角点的下标控制和变化方向,参考 程序如下:#include <stdio.h>#define N 10void fun(int
38、 aN,int n) int i,j,k,m=1;for (i=0;i<=n/2;i+) for (j=i;j<n-i;j+) /* 从左向右 */aij=m+;for (j=i+1;j<n-i;j+) /* 从上向下 */ajn-1-i=m+;for (j=n-2-i;j>=i;j-)/* 从右向左 */an-1-ij=m+;for (j=n-2-i;j>=i+1;j-)/* 从下向上 */aji=m+;main() int i,j,n,aNN;printf("Enter n:");scanf("%d",&n);f
39、un(a,n);for (i=0;i<n;i+) for (j=0;j<n;j+)printf("%4d ",aij);printf("n");getch();【题 8.45】 约瑟夫环问题:编号为 1,2,3, ,n的 n个人按顺时针方向围坐一圈,每人持 有一个正整数密码。一开始任选一个正整数m 作为报数上限值,从第一个人开始按顺时针报数,报到 m 时停止,报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向的 下一个人开始重新从 1 报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺 序。解:设整型数组 a 中保存 n
40、个人的密码, 对应的人出列后, 数组元素置 0 作为标志。 顺时针 确定下一个人的方法,可将下标加1,再对 n 求余。参考程序如下:#include <stdio.h>#define N 100main() int a100;int i,j,m,n,k=0;printf("Enter n & m:");scanf("%d%d",&n,&m);printf("Enter code array :");for (i=0;i<n;i+)scanf("%d",&ai);printf("nOutput:n");for (i=0;i<n;i+) j=1;while (j<m) while (ak=0)/* 跳过已出列的人 */k=(k+1)%n;j+;k=(k+1)%n;while (ak=0) /* 跳
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论