版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习目标在第1章中讲述了结构化程序的基本概念和基本结构,从程序流程的角度来看,程序可以分为3种基本结构,即顺序结构、选择结构(又称分支结构)、循环结构。这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现程序的3种基本结构,本章介绍这些基本语句及其应用,为后面各章的学习打下基础。下一页返回学习目标【学习目标】(1)掌握用表达式语句、空语句、复合语句实现顺序结构的程序设计。(2)掌握用if语句实现分支结构;用switch语句实现多分支结构的程序设计。(3)掌握用while语句、do…while和for语句实现循环结构的程序设计。(4)了解continue语句、break语句的用法。(5)理解各种语句的嵌套。上一页返回3.1C语句概述语句是构成程序的基本单位,程序的功能就是通过一条条语句的执行而得以实现的。学习C语言,首先要学习它的数据描述方法(第2章讲述),把要处理的数据表示出来,其次要了解它的语句功能和使用,从而对这些数据进行所需的处理。C语言的语句根据其在程序中所起的作用可分为说明语句和可执行语句两大类。说明语句用于对程序中所使用的变量及其属性进行定义(或说明)。例如:inta,b;/*说明语句*/下一页返回3.1C语句概述可执行语句是用于完成程序功能的语句。根据可执行语句的表现形式及功能的不同,可以把C语言的可执行语句划分为表达式语句、函数调用语句、复合语句、空语句和流程控制语句5大类,这5大类语句是编写C程序的基本语句。下面对C语言中的5类基本语句作一简要说明。1.表达式语句由运算符、常量、变量等可以组成表达式,而表达式后加分号就构成表达式语句。其一般格式为:表达式;执行表达式语句就是计算表达式的值。上一页下一页返回3.1C语句概述例如:a=3;/*这是C语言中最常用的赋值语句,由赋值表达式a=3加一个分号构成*/y+z;/*加法运算语句,其计算结果不能保留,无实际意义,但它是合法语句*/i++;/*自增1语句,i值增1*/上一页下一页返回3.1C语句概述2.函数调用语句由函数名、实际参数加上分号“;”组成。其一般格式为:函数名(实际参数表);执行函数调用语句就是把实际参数赋值给函数定义中的形式参数,然后执行被调函数体中的语句,实现函数功能。例如:printf("%d",a)/*是函数调用表达式*/printf("%d",a);/*是函数调用语句,功能是调用库函数printf输出变量a的值。*/上一页下一页返回3.1C语句概述3.复合语句用一对大括号{}括起来的一条或多条语句,称为复合语句。例如:{x=y+z;a=b+c;printf("%d%d",x,a);}复合语句在语法上是一个整体,相当于一个语句。凡是能使用简单语句的地方,都可以使用复合语句。一个复合语句中又可以包含另一个或多个复合语句。在复合语句中也可以定义变量。下面将要介绍的分支结构、循环结构中经常使用到复合语句。注意:复合语句内的各语句都必须以分号“;”结尾,在大括号“}”外不能再加分号。上一页下一页返回3.1C语句概述4.空语句只有一个分号“;”组成的语句称为空语句,它表示什么操作也不做。从语法上讲,它的确是一条语句。在程序设计中,若某处从语法上需要一条语句,而实际上不需要执行任何操作时就可以使用它。在设计循环结构时,有时会用到空语句。例如:while(getchar()!='\n');本语句的功能是:只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。上一页下一页返回3.1C语句概述5.流程控制语句流程控制语句用来对程序的执行方向起控制作用。通常程序的执行不可能都是按顺序执行的,往往需要根据不同的条件执行不同的程序段,这时就要借助流程控制语句来实现。C语言有9种流程控制语句,分成以下3类。(1)条件判断语句。包括:if语句,switch语句。(2)循环执行语句。包括:do…while语句,while语句,for语句。(3)转向语句。包括:break语句,goto语句,continue语句,return语句。上一页返回3.2赋值语句赋值语句是由赋值表达式再加上分号构成的表达式语句。赋值语句的功能和特点都与赋值表达式相同,是程序设计中使用频率最高也是最基本的语句。其一般格式为:变量=表达式;例如:i=a+b;功能:首先计算“=”右边表达式的值,将值类型转换成“=”左边变量的数据类型后,赋给该变量(即把表达式的值存入该变量所占用的存储单元中)。赋值语句中,赋值运算符“=”左边是以变量名标识的内存中的存储单元。在程序中定义变量,编译程序将为该变量分配存储单元,以变量名代表该存储单元。所以出现在“=”左边的必须是变量名。下一页返回3.2赋值语句说明:(1)由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此下述形式是成立的,从而形成嵌套的情形。变量=(变量=表达式);例如:a=b=c=d=e=5;即赋值语句允许连续赋值。注意:在变量定义中,不允许连续给多个变量赋初值。例如下述定义是错误的:inta=b=c=5;应写为inta=5,b=5,c=5;上一页下一页返回3.2赋值语句(2)赋值表达式和赋值语句有区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。下述语句是合法的:if((x=y+5)>0)z=x;/*语句的功能是,若表达式x=y+5大于0则z=x。*/下述语句是非法的:if((x=y+5;)>0)z=x;/*因为x=y+5;是语句,不能出现在表达式中。*/上一页返回3.3顺序结构程序设计顺序结构程序是在程序执行时,根据程序中语句的书写顺序依次执行的语句序列。通常由赋值语句和输入输出语句组成。例如下面求圆面积的程序就是一个顺序结构的程序。【例3-1】求圆的面积程序。#include<stdio.h>main(){floats,r;printf("请输入圆的半径:\n");下一页返回3.3顺序结构程序设计scanf("%f",&r);s=3.14*r*r;printf("圆的面积为:%f\n",s);}运行结果如下:请输入圆的半径:2↙圆的面积为:12.560000上一页返回3.4分支结构程序设计C语言用于实现分支结构的语句主要有两种:if语句和switch语句。3.4.1if语句if语句是最常用的条件选择语句,它通过对给定条件的判断,来决定下一步所要执行的操作。1.if语句的两种形式C语言提供了如下两种形式的if语句。下一页返回3.4分支结构程序设计C语言提供了如下两种形式的if语句。1)简单if语句一般格式为:if(表达式)语句功能:计算表达式的值,若为“真”,则执行语句;否则将跳过语句,执行if语句后的下一条语句。如图3-1所示。例如:if(x>0)printf("x大于0\n");上一页下一页返回3.4分支结构程序设计2)if…else语句简单if语句只指出条件为“真”时做什么,而条件为“假”时什么也不做。if…else语句则指出了作为控制条件的表达式为“真”时做什么,为“假”时做什么。if…else语句的一般格式为:if(表达式)语句1else语句2功能:计算表达式的值,若表达式的值为“真”,执行语句1,并跳过语句2,继续执行if…else语句后的下一条语句;若表达式的值为“假”,跳过语句1,执行语句2,然后继续执行if…else语句后的下一条语句。如图3-2所示。上一页下一页返回3.4分支结构程序设计例如:if(x>y)printf("x大于y\n");elseprintf("x小于y\n");说明:(1)在两种形式的if语句中,if关键字之后括号中的表达式是程序执行方向的控制条件,通常用逻辑表达式或关系表达式构造。由于控制条件的“真”“假”用非0和0表示,因此也可以用其他表达式构造控制条件,如赋值表达式等,甚至也可以是一个变量或常量。例如:if(a=5)语句;if(b)语句;上一页下一页返回3.4分支结构程序设计都是允许的。只要表达式的值为非0(“真”)或0(“假”)即可。只是if(a=5)语句;中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。又如,有以下程序段:if(a=b)printf("%d",a);elseprintf("a=0");本语句的功能是把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。上一页下一页返回3.4分支结构程序设计常见的控制条件有如下几种形式:if(a==0)k=1;/*控制条件为关系表达式,a的值为0时,执行k=1;*/if(a=0)k=1;/*控制条件为赋值表达式,给a赋0值,不执行k=1;*/if(a>b&&c>d)k=1;/*控制条件为逻辑表达式,a>b&&c>d为“真”时,执行k=1;*/if(a!=0)k=1;/*控制条件为关系表达式,a不等于0时,执行k=1;*/if(a)k=1;/*控制条件为算术表达式,a不等于0时,执行k=1;*/if(1)k=1;/*控制条件为算术表达式,1为“真”,执行k=1;*/上一页下一页返回3.4分支结构程序设计(2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。(3)在if语句的两种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。但要注意的是在“}”之后不能再加分号。例如:if(a>b){a++;b++;}else{a=0;b=10;}上一页下一页返回3.4分支结构程序设计【例3-2】求两个数中的最大值。#include<stdio.h>main(){floatx,y;scanf("%f,%f",&x,&y);if(x>y)printf("max=%f\n",x);elseprintf("max=%f\n",y);}运行结果如下:1.2,2.3↙max=2.300000上一页下一页返回3.4分支结构程序设计执行程序输入数据后,x的值为1.2,y的值为2.3,不满足x>y,条件表达式的值为假,执行else后的输出函数,输出y的值。【例3-3】判断一个数是奇数还是偶数。分析:判断一个数a是奇数还是偶数的方法为:若a%2==0为"真",则a是偶数,否则a是奇数。#include<stdio.h>main(){inta;scanf("%d",&a);上一页下一页返回3.4分支结构程序设计if(a%2==0)printf("%d是偶数\n",a);elseprintf("%d是奇数\n",a);}运行结果如下:12↙12是偶数上一页下一页返回3.4分支结构程序设计2.嵌套的if语句在简单if语句和if~else语句形式中,语句1或语句2可以是任意合法语句。若它们也是if语句,就构成嵌套的if语句。嵌套的if语句根据实际编程需要可以有很多格式,常用的格式包括以下5种。1)嵌套形式1if(表达式1)if(表达式2)语句1else语句2else语句3执行流程如图3-3所示,第一个else与第二个if结合,而最后一个else与第一个if结合。上一页下一页返回3.4分支结构程序设计例如:if(x>=0)if(x>0)y=2*x+1;elsey=x;elsey=x-1;2)嵌套形式2if(表达式1){if(表达式2)语句1}else语句2上一页下一页返回3.4分支结构程序设计执行流程如图3-4所示,else与第一个if结合。因为第二个if在复合语句中,复合语句是一条语句,不能与复合语句外的else结合。如果把{}去掉,则else与第二个if结合,这时第一个if是简单的if语句形式(即不带else的if语句)。例如:y=x;if(x>=0)/*if嵌套形式2*/{if(x>0)y=2*x+1;}elsey=x-1;上一页下一页返回3.4分支结构程序设计3)嵌套形式3if(表达式1)语句1elseif(表达式2)语句2else语句3执行流程如图3-5所示,第一个else与第一个if结合,而第二个else与第二个if结合。上一页下一页返回3.4分支结构程序设计例如:if(x>0)y=2*x+1;elseif(x==0)y=x;elsey=x-1;说明:C语言规定:else总是与它前面最近的同一复合语句内的不带else的if结合。在if语句嵌套形式2中可以看到,else与if在同一复合语句内才能结合。上一页下一页返回3.4分支结构程序设计【例3-4】有如下分段函数,给出分段函数的自变量x,求相应的函数值。
(1)程序采用if语句嵌套形式1实现。#include<stdio.h>main(){intx,y;scanf("%d",&x);if(x>=0)/*if嵌套形式1*/上一页下一页返回3.4分支结构程序设计if(x>0)y=2*x+1;elsey=x;elsey=x-1;printf("x=%d,y=%d\n",x,y);}上一页下一页返回3.4分支结构程序设计(2)程序采用if语句嵌套形式2实现。#include<stdio.h>main(){intx,y;scanf("%d",&x);y=x;if(x>=0)/*if嵌套形式2*/{if(x>0)y=2*x+1;}elsey=x-1;printf("x=%d,y=%d\n",x,y);}上一页下一页返回3.4分支结构程序设计分析:首先执行y=x;。由于在程序中x>=0条件下只有x>0时的计算语句,所以x==0时,实际执行的正是y=x;,若x>0,执行的是y=2*x+1;,因此y=x;的结果被替换成y=2*x+1;的执行结果。若x<0,则执行y=x-1;以替换先前执行的y=x;的结果。注意:这里{}不能省略,若省略,即:#include<stdio.h>main(){intx,y;scanf("%d",&x);上一页下一页返回3.4分支结构程序设计y=x;if(x>=0)if(x>0)y=2*x+1;elsey=x-1;printf("x=%d,y=%d\n",x,y);}则else与第二个if结合,结果就完全不一样了:x>0时,执行y=2*x+1;而x==0时却执行y=x-1;若x<0,则执行y=x;。上一页下一页返回3.4分支结构程序设计(3)程序采用if语句嵌套形式3实现。#include<stdio.h>main(){intx,y;scanf("%d",&x);if(x>0)/*if嵌套形式3*/y=2*x+1;elseif(x==0)y=x;elsey=x-1;printf("x=%d,y=%d\n",x,y);}上一页下一页返回3.4分支结构程序设计分析:若x>0,执行y=2*x+1;否则(x<=0),若x==0,则执行y=x;否则(x<0),执行y=x-1;程序采用缩格书写形式,层次分明,else与if的结合一目了然。注意:缩格形式仅是一种写法而已,目的是增加可读性。if与else的配对关系于缩格书写与否无关。上一页下一页返回3.4分支结构程序设计4)嵌套形式4if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4执行流程如图3-6所示。上一页下一页返回3.4分支结构程序设计【例3-5】从键盘上输入一个点的坐标,判断该点在第几象限。(假设输入的点不在坐标轴上)#include<stdio.h>main(){intx,y;scanf("%d,%d",&x,&y);if(x>0)/*if嵌套形式4*/if(y>0)printf("点(%d,%d)在第一象限\n",x,y);elseprintf("点(%d,%d)在第四象限\n",x,y);上一页下一页返回3.4分支结构程序设计elseif(y>0)printf("点(%d,%d)在第二象限\n",x,y);elseprintf("点(%d,%d)在第三象限\n",x,y);}运行结果如下:12,3↙
点(12,3)在第一象限上一页下一页返回3.4分支结构程序设计5)嵌套形式5当有更多个分支选择时,可采用if…elseif语句,其一般格式为:if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;
elseif(表达式m)语句m;else语句n;上一页下一页返回3.4分支结构程序设计功能:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n,然后继续执行后续程序。if…elseif语句的执行过程如图3-7所示。【例3-6】输入一个字符,判断输入的是小写字母、大写字母、数字字符还是其他字符。分析:首先应输入一个字符,设为x,当输入的x值满足'A'≤x≤'Z'时,属于大写字母;当输入的x值满足'a'≤x≤'z'时,属于小写字母;当输入的x值满足'0'≤x≤'9'时,属于数字字符;否则,属于其他字符。本例可用嵌套if语句处理此4个分支的情况。上一页下一页返回3.4分支结构程序设计#include<stdio.h>main(){charx;printf("请输入一个字符:\n");scanf("%c",&x);if(x>='A'&&x<='Z')printf("%c是大写字母\n",x);elseif(x>='a'&&x<='z')printf("%c是小写字母\n",x);elseif(x>='0'&&x<='9')printf("%c是数字字符\n",x);elseprintf("%c是其他字符\n",x);}上一页下一页返回3.4分支结构程序设计运行结果如下:请输入一个字符:D↙D是大写字母3.条件运算符与条件表达式条件运算符是C语言中唯一一个三目运算符,即它有3个运算对象。条件运算符的形式是“?:”,由它构成的表达式称为条件表达式。条件表达式的一般格式为:表达式1?表达式2:表达式3上一页下一页返回3.4分支结构程序设计功能:先计算表达式1的值,若值为非0,则计算表达式2的值,并将表达式2的值作为整个条件表达式的结果;若表达式1的值为0,则计算表达式3的值,并将表达式3的值作为整个条件表达式的结果。执行过程见图3-8。例如:有以下条件表达式:(a>b)?a+b:a-b当a=8,b=4时,求解条件表达式的过程如下。先计算关系表达式a>b,结果为1,其值为真,则计算a+b的结果为12,这个12就是整个条件表达式的结果。注意,此时不再计算表达式a-b。如果关系表达式a>b的结果为0,就只是计算a-b而不再计算表达式a+b。上一页下一页返回3.4分支结构程序设计条件表达式通常用于赋值语句中。例如,以下if语句:if(x>y)max=x;elsemax=y;可用条件表达式写为:max=(x>y)?x:y;执行该语句的语义是:如x>y为真,则把x赋值给max,否则把y赋值给max。上一页下一页返回3.4分支结构程序设计注意:(1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值运算符。因此max=(x>y)?x:y;可以去掉括号而写为max=x>y?x:y;。(2)条件运算符?和:是一对运算符,不能分开单独使用。(3)条件运算符的结合方向是自右至左。例如:在条件表达式“a>0?a/b:a<0?a+b:a-b”中,出现了两个条件表达式的嵌套,求解这个表达式时应先计算后面一个条件表达式“a<0?a+b:a-b”的值,然后再与前面的“a>0?a/b:”组合。上一页下一页返回3.4分支结构程序设计【例3-7】用条件表达式求两个数中的大数。#include<stdio.h>main(){inta,b;printf("inputtwonumbers:\n");scanf("%d,%d",&a,&b);printf("max=%d\n",a>b?a:b);}上一页下一页返回3.4分支结构程序设计程序运行结果为:inputtwonumbers:8,9↙max=9上一页下一页返回3.4分支结构程序设计3.4.2用switch语句设计多分支结构程序虽然使用嵌套的if语句也能实现多分支结构程序,但分支较多时显得很繁琐,可读性较差。C语言中,switch语句专用于实现多分支结构程序,其特点是各分支清晰而直观。switch语句的一般格式为:switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;case常量表达式n:语句n;default:语句n+1;}上一页下一页返回3.4分支结构程序设计功能:首先计算表达式的值,然后依次逐个与其后的常量表达式i(i=1,2,…,n)的值相比较,当表达式的值与某个常量表达式i的值相等时,则从常量表达式i处(执行入口)开始执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句,直到switch语句结束。如果表达式的值与所有case后的常量表达式的值均不相同时,则从default处开始执行default后的语句。上一页下一页返回3.4分支结构程序设计说明:(1)switch后面括号中可以是任何表达式,取其整数部分与各常量表达式进行比较。(2)常量表达式中不能出现变量,且类型必须是整型、字符型,各常量表达式的值不能相同,否则会出现错误。(3)语句i可以是一条或多条语句,多条语句时不必用{}将它们括起来。语句i处也可以没有语句,程序执行到此会自动向下顺序执行。(4)default子句的先后顺序可以变动,而不会影响程序执行结果。default语句也可以缺省。上一页下一页返回3.4分支结构程序设计【例3-8】输入某学生的成绩(要求在0~100范围),输出该学生的成绩和等级。(A级:90~100,B级:80~89,C级:60~79,D级:0~59)。分析:为了区分各分数段,可以将[0,100]每10分划为一段,则x/10的可能取值为10,9,…,1,0,它们表示11段:0~9为0段,10~19为1段,…,90~99为9段,100为10段,用case后的常量表达式表示段号。例如,设x=76,则x/10的值为7,所以x在7段,即70≤x<79,属于C级。上一页下一页返回3.4分支结构程序设计#include"stdio.h"main(){intx;printf("Pleaseinputx:\n");scanf("%d",&x);if(x>100||x<0)printf("x=%ddataerror!\n",x);elseswitch(x/10)上一页下一页返回3.4分支结构程序设计{case10:printf("x=%d对应的等级为A\n",x);case9:printf("x=%d对应的等级为A\n",x);case8:printf("x=%d对应的等级为B\n",x);case7:printf("x=%d对应的等级为C\n",x);case6:printf("x=%d对应的等级为C\n",x);default:printf("x=%d对应的等级为D\n",x);}}上一页下一页返回3.4分支结构程序设计运行结果如下:Pleaseinputx:85↙x=85对应的等级为Bx=85对应的等级为Cx=85对应的等级为Cx=85对应的等级为D上一页下一页返回3.4分支结构程序设计第一行输出正确,但后3行输出是多余的。这是因为:x/10的值为8,从case8处开始执行,输出x=85对应的等级为B,若就此结束switch语句的执行,则结果正确。但是,根据switch语句的执行流程,x/10的值与case8匹配后,case8处是执行的入口,以后将顺序执行case7,case6,…后面的语句(除非遇到终止执行的指令)。因此在输出正确结果后,应立即终止switch语句的执行才能达到目的。C语言提供了一种break语句,专门用于跳出switch语句,break语句只有关键字break,没有参数。在后面还将详细介绍。修改上述的程序,在每一个case语句之后增加break语句,使每一次执行之后均可跳出switch语句,从而避免不正确输出结果。上一页下一页返回3.4分支结构程序设计#include"stdio.h"main(){intx;printf("Pleaseinputx:\n");scanf("%d",&x);if(x>100||x<0)printf("x=%ddataerror!\n",x);else上一页下一页返回3.4分支结构程序设计switch(x/10){case10:printf("x=%d对应的等级为A\n",x);break;case9:printf("x=%d对应的等级为A\n",x);break;case8:printf("x=%d对应的等级为B\n",x);break;case7:printf("x=%d对应的等级为C\n",x);break;case6:printf("x=%d对应的等级为C\n",x);break;default:printf("x=%d对应的等级为D\n",x);}}上一页下一页返回3.4分支结构程序设计程序运行结果为:Pleaseinputx:85↙x=85对应的等级为B经过修改后,程序输出结果是正确的。通过观察程序可知,x/10=10,9时执行的程序代码相同,因此该程序还可以再改进,只要在case9:处写这段程序代码,case10可空白。这样,当x/10=10,其后无语句,程序会自动顺序向下执行,即执行case9处的程序段。同样case7与case6也可以依此处理,从而大大减少了程序冗余。上一页下一页返回3.4分支结构程序设计#include"stdio.h"main(){intx;printf("Pleaseinputx:\n");scanf("%d",&x);if(x>100||x<0)printf("x=%ddataerror!\n",x);elseswitch(x/10)上一页下一页返回3.4分支结构程序设计{case10:case9:printf("x=%d对应的等级为A\n",x);break;case8:printf("x=%d对应的等级为B\n",x);break;case7:case6:printf("x=%d对应的等级为C\n",x);break;default:printf("x=%d对应的等级为D\n",x);}}通过上例可以看到,switch语句与break语句相结合,才能设计出正确的多分支结构程序。上一页下一页返回3.4分支结构程序设计3.4.3分支结构程序举例【例3-9】求一元二次方程ax2+bx+c=0的根。一元二次方程的根有以下几种情况:a=0时,不是二次方程;a≠0,b2-4ac=0时,有两个相等的实根;a≠0,b2-4ac>0时,有两个不等的实根;a≠0,b2-4ac<0时,有两个共轭复数根。可用if结构编写程序如下。#include<stdio.h>#include<math.h>上一页下一页返回3.4分支结构程序设计#defineFLOATZERO1e-6main(){floata,b,c,deita,x1,x2,realpart,imagpart;printf("pleaseinputa,b,c:\n");scanf("%f,%f,%f",&a,&b,&c);/*输入方程的三个系数*/printf("Theequation");if(fabs(a)<=FLOATZERO)/*a=0*/printf("isnotaquadratic");else上一页下一页返回3.4分支结构程序设计{deita=b*b-4*a*c;/*计算deita*/if(fabs(deita)<=FLOATZERO)/*deiat=0*/printf(“hastwoequalroot:%f\n”,-b/(2*a));elseif(deita>FLOATZERO)/*deiat>0*/{x1=(-b+sqrt(deita))/(2*a);x2=(-b-sqrt(deita))/(2*a);printf("hasdistinctrealroots:%f,%f\n",x1,x2);}上一页下一页返回3.4分支结构程序设计else/*deita<0*/{realpart=-b/(2*a);imagpart=sqrt(-deita)/(2*a);printf("hascomplexroots:\n");printf("%f+%fi\n",realpart,imagpart);printf("%f-%fi\n",realpart,imagpart);}}}上一页下一页返回3.4分支结构程序设计运行结果如下:pleaseinputa,b,c:1,2,1↙Theequationhastwoequalroot:-1.000000说明:(1)由于程序中使用了数学函数fabs(求绝对值)和sqrt(求平方根),所以在程序中要包含#include<math.h>命令。(2)程序中用deita变量存放b2-4ac的值,先计算deita的值,可以避免以后的重复计算。上一页下一页返回3.4分支结构程序设计(3)判断系数a及deita是否为0,不能直接用a==0来判断。因为a是实数,实数在计算机中的存储和计算有微小的误差。“==”(等于比较运算符)是精确按位比较。如果使用a==0进行比较,可能会使本身为0的量由于误差而被判别为不等于0,从而导致程序错误。可以通过判断a的绝对值是否小于一个很小的实数来判断,小于此数则可以认为等于0。同理,如果需要判断两个浮点数是否相等也不能使用“==”运算符,而应该判断这两个数之差的绝对值是否小于一个很小的数。上一页下一页返回3.4分支结构程序设计【例3-10】编写一个简单计算器程序,输入格式为:data1opdata2。其中data1和data2是参加运算的两个数,op为运算符,它的取值只能是+、-、*、/。程序代码如下。#include<stdio.h>main(){floatdata1,data2;/*定义两个操作数变量*/charop;/*操作符*/printf("Enteryourexpression:\n");scanf("%f%c%f",&data1,&op,&data2);/*输入表达式*/上一页下一页返回3.4分支结构程序设计switch(op)/*根据操作符分别进行处理*/{case'+':/*处理加法*/printf("%.2f+%.2f=%.2f\n",data1,data2,data1+data2);break;case'-':/*处理减法*/printf("%.2f-%.2f=%.2f\n",data1,data2,data1-data2);break;case'*':/*处理乘法*/printf("%.2f*%.2f=%.2f\n",data1,data2,data1*data2);break;case'/':/*处理除法*/上一页下一页返回3.4分支结构程序设计if(data2==0)/*若除数为0*/printf("Divisionbyzero.\n");elseprintf("%.2f/%.2f=%.2f\n",data1,data2,data1/data2);break;default:printf("Unknownoperater.\n");}}上一页下一页返回3.4分支结构程序设计运行结果如下:Enteryourexpression:3+8↙3.00+8.00=11.00上一页返回3.5循环结构程序设计循环结构是程序中一种很重要的结构。其特点是:在给定条件成立时,反复执行某一程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。3.5.1用while语句设计循环结构程序while语句的一般格式为:while(表达式)语句;下一页返回3.5循环结构程序设计功能:首先计算表达式的值,若为“真”,则执行循环体语句,执行完毕后,再计算表达式的值,若仍为“真”,则重复执行循环体语句。直到表达式的值为“假”时,结束while语句的执行,然后执行while语句后面的语句。while语句构成的循环属于“当型”循环。如图3-9所示。说明:(1)表达式是控制循环继续执行与否的条件,通常是关系表达式或逻辑表达式,但它可以是任何类型的表达式,只要表达式的值为真(非0)即可继续循环。(2)语句为循环体,语法上为一条语句,若循环体含有多条语句,则必须用大括号把它们括起来,成为复合语句。(3)while语句的特点是:先判断,后执行。若表达式一开始就为“假”,则循环体一次也不执行。下一页返回上一页3.5循环结构程序设计【例3-11】用while语句计算1+2+3+…+99+100。#include<stdio.h>main(){ints,i;s=0;i=1;while(i<=100){s+=i;i++;}printf("1+2+3+…+100=%d\n",s);}下一页返回上一页3.5循环结构程序设计运行结果如下:1+2+3+…+100=5050注意:(1)while语句的循环体中必须出现使循环趋于结束的语句,否则,会出现“死循环”的现象(即循环永远不会结束)。例如,将本例中的“i++”;语句删除,则i的值永远为1。或将“i++”;语句改为“i--”;,则i的值越来越小,即循环控制条件i<=100永远满足,循环将永远不会结束。由于i的值实际上决定了循环是否继续进行,所以把这类变量称为“循环控制变量”或“循环变量”。下一页返回上一页3.5循环结构程序设计(2)若循环体含有多条语句,则必须用大括号把它们括起来,成为复合语句,否则,将只把其中第一条语句当做循环体语句执行。例如,将本例中的{s+=i;i++;}大括号去掉,则执行的循环体语句只有s+=i;于是,i的值保持不变,导致“死循环”。(3)循环体中语句顺序也很重要。例如,本例中若把循环体中的两条语句的位置颠倒:i++;s+=i;则最后输出:1+2+3+…+100=5150,显然是错误的结果。下一页返回上一页3.5循环结构程序设计这是因为i的初值为1,循环体中先执行i++;,后执行s+=i;,所以第一次累加的是2,而不是1。执行最后一次循环(i=100)时,先执行i++;,则i=101,再执行s+=i;,所以最后一次累加的是101。即实际计算的是:2+3+…+100+101=5150。下一页返回上一页3.5循环结构程序设计3.5.2用do…while语句设计循环结构程序do…while语句的一般形式为:do语句;while(表达式);功能:首先执行循环体语句,然后检测表达式的值,若为“真”,则重复执行循环体语句,否则退出循环。如图3-10所示。下一页返回上一页3.5循环结构程序设计说明:(1)do…while语句的表达式通常是关系表达式或逻辑表达式,但也可以是任意表达式,表示控制循环的条件。(2)do…while语句的特点:先执行后判断。因此,循环体至少执行一次。(3)do…while语句重复执行循环体,直到表达式为“假”才退出循环。(4)do…while语句和while语句的区别在于do…while是先执行后判断,因此do…while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,循环体语句一次也不执行。while语句和do…while语句一般都可以相互改写。下一页返回上一页3.5循环结构程序设计【例3-12】用while语句计算1+2+3+…+99+100。#include<stdio.h>main(){intsum,i;sum=0;i=1;do{sum+=i;i++;}while(i<=100);printf("1+2+3+…+100=%d\n",sum);}下一页返回上一页3.5循环结构程序设计运行结果如下:1+2+3+…+100=5050注意:(1)在if语句、while语句中,条件表达式后面都不能加分号,而在do…while语句的条件表达式后面则必须加分号。(2)在do和while之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。下一页返回上一页3.5循环结构程序设计3.5.3用for语句设计循环结构程序for语句是C语言所提供的使用最灵活、功能最强的循环语句。for语句的一般格式为:for(表达式1;表达式2;表达3)语句;下一页返回上一页3.5循环结构程序设计其功能如下。(1)首先计算表达式1的值。(2)再计算表达式2的值,若表达式2的值为“真”(非0)则执行循环体语句一次,若为“假”(0),则终止循环。(3)执行完循环体语句后再计算表达式3的值,然后转回第2步重复执行。在整个for循环过程中,表达式1只计算一次;表达式2和表达式3则可能计算多次;循环体语句可能多次执行,也可能一次都不执行。for语句的执行过程如图3-11所示。下一页返回上一页3.5循环结构程序设计说明:(1)表达式1通常用来给循环控制变量赋初值,一般是赋值表达式。也允许在for语句外给循环控制变量赋初值,此时可以省略表达式1。(2)表达式2通常是循环条件,是控制循环是否进行下去的表达式,一般为关系表达式或逻辑表达式。(3)表达式3通常可以用来修改循环控制变量的值,一般是赋值语句(4)这3个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。下一页返回上一页3.5循环结构程序设计【例3-13】用for语句计算s=1+2+3+…+99+100。#include<stdio.h>main(){intn,s=0;for(n=1;n<=100;n++)s=s+n;printf("1+2+3+…+100=%d\n",s);}运行结果如下:1+2+3+…+100=5050下一页返回上一页3.5循环结构程序设计注意:for语句中三个表达式可以是任意合法的C表达式,而且可以部分省略或全部省略,但其中的两个分号不能省略。例如:for(;表达式;表达式)省去了表达式1,for(表达式;;表达式)省去了表达式2,for(表达式;表达式;)省去了表达式3,for(;;)省去了全部表达式。下一页返回上一页3.5循环结构程序设计例如,对下列程序段进行分析。for(n=1;n<=100;n++)s=s+n;(1)省略表达式1(n=1)可写成如下形式。n=1;/*循环变量赋初值*/for(;n<=100;n++)s=s+n;省略n=1后,n的初值放在循环前确定。下一页返回上一页3.5循环结构程序设计(2)省略表达式2(n<=100)可写成如下形式。for(n=1;;n++){if(n>100)break;/*循环出口*/s=s+n;}省略n<=100后,循环无法终止,因此在循环体的第一条语句处安排一条循环出口语句(if(n>100)break;),以便适时退出循环。下一页返回上一页3.5循环结构程序设计(3)省略表达式3(n++)可写成如下形式。for(n=1;n<=100;){s=s+n;n++;/*修改循环变量的值*/}省略n++后,n变量的值保持不变,循环无法终止。因为表达式3是在循环体之后被执行的,因此在循环体最后增加n++;。下一页返回上一页3.5循环结构程序设计(4)3个表达式全部省略可写成如下形式。n=1;/*循环变量赋初值*/for(;;){if(n>100)break;/*循环出口*/s=s+n;;n++;/*修改循环变量的值*/}(5)循环体放入表达式3可写成如下形式。for(n=1;n<=100;s=s+n,n++);下一页返回上一页3.5循环结构程序设计由于循环体在表达式2之后、表达式3之前执行,所以把循环体语句放在表达式3的开头,循环体语句与原来的n++构成逗号表达式,作为循环语句的新的表达式3,此时循环体语句可以省略。但从语法上讲,循环结构必须有循环体语句,否则出现语法错误。因此,用空语句作为循环体语句,既满足了语法要求,又符合了实际上不再做任何操作的需要。下一页返回上一页3.5循环结构程序设计注意:用空语句作为循环体语句时,空语句后的分号不可少,如缺少此分号,则把后面的语句当成循环体来执行。反过来说,如循环体不为空语句时,决不能在表达式的括号后加分号,这样又会认为循环体是空语句而不能反复执行真正的循环体。这些都是编程中常见的错误,要十分注意。从以上讨论可知,for语句的书写形式十分灵活,在for的一对括号中,允许出现各种表达式,有的甚至与循环控制毫无关系,这在语法上是合法的。但初学者一般不要这样做,因为它容易使程序杂乱无章,降低可读性。下一页返回上一页3.5循环结构程序设计3.5.4break语句与continue语句循环体中常使用break语句或continue语句来改变循环的执行流程。1.break语句break语句可以用在switch语句或循环语句中,其作用是跳出它所在的switch语句或跳出本层循环,转去执行后面的程序。break语句的一般形式为:break;下一页返回上一页3.5循环结构程序设计上面例题中分别在switch语句和for语句中使用了break语句作为跳转。在循环语句中,break常常和if语句一起使用,表示当条件满足时,立即终止循环。说明:break不是跳出if语句,而是跳出循环结构。当有循环嵌套时,break语句只能跳出本层循环,并不能使多重循环全部结束。使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。下一页返回上一页3.5循环结构程序设计2.continue语句continue语句只能用在循环语句的循环体中。continue语句的一般形式为:continue;功能:结束本次循环(不是结束整个循环),即跳过循环体中continue语句后面的语句,开始下一次循环。下一页返回上一页3.5循环结构程序设计说明:若continue语句出现在while或do…while语句中,则执行continue语句就是跳过循环体中continue语句后面的语句,直接转去判断下次循环控制条件是否满足;若continue语句出现在for语句中,则执行continue语句就是跳过循环体中continue语句后面的语句,转去执行for语句的表达式3。下一页返回上一页3.5循环结构程序设计3.continue语句和break语句的区别(1)continue语句只能出现在循环语句的循环体中;而break语句既可以出现在循环语句中,也可以出现在switch语句中。(2)continue语句只是结束本次循环,并开始下一次循环,而不是终止它所在的整个循环语句的执行;break语句则是终止它所在的整个循环语句的执行,转到循环语句后下一条语句去执行。例如,以下两个循环结构:下一页返回上一页3.5循环结构程序设计下一页返回上一页while(表达式1){
if(表达式2)break;
}while(表达式1){
if(表达式2)continue;
}它们的执行过程如图3-12和图3-13所示。3.5循环结构程序设计【例3-14】输出2位数中所有能同时被3和5整除的数。分析:2位数的范围是[10,99],能同时被3和5整除的数n应满足条件:n%3==0&&n%5==0;不能同时被3和5整除的数n应满足条件:n%3!=0||n%5!=0。#include<stdio.h>main(){intn;for(n=10;n<100;n++){if(n%3!=0||n%5!=0)continue;/*不能同时被3和5整除,结束本次循环*/下一页返回上一页3.5循环结构程序设计printf("%5d",n);}}运行结果如下:153045607590对2位数循环,即n=10,11,…,99。若n不能同时被3和5整除,应跳过输出语句转而考察下一个n。所以用continue语句结束本次循环。若n能同时被3和5整除,则输出n。若把程序中continue语句换成break语句,则执行程序将无任何输出。因为n=10时,即满足条件n%3!=0||n%5!=0,所以执行break语句,终止循环。下一页返回上一页3.5循环结构程序设计3.5.5无条件转向语句C语言中的goto语句可以转向同一函数内任意指定的位置执行,称为无条件转向语句。goto语句一般格式为:goto语句标号;
语句标号:语句功能:改变程序执行的方向,使程序流程无条件地转去执行语句标号所标识的语句。下一页返回上一页3.5循环结构程序设计说明:(1)语句标号用标识符后跟冒号表示,放在某一语句行的前面,语句标号起标识语句的作用,与goto语句配合使用。如loop:i++;(2)goto语句通常与条件语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能。下一页返回上一页3.5循环结构程序设计【例3-15】用goto语句计算s=1+2+3+…+99+100。#include<stdio.h>main(){intn,s=0;n=1;loop:s=s+n;n++;if(n<=100)gotoloop;printf("1+2+3+…+100=%d\n",s);}下一页返回上一页3.5循环结构程序设计运行结果如下:1+2+3+…+100=5050注意:(1)goto语句与相应的语句标号必须处在同一个函数中,不允许跨两个函数。(2)由于goto语句转移的任意性,使得程序流程毫无规律,可读性较差,不符合结构化程序设计的操作完整性要求。在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。但在某种场合下,使用goto语句可以提高效率。例如,在嵌套switch语句的内层switch语句中,利用break语句只能一层一层地退出,若采用goto语句,可以一次退出多层switch语句。下一页返回上一页3.5循环结构程序设计3.5.6几种循环语句的比较分析1.循环结构的基本组成由前面介绍的循环结构的格式和例子,我们可以看出几种循环结构均由以下4部分组成。(1)循环变量、循环条件的初始化。(2)循环变量、循环条件的检查,以确认是否进行循环。(3)循环体的执行。(4)循环变量、循环条件的修改,以使循环趋于结束。编写具有循环结构的程序时,要从以上4个角度全面考虑。下一页返回上一页3.5循环结构程序设计2.几种循环的比较C语言中可构成循环结构的有while语句、do…while语句和for语句,也可以通过if语句和goto语句的结合构造循环结构。从结构化程序设计的角度考虑,不提倡使用if和goto语句构造循环。下面对它们进行比较。(1)3种循环结构都可以用来处理同一个问题,但在具体使用时存在一些细微的差别。如果不考虑可读性,一般情况下它们可以相互替代下一页返回上一页3.5循环结构程序设计【例3-16】编写程序求10个数中的最大值。分析:从键盘上输入第一个数,并假定它是最大值存放在变量max中,以后每输入一个数便与max进行比较,若输入的数较大,则最大值是新输入的数,把它存放到max。当全部10个数输入完毕,最大值也确定了,即max中的值。下一页返回上一页3.5循环结构程序设计/*用while语句实现*/#include"stdio.h"main(){inti,k,max;scanf("%d",&max);i=2;while(i<11){scanf("%d",&k);if(max<k)max=k;i++;}printf("max=%d\n",max);}下一页返回上一页/*用do…while语句实现*/#include"stdio.h"main(){inti,k,max;scanf("%d",&max);i=2;do{scanf("%d",&k);if(max<k)max=k;i++;}while(i<11);printf("max=%d\n",max);}3.5循环结构程序设计/*用for语句实现*/#include"stdio.h"main(){inti,k,max;scanf("%d",&max);for(i=2;i<11;i++){scanf("%d",&k);if(max<k)max=k;}printf("max=%d\n",max);}
下一页返回上一页3.5循环结构程序设计从循环控制变量初始化的角度看:对于while和do…while循环,循环变量的初始化应该在while和do…while语句之前完成;而对于for循环,循环变量的初始化可以在表达式1中完成。从循环条件角度看:while和do…while循环只在while后面指定循环条件;而for循环可以在表达式2中指定。从修改循环控制变量使循环趋向结束的角度看:while和do…while循环要在循环体内包含使循环趋于结束的操作;for循环可以在表达式3中完成。下一页返回上一页3.5循环结构程序设计(2)for语句和while语句先判断循环控制条件,后执行循环体;而do…while语句是先执行循环体,后进行循环控制条件的判断。for语句和while语句可能一次也不执行循环体;而do…while语句至少执行一次循环体。do…while语句更适合于第一次循环肯定执行的场合。for和while循环属于“当型”循环;而do…while循环属于“直到型”循环。(3)do…while语句和while语句多用于循环次数不定的情况,对于循环次数确定的情况,使用for语句更方便。下一页返回上一页3.5循环结构程序设计4)do…while语句和while语句只有一个表达式,用于控制循环是否进行。for语句有3个表达式,不仅可以控制循环是否进行,而且能为循环变量赋初值及不断修改循环变量的值。for循环可以省略循环体,将部分操作放到表达式2、表达式3中,for语句比while和do…while语句功能更强,更灵活。总之,3种基本循环结构一般可以相互替代,很难说哪种更加优越。具体使用哪一种结构依赖于程序的可读性和程序设计者个人的程序设计风格。下一页返回上一页3.5循环结构程序设计3.5.7循环的嵌套循环结构的循环体语句可以是任意合法的C语句。若一个循环结构的循环体中包含了另一个完整的循环结构,则构成了循环的嵌套。前面介绍的3种类型的循环都可以相互嵌套。循环的嵌套可以为多层,但要保证每一层循环在逻辑上都是完整的。【例3-17】输出如下九九乘法表。1*1=11*2=22*2=41*3=32*3=63*3=9
1*9=92*9=183*9=27…9*9=81下一页返回上一页3.5循环结构程序设计分析:分行与列考虑,共9行9列,应使用双重循环。变量i控制行,为外循环控制变量;变量j控制列,为内循环控制变量。程序代码如下。#include"stdio.h"main(){inti,j;for(i=1;i<10;i++){for(j=1;j<=i;j++)printf("%d*%d=%-3d",j,i,i*j);/*-3d表示左对齐,占3位域宽*/printf("\n");/*每输出一行后换行*/}}返回上一页3.6综合应用程序举例【例3-18】输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。分析:可以利用while语句逐个输入字符,循环结束条件为输入的字符为'\n'(一个输入行的结束)。在循环体内可以利用if结构逐个判断输入的字符属于哪种字符。#include"stdio.h"main(){char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医学心理学与临床人文融合模式优化
- 企业名称转让协议书
- 拆迁房面积转让合同协议书
- 毕业季职业规划指南
- 护理专硕职业发展路径
- 八大主题教育体系-1
- 医学影像云与家庭医生服务结合
- 定义、命题、定理课件 2025-2026学年人教版七年级数学下册
- 实际问题与一次函数第1课时课件 -2025-2026学年人教版数学八年级下册
- (19篇)春节活动应急预案范文
- 自然资源行政执法考试题库及完整答案
- 2026年七年级道德与法治下册全册教案设计(含单元复习课教案)
- 非静脉曲张上消化道出血患者行内镜下急诊止血治疗的护理配合
- 北师大介绍课件
- 规范手卫生培训课件
- QC成果-提高组合幕墙铝单板安装一次施工合格率(诏安县总医院扩建项目QC小组)
- 粉笔线上协议班 合同
- 警用盾牌使用方法
- 全电厨房安全培训内容课件
- 进行性肌营养不良症护理
- 循证医学与患者主观体验的权重分配机制探索
评论
0/150
提交评论