c语言(循环(for,while,do while))

循环结构

while语句

while 循环:用于重复执行一段代码,直到条件不满足为止。

语法:
while (条件) {
    // 循环体:条件为真时执行
}
  • 条件:一个布尔表达式,每次循环开始前检查。如果为真(非0),执行循环体;如果为假(0),退出循环。

  • 循环体:需要重复执行的代码块。

执行流程:
  1. 检查条件是否为真。

  2. 如果为真,执行循环体。

  3. 重复步骤1和2,直到条件为假。

示例:

打印1到5的数字

#include <stdio.h>
#include <stdlib.h>
​
int main(void)
{
    int i=1;
    int n=0;
    printf("请输入n的值\n");
    if (scanf("%d", &n) != 1)   // 检查scanf返回值是否为1(成功读取一个整数)
    {
    printf("输入无效,请输入一个整数\n");
    return 1;  // 返回1表示输入错误
    }
    while(i <= n)   // while循环:当i小于等于n时,执行循环体
    {
        printf("%d\n",i);
        i++;   // i自增1,进入下一次循环
    }
    system("pause");
    return 0;    // 程序正常退出,返回0表示执行成功
}

假如输入5,则输出

1
2
3
4
5
关键点:
  1. 条件控制

    • 确保条件最终会变为假,否则会进入死循环

    • 例如:while (1) 会无限循环。

  2. 循环体

    • 必须包含改变条件的代码,否则循环可能无法结束。

    • 例如:i++ 确保 i 最终大于5,退出循环。

  3. 适用场景

    • 不确定循环次数时(如读取用户输入直到满足条件)。

对比 for 循环:

while:适合不确定循环次数的场景。

for:适合已知循环次数的场景。

例如,下述代码用 for 实现:

for (int i = 1; i <= 5; i++) {
    printf("%d\n", i);
}

do while语句

do while 循环:先执行循环体,再检查条件。即使条件一开始为假,循环体也会至少执行一次。

语法:
do {
    // 循环体:至少执行一次
} while (条件);
  • 循环体:需要重复执行的代码块。

  • 条件:一个布尔表达式,每次循环结束后检查。如果为真(非0),继续循环;如果为假(0),退出循环。

执行流程
  1. 执行循环体。

  2. 检查条件是否为真。

  3. 如果为真,重复步骤1和2;如果为假,退出循环。

示例
用户输入验证
#include <stdio.h>
#include <stdlib.h>
​
int main(void)
{
    int num;
    do
    {
    printf("请输入一个正数\n");
    scanf("%d",&num);
    }
    while (num <= 0);
    printf("你输入的是:%d\n",num);
    system("pause");
    return 0;
}

运行示例:

请输入一个正数:-5
请输入一个正数:0
请输入一个正数:10
你输入的是:10
关键点:
  1. 至少执行一次

    • 即使条件一开始为假,循环体也会执行一次。

    • 例如:do { ... } while (0); 仍然会执行一次循环体。

  2. 条件控制

    • 确保条件最终会变为假,否则会进入死循环

  3. 适用场景

    • 需要至少执行一次的场景(如用户输入验证、菜单选择)。

对比 while 循环:
  • while:先检查条件,再执行循环体(可能一次都不执行)。

  • do-while:先执行循环体,再检查条件(至少执行一次)。

例如,用 while 实现上述示例:

int number = -1;  // 初始化为一个无效值
while (number <= 0) {
    printf("请输入一个正数:");
    scanf("%d", &number);
}

for语句

for 循环:用于重复执行一段代码,通常用于已知循环次数的场景。

for (初始化; 条件; 更新) {
    // 循环体:条件为真时执行
}
  • 初始化:在循环开始前执行一次,通常用于初始化计数器。

  • 条件:每次循环开始前检查。如果为真(非0),执行循环体;如果为假(0),退出循环。

  • 更新:每次循环结束后执行,通常用于更新计数器。

  • 循环体:需要重复执行的代码块。

执行流程:
  1. 执行初始化

  2. 检查条件是否为真。

  3. 如果为真,执行循环体,然后执行更新,重复步骤2和3。

  4. 如果为假,退出循环。

