循环程序设计

一.循环语句

用while 语句处理循环

在C语言中,while语句是一个循环控制结构,它会在满足条件的情况下重复执行某一段代码。

以下是一些C语言中while语句的使用示例:

  1. 基本的while循环:

    int i = 0;// 这行代码声明了一个整数变量i并初始化为0。
    
    while(i < 5) {  //当i<5时
       printf("Hello, World! \n");
       i++; //i赋值后自增
    }
    

    在这个例子中,"i"是循环变量,循环会一直执行直到"i"大于或等于5。

  2. 无限循环:

  3. while(1) {
       printf("Hello, World! \n");
    }
    

    在这个例子中,"1"是一个始终为真的条件,因此,这个while循环会无限执行下去。

  4. 使用break语句退出循环:

  5. int i = 0;
    while(1) {
       if(i == 5) {
          break;
       }
       printf("Hello, World! \n");
       i++;
    }
    

    使用break语句在"i"等于5时退出循环。

  6. 使用continue语句跳过当前迭代:

  7. int i = 0;
    while(i < 10) {
       i++;
       if(i % 2 == 0) {
          continue;
       }
       printf("Hello, World! \n");
    }
    
    

    使用continue语句在"i"为偶数时跳过当前迭代,即不打印信息。

          使用else语句在while循环中:

int i = 0;
while(i < 5) {
   printf("Hello, World! \n");
   i++;
} else {
   printf("i is equal to 5. \n");
}

          else语句在while循环正常结束后执行,如果有break语句退出循环,else语句不会执行。

用do-while 语句处理循环

在C语言中,do...while语句是一个循环语句,其特点是先执行循环体,然后判断循环控制条件是否满足,如果满足则继续执行循环,不满足则退出循环。

do...while语句的一般形式为:

do {
   statement;
}while(expression);

其中,statement是循环体,expression是循环控制条件表达式,其值为布尔类型,如果为true,则继续执行循环体,如果为false,则退出循环。

下面是一个使用do...while语句的例子

#include <stdio.h>
 
int main() {
    int i = 0;
    do {
        printf("i = %d\n", i);
        i++;
    } while (i < 5);
 
    return 0;
}

这段代码将打印0到4,因为循环条件是i小于5,当i等于5时,循环条件不满足,循环退出。

用for语句处理循环

for语句是一种常用的循环控制结构,用于在一定条件下重复执行一段代码。‌

for语句的基本语法如下:

for (表达式1; 表达式2; 表达式3) {
    // 循环体
}
  • 表达式1‌:在循环开始之前执行一次,通常用于设置循环计数器或定义其他变量。
  • 表达式2‌:在每次循环开始时检查,如果为真,执行循环体;如果为假,退出循环。
  • 表达式3‌:在每次循环结束后执行,通常用于更新循环计数器。

for语句的执行过程可以概括为以下步骤:

  1. 执行初始化语句(表达式1),设置循环计数器或定义其他变量。
  2. 检查条件表达式(表达式2)是否为真。如果为真,执行循环体内的代码;如果为假,跳出循环。
  3. 执行更新语句(表达式3),更新循环计数器的值。
  4. 回到步骤2,重复上述过程,直到条件表达式为假。

代码示例:

100以内的求和问题

#include <stdio.h>
int main() {
    int i, sum = 0;
    for (i = 1; i <= 100; i++) {
        sum += i;
    }
    printf("1+2+3+...+100 = %d\n", sum);
    return 0;
}

for循环打印斐波拉契数列:

#include <stdio.h>
 
int main() {
    int fib[10] = {0, 1};
    for(int i = 2; i < 10; i++) {
        fib[i] = fib[i-1] + fib[i-2];
    }
    for(int i = 0; i < 10; i++) {
        printf("%d ", fib[i]);
    }
    return 0;
}

