初识C语言之条件结构篇——带你认知编程世界的逻辑之美!

简介: 初识C语言之条件结构篇——带你认知编程世界的逻辑之美!

目录

IF语句

if语句

IF语句的基本的形式

if…else语句形式

else if语句形式

IF嵌套形式

if的嵌套形式

条件运算符

switch语句

switch语句的基本形式

多路开关模式的switch语句

if else语句和switch语句的区别

选择结构程序应用

每文一语


IF语句

if语句

在日常生活中,为了使交通畅通有序,一般会在路口设立交通信号灯。在信号灯显示为绿色时车辆可以行驶通过,当信号灯转为红色时车辆就要停止行驶。可见,信号灯给出了信号,人们通过不同的信号进行判断,然后根据判断的结果进行相应的操作。


在C语言程序中,想要完成这样的判断操作,利用的就是if语句。if语句的功能就像路口的信号灯一样,根据判断不同的条件,决定是否进行操作。


据说第一台数字计算机是用来进行决策操作的,使得之后的计算机都继承了这项功能。程序员将决策表示成对条件的检验,即判断一个表达式值的真假。除了没有任何返回值的函数和返回无法判断真假的结构函数外,几乎所有表达式的返回值都可以判断真假。

IF语句的基本的形式

if语句通过对表达式进行判断,根据判断的结果选择是否进行相应的操作。if语句的一般形式为:

if(表达式)  语句

其语句执行流程如图所示。

image.png

【实例6.1】 使用if语句模拟信号灯指挥车辆行驶。在本实例中,为了模拟十字路口上信号灯指挥车辆行驶,要使用if语句判断信号灯的状态。如果信号灯为绿色,则说明车辆可以行驶通过,通过输出语句进行信息提示说明车辆的行动状态。

#include<stdio.h>
int main()
{
  int iSignal;  /*定义变量表示信号灯的状态*/
  printf("the Red Light is 0,the Green Light is 1\n");/*输出提示信息*/
  scanf("%d",&iSignal); /*输入iSignal变量*/
  if(iSignal==1)  /*使用if语句进行判断*/
  {
    printf("the Light is green,cars can run\n");      /*判断结果为真时输出*/
  }
  return 0;
}

image.png

【实例6.2】 完善if语句的使用。原程序中仅对绿灯情况下做出相应的操作,为进一步完善信号灯为红灯时的操作,在程序中再添加一次if语句对信号灯为红灯时的判断,并且在条件成立时给出相应的操作。

#include<stdio.h>
int main()
{
  int iSignal;  /*定义变量表示信号灯的状态*/
  printf("the Red Light is 0,the Green Light is 1\n");/*输出提示信息*/
  scanf("%d",&iSignal); /*输入iSignal变量*/
  if(iSignal==1)    /*使用if语句进行判断*/
  {
    printf("the Light is green,cars can run\n");/*判断结果为真时输出*/
  }
  if(iSignal==0)  /*使用if语句进行判断*/
  {
    printf("the Light is red,cars can't run\n");/*判断结果为真时输出*/
  }
  return 0;
}

if…else语句形式

除了可以指定在条件为真时执行某些语句外,还可以在条件为假时执行另外一段代码。这在C语言中是利用else语句来完成的,其一般形式为:

if(表达式)

 语句块1;

else

 语句块2;

其语句执行流程如图所示。

image.png

【实例6.3】 使用if…else语句进行选择判断。在本实例中,使用if…else语句判断用户输入的数值,输入的数字为0表示条件为假,输入的数字为非0表示条件为真。

#include<stdio.h>
int main()
{
  int iNumber;    /*定义变量*/
  printf("Enter a number\n"); /*显示提示信息*/
  scanf("%d",&iNumber); /*输入数字*/
  if(iNumber) /*判断变量的值*/
  { 
    /*判断为真时执行输出*/
    printf("the value is true and the number is: %d\n",iNumber);
  }
  else  /*判断为假时执行输出*/
  {
    printf("the value is flase and the number is: %d\n",iNumber);
  }
  return 0;
}

image.png

