C语言课程回顾:六、C语言循环控制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

C语言循环控制

  • 6 循环控制
    • 6.1 概述
    • 6.2 goto语句以及用goto语句构成循环
    • 6.3 while语句
    • 6.4 do-while语句
    • 6.5 for语句
    • 6.6 循环的嵌套
    • 6.7 几种循环的比较
    • 6.8 break和continue语句
      • 6.8.1 break语句
      • 6.8.2 continue 语句
    • 6.9 程序举例


6 循环控制

6.1 概述

循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。

  1. 用goto语句和if语句构成循环;
  2. 用while语句;
  3. 用do-while语句;
  4. 用for语句;

6.2 goto语句以及用goto语句构成循环

goto语句是一种无条件转移语句, 与BASIC中的goto语句相似。goto 语句的使用格式为:
goto 语句标号;
其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处, 执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用, 当满足某一条件时, 程序跳到标号处运行。
goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用goto语句则比较合理。
【例6.1】用goto语句和if语句构成循环, 。

main()
{
        int i,sum=0;
        i=1;
loop:   if(i<=100)
          {sum=sum+i;
           i++;
           goto loop;}
         printf("%d\n",sum);
}

6.3 while语句

while语句的一般形式为:
while(表达式)语句
其中表达式是循环条件,语句为循环体。
while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用下图表示。

在这里插入图片描述

【例6.2】用while语句求 。
用传统流程图和N-S结构流程图表示算法,见图:

在这里插入图片描述
在这里插入图片描述

main()
{
   int i,sum=0;
   i=1;
   while(i<=100)
        {
sum=sum+i;
          i++;
         }
   printf("%d\n",sum);
}

【例6.3】统计从键盘输入一行字符的个数。

#include <stdio.h>
main(){
    int n=0;
    printf("input a string:\n");
    while(getchar()!='\n') n++;
    printf("%d",n);
}
 
本例程序中的循环条件为getchar()!='\n',其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。

使用while语句应注意以下几点:

  1. while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。
    【例6.4】
main(){
    int a=0,n;
    printf("\n input n:    ");
    scanf("%d",&n);
    while (n--)
      printf("%d  ",a++*2);
}

本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++2的值。该表达式等效于(a2;a++)。
2) 循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。

6.4 do-while语句

do-while语句的一般形式为:
do
语句
while(表达式);
这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。其执行过程可用下图表示。

在这里插入图片描述在这里插入图片描述

【例6.5】用do-while语句求 。
用传统流程图和N-S结构流程图表示算法,见图:

在这里插入图片描述
在这里插入图片描述

 
main()
{
   int i,sum=0;
   i=1;
   do
        {
sum=sum+i;
          i++;
         }
while(i<=100)
    printf("%d\n",sum);
}
 

同样当有许多语句参加循环时, 要用"{“和”}"把它们括起来。
【例6.6】while和do-while循环比较。

1main()
{int sum=0,i;
 scanf(%d”,&i);
 while(i<=10)
    {sum=sum+i;
     i++;
}
printf(“sum=%d”,sum);
}
2main()
{int sum=0,i;
 scanf(%d”,&i);
 do
   {sum=sum+i;
    i++;
}
while(i<=10);
printf(“sum=%d”,sum);
}
 

6.5 for语句

在C语言中,for语句使用最为灵活,它完全可以取代 while 语句。它的一般形式为:
for(表达式1;表达式2;表达式3) 语句
它的执行过程如下:

  1. 先求解表达式1。
  2. 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。
  3. 求解表达式3。
  4. 转回上面第2)步继续执行。
  5. 循环结束,执行for语句下面的一个语句。
    其执行过程可用下图表示。

在这里插入图片描述

for语句最简单的应用形式也是最容易理解的形式如下:
for(循环变量赋初值;循环条件;循环变量增量) 语句
循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后 按什么方式变化。这三个部分之间用“;”分开。
例如:

for(i=1; i<=100; i++)sum=sum+i;
   先给i赋初值1,判断i是否小于等于100, 若是则执行语句,之后值增加1。再重新判断, 直到条件为假,即i>100,结束循环。
相当于:
	i=1;
