4.C语言的while和do-while.

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++;
      }
  • 验证:
    测试程序常使用边界数据,如有效范围两端的数据,特殊的倍数等。例:个位数;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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值