第四章 循环结构程序设计

第一节 while循环语句

  • C语言包含3大基本结构:顺序结构、选择结构、循环结构(重复结构)。大多数的应用程序都会包含循环结构。循环结构顺序结构选择结构是结构化程序设计的3种基本结构,它们是各种复杂程序的基本构成单元。

  • while语句的一般形式:while (表达式) 语句

  • 只要当循环条件表达式为真(即给定的条件成立),就立即执行循环体语句。

    • 练习:实现将公元0年~10000年的所有闰年都打印出来。

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jfljrR4N-1586266749555)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第四章\4-1-1-闰年流程图.png)]

    • #include <stdio.h>
      int main() {
          int year = 0;
          while (year <= 10000) {
              if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
                  printf("%d年是闰年\n", year);
              ++year;
          }
          return 0;
      }

第二节 do···while循环语句

  • 除了while语句以外,C语言还提供了do···while语句来实现循环结构。

  • do ··· while 语句的一般形式为:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kvEUMq1O-1586266749556)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第四章\4-2-1-dowhile.png)]
  • do ··· while 语句的执行过程是:先执行循环体,然后再检查条件是否成立,若成立,再执行循环体。

  • do ··· while 语句的特点:先无条件的执行循环体,然后再判断循环条件是否成立,如果成立,返回到语句继续执行。如果不成立,则结束do···while,继续向下执行剩余代码。

  • 练习:求1+2+3+···+n的和,n由用户输入

    • #include <stdio.h>
      int main() {
      	int i = 1, n, sum = 0;
      	printf("请输入要求多少的累加和\n");
      	scanf("%d", &n);
      	do {
      		sum += i;
      		i++;
      	} while (i <= n);
      	printf("1~%d的累加和为:%d\n", n, sum);
      	return 0;
      }

第三节 用for语句实现循环

  • 除了while语句和do···while语句实现循环体外,C语言还提供了for语句实现循环,而且for语句更为灵活,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJXR5oC0-1586266749556)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第四章\4-3-3-for流程图.png)]
  • for语句的一般形式:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OEWaWNah-1586266749557)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第四章\4-3-1-for.png)]
    • 表达式1:设置初始条件,只执行1次。可以为零个、一个或多个变量设置初值(如i = 1)。
    • 表达式2:循环条件表达式,用来判定是否继续循环,在每次执行循环体前先执行此表达式,决定是否继续执行循环。
    • 表达式3:作为循环的调整,例如使循环变量增值,它是在执行完循环体后才进行的。
  • 最常用的for语句形式是:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BOPTjg2N-1586266749558)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第四章\4-3-2-常用for语句形式.png)]
  • 代码示例

    • #include <stdio.h>
      int main() {
          int year = 0;
          for (; year <= 10000;  ++year) {
              if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
                  printf("%d年是闰年\n", year);
          }
          return 0;
      }
  • 说明:

      1. for语句的一般形式如下:for (表达式1;表达式2;表达式3) 语句,可以改写为while循环的形式如下,二者无条件等价。
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZhG8rG0-1586266749558)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第四章\4-3-4-改写.png)]
      1. 表达式1可以省略,即不设置初值,但表达式1后面的分号不能省略,代表空语句,例如for (; i <= 100; i++)

      2. 表达式2也可以省略,即不用表达式2来作为循环条件表达式,不设置和检查循环的条件,如for (i = 1;;i++),此时循环无终止地进行下去,也就是认为表达式2始终为真,即死循环。

      3. 表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束,例如:

        for (i = 1; i<= 100;) {//没有表达式3
            sum += i;
            i++;//在循环体中使循环变量增值
        }
      4. 如果表达式1和表达式3都没有,只有表达式2,即只给循环条件,但是应当在for语句前给循环变量赋初值,否则无法正常执行,如:

        int i = 1;
        for (; i <= 100;) {
            sum += i;
            i++;
        }
      5. 甚至可以将3个表达式都省略,即不设初值,不判断条件(认为表达式2为真值),循环变量也不增值,无终止地执行循环体语句,没有实用价值,如:

        for (; ;) printf("%d\n", i);

        相当于:

        while (1) printf("%d\n", i);
      6. 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式,如:

        for (sum = 0; i <= 100; i++) sum += i;

        表达式3也可以是与循环控制无关的任意表达式。但不论怎样写for语句,都必须使循环能正常运行。

      1. 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔,如:
      for (sum = 0,i = 0; i <= 100; i++) sum += i;

      for (i = 0, j = 100; i <= j; i++, j--) k = i + j;

      表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值(i = 0, j = 100),使两个变量增值(i++, j–),在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为最右边表达式的值。

      1. 表达式2一般是关系表达式(如i <= 100)或逻辑表达式(如a<b && x<y),但也可以是数值表达式或字符表达式,只要其值非零,就执行循环体。如:
      for (i = 0; (c = getchar()) != '\n'; i += c);

      在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达式的值是否不等于’\n’(换行符),如果不等于’\n’,就执行循环体。改行代码的作用是不断输入字符,将它们的ASCII码相加,直到输入一个换行符为止。此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。

      for (; (c = getchar()) != '\n';) printf("%c\n", c);

      for语句中只有表达式2,没有表达式1和表达式3。其作用是每读入一个字符后立即输出该字符,直到输入一个“换行”为止。

      1. C99允许在for语句的“表达式1”中定义变量并赋初值,如:
      for (int i = 1; i <= 100; i++) sum += i;

      显然,这可以使程序简练,灵活方便。但应注意:所定义的变量的有限范围只限于for循环中,在循环外不能使用此变量。

