c5第五章循环结构程序设计_第1页
c5第五章循环结构程序设计_第2页
c5第五章循环结构程序设计_第3页
c5第五章循环结构程序设计_第4页
c5第五章循环结构程序设计_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章循环结构程序设计C

语言程序设计

Lecture51附件:warningC4013:'getch'undefined;

assumingexternreturningint

警告信息的解决使用getch()函数需要添加头文件conio.h:

#include<conio.h>conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()、putch()函数等等。2附件:warningC4013:‘system’undefined;assumingexternreturningint

警告信息的解决使用system("cls")函数需要添加头文件stdlib.h:#include<stdlib.h>头文件stdlib.h里包含了C语言的一些常用的函数,如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。具体内容在VC++的include目录里面的stdlib.h头文件中。

3循环结构

LoopIterationRepetition

循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。在C语言中可以用以下语句来实现循环:1、用while语句;(“当”循环)2、用do--while语句;(“直到”循环)3、用for语句;(计数循环)45.1while语句

1、while语句常称为“当型”循环语句。

循环体!00表达式5

2、while语句的形式:

while(表达式)

循环体;特点:先判断表达式,后执行语句。说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:

while(1)

循环体;6#include<stdio.h>#include<conio.h>main(){

inti=0,sum=0;

while(i<100){ i++; sum+=i; }

printf("%d",sum);

getch();}例(ch5_01.c)求1+2+3+4+5+···+100。循环初值循环终值

循环条件循环体循环变量增值7例(ch5_02.c)显示1~10的平方#include<stdio.h>#include<conio.h>main(){

inti=1;

while(i<=10){

printf("%d*%d=%d\n",i,i,i*i); i++;}

getch();}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=10085.2do--while语句1、do--while语句常称为“直到型”循环语句。

循环体!00表达式92、do--while的形式:

do

循环体;

while(表达式);特点:先执行,后判断。说明:至少执行一次循环体do~while可转化成while结构例:用do~while求1+2+3+4+5+···+100#include<stdio.h>#include<conio.h>main(){

inti=0,sum=0;

do{ i++; sum+=i; }while(i<100);

printf("sum=%d",sum);

getch();}10

1.循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现。

2.循环体中应有使循环趋于结束的语句。例:分析下列二个程序段

使用循环结构要注意:inti=1;while(i<=10){

putchar('*');i++;}Inti=1;while(i<=10);

putchar(‘*’);

i++;11

当循环结构:main(){

inti,sum=0;

i=1; while(i<=100){ sum+=i;

i++;

}

printf(“%d\n”,sum);

getch();}

直到循环结构:main(){

inti,sum=0; i=1; do{

sum+=i; i++;

}while(i<=100);

printf(“%d\n”,sum);

getch();}12文字菜单演示程序#include<stdio.h>#include

<conio.h>main(){

charx;

do{

system("cls");

printf("_______________________________________________\n");

printf("||\n");

printf("|E--Exit|\n");

printf("||\n");

printf("|I--Insert|\n");

printf("||\n");

printf("|D--Display|\n");

printf("||\n");

printf("||\n");

printf("|CopyRight2008Mr./Miss.***|\n");

printf("|_______________________________________________|\n");

printf("ChooseEorIorD:"); x=getchar();}while(x!='E'&&x!='I'&&x!='D');

printf("Thatwas%c.\n\n",x);

getch();}13数字菜单演示程序#include<conio.h>#include<stdio.h>main(){

int

x,y;do{

system("cls");

printf("___________________________________________\n");

printf("| |\n");

printf("|E--Exit |\n");

printf("| |\n");

printf("|I--Insert |\n");

printf("||\n");

printf("|D--Display|\n");

printf("||\n");

printf("||\n");

printf("|CopyRight2008Mr./Miss.***|\n");

printf("|___________________________________________|\n");

printf("Choose0or1or2:"); y=scanf("%d",&x);

if(y!=1)

scanf("%c",&x);}while(x!=0&&x!=1&&x!=2);

printf("Thatwas%d.\n\n",x);

getch();}14输出结果是什么?S=5050#include<conio.h>#include<stdio.h>main(){

ints=0,i=1;

while(i<=100) s+=i++;

printf("S=%d\n",s);

getch();}

15输出结果是什么?#include<conio.h>#include<stdio.h>main(){

ints=0,i=1;

while(i++<100) s+=i;

