【谭浩强C程序设计精讲 chap4】选择结构程序设计

2024-01-20 17:28

本文主要是介绍【谭浩强C程序设计精讲 chap4】选择结构程序设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 第4章 选择结构程序设计
    • 一、用 if 语句实现选择结构
    • 二、用 switch 语句实现多分支选择结构
    • 三、条件运算符和条件表达式

第4章 选择结构程序设计

一、用 if 语句实现选择结构

  • 一般形式:
    if (表达式)  语句1
    [ else  语句2 ]

  • 其他形式,常用的有以下三个:

    • (1)if (表达式)   语句1

    • (2)if (表达式)
          语句1
         else
          语句2

    • (3)if (表达式1)     语句1
         else if (表达式2)  语句2
         else if (表达式3)  语句3
         … 
         else if (表达式m)  语句m
         else       语句m+1


  • 【说明】
  1. 整个 if 语句可以写在多行上,也可以写在一行上

    //写法1
    if      (number>500) cost=0.15;
    else if (number>300) cost=0.10;
    else if (number>100) cost=0.075;
    else if (number>50)  cost=0.05;
    else                 cost=0; //写法2(推荐这种写法)
    if(number>500) cost=0.15;
    else if(number>300) cost=0.10;
    else if(number>100) cost=0.075;
    else if(number>50)  cost=0.05;
    else                 cost=0; 
    
  2. 常用形式(3)中的语句1~语句m+1都是 if 语句的内嵌语句,它们是 if 语句中的一部分。每个内嵌语句结尾都要有分号(它是语句组成的成分),否则出现语法错误。

    if(x>0) y=1;  //结尾必须有分号
    else y=-1;  //结尾必须有分号
    
  3. if 语句无论写在几行上,都是一个整体,属于同一个语句。不要认为 if 部分是一个语句,else 部分是一个语句。注意:else 子句不能作为语句单独使用,它必须是 if 语句的一部分,与 if 配对使用。

  4. 语句1~语句m可以是一个简单的语句,也可以是一个包括多个语句的复合语句(用花括号括起来)。

    if(x>0) 
    {y=1;z=2;
    }
    else 
    {y=-1; z=9;
    }
    
  5. 内嵌语句也可以是一个if语句。
    如用 if 语句表示阶跃函数:
    y = { 1 ( x > 0 ) 0 ( x = 0 ) − 1 ( x < 0 ) y=\left\{ \begin{aligned} 1 \ \ \ (x>0)\\ 0 \ \ \ (x=0)\\ -1 \ \ \ (x<0)\\ \end{aligned} \right. y= 1   (x>0)0   (x=0)1   (x<0)

    if(x<0) y=-1;
    else  //内嵌语句是一个 if 语句,它也是else的一部分
    {if(x==0)y=0;elsey=1;
    }
    
  6. 在 if 语句中要对给定的条件进行检查,判定所给定的条件是否成立。判断的结果是一个逻辑值“是”(“真”)或“否”(“假”)

  • 示例:实现输入x的值,输出y相应值
    y = { x ( x < 1 ) 2 x − 1 ( 1 ≤ x < 10 ) 3 x − 11 ( x ≥ 10 ) y=\left\{ \begin{aligned} &x \ \ \ &(x<1)\\ &2x-1 \ \ \ &(1\leq x<10)\\ &3x-11 \ \ \ &(x\geq 10)\\ \end{aligned} \right. y= x   2x1   3x11   (x<1)(1x<10)(x10)
#include <stdio.h>
int main(void)
{int x,y;printf("输入x:");scanf("%d",&x);if(x<1){y=x;printf("x=%d,y=x=%d\n",x,y);}else if(x>=1 && x<10){y=2*x-1;printf("x=%d,y=2*x-1=%d\n",x,y);}else{y=3*x-11;printf("x=%d,y=3*x-11=%d\n",x,y);}	2
}

运行结果1:
请添加图片描述

运行结果2:
在这里插入图片描述

运行结果3:
在这里插入图片描述

二、用 switch 语句实现多分支选择结构

  • 一般形式:
  • switch (表达式)
    {
    case  常量1 : 语句1
    case  常量2 : 语句2
       … 
    case  常量n : 语句n
    default :     语句n+1
    }

  • 【说明】
  1. 上面 switch 一般形式中括号内的表达式,其值的类型应为整数类型(包括字符型)

    switch(a+b)//a+b的值是整数
    {case 2:   break;case 33:  break;case 'a': break;default:  break;
    }
    
  2. switch 下面的花括号内是一个复合语句

    • 这个复合语句包括若干语句,它是switch语句的语句体
    • 语句体内包含多个以关键字 case 开头的语句行和最多一个default 开头的行。
    • case 后面跟一个常量(或常量表达式),如case ‘A’,它们和 default 都是起标号的作用,用来标志一个位置。
    • 执行 switch 语句时,先执行 switch 后面表达式的值,然后将它与 case 标号比较,如果与某一个 case 标号中的常量相同,流程就转到此 case 标号后面的语句。如果没有与 switch 表达式相匹配的 case 常量,流程转去执行 default 标号后面的语句。
  3. 可以没有 default 标号,此时如果没有与 switch 表达式相匹配的 case 常量,则不执行任何语句,流转到 switch 语句的下一个语句。

  4. 各个 case 标号出现次序不影响执行结果。

  5. 每一个 case 常量必须互不相同;否则就会出现互相矛盾的现象。但是如果语句后面加上 break 则执行到 break 后跳出 switch 语句。

  6. case 标号只起到标记的作用,不作条件检查。

  7. 在 case 子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动执行 case 后面所有的语句。当然加上大括号也可以。

  8. 多个 case 标号可以共用一组执行语句。

    case 'A':
    case 'B':
    case 'C':printf(">60\n");break;
    ...
    
  • 示例:功能要求:输入学生分数,百分制,输出学生的等级。
    (1)90分以上为等级A
    (2)80-89分为等级B
    (3)70-79分为等级C
    (4)60-69分为等级D
    (5)60分以下为等级E
#include <stdio.h>
int main(void)
{float score;char grade;printf("请输入学生的成绩:");scanf("%f",&score);while(score>100 || score<0){printf("\n输入错误,请重新输入:");scanf("%f",&score);}switch((int)(score/10)){case 10:case 9:grade='A';break;case 8:grade='B';break;case 7:grade='C';break;case 6:grade='D';break;default:grade='E';break;}printf("学生成绩等级为 %c\n",grade);  return 0;
}

运行测试结果1:
在这里插入图片描述

运行测试结果2:
在这里插入图片描述

三、条件运算符和条件表达式

  • 条件运算符:由两个符号(?和:)组成,必须一起使用。

    要求3个操作对象,称为三目(元)运算符,它是C语言中唯一的一个三目运算符。

  • 条件表达式的一般形式为:

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

  • 执行顺序:
    在这里插入图片描述

  • 【说明】

  1. 条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表示2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
    //赋值表达式
    max=(a>b)?a:b;//功能:将a和b二者中的大者赋给max
    
  2. 条件运算符优先级高于赋值运算符,所以以上示例赋值表达式中,先求解条件表达式,再将它的值赋给max。
  3. 条件表达式后面加一个分号就是一个独立的语句。
    //赋值表达式形式
    max=(a>b)?a:b;
    //条件表达式语句形式
    (a>b)?(max=a):(max=b);
    //相当于
    if(a>b) max=a;
    else    max=b;
    //还可以写成以下形式
    (a>b)?printf("%d",a):printf("%d",b);
    //相当于
    if(a>b) printf("%d",a);
    else    printf("%d",b);
    
  • 示例:输入一个字符,判断它是否是大写字母,如果是,将它转换成小写字母并输出。
#include <stdio.h>
int main(void)
{char ch;
scanf("%c",&ch);
ch=(ch>='A' && ch<='Z')?(ch+32):ch;printf("%c\n",ch);return 0;
}

运行结果:
在这里插入图片描述


本节完

这篇关于【谭浩强C程序设计精讲 chap4】选择结构程序设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626760

相关文章

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

为什么现在很多人愿意选择做债务重组?债重组真的就这么好吗?

债务重组,起初作为面向优质企业客户的定制化大额融资策略,以其高效周期著称,一个月便显成效。然而,随着时代的车轮滚滚向前,它已悄然转变为负债累累、深陷网贷泥潭者的救赎之道。在此路径下,个人可先借助专业机构暂代月供,经一段时间养护征信之后,转向银行获取低成本贷款,用以替换高昂网贷,实现利息减负与成本优化的双重目标。 尽管债务重组的代价不菲,远超传统贷款成本,但其吸引力依旧强劲,背后逻辑深刻。其一