注意事项和常见错误处理

  • 避免在循环体内修改循环变量的值‌,否则可能导致无限循环。例如,for (i = 1; i <= 10; i++) { i = 5; printf("%d", i); }会导致无限输出5。
  • 建议将for循环的取值设置为前闭后开区间‌,这样更符合逻辑,代码也更高级。例如,for (i = 1; i < 10; i++)for (i = 0; i < 9; i++)更直观。

  • 小结:

    while循环通常在以下几种情况下使用‌:

  • 当你不确定循环需要执行多少次时‌:如果你事先不知道循环需要执行多少次,或者循环次数依赖于某些运行时条件,那么使用while循环是合适的。例如,当需要读取用户输入直到满足特定条件时,可以使用while循环‌。

  • 当循环次数依赖于某些运行时条件时‌:如果循环的次数取决于某些条件是否满足,使用while循环可以更灵活地处理这种情况。例如,当需要读取文件直到文件结束时,可以使用while循环‌。

  • 在不确定循环结束条件的情况下‌:如果无法提前确定循环的结束条件,或者结束条件需要在循环过程中动态确定,那么使用while循环更为合适。例如,在处理网络请求直到获取到所有数据时,可以使用while循环‌。

  • do—while循环通常在以下几种情况下使用‌:

  • 至少执行一次循环体‌:当需要确保循环体至少执行一次,无论条件是否满足时,可以使用do-while循环。例如,在初始化某些变量或进行一些必要的设置操作时,即使条件不满足,也需要执行一次循环体‌。

  • 循环次数不确定‌:当循环次数不确定,但需要至少执行一次循环体时,do-while循环是一个不错的选择。由于do-while循环至少执行一次循环体,然后再根据条件判断是否继续执行,这使得它在某些情况下比while循环更灵活‌。

  • for循环主要用于遍历已知循环次数的场景‌。

  • 当你知道需要重复执行某段代码的次数时,使用for循环是最合适的选择。例如,遍历数组、打印数字序列等‌。

循环嵌套的使用

在C语言中,可以使用嵌套循环来处理一些复杂的问题。嵌套循环是一种控制结构,它允许你在一个循环中创建另一个循环。这种方式可以用于处理二维数组,生成斐波那契数列等。

二.控制转移语句

break语句

C语言中的一个控制流语句,用于退出当前执行的循环或switch语句,并立即将控制权转移到包含它的代码块之后的语句‌。Break语句通常用于在满足特定条件时提前退出循环或switch语句,以避免执行不必要的代码‌。

Break语句的基本用法

Break语句可以单独使用,也可以在if语句for循环while循环C语言中使用。当执行break语句时,程序指针将跳出当前循环或switch语句,不再执行该循环或switch语句中的剩余代码,而是继续执行循环或switch语句后的下一条语句‌。

Break语句的使用场景

  1. 退出无限循环‌:在检测到某个条件满足时,可以使用break语句提前退出无限循环。
  2. 退出switch语句‌:在switch语句中,break语句可以用来从特定case中退出,并继续执行switch语句后的代码。
  3. 有条件地退出循环‌:break语句可以与条件语句一起使用,以根据某个条件提前退出循环‌。

Break语句的注意事项

  1. 只能在循环或switch语句内部使用‌:Break语句不能用于退出嵌套的循环或switch语句。
  2. 不返回任何值‌:Break语句执行后,不会返回任何值,只是简单地跳出当前代码块‌。

continue语句

用于跳过当前循环的剩余语句,并直接进入下一轮循环。

continue语句只能在循环体内使用,通常用于在特定条件下终止当前迭代,而无需完全退出循环。例如,在打印奇数时,可以使用continue语句跳过偶数迭代。其语法形式为continue;,当执行时,它会跳过当前循环中剩余的语句,并立即进入下一次循环迭代‌。

使用场景和示例

在C语言中,continue语句常用于以下场景:

  • 跳过特定条件的迭代‌:例如,在打印1到10的奇数时,可以使用continue语句跳过偶数迭代。
  • 提高程序效率‌:在满足特定条件时,跳过某些代码的执行,从而提高程序的效率和灵活性。

goto语句

是一种非结构化的控制流语句,允许程序在没有任何条件的情况下跳转到指定的位置‌。其基本语法为:goto label;,其中label是程序中定义的标签,表示goto语句的目标位置‌。

