学习笔记:顺序分支循环的综合应用

学习笔记:顺序分支循环的综合应用

在学习过顺序结构、分支结构及循环结构后,我们将他们综合起来,训练编程思维,解决实际问题

例一:蒙特卡罗(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+1x/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;
}

以上是最后一根火柴游戏程序的源代码,人可以决定谁先开始,计算机会根据剩余数量决定每次取火柴的个数,当人类先开始时,计算机必赢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值