学长教你学C-day9-C语言循环结构与选择结构

news2024/11/19 23:40:52

  小刘最近在读《老子》,被道家“一生二,二生三”的哲学思想迷住了,他不禁想代码是谁生的呢?首先代码就是一堆字符,字符不是代码,就像“白马非马”,但是当字符按照一定的顺序组织起来时,就有点逻辑了,杂乱无章的字符好像有规律可循了,再给每个字符赋予一定意义,那么代码就出现了。表达一定含义的字符有序组合,就是代码。那么是不是就可以说,思维生逻辑,逻辑生结构,结构生代码呢?这时一个QQ消息的声音传来打破了小刘的沉思,上面写着:“学长你怎么还没来?”,小刘一拍脑袋说:“坏了,忘了今晚上课了!”说着就披上一衣服飞奔到教室。
  “同学们,昨天给大家讲了C语言中最常用的三大运算符,有算数运算符、关系运算符和逻辑运算符。其中算数运算符是对数据进行加减乘除的,关系运算符是用来对数据进行比较大小的,逻辑运算符是对数据进行“与、或、非”逻辑运算的。其中后两种运算符单用的时候不多,通常都是在选择结构或者循环结构中使用的。”
  “我们先来说说选择结构,选择结构又称分支结构,意思上很好理解,就像是一条路的走着走着出现了两条分支,需要你判断到底要走哪边。如图:”

黑板:
在这里插入图片描述

  “而选择结构就是用代码体现出这种效果,让程序运行的时候能有多个不同的选择。”
  “下面我们就来看一下最经典的选择结构if…else…”
  “if…else…明显是有两条分支选择结构。它的语法定义如下:”

if(bool){…}else{…}
流程图:在这里插入图片描述

  “其中if后面括号里是布尔类型参数,如果参数类型为真,则执行if后面{ } 里的语句;如果参数类型为假,则执行else 后面{ }里的语句。其中括号里的代码被称为条件语句,就是判断应该走哪边的选择器。举个例子:分岔路口中间的告示牌,就相当于if…else…中的条件语句。它能给程序指出一条明路,到底应该走哪边。”

黑板

在这里插入图片描述

  “代码实例:[code_1]”

#include<stdio.h>
int main()
{
	int a;
	int b;
	a = 1;
	b = 2;
	printf("a=%d\nb=%d\n",a,b);
	if(a<b)
	{
		printf("a小于b\n");	
	}else{
		printf("a大于或等于b\n");
	}
	return 0;
} 

输出:
在这里插入图片描述

  “上述代码我们使用了if…else…语句,其中条件语句为a<b(a=1,b=2),条件成立,所以返回值为真,程序执行 if 语句的代码:a小于b。当条件为假时(修改上面代码中条件语句符号为>),程序则会执行else语句中的代码:[code2]”

#include<stdio.h>
int main()
{
	int a;
	int b;
	a = 1;
	b = 2;
	printf("a=%d\nb=%d\n",a,b);
	if(a>b)
	{
		printf("a小于b\n");	
	}else{
		printf("a大于或等于b\n");
	}
	return 0;
} 

输出
在这里插入图片描述

  “从结果来看,条件明显是假的。”

  “上面说的是两条分支的选择结构,那么如果我的选择不只有两个该怎么办呢?下面我们再介绍一种if…else…的升级版:if…else if…else语句。”

语法:
if(bool){
……
}
else if(bool){
……
}
……
else{
}
程序流程图
在这里插入图片描述

  “由上述结构可以看出,该选择结构中 else if 分支可以有多个,if和else头尾各一个。且该结构具有连续性,如果其中一条不成立就进行下一条判断,直到最后的else判断结束。如果其中有一条成立,则往下不再进行判断。示例代码[code_3]”

#include<stdio.h>
int main()
{
	int a;
	a = 3;
	if(a==1)
	{
		printf("a=1\n");	
	}
	else if(a==2)
	{
		printf("a=2\n");
	}
	else if(a==3)
	{
		printf("a=3\n");
	}
	else
	{
		printf("a=4\n");
	}
	return 0;
} 

