版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章程序的结构化设计第3章程序的结构化设计3.1.1算法与流程图3.1.2C语言的语句3.1算法与结构程序设计第3章程序的结构化设计算法(Algorithm)是解决特定问题的一系列明确、有序、有限的步骤,描述了从输入到输出的计算过程。它是计算机程序设计的核心,决定了程序的逻辑结构和执行效率。无论是简单的数值计算,还是复杂的AI模型,都离不开算法的支撑。1.算法的特性算法是计算机科学的灵魂,无论是开发高效的软件应用,还是推进人工智能和大数据等前沿领域的发展,算法都起着核心的作用。理解算法的核心思想和评价标准,能够帮助开发者设计出更高效、更可靠的程序。一个算法通常具有以下5个特性。(1)有穷性(Finiteness)。算法必须在有限的步骤内结束,不能无限循环。例如:计算1到100的和,步骤数量明确。(2)确定性(Definiteness)。每个步骤必须有明确的定义,无歧义。例如:“将x增加一些值”是模糊的,而“x=x+1”是明确的。(3)可行性(Effectiveness)。每个步骤必须能通过基本操作实现。例如:用加减乘除计算平方根是可行的,但“用意念控制计算机”不可行。(4)输入(Input)。算法可以有零个或多个输入。例如:排序算法需要待排序的数据作为输入。(5)输出(Output)。算法必须有一个或多个输出。例如:排序算法的输出是排序后的数据。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计2.算法与程序的关系算法是解决问题的抽象逻辑描述,不依赖特定编程语言或硬件,例如:用二分法在有序数组中找目标值。程序是算法的具体实现(用编程语言编写),依赖编程语言和运行环境,例如:用C/Python等语言实现二分查找的代码。3.算法的评价标准算法的评价标准如下。(1)时间复杂度。表示算法运行时间随输入规模增长的趋势,用大O符号(O(n))表示。常见复杂度:①O(1):常数时间(如访问数组元素)。②O(logn):对数时间(如二分查找)。③O(n):线性时间(如遍历数组)。④O(n²):平方时间(如冒泡排序)。(2)空间复杂度。算法执行所需的内存空间随输入规模的增长趋势。例如:递归算法可能因调用栈过深导致高空间复杂度。(3)正确性。算法必须对所有合法输入产生正确结果。(4)可读性。代码逻辑清晰,便于他人理解和维护。(5)健壮性。能处理非法输入或异常情况(如除零错误、空指针)。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计4.流程图流程图(Flowchart)是一种用图形符号表示算法或工作流程的可视化工具,广泛应用于程序设计、流程分析和项目管理等领域。(1)使用流程图表示算法。使用流程图表示算法,直观开解,易于理解,流程图中各元素的表示方法,如图3.1所示。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计(2)3种基本结构的流程图。顺序结构、选择结构和循环结构3种基本结构的流程图,如图3.2、3.3、3.4所示。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计3种基本结构的共同特点如下。①只有一个入口。②只有一个出口。③结构内的每个部分都有可能被执行到。④结构内不存在列循环。(3)用N-S图表示算法。N-S图(Nassi-Shneiderman图)是一种用于表示结构化程序设计的图形工具,由艾萨克·纳西(IsaacNassi)和本·施耐德曼(BenShneiderman)于1973年提出。它提供了一种清晰且直观的方式来展示程序逻辑和控制流,尤其适用于描述复杂的算法和程序流程。N-S图使用矩形框来表示不同的程序结构,如顺序、选择(条件)、循环等。与传统的流程图不同,N-S图不允许箭头连接各个步骤,从而强制要求所有的控制流都在图表内部表示出来,这有助于强调程序的整体结构和逻辑关系。在N-S图中,顺序结构直接按从上到下的顺序排列。选择结构(如if语句)通常用分割成几个部分的矩形表示,每个部分对应一个可能的选择路径。循环结构(如for或while循环)则通过包围循环体的特殊形状或标记来标识。N-S图因其直观性和易于理解的特点,在教学和一些软件开发过程中被用来辅助程序设计。然而,随着软件工程的发展和统一建模语言等更为复杂的设计工具的普及,N-S图的使用已不如过去广泛。尽管如此,对于初学者来说,它仍然是学习如何组织和理解程序逻辑的有效工具。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计3种基本程序设计结构图的N-S图如下。①顺序结构,如图3.5所示,表示程序按顺序执行操作。②选择结构,如图3.6所示,表示当条件P成立时执行A操作,不成立时执行B操作。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计5.结构化程序设计原则结构化程序设计强调通过顺序、选择、循环三种基本控制结构来组织代码,避免使用goto等非结构化跳转语句。其目标是提高代码的可读性、可维护性和可验证性。(1)模块化设计。将程序分解为独立的、功能单一的小模块,每个模块负责完成一个明确的任务。这种做法不仅使程序更易于管理,也提高了代码的重用性和测试性。(2)自顶向下设计。从抽象到具体,先设计整体框架,再逐步细化实现细节。顶层设计定义主函数和核心流程,逐层分解将复杂任务拆分为子函数,最终实现编写每个子函数的具体逻辑。(3)单一入口和单一出口。每个模块或过程应该只有一个入口点和一个出口点。这意味着在进入和离开一段代码块时有明确的起点和终点,这有助于理解和维护代码。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计(4)使用三种基本控制结构。顺序结构:按照从上到下的顺序执行指令。选择结构(分支):根据条件判断的结果选择不同的执行路径,例如if-else语句或switch-case语句。循环结构:重复执行某段代码直到满足特定条件为止,如for循环、while循环等。(5)逐步细化。从粗略设计逐步添加细节,直到代码可执行。从高层次的概念开始,逐步细化到具体的实现细节。这种方法帮助开发者先考虑整体架构,再深入到各个部分的具体实现,确保所有组件都协调一致地工作。(6)限制使用goto语句。goto语句是无条件转移语句,能够使流程转移到相应标号所在的语句,并从该语句继续执行。goto语句破坏代码结构,导致逻辑混乱,可以使用break或return退出循环。限制goto语句的使用,程序更易于理解、易于排错、易于维护。3.1算法与结构程序设计3.1.1算法与流程图第3章程序的结构化设计在C语言中,语句是程序执行的基本单元,用于实现算法逻辑和控制流程,语句是以分号结尾的字符序列,分号是C语句的必要组成部分。1.表达式语句表达式语句由表达式后加分号“;”构成,完成赋值、运算或函数调用,其一般形式如下。表达式;例如:a=10是一个赋值表达式,而a=10;则是一个赋值语句。一个表达式的最后加一个分号就构成了一个语句。一个语句必须在最后有一个分号,分号是语句中不可缺少的组成部分,而不是两个语句间的分隔符号。3.1算法与结构程序设计3.1.2C语言的语句第3章程序的结构化设计2.控制语句C语言中控制语句有3类,共包括9种语句。(1)选择语句。C语言中的选择语句包括if和switch两种语句。①if语句。if语句为条件分支语句,可以实现两个分支流程,如下列所示。if(num>0){printf("正数");//输出"正数"}else{printf("非正数");//输出"非正数"}②switch语句。switch语句能够实现多个分支流程,如下列所示。switch(num){case1:printf("一");//输出"一"case2:printf("二");//输出"二"default:break;}3.1算法与结构程序设计3.1.2C语言的语句第3章程序的结构化设计(2)循环语句。C语言中的选择语句包括for、while和dowhile三种语句。①for语句。for循环适合已知循环次数的情况。//打印数字1到5for(inti=1;i<=5;i++){printf("%d",i);//输出:12345}②while语句。//打印数字1到5inti=1;while(i<=5){printf("%d",i);//输出:12345i++;}③dowhile语句。//打印数字1到5inti=1;do{printf("%d",i);//输出:12345i++;}while(i<=5);3.1算法与结构程序设计3.1.2C语言的语句第3章程序的结构化设计(3)转移语句。在C语言中,转移语句(也称为跳转语句)用于改变程序的执行流程。它们可以用来跳出循环、跳过某些代码块、或者直接转移到指定的位置。转移语句包括break、continue、return和goto语句4种。break语句用于立即终止当前循环或switch语句,并跳转到循环或switch之后的代码;continue语句跳过当前循环中剩余的代码,并直接进入下一次循环(即跳过本次迭代);return语句从函数中返回值,同时终止当前函数的执行;goto语句无条件跳转到程序中的某个标签位置。3.函数调用语句在C语言中,函数调用语句用于执行一个函数,并根据需要传递参数和接收返回值。函数调用是程序设计中的核心概念之一,它允许将代码分解为可重用的模块,从而提高代码的可读性、可维护性和复用性。函数调用语句由一个函数调用加一个分号构成,例如。printf("%d",i);3.1算法与结构程序设计3.1.2C语言的语句第3章程序的结构化设计4.复合语句在C语言中,复合语句(也称为代码块)是由一对花括号{}包围的零条或多条语句。它允许将一组语句视为一个单一的语句,这在控制流语句(如if、for、while等)中特别有用,因为这些语句通常只接受单个语句作为其主体。使用复合语句,可以包含多个语句作为一个整体来执行。例如,{x=a;a=b;b=x;}是复合语句,是一条语句,所以执行复合语句实际是执行该复合语句一对大括号中所有的语句。需要注意的是复合语句“}”后面不能出现分号,而“}”前复合语句中最后一条语句的分号不能省略。例如,以下两条语句均是错误的复合语句。{x=a;a=b;b=x;};{x=a;a=b;b=x}5.空语句在C语言中,空语句是指没有任何操作的语句。它由一个单独的分号“;”表示。尽管空语句本身不执行任何操作,但在某些情况下,它是合法且有用的。合理使用空语句可以让代码更加简洁,但要注意代码的可读性和逻辑清晰性。空语句可能会让代码变得难以理解,特别是在复杂的逻辑中。为了提高代码的可读性,可以在空语句后添加注释,说明为什么这里需要空语句。避免不必要的空语句,不要滥用空语句,尤其是在没有明确需求的情况下。如果某个地方看起来像是“多余”的空语句,可能是因为代码逻辑有问题,或者可以用更清晰的方式重写。3.1算法与结构程序设计3.1.2C语言的语句第3章程序的结构化设计3.2.1格式化输入输出3.2.2字符输入输出函数3.2顺序结构程序设计第3章程序的结构化设计在C语言中,格式化输入输出是通过标准库函数scanf和printf实现的。这些函数允许按照指定的格式读取或写入数据。1.格式化输入函数scanf()scanf()是用于格式化输入的函数,它从标准输入设备(通常是键盘)读取数据,并根据指定的格式进行解析。其基本语法格式如下。intscanf(char*format,...);其中,format是一个字符串,包含普通字符和格式说明符。格式说明符以%开头,用于指定输入数据的类型。可变参数列表(...)表示存储输入数据的变量地址(需要使用&运算符)。scanf()函数常用格式说明符,如表3.1所示。3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计(1)地址传递。scanf()函数需要变量的地址作为参数,因此对于非数组类型的变量,必须使用&运算符。示例代码如下。intnum;scanf("%d",&num);如果在格式控制字符中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符。例如,有以下程序语句进行数据输入。scanf("x=%d,y=%d",&x,&y);则在输入数据时,应在对应的位置上输入同样的字符,即输入x=10,y=20//注意输入的内容如果输入1020就错了。因为系统会把会它scanf()函数中的格式字符串逐个对照检查,只是在%d的位置上代以一个整数。需要注意的是,“x=10”的后面输入一个逗号,它与scanf()函数中的格式控制中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的。3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计(2)字符串输入。对于字符串(%s),不需要使用&运算符,因为数组名本身就是一个指针。示例代码如下。charstr[20];scanf("%s",str);(3)空格处理。scanf()函数在读取字符串时会忽略前导空白字符(如空格、制表符、换行符)。如果需要读取包含空格的字符串,可以使用fgets()。(4)返回值。scanf()函数返回成功读取并赋值的项数。如果没有匹配到任何输入,返回EOF。3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计【实例3.1】使用scanf()函数输入数据。
程序代码如下。#include<stdio.h>intmain(){intnum;floatpi;charch;charstr[20];printf("请输入一个整数:");scanf("%d",&num);printf("请输入一个浮点数:");scanf("%f",&pi);printf("请输入一个字符:");scanf("%c",&ch);//注意前面的空格,用于跳过空白字符
printf("请输入一个字符串:");scanf("%s",str);printf("****************************************\n");printf("输入的整数为:%d\n",num);printf("输入的浮点数为:%.2f\n",pi);//保留2位小数点
printf("输入的字符为:%c\n",ch);printf("输入的字符串为:%s\n",str);printf("****************************************\n");return0;}3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计程序运行结果如下。请输入一个整数:10请输入一个浮点数:123.456请输入一个字符:a请输入一个字符串:hello****************************************输入的整数为:10输入的浮点数为:123.46输入的字符为:a输入的字符串为:hello****************************************3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计2.格式化输出函数printf()printf()是用于格式化输出的函数,它将数据以指定的格式输出到标准输出设备(通常是屏幕)。其基本语法格式如下。intprintf(char*format,...);其中,format是一个字符串,包含普通字符和格式说明符。格式说明符以%开头,用于指定输出数据的类型和格式。可变参数列表(...)表示要输出的数据。printf()函数常用格式说明符,如表3.2所示。3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计修饰符可以在格式说明符中添加修饰符来控制输出的对齐方式、宽度、精度等。printf()函数常用修饰符,如表3.3所示。3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计【实例3.2】使用printf()函数输出数据。程序代码如下。#include<stdio.h>intmain(){intnum=100;floatpi=3.14159;charch='A';charstr[]="Hello";printf("整数:%d\n",num);//输出整数
printf("浮点数:%.2f\n",pi);//输出浮点数,保留两位小数
printf("字符:%c\n",ch);//输出字符
printf("字符串:%s\n",str);//输出字符串
printf("指针地址:%p\n",&num);//输出指针地址
return0;}程序运行结果如下。整数:100浮点数:3.14字符:A字符串:Hello指针地址:0019FF2C3.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计【实例3.3】从键盘输入两个数值,计算两个数值的和与积。程序代码如下。(插入二维码V3-3从键盘输入两个数值,计算两个数值的和与积)#include<stdio.h>intmain(){//变量声明
floatnum1,num2,sum_result,product_result;//输入
printf("请输入第一个数值:");scanf("%f",&num1);printf("请输入第二个数值:");scanf("%f",&num2);//处理
sum_result=num1+num2;product_result=num1*num2;//输出
printf("两数值之和为:%.2f\n",sum_result);printf("两数值之积为:%.2f\n",product_result);return0;}程序运行结果如下。请输入第一个数值:10请输入第二个数值:20两数值之和为:30.00两数值之积为:200.003.2顺序结构程序设计3.2.1格式化输入输出第3章程序的结构化设计字符输入输出函数用于处理单个字符的读取和写入。这些函数操作简单且高效,适用于逐字符处理数据的场景。1.字符输入函数getchar()getchar()函数用于从标准输入设备(通常是键盘)读取单个字符。其基本语法格式如下。intgetchar(void);不需要参数。返回值:成功时返回读取的字符(以int类型返回);到达文件末尾或发生错误时返回EOF。【实例3.4】使用字符输入函数getchar()。程序代码如下。
#include<stdio.h>intmain(){charch;//变量声明
printf("请输入一个字符:");ch=getchar();//读取用户输入的字符
printf("输入的字符是:");putchar(ch);//输出读取的字符
putchar('\n');return0;}程序运行结果如下。请输入一个字符:a输入的字符是:a3.2顺序结构程序设计3.2.2字符输入输出函数第3章程序的结构化设计2.字符输出函数putchar()putcharr()函数用于将单个字符输出到标准输出设备(通常是屏幕)。其基本语法格式如下。intputchar(intchar);其中,参数char是要输出的字符(通常用char类型,但实际参数是int类型)。返回值:成功时返回输出的字符;失败时返回EOF。【实例3.5】使用字符输出函数putchar()。程序代码如下。
#include<stdio.h>intmain(){charch='A';printf("输出的字符是:");putchar(ch);//输出字符"A"putchar('\n');//输出换行符
return0;}程序运行结果如下。输出的字符是:A3.2顺序结构程序设计3.2.2字符输入输出函数第3章程序的结构化设计3.3.1条件运算符和条件表达式3.3.2if语句实现单分支结构3.3.3if-else语句实现双分支结构3.3.4if-else-if语句实现多分支结构3.3.5if语句的嵌套结构3.3.6switch语句实现多分支结构3.3选择结构程序设计第3章程序的结构化设计在C语言中,条件运算符(也称为三元运算符)提供了一种简洁的方式来实现基于条件的表达式选择。它是一种特殊的运算符,可以用来替代简单的if-else语句,使代码更加紧凑和易于阅读。1.条件运算符条件运算符由“?”和“:”两个符号组成,用于条件求真,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符,条件运算符是右结合的。2.条件表达式由条件运算符将3个表达式连接起来的式子称为条件表达式,其基本语法格式如下。表达式1?表达式2:表达式3其中,表达式1是一个条件表达式,其结果必须是一个整数值(通常是逻辑值)。如果表达式1的结果为真(非零),则整个条件运算的结果是表达式2的值;否则,是表达式3的值。表达式2和表达式3可以是任意类型的表达式,但它们的类型需要兼容,或者可以通过隐式转换进行匹配。3.3选择结构程序设计3.3.1条件运算符和条件表达式第3章程序的结构化设计【实例3.6】用条件表达式求两个数值中较大的数值。程序代码如下。
#include<stdio.h>intmain(){inta,b;printf("请输入两个数值(用空格分隔):");scanf("%d%d",&a,&b);//空格分隔两个整数
printf("两个数值中最大的数为:%d\n",a>b?a:b);return0;}程序运行结果如下。请输入两个数值(用空格分隔):1020两个数值中最大的数为:20需要注意的是C语言对符号非常敏感,必须使用英文标点符号。3.3选择结构程序设计3.3.1条件运算符和条件表达式第3章程序的结构化设计if语句用于实现条件分支结构。单分支结构是指只有在满足特定条件时才执行某些操作,而不满足条件时不执行任何额外的操作。1.if语句单分支结构的语法格式if语句实现单分支结构,其基本语法格式如下。if(表达式){//当表达式为真时执行的代码块}其中,表达式是一个布尔表达式(即返回值为真或假的表达式)。如果表达式的值为真(非零),则执行大括号{}中的代码块;否则跳过该代码块。3.3选择结构程序设计3.3.2if语句实现单分支结构第3章程序的结构化设计2.编程实现if语句单分支结构【实例3.7】键盘上输入一个成绩,判断学生输入的成绩是否合格(假设60分为合格)。程序代码如下。
#include<stdio.h>intmain(){intscore;printf("请输入你的成绩:");scanf("%d",&score);if(score>=60){printf("恭喜你,你的成绩合格!\n");}return0;}程序运行结果如下。请输入你的成绩:85恭喜你,你的成绩合格!可以看到,如果score>=60为真,则输出“恭喜你,你的成绩合格!”。再次执行程序,输入成绩为:50。请输入你的成绩:50如果条件不满足,则什么都不做。3.3选择结构程序设计3.3.2if语句实现单分支结构第3章程序的结构化设计【实例3.8】键盘上输入一个整数,判断整数是否为偶数。程序代码如下。
#include<stdio.h>intmain(){intnumber;printf("请输入一个整数:");scanf("%d",&number);if(number%2==0){printf("%d是偶数。\n",number);}return0;}程序运行结果如下。请输入一个整数:1010是偶数。3.3选择结构程序设计3.3.2if语句实现单分支结构第3章程序的结构化设计【实例3.9】键盘上输入两个整数,将这两个整数按照从小到大的顺序输出。程序代码如下。#include<stdio.h>intmain(){intx,y,t;printf("请输入两个整数(以空格进行分隔):");scanf("%d%d",&x,&y);if(x>y){t=x;x=y;y=t;}printf("这两个数值从小到大的顺序为:%d%d\n",x,y);return0;}程序运行结果如下。请输入两个整数(以空格进行分隔):2010这两个数值从小到大的顺序为:10203.3选择结构程序设计3.3.2if语句实现单分支结构第3章程序的结构化设计【实例3.10】键盘上输入三个整数,查询最大数值并输出。程序代码如下。#include<stdio.h>intmain(){intx,y,z,max;printf("请输入三个整数(以空格进行分隔):");scanf("%d%d%d",&x,&y,&z);max=x;if(y>max){max=y;}if(z>max){max=z;}printf("这三个数值最大数值为:%d\n",max);return0;}程序运行结果如下。请输入三个整数(以空格进行分隔):103020这三个数值最大数值为:303.3选择结构程序设计3.3.2if语句实现单分支结构第3章程序的结构化设计if-else语句用于实现双分支结构。这种结构允许程序根据条件的真假执行不同的代码块:如果条件为真,则执行一个代码块;如果条件为假,则执行另一个代码块。1.if-else语句双分支结构的语法格式if-else语句实现双分支结构,其基本语法格式如下。if(表达式){//当表达式为真时执行的代码块}else{//当表达式为假时执行的代码块}其中,表达式是一个布尔表达式(即返回值为真或假的表达式)。如果表达式的值为真(非零),则执行if后面的代码块;如果表达式的值为假(零),则执行else后面的代码块。3.3选择结构程序设计3.3.3if-else语句实现双分支结构第3章程序的结构化设计2.编程实现if-else语句双分支结构【实例3.11】键盘上输入一个成绩,判断学生输入的成绩是否合格(假设60分为合格),并输出不同的信息。程序代码如下。#include<stdio.h>intmain(){intscore;printf("请输入你的成绩:");scanf("%d",&score);if(score>=60){printf("恭喜你,你的成绩合格!\n");}else{printf("很遗憾,你的成绩不合格!\n");}return0;}程序运行结果如下。请输入你的成绩:80恭喜你,你的成绩合格!请输入你的成绩:55很遗憾,你的成绩不合格!3.3选择结构程序设计3.3.3if-else语句实现双分支结构第3章程序的结构化设计【实例3.12】键盘上输入一个数值x,若有下列分段函数,根据x的值,求y的值。程序代码如下。#include<stdio.h>intmain(){doublex,y;//提示用户输入x的值
printf("请输入x的值:");scanf("%lf",&x);//根据分段函数计算y的值
if(x>=0){y=2*x-1;//当x≥0时,y=2x-1}else{y=2*x+1;//当x<0时,y=2x+1}//输出结果
printf("当x=%.2lf时,y=%.2lf\n",x,y);return0;}程序运行结果如下。请输入x的值:10当x=10.00时,y=19.00请输入x的值:-5当x=-5.00时,y=-9.003.3选择结构程序设计3.3.3if-else语句实现双分支结构第3章程序的结构化设计【实例3.13】键盘上输入三角形的边长a,b,c,通过三角形不等式定理a+b>c&&a+c>b&&b+c>a确保三边能构成三角形。使用海伦公式:area=√(s(s-a)(s-b)(s-c))其中,s=(a+b+c)/2,求三角形的面积area,结果保留两位小数输出(%.2f)。程序代码如下。#include<stdio.h>#include<math.h>intmain(){doublea,b,c;//输入三条边长
printf("请输入三角形的三条边长(用空格分隔):");scanf("%lf%lf%lf",&a,&b,&c);//检查边长是否为正数
if(a<=0||b<=0||c<=0){printf("错误:边长必须为正数!\n");return1;}//验证三角形不等式定理
if((a+b>c)&&(a+c>b)&&(b+c>a)){//计算半周长
doubles=(a+b+c)/2;//海伦公式计算面积
doublearea=sqrt(s*(s-a)*(s-b)*(s-c));printf("三角形的面积为:%.2f\n",area);}else{printf("这三条边无法构成三角形!\n");}return0;}3.3选择结构程序设计3.3.3if-else语句实现双分支结构第3章程序的结构化设计程序运行结果如下。请输入三角形的三条边长(用空格分隔):345三角形的面积为:6.00请输入三角形的三条边长(用空格分隔):-556错误:边长必须为正数!请输入三角形的三条边长(用空格分隔):248这三条边无法构成三角形!3.3选择结构程序设计3.3.3if-else语句实现双分支结构第3章程序的结构化设计if-else-if语句用于实现多分支结构。这种结构允许程序根据多个条件依次判断,并执行符合条件的第一个代码块。如果所有条件都不满足,则可以执行else分支(可选)。1.if-else-if语句多分支结构的语法格式if-else-if语句实现多分支结构,其基本语法格式如下。if(表达式1){//当表达式1为真时执行的代码块}elseif(表达式2){//当表达式2为真时执行的代码块}elseif(表达式3){//当表达式3为真时执行的代码块}else{//如果所有条件都不满足时执行的代码块(可选)}程序会从上到下依次检查每个条件。一旦某个条件为真,就执行对应的代码块,并跳过后续的条件检查。如果所有条件都不满足,并且存在else分支,则执行else中的代码块。3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计2.编程实现if-else-if语句多分支结构【实例3.14】键盘上输入一个成绩,判断学生输入的成绩等级(优秀、良好、中等、及格或不及格),并输出不同的信息。程序代码如下。#include<stdio.h>intmain(){intscore;printf("请输入你的成绩(0-100):");scanf("%d",&score);if(score>=90){printf("你的成绩等级:优秀\n");}elseif(score>=80){printf("你的成绩等级:良好\n");}elseif(score>=70){printf("你的成绩等级:中等\n");}elseif(score>=60){printf("你的成绩等级:及格\n");}else{printf("你的等级:不及格\n");}return0;}3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计程序运行结果如下。请输入你的成绩(0-100):95你的成绩等级:优秀请输入你的成绩(0-100):80你的成绩等级:良好请输入你的成绩(0-100):75你的成绩等级:中等请输入你的成绩(0-100):60你的成绩等级:及格请输入你的成绩(0-100):55你的等级:不及格3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计【实例3.15】使用if-else-if语句,根据用户输入的数字(1-7),输出对应的星期几。程序代码如下。#include<stdio.h>intmain(){intday;printf("请输入一个数字(1-7):");scanf("%d",&day);if(day==1){printf("星期一\n");}elseif(day==2){printf("星期二\n");}elseif(day==3){printf("星期三\n");}elseif(day==4){printf("星期四\n");}elseif(day==5){printf("星期五\n");}elseif(day==6){printf("星期六\n");}elseif(day==7){printf("星期日\n");}else{printf("输入无效!请输入1到7之间的数字。\n");}return0;}3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计程序运行结果如下。请输入一个数字(1-7):1星期一请输入一个数字(1-7):2星期二请输入一个数字(1-7):3星期三请输入一个数字(1-7):4星期四请输入一个数字(1-7):5星期五请输入一个数字(1-7):6星期六请输入一个数字(1-7):7星期日请输入一个数字(1-7):8输入无效!请输入1到7之间的数字。3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计【实例3.16】实现一个简单的菜单功能,根据用户的选择执行不同的操作。程序代码如下。#include<stdio.h>intmain(){intchoice;printf("请选择一个选项:\n");printf("1.查看余额\n");printf("2.存款\n");printf("3.取款\n");printf("4.退出\n");printf("请输入选项编号:");scanf("%d",&choice);if(choice==1){printf("您选择了查看余额。\n");}elseif(choice==2){printf("您选择了存款。\n");}elseif(choice==3){printf("您选择了取款。\n");}elseif(choice==4){printf("您选择了退出。\n");}else{printf("无效选项,请重新选择。\n");}return0;}3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计程序运行结果如下。请选择一个选项:1.查看余额2.存款3.取款4.退出请输入选项编号:1您选择了查看余额。请输入选项编号:2您选择了存款。请输入选项编号:3您选择了取款。请输入选项编号:4您选择了退出。请输入选项编号:5无效选项,请重新选择。3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计【实例3.17】键盘上输入一个数值x,若有下列分段函数,根据x的值,求y的值。程序代码如下。#include<stdio.h>#include<math.h>//包含数学库以使用sin函数intmain(){doublex,y;//提示用户输入x的值
printf("请输入x的值:");scanf("%lf",&x);//根据分段函数计算y的值
if(x<1){y=2*x+1;//当x<1时,y=2x+1}elseif(x<=10){y=2*x;//当1≤x≤10时,y=2x}else{y=1-sin(x);//当x>10时,y=1-sin(x)}//输出结果
printf("当x=%.2lf时,y=%.2lf\n",x,y);return0;}3.3选择结构程序设计3.3.4if-else-if语句实现多分支结构第3章程序的结构化设计if语句可以嵌套使用,这意味着可以在一个if或else代码块内部再使用另一个if语句。通过嵌套if语句,可以处理更复杂的条件逻辑。1.if语句的嵌套结构的语法格式if语句的嵌套结构,其基本语法格式如下。if(表达式1){//当表达式1为真时执行的代码块
if(表达式2){//当表达式2也为真时执行的代码块
}else{//当表达式2为假时执行的代码块(可选)
}}else{//当表达式1为假时执行的代码块(可选)}条件判断可以根据需要层层嵌套。每个if可以有自己的else分支,也可以没有。3.3选择结构程序设计3.3.5if语句的嵌套结构第3章程序的结构化设计2.编程实现if语句的嵌套结构【实例3.18】检查成绩等级并判断是否及格。假设不仅想根据分数划分等级(如A、B、C、D等),还想判断该分数是否及格(假设60分及以上为及格)。程序代码如下。#include<stdio.h>intmain(){intscore;printf("请输入你的成绩(0-100):");scanf("%d",&score);if(score>=60){//判断是否及格
if(score>=90){printf("你的等级是:A\n");}elseif(score>=80){printf("你的等级是:B\n");}elseif(score>=70){printf("你的等级是:C\n");}elseif(score>=60){printf("你的等级是:D\n");}printf("恭喜你,你及格了!\n");}else{printf("很遗憾,你没有及格。\n");}return0;}3.3选择结构程序设计3.3.5if语句的嵌套结构第3章程序的结构化设计【实例3.19】判断日期合法性。假设需要编写一个程序来验证给定的年份、月份和日期是否构成一个合法的日期。例如,2月只有在闰年时才有29天。程序代码如下。#include<stdio.h>//判断是否为闰年intisLeapYear(intyear){return(year%4==0&&year%100!=0)||(year%400==0);}intmain(){intyear,month,day;printf("请输入年份:");scanf("%d",&year);printf("请输入月份:");scanf("%d",&month);printf("请输入日期:");scanf("%d",&day);3.3选择结构程序设计3.3.5if语句的嵌套结构第3章程序的结构化设计if(month>=1&&month<=12){//检查月份是否有效
if(month==2){//特殊处理2月
if(isLeapYear(year)){if(day>=1&&day<=29){printf("这是一个有效的日期。\n");}else{printf("无效的日期。\n");}}else{if(day>=1&&day<=28){printf("这是一个有效的日期。\n");}else{printf("无效的日期。\n");}}}elseif(month==4||month==6||month==9||month==11){//30天的月份
if(day>=1&&day<=30){printf("这是一个有效的日期。\n");}else{printf("无效的日期。\n");}}else{//其他月份(31天)
if(day>=1&&day<=31){printf("这是一个有效的日期。\n");}else{printf("无效的日期。\n");}}}else{printf("无效的月份。\n");}return0;}3.3选择结构程序设计3.3.5if语句的嵌套结构第3章程序的结构化设计程序运行结果如下。请输入年份:2000请输入月份:2请输入日期:29这是一个有效的日期。请输入年份:2025请输入月份:2请输入日期:29无效的日期。请输入年份:2025请输入月份:3请输入日期:313.3选择结构程序设计3.3.5if语句的嵌套结构第3章程序的结构化设计【实例3.20】键盘上输入一个数值x,若有下列分段函数,根据x的值,求y的值。程序代码如下。#include<stdio.h>intmain(){intx,y;//提示用户输入x的值
printf("请输入x的值:");scanf("%d",&x);//使用嵌套if语句实现分段函数
if(x>0){y=1;//当x>0时,y=1}else{if(x==0){y=0;//当x=0时,y=0}else{y=-1;//当x<0时,y=-1}}//输出结果
printf("当x=%d时,y=%d\n",x,y);return0;}3.3选择结构程序设计3.3.5if语句的嵌套结构第3章程序的结构化设计switch语句是一种用于实现多分支结构的控制语句。它根据变量或表达式的值匹配不同的case分支,并执行对应的代码块。相比if-else-if,switch更适合处理离散值的多分支逻辑。1.switch语句的语法格式switch语句的结构,其基本语法格式如下。switch(表达式){casevalue1://当表达式==value1时执行的代码块
break;casevalue2://当表达式==value2时执行的代码块
break;...default://当表达式不匹配任何case时执行的代码块(可选)}表达式:必须是一个整数类型(如int、char)或枚举类型。case标签:每个case后面跟一个常量值,表示匹配的条件。break:用于结束当前分支并跳出switch语句。如果省略break,程序会继续执行后续的case分支(称为“贯穿”)。default:可选分支,当表达式不匹配任何case时执行。3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计2.编程实现switch语句实现多分支结构【实例3.21】编程实现了一个简单的菜单功能,用户输入数字选择操作,并输出相应的提示操作信息。程序代码如下。#include<stdio.h>intmain(){intchoice;printf("请选择一个选项:\n");printf("1.查看余额\n");printf("2.存款\n");printf("3.取款\n");printf("4.退出\n");printf("请输入选项编号:");scanf("%d",&choice);3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计switch(choice){case1:printf("您选择了查看余额。\n");break;case2:printf("您选择了存款。\n");break;case3:printf("您选择了取款。\n");break;case4:printf("您选择了退出。\n");break;default:printf("无效选项,请重新选择。\n");}return0;}3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计程序运行结果如下。请选择一个选项:1.查看余额2.存款3.取款4.退出请输入选项编号:1您选择了查看余额。请输入选项编号:2您选择了存款。请输入选项编号:3您选择了取款。请输入选项编号:4您选择了退出。请输入选项编号:5无效选项,请重新选择。3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计【实例3.22】使用switch语句,根据用户输入的数字(1-7),输出对应的星期几。程序代码如下。#include<stdio.h>intmain(){intday;printf("请输入一个数字(1-7):");scanf("%d",&day);switch(day){case1:printf("星期一\n");break;case2:printf("星期二\n");break;case3:printf("星期三\n");break;case4:printf("星期四\n");break;case5:printf("星期五\n");break;case6:printf("星期六\n");break;case7:printf("星期日\n");break;default:printf("输入无效!请输入1到7之间的数字。\n");}return0;}3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计程序运行结果如下。请输入一个数字(1-7):1星期一请输入一个数字(1-7):2星期二请输入一个数字(1-7):3星期三请输入一个数字(1-7):4星期四请输入一个数字(1-7):5星期五请输入一个数字(1-7):6星期六请输入一个数字(1-7):7星期七请输入一个数字(1-7):8输入无效!请输入1到7之间的数字。3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计【实例3.23】使用switch语句,编程实现,输入考试成绩,其中90~100之间为A级,80~89之间为B级,70~79之间为C级,60~69之间为D级,低于60为E级,将成绩转化为相应的五级制级别并输出。程序代码如下。#include<stdio.h>intmain(){intscore;chargrade;//提示用户输入成绩
printf("请输入考试成绩(0-100):");scanf("%d",&score);//检查输入是否合法
if(score<0||score>100){printf("输入的成绩无效,请输入0到100之间的整数。\n");return1;//返回错误状态
}3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计//使用switch语句划分等级
switch(score/10){//将成绩按十位数分组
case10://特殊处理满分情况
case9:grade='A';break;case8:grade='B';break;case7:grade='C';break;case6:grade='D';break;default://处理低于60分的情况
grade='E';}//输出结果
printf("你的成绩等级是:%c\n",grade);return0;}3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计程序运行结果如下。请输入考试成绩(0-100):100你的成绩等级是:A请输入考试成绩(0-100):95你的成绩等级是:A请输入考试成绩(0-100):80你的成绩等级是:B请输入考试成绩(0-100):75你的成绩等级是:C请输入考试成绩(0-100):60你的成绩等级是:D请输入考试成绩(0-100):55你的成绩等级是:E请输入考试成绩(0-100):120输入的成绩无效,请输入0到100之间的整数。3.3选择结构程序设计3.3.6switch语句实现多分支结构第3章程序的结构化设计3.4.1for循环语句3.4.2while循环语句3.4.3do-while语句3.4.4改变循环结构的跳转语句3.4循环结构程序设计第3章程序的结构化设计for循环是一种常用的循环结构,特别适合处理已知循环次数的场景。它的语法简洁明了,便于控制循环变量的初始化、条件判断和更新操作。1.for循环语句的语法格式for循环语句的结构,其基本语法格式如下。for(初始化;条件判断;更新){//循环体}初始化:设置循环的初始状态,通常是一个变量赋值操作(如inti=0)。条件判断:每次循环开始前都会检查该条件。如果条件为真,则继续执行循环;如果为假,则退出循环。更新:每次循环结束后执行的操作,通常用于更新循环变量(如i++或i+=2)。循环体:需要重复执行的代码块。3.4循环结构程序设计3.4.1for循环语句第3章程序的结构化设计2.编程实现for循环语句【实例3.24】使用for循环打印从1到5的数字。程序代码如下。#include<stdio.h>inti;intmain(){for(i=1;i<=5;i++){printf("%d\n",i);}return0;}程序运行结果如下。12345初始化:i=1;条件判断:只要i<=5为真,就继续执行循环;更新操作:每次循环结束后,i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校食堂食材采购的管理制度(3篇)
- 职业礼仪实操题目及答案
- AI在政治学中的应用
- AI在应用统计中的应用
- 医师执业注册管理制度
- 第二类医疗器械经营备案表
- 公路与桥涵勘测设计与案例分析课件
- 2026年北师大版小学数学四年级下册期末综合测试卷及答案
- 永春东农产品冷链物流园水土保持报告表
- 网络信息安全基础(AIGC版)随堂前测练习题及参考答案 项目5-任务1-前测练习-单选题5
- 设备调试进度汇报说明4篇
- 养殖猪场应急预案(3篇)
- 保育员技能比赛主持稿
- 羊水栓塞救治中的团队协作效率提升策略
- GB/T 10801.2-2025绝热用挤塑聚苯乙烯泡沫塑料(XPS)
- 2025年博物馆展览管理与维护规范
- 河南周口介绍
- 国家事业单位招聘2024中国人民银行数字货币研究所招聘6人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 《应有格物致知精神》课文精讲
- 雨课堂学堂在线学堂云《信息检索与科技写作( 理大)》单元测试考核答案
- 新手教师职业成长问题及解决对策
评论
0/150
提交评论