goto语句主要用于以下场景:

  1. 处理错误或异常情况‌:在检测到错误时,可以使用goto跳转到错误处理代码。
  2. 跳过代码块并执行特定任务‌:在某些情况下,可以跳过某些代码块直接执行特定的任务。
  3. 创建无条件循环‌:在某些特殊情况下,可以使用goto实现无条件循环。

然而,使用goto语句也存在一些限制和缺点:

  • 可读性差‌:使用goto会使代码结构混乱,难以跟踪程序的执行流程。
  • 维护困难‌:增加代码的复杂性,使得维护和调试变得更加困难。
  • 可移植性问题‌:不同的编译器对goto的处理方式可能不同,可能导致代码在不同环境中表现不一致‌。

三.循环程序设计的应用

穷举

穷举法‌,也称为枚举法,是一种通过列举所有可能的情况来寻找问题的解决方案的方法。其基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。如果某个情况验证符合题目的全部条件,则该情况为一个解;如果全部情况验证后都不符合题目的全部条件,则本题无解‌。

穷举法的应用场景

穷举法适用于那些问题范围较小、解空间有限的情况。例如:

  • 数学问题‌:如求解方程的解、排列组合问题等。
  • 编程问题‌:如密码破解、简单的逻辑问题等。
  • 游戏编程‌:在游戏中,穷举法可以用来遍历所有可能的操作或状态,找到最优解或满足特定条件的解。

穷举法的优缺点

优点‌:

  • 简单直观‌:算法逻辑简单,容易理解和实现。
  • 适用范围广‌:适用于任何可以通过穷举法解决的问题。

缺点‌:

  • 效率低下‌:当问题的解空间非常大时,穷举法会消耗大量的计算资源和时间。
  • 不适用大规模问题‌:对于大规模问题,穷举法可能无法在合理的时间内找到解。

穷举法的实现方法

在C语言中实现穷举法通常使用循环语句和选择语句。循环语句用于穷举所有可能的情况,选择语句用于判定当前情况是否满足条件。例如,在解决一个简单的数学问题时,可以通过嵌套循环来遍历所有可能的输入值,然后通过条件判断语句来检查是否满足特定条件‌3。

实际应用示例

假设有一个简单的数学问题:求解方程 x+y=10 ,且x,y 为非负整数,且 x≤5。可以使用穷举法如下:

#include <stdio.h>
int main() 
{
    for (int x = 0; x <= 5; x++)
 {
        for (int y = 0; y <= 10 - x; y++) 
     {
            if (x + y == 10) 
         {
                printf("x = %d, y = %d\n", x, y);
           
                                    }
        
                            }
    
                       }
 return 0;                  
}

迭代

迭代‌是指在循环过程中重复执行一段代码,直到达到特定的条件为止。迭代可以通过几种不同的循环结构来实现,例如for循环while循环do-while循环‌。

迭代的基本概念和特点

  1. 定义‌:迭代是指在循环中重复执行一段代码,直到满足某个条件为止。
  2. 特点‌:迭代通过多次循环逐步逼近某个条件,通常包含一个循环表达式,通过不断更新变量值来逼近目标值‌12。

迭代在C语言中的应用场景

  1. 数值计算‌:迭代法是一种数值计算方法,通过不断更新近似值来逼近解。例如,在求解方程时,可以从一个初始近似值开始,通过迭代公式逐步逼近真实解‌。
  2. 函数展开‌:在数学和物理问题中,经常需要计算函数的展开式。

迭代在C语言中的实现方式

  1. for循环‌:适用于已知循环次数的情况。
  2. while循环‌:适用于未知循环次数,但有结束条件的情况。
  3. do-while循环‌:至少执行一次循环体,适用于至少需要执行一次的情况。

示例代码

使用while循环进行迭代的代码以求得π的近似值:

#include<stdio.h>
#include<math.h>

int main() {
    double x, sum, pi, eps;
    int i = 1;
    scanf("%lf %lf", &x, &eps);
    pi = x;
    sum = 1; // 初始化sum为第一项的值
    while(fabs(pi) >= eps) {
        sum = sum + pi;
        i = i + 1;
        pi = pi * x / i; // 更新pi的值
    }
    sum = sum + pi; // 处理最后一次迭代的结果
    printf("%.6f\n", sum); // 输出结果
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值