示例 1

打印1到5的数字

#include <stdio.h>
#include <stdlib.h>
​
int main() {
    int i;  // 变量声明在循环外
    for (i = 1; i <= 5; i++)  
        //i = 1:初始化循环变量 i,将其值设置为 1。
        //i <= 5:循环条件。只要 i 的值小于或等于 5,循环就会继续执行。
        //i++:每次循环结束后,i 的值增加 1。
    {
        printf("%d\n", i);
    }
    system("pause");
    return 0;
}
示例1:正三角塔
#include <stdio.h>
#include <stdlib.h>
​
int main()
{
    int a=5;   // 定义整型变量a并赋值为5,表示三角形的高度
    int i,j,k;  // 声明循环控制变量i、j、k
    for(i = 1;i <= a;i++){     // 外层循环:控制行数,i从1到a(1到5)
        for (j = 1; j <= a - i;j++){     // 内层循环1:打印空格,空格数 = a - i
            printf(" ");     // 打印一个空格
    }
    for (k = 1; k <= 2 * i - 1; k++){    // 内层循环2:打印星号,星号数 = 2 * i - 1
        printf("*");    //打印一个*号
    }
    printf("\n");    //每行结束后换行
}
system("pause");
return 0;
}

for循环逐行解释

  1. for (i = 1; i <= a; i++)

    • 外层循环:控制行数,i15

  2. for (j = 1; j <= a - i; j++)

    • 内层循环1:打印空格,空格数 = a - i

    • 例如:

      • 第1行:a - i = 5 - 1 = 4 个空格。

      • 第2行:a - i = 5 - 2 = 3 个空格。

  3. printf(" ");

    • 打印一个空格。

  4. for (k = 1; k <= 2 \* i - 1; k++)

    • 内层循环2:打印星号,星号数 = 2 * i - 1

    • 例如:

      • 第1行:2 * 1 - 1 = 1 个星号。

      • 第2行:2 * 2 - 1 = 3 个星号。

输出:

    *
   ***
  *****
 *******
*********
示例2:倒三角塔

某位同学错误写法

int main(void){
    int a=5;
    int b,c,d;
    for(b = 1; b <= a; b++){
        for(c = 1; c >=a; c++){
            printf(" ");
        }
        for(d = 1; d=b ;d++){
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

正确写法

int main(void) {
    int a = 5;    // 定义整型变量a并初始化为5,表示三角形的高度
    int b, c, d;
     // 外层循环:控制行数,b从a(5)递减到1
    for (b = a; b >= 1; b--) {  
        for (c = 1; c <= a - b; c++) {    // 内层循环1:打印空格,空格数 = a - b
            printf(" ");
        }
        for (d = 1; d <= 2 * b - 1; d++) {    // 内层循环2:打印星号,星号数 = 2 * b - 1
            printf("*");
        }
        printf("\n"); 
    }
    system("pause");
    return 0;
}

for循环逐句解释

  1. for (b = a; b >= 1; b--)

    • 外层循环:控制行数,ba(5)递减到 1

  2. for (c = 1; c <= a - b; c++)

    • 内层循环1:打印空格,空格数 = a - b

    • 例如:

      • 第1行:a - b = 5 - 5 = 0 个空格。

      • 第2行:a - b = 5 - 4 = 1 个空格。

完美写法

int main(void) {
    int a; 
    int b, c, d; 
    printf("请输入三角形的高度(正整数):");     // 提示用户输入高度
    // 输入验证
    if (scanf("%d", &a) != 1 || a <= 0) {    // 检查输入是否有效
        printf("输入无效,请输入一个正整数。\n");
        return 1;   // 输入无效,程序异常退出
    }
    for (b = a; b >= 1; b--) {  
        for (c = 1; c <= a - b; c++) {  
            printf(" "); 
        }
        for (d = 1; d <= 2 * b - 1; d++) {  
            printf("*"); 
        }
        printf("\n");  
    }
    system("pause"); 
    return 0;        
}

输出

*********
 *******
  *****
   ***
    *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值