while(i<=100{ sum=sum+i;
     i++;
}

对于for循环中语句的一般形式,就是如下的while循环形式:
表达式1;
while(表达式2)
{语句
表达式3;
}
注意:

  1. for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。
  2. 省略了“表达式1(循环变量赋初值)”, 表示不对循环控制变量赋初值。
  3. 省略了“表达式2(循环条件)”, 则不做其它处理时便成为死循环。
    例如:
    for(i=1;;i++)sum=sum+i;
    相当于:

i=1;
while(1)
{sum=sum+i;
i++;}

  1. 省略了“表达式3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。
    例如:
for(i=1;i<=100;)
{sum=sum+i;
       i++;}
  1. 省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。
    例如:
for(;i<=100;)
{sum=sum+i;
    i++;}
相当于:
	while(i<=100)
		{sum=sum+i;
		 i++;}
  1. 3个表达式都可以省略。
    例如:
    for(;;)语句
    相当于:
    while(1)语句
  2. 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。
    例如:
    for(sum=0;i<=100;i++)sum=sum+i;
  3. 表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。
    for(sum=0,i=1;i<=100;i++)sum=sum+i;
    或:
    for(i=0,j=100;i<=100;i++,j–)k=i+j;
  4. 表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。
    例如:
    for(i=0;(c=getchar())!=’\n’;i+=c);
    又如:
    for(;(c=getchar())!=’\n’😉
    printf(“%c”,c);

6.6 循环的嵌套

【例6.7】

main()
{
 int i, j, k;
 printf("i j k\n");
 for (i=0; i<2; i++)
    for(j=0; j<2; j++)
       for(k=0; k<2; k++)
           printf(%d %d %d\n", i, j, k);
 }
 

6.7 几种循环的比较

  1. 四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用goto型循环。
  2. while和do-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。
  3. 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。

6.8 break和continue语句

6.8.1 break语句

break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。break在switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举例。
当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。即满足条件时便跳出循环。
【例6.8】

main()
{
   int i=0;
   char c;
   while(1)                 /*设置循环*/
     {
      c='\0';             /*变量赋初值*/
      while(c!=13&&c!=27) /*键盘接收字符直到按回车或Esc键*/
        {
         c=getch();
         printf("%c\n", c);
        }
      if(c==27)
         break;          /*判断若按Esc键则退出循环*/
      i++;
      printf("The No. is %d\n", i);
      }
    printf("The end");
 }

注意:

  1. break语句对if-else的条件语句不起作用。
  2. 在多层循环中, 一个break语句只向外跳一层。

6.8.2 continue 语句

continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。其执行过程可用下图表示。

1) while(表达式1)
     { ……
       if(表达式2)break;
       ……
} 

2) while(表达式1)
     { ……
       if(表达式2)continue;
       ……
}

在这里插入图片描述在这里插入图片描述

【例6.9】

main()
{
  char c;
  while(c!=13)      /*不是回车符则循环*/
      {
         c=getch();
         if(c==0X1B)
            continue; /*若按Esc键不输出便进行下次循环*/
         printf("%c\n", c);
       }
}

6.9 程序举例

【例6.10】用 公式求π。
N-S流程图:

在这里插入图片描述

#include<math.h>
main()
{
  int s;
  float n,t,pi;
  t=1,pi=0;n=1.0;s=1;
  while(fabs(t)>1e-6)
      {pi=pi+t;
       n=n+2;
       s=-s;
t=s/n;
      }
  pi=pi*4;       
  printf("pi=%10.6f\n",pi);
  }

【例6.11】判断m是否素数。
N-S流程图:

在这里插入图片描述

#include<math.h>
main()
{
int m,i,k;
scanf(%d”,&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)
printf(%d is a prime number\n”,m);
else
printf(%d is not a prime number\n”,m);
}

【例6.12】求100至200间的全部素数。

#include<math.h>
main()
{
int m,i,k,n=0;
for(m=101;m<=200;m=m+2)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)
{printf(%d”,m);
   n=n+1;}
      if(n%n==0)printf(“\n”);
}
printf(“\n”);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/766491.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统安装NVM,实现Node.js多版本管理

目录 一、前言 二、NVM简介 三、准备工作 1、卸载Node 2、创建文件夹 四、下载NVM 五、安装NVM 六、使用NVM 1、NVM常用操作命令 2、查看NVM版本信息 3、查看Node.js版本列表&#xff1b; 4、下载指定版本Node.js 5、使用指定版本Node.js 6、查看已安装Node.js列…

Java知识点整理 18 — Lambda表达式

一. 简介 Lambda 表达式是函数式编程思想的体现&#xff0c;强调做什么&#xff0c;而不是以什么方式去做。 面向对象编程思想强调的是对象&#xff0c;必须通过对象的形式来做一些事情。比如多线程执行任务&#xff0c;需要创建对象&#xff0c;对象需要实现指定接口&#x…

Rust监控可观测性

可观测性 在监控章节的引言中&#xff0c;我们提到了老板、前端、后端眼中的监控是各不相同的&#xff0c;那么有没有办法将监控模型进行抽象、统一呢&#xff1f; 来简单分析一下&#xff1a; 业务指标实时展示&#xff0c;这是一个指标型的数据( metric )手机 APP 上传的数…

若依 ruoyi vue上传控件 el-upload上传文件 判断是否有文件 判断文件大小

console.info(this.$refs.upload.uploadFiles.length)//this.$refs.upload.uploadFiles.length 获取当前上传控件中已选择的文件大小//判断是否存在已上传文件 if(this.$refs.upload.uploadFiles.length 0){this.$modal.msgWarning("请上传文件");return; }

