当前位置: 首页 > news >正文

C语言 分支结构(1)

分支结构

条件判断:根据某个条件成立于否,决定是否执行指定的操作。

条件判断的结果是逻辑值。其结果为(写代码的时候可以用 非0 ,C语言给我们返回使用 1)或者为 假(0)。

面试题:
① 
条件表达式(作为分支或者循环条件的表达式称之为条件表达式)支持任意类型的表达式  ,包括如关系、逻辑、赋值、算数等表达式、但实际上有意义的表达式只有关系表达式和逻辑表达式。

② C语言中、条件表达式的结果是逻辑值,使用非0表示真、使用0表示假,但是底层使用1和0来表式真假。

关系运算符及其表达式

问题抛出

我们在程序设计往往会遇到如下问题,比如下面的函数的计算:

也就是我们必须要通过一个条件的结果来选择下一步的操作,算法上属于一个分支结构,
C语言实现分支结构主要使用if。其中的条件需要用关系表达式来表示:x!=0 就是一种关系表达式。

关系运算符及其优先级次序

关系运算符式用来进行比较的符号。C语言提供了6种关系运算符:

举例:
int a = 5, b = 6;
printf("%d\n", a > 5 != b > 5);// 1 解释:a > 5的结果和 b > 5的结果进行比较
关系表达式
关系表达式 = 关系运算符 + 表达式(操作数)

逻辑运算符及其表达式

问题抛出

如下表达式:

其中的条件需要用到逻辑表达式来表示:x != 0 && a != 0 就是一种逻辑表达式。

逻辑运算符及其优先级

逻辑运算符式构成复杂的复合条件的运算符:

定义:用逻辑运算符将关系表达式或者逻辑表达式链接起来构成有意义的算式称作逻辑表达式。

C编译系统在表示逻辑运算符运算结果时,返回的也是逻辑值:用1表示真,用0表示假。

用if语句实现分支结构

单分支:if...

语法:

if(条件表达式)
{语句;
}//如果是单语句,可以省略{},如下:
if(条件表达式) 语句;if(条件表达式)语句;

流程图:

面试题:

if(条件表达式) 语句1;语句2;
请选择于上面代码完全一致的写法(A)
A. if(条件表达式){语句1;} 语句2;
B. if (条件表达式){语句1;语句2;}
功能:
若表达式值为真(非0),则执行表达式后面的语句,执行完该语句后继续执行if语句后的其他语句。
若表达式值为假(0),则不执行表达式后面的语句而直接执行if语句后面的其他的语句。
说明:
如果表达式后面的是复合语句(语句超过1条),则需要使用一对 {} 括起来。
案例:
需求:计算并输出下列分段函数的值:

流程图:

代码:

#include<stdio.h>int main()
{//定义x,y;int x,y = -2;//控制台输入;printf("请输入一个整数:\n");scanf("%d",&x);//判断语句if(x>= 0) y = 2;//输出printf("x=%d,y=%d\n",x,y);return 0;}

结果:

案例:

需求:有a,b,c 三个数,要求从控制台输入,并求出其中的最大数和最小数。

#include<stdio.h>
#include<stdlib.h> int main()
{int a, b, c;int max_num,min_num;printf("请输入三个整数(用逗号分隔,如:1,2,3):\n");// 循环读取,直到输入格式正确(成功读取3个整数)while (1){if (scanf("%d,%d,%d", &a, &b, &c) == 3){break; // 输入正确,退出循环}else{printf("格式错误,请重新输入(用逗号分隔三个整数):\n");// 清空输入缓冲区,避免错误数据残留导致无限循环while (getchar() != '\n'); // 读取并丢弃缓冲区直到换行符}}printf("您输入的整数为:%d,%d,%d\n", a, b, c);//采用逐步算法//最大数max_num = a;if(b > max_num)  max_num = b;if(c > max_num)  max_num = c;printf("最大数为:%d\n",max_num);//最小数min_num = a;if(b < min_num)  min_num = b;if(c < max_num)  min_num = c;printf("最数为:%d\n",min_num);return 0;
}

结果:

总结:

  • 最大数判断:通过先假设a为最大数,再依次与bc比较并更新,确保最终结果是三个数中的最大值;
  • 最小数判断:同理,先假设a为最小数,再依次与bc比较并更新,逻辑清晰且无漏洞;
  • 避免了原代码中 “多分支判断不完整” 和 “重复输出” 的问题,适用于所有整数(包括正数、负数、重复数)

有可能产生的问题

在变量赋值前使用变量、导致运算结果错误,因为变量未赋值前,系统会给变量分配随机值。

小贴士:
建议的书写规范:
if(flag == 1) 建议写成:if(flag)
if(flag == 0) 建议写成:if(!flag)

双分支:if...else...

语法:

if(条件表达式)
{语句1;
}
else
{语句2;
}//如果是单语句,可以省略{},以下两种写法等价
if(条件表达式) 语句1;
else 语句2;if(条件表达式)语句1;
else语句2;

注意else语句本身不能单独存在,必须和距离自己最近的未配对的if配对。

流程图

功能:

若表达式值为1,则执行语句1;否则执行表达式2。不管条件表达式成立步成立,都要执行一个语句,其次需要注意的是,语句1和语句2都可以是单语句或者复合语句。

说明:

if..else..结构可以实现双分支选择结构。C语言允许if..else..结构嵌套。即在语句1与语 句2中又可以包含完整的if语句或者if..else..语句,并且这种嵌套可以多层(为了保证程序的执行效率,建议不超过3~4层)。利用if..else..结构的嵌套,可以实现多分支结构。

案例:

        需求:计算并输出下列分段函数的值:

        流程图:

        代码:

        

#include<stdio.h>
int main()
{int x;printf("输入一个整数:");while(1){if(scanf("%d",&x) == 1){break;}else{	   printf("格式错误,请重新输入一个整数");}//清除缓冲区while(getchar() != '\n');}if(x < 0){printf("x=%d,y=-2\n",x);}else{printf("x=%d,y=2\n",x);}return 0;
}

结果:

案例:

        需求:通过控制台,输入一个年份,判断这个年份是闰年还是平年

分析:

        判断条件:(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)

代码:

#include<stdio.h>
int main()
{// 定义天干(10个):索引0对应癸,1对应甲,...,9对应壬(配合公式取余)const char* tianGan[] = {"癸", "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬"};// 定义地支(12个):索引0对应亥,1对应子,...,11对应戌const char* diZhi[] = {"亥", "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌"};// 地支对应生肖(与地支索引一一对应)const char* shengXiao[] = {"猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗"};//定义一个年份int year;//控制台输入printf("输入一个年份(xxxx):");//循环输入,防止输错while(1){if(scanf("%d",&year) == 1){break;}else{printf("请重新输入:");}//清除缓冲区while(getchar() != '\n');}if((year % 4 == 0 && year % 100) != 0 || year % 400 == 0)printf("%d年是闰年!\n",year);elseprintf("%d年是平年!\n",year);printf("打印变量的内存首地址:%p\n",&year);// 计算天干、地支索引(公式:(年份-3)取余,修正公元年与干支年的偏移)int tgIndex = (year - 3) % 10;int dzIndex = (year - 3) % 12;// 处理负数取余的情况(确保索引为非负)if (tgIndex < 0) tgIndex += 10;if (dzIndex < 0) dzIndex += 12;// 输出结果printf("%d年对应的干支纪年为:%s%s年\n", year, tianGan[tgIndex], diZhi[dzIndex]);printf("生肖为:%s\n", shengXiao[dzIndex]);return 0;}

结果:

注意:对于单语句的双分支,我们可以使用三目运算符的写法及逆行简化!        

双分支:三目运算符

三目运算符,又称作三元运算符。

语法:

表达式1 ? 表达式2 : 表达式3;

说明:

① 如果表达式1的结果为真,就执行表达式2;否则执行表达式3。(表达式2和表达式3只能满足一个)。
② 三目运算符的写法实际上就是单语句的双分支if的简写
代码:
#include <stdio.h>
int main()
{// 创建两个变量int x, y;
// 控制台输入printf("请输入一个整数:\n");scanf("%d", &x);//判断y = x < 0 ? -2 : 2;// 打印输出printf("x=%d,y=%d\n",x,y);
}

代码:

#include<stdio.h>
int main()
{//定义一个数int a,b,c;int max_num,min_num;//控制台输入printf("请输入三个整数:");while(1){if(scanf("%d%d%d",&a,&b,&c) == 3)break;elseprintf("输入错误,请从新输入");while(getchar() != '\n');}//验证输入的数字printf("a=%d,b=%d,c=%d\n",a,b,c);//最大值max_num = a;max_num = b>max_num ? b:max_num;max_num = c>max_num ? c:max_num;min_num = a;min_num = b<min_num ? b:min_num;min_num = c<min_num ? c:min_num;printf("最大值=%d,最小值=%d",max_num,min_num);return 0;}

结果:

课堂练习
需求:从键盘录入一个整数,判断这个数是偶数还是奇数。
要求:分别使用单分支if、双分支if、三目运算符实现。
代码:
#include<stdio.h>
int main()
{//创建一个数int i;//控制台输入printf("输入一个整数:");while(1){if(scanf("%d",&i) == 1)break;elseprintf("输入错误,请重新输入!\n");//清除缓存区while(getchar() != '\n');}printf("(1)\n");//单分支语句if(i%2 == 0) printf("%d为偶数\n",i);if(i%2 != 0) printf("%d为奇数\n",i);printf("(2)\n");//另一种单分支语句写法,等价于if(i%2 == 0){printf("%d为偶数\n",i);	} if(i%2 != 0){printf("%d为奇数\n",i);	}printf("(3)\n");//多分支语句if(i%2 == 0) {printf("%d为偶数\n",i);	}else{printf("%d为奇数\n",i);}printf("(4)\n");//多分支语句的另一种写法if(i%2 == 0) printf("%d为偶数\n",i);	elseprintf("%d为奇数\n",i);printf("(5)\n");//三目运算符i % 2 == 0 ? printf("%d为偶数\n",i) : printf("%d为奇数\n",i);return 0;}
结果:

http://www.dtcms.com/a/418318.html

相关文章:

  • 扭蛋机抽赏小程序:重构线上娱乐的“盲盒式”新体验
  • EtherNet/IP转EtherCAT网关在新能源制造中实现机器人与运动卡数据互通
  • Imatest-Wedge模块
  • 岳阳博物馆网站网站建设想法
  • Day03_STM32F103C8T6学习笔记6-9章(江科大)
  • 专业企业网站搭建服务docker创建wordpress
  • 各大网站的网址网站的功能性
  • ZYNQ平台摄像头性能深度对决:OV7725 vs OV5640全面速度测试与优化实战
  • Qt 界面优化 --- 绘图
  • MySQL Online DDL:高性能表结构变更指南
  • 操作系统:进程调度,创建和终止
  • Kafka09-速答-尚硅谷
  • Jenkins与GitLab-CI的技术对比分析
  • 2025 年 AI 智能体(Agent)发展全景:技术突破、场景落地与产业重构
  • 电子商务的网站建设名词解释网站设计的流程简答题
  • Spark源码中的线程池
  • Kafka06-进阶-尚硅谷
  • TDengine 时序函数 IRATE 用户手册
  • 网站模板源码下载广告网站建设
  • 一键部署 Spring Boot 到远程 Docker 容器
  • Docker 入门:容器化开发的强大工具
  • iOS 26 全景揭秘,新界面、功能创新、兼容挑战与各种工具在新版系统中的定位
  • 北京交易中心网站电商网站建设需要
  • 【ansible/K8s】K8s的自动化部署源码分享
  • C++STL之list
  • CentOS 7安装部署RabbitMQ
  • 本地怎么远程调试服务器
  • AndroidID重置功能开发
  • 【Byte 类型】编程基石:揭开 `Byte`(字节)的神秘面纱
  • 天津做网站哪家服务好北京正邦品牌设计公司