第4章基本结构程序设计 1-P29_第1页
第4章基本结构程序设计 1-P29_第2页
第4章基本结构程序设计 1-P29_第3页
第4章基本结构程序设计 1-P29_第4页
第4章基本结构程序设计 1-P29_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章C语言的3种基本结构4.1C语句概述高级语言源程序的基本组成单位是语句。语句按功能可以分为两类:描述计算机要执行的操作运算(如赋值语句)控制上述操作运算的执行顺序(如选择语句)C语言的语句可以分为如下五类:(1)表达式语句:表达式后面加一个分号就构成了一个表达式语句。例如:

sum=a+b; /*赋值语句*/i++; /*自加运算表达式语句*/x=1,y=2;/*逗号表达式语句*/(2)函数调用语句:函数调用语句由一个函数加一个分号构成。例如:

printf(“ThisisaCstatement.”);(3)空语句:只有一个分号(;)的语句称为空语句。在程序中空语句经常被用作循环体,比如常见的用于延时的一种循环语句。

例如:for(i=0;i<=1000;i++);4.1C语句概述(4)复合语句:用花括号{}将多个语句组合在一起称为复合语句,又称为语句块(block)。例如:{intx,y;z=x+y;printf(“%d”,z);}(5)控制语句控制程序执行顺序,实现基本结构的语句,有下面九种:①if-else语句

(条件语句)②switch语句

(多分支选择语句)③for语句

(循环语句)④while语句

(循环语句)⑤do-while语句

(循环语句)⑥continue语句

(结束本次循环语句)⑦break语句

(终止执行循环语句或switch语句)⑧goto语句

(转向语句)⑨return语句

(函数返回值语句)4.2顺序结构程序设计C语言是结构化程序设计语言,结构化程序设计的结构主要有:顺序结构、选择结构和循环结构三种。

1.顺序结构顺序结构是最基本、最简单的程序结构,它由若干语句块从上到下依次排列次序顺序执行。顺序结构如图所示,先执行A块,再执行B块,两者是从上到下的顺序执行关系。

AB程序中的语句,按照它们出现的先后顺序逐条执行,这样的程序结构就是顺序结构。顺序结构是程序设计的最基本结构。#include<stdio.h>intmain(void){printf("1*\n");printf("2**\n");printf("3***\n");printf("4****\n");printf("5*****\n");printf("6******\n");return0;}语句从“printf("1*\n");”开始依次按照顺序执行,并最终输出所要求的图形格式。1*2**3***4****5*****6******4.3选择结构设计if语句(三种基本形式)1.if语句(1)if(表达式)语句;

(复合语句)例:

if(x>y)printf(“%d”,x);构成方式、执行方式、例子、注意事项。表达式语句真(非0)假(0)例:输入两个整数,并以由小到大的顺序输出。

#include<stdio.h>

intmain(void)

{

inta,b,t;

scanf(″%d,%d″,&a,&b);

if(a>b)

{

t=a;

a=b;

b=t;

}

printf(″%d,%d\n″,a,b);

return0;

}yna>bT=aA=bB=t4.3if语句(2)if(表达式)语句1else语句2例:

if(x>y)printf(“%d”,x);elseprintf(“%d”,y);

条件

语句1

语句2YNP52-例4.3思考:仅用if语句实现:输入两个数,输出最大数例:求一个数的绝对值方法一:用if…else…语句实现#include<stdio.h>intmain(void){

doublex;printf(″PleaseEnterarealnumber:″);scanf(″%lf″,&x);if(x<0.0)x=-x;elsex=x;printf(“theabsolutevalueis%lf\n”,x);return0;}方法二:用if语句实现#include<stdio.h>intmain(void){

doublex;printf(″PleaseEnterarealnumber:″);scanf(″%lf″,&x);if(x<0.0)x=-x;printf(“theabsolutevalueis%lf\n”,x);return0;}这种结构称为不平衡if结构。它不如平衡的if结构容易理解和清晰4.3if语句(3)if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3

……elseif(表达式m)语句melse语句nelseif例子/*printoutthetypeofcharacter

*/#include<stdio.h>main(){charc;printf("Enteracharacter:");c=getchar();if(c<0x20)printf("Thecharacterisacontrolcharacter\n");elseif(c>='0'&&c<='9')printf("Thecharacterisadigit\n");elseif(c>='A'&&c<='Z')printf("Thecharacterisacapitalletter\n");elseif(c>='a'&&c<='z')printf("Thecharacterisalowerletter\n");elseprintf("Thecharacterisothercharacter\n");}运行:Enteracharacter:

Thecharacterisacontrolcharacter运行:Enteracharacter:8Thecharacterisadigit运行:Enteracharacter:DThecharacterisacapitalletter运行:Enteracharacter:hThecharacterisalowerletter运行:Enteracharacter:FThecharacterisacapitalletter\n3.If语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。形式:if()

if()语句1 else语句2else

if()语句3 else语句4内嵌if嵌套if语句匹配规则:else总是与它上面的、最近的、统一复合语句中的未配对的if语句配对。例:if()

if()语句1else if()语句2else语句3例:if() {if()语句1}else if()语句2else语句3当if和else数目不同时,可以加花括号来确定配对关系。if语句的嵌套例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:加{}

例子:

-1(x<0)例5.3有一个函数y=0(x=0),编一程序,输入一个x值,输出y值。1(x>0)算法逻辑:算法逻辑:

输入x输入x

若x<0,则y=-1若x<0,则y=-1

若x=0,则y=0否则: 若x>0,则y=1若x=0,则y=0

输出y若x>0,则y=1

输出y

#include<stdio.h>voidmain(){intx,y;scanf(“%d”,&x);{

程序段}printf(“x=%d,y=%d\n”,x,y);}例:三数中取大数/*三数取大*/floatmax3(floatx,floaty,floatz){floatmax=x;if(z>y)if(z>x)max=z;elseif(y>x)max=y;return(max);}当x,y,z分别为(2,3,1)和(1,3,2)时,结果是?通过这个例子可以看到:(1)不平衡的if…else结构会增加阅读和理解程序的困难。(2)正确的缩进格式(即锯齿形书写格式)可以帮助人们理解程序,但错误的缩进格式反而会使人迷惑。(3)不要太相信自己的判断,要严格按语法关系检查程序。在不易弄清的地方可以加花括号来保证自己构思的逻辑关系的正确性。如上述程序可以改写为:求三个数中的最大数的正确解法floatmax3(floatx,floaty,floatz){

floatmax=x;if(z>y){

if(z>x)max=z;

else{

if(y>x)max=y;

return(max);}一些细节问题if(3)printf(“OK”);if(‘a’)printf(“OK”);表达式的值的判断依据,非零即真else不能单独使用,必须同if连用;但是if可以单独使用{}可以将多条语句放在一起使用,}后面不需要加;号多分支ifelseif…else举例根据输入的考试成绩等级打印出百分制分数段。A:90~100B:80~89C:70~79D:60~69 E:<60P54-例4.4#include<stdio.h>intmain(){

intscore;printf(“\nPleaseinputthescoreofastudent:\n”);scanf(“%d”,&score);if(score>=90)printf(“A\n”);elseif(score>=80)printf(“B\n”);elseif(score>=70)printf(“C\n”);elseif(score>=60)printf(“D\n”);elseprintf(“E\n”);return0;}switch语句switch语句的格式:switch

(表达式){

case常量表达式1:

case常量表达式2:语句2;

…case常量表达式n:语句n;default:语句n+1;

}例题:P56-例4.6给出成绩打印A,B,C…难点:如何构造“常量表达式”如何处理100分的问题#include<stdio.h>intmain(){

intscore;printf(“\nPleaseinputthescoreofastudent:\n”);scanf(“%d”,&score);switch(score/10){case10:case9:printf(“A\n”);break;case8:printf(“B\n”);break;case7:printf(“C\n”);break;case6:printf(“D\n”);break;default:printf(“E\n”);}}例题:运输公司对用户计算运费。路程(s,正整数)越远,每公里运费越低。标准如下:s<250km没有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:f=p*w*s*(1-d)分析折扣变化的规律性:折扣的“变化点”都是250的倍数在横轴上加一种坐标c,c的值为s/250。c代表250的倍数。c<1,无折扣;1≤c<2,折扣d=2%;2≤c<4,d=5%;4≤c<8,d=8%;8≤c<12,d=10%;c≥12,d=15%。switch(s/250){

case0:d=0;break;

case1:d=2;break;

case2:

case3:d=5;break;

case4:

case5:

case6:

case7:d=8;break;

case8:

case9:

case10:

case11:d=10;break;

default:d=15;break;}练习(分别用if…else和switch语句实现)将一个月份数字转换成英文月份名称并输出。(假定月份变量为整型变量month)使用switch结构需注意以下几点:switch结构的执行体是一个由多个case语句和一个可缺省的default语句组成的复合语句,由{}标识switch后面括弧内的表达式,可以为整数、字符或者枚举类型的表达式。case表达式可以是整型常量或字符常量表达式,不能为含有变量的表达式。例如可以是:case3+4:但不允许写成:intx=3,y=4;switch(z){…casex+y:…}3.当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。4.

