程序设计三结构_第1页
程序设计三结构_第2页
程序设计三结构_第3页
程序设计三结构_第4页
程序设计三结构_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

三种基本结构的程序设计

第三章6/27/202313.1顺序结构3.2分支结构3.3循环结构退出6/27/202323.1

顺序结构顺序结构程序就是按书写顺序执行的语句构成的程序段。语句1语句2在顺序结构程序中,各语句(或命令)是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。6/27/20233C提供了5种控制语句函数调用语句数据输入语句

ch=getchar();

scanf(格式控制,输入项地址表);

数据输出语句

putchar(ch);

printf(格式控制,输出项表);表达式语句

变量=表达式;a++;空语句

:空语句在程序中只用一个分号表示:;它什么也不做。它主要用在:①转向语句的转向点;②循环语句的循环体。若循环体为空,则其循环的动作全在循环头中进行。控制语句,用来实现逻辑控制,主要指选择和循环。6/27/20234复合语句:把多条语句用花括号括起来即构成所谓的复合语句例如:if(a>b){c=a;a=b;b=c;}6/27/20235

{sum=sum+i+j;i++;j--;}复合语句对内部来说有多条语句,对外部来说它又是一个整体,算是一个语句。6/27/20236例1、

输入任意三个整数,求它们的和及平均值。

/*功能:设计一个顺序结构程序,求三个整数的和及平均值。*/

main()

{intnum1,num2,num3,sum;

floataver;

printf("Pleaseinputthreenumbers:");

scanf("%d,%d,%d",&num1,&num2,&num3);/*输入三个整数*/

sum=num1+num2+num3; /*求累计和*/

aver=sum/3.0; /*求平均值*/

printf("num1=%d,num2=%d,num3=%d\n",num1,num2,num3);

printf("sum=%d,aver=%7.2f\n",sum,aver);

}思考题:能否将“aver=sum/3.0;”中“3.0”改为“3”?6/27/20237

【例2]从键盘输入一个小写字母,要求用大小写字母形式输出该字母及对应的ASCII码值。#include"stdio.h"main(){charc1,c2;

printf("Inputalowercaseletter:");c1=getchar();putchar(c1);printf(",%d\n",c1);c2=c1-32; /*将小写字母转换成对应的大写字母*/printf("%c,%d\n",c2,c2);} 6/27/20238程序运行情况如下:

Inputalowercaseletter:a↙a,97A,65

在顺序结构程序中,一般包括以下几个部分:

1.程序开头的编译预处理命令。在程序中要使用标准函数(又称库函数),除printf()和scanf()外,其它的都必须使用编译预处理命令,将相应的头文件包含进来。

2.顺序结构程序的函数体中,是完成具体功能的各个语句和运算,主要包括:(1)变量类型的说明。(2)提供数据语句。(3)运算部分。(4)输出部分。6/27/202393.2分支结构(条件结构)1、基本if语句(单分支结构)2、if-else语句(双分支结构)3、if嵌套语句(分支嵌套的一般形式)4、if-else-if语句(分支嵌套的特殊形式)5、switch-case语句(分支开关结构)6、goto语句(无条件分支结构)

返回6/27/2023101、基本if语句(单分支结构)

if(表达式)语句

注:表达式可是任意表达式,为“非0”则执行语句。

语句表达式0非06/27/2023112、if-else语句(双分支结构)

if(表达式)语句1else语句2语句1语句2表达式非006/27/202312[例3.3]

输入一个整数,判断奇偶。main(){intn;

printf(“Inputanumber\n”);

scanf(“%d”,&n);

if(n%2==0)

printf(“Thenumberiseven\n”);

else

printf(“Thenumberisodd\n”);}

Inputanumber

100ThenumberisevenInputanumber25Thenumberisodd6/27/202313[例3.4]求整数a的平方值。main(){inta;printf("EnteranintegerA:\n");scanf("%d",&a);if(a!=0){a=a*a;printf("a*a=%d\n",a);}elseprintf("a*a=0\n");}

EnteranintegerA:5a*a=256/27/202314例

if

(n>0)

if(a>b)c=a;

elsec=b;3、if嵌套语句(分支嵌套的一般形式)

if后和else后的语句可再包含if语句。注:else总是与前面最近的并且没有与其他else匹配的if相匹配。例’

if(n>0){if(a>b)c=a;}

elsec=b;

6/27/202315[例3.5]求一个点所在的象限。main(){floatx,y;

printf(“Inputthecoordinateofapoint\n”);

printf(“x=”);

scanf(“%f”,&x);

printf(“y=”);

scanf(“%f”,&y);

if(x>0)

if(y>0)printf(“Thepointisin1stquadrant.\n”);elseprintf(“Thepointisin4thquadrant.\n”);else

if(y>0)printf(“Thepointisin2ndquadrant.\n”);elseprintf(“Thepointisin3rdquadrant.\n”);}

Inputthecoordinateofapointx=5y=3Thepointisin1stquadrant.Inputthecoordinateofapointx=-2y=-7Thepointisin3rdquadrant.6/27/2023164、if-else-if语句(分支嵌套的特殊形式)