第四节 循环的嵌套

  • 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层嵌套。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7f4wjase-1586266749558)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第四章\4-4-1-循环嵌套.png)]

  • 注意:嵌套循环,将内层循环执行完之后执行一次外层循环。

  • 几种循环的比较:

      1. 3种循环都可以用来处理同一问题,一般情况下可以互相替换。
      2. for语句中包含了3个表达式,而while语句只有一个表达式。
      3. for语句可以对值进行初始化,for语句更加强大。
  • 练习:打印九九乘法表

    • #include <stdio.h>
      int main() {
      	int i, j;
      	for (i = 1; i <= 9; i++) {
      		for (j = 1; j <= i; j++)
      			printf("%d*%d=%2d\t", i, j, i * j);
      		printf("\n");
      	}
      	return 0;
      }
  • 嵌套循环实现时钟

    • #include <stdio.h>
      #include <Windows.h>
      int main() {
      	int h, m, s;
      	for (h = 0; h <= 24; ++h) {
      		for (m = 0; m <= 60; ++m) {
      			for (s = 0; s <= 60; ++s) {
      				Sleep(100);
      				printf("\r%dh-%dm-%ds", h, m, s);//  \r让打印的内容在当前行进行显示
      			}
      		}
      	}
      	return 0;
      }

第五节 改变循环执行的状态

  • 用break语句提前终止循环

    • break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出当前循环体,即提前结束循环,接着执行循环下面的语句。

    • 练习:计算1+2+3+···+n,一直累加,当值大于n(n由用户输入)时,打印一共累加了几个数,并结束程序?

    • #include <stdio.h>
      int main() {
      	int i, sum, n;
      	scanf("%d", &n);
      	for (i = 1, sum = 0;; i++) {
      		sum += i;
      		if (sum > n) {
      			printf("一共累加了%d个数\n", i);
      			break;
      		}
      	}
      	return 0;
      }
  • 用continue语句提前终止循环

    • continue语句用来跳出本次循环的剩余部分,继续进行下一轮循环。

    • 练习1:求斐波那契数列前40个数,特点:第1,2个数为1,从第3个数开始,该数是前面两个数之和

    • #include <stdio.h>
      int main() {
          int f1 = 1, f2 = 1, f3, i;
          printf("%d\n%d\n", f1, f2);
          for (i = 1; i <= 38; i++) {
              f3 = f1 + f2;
              printf("%d\n", f3);
              f1 = f2;
              f2 = f3;
          }
          return 0;
      }
    • 练习2:输入一个大于3的整数n,判断它是否为素数

    • #include <stdio.h>
      int main() {
      	int i, n;
      	printf("请输入一个数字:\n");
      	scanf("%d", &n);
      	for (i = 2; i < n; i++)
      		if (n % i == 0) break;
      	if (i < n)
      		printf("%d不是素数\n", n);
      	else
      		printf("%d是素数\n", n);
      	return 0;
      }
    • 练习3:判断100以内的所有素数

    • #include <stdio.h>
      int main() {
      	int i, n = 2;
      	while (n <= 100) {
      		for (i = 2; i <= n; i++)
      			if (n % i == 0) break;
      		if (i < n)
      			printf("%d不是素数\n", n);
      		else
      			printf("%d是素数\n", n);
      		++n;
      	}
      	return 0;
      }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值