C语言循环语句

前言:

        在 C 语言中,循环具有重要的意义和作用,主要体现在以下几个方面:

        (指针,算法方面的相关知识对初学循环语句尽可能先不进行了解)

一、重复执行代码

  1. 提高效率:
    • 避免重复编写相同或相似的代码。例如,如果需要对一个数组中的所有元素进行相同的操作,使用循环可以大大减少代码量。
    • 假设要计算一个整数数组中所有元素的和,没有循环的情况下,可能需要逐个对每个元素进行加法操作,代码会非常冗长。而使用循环,可以简洁地实现这个功能:

   int arr[] = {1, 2, 3, 4, 5};
   int sum = 0;
   int length = sizeof(arr) / sizeof(arr[0]);
   for (int i = 0; i < length; i++) {
       sum += arr[i];
   }

  1. 动态处理数据:
    • 当处理的数据量不确定时,循环可以根据实际情况动态地执行代码。比如从文件中读取数据,不知道文件中有多少行数据,使用循环可以逐行读取直到文件末尾。
    • 以下是一个从文件中读取数据并统计行数的例子:

   FILE *fp;
   char ch;
   int lineCount = 0;
   fp = fopen("data.txt", "r");
   if (fp == NULL) {
       printf("Error opening file.\n");
       return 1;
   }
   while ((ch = fgetc(fp))!= EOF) {
       if (ch == '\n') {
           lineCount++;
       }
   }
   fclose(fp);

二、控制程序流程

  1. 条件判断和迭代:
    • 循环通常结合条件判断语句,根据特定条件来控制循环的执行次数或是否继续执行。这使得程序能够根据不同的情况动态地调整执行路径。
    • 例如,使用while循环根据用户输入的数字进行不同的操作,直到用户输入特定的退出值:
   int num;
   do {
       printf("Enter a number (enter 0 to exit): ");
       scanf("%d", &num);
       // 根据 num 的值进行不同的处理
   } while (num!= 0);

  1. 遍历数据结构:
    • 对于数组、链表、树等数据结构,循环是遍历它们的主要方式。可以逐个访问数据结构中的元素,进行查找、修改、删除等操作。
    • 对于链表的遍历,通常使用while循环,直到到达链表的末尾:
   struct Node {
       int data;
       struct Node *next;
   };

   struct Node *head = NULL;
   // 假设已经创建了链表

   struct Node *current = head;
   while (current!= NULL) {
       // 对当前节点进行操作
       current = current->next;
   }

三、实现复杂算法

  1. 迭代算法:
    • 许多算法需要通过多次迭代来达到最终的结果。例如排序算法(如冒泡排序、快速排序等)、搜索算法(如线性搜索、二分搜索等)都依赖循环来实现重复的比较和交换操作。
    • 冒泡排序的示例:
   int arr[] = {5, 3, 8, 2, 1};
   int n = sizeof(arr) / sizeof(arr[0]);
   for (int i = 0; i < n - 1; i++) {
       for (int j = 0; j < n - i - 1; j++) {
           if (arr[j] > arr[j + 1]) {
               int temp = arr[j];
               arr[j] = arr[j + 1];
               arr[j + 1] = temp;
           }
       }
   }

  1. 递归算法的替代:
    • 在一些情况下,循环可以替代递归实现某些功能,避免递归可能带来的栈溢出问题。例如计算阶乘,既可以使用递归实现,也可以使用循环实现:
   // 使用循环计算阶乘
   int factorial(int n) {
       int result = 1;
       for (int i = 2; i <= n; i++) {
           result *= i;
       }
       return result;
   }

(C语言三大循环语句 while,for,do.while)

while循环:

一、语法结构

while (条件表达式) {循环体}

二、执行过程

  1. 首先判断条件表达式。如果条件表达式的值为真(非零值),则进入循环体执行其中的语句。
  2. 执行完循环体后,再次判断条件表达式,若仍为真,则继续执行循环体;若为假,则退出循环,执行循环后面的语句。

三、示例

以下是一个使用while循环计算 1 到 10 的和的例子:

#include 

int main() {
    int sum = 0;
    int i = 1;
    while (i <= 10) {
        sum += i;
        i++;
    }
    printf("The sum of 1 to 10 is %d\n", sum);
    return 0;
}

在这个例子中,首先初始化变量i为 1,然后在while循环中,只要i小于等于 10,就将i累加到sum中,并将i的值增加 1。当i大于 10 时,循环结束。

四、应用场景

  1. 不确定循环次数,但可以通过某个条件来控制循环的情况。
    • 例如读取用户输入,直到用户输入特定的结束标志。假设要读取用户输入的整数,直到用户输入 0,则可以这样写:
   int num;
   while ((scanf("%d", &num) == 1) && (num!= 0)) {
       // 对输入的数字进行处理
   }

  1. 处理动态数据的情况。
    • 比如从文件中读取数据,不知道文件中有多少数据,只要没有到达文件末尾,就继续读取。可以使用while循环结合文件操作函数来实现:

   FILE *fp;
   char ch;
   fp = fopen("myfile.txt", "r");
   if (fp == NULL) {
       printf("Error opening file.\n");
       return 1;
   }
   while ((ch = fgetc(fp))!= EOF) {
       // 处理读取到的字符
   }
   fclose(fp);

for循环

一、语法结构

for (初始化表达式; 条件表达式; 更新表达式) {循环体}

二、执行过程

  1. 初始化表达式:在循环开始时执行一次,通常用于初始化一个循环计数器。
  2. 条件表达式:在每次循环开始前进行判断,如果条件为真(非零值),则执行循环体;如果条件为假(零值),则退出循环。
  3. 循环体:当条件表达式为真时,执行循环体中的代码。
  4. 更新表达式:在每次循环体执行完后执行,通常用于更新循环计数器。
  5. 重复步骤 2 到 4,直到条件表达式为假。

三、示例

以下是一个使用for循环输出数字 1 到 5 的例子:

#include 

int main() {
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    return 0;
}

四、应用场景

  1. 已知循环次数的情况:
    • 当明确知道循环要执行的次数时,for循环非常方便。例如遍历一个具有固定长度的数组:
   int arr[] = {1, 2, 3, 4, 5};
   int length = sizeof(arr) / sizeof(arr[0]);
   for (int i = 0; i < length; i++) {
       printf("%d ", arr[i]);
   }

  1. 多重循环:
    • for循环可以嵌套使用,实现复杂的算法和数据结构操作。例如生成二维数组的乘法表:
   for (int i = 1; i <= 10; i++) {
       for (int j = 1; j <= 10; j++) {
           printf("%d\t", i * j);
       }
       printf("\n");
   }
  1. 动态控制循环:
    • 虽然初始化表达式、条件表达式和更新表达式通常是固定的,但也可以在运行时动态地改变它们的值,以实现更加灵活的循环控制。
    • 例如,根据用户输入的数字来决定循环的次数:

五、注意事项

  1. 循环条件的正确性:确保条件表达式能够正确地控制循环的开始和结束,避免出现无限循环或循环次数不足的情况。
  2. 循环变量的作用域:注意循环变量的作用域,避免在循环外部意外地使用或修改循环变量。
  3. 循环的效率:在循环体内尽量避免进行复杂的计算或函数调用,以提高循环的执行效率。

do .. while循环

一、语法结构

do {循环体} while (条件表达式);

二、执行过程

  1. 首先执行循环体中的代码。
  2. 执行完循环体后,判断条件表达式。如果条件表达式的值为真(非零值),则再次执行循环体;如果条件表达式的值为假(零值),则退出循环。

三、示例

以下是一个使用do-while循环输出数字 1 到 5 的例子:

#include 

int main() {
    int i = 1;
    do {
        printf("%d ", i);
        i++;
    } while (i <= 5);
    return 0;
}