if(表达式1)语句1elseif(表达式2)语句2……elseif(表达式n)语句nelse语句n+1

表达式1假(0)语句2真(非0)语句1表达式2假(0)表达式n假(0)语句n+1语句n真(非0)真(非0)6/27/202317[例3.6]

求解符号函数。main(){intx,sign;

printf(“Pleaseinputanumber\n”);

scanf(“%d”,&x);

if(x>0)sign=1;

elseif(x==0)sign=0;

elsesign=-1;

printf(“Thesignis%d\n”,sign);}Pleaseinputanumber-100Thesignis–1Pleaseinputanumber2Thesignis1Pleaseinputanumber0Thesignis06/27/202318[例3.10]设计求ax2+bx+c=0的一元二次方程解的程序。

a,b,c=?1,2,1Theequationhastwoequalroots:-1.0000a,b,c=?1,2,2Theequationhascomplexroots:-1.0000+1.0000i-1.0000-1.0000ia,b,c=?2,6,1Theequationhasdistinctrealroots:-0.1771and-2.8229#include"math.h"main(){floata,b,c,d,x1,x2,p,q;

printf("a,b,c=?");

scanf("%f,%f,%f",&a,&b,&c);

printf("Theequation");

if(fabs(a)<=1e-6)

printf("isnotquadratic");else{d=b*b-4*a*c;

if(fabs(d)==1e-6)

printf("hastwoequalroots:%8.4f\n",-b/(2*a));else

if(d>1e-6){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);

printf("hasdistinctrealroots:%8.4fand%8.4f\n",x1,x2);}else{p=-b/(2*a);q=sqrt(-d)/(2*a);

printf("hascomplexroots:\n");printf("%8.4f+%8.4fi\n",p,q);printf("%8.4f-%8.4fi\n",p,q);}}}输入a,b,ca==0?“非二次方程”d=b2-4acd==0?d>0?相等实根不相等实根不相等虚根6/27/2023195、switch-case语句

(开关分支结构)

switch(表达式){case常量表达式1:

语句组1

case常量表达式2:

语句组2

……case常量表达式n:

语句组ndefault:

语句组n+1}注:①表达式和常量表达式可为任何整型或字符型。②每一个case后的常量表达式值应互不相同。

③default位置任意,只作入口;若无default且无匹配常量表达式,则不执行任何操作。

④语句组不须加{}⑤break无条件转向本层复合结构的下一条语句。

计算表达式值语句组1语句组2语句组n语句组n+1常量表达式1常量表达式2常量表达式ndefault…………计算表达式值语句组1语句组2语句组n语句组n+1常量表达式1常量表达式2常量表达式ndefault…………break;

break;

break;

breakbreakbreak6/27/202320[例3.7]根据考试成绩的等级打印百分制分数段。

main(){chargrade;

printf("inputthegrade:");

scanf("%c",&grade);

switch(grade){

case'A':printf("85~100\n");break;

case'B':printf("70~84\n");break;

case'C':printf("60~69\n");break;

case'D':printf("<60\n");break;

default:printf("error\n");}}

Inputthegrade:A85~100Inputthegrade:kerror6/27/202321[例3.8]判别某考试成绩等级是否大于60分。

main(){chargrade;

printf("Inputthegrade:");

scanf("%c",&grade);

switch(grade){

case'A':

case'B':

case'C':printf(">=60\n");break;

case'D':printf("<60\n");break;

default:printf("error\n");}}Inputthegrade:B>=60Inputthegrade:D<606/27/202322[例3.9]在case后面嵌套switch语句的程序。

#include"stdio.h"main(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}

printf("a=%d,b=%d\n",a,b);}a=2,b=16/27/202323程序举例:

[例3.11]设计输入年、月,输出该月天数的程序。main(){intyear,month,days;

printf("inputyear,month=?\n");

scanf("%d,%d",&year,&month);

switch(month){

case1:

case3:

case5:

case7:

case8:

case10:

case12:days=31;break;

case4:

case6:

case9:

年号能被4整除但不能被100整除,或者年号能被400整除的年均是闰年。case11:days=30;break;case2:if((year%4==0)&&(year%100!=0)||(year%400==0)) days=29;else days=28;break;

default:printf("monthiserror\n");}

printf("year=%d,month=%d,days=%d\n",year,month,days);}Inputyear,month=?1994,8year=1994,month=8,days=31Inputyear,month=?1994,2year=1994,month=2,days=286/27/2023246、goto语句(无条件分支结构)

goto

语句标号;

注:语句标号用标识符表示,用来表示程序的某个位置。

无条件分支结构语句的三种形式:

goto

语句:转向标号所在位置。

continue语句:转向本层复合结构的末尾。

break语句:转向本层复合结构的下一语句。loop:if(i<=100){sum=sum+i;

i++;

goto

loop;}6/27/2023253.3循环结构(重复结构)循环语句:是在给定条件成立时,反复执行某个程序段(循环体)。

1、if-goto语句

2、while语句

3、do-while语句

4、for语句

5、break语句

6、continue语句