输出:
在这里插入图片描述

  “ if 语句既能进行两个选项直接的选择还能进行多个选项之间的选择,那么if 单独能不能进行一个选择呢?可以的,但是那不叫‘选择’,通常叫做叫‘判断’,if 语句在程序中单独出现的时候,它不会影响程序的走向,但是如果程序中if 前面的代码符合if条件时,那么 if 语句中的代码就会执行。否则不执行。举个例子:[code_4]”

#include<stdio.h>
int main()
{
	int a;
	a = 0;
	if(a==1)
	{
		a++;	
	}
	printf("a=%d",a);
	return 0;
} 

输出:
在这里插入图片描述

  “程序中只有单独的一个if语句出现,当if语句前的代码不满足if 语句的条件时,则if语句不予执行,所以输出的是a=0;但是当if前面的代码满足if条件时,if语句里的代码才会执行,如下:[code_5]”

#include<stdio.h>
int main()
{
	int a;
	a = 1;
	if(a==1)
	{
		a++;	
	}
	printf("a=%d",a);
	return 0;
} 

输出
在这里插入图片描述

  “所以这里需要强调的是,if和else或else if联合出现时,是选择语句,单独出现时,主要作用是进行判断的。”

  “多选择分支除了if …else if… else 以外,C语言中还有一个语法结构是实现多选择的,那就是‘开关语句’。”
  “开关语句的语法结构是这样的:”

switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;

case 整型数值n: 语句 n;
default: 语句 n+1;
}
流程图:
在这里插入图片描述

  “它和else if语句作用相同,都是C语言中的选择结构,但是他们的实现方式却有很大区别,if语句中的条件语句可以是任何变量,只有结果为“真”或“假”就能运行。而switch语句中的所有分支的条件必须是同一变量的不同值,哪个分支符合条件就走哪条分支。其次,当条件变量唯一时,switch语句的写法比else if更加简洁,下面举个例子:[code_6]”

//if语句
#include <stdio.h>
int main(){
    int a;
    printf("Input integer number:");
    scanf("%d",&a);
    if(a==1){
        printf("Monday\n");
    }else if(a==2){
        printf("Tuesday\n");
    }else if(a==3){
        printf("Wednesday\n");
    }else if(a==4){
        printf("Thursday\n");
    }else if(a==5){
        printf("Friday\n");
    }else if(a==6){
        printf("Saturday\n");
    }else if(a==7){
        printf("Sunday\n");
    }else{
        printf("error\n");
    }
    return 0;
}

输出:
在这里插入图片描述

//switch语句
#include <stdio.h>
int main(){
    int a;
    printf("Input integer number:");
    scanf("%d",&a);
    switch(a){
        case 1: printf("Monday\n"); break;
        case 2: printf("Tuesday\n"); break;
        case 3: printf("Wednesday\n"); break;
        case 4: printf("Thursday\n"); break;
        case 5: printf("Friday\n"); break;
        case 6: printf("Saturday\n"); break;
        case 7: printf("Sunday\n"); break;
        default:printf("error\n"); break;
    }
    return 0;
}

输出
在这里插入图片描述

  “switch语句中还有一点需要注意,那就是每个分支后面的break,如果不在分支后面加break,则会依次执行下面每一个分支;只有分支后面break时,程序才会执行到此就结束。break就像是水渠里的闸门,没有的话水就会继续往下流淌。”
  “示例如下:[code_7]”

#include <stdio.h>
int main(){
    int a;
    printf("Input integer number:");
    scanf("%d",&a);
    switch(a){
        case 1: printf("Monday\n"); 
        case 2: printf("Tuesday\n"); 
        case 3: printf("Wednesday\n"); 
        case 4: printf("Thursday\n"); 
        case 5: printf("Friday\n"); 
        case 6: printf("Saturday\n"); 
        case 7: printf("Sunday\n"); 
        default:printf("error\n"); 
    }
    return 0;
}

输出:
在这里插入图片描述

  “选择结构就给大家讲这么多,下面我们来讲C语言中另一个常用的结构——“循环结构”。”
  “什么是循环结构呢?举个例子,大家假假期看没看过电视剧《开端》?里面的男女主角在公交车上为了阻止炸弹爆炸一次又一次的死而复生,陷入了一个死循环中,而跳出循环的办法就是成功的阻止炸弹不在公交车上爆炸。用一个流程图来表示就是:”

这里是引用
如果炸弹炸了,主角被炸死就要复活重新阻止炸弹爆炸,直到成功阻止爆炸,才能结束循环。

  “C语言中的循环结构也是同理,它的流程图如下:”

