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次就可以得到对应的数。