C语言程序设计CAP——C语言学习笔记(四) 下

4.2循环应用

循环计算

log2x


int x;
int ret = 0;

scanf("%d", &x);
while ( x > 1 ) {
    x /= 2;
    ret ++;
}
printf("log2 of %d is %d.", x, ret);

这个log2x错哪了?

小套路

int x;
int ret = 0;

scanf("%d", &x);
int t = x;              //计算之前先保存原始的值,后⾯面可能有⽤
while ( x > 1 ) {
    x /= 2;
    ret ++;
}
printf("log2 of %d is %d.", t, ret);

这些值是怎么定的?

int x;
int ret = 0;                          //为什么从0开始

scanf("%d", &x);
int t = x;            
while ( x > 1 ) {                     //为什么是>1
    x /= 2;
    ret ++;
}
printf("log2 of %d is %d.", t, ret);

计数循环

int count = 100;
while ( count >= 0 ) {
    cout --;
    printf("%d\n", count);
}
printf("发射! \n");

小套路:如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后作出判断。

•    这个循环需要执行多少次?
•    循环停下来的时候,有没有输出最后的0?
•    循环结束后,count的值是多少?

int count = 100;
 do{
    printf("%d\n", count);
    cout --;
}while ( count > 0 );
printf("发射! \n");

循环应用

猜数游戏

•    让计算机来想⼀一个数,然后让用户来猜,用户每输入一个数,就告诉它是大了还是小了,直到用户猜中为止,最后还要告诉⽤用户它猜了多少次。
•    因为需要不断重复让用户猜,所以需要用到循环
•    在实际写出程序之前,我们可以先用文字描述程序的思路
•    核心重点是循环的条件
•    人们往往会考虑循环终止的条件

1.    计算机随机想一个数,记在变量number里;
2.    一个负责计次数的变量count初始化为0;
3.    让⽤用户输入⼀一个数字a;
4.    count递增(加一);
5.    判断a和number 的大小关系,如果a和naumber大,就输出 “大”;如果a小就输出 “小”;
6.    如果a和number是不相等的(无论大还是小),程序转回到第3步;
7.    否则,程序输出“猜中”和次数,然后结束。

循环的条件是a和number不相等

srand(time(0)); 
int number = rand()%100+1; 
int count = 0; 
int a = 0; 
printf("我已经想好了⼀一个1到100之间的数。"); 
do { 
    printf("请猜这个1到100之间数:");  scanf("%d", &a); 
    count ++; 
    if ( a > number ) { 
        printf("你猜的数⼤大了。"); 
    } else if ( a < number ) {
    printf("你猜的数⼩小了。");
 } 
} while (a != number); 
printf("太好了,你⽤用了%d次就猜到了答案。\n", count);

随机数

•    每次召唤rand()就得到⼀一个随机的整数

%100

•    x % n 的结果是[0, n-1]的⼀一个整数

srand(time(0)); 
int number = rand()%100+1; 
int count = 0; 
int a = 0; 
printf("我已经想好了⼀一个1到100之间的数。");
 do { 
     printf("请猜这个1到100之间数:");  scanf("%d", &a); 
     count ++; 
     if ( a > number ) { 
        printf("你猜的数⼤大了。"); 
     } else if ( a < number ) {
       printf("你猜的数⼩小了。");
 } 
} while (a != number); 
printf("太好了,你⽤用了%d次就猜到了答案。\n", count);

算平均数

 •    让⽤用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数
•    变量->算法->流程图->程序

变量

•    一个记录读到的整数的变量
•    平均数要怎么算?
•    只需要每读到一个数,就把它加到一个累加的变量里,到全部数据读完,再拿它去除读到的数的个数就可以了
•    一个变量记录累加的结果,一个变量记录读到的数的个数

算法

1.    初始化变量sum和count为0;
2.    读入number;
3.    如果number不是-1,则将number加入sum,并将count加1,回到2;
4.    如果number是-1,则计算和打印出sum / count(注意换成浮点来计算)。

number = 0; 
count = 0; 
while ( number != -1 ) {
    scanf("%d", &number); 
    if ( number != -1 ) { 
        sum += number;
        count ++; 
    }
   }

 整数的分解

•    一个整数是由1至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算
•    对一个整数做%10的操作,就得到它的个位数;
•    对一个整数做/10的操作,就去掉了它的个位数;
•    然后再对2的结果做%10,就得到原来数的十位数了 ;
•    依此类推。

数的逆序

•    输入一个正整数,输出逆序的数
•    结尾的0的处理

课后思考题:

为什么100以内的数猜7次就够了?

答:二分法 如我选定4,第一次询问是否大于50,后面类似,则范围缩小至100 - 50 - 25 - 12/13 - 6/7 - 3/4 - 2-1 即至多7次就可以得到对应的数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值