这里是引用

  “C语言中有三种循环结构,分别是while、do-while和for循环。上述流程图就是最好理解的while语句的流程图。只要定义一个循环条件,判断条件是否为真,为真就执行里面的循环语句,为假就跳出循环。它的语法为:”

while(表达式){
语句块
}

  “下面我们就把刚才的事例用C语言代码表达一下:[code_8]”

#include <stdio.h>
int main(){
    int a = 1;//a=1表示炸弹爆炸,a=0表示爆炸被成功阻止
	int b = 0;//b表示主角复活次数 
    while(a){
    	printf("炸弹爆炸了!\n");
		b++; 
		if(b==10){
			printf("爆炸被成功阻止!\n"); 
			a=0;//条件为假,跳出循环	
		}
	}
	printf("主角复活次数:%d\n",b);
    return 0;
}

输出:
在这里插入图片描述
我们据此可以看到,炸弹爆炸了10次,主角复活了十次,最后一次炸弹没有爆炸,是因为被成功阻止了,且终于结束了循环。

  “上述代码中,我们可以看出,是因为,b=10时,变量a变成了0,此时不在符合while语句的循环条件,故此跳出循环,那么假如我们想不遵守遵守条件不遵守谋值时就跳出循环可不可以呢?答案是可以的。还记的我们switch语句中讲的分支“水闸”吗,循环中我们一样能用break阻止循环的继续。代码如下:[code_9]”

#include <stdio.h>
int main(){
    int a = 1;//a=1表示炸弹爆炸,a=0表示爆炸被成功阻止
	int b = 0;//b表示主角复活次数 
    while(a){
    	printf("炸弹爆炸了!\n");
		b++; 
		if(b==10){
			printf("爆炸被成功阻止!\n"); 
			break;	
		}
	}
	printf("主角复活次数:%d\n",b);
    return 0;
}

输出:
在这里插入图片描述

  “上面代码中的a=0,换成了break,也能同样跳出循环,但是需要注意的是,break是强制退出,往往强制的办法都是我们最后的杀手锏,所以能不用就尽量不用。”
  “如果说我们只是想跳过一次循环,而不是把整个循环截断,那该怎么办呢?答案是用continue关键字,而不是break。如下:用循环输出数字1~10中的奇数。[code_10]”

#include <stdio.h>
int main(){
    int a = 0;
    while(a<10){
    	a++;
    	if(a%2==0){
	    	continue;//跳过当前迭代 
		}  
    	printf("%d ",a);
	}
    return 0;
}

输出:
在这里插入图片描述
关于continue的更多详情请看
在这里插入图片描述

  “从上面的代码结构中我们能看出while循环的规律是先判断条件在执行循环体,那么有没有一种结果是先执行循环体在判断符不符合条件的呢?答案是:有的。那就是while循环的表亲,do-while循环。”

语法表达式:
do{
语句块
}while(表达式);

示例代码[code_11]

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

输出:
在这里插入图片描述
对比while[code12]

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

输出:
在这里插入图片描述
  “这个代码并没有体现出两种循环的大致区别,但是从本质上while循环先进行条件判断,属于先礼后兵;do-while循环先执行循环体然后再进行判断,属于先斩后奏;所以根据这点特性来看,遇到具体问题要具体分析使用哪个方式更好。”

  “下面我们来讲最后一个循环结构——for循环。”
  “for循环与前两个循环的区别在于,它循环条件的表达式更多,更加灵活。”
  “语法结构和流程图如下:”

语法结构:
for(表达式1; 表达式2; 表达式3){
语句块
}

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

  “从结构流程图我们不难看出,for循环有三个表达式,作用分别是循环条件初始化、判断是否继续进行循环、条件迭代。其中如果三个表达式都没有则是一个死循环。[code_13]”

#include <stdio.h>
int main(){
    int a = 0;
    for(;;)
    {
    	printf("%d",a);
	}
    return 0;
}

输出:
在这里插入图片描述

如果不停止循环将一直进行下去。
  “如果只没有中间的条件,也是同理。[code_14]”

#include <stdio.h>
int main(){
    int a = 0;
    for(int i = 0;;i++)
    {
    	printf("%d",i);
	}
    return 0;
}