printf("S=%d\n",s);

getch();}S=504916逗号运算符和逗号表达式

逗号运算符是双目运算符,其运算对象是表达式。

1.逗号运算符

对象数名称运算符运算规则运算对象结合性双目逗号

,依次计算前、后表达式表达式自左向右注意:由逗号运算符组成的式子是一个表达式,表达式的逗号值为最后分式的值。

2.逗号运算符的优先级任何运算符优先于逗号运算符17解答:20解释:逗号表达式求解过程自左至右,依次计算各表达式的值,“表达式n”的值即为整个逗号表达式的值。先求解a=3*5,得a=15;再求a*4=60;最后求解a+5=20,所以逗号表达式的值=20。

例1:

逗号表达式(a=3*5,a*4),a+5

的值main(){

int

i,t;i=(t=1,t=3,t=99,printf("t=%d\n",t));

printf("i=%d,t=%d\n",i,t);

getch();}例2:逗号表达式t=1,t=3,t=99,printf("t=%d\n",t)的值i=5,t=99185.3for语句1、C语言中最灵活、最复杂的循环语句;表达式1表达式2循环体语句表达式3可以用于循环次数确定的情况;可以用于循环次数不确定的情况;可实现while和do--while语句所有功能。非00192、for循环结构的形式:

for(表达式1;表达式2;表达式3)

循环体

其中:表达式1用于为循环变量赋初值,表达式2给出循环结束条件,表达式3是循环变量的增值语句。执行for语句时,先执行表达式1,然后判断表达式2是否成立,若成立,执行循环体内的语句,接下来执行表达式3,再判断表达式2是否成立,若成立,执行循环体内的语句,……直至表达式2不成立,跳出循环。循环变量赋初值循环终止条件循环变量控制20sum=0;

for(i=1;i<=100;i++) sum+=i;

它相当于以下语句:

sum=0;

i=1;

while(i<=100){

sum+=i;

i++;

}表达式1;While(表达式2){

语句;表达式3;}213、for语句中表达式的省略(1)for语句一般形式中的“表达式1”可以省略; 如: sum=0;i=1; for(;i<=100;i++)sum+=i;(2)表达式2省略,即不判断循环条件,循环无终止地进行下去; 如: for(sum=0,i=1;;i++){

sum+=i; }if(i>100)break;22(3)表达式3也可以省略,但此时保证循环能正常

结束。 如:for(sum=0,i=1;i<=100;){sum+=i;i++;

}(4)可以省略表达式1和表达式3,只有表达式2。 如:i=1;sum=0; i=1;sum=0; for(;i<=100;){ while(i<=100){sum+=i; sum+=i;i++;i++;

}}23(5)三个表达式都可省略,

如: for(;;)循环体;

相当于

while(1)循环体;

即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。 如: sum=0,i=1; for(;;){ if(i>100)break;sum+=i;i++;

}24(6)循环体为空语句对for语句,循环体为空语句的一般形式为:

for(表达式1;表达式2;表达式3);

如:for(sum=0,i=1;i<=100;sum+=i,i++); 又如:要在显示器上复制输入的字符,输入的字符为‘.’时,结束循环。

while(putchar(getchar())!=’.’); 输入abcdefg.输出abcdefg.25例4:#include<stdio.h>main(){inti=0;

for(;i<10;)

putchar(‘a’+(i++));}例3:#include<stdio.h>main(){inti=0;for(;i<10;putchar(‘a’+i),i++);

}例2:#include<stdio.h>main(){inti=0;

for(;i<10;i++)

putchar(‘a’+i);}例1:#include<stdio.h>main(){inti;for(i=0;i<10;i++)

putchar(‘a’+i);}以下4个例子的运行结果都是abcdefghij26例:写出程序的运行结果main(){inti;

clrscr();for(i=1;i<=5;i++)switch(i%5){case0:printf("/");break;case3:printf("*");break;case1:printf("+");break;case2:printf("-");

default:printf("\n");}}因为:1%5=1case1+2%5=2case2-

default3%5=3case3*4%5=4default

5%5=0case0/

运行结果是:+-

/27[例(分类统计)]