四、应用场景

  1. 确保循环体至少执行一次:
    • 当需要确保循环体中的代码至少执行一次时,do-while循环非常有用。例如,在用户输入验证的场景中,如果要求用户必须输入一个有效的值,那么可以使用do-while循环来确保用户至少输入一次,并且在输入无效时继续提示用户输入,直到输入有效为止。

   int num;
   do {
       printf("Enter a positive number: ");
       scanf("%d", &num);
   } while (num <= 0);

  1. 处理不确定次数的循环:
    • while循环类似,do-while循环也可以用于处理不确定次数的循环,但是由于它先执行循环体,所以在某些情况下更加灵活。例如,从文件中读取数据,直到文件末尾,可以使用do-while循环来确保至少读取一次数据,然后在每次读取后判断是否到达文件末尾。
   FILE *fp;
   char ch;
   fp = fopen("data.txt", "r");
   if (fp == NULL) {
       printf("Error opening file.\n");
       return 1;
   }
   do {
       ch = fgetc(fp);
       // 处理读取到的字符
   } while (ch!= EOF);
   fclose(fp);

五、注意事项

  1. 条件判断的位置:

    • 注意条件表达式是在循环体执行完后进行判断的,这与while循环和for循环不同。因此,在编写do-while循环时,要确保在循环体中对影响条件表达式的变量进行正确的更新,以避免出现无限循环。
  2. 循环的退出条件:

    • 仔细考虑循环的退出条件,确保在适当的时候能够退出循环。如果退出条件设置不当,可能会导致无限循环,使程序陷入死循环状态。

三大循环的区别

一、语法结构上的区别

  1. for循环:

    • for (初始化表达式; 条件表达式; 更新表达式) {循环体}
    • 初始化表达式在循环开始时执行一次,用于初始化循环变量;条件表达式在每次循环开始前进行判断,决定是否继续循环;更新表达式在每次循环体执行完后执行,通常用于更新循环变量。
  2. while循环:

    • while (条件表达式) {循环体}
    • 只有条件表达式为真时才执行循环体,条件表达式在每次循环开始前进行判断。
  3. do-while循环:

    • do {循环体} while (条件表达式);
    • 先执行一次循环体,然后再判断条件表达式,若为真则继续循环,否则退出循环。

二、执行顺序的区别

  1. for循环:

    • 首先执行初始化表达式,然后判断条件表达式,若为真则执行循环体,接着执行更新表达式,再回到条件表达式进行判断,如此重复,直到条件表达式为假。
  2. while循环:

    • 先判断条件表达式,若为真则执行循环体,执行完循环体后再次判断条件表达式,重复这个过程,直到条件表达式为假。
  3. do-while循环:

    • 先执行循环体,然后判断条件表达式,若为真则再次执行循环体,重复这个过程,直到条件表达式为假。

三、适用场景的区别

  1. for循环:

    • 适用于已知循环次数的情况,或者循环变量的初始化、更新和条件判断都比较清晰的情况。
    • 例如,遍历一个具有固定长度的数组、执行固定次数的操作等。
  2. while循环:

    • 适用于不确定循环次数,但可以通过某个条件来控制循环的情况。
    • 例如,读取用户输入,直到满足特定条件为止;或者在处理动态数据时,根据某个条件来决定是否继续循环。
  3. do-while循环:

    • 适用于确保循环体至少执行一次的情况。
    • 例如,在用户输入验证场景中,要求用户至少输入一次,然后根据输入进行判断是否继续循环;或者在处理某些需要先执行一次操作再判断条件的情况。

四、注意事项的区别

  1. for循环:

    • 要注意初始化表达式、条件表达式和更新表达式的正确性,避免出现无限循环或循环次数错误的情况。同时,循环变量的作用域要明确,避免在循环外部意外地使用或修改循环变量。
  2. while循环:

    • 确保条件表达式在适当的时候变为假,以避免无限循环。在循环体内要注意对影响条件表达式的变量进行正确的更新。
  3. do-while循环:

    • 同样要注意条件表达式的正确性,避免无限循环。由于是先执行循环体再判断条件,所以在第一次执行循环体时可能会出现一些意外情况,要确保第一次执行循环体是合理的。

你可能感兴趣的:(c语言,数据结构,开发语言)