目录
前言
if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作。
重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。
while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
人VS计算机
写程序一定要明确我们写的是步骤,一步一步地执行而不是表示关系
判断几位数
#include <stdio.h>
int main()
{
int x = 0;
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", n);
return 0;
}
上面这个程序是按照步骤执行的例子,而下面这个程序则表达的是一种关系执行的方式
#include <stdio.h>
int main()
{
int x = 0;
int n = 1;
scanf("%d", &x);
if(x > 999){
n = 4;
}
if(x > 99){
n = 3;
}
if(x > 9){
n = 2;
}
printf("%d\n", n);
return 0;
}
- 这个程序同时还存在一个问题,当
x等于100
时,x即大于99也大于9,所以按照计算机的一步一步执行方式,这两个if语句都要执行,那么最终n等于2,输出结果为2。 - 这个程序是大于号,所以要从高出往低处判断;如果是小于号则是从低处往高处判断。
- 但是这个是一个4位数的整数,如果是任意一个整数呢?
数数
#include <stdio.h>
int main()
{
int x;
int n = 0;
scanf("%d", &x);
n++;
x /= 10;
while(x > 0){
n++;
x /= 10;
}
printf("%d\n", n);
return 0;
}
这个程序中将x /= 10;
放在n++;
之前也可以。
讨论
数数这个程序最多可以数到几位数?
最多可以数到10位数。
while循环
// if是一次性的
if(x > 0){
x /= 10;
n++;
}
// while是重复直到不满足条件
while(x > 0){
x /= 10;
n++;
}
- while语句中的循环体内要有改变条件的机会,否则容易进入死循环出不来
- 程序有时候语法是正确的可以通过编译,但逻辑是错误的
// 死循环
#include <stdio.h>
int main()
{
int x;
int n = 0;
scanf("%d", &x);
n++;
x /= 10;
while(x > 0){
n++;
// x /= 10;
}
printf("%d\n", n);
return 0;
}
- 如果我们把while循环翻译作“当”,那么一个while循环的意思就是:当条件满足时,不断地重复循环体内的语句。
- 循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行;
- 条件成立是循环继续的条件。
验证
// 去掉while之前的n++;与x /= 10;
#include <stdio.h>
int main()
{
int x;
int n = 0;
scanf("%d", &x);
// n++;
// x /= 10;
while(x > 0){
n++;
x /= 10;
}
printf("%d\n", n);
return 0;
}
例如上面的程序验证:
x | n |
---|---|
0 | 0 |
0 |
调试
- 在程序适当的位置插入printf来输出变量的内容,或者查看是否执行到这个地方
#include <stdio.h>
int main()
{
int x;
int n = 0;
scanf("%d", &x);
n++;
x /= 10;
while(x > 0){
printf("x=%d", x);
n++;
x /= 10;
}
return 0;
}
do-while
不管三七二十一,先做循环体内的句子
- 在执行完成一轮循环后再对条件进行检查,满足则继续循环,不满足则退出
do{
}while(循环条件);
// 这个分号一定要有,因为它代表while()这个语句结束,在C语言中`{}或者;`可以代表一个语句的结束
// 数数基于do-while的改进
#include <stdio.h>
int main()
{
int x;
int n = 0;
scanf("%d", &x);
do{
x /= 10;
n++;
}while(x > 0);
printf("%d\n", n);
return 0;
}
while与do-while的流程图
左边的是do-while, 右边的是while
for循环
阶乘例子
// 基于while循环
#include <stdio.h>
int main()
{
int n;
int i = 1;
int factor = 1;
scanf("%d", &n);
while(i <= n){
factor *= i;
i++;
}
printf("%d! = %d\n", n, factor);
return 0;
}
// 基于for循环
#include <stdio.h>
int main()
{
int n;
int i;
int factor = 1;
scanf("%d", &n);
// C99 for(int i=1; i<=n; i++)
for(i=1; i<=n; i++){
factor *= i;
}
printf("%d! = %d\n", n, factor);
return 0;
}
- 第一个条件是初始条件
- 第二个条件是循环条件
- 第三个条件是每轮循环要做的动作
- for循环也可以省去一个条件,写成
for(; i<=n; i++){}
for循环很怪吗?
for循环不符合人类的语言逻辑,不易理解,因此就造成了第一次接触语言的人觉得for循环很怪。而现代程序设计理念更强调与人类语言的逻辑统一性,所以在新兴的python语言中祛除掉了C中的for循环逻辑。但由于for循环抽象程度高,所以在掌握语言基础后,其表现逻辑更为简洁易于回溯反而更方便使用。 Python语言就没有for循环的另一个原因是Python里没有累加器。
for循环的计数
for(i=0; i<n; i++)
, 最终i=n, 一共5轮循环for(i=1; i<=n; i++)
, 最终i=n, 一共5轮循环
#include <stdio.h>
int main()
{
int i;
int n = 5;
for(i=0; i<n; i++){
printf("i=%d ", i);
}
printf("\ni=%d\n", i);
return 0;
}
#include <stdio.h>
int main()
{
int i;
int n = 5;
for(i=1; i<=n; i++){
printf("i=%d ", i);
}
printf("\ni=%d\n", i);
return 0;
}
三种循环的选择与比较
- 左边是for循环,中间是while循环,右边是do-while循环