轻松配置,无需重复操作:PyCharm新建项目后,如何让当前新建项目使用既有虚拟环境

1、点击右上角的设置按钮 2、点击Settings 3、点击profect 4、点击python Interprter&#xff0c;这个是python解释器 5、点击 add interpreter&#xff0c;这个是增加python解释器 6、再点击add Local interpreter 7、选择第一个Virtualenv Environment,然后选择Existin…

交叉编译tslib库和上机测试

目录 一、tslib 介绍 二、tslib 框架分析 三、交叉编译、测试 tslib 1.安装工具链 tslib &#xff08;1&#xff09;设置交叉编译工具链 &#xff08;2&#xff09;进入tslib目录 &#xff08;3&#xff09;安装工具链 &#xff08;4&#xff09;确定工具链中头文件、库…

Linux源码阅读笔记09-进程NICE案例分析1

task_nice task_nice函数功能&#xff1a;获取某个进程的nice值&#xff0c;其中nice值为进程的优先级&#xff0c;与静态优先级有关&#xff08;nicestatic_prio-120&#xff09;。 nice的取值范围&#xff1a;-20 ~ 19 内核源码 根据内核的注释可以知道&#xff1a;task_n…

13-Django项目--文件上传

目录 前端展示 路由: 数据库字段: 函数视图: 前端展示 {% extends "index/index.html" %}{% block content %}<div class"container"><input type"button" id"btnAdd" value"上传荣耀" class"btn btn-succ…

鼠标点击器免费版?详细介绍鼠标连点器的如何使用

随着科技的发展&#xff0c;鼠标连点器逐渐成为了我们生活和工作中不可或缺的工具。它不仅能够帮助我们完成频繁且重复的点击任务&#xff0c;还能在很大程度上减少我们的手部疲劳&#xff0c;提高工作效率。本文将详细介绍鼠标连点器的使用方法&#xff0c;并推荐三款好用的免…

to_json 出现乱码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

来咯,他来咯 看GitHub Codespaces 如何帮助缩短开发设置时间

在快节奏的软件开发世界中&#xff0c;效率和速度起着重要作用。对于开发人员来说&#xff0c;设置开发环境可能是一项耗时的任务。GitHub Codespaces 是一个基于云的环境&#xff0c;旨在通过提供对配置设置的访问来应对这一挑战。 本指南将帮助你开始使用 GitHub Codespaces …

Spring boot 更改启动LOGO

在resources目录下创建banner.txt文件&#xff0c;然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …

【面试干货】值传递与引用传递:理解Java中的参数传递机制

【面试干货】值传递与引用传递&#xff1a;理解Java中的参数传递机制 1、值传递&#xff08;Call by Value&#xff09;2、引用传递&#xff08;Call by Reference&#xff09;3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 值传递…

【Python】已解决:ERROR: No matching distribution found for JPype1

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ERROR: No matching distribution found for JPype1 一、分析问题背景 在安装Python的第三方库时&#xff0c;有时会遇到“ERROR: No matching distribution fo…

金融科技在反洗钱领域的创新应用

随着金融市场的不断发展和全球化趋势的加速&#xff0c;洗钱活动日益猖獗&#xff0c;给金融机构和社会经济安全带来了严重威胁。为了有效应对这一挑战&#xff0c;金融科技在反洗钱领域的应用逐渐崭露头角&#xff0c;为打击洗钱活动提供了强有力的技术支持。本文将从多个角度…

Python编写简单爬虫

文章目录 Python编写简单爬虫安装必要的库编写爬虫代码解析和存储数据注意事项 Python编写简单爬虫 安装必要的库 在开始编写爬虫之前&#xff0c;你需要安装一些必要的库。我们将使用requests库来发送HTTP请求&#xff0c;使用BeautifulSoup库来解析HTML内容。你可以使用以下…

气象观测站应设置在何处:选址的科学与策略

气象观测站在现代社会中扮演着至关重要的角色&#xff0c;它们不仅是气象数据的收集中心&#xff0c;也是气象预报和灾害预警的基础。然而&#xff0c;一个成功的气象观测站&#xff0c;其选址并不是随意的&#xff0c;而是需要综合考虑多种因素&#xff0c;以确保数据的准确性…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《面向电网调峰的电动汽车聚合商多层级实时控制策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

编译调试swift5.7源码

环境&#xff1a; 电脑&#xff1a;apple m1 pro系统&#xff1a;macOS13Xcode: 14.2Cmake: 3.25.1Ninja: 1.11.1sccache: 0.3.3python: 3.10 (如果你的mac不是这个版本&#xff0c;可以通过 brew install python3.10下载&#xff0c;然后看这篇文章切换到该python版本)swift代…