程序举例返回6/27/2023261、if-goto语句构成的循环结构

[例3.12]求S=1+2+…+100的和。main(){

inti,sum=0;i=1;

loop:if(i<=100) {sum=sum+i; i++;

goto

loop; }

printf("SUM=%d\n",sum);}返回SUM=50506/27/2023272、while语句

while(表达式)

语句

注:①先判断,后执行循环体;

②循环体最少执行0次,即表达式不成立时;

③死循环:while(1),即当循环体内无改变表达式的语句(如

i++)。

while表达式语句0非06/27/202328[例3.13]求S=1+2+…+10的和。main(){

inti,sum=0;i=1;

while(i<=10){

sum=sum+i;i++;}

printf("SUM=%d\n",sum);}SUM=556/27/202329[例3.14]求两个正数的最大公因子。

main(){intm,n,r;

printf("Pleasetypeintwopositiveintegers\n");

scanf("%d%d",&m,&n);

while(n){r=m%n;m=n;n=r;}

printf("Theirgreatestcommondivisoris%d\n",m);}算法:①输入两个正数m和n;②m除以n,余数为r,n->m,r->n;③若n=0,则m是最大公因子,结束;否则转②。Pleasetypeintwopositiveintegers4921Theirgreatestcommondivisoris7Pleasetypeintwopositiveintegers50100Theirgreatestcommondivisoris506/27/2023303、do-while语句

do语句

while(表达式)

注:①先执行循环体,后判断;

②无论表达式成立不成立,循环体最少执行1次;

③死循环:while(1),即当循环体内无改变表达式的语句(如i++)。

do表达式语句0非06/27/202331[例3.15]求S=1+2+…+10的和。main(){

inti,sum=0;i=1;

do{sum=sum+i;i++;}while(i<=10);

printf("SUM=%d\n",sum);}SUM=556/27/202332[例3.16]将一个整数的各位数字颠倒后输出。算法:提取最后一位数字,用取模10的余数求得。main(){inti,r;

printf("Inputaninteger\n");

scanf("%d",&i);

do{

r=i%10;

printf("%d",r);}while((i/=10)!=0);

printf("\n");}

Inputaninteger123443216/27/202333for(表达式1;表达式2;表达式3)语句

4、for语句

注:①表达式1:变量赋初值;表达式2:循环条件;表达式3:循环后修正变量,使循环趋向结束;语句:循环体。②已知循环次数或开始条件和结束条件的重复问题;③表达式1和3省略时,相当于while循环。④先判断,后执行;循环体最少执行0次;⑤死循环:表达式3省略时,则循环体内应有改变表达式2的语句。表达式2省略时,无终止条件,则循环体内应有跳出循环的语句,如break,goto,exit(),return。表达式2语句0非0表达式1表达式3变量赋初值循环条件修正变量循环体While循环6/27/202334[例3.17]求S=1+2+…+10的和。main(){inti,sum=0;

for(i=1;i<=10;i++)

sum=sum+i;

printf(“SUM=%d\n”,sum);}SUM=556/27/202335[例3.18]输入10个字符,输出最大的ASCII值。

#include"stdio.h"#defineNUM10main(){

inti,c,max;max=0;

for(i=1;i<=NUM;i++)

if((c=getchar())>max)max=c;

printf("ThelargestASCIIvalueis%d\n",max);}

12AB9xabThelargestASCIIvalueis1206/27/202336[例3.19]求菲波那契数列的前20个数。main(){

inti,a,b,c;a=0;b=1;printf("%10d%10d",a,b);

for(i=3;i<=20;i++){c=a+b;printf("%10d",c);if(i%5==0)

printf("\n");a=b;b=c;}

printf("\n");}011235813213455891442333776109871597258441816/27/2023375、break语句break语句的两个用途:

①跳出switch语句;②跳出本层循环。表达式2……break;…...假(0)真(非0)for表达式1表达式3switch表达式语句组1break;语句组2break;语句组nbreak;语句组break;…...常量1常量2常量ndefaultcase表达式……break;……假(0)真(非0)whiledo……break;…...表达式假(0)真(非0)while6/27/202338[例3.20]break语句结束循环。main(){inti;

for(i=1;i<=100;i++)

{printf("%d",i);if(i>9)

break;

}printf("\n");}123456789106/27/202339[例3.21]求调和级数中第多少项的值大于10。调和级数的第n项形式为:1+1/2+1/3+…+1/n#defineLIMIT10main(){intn;floatsum;sum=0.0;n=1;

for(;;){sum=sum+1.0/n;if(sum>LIMIT)

break;n++;

}printf("n=%d\n",n);}n=123676/27/2023406、continue语句continue语句作用:立即结束本次循环,转去判断循环条件是否成立。表达式2……continue;…...假(0)真(非0)for表达式1表达式3真(非0)do……continue;…...表达式假(0)while表达式……continue;……假(0)真(非0)while6/27/202341返回[例3.22]求输入的正数之和。main(){

inti,n,sum=0;

for(i=1;i<10;i++){

scanf("%d",&n);if(n<0)continue;

温馨提示

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

评论

0/150

提交评论