在这里插入图片描述  “下面举一个正常点的例子,用for循环输出1~10:[code_15]”

#include <stdio.h>
int main(){
    for(int i = 1;i<11;i++)
    {
    	printf("%d ",i);
	}
    return 0;
}

输出:
在这里插入图片描述
  “下面举一个正常点的例子,用for循环输出1~100内的奇数:[code_16]”

#include <stdio.h>
int main(){
    for(int i = 1;i<101;i++)
    {
    	if(i%2==0) continue;
    	printf("%d ",i);
	}
    return 0;
}

输出:
在这里插入图片描述
  “下面举一个难一点的例子,用两层for循环打印成法口诀:[code_17]”

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

输出:
在这里插入图片描述  “好了,循环就讲这么多了,这节课内容比较多,大家好好消化吸收。尤其是课下多敲代码,好好体会循环的奥妙。”

  “其实除了这两种结构外,C语言中还有一种默认的语法结构,或者说所有的语言都有这种结构,你们能猜出来是什么吗?它就是:顺序结构。我们的代码都是从上到下写的,计算机也是从上到下进行识别的,甚至当我们学计算机网络时,你们也会听到,计算机网络是自顶向下设计的,这就是我们计算机人都遵守的一种不成文的规定,那就是程序代码或者结构基本上都是从上至下的,包括我们的C语言最基本的结构就是顺序结构。”

  “今天就给大家讲这么多,三种结构(顺序、选择、循环)一定要牢记于心,下课。”

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Python编程无师自通》读书笔记

不能越界访问函数内部定义的变量 global不能乱用 啥时候用元组 join连接 小点&#xff0c;但第一次见会觉得蛮有意思。 Hangman 10.1的案例蛮有意思的 一搜才发现是十分经典的文字游戏 过程式编程的缺点以及函数式编程和面向对象编程的解决方法 过程式编程的缺点 函数式编程…

Web学习笔记-中期项目(拳皇)

CONTENTS项目原理一、基础文件二、ac_game_object框架三、游戏地图与玩家模型的创建项目原理 游戏中一个物体运动的原理是浏览器每秒钟刷新60次&#xff0c;每次我们单独计算这个物体新的位置&#xff0c;然后把他刷新出来&#xff0c;这样最终人眼看起来就是移动的效果。 对…

YOLO系列概述(yolov1至yolov7)

YOLO系列概述&#xff08;yolov1至yolov7&#xff09; 参考&#xff1a; 睿智的目标检测53——Pytorch搭建YoloX目标检测平台YoloV7 yolo的发展历史 首先我们来看一下yolo系列的发展历史&#xff0c;yolo v1和yolox是anchor free的方法&#xff0c;yolov2&#xff0c;yolov3…

使用 Vue3 实现锚点组件

目录 1. 需求介绍 2. 实现过程 2.1 表单结构介绍 2.2 确定锚点组件接收的参数及使用方法 2.2.1 form-dom&#xff1a;需要被锚点组件控制的表单实例 2.2.2 active-anchor&#xff1a;默认激活的锚点 2.2.3 title-class&#xff1a;表单标题特有的类名 2.2.4 将 锚点组件…

5-FITC,5-FITC(isomer I),5-异硫氰酸荧光素,5-Flourescein iso-thiocyanate

产品名称&#xff1a;5-FITC&#xff0c;5-异硫氰酸荧光素 英文名称&#xff1a;5-Flourescein iso-thiocyanate 英文别名&#xff1a;5-FITC&#xff1b;5-Flourescein iso-thiocyanate&#xff1b;FITC Isomer I [5-FITC; fluorescein-5-isothiocyanate] CAS#&#xff1a;…

labview 串口通信 modbusRtu

在自动化或测试项目中&#xff0c;上位机软件需要和PLC及仪表通信&#xff0c;本文简单描述这个问题。 1.在程序框图中放置4个图标 &#xff08;1&#xff09;创建modbus 主站实例&#xff08;按如下图标识①,在框图中放Create Master Instance.vi) 图1 放置四个图标 &…

C++ Reference: Standard C++ Library reference: Containers: deque: deque: resize

C官网参考链接&#xff1a;https://cplusplus.com/reference/deque/deque/resize/ 公有成员函数 <deque> std::deque::resize C98 void resize (size_type n, value_type val value_type()); C11 void resize (size_type n); void resize (size_type n, const value_t…