每个case的常量表达式的值必须互不相同,否则会出现互相矛盾的现象。例如:case3+2:…case8-3:5.

各个case和default的出现次序不影响执行结果。例如,可以先出现“default:…”,再出现“case′D′:…”,然后是“case′A′:…”。6.

执行完一个case后面的语句后,流程控制转移到下一个case继续执行。case常量表达式只是起语句标号作用,并不是在进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。应该在执行一个case分支后,用一个break语句来终止switch语句的执行。

7.

多个case可以共用一组执行语句。

8.

switch的匹配测试,只能测试是否相等,不能测试关系或逻辑。

9.

switch结构允许嵌套。4.4循环结构以往的程序,执行一次就退出了,如何让它不停地重复执行?4.4循环结构思考求1~100的累加和。分析换一种思路:sum=1+2+…+100;首先设置一个累计器sum,其初值为0,利用sum+=n来计算(n依次取1,2,…,100),只要解决以下3个问题即可:

(1)将n的初值置为1;

(2)每执行1次“sum+=n;”后,n增1;

(3)当n增到101时,停止计算。此时,

sum的值就是1~100的累加和。sum=sum+n;格式goto语句标号说明(1)与if语句一起构成循环结构。(2)不符合结构化程序设计原则,一般不用。#include<stdio.h>voidmain(){intn=1,sum=0;loop:sum+=n;n++;if(n<=100)gotoloop;printf(“sum=%d\n”,sum);}

举例使用goto语句与if语句配合构成循环结构,实现求1~100的累加和。作用:使系统转向标号所在的语句行执行。标号的定名规则与变量名相同。一、goto语句格式while(表达式)循环体语句说明1.循环体如果包含一个以上的语句,必须使用复合语句形式。2.在循环体中,必须有使循环条件趋向于不满足(假)的语句。3.先判断表达式,后执行语句。?含义当表达式为真(非0值)时,执行while语句中的内嵌语句。执行过程表达式循环体语句假

真循环体语句当表达式值为真N-S图表示二、while语句sum=55举例求1~10的累加和。i=1sum=0当i<=10sum=sum+ii++输出sum#include<stdio.h>voidmain(){inti,sum;i=1;sum=0;while(i<=10)

{

sum=sum+i;i++;

}printf(“sum=%5d\n”,sum);}思考1、如果去掉循环体中的大括号,执行过程将会怎样变化?2、在循环体中,使循环条件趋向于不满足(假)的语句是哪条??1求1~5的累加和.2求1~10的奇数和.3求1~10的偶数和.二、while语句格式do

循环体语句while(表达式);说明1、循环体如果包含一个以上的语句,必须使用复合语句形式。2、在循环体中,必须有使循环条件趋向于不满足(假)的语句。3、先执行循环体语句,后判断表达式的值。?含义执行do-while语句中的内嵌语句,直到表达式为假(0)才跳出循环。执行过程表达式循环体语句假真循环体语句当表达式值为真N-S图表示至少执行一次三、do-while语句sum=55举例求1~10的累加和。#include<stdio.h>voidmain(){inti,sum;i=1;sum=0;do

{

sum=sum+i;i++;

}while(i<=10);printf(“sum=%5d\n”,sum);}i=1sum=0当i<=10(直到i>10)输出sumsum=sum+ii++思考1.如果去掉循环体中的大括号,执行过程将会怎样变化?2.在循环体中,使循环条件趋向于不满足(假)的语句是哪条?三、do-while语句举例while和do-while循环的比较。#include<stdio.h>voidmain(){inti,sum=0;scanf(“%d”,&i);while(i<=10)

{

sum=sum+i;i++;

}printf(“sum=%d\n”,sum);}#include<stdio.h>voidmain(){inti,sum=0;scanf(“%d”,&i);do

{

sum=sum+i;i++;

}while(i<=10)printf(“sum=%d\n”,sum);}输入:1

