学习笔记:顺序分支循环的综合应用
在学习过顺序结构、分支结构及循环结构后,我们将他们综合起来,训练编程思维,解决实际问题
例一:蒙特卡罗(Monte Carlo)方法——统计模拟
知识点一:符号常量
#define N 1000
定义符号常量,不可被赋值
知识点二:rand函数
x=(double)rand()/RAND_MAX; //0.000-1.000
rand()返回的是0-RAND_MAX之间的任意一个数,并且它是均匀分布
所以上式可以得到一个0-1的随机数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int i,boys,girls;
srand((unsigned)time(NULL));
for(i=1;i<1000000;i++)
{if(rand()%2==1)
boys++;
else
girls++;
if(rand()%2==1)
boys++;
else
girls++;
}
printf("boys=%d,girls=%d",boys,girls);
return 0;
}
上式中的srand((unsigned)time(NULL));一句生成随机数序列,以时间为种子可以利用系统时间来改变系统的种子值,即srand(time(NULL)),实现真正意义上的“随机”。
例二:奇偶归一猜想
输入一个数,当
x为奇数 | x为偶数 |
---|---|
3x+1 | x/2 |
如此循环下去,任何整数都可以循环到一
#include<stdio.h>
int main(void)
{
int i,num,tem,q;
printf("请输入要验证的正数\n");
scanf("%d",&i);
tem=i;
while(i!= 1)
{if(i%2==1)
{i=3*i+1;
q=i;
if(q>tem)
{tem=q;
}
}
else
{i=i/2;
q=i;
if(q>tem)
{tem=q;
}
}
printf("%d ",i);
num++;
}
printf("\n一共%d步",num);
printf("\n此数列中最大的是%d",tem);
return 0;
}
该程序可以计算出某数循环到一的路径、总步数及该路径上的最大的数。
例三:最后一根火柴游戏
知识点一:-=(减等于)
x-=y //x-=y <=> x=x-y
知识点二:do-while语句
do{ printf("请选择先开始的一方,人类请输1,计算机请输0:");
scanf("%d",&m);
}
while( m!=0 && m!=1 );
do-while语句的特点是先执行一遍语句,再看条件是否符合,如果符合就再循环执行语句,如果不符合就停止执行。通常可以和while、for语句互换使用。
知识点三:break
while(1)
{if(totalNUM==0)
{ printf("\n你赢了");
break;
}
}
break可以跳出当前循环,通常与if连用,即满足条件时,跳出当前循环。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int m ,totalNUM=30 ,HGNUM ,CGNUM ;//totalNUM=总共数量(剩余数量),HGNUM=人拿的数量,CGNUM=计算机拿的数量
srand((unsigned)time(NULL));
do{ printf("请选择先开始的一方,人类请输1,计算机请输0:");
scanf("%d",&m);
}
while( m!=0 && m!=1 );
while(1)
{ //以下是人类先开始的情况
if(m==1)
{
//人取
do{
printf("\n剩余%d根火柴,请输入你要取的火柴:",totalNUM);
scanf("%d",&HGNUM);
}
while(HGNUM<=0||HGNUM>2||totalNUM<HGNUM); //排除错误数据
totalNUM-=HGNUM;
if(totalNUM==0)
{ printf("\n你赢了");
break;
}
//计算机取
if(totalNUM%3==0)
{CGNUM=rand()%2+1;
}
else//即totalNUM%3!=0
{CGNUM=totalNUM%3;
}
printf("\n计算机取了%d根火柴。",CGNUM);
totalNUM-=CGNUM;
if(totalNUM==0)
{ printf("\n计算机赢了");
break;
}
}
//以下是计算机先开始的情况
if(m==0)
{ //计算机取
if(totalNUM%3==0)
{CGNUM=rand()%2+1;
}
else//即totalNUM%3!=0
{CGNUM=totalNUM%3;
}
printf("\n计算机取了%d根火柴。",CGNUM);
totalNUM-=CGNUM;
if(totalNUM==0)
{ printf("\n计算机赢了");
break;
}
//人取
do{
printf("\n剩余%d根火柴,请输入你要取的火柴:",totalNUM);
scanf("%d",&HGNUM);
}
while(HGNUM<0||HGNUM>2||totalNUM<HGNUM); //排除错误数据
totalNUM-=HGNUM;
if(totalNUM==0)
{ printf("\n你赢了");
break;
}
}
}
return 0;
}
以上是最后一根火柴游戏程序的源代码,人可以决定谁先开始,计算机会根据剩余数量决定每次取火柴的个数,当人类先开始时,计算机必赢。