React组件复用

mixins&#xff08;已废弃&#xff09; https://react.docschina.org/blog/2016/07/13/mixins-considered-harmful.html mixin引入了隐式依赖关系 对于组件中的方法和数据的来源不明确&#xff0c;不容易维护 Mixins 导致名称冲突Mixins 导致滚雪球般的复杂性 render-props技术…

C语言学习之路(基础篇)—— 指针(上)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 概述 1) 内存 内存含义&#xff1a; 存储器&#xff1a; 计算机的组成中&#xff0c;用来存储程序和数据&#xff0c;辅助CPU进行运算处理的重要…

python切分TXT的句子到Excel(复制可用)——以及python切分句子遇到的问题汇总

文章目录完整代码时间转化和提取各种对象类型转换时间序列类属性数据转换完整代码 import jieba.analyseimport jieba.posseg as pseg from wordcloud import WordCloud import xlsxwriter # encodinggbk import xlsxwriterf open(E:/data/xieyangteng/review.txt, r, encodi…

波的相关参数概念整理

频率&#xff08;frequency&#xff09;&#xff0c;符号f&#xff0c;表示单位时间内完成周期性变化的次数。f1/T&#xff0c;单位s-1 角频率&#xff0c;符号ω&#xff0c;表示单位时间内变化的角弧度值。ω 2πf 2π/T,单位rad/s 波长&#xff08;wavelength&#xff0…

<SQL编程工具MySQL、SQLyog安装及环境配置教程>——《SQL》

目录 1.MySQL安装&#xff1a; 1.1 MySQL下载安装&#xff1a; 1.2 MySQL环境变量配置&#xff1a; 2.SQLyog安装&#xff1a; 2.1 SQLyog下载安装&#xff1a; 3.写在最后的话&#xff1a; 后记&#xff1a;●由于作者水平有限&#xff0c;文章难免存在谬误之处&…

力扣刷题day49|647回文子串、516最长回文子序列

文章目录647. 回文子串思路暴力解法动态规划五部曲516. 最长回文子序列思路动态规划五部曲647. 回文子串 力扣题目链接 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由…

代码随想录算法训练营第一天|LeetCode704二分查找、LeetCode27移除元素

LeetCode704二分查找 题目链接&#xff1a;704二分查找 思路&#xff1a; 以前刷过不少题&#xff0c;也看过不少题解&#xff0c;就记得区间有不少原则&#xff0c;乍一想有哪些想不起来了&#xff0c;反正我是选择了最简单易懂的左闭右闭原则。 1、区间左闭右闭原则。 2、w…

SpringBoot SpringBoot 开发实用篇 2 配置高级 2.3 常用计量单位应用

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇2 配置高级2.3 常用计量单位应用2.3.1 问题引入2.3.2 常用计量单位应…

实验2 存储器设计与实现【计算机组成原理】

实验2 存储器设计与实现【计算机组成原理】实验2 存储器设计与实现一、实验目的二、实验环境三、实验原理四、实验任务五、实验结果&#xff1a;六、心得体会&#xff1a;实验2 存储器设计与实现 一、实验目的 掌握单端口RAM和ROM原理和设计方法。掌握32位数据的读出和写入方…

【LeetCode-中等】343. 整数拆分(详解)

题目 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 力扣&#xff1a;题目链接 方法1&#xff1a;动态规划 完全不了解动态规划&#xff1f; 动态规划…

图像运算和图像增强九

图像运算和图像增强九 图像锐化之 Roberts、Prewitt 算子实现边缘检测 &#xff08;1&#xff09;图像锐化 图像锐化的目的是为了使图像的边缘、轮廓线以及图像的细节变得清晰&#xff0c;经过平滑的图像变得模糊的根本原因是图像受到了平均或积分运算&#xff0c;因此可以对…

LeetCode刷题(python版)——Topic70. 爬楼梯

一、题设 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例…

Flutter混编之路IOS插件0基础开发(mac环境)

本文默认你安装了Android Studio、Xcode具备flutter开发环境&#xff0c;并且会dart语言的基础使用&#xff0c;Android、ios原生开发不会也没啥关系&#xff0c;就是会很费劲啦。 1.创建插件 在Android studio 点击File-->new Flutter Project-->Flutter 取好名字&…