【实例6.4】 使用if…else语句得到两个数的最大值。本实例要实现的功能是比较两个数值的大小,这两个数值由用户输入,然后将其中相对较大的数值输出显示。

#include<stdio.h>
int main()
{
  int iNumber1,iNumber2;    /*定义变量*/
  printf("please enter two numbers:\n");  /*信息提示*/
  scanf("%d%d",&iNumber1,&iNumber2);  /*输入数据*/
  if(iNumber1>iNumber2) /*判断iNumber1是否大于iNumber2*/
  {
    printf("the bigger number is %d\n",iNumber1);
  }
  else  /*判断结果为假,则执行下面语句*/
  {
    printf("the bigger number is %d\n",iNumber2);
  }
  return 0;
}

image.png

【实例6.5】 使用if…else语句模拟信号灯。多数路口的信号灯还有一个黄灯,是用来提示车辆准备行驶或者停车的。6.2.1节使用if语句模拟信号灯,在本实例中使用if…else语句进一步完善这个程序,使得信号灯具有黄灯相应的功能。

#include<stdio.h>
int main()
{
  int iSignal;  /*定义变量表示信号灯的状态*/
  printf("the Red Light is 0,\nthe Green Light is 1,\nthe Yellow Light is other number\n");   /*输出提示信息*/
  scanf("%d",&iSignal);   /*输入iSignal变量*/
  if(iSignal==1)    /*当信号灯为绿色时*/
  {
    printf("the Light is green,cars can run\n");/*判断结果为真时输出*/
  }
  if(iSignal==0)  /*当信号灯为红灯时*/
  {
    printf("the Light is red,cars can't run\n");  /*判断结果为真时输出*/
  }
  else  /*当信号灯为黄灯时*/
  {
    printf("the Light is yellow,cars are ready\n");
  }
  return 0;
}

image.png

else if语句形式

利用if和else关键字的组合可以实现else if语句,这是对一系列互斥的条件进行检验,其一般形式如下:if(表达式1) 语句1

else if(表达式2) 语句2

else if(表达式3) 语句3

 …


else if(表达式m) 语句m

else 语句n

else if语句执行流程如图

image.png

IF嵌套形式

if的嵌套形式

在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:

if(表达式1)


 if(表达式2)  语句块1


 else  语句块2


else


 if(表达式3)  语句块3


 else  语句块4

使用if语句嵌套的形式功能是对判断的条件进行细化,然后进行相应的操作。

这就好比人们在生活中,每天早上醒来的时候想一下今天是星期几,如果是周末就是休息日,如果不是周末就要上班;同时,休息日可能是星期六或者是星期日,星期六就和朋友去逛街,星期日就陪家人在家。

根据这个比喻来看一下上述一般形式表示:if语句判断表达式1就像判断今天是星期几,假设判断结果为真,则用if语句判断表达式2,这就好像判断出今天是休息日,然后去判断今天是不是周六;如果if语句判断表达式2为真,那么执行语句块1中的内容。如果不为真,那么执行语句块2中的内容。就比如,如果为星期六就陪朋友逛街,如果为星期日就陪家人在家。外面的else语句表示不为休息日时的相应操作。代码如下所示。

if(iDay>Friday) /*判断为休息日的情况*/
{
  if(iDay==Saturday)    /*判断为周六时的操作*/
  {}
  else    /*为周日时的操作*/
  {}
}
else      /*不为休息日的情况*/
{
  if(iDay==Monday)    /*判断为周一时的操作*/
  {}
  else
  {}
}

条件运算符

在使用if语句时,可以通过判断表达式为,而执行相应的表达式。例如:

if(a>b)


 {max=a;}


else


 {max=b;}


上面的代码可以用条件运算符“? :”来进行简化,例如:


max=(a>b)?a:b;


条件运算符对一个表达式的真或假值结果进行检验,然后根据检验结果返回另外两个表达式中的一个。条件运算符的一般形式:


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


在运算中,首先对第一个表达式的值进行检验。如果值为真,则返回第二个表达式的结果值;如果值为假,则返回第3个表达式的结果值。例如上面使用条件运算符的代码,首先判断表达式a>b是否成立,成立则说明结果为真,否则为假。当为真时,将a的值赋给max变量;如果为假,则将b的值赋给max变量。