输入:11sum=55输出:sum=55sum=0输出:sum=11此程序的功能?什么情况下两者结果相同?三、do-while语句格式for(表达式1;表达式2;表达式3)语句for(循环变量赋初值;循环条件;循环变量增值)语句执行过程(1)先求解表达式1;(2)求解表达式2,若其值为真,则执行循环体语句,然后执行第(3)步;若为假,则结束循环,转到第(5)步;(3)求解表达式3;(4)转向步骤(2);(5)循环结束,执行for语句下面的一个语句。表达式2循环体语句假

真求解表达式1求解表达式3四、for语句举例求1~10的累加和。sum=0fori=1to10sum=sum+i输出sum#include<stdio.h>voidmain(){inti,sum;sum=0;for(i=1;i<=10;i++)sum=sum+i;printf(“sum=%5d\n”,sum);}?1求1~5的累加和.2求1~10的奇数和.3求1~10的偶数和.四、for语句for(表达式1;表达式2;表达式3)语句说明三个表达式都可以省略。表达式2循环体语句假

真求解表达式3表达式1省略循环体语句求解表达式1求解表达式3表达式2省略表达式2循环体语句假

真求解表达式1表达式3省略四、for语句的灵活性说明1i=1;for(;i<=10;i++)sum=sum+i;2for(i=1;

;i++)sum=sum+i;?3for(i=1;i<=10;){sum=sum+i;i++;}for(i=1;i<=10;i++)sum=sum+i;表达式1可以省略,但其后的分号不可以省略。没有循环结束条件,构成了死循环for(i=1;i<=10;i++)sum=sum+i;四、for语句说明45for(;;)sum=sum+i;6表达式1和表达式3可以是与循环变量无关的表达式。for(;i<=10;){sum=sum+i;i++;}7表达式2一般是关系表达式while(i<=10){sum=sum+i;i++;}while(1)sum=sum+i;表达式1和表达式3可以同时省略,此时等同于while语句。for(sum=0,i=1;i<=100;i++)sum=sum+i;例建议:for语句中只放与循环控制有关的语句。四、for语句说明1、三种循环语句在处理循环问题时,一般可以相互替代。2、对于循环次数固定的问题,用for语句实现比较简单。3、对于循环次数不确定的问题,可用while语句或do-while语句实现。4、while语句:先判断,后执行。

do-while语句:先执行,后判断。五、几种循环语句的比较格式for/while(表达式1){…if(表达式2)break;

…}举例…...sum=0;for(i=1;i<=10;i++){if(i>5)break;sum=sum+i;}printf(“sum=%5d\n”,sum);…...for/while(表达式1){…if(表达式2)conitue;

…}结束整个循环结束本次循环…...sum=0;for(i=1;i<=10;i++){if(i<=5)continue;sum=sum+i;}printf(“sum=%5d\n”,sum);…...六、break/continue语句概念一个循环体内又包含另一个完整的循环结构,称为循环嵌套。1234246836912481216举例打印乘法口诀表。#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++)

{for(j=1;j<=4;j++)printf(“%4d”,i*j);printf(“\n”);

}}i=1,j=11*1j=21*2j=31*3j=41*4i=2,j=12*1j=2……i=3i=4fori=1to4输出i*jforj=1to4换行七、循环嵌套124369481216#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++)

{for(j=1;j<=i;j++)printf(“%4d”,i*j);printf(“\n”);

}}(一)循环嵌套思考1#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++)

{for(j=1;j<=5-i;j++)printf(“%4d”,i*j);printf(“\n”);

}}(一)循环嵌套思考21234246364#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++)

{for(j=1;j<=4-i;j++)printf(“”);for(j=5-i;j<=4;j++)printf(“%4d”,i*j);printf(“\n”);

}}(一)循环嵌套思考34686912481216#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++)

{for(j=1;j<=i-1;j++)printf(“”);for(j=i;j<=4;j++)printf(“%4d”,i*j);printf(“\n”);

}}(一)循环嵌套思考4123446891216例1利用公式:/4=1-1/3+1/5-1/7+…求

的近似值,直到某一项的绝对值小于10-6为止。#include<stdio.h>#include<math.h>voidmain(){

ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while((fabs(t))>=1e-6)

{

pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}(二)程序举例pi=1-1/3+…输出4*pis=1(-1)n=1,3,5,7…t=s/n例2求Fibo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论