输入10个整数,计算其中有多少个奇数,多少个偶数和多少个零?思路:以下这一连串动作反复做10次(循环体)▲输入一个数字n▲判断n是否为0 (n1++)▲否则,判断n%2是否为1(n2++)▲否则,n%2必定为0 (n3++)相应的程序代码为for(i=1;i<=10;i++){scanf("%d",&n);if(n==0)n1++;elseif(n%2)n2++;elsen3++;}28main(){

inti,n,n1=0,n2=0,n3=0;

for(i=1;i<=10;i++){ printf("第%d个数字=",i); scanf("%d",&n);

if(n==0) n1++;

else

if(n%2) n2++;

else n3++; }

printf("\n其中有%d个偶数、%d个奇数、%d个零",n3,n2,n1); getch();}29main(){

int

i,t,n,n1=0,n2=0,n3=0;

for(i=1;i<=10;i++){

printf("The%dnum=",i);scanf("%d",&n); t=1*(n==0)+2*(n%2==1)+3*(n%2==0&&n!=0);

switch(t){

case1: n1++;break;

case2: n2++;break;

case3: n3++; }}

printf("\n其中有%d个偶数、%d个奇数、%d个零",n3,n2,n1);

getch();}30[例]输入一个整数,计算它的位数.并反向输出.分析:设一个数13579,一位一位地切下末位循环结束条件:num==0;同时计数count=count+1;1351357135797bitbit95bit13bit1bitbit=num%10num=num/10135791357135count=0;输入numnum!=0输出num%10count++num=num/10输出count31331main(){

longintnum;

int

x,count=0;

printf("Pleaseenteraninteger:\n");

scanf("%ld",&num);

do{ x=num%10; num=num/10; count++;

printf("%d",x);}while(num!=0);

printf(",%ddigits.",count);

getch();}

Pleaseenteraninteger:382992834digits.32Fibonacci数列1201年,意大利数学家Fibonacci发现了以他自己的名字命名的Fibonacci数列。他是在研究兔子的生长、繁殖规律中发现这一数列的。他对数列的研究是从一对刚刚出生的小兔子开始计算在n个月后将会有多少只兔子,他做了如下的假设: 1、新出生的小兔子在一个月的时间里发育为成年兔子; 2、每对成年兔子每月繁殖一对小兔子; 3、兔子没有死亡发生。用Fn代表n个月后兔子的对数。因为从一对新生的兔子开始,所以,F0=1,F1=1。这一对兔子在第二个月末生出另一对小兔子,从而F2=1+1=2。在第三个月末,第一对兔子将生下又一对小兔子,所以F3=2+1=3。用如下的表格表示前5个月每个月末兔子的数量: 月数 成年兔子的对数 新生兔子的对数 总数(对) 0 0 1 1 1 1 0 1 2 1 1 2 3 2 1 3 4 3 2 5 5 5 3 8

问题例(ch5_04.c)

:求fibonacci数列0,1,1,2,3,5,8,…的前20项。33分析:由于Fibonacci数列满足下面关系:F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n≥3)

a=1,b=1fori=1to10输出a,ba=a+bb=b+a

11235813‥a+bab+ab

a+bab+

ab‥‥34求fibonacci数列前20项的程序:

main(){

int

i,a=1,b=1,k=0;

for(i=1;i<=10;i++){printf("%10d%10d",a,b); a=a+b;b=a+b; k+=2; if(k%4==0)printf("\n"); } }112358132134558914423337761098735/Golden/index.htm(黄金分割主页)黄金分割率(GoldenSection)是一种数学比例关系,来源于Fibonacci级数中前后两个数的比值。由公元前六世纪古希腊数学家毕达哥拉斯发现,以严格的比例性、艺术性、和谐性,蕴藏着丰富的美学价值。应用时一般取0.618,用希腊字母φ表示这个值。

#include<math.h> main(){

inta=1,b=1,i=0; doublex,y=0;

clrscr(); do{ i++; x=y; a=a+b; b=a+b; y=(float)a/b;

printf("%d----%16.14lf\n",i,y);}while(fabs(y-x)>1e-8); }GoldenSection36[例]求分数数列 前20项之和。分析:▲对于该数列,可知:Xn+1=1+1/Xn得到递推公式X=1+1/X即,从X0=2就可以得到X1=1+1/X0=1.666667▲只要循环执行X=1+1/X就可以依次得到数列各项的绝对值。▲再利用标识符号f=1,f=-f的算法得到

