4. C语言的while和do-while.
文章目录
4.1 循环引入:
- 数数几位数:
- 人和计算机的思维方式:
- 人:眼睛一看就知道。
353->3位 - 计算机:判断数的范围来决定它的位数。
352∈[100,999]->3位
- 人:眼睛一看就知道。
- 人和计算机的思维方式:
- 程序实现:(但存在局限性,数多以后程序会变得繁琐)
#include<stdio.h>
int main()
{
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;
}
else if (x > 0) {
n = 1;
}
printf("%d\n", n);
return 0;
}//因为是从高处往下判断,所以不需要判断上限。(反过来不行)
- 数数:
- 人:从左往右数
- 计算机:
1.可以除以10位数次方;(从左往右)
eg:12345/10000
2.从右边开始划:/10,然后不断的划,直到没有数可以划,在这个过程中计数。
eg:
1.(但是计算并没有结束)
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);
2.所以有了while
int x;//所输入的数
int n = 0;//位数
scanf("%d" ,& x);
n++;
x /= 10;
while(x > 0) {
n++;
x /= 10;
}
printf("%d\n", n);
4.2 while循环:
if(x>0){
x/=10;
n++;
}//一次性的
while(x>0){
x/=10;
n++;
}//可反复循环
- 含义:当条件满足时,不断重复循环体(“
{
里的内容}
”)内的语句。 - 循环语句:如果满足条件就再次进入循环,不满足的话输出后续语句。
- 注意:循环体内要有改变条件的机会,没有的话会出现逻辑上的错误。
- eg:
while(x>0){
//x/=10;(改变条件)
n++;
}
- eg:
- 验证:
测试程序常使用边界数据,如有效范围两端的数据,特殊的倍数等。例:个位数;10;0;负数。
eg:
x n
5 0
0 1
//ps:学会纸上验证。 - 调试:在程序适当的地方插入printf来输出变量的内容。
eg:
int x;
int n=0;
// scanf("%d",&x);
x=352;
while (x > 0) {
//printf("in loop\n");
n++;
x /= 10;
//printf("x=%d,n=%d\n",x,n);
}
printf("%d\n",n);
- 程序:
1.数字比较少是可以使用。
#include<stdio.h>
int main()
{
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;
}
else if (x > 0) {
n = 1;
}
printf("%d\n", n);
return 0;
}
2.//可以循环使用。
#include<stdio.h>
int main()
{
int x;
int n = 0;
scanf("%d", &x);//计算机内整数是有范围的,到9位后就不可以了。
//n++;
//x /= 10; //加上后可做特殊判断,应对x=0的情况。
while (x > 0) {
n++;
x /= 10;//改变条件的机会
}
printf("%d\n", n);
return 0;
}
4.3 do-while循环:
- 定义:
在进入循环的时候不做检查,而是在执行完一轮循环体的代码后,再来检查循环的条件是否满足,如果满足则继续下一轮的循环,不满足则结束循环。 - 格式:
do
{
<循环体语句>
}while(<循环条件>);
- 与while的区别:
- 异:do_while在循环体执行结束的时候才来判断条件,无论如何都会执行至少一遍,然后来判断条件。
- 同:都是条件满足时执行循环,不满足时结束循环。
- 数位数的算法:
1.用户输入x;
2.初始化n为0;
3.x=x/10,去掉个位;
4.n++;
5.如果x>0,回到3;
6.否则n就是结果。
#include<stdio.h>
int main()
{
int x;
int n = 0;
scanf("%d", &x);
do {
x /= 10;
n++;
} while (x > 0);//注意:不要忘记写分号
printf("%d", n);
return 0;
}
4.4 猜数:
让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,直到用户猜中为止,最后告诉用户他猜了多少次。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.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("你猜的数大了");
}
else if (a < number) {
printf("你猜的数小了");
}
} while (a != number);
printf("太好了,你用了%d次就猜到了答案。\n", count);
return 0;
}
- 随机数:
每次召唤rand()就得到一个随机的整数。
#include<stdio.h>
#include<stdlib.h>//
#include<time.h>//目前不用理解,是用来帮助得到随机数的。
int main()
{
srand (time(0));
int a = rand();
printf("%d\n", a);
return 0;
}
- %100:
x%n的结果是[0,n-1]的一个整数。
#include<stdio.h>
#include<stdlib.h>//
#include<time.h>//目前不用理解,是用来帮助得到随机数的。
int main()
{
srand(time(0));
int a = rand();
printf("%d\n", a%100);//a%100使结果控制在100以内。
return 0;
}
4.5 算平均数:
让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int number;
int count= 0;
int sum = 0;
//方法一:
do {
scanf("%d", &number);
if (number != -1) {
sum += number;
count++;
}
} while (number != -1);
printf("%f\n", 1.0 * sum / count);
return 0;
}
方法二:
scanf("%d", &number);
while (number != -1) {
sum += number;
count++;
scanf("%d", &number);
}
4.6 整数求逆:
- 整数的分解:
一个整数是由1至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算
对一个整数做%10的操作,就得到它的个位数;
对一个整数做/10的操作,就去掉了它的个位数;
然后对2的结果做%10,就得到了原来数的十位数了;以此类推 - 数的逆序:
- 输入一个正整数,输出逆序的数;
- 结尾0的处理.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x;
scanf("%d" ,& x);
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);
}
return 0;
}
4.7 practice
04-0. 求符合给定条件的整数
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
int i, j, k;
int cnt = 0;//计数器
i = a;
while (i <= a + 3) {
j = a;
while (j <= a + 3) {
k = a;
while (k <= a + 3) {
if (i != j) {
if (i != k) {
if (j != k) {
cnt ++;
printf("%d%d%d",i,j,k);
if (cnt == 6) {
printf("\n");
cnt = 0;
}
else {
printf(" ");
}
}
}
}
k++;
}j++;
}i++;
}
return 0;
}
04-1. 水仙花数
水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。
例如:153 = 1^3 + 5^3+ 3^3。本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i = 1;
int first = 1;
while (i < n) {
first *= 10;
i++;
}
int k = first * 10;
for (; first < k; first++) {//first变为被除数
//printf("%d ", first);
int a;//每一位数
int num = first;//代替first去发生变化
int sum = 0;//n次幂后结果的和
while (num > 0) {
a = num % 10;
num /= 10;
//printf("%d ", a);
int b = 0;//遍历
int Pow = 1;//153
while (b < n) {
Pow *= a;
b++;
}
sum += Pow;
}
if (sum == first) {
printf("%d\n", first);
}
//printf("\n");
}
return 0;
}
04-3. 统计素数并求和
本题要求统计给定整数M和N区间内素数
(在大于1的自然数中,除了1和它本身以外不再有其他因数。)
的个数并对它们求和。
输入格式:
输入在一行中给出2个正整数M和N(1<=M<=N<=500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int m, n;
int i;//从m->n的数
int cnt = 0;//个数
int sum = 0;//和
scanf("%d %d", &m,&n);
for (i = m; i <= n; i++) {//外层循环判断mn之间的数
int isPrime = 1;
int k;//m->n的数
for (k = 2; k < i - 1; k++); {//内层循环判断是否是素数
if (i % k == 0) {
isPrime = 0;
break;
}
}
//判断i是不是素数
if (isPrime) {
cnt++;
sum += i;
}
}
printf("%d %d", cnt, sum);
return 0;
}
04-4. 猜数字游戏
猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,
需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”)
,还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。
程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;
如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)
猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。
如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出2个不超过100的正整数,分别是系统产生的随机数、以及猜测的最大次数N。
随后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int num, n;
int print;
int cnt = 0;
int finished = 0;
scanf("%d %d", &num, &n);
do {
scanf("%d", &print);
cnt++;
if (print < 0) {
printf("Game over\n");
finished = 1;
}
else if (print > num) {
printf("Too big\n");
}
else if (print < num) {
printf("Too small\n");
}
else {
if (cnt == 1) {
printf("Bingo!\n");
}
else if (cnt <= 3) {
printf("Lucky You!\n");
}
else {
printf("Good Guess!\n");
}
finished = 1;
}
if (cnt == n) {
if (!finished) {//!非
printf("Game Over!\n");
finished = 1;
}
}
} while(!finished);
return 0;
}