二十一.循环
1.数数几位数
程序读入一个4位以下(含4位)的正整数,输出这个整数的位数
输入:352 输出:3
计算机通过数的范围来决定位数
2.程序实现
int x;
int n=1;
scanf("%d",&x);
if(x>999)
n=4;
else if(x>99)
n=3;
else if(x>9)
n=2;
printf("%d",n);
题目明确4位数及以下的正整数
因为从高处往下判断,所以不需要判断上限
反过来不行,>从高往低判断,<反之
如果都用if
int x;
int n=1;
scanf("%d",&x);
if(x>999){
n=4;
}
if(x>99){
n=3;
}
if(x>9){
n=2;
}
if(x>0){
n=1;
}
printf("%d",n);
这样写结果都是1
3.任意范围的正整数怎么办
用判断位数的方法在一定范围内可以做
换一个方法想:给一个极大的正整数,让计算机数数,怎样让计算机数数,eg三位逆序的题,352%100=52,123456789%100000000=23456789,但是如何得到100000000?如果换一下,从右边开始划,123456789/10=12345678,去掉最右边的数,不断的划,直到没有数可以划(0),在这个过程中计数,计数的结果就是几位数
int x;
int n=0;
scanf("%d",&x);
n++;
x/=10;
if(x>0){
n++;
x/=10;
if(x>0){
n++;
x/=10;
if ...
}
}
printf("%d\n",n);
还是没完没了,需要引入一种手段
4.while
int x;
int n=0;
scanf("%d",&x);
n++;
x/=10;
while (x>0){
n++;
x/=10;
}
printf("%d\n",n);
在4行做一个断点,调试,程序一直在while循环,直到满足x>0结束
n加1,x少一位,直到x=0时结束while循环
刚才自己用了很大的数试,失败,因为计算机可以表达的最大的整数是有范围的
二十二.while循环和if
1.while和if的区别
while(x>0){
x/=10;
n++;
}
if(x>0){
x/=10;
n++;
}
while是反复做,if是一次性做
循环体内要有能改变条件的机会
int x;
int n=0;
scanf("%d",&x);
n++;
x/=10;
while (x>0){
n++;
}
printf("%d\n",n);
调试发现程序一直在while循环
因为缺少x/=10;也就是循环体内缺少能改变条件的机会,pat系统会判定超时
2.while循环
如果把while翻译成当,那么while循环的意思是当条件满足时,不断地重复循环体内的语句
循环执行之前判断是否继续循环,所以可能循环一次也没有被执行
条件成立是循环继续的条件
3.验证
去掉n++; x/=10;会怎么样
手动验证
|
x |
352 |
35 |
3 |
0 |
|
n |
0 |
1 |
2 |
3 |
测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等:个位数、10、0、负数
0和负数解决不了,目前两个方法解决0
加入n++; x/=10;或加入if-else
int x;
int n=0;
scanf("%d",&x);
if(x>0){
while (x>0){
n++;
x/=10;
}
}else{
n=1;
}
printf("%d\n",n);
4.其他调试的方法printf
在程序中间插入printf
int x;
int n=0;
x=352;
while (x>0){
n++;
x/=10;
printf("x=%d,n=%d\n",x,n);
}
printf("%d\n",n);

二十三.do-while循环
1.数位数的算法
用户输入x;
初始化n为0;
x=x/10,去掉个位;
n++;
如果x>0,回到3;
否则n就是结果
int x;
int n=0;
scanf("%d",&x);
n++;
x/=10;
while (x>0){
n++;
x/=10;
}
printf("%d\n",n);
如果去掉了n++; x/=10;
则"如果x>0,回到3;"是在"x=x/10,去掉个位;"中运行的
能不能做完了再看条件
2.do-while循环
do
{
<循环体语句>
}while(<循环条件>);//记住分号
在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环
3.两种循环
左边do-while,右边while

do-while循环在循环体执行结束的时候才来判断条件,无论如何,循环都会执行至少一遍,然后判断条件
和while循环相同的是,条件满足时执行循环,条件不满足时结束循环
int x;
scanf("%d",&x);
int n=0;
do{
x/=10;
n++;
}while(x>0);//注意分号
printf("%d\n",n);
二十四.猜数
1.猜数游戏
让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉它是大了还是小了,直到用户猜中为止,最后还要告诉用户它猜了多少次
因为需要不断重复让用户猜,所以需要用到循环
在实际写出程序之前,我们可以先用文字描述程序的思路
核心重点是循环的条件
人们往往会考虑循环终止的条件
思路
计算机随机想一个数,记在变量number里;
一个负责计次数的变量count初始化为0;
让用户输入一个数字a;
count递增(加一);
判断a和number的大小关系,如果a大,就输出"大";如果a小就输出"小";
如果a和number是不相等的(无论大还是小),程序回到第3步;
否则,程序输出"猜中"和次数,然后结束
循环的条件是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);
2.随机数
每次召唤rand()就得到一个随机的整数
#include <stdio.h>
#include <stdlib.h>//23因为67写的
#include <time.h>
int main()
{
srand(time(0));//先不管
int a = rand();
printf("%d\n", a);
return 0;
}
3.%100
x%n的结果是[0,n-1]的一个整数
srand(time(0));
int a = rand();
a=1234;
printf("%d\n", a%100);
结果是34,这样得到一个获得100内随机数的方法
7次为什么可以猜出来?每次一半一半猜ovo
二十五.算平均数
1.算平均数
让用户输入一系列的正整数,最后输入-1为止,表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数
变量->算法->流程图->程序
2.变量
一个可以记录整数的变量
平均数计算:每读到一个数,加到累加的变量中,当全部数据读完,再拿这个变量/读到的个数
所以还需要两个变量
3.算法
sum(累加的变量)和count(个数)初始化=0
scanf读入number
如果number!=-1,则将number加入sum,count+1,再回去
如果number==1,则计算并输出sum/count(用浮点数,因为真正结果可能带小数点)
4.流程图

5.代码
int number;
int sum;
int count;
do{
scanf("%d",&number);
if(number!=-1){
sum+=number;
count++;
}
}while(number!=-1);
printf("%f",1.0*sum/count);
但是do-while和if有两个语句判断number!=-1;怎样修改
int number;
int sum;
int count;
scanf("%d",&number);
while(number!=-1){
sum+=number;
count++;
scanf("%d",&number);//while循环里面没有改变number!=-1的条件,加一个scanf
}
printf("%f",1.0*sum/count);
二十六.整数求逆
1.整数的分解
一个整数是由1至多位数字组成的,如何分解出整数的各个位上的·数字,然后加以计算
整数%10,得到个位数
整数/10,去掉个位数
再对步骤3的结果%10,得到原整数的十位数
…
类推
2.数的逆序
输入一个正整数,输出逆序的数
结尾的0的处理
3.代码
有两种情况,例如输入700,得到7或007
得到7
int x;
//scanf("%d",&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);

得到007
int x;
//scanf("%d",&x);
x=700;
int digit;
int ret=0;
while(x>0){
digit=x%10;
printf("%d",digit);
ret=ret*10+digit;
//printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);
x/=10;
}
//printf("%d",ret);
![]()
681



被折叠的 条评论
为什么被折叠?