switch语句

switch语句的基本形式

switch语句是多分支选择语句。例如,如果只需要检验某一个整型变量的可能取值,那么可以用更简便的switch语句。switch语句的一般形式如下:

switch (表达式)
{
  case 情况1:
    语句块1;
  case 情况2:
    语句块2;
  case 情况n:
    语句块n;
  default:
    默认情况语句块;
}

image.png

多路开关模式的switch语句

设计多路开关模式的switch语句,其形式如下:

switch(表达式)
{
  case 1:
    语句1
    break;
  case 2:
  case 3:
    语句2
    break;
  ……
default:
    默认语句
    break;
}

可以看到如果在case 2后不使用break语句,那么符合检验时与符合case 3检验时的效果是一样的。也就是说,使用多路开关模式使得多种检验条件使用一种解决方式。


if else语句和switch语句的区别

if else语句和switch语句都用于根据不同的情况检验条件做出相应的判断。那么if else语句和switch语句有什么区别呢?下面从两者的语法和效率的比较进行讲解。


语法的比较

if是配合else关键字进行使用的,而switch是配合case使用的;if语句先对条件进行判断,而switch后进行判断。


效率的比较

if else结构对开始少量的检验判断速度比较快,但是随着检验的增长会逐渐变慢,其中的默认情况是最慢的。使用if else结构可以判断表达式,但是也不能减少选择深度的增加使得检验速度变慢的趋势,并且也不容易进行后续的添加扩充。


switch结构中,对其中每一项case检验的速度都是相同的,但除去default的默认情况,default默认情况比其他情况都快。


当判定的情况占少数时,if else结构比swtich结构检验速度快。也就是说,如果分支在3或者4个以下,用if else比较好,否则选择switch结构。

选择结构程序应用

【实例6.14】 使用switch语句计算运输公司的计费。某运输公司的收费按照用户运送货物的路程进行计费。路程(s)越远,每公里运费越低,收费标准如表6.1所示。image.png

#include<stdio.h>
int main()
{
  int iDiscount;    /*表示折扣*/
  int iSpace;   /*表示路程*/
  int iSwitch;    /*表示折扣的检验情况*/
  float fPrice,fWeight,fAllPrice;
  printf("enter the price , weight and space\n");
  scanf("%f%f%d",&fPrice,&fWeight,&iSpace);
  if(iSpace>3000)
  {
    iSwitch=12;   /*折扣的检验情况为12*/
  }
  else
  {
    iSwitch=iSpace/250; /*计算折扣的检验情况*/
  }
  switch(iSwitch)   /*使用switch进行检验*/
  {
  case 0:
    iDiscount=0;  
    break;
  case 1:
    iDiscount=2;
    break;
        case 2:
  case 3:
    iDiscount=5;
    break;
  case 5:
  case 6:
  case 7:
    iDiscount=8;
    break;
  case 8:
  case 9:
  case 10:
  case 11:
    iDiscount=10;
    break;
  case 12:  
    iDiscount=12;
    break;
  default:
    break;
  }
  fAllPrice=fPrice*fWeight*iSpace*(1-iDiscount/100.0);  /*计算总价格*/
  printf("AllPrice is :%.4f\n",fAllPrice);  /*输出结果*/
  return 0;
}

image.png

本本介绍了选择结构的程序设计方式,包括if语句和switch语句。同时对if…else语句和else if语句的形式也进行了介绍,为选择结构程序提供了更多的控制方式。然后介绍了switch语句,当switch语句用在当检验的条件较多时,如果使用if语句进行嵌套也是可以实现的,不过其程序的可读性会降低。最后通过两种选择语句的比较来进行区分。


相关文章
|
4天前
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
4天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
4天前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
1天前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
|
4天前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
4天前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
4天前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
4天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
4天前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
25天前
|
C语言
C语言------选择结构
这篇文章是C语言选择结构的入门实训,包括多个练习题及其源代码,旨在帮助读者熟练掌握条件语句和选择结构程序设计方法,并熟悉switch语句和程序调试过程。
C语言------选择结构
下一篇
DDNS