数列各项的值f*x,则,s+=f*x就是数列的和。解法:main(){int

i,f=1;floatx=2,s=0;

for(i=1;i<=20;i++){ s+=f*x; x=1+1/x; f=-f;}

printf("sum=%10.6f",s);}运算结果是:sum=0.577922375.5continue语句break语句一般形式:break;功能:跳出所在的多分支switch语句跳出所在的while、do-while、for循环语句(提前结束循环)。continue语句一般形式:continue;功能:提前结束本次(本轮)循环体的执行,接着进行下一次循环条件的判别。38break语句main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);printf("%5d",i);}}main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);if(i==3)break;

printf("\n%d",i);}}

1122334455

11223当i=3时,结束循环39continue语句main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);printf("%5d",i);}}main(){inti;for(i=1;i<=5;i++){ printf("\n%5d",i);

if(i==3) continue;

printf("\n%d",i);}}

1122334455

112234455当i=3时,结束本次循环体的执行40for(e1;e2;e3){…if(e)continue;…}break与continue的区别for(e1;e2;e3){…if(e)break;…}计算e1e2语句…非00e非0语句…计算e30break语句0计算e1e2语句…非00e非0语句…计算e3continue语句循环体41[例](ch5_05.c)输出1~10中不是3的倍数的数。

main(){ intn; for(n=1;n<=10;n++) {if(n%3==0)break;

printf(“%d,”,n);} }输出:1,2,continue;输出:1,2,4,5,7,8,10,

不输出3的倍数的数字42(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}5.6

循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环嵌套循环的执行流程嵌套循环的跳转

