nullnull本章导读
本章从实例分析着手,使读者了解并掌握C语言三种基本流程控制结构:顺序、选择、循环结构 ,加深对C语言程序开发设计过程的感性认识,强化培养编程思路,为进一步进行C语言程序设计打下基础。 返回本书目录第3章 结构化程序设计本章主要知识点
(1) 顺序结构及程序设计。
(2)选择结构及程序设计。
(3)循环结构及程序设计。
(4)结构化程序设计方法、编程思路与综合实训null第3章 结构化程序设计返回本章导读3.2 选择结构程序设计3.3 循环结构程序设计3.4 结构化程序设计方法与综合实训3.1 顺序结构程序设计《 C语言程序设计》 商洛学院计算机科学系null3.1 顺序结构程序设计返回本章目录3.1.2 顺序结构语句3.1.3 程序实训3.1.1 顺序结构的C程序实例《 C语言程序设计》 商洛学院计算机科学系null3.1.1 C程序实例返回本节目录C程序实例
【例3.1】编程实现:输入一个长方形的二边长,求长方形的面积并输出。
/*程序名为l3_1.cpp。*/
#include "stdio.h"
main()
{ float a,b,s;
scanf("%f%f",&a,&b);
s=a*b;
printf("The area of rectangle is %5.2f .\n",s);
}《 C语言程序设计》 商洛学院计算机科学系 【例3.1】编程返回本节目录程序运行情况如下:
输入:
3.0 4.0 < CR >
输出:
The area of rectangle is 12.00 .
这个程序属于顺序结构,程序是按照书写的顺序自上而下一步步执行,程序中的每一条语句都被执行一次,且仅能被执行一次。《 C语言程序设计》 商洛学院计算机科学系null3.1.2 顺序结构语句1
C语言的顺序结构语句可以分为四大类:
1.
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式语句
表达式的后面加一个分号就构成了一个语句,例如:sum=a+b; 。事实上,C语言中有使用价值的表达式语句主要有3种:
(1)赋值语句。 例如: sum=a+b;
(2)自动增1、减1运算符构成的表达式语句。例如: i++;
(3)逗号表达式语句。例: x=1,y=2;
2.空语句
语句仅有一个分号“;”,它表示什么也不做。一般和后面章节所讲循环语句结合使用起到延时作用。
3. 复合语句
由"{"和"}"把一些变量定义和执行语句组合在一起,称之为复合语句,又称语句块。复合语句的语句形式如下:
{语句1;语句2;…;语句n;}返回本节目录《 C语言程序设计》 商洛学院计算机科学系null3.1.2 顺序结构语句2返回本节目录例如:{int a=0,b=1,sum;
sum=a+b;
printf("%d",sum);
}
【注意】与C语言中的其他语句不同,复合语句不以分号作为结束符,若复合语句的"}"后面出现分号,那不是该复合语句的组成成分,而是单独的一个空语句。在复合语句起始部分可以有变量定义,如:"int a=0,b=1,sum;",也可以没有。复合语句的"{}"内可能会有多个语句,但在语法上把它整体上视为一条语句看待。
4.函数调用语句
由一个函数调用加上一个分号组成一个语句,如:
scanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);《 C语言程序设计》 商洛学院计算机科学系null3.1.3 程序实训【例3.2】C程序实例
【例3.2】由键盘输入两个整数给变量a和b,然后输出a和b,在交换a和b中的值后,再输出a和b,验证两个变量中的数值是否正确地进行了交换。
/*程序名为l3_2.cpp。*/
#include "stdio.h"
main()
{ int a,b,t;
printf("Enter a and b:\n");
scanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
t=a;a=b;b=t;
printf("a=%d,b=%d\n",a,b);
}
程序运行情况如下:
Enter a and b:
123 456 < CR >
a=123,b=456
a=456,b=123 返回本节目录《 C语言程序设计》 商洛学院计算机科学系null3.1.3 程序实训【例3.3】返回本节目录注意:在程序中交换两个变量a 和b的值,不可以简单地用: a=b;b=a;两条语句来实现。假设a 和b的值分别为23和78,赋值语句a=b;将使a的值变为78,接下来的b=a;使b的值变为78,这样,a和b的值最终都变为78。所以在本例中引入了中间变量t,用来临时存放a的值,这样才能完成变量a和b的正确交换。【例3. 3】输入一个double类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入处理,然后输出此数,以便验证处理是否正确。
/*程序名为l3_3.cpp。*/
#include "stdio.h"
main()
{ double x;
printf("Input x:\n");
scanf("%lf",&x); 《 C语言程序设计》 商洛学院计算机科学系null3.1.3 程序实训【例3. 3】返回本节目录
printf("(1) x=%f\n",x); /*将x输出*/
x=x*100;
x=x+0.5;
x=(int)x;
x=x/100; /*将x扩大100倍,加上0.5之后取整,再缩小100倍*/
printf("(2) x=%f\n",x); /*将四舍五入后的x输出*/
}
程序运行情况如下:
Input x:3.14159< CR >
则输出的结果为:
(1) x=3.141590
(2) x=3.140000《 C语言程序设计》 商洛学院计算机科学系null3.1.3 程序实训【例3.4】返回本节目录【例3.4】从键盘上输入一大写英文字母,要求改用相应的小写字母输出。
/*程序名为l3_4.cpp。*/
#include "stdio.h"
main()
{ char c1,c2;
scanf("%c",&c1);
printf("The upper case is %c .\n",c1);
c2=c1+'a'-'A';
printf("The lower case is %c .\n",c2);
}程序运行时:
输入:B
输出:
The upper case is B .
The lower case is b .《 C语言程序设计》 商洛学院计算机科学系null3.2 选择结构程序设计3.2.1 选择结构的C程序实例3.2.2 if 语句3.2.3 switch 语句3.2.4 程序实训 返回本章目录《 C语言程序设计》 商洛学院计算机科学系null3.2.1 选择结构的 C程序实例 返回本节目录 【例3.5】请输入两个整数a,b,比较a+b和a×b哪个大,输出判断结果。
/*程序名为l3_5.cpp。*/
#include "stdio.h"
main()
{ int a,b,s1,s2;
printf("请输入两个整数a,b:");
scanf("%d,%d",&a,&b);
s1=a+b; s2=a*b; /*求两个数的和、积*/
if(s1>s2)
printf("(a+b)>(a*b) /n"); /*语句A*/
else
printf(" (a+b)<=(a*b)\n"); /*语句B*/
}《 C语言程序设计》 商洛学院计算机科学系null3.2.1 选择结构的 C程序实例结果 运行结果为:
请输入两个整数a,b:2,3
(a+b)<=(a*b)
在这个程序中使用了if分支语句,它不像前面的程序那样,按照语句的书写顺序一步步执行下去,而是根据所给条件的真假,选择两者其中之一执行。该程序执行的过程是:比较两数的和与积,如果s1>s2,则执行语句A(跳过语句B不执行),否则,就跳过语句A执行语句B。可见if语句在程序中起到了改变语句执行顺序的作用。if语句就是我们在下一节中要介绍的条件分支语句。返回本节目录《 C语言程序设计》 商洛学院计算机科学系null3.2.2 if 语句1. if语句的一般形式返回本节目录2. if-else中的复合语句3. 非关系、非逻辑表达式构成的条件表达式4. if语句的嵌套《 C语言程序设计》 商洛学院计算机科学系null1. if语句的一般形式1 1.if语句的一般形式:
if语句有两种形式:
(1)不含else子句的if语句
语句形式如下:
if(<表达式>) <语句1>
例如if(a)
<语句体1>
[else
<语句体2>]
执行过程:首先计算<表达式>的值,如果该表达式的值为非零("真"),则执行<语句体1>,如果该表达式的值为零("假"),则跳过<语句体1>,直接执行<语句体2>,两者执行其一后再去执行if语句后的下一个语句。返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null1. if语句的一般形式实例【例3.6】求分段函数的值,如果x≥0, y=2x+1,否则, y=0 。
#include "stdio.h"
main() /*程序名为l3_6.cpp。*/
{ int x,y; /*变量y存放f(x)的值*/
printf("请输入x的值:");
scanf("%d",&x);
if(x>=0)
y=2*x+1;
else
y=0;
printf("当x=%d时,f(x)=%d",x,y);
}返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null1. if语句的一般形式实例运行结果:
请输入x的值:3
当x=3时,f(x)=7
因为输入x=3,那么x>=0为真,所以输出2*3+1=7。
C语言中有一种特有的条件运算符“?:”,我们在前面章节已作介绍,它在某种程序上可以起到逻辑判断的作用。本例中的if语句也可用条件运算符表达式实现如下:
y=x>=0?2*x+1:0;
但有些判断不能用条件表达式完成,或者很繁琐、表达不清晰。返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null2. if-else中的复合语句2. if-else中的复合语句 如果两个分支中需要执行的语句不止一条,必须用“{}”括起来,作为一个复合语句使用。若只是一条语句,“{}”可以省略。
【注意】
(1)if后面的<表达式>一定要有括号;
(2)if和else同属于一个if语句,else不能作为语句单独使用,它只是if语句的一部分,与if配对使用,因此程序中不可以没有if而只有else;
(3)只能执行与if有关的语句或者执行与else有关的语句,而不可能同时执行两者;
(4)如果<语句1>和<语句2>是非复合语句,那么该语句一定要以分号结束,
(5)if语句的表达式可以是任意类型的C语言的合法的表达式,但计算结果必须为整型、字符型或浮点型之一。返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null3.非关系、非逻辑表达式构成的条件表达式13.非关系、非逻辑表达式构成的条件表达式 【例3.10】以"赋值表达式"为分支条件的实例。
/*程序名为l3_10.cpp。*/
#include"stdio.h"
main()
{ int s;
if(s=2)
printf("hello");
else
printf("error");
}if后面圆括号中的<表达式>表示分支条件<表达式>的类型不限于逻辑/关系表达式,可以是任意的C语言有效表达式(如赋值表达式,算术表达式等等),因此也可以是作为表达式特例的常量或变量。返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null3.非关系、非逻辑表达式构成的条件表达式2【例3.10】中的条件表达式是一个赋值表达式,并不是判断s是否等于2。相当于if(2)printf("hello");,这是合法的。由于该条件表达式的值是非零值,恒为真,故本程序的printf("error");无论如何都不会被执行。if语句最终执行哪一个分支,取决于条件表达式的计算结果。同一个条件的也可以用多种表达方式。
【例3.11】以"变量"为分支条件的实例。
/*程序名为l3_11.cpp。*/
#include "stdio.h"
main()
{ int x,y; scanf("%d",&x);
if(x)
y=1;
else
y=-1; 返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null3.非关系、非逻辑表达式构成的条件表达式3printf("y=%d\n",y);
}
现把程序中if(x)改成if(x!=0),此时虽然条件表达式写法不同,但是完成的功能是相同的。
下面两种表示方法经常使用:
if(x)等价于if(x!=0)
if(!x)等价于if(x==0)返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null4. if语句的嵌套1 在一个if语句中又包含另一个if语句,从而构成了if语句的嵌套使用。内嵌的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。例如: 【例3.12】输入a,b两个整数的值,比较大小并输出结果。
#include "stdio.h“ /*程序名为l3_12.cpp。*/
main()
{ int a,b; printf("请输入a,b:") ; scanf("%d%d",&a,&b);
if(a>b)
printf("a>b\n");
else
if(ay)
if(z>x)
max=z;
else
if(y>x)
max=y;
printf(" max=%d",max);
}
运行结果:
max=4返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null4. if语句的嵌套实例2 【例3.14】编写程序,根据输入的学生成绩,给出相应的等级。90分以上的等级为A,60分以下的等级为E,其余每10分一个等级。程序如下:
#include"stdio.h"
main() /*程序名为l3_14.cpp。*/
{ int g; printf("input g:");
scanf("%d",&g); printf("g=%d: ",g);
if(g>=90)
printf("A\n");
else if(g>=80)
printf("B\n");
else if(g>=70)
printf("C\n");
else if(g>=60)
printf("D\n");
else
printf("E\n");
}返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null4. if语句的嵌套实例3当执行以上程序时,首先输入、输出学生的成绩,然后进入if语句; if语句中的表达式将依次对学生成绩进行判断,若能使某 if 后的表达式值为1,则执行与其相应的子句,之后便退出整个if结构。
例如,若输入的成绩为78分,首先输出: g=78 : ,当从上至下逐一检测时,使g>=70这一表达式的值为1,因此在输出"g=78 :"之后再输出C,便退出整个if结构。
若输入的成绩为30分,首先输出相应成绩"g=30:",其次进入相应判断,最后再输出相应等级"E",便退出整个if结构。返回3.2.2目录《 C语言程序设计》 商洛学院计算机科学系null3.2.3 switch 语句1. switch语句的一般形式返回本节目录2. switch语句的执行过程3. switch语句的实例《 C语言程序设计》 商洛学院计算机科学系null1 . switch语句的一般形式1. switch语句的一般形式switch语句的一般形式是:
switch(<表达式>)
{case <常量表达式1>:<语句序列1>
case <常量表达式2>:<语句序列2>
……
case <常量表达式n>:<语句序列n>
[default:<语句序列n+1>]
}
【说明】:
①switch语句是关键字,其后面大括号里括起来的部分称为 switch语句体。要特别注意必须写这一对大括号。
②switch后<表达式>的运算结果可以是整型、字符型或枚举型表达式等,<表达式>两边的括号不能省略。返回3.2.3目录《 C语言程序设计》 商洛学院计算机科学系null1 . switch语句的一般形式③case也是关键字,与其后面<常量表达式>合称为case语句标号。<常量表达式>的值在运行前必须是确定的,不能改变,因此不能是包含变量的表达式,而且数据类型必须与<表达式>一致。如:
int x=3,y=7, z;
switch(z)
{ case 1+2: /*是正确的*/
case x+y: /*是错误的*/
}
④case和常量之间要有空格,case后面的常量之后有":"。
⑤default也是关键字,起标号的作用。代表所有case标号之外的那些标号。default可以出现在语句体中任何标号位置上。在switch语句体中也可以无default标号。
⑥<语句序列1>、<语句序列2>等,可以是一条语句,也可以是若干语句。
⑦必要时,case 语句标号后的语句可以不写。
返回3.2.3目录《 C语言程序设计》 商洛学院计算机科学系null2 . switch语句的执行过程2. switch语句的执行过程首先计算<表达式>的值,然后在switch语句体内寻找与该吻合的case标号,如果有与该值相等的标号,则执行从该标号后开始的各语句,包括在其后的所有case和default语句,直到switch语句体结束。如果没有与该值相等的标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句体结束。如果没有与该值相等的标号,并且不存在default标号,则跳过switch语句体,什么也不执行。
在switch语句中使用break语句
break语句也称间断语句。可以在各个case之后的语句最后加上break语句,每当执行到break语句时,立即跳出switch语句体。switch语句通常总是和break语句联合使用,使得switch语句真正起到多个分支的作用。返回3.2.3目录《 C语言程序设计》 商洛学院计算机科学系null3 . switch语句的实例3. switch语句的实例【例3.17】模拟自动饮料机。按屏幕所示功能,输入所选择的合法数字,输出可获得的相应饮料名称。程序如下:
/*程序名为l3_17.cpp。*/
#include "stdio.h"
main()
{ int button;
printf("==========自动饮料机 ==========\n");
printf("1.可口可乐\n");
printf("2.雪碧\n");
printf("3.芬达\n");
printf("4.百事可乐\n");
printf("5.非常可乐\n");
printf("请按1--5键选择饮料:\n");
scanf("%d",&button);
返回3.2.3目录《 C语言程序设计》 商洛学院计算机科学系null3 . switch语句的实例switch(button)
{ case 1:printf("\n你获得一听可口可乐\n");break;
case 2:printf("\n你获得一听雪碧\n");break;
case 3:printf("\n你获得一听芬达\n");break;
case 4:printf("\n你获得一听百事可乐\n");break;
case 5:printf("\n你获得一听非常可乐\n");break;
default:printf("\n非法操作!\n");break;
}
}
运行结果:
=============自动饮料机==============
1.可口可乐
2.雪碧
3.芬达
4.百事可乐
5.非常可乐
请按1-5按钮选择饮料:3
你获得一听芬达返回3.2.3目录《 C语言程序设计》 商洛学院计算机科学系null3.3 循环结构程序设计返回本章目录3.3.2 while语句3.3.3 do-while语句3.3.1 循环结构的C程序实例3.3.4 for 语句3.3.5 循环的嵌套3.3.6 break语句和continue语句3.3.7 程序实训《 C语言程序设计》 商洛学院计算机科学系null3.3.1 循环结构的C程序实例【例3.19】有一张厚度为0.1毫米的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可以抵达(再对折一次就超过)珠穆朗玛峰的高度?程序如下:
main() /*程序名为l3_14.cpp。*/
{ double h=0.1; int n=0; /* n用来累计对折次数*/
while(h<=8848180)
{ h=h*2; n=n+1;
}
printf("对折次数为:%d,此时厚度:%.2f\n",n-1,h/2);
}
重复对折一张纸,实质就是厚度乘以2,次数加1。用顺序结构编程为:
h=h*2; n=n+1;
……
这样的语句一直重复写到h满足题目要求为止。实际中这类问题,就可用循环结构编程实现。本例中,使用的是循环结构中的while语句。
C语言共有三种类型的循环语句,while、do-while和for语句。返回本节目录《 C语言程序设计》 商洛学院计算机科学系null3.3.2 while语句返回本节目录1.while语句的一般形式while(<表达式>)
<循环体语句>
说明:while语句是C的关键字,其后面的一对括号中的<表达式>,可以是C语言的任意合法表达式,由它来控制循环体语句是否执行,括号不能省略。<循环体语句>可以是一条语句,也可以是多条语句,一般来说循环体是一条语句时不用加"{}",如果是多条语句,就一定要加"{}" 构成复合语句。其中的语句可以是空语句、表达式语句或作为循环体一部分的复合语句,如果循环体是一个空语句,表示不执行任何操作(一般用于延时)。(1)计算while后一对括号中的<表达式>的值。当值为非零时,则执行步骤(2);当值为零时,则执行步骤(3)。
(2)执行<循环体语句>后,转去执行步骤(1)。
(3)退出while循环。2.while语句的执行过程《 C语言程序设计》 商洛学院计算机科学系nullwhile语句实例3.while语句实例 例3.21】用while循环语句实现从1加到100,并将结果打印出来。 /*程序名为l3_21.cpp。*/
#include "stdio.h"
main() / *若sum的值超过int型变量能表示的范围,则设置成长整型*/
{ int sum=0,i=1; while(i<=100)
{ sum+=i;
i++;}
printf("其和是 %d\n",sum);
/*若sum为长整型,则相应的输出也设置成长整型ld*/
} 运行结果:
其和是5050返回本节目录《 C语言程序设计》 商洛学院计算机科学系null3.3.3 do-while语句 do
<循环体语句>
while(<表达式>);
说明:do是C语言的关键字,必须和while联合使用。do-while循环由do开始,用while结束;注意,在while结束后必须有分号,它表示该语句的结束。其它同while循环语句。1.do-while语句的一般形式返回本节目录2.do-while语句的执行过程 (1)执行do后面的<循环体语句>。
(2)计算while后一对括号中的<表达式>的值。当值为非零时,转去执行步骤(1)。当值为零时,则执行步骤(3)。
(3)退出while循环。《 C语言程序设计》 商洛学院计算机科学系nulldo-while语句实例 运行结果:
其和是5050
在本例中,循环条件和循环体以及得到的结果都是和while循环一样的,只是用do-while语句来实现。3.do-while语句实例 【例3.23】用do-while语句实现求1+2+…+100的和。
#include "stdio.h" /*程序名为l3_23.cpp。*/
main()
{ int sum=0,i=1; / *若sum的值超过int型变量能表示的范围,则设置成长整型*/
do
{ sum+=i;
i++;} while(i<=100);
printf("其和是 %d\n",sum);
/*若sum为长整型,则相应的输出也设置成长整型ld*/
} 返回本节目录《 C语言程序设计》 商洛学院计算机科学系null3.3.4 for 语句for语句是C语言提供的一种在功能上比前面两种循环语句更强的一种循环语句。
for循环语句格式如下:
for(<表达式1>;<表达式2>;<表达式3>)
<循环体语句>
说明:for是C语言的关键字,三个表达式之间的必须用分号";"隔开。三个表达式可以是任意形式的C表达式,通常主要用于for循环的控制。一般<表达式1>用于计算循环变量初始值,<表达式2>为循环体是否执行的条件,<表达式3>为循环变量的调整。<循环体语句>的使用同while、do-while循环语句。for循环语句的格式还可以表示为:
for(<初始化表达式>;<条件表达式>;<修正表达式>)
<循环体语句>
在某种情况下,用for语句表示循环,显得紧凑而清晰。尤其是它能利用<表达式3>自动地使循环变量发生改变,不像while结构那样要在循环体中设置"修正操作"。实际上,for语句中的<表达式3>不仅限于修正循环变量,而且可以是任何操作。例如前面例题中介绍的求1到100的和,用for语句可以表示为:
for(sum=0,i=1;i<=n;sum+=i,i++);返回本节目录1.for语句的一般形式《 C语言程序设计》 商洛学院计算机科学系nullfor 语句的执行过程返回本节目录2.for语句的执行过程①首先计算<表达式1>。
②求<表达式2>的值;若其值为非零,则转去执行③;若<表达式2>的值为零,则转去执行⑤,结束for语句。
③执行一次for循环体。
④求解<表达式3>,转②执行。
⑤结束循环,执行循环之后的语句。3.for语句实例【例3.25】用for语句实现求1-100之和。
#include "stdio.h"
main() /*程序名为l3_25.cpp。
{ int sum=0,i=1;
/ *若sum的值超过int型变量能表示的范围,则设置为长整型*/《 C语言程序设计》 商洛学院计算机科学系nullfor 语句的实例返回本节目录for( ;i<=n;i++)
sum+=i;
printf("其和是 %d\n",sum);
/*若sum为长整型,则相应的输出也设置成长整型ld*/
}
运行结果:
其和是5050
for循环的执行过程:先执行表达式1,为空语句,然后判断"i<=n"是否成立,如果为真,执行循环体"sum+=i",转而执行"i++",再判断"i<=n",如此反复,直到"i<=n"为假为止。在这个例子中,i是循环控制变量,每次循环时,它的值都被改变且进行检验。《 C语言程序设计》 商洛学院计算机科学系nullfor 语句多样性返回本节目录for语句的多样性由于C语言中表达式的形式十分丰富,对for语句的三个控制表达式可以灵活运用,因此造成for语句形式多种多样。
(1)<表达式1>为空语句
如上例中求1-100的和。本来由<表达式1>完成的初始化可提到循环之外完成。
(2)<表达式1>和<表达式3>是逗号表达方式(3)用空循环来延长时间
常用空循环来产生延时,以达到某种特定要求。如:
for(t=0;t