计算log2x的值
#include <stdio.h>
int main()
{
printf("计算log2x");
int x;
printf("输入x的值\n");
scanf("%d",&x);
int ret = 0;/*ret为log2x的计算结果*/
while (x > 1){
x /= 2;
ret ++;
}
printf("当x=%d时log2x的值为%d",x,ret);
return 0;
}
计算log2x输入x的值
64
当x=1时log2x的值为6
--------------------------------
Process exited after 2.149 seconds with return value 0
上述程序从计算结果可以看出并不合理,原因是x的值在while循环中不断变化,而程序最后输出时需要使用x的初始值,需要在程序进入while循环前将x的值保存下来,如下:
#include <stdio.h>
int main()
{
printf("计算log2x");
int x;
printf("输入x的值\n");
scanf("%d",&x);
int t = x;
int ret = 0;/*ret为log2x的计算结果*/
while (x > 1){
x /= 2;
ret ++;
}
printf("当x=%d时log2x的值为%d",t,ret);
return 0;
}
计算log2x输入x的值
64
当x=64时log2x的值为6
--------------------------------
Process exited after 2.046 seconds with return value 0
::: tip 上述程序中ret的起始值和循环条件如何确定: 当x的值为0时,log2x不存在;当x的值为1时,log2x即ret值为0(2的0次方等于1),即当x的值为1时,程序不要进入循环,直接输出ret的起始值0;当x的值为2时,log2x的值希望为1,需要进入循环中执行一次ret++,即x=2是希望进入循环的最小数字,由此可得循环条件也可由x>改为x>=2。当循环条件改为x>2时,即当x=2时不进入循环还要保证ret的值为1,ret起始值应该为1,(即x=2时log2x的值为1),但为了兼顾当x=1时,ret结果为0,循环条件应改为x>1或x>=2。 当循环条件是x>0时,数学上x不可能为0,当x=1进入循环后,x/=2后x等于0(取整),ret++,而当x=1时,ret=0,所以此时ret的起始值应为-1。 ::: 上述程序中当循环条件是x>0,ret起始值为-1时,程序如下:
#include <stdio.h>
int main()
{
printf("计算log2x");
int x;
printf("输入x的值\n");
scanf("%d",&x);
int t = x;
int ret = -1;/*ret为log2x的计算结果*/
while (x > 0){
x /= 2;
ret ++;
}
printf("当x=%d时log2x的值为%d",t,ret);
return 0;
}
计算结果当x=2时ret=1,当x=1时ret=0,也满足了程序计算要求。 ::: warning 程序没有确定的标准答案,编程问题可以有不同的解决方法。 :::
计数循环
#include <stdio.h>
int main()
{
int count = 3;
while (count > 0){
count --;
printf("%d\n",count);
}
printf("发射!\n");
printf("count值为%d",count);
return 0;
}
对计数程序提出三个问题: 1、count起始值100和循环条件count>0之间的关系怎么影响循环次数? 2、循环停止时会不会输出0? 3、循环结束时,count值是多少? 上述问题可以通过debug、循环体内添加printf语句、纸面模拟输出程序来直观解决。 需要计算重复运算量过大的循环,可以模拟较少的运算次数然后推断结果。
2
1
0
发射!
count值为0
--------------------------------
Process exited after 0.01696 seconds with return value 0
如上计算当count=3时程序的输出结果,得到结论:程序执行3轮,结果会输出0,循环结束count值为0。可以推断出当count=100时:程序执行100轮,结果会输出0,循环结束count值为0。
计算平均数
计算平均数时,需要将所有的数字相加。程序读入一系列正整数,读到-1表示正整数读完了(要读入的正整数的数量未知),程序将所有读入的正整数都加起来,除以读入正整数的个数n,需要引入一个计数器,在每次读到一个正整数时计数器加1,最后输出输入数字的个数和平均数。 ::: tip 思考过程:变量——>算法——>流程图——>程序 :::
- 变量:①需要一个记录所读入的数字的变量。②求平均数时不需要将每一个读入的数字都用一个变量保存,可以用一个变量把每次读到的数字都加起来,每次读入一个数字,就把相加后的结果保存在累加和的变量sum中。③需要有一个变量在每读入一个数字时加一,计算读入的数字的个数。
- 算法:
- 初始化变量sum和count为0;
- 读入number;
- 如果number不是-1,则将number加入sum,并将count+1,回到步骤2。
- 如果number是-1,则计算打印和sum/count的值(转换为浮点数计算)。
流程图如下:
#include <stdio.h>
int main()
{
int number;
int sum = 0;
int count = 0;
printf("请输入数字");
scanf("%d",&number);
count++;
printf("共输入数字%d个\n",count);
if (number != -1){
do
{
sum += number;
printf("输入数字总和为%d\n",sum);
printf("请输入数字");
scanf("%d",&number);
count++;
printf("共输入数字%d个\n",count);
}while(number != -1);
}
count --;
printf("平均数为%f\n",1.0*sum/count);
return 0;
}
请输入数字3
共输入数字1个
输入数字总和为3
请输入数字2
共输入数字2个
输入数字总和为5
请输入数字1
共输入数字3个
输入数字总和为6
请输入数字0
共输入数字4个
输入数字总和为6
请输入数字-1
共输入数字5个
平均数为1.500000
--------------------------------
Process exited after 1.829 seconds with return value 0
另一种程序写法:
#include <stdio.h>
int main()
{
int number;
int sum = 0;
int count = 0;
do
{
printf("请输入:\n");
scanf("%d",&number);
if (number != -1){
sum +=number;
count ++;
}
}
while (number != -1);
printf("平均数为%f\n",1.0*sum/count);
return 0;
}
请输入:
3
请输入:
2
请输入:
1
请输入:
0
请输入:
-1
平均数为1.500000
--------------------------------
Process exited after 2.74 seconds with return value 0
使用while循环优化程序:
#include <stdio.h>
int main()
{
int number;
int sum = 0;
int count = 0;
scanf("%d",&number);
while (number != -1){
sum += number;
count ++;
scanf("%d",&number);
}
printf("平均数为%f\n",1.0*sum/count);
return 0;
}
3
2
1
0
-1
平均数为1.500000
--------------------------------
Process exited after 3.128 seconds with return value 0
可以省略一步判断的程序。
猜数游戏
要求:计算机提出一个数字,用户来猜,用户每输入一个数字计算机告诉用户数字大了或小了,直到用户猜对,告诉用户猜了多少次。 文字描述程序: ①计算机随即提出一个数字,记在变量number中; ②变量count负责统计次数,初始为0; ③用户输入数字a; ④count递增; ⑤判断a和number的大小关系,a大输出“大”,a小输出“小”; ⑥当a不等于number时,程序回到第三步(循环条件); ⑦当a等于number时,程序输出“猜中”并出输出用户猜的次数; ⑧程序结束。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
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("你猜的数大了。\n");
}else if ( a < number ) {
printf("你猜的数小了。\n");
}
}
while (a != number);
printf("太好了,你用了%d次就猜到了答案。\n",count);
return 0;
}
我已经想好了一个1到100之间的数。请猜这个1到100之间数:50
你猜的数大了。
请猜这个1到100之间数:15
你猜的数小了。
请猜这个1到100之间数:20
太好了,你用了3次就猜到了答案。
--------------------------------
Process exited after 6.435 seconds with return value 0
::: tip rand()是C语言标准库中的函数,可以产生随机整数。 #include <stdlib.h>和#include <time.h>是为了srand(time(0))和rand()而出现。 ::: srand(time(0))和rand()可以得到每次运行都不一样的随机数字。如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int number = rand();
printf("%d",number);
return 0;
}
17021
--------------------------------
Process exited after 0.01238 seconds with return value 0
17067
--------------------------------
Process exited after 0.0138 seconds with return value 0
::: tip rand()%100+1用来取得一个>=100的数字。 计算机给出的随机数比较大,可以使用%取余。 (x%n的结果是[0,n-]之间的一个整数。) :::
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int number = rand();
number = 1234;
printf("%d",number%100);
return 0;
}
34
--------------------------------
Process exited after 0.01677 seconds with return value 0
循环类型使用do-while循环,原因是无论怎样都需要进入循环让用户输入一个数字,判断结束时又需要判断是否要继续循环,do-while循环比while循环更加合理。
整数逆序
一个整数是由1到多位数字组成的,分解整数的方法: ①对一个整数做%10的操作,就得到它的个位数; ②对一个整数做/10的操作,就去掉了它的个位数; ③再对2的结果做%10,就得到原来数的十位数,以此类推。
#include <stdio.h>
int main( )
{
int x;
x = 12345;
int digit;
int ret = 0;
while ( x > 0 ) {
digit = x%10;
printf("%d\n" , digit);
ret = ret*10 + digit;
printf( "x=%d,digit=%d,ret=%d\n",x,digit,ret);//调试
x /= 10;
}
printf("%d", ret);
return 0;
}
变量ret表示输出结果,变量digit表示每一位的数字,digit = x%10取出数字最右边的一位,x /= 10丢掉最右边的一位,ret = ret*10 + digit表示原来的结果向左移一位加上digit,构建新的数字。
5
x=12345,digit=5,ret=5
4
x=1234,digit=4,ret=54
3
x=123,digit=3,ret=543
2
x=12,digit=2,ret=5432
1
x=1,digit=1,ret=54321
54321
--------------------------------
Process exited after 0.02004 seconds with return value 0
按照上述程序,输入x = 700,输出结果会是个7而不是007,需要根据具体要求修改,使程序每次循环都输出digit:
#include <stdio.h>
int main( )
{
int x;
x = 700;
int digit;
int ret = 0;
while ( x > 0 ) {
digit = x%10;
printf("%d" , digit);
ret = ret*10 + digit;
x /= 10;
}
return 0;
}
007
--------------------------------
Process exited after 0.01898 seconds with return value 0