禁止:从外层跳入内层跳入同层的另一循环(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环43

i:1~9

1 j:1~i 2 4 动作:显示j*i 3 69

……… ……....9 18 27 36 45 54 63 72 81ij例循环嵌套,输出九九表。44i<=9输出j*i假(0)真(1)i=1j++j=1j<=i真(1)假(0)换行动作

i++main(){

int

i,j;

for(i=1;i<=9;i++){

for(j=1;j<=i;j++)

printf("%2d*%-2d",j,i);

printf("\n");}

getch();}外循环内循环45(1)当外层循环结构每执行一次循环时,内层循环结构在一般情况下要从循环的开始到循环的正常结束从头到尾执行一遍。

例1(2)在内层循环结构中使用break语句可以提前结束本次内层循环结构的执行,而不影响外层循环结构的继续执行。 例2(3)对于并列的循环结构,控制循环执行的变量名字可以相同。在嵌套循环结构中,内、外层控制循环执行的变量名字不能相同。

例3

对于嵌套循环结构的几点说明:46

123412341234

123123123

例1:main(){

int

i,j;

for(i=0;i<3;i++){

for(j=1;j<=4;j++)

printf("%d",j);

printf("\n");}}

运行后输出:例2:main(){

int

i,j;

for(i=0;i<3;i++){for(j=1;j<=4;j++){printf("%d",j);if(!(j%3))break;}

printf("\n");}}运行后输出:47例3:

main(){

inti,j;for(i=0;i<3;i++)

printf("%d",i);

printf("\n");

for(i=1;i<=4;i++)

printf("%d",i);

}运行后输出:012123448for(i=1;i<=5;i++){for(j=1;j<=i;j++)

printf("");

printf("\n“);

}*for(i=1;i<=5;i++){for(j=1;j<=5-i+1;j++)

printf("");

printf("\n“);

}*for(i=1;i<=5;i++){for(j=1;j<5-i+1;j++)

printf("");}for(j=1;j<=i;j++){

printf("");

printf("\n");}*for(i=1;i<=5;i++){for(j=1;j<i;j++)

printf("");}for(j=1;j<=5-i+1;j++){

printf("");

printf("\n“);}**************************************************************************************143for(i=1;i<=5;i++){for(j=1;j<=5;j++)

printf("");

printf("\n“);

}*249分析:

行的控制i:1~9‘*’的个数j与当前行的关系:

j=2*i-1‘*’前面的空格k与行的关系:

开始时,第一行有8个空格每多一行,少一个空格k=9-iwhile(i<=9){ for(k=1;k<=9-i;k++)

输出空格; for(j=1;j<=2*i-1;j++)

输出*;}*********************************************************************************50main(){

inti,j,k;i=1;while(i<=9){for(k=1;k<=9-i;k++)

printf(“”);for(j=1;j<=2*i-1;j++)

printf(“*”);

printf(“\n”);i++;}}

i=1

i<=9k=1k<=9-i输出空格k=k+1j=1j<=2*i-1输出*j=j+1换行,i=i+151[综合例题]输入若干个整数(0表示结束),

求它们的总和、均值、最大值和最小值。main(){int

x,max,min,total=0,i=0;floatave=0.0;

printf("Inputaninteger,0toexit:\n");while(1){

scanf("%d",&x);

if(x==0){

ave=(float)total/i;

printf("Total=%d,Average=%f,Max=%d,Min=%d",total,ave,max,min);break; }

if(i==0)max=min=x;i++;total+=x;

if(x>max)max=x;

if(x<min)min=x;}}525.7

循环程序设计的问题

1、写循环,先要发现循环。注意计算中的重复性动

作,引进循环可能统一描述和处理。

重复动作的常见例子:

累积一批可按规律算出的数据(如累加等);反复从一个结果算出下一结果(递推等);对一批数据做同样的加工处理;等。2、写循环结构时要考虑和解决的问题:循环涉及哪些变量,引进什么临时性变量?这些变量在循环正式开始前应给什么初值?循环如何开始?每次循环中变量的值应如何改变?什么情况下继续循环,什么情况下终止循环?循环终止后如何得到所需结果?53循环中的几种变量

循环中常出现几类变量,了解这些有助于思考和分析。这也是写循环程序的经验总结。

1)循环控制变量(循环变量):循环前设初值,循环递增/递减,达到/超过界限时循环结束。控制循环的进行/结束。for中常有这类变量。

for(n=0;n<10;n++)...... for(n=2;n<52;n+=4)......2)累积变量:循环中常用+=或*=等更新。初值常用运算的单位元(加用0;乘用1为初值)。循环结束时变量终值被作为循环计算结果。3)递推变量:前两类变量的推广形式。复杂循环常用几个协同的变量,每次由一个/几个变量推出一个新值,其余依次更新。 对变量x1、x2、x3,循环体可能有序列: x1=x0...; x2=x1...; x3=...x1...x2...;54本章重点三种循环语句while,do---while和for求累加和累乘的典型算法建立循环通常有以下情况: 1.给定次数,for比较适用for(i=1;i<100;i++) 2.给定条件,while比较适用while((x+y)<z) 3.字符的情况通常以回车做结束符

while((c=getchar())!=‘\n’) 4.小经验:对于charnum,将字符变成数字i=num-’0’; 5.判断字符范围(c>‘a’&&c<‘z’)||(c>‘A’&&c<‘Z’)555.8程序举例[例]用/41-1/3+1/5-1/7+…的公式求的近似值,直到最后一项的绝对值小于10—6为止t=1,pi=0,n=1,f=1当|t|10-6pi=pi+tn=n+2f=-f;t=f/npi=pi*4输出pi#include<math.h>main(){

intf;floatn,t,pi;t=1;pi=0;n=1.0;f=1;

while(fabs(t)>=1.0e-6){pi=pi+t;n=n+2;f=-f;t=f/n;}pi=pi*4;

printf("pi=%10.6f\n",pi);

getch();}56[例]梯形法求数值积分。0yxaa+ha+iha+(i+1)hbf(x)f(x)=(4-x2)dxba

∫57main(){

floata,b,h,n1,n2,s=0;

inti;

printf("请输入积分下限a:");

scanf("%f",&a);

printf("请输入积分上限b:");

scanf("%f",&b); h=(b-a)/1000;

for(i=0;i<1000;i++){ n1=4-(a+i*h)*(a+i*h); n2=4-(a+(i+1)*h)*(a+(i+1)*h); s+=(n1+n2)*h/2;}

printf("s=%10.2f\n",s);

getch();}58牛顿迭代法(牛顿切线法)求解相应的递推公式(迭代函数)为

牛顿迭代法有很明显的几何意义:59[例]

给定α,用牛顿迭代法求x=取为解方程x2-α=0在[0,+∞)上的实根由牛顿迭代公式则得到60取变量x=0,x1=1为初值,f,f1为f(x)和f’(x)a为输入#include<math.h>main(){

float

a,x=0,x1=1,f,f1;

printf("\nInputa=");

scanf("%f",&a);

while(fabs(x1-x)>1e-5){ x=x1; x1=0.5*(x+a/x); } printf("sqrt(%.2f)=%f\n",a,x1);

printf("f(%f)=%.10f\n",x1,x*x-a);

getch();}`61*************

本例还是要考虑每行的空格数、和星号数问题,但要关注空格数与星号数在增加到一定的时候又要减少的规律。[例]用循环语句显示下面的图案。62for(i=0;i<4;i++){for(j=0;j<20-i;j++)printf(“”);/*空格递减*/for(k=0;k<2*i+1;k++)printf(“*”);/*星号递增*/}

#include<math.h>main(){inti,j,k;for(i=-2;i<=2;i++){ for(j=1;j<=18+fabs(i);j++)

printf("");

for(k=1;k<=5-2*fabs(i);k++)

printf("*");

printf("\n");}}fabs(i)变化规律是:2,1,0,1,2。

每行的空格数是:20,19,18,19,20。每行的星号数是:1,2,3,2,1。注意初终值从-2到2的目的。63随机数rand()和种子srand()随机函数rand()产生[0,32767)区间的一个整数。

必须使用#include<stdlib.h>随机种子函数srand(time(0))产生一个以当前累计秒为参数的随机序列起始值(”种子”,seed)。系统常变量RAND_MAX

为32767,

是rand()的上限值。公式rand()/(float)RAND_MAX

产生区间[0,1)的随机小数。公式rand()/(float)RAND_MAX*(m-n+1)+m

产生闭区间[m,n]的随机整数。64/*公式rand()/(float)RAND_MAX*(m-n+1)+m产生闭区间[m,n]的随机整数。*/#include<stdlib.h>main(){

int

i,x,n; srand(time(0));

printf("n=");

scanf("%d",&n);

for(i=0;i<n;i++){ x=rand()/(float)RAND_MAX*3+6;//产生[6,8]随机数

printf("%d",x); }

getch();}65例:MonteCarlo法从定义求π值已知总投掷次数J,其中落入赢区(1/4单位圆)内K次。

由于点(x,y)的随机均匀分布性,可以认为:

落在¼圆内点数K与(落在正方形内的)总点数J之比

应等于它们的面积比。

而根据π的定义,¼单位圆面积是1/π。所以有:

点(x,y)落在¼圆内的条件是:

随机数发生器函数:rand()

功能:产生[0,32767)区间的一个随机整数。66#include<stdlib.h>main(){

int

j,i=1,k=1;

float

x,y; srand(time(0));

printf("InputJ=");

scanf("%d",&j);

while(i<=j){ /*产生一对[0,1)的随机数(x,y)*/ x=rand()/32767.0; y=rand()/32767.0;if(x*x+y*y<1.0)k++;i++; }printf("PI=4.0*%d/%d=%f\n",k,j,4.0*k/j);

getch();}67分析:这是一个不定方程: 鸡翁:可能有1只、2只、…、20只,设为x 鸡母:可能有1只、2只、…、33只,设为y 鸡雏:可能有3只、6只、…、300只,设为z只要将上述的数集按条件x+y+z==100和5x+3y+z/3==100同时成立进行三重遍历,就可以求出所有的解。枚举法或称为穷举法、遍历法。一般用于不定方程求非负整数解的问题。它将方程中未知数可以取的到的非负整数逐个进行验证找出所有满足方程的解。百钱百鸡问题鸡翁壹,钱值伍;鸡母壹,钱值叁;鸡雏叁,钱值壹。何以百钱买百鸡?68百钱百鸡问题程序如下:main(){

int

x,y,z;for(x=1;x<=20;x++)for(y=1;y<=33;y++)for(z=3;z<=300;z+=3)

if(x+y+z==100&&x*5+y*3+z/3==100)

printf("\nx=%d,y=%d,z=%d",x,y,z);

getch();}百钱百鸡问题结果为:

x=4,y=18,z=78

x=8,y=11,z=81

x=12,y=4,z=8469百钱百鸡问题的优化解法:由于x+y+z=100,即z=100-x-y。那么对于: 鸡翁:可能有1只、2只、…、20只,设为x 鸡母:可能有1只、2只、…、33只,设为y则只要将上述的数集按条件

(100-x-y)%3==0

5x+3y+(100-x-y)/3==100进行二重遍历,就可以求出所有4组解.70修改的程序如下:#include<stdio.h>main(){intx,y,z;system("cls");for(x=1;x<=20;x++)for(y=1;y<=33;y++) if((100-x-y)%3==0&&x*5+y*3+(100-x-y)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论