C语言课件3-三种基本结构程序设计_第1页
C语言课件3-三种基本结构程序设计_第2页
C语言课件3-三种基本结构程序设计_第3页
C语言课件3-三种基本结构程序设计_第4页
C语言课件3-三种基本结构程序设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第三章

三种基本结构的程序设计2025/1/623.1顺序结构3.2分支(条件)结构3.3循环结构退出2025/1/63 3.1顺序结构顺序结构程序是按书写顺序执行的语句构成的程序段。语句1语句2返回2025/1/64 3.2分支结构(条件结构)3.2.1基本if语句(单分支结构)3.2.2if-else语句(双分支结构)3.2.3if嵌套语句(分支嵌套的一般形式)3.2.4if-else-if语句(分支嵌套的特殊形式)3.2.5switch-case语句(开关分支结构)3.2.6goto语句(无条件分支结构)返回2025/1/65if(表达式)语句;注:表达式可以是任意表达式,为“非0”则执行语句。语句表达式?0非0返回 3.2.1基本if语句(单分支结构)2025/1/66if(表达式)语句1;else语句2;语句1语句2表达式?非00 3.2.2if-else语句(双分支结构)2025/1/67[例3.1]输入一个整数,判断奇偶。#include<stdio.h>voidmain(){intn;

printf("Inputaninteger\n");

scanf("%d",&n);if(n%2==0)printf("Theintegeriseven\n");elseprintf("Theintegerisodd\n");}返回2025/1/68if后和else后的语句可再包含if语句。3.2.3if嵌套语句(分支嵌套的一般形式)例:if(n>0)

if(a>b)c=a;

elsec=b;例’:if(n>0){if(a>b)c=a;}

elsec=b;注:else总是与前面最近的并且没有与其他else匹配的if相匹配。2025/1/69[例3.2]求一个点所在的象限。#include<stdio.h>voidmain(){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");}返回2025/1/610if(表达式1)语句1;elseif(表达式2)语句2;……elseif(表达式n)语句n;else语句n+1;表达式1?语句2假(0)真(非0)语句1表达式2?假(0)表达式n?假(0)语句n+1语句n真(非0)真(非0)3.2.4if-else-if语句(分支嵌套的特殊形式)2025/1/611[例3.3]求解符号函数。#include<stdio.h>voidmain(){int

x,sign;

printf("Pleaseinputanumber\n");

scanf("%d",&x);

if(x>0)sign=1;else

if(x==0)sign=0;elsesign=-1;

printf("Thesignis%d\n",sign);}2025/1/612[例3.4]设计求ax2+bx+c=0的一元二次方程解的程序。#include<stdio.h>#include<math.h>voidmain(){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.\n");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\t",p,q);printf("%8.4f-%8.4fi\n",p,q);}}}返回输入a,b,ca==0?非二次方程d=b2-4acd==0?d>0?不相等实根不相等虚根相等实根YNYNYN2025/1/613switch(表达式){case常量表达式1:

语句组1case常量表达式2:

语句组2……case常量表达式n:

语句组ndefault:

语句组n+1}注:①在VC6.0下,表达式和常量表达式为任何整型、字符型或枚举类型。②每一个case后的常量表达式值必须互不相同。③default位置任意,是所有case皆不满足时的入口;若无default且无匹配常量表达式,则不执行任何操作。④语句组不须加{}。⑤break无条件转向本层复合结构的下一条语句。3.2.5switch-case语句(开关分支结构)常量表达式1计算表达式值语句组1语句组2语句组n语句组n+1常量表达式2常量表达式ndefault…………break;break;break;计算表达式值语句组1语句组2语句组n语句组n+1……常量表达式1常量表达式2常量表达式ndefault……break;break;break;2025/1/614[例3.5]根据考试成绩的等级打印百分制分数段。#include<stdio.h>voidmain(){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");}}2025/1/615[例3.6]判别某考试成绩等级是否大于60分。#include<stdio.h>voidmain(){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");}}2025/1/616[例3.7]switch语句的嵌套。#include<stdio.h>voidmain(){intx=1,y=0,a=0,b=0;

switch(x){case1:

switch(y){case0:a++;break;case1:b++;}case2:a++;b++;break;case3:a++;b++;}

printf("a=%d,b=%d\n",a,b);}2025/1/617[例3.8]输入年、月,输出该月天数。#include<stdio.h>voidmain(){int

year,month,days,flag=1;

printf("input

year,month=?\n");

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

switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;break;case4:case6:case9:case11:days=30;break;case2:if((year%4==0)&&(year%100!=0)||(year%400==0))days=29;elsedays=28;break;default:flag=0;printf("monthiserror\n");}

if(flag)printf("year=%d,month=%d,days=%d\n",year,month,days);}年号能被4整除但不能被100整除,或者年号能被400整除的年均是闰年。返回2025/1/618goto

语句标号;注:语句标号用标识符表示,用来表示程序的某个位置。loop:if(i<=100){sum+=i;i++;

goto

loop;}返回 3.2.6goto语句(无条件分支结构)2025/1/619 3.3循环结构(重复结构)循环语句:在给定条件成立时,反复执行某个程序段(循环体)。

3.3.1if-goto语句构成的循环结构

3.3.2while语句

3.3.3do-while语句

3.3.4for语句

3.3.5break语句

3.3.6continue语句

3.3.7程序举例返回2025/1/620[例3.9]求S=1+2+…+100的和。#include<stdio.h>voidmain(){int

i,sum=0;i=1;

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

goto

loop;}

printf("SUM=%d\n",sum);}返回

3.3.1if-goto语句构成的循环结构2025/1/621while(表达式)语句;注:①先判断,后执行循环体;②循环体最少执行0次,即表达式不成立时;③死循环:while(1),即循环体内无改变表达式的值使之为假的语句,也无跳出循环的语句。while(表达式)?语句0非0 3.3.2while语句2025/1/622[例3.10]求S=1+2+…+100的和。#include<stdio.h>voidmain(){int

i,sum=0;i=1;

while(i<=100){sum+=i;i++;}

printf("SUM=%d\n",sum);}2025/1/623[例3.11]求两个正数的最大公因子。#include<stdio.h>voidmain(){int

m,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是最大公因子,结束;否则转②。2025/1/624do语句;while(表达式);注:①先执行循环体,后判断;②无论表达式成立与否,循环体最少执行1次;③死循环:while(1),即循环体内无改变表达式的值使之为假的语句,也无跳出循环的语句。dowhile(表达式)?语句0非0 3.3.3do-while语句2025/1/625[例3.12]求S=1+2+…+100的和。#include<stdio.h>voidmain(){int

i,sum=0;i=1;

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

printf("SUM=%d\n",sum);}2025/1/626#include<stdio.h>voidmain(){int

i,r;

printf("Inputaninteger\n");

scanf("%d",&i);

do{r=i%10;

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

printf("\n");}返回算法:提取最后一位数字,用取模10求得。[例3.13]将一个整数的各位数字颠倒后输出。2025/1/627for(表达式1;表达式2;表达式3)语句;注:①表达式1:变量赋初值;表达式2:循环条件;表达式3:循环后修正变量,使循环趋向结束;语句:循环体。②先判断,后执行;循环体最少执行0次;③表达式1和3省略时,相当于while循环。④死循环:表达式3省略时,循环体内应有改变表达式2的值使之为假的语句。表达式2省略时,无终止条件,则循环体内应有跳出循环的语句,如break、goto、return等。⑤适用于解决已知循环次数或已知开始条件和结束条件的重复问题。表达式2?语句0非0表达式1表达式3 3.3.4for语句2025/1/628[例3.14]求S=1+2+…+100的和。#include<stdio.h>voidmain(){int

i,sum=0;

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

printf("SUM=%d\n",sum);}2025/1/629[例3.15]求菲波那契数列的前20个数。#include<stdio.h>voidmain(){int

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

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

}

printf("\n");}a0=0a1=1ai=ai-1+ai-2,i≥2返回2025/1/630break语句的两个用途:①跳出本层switch语句;②跳出本层循环。switch表达式?语句组1break;语句组2break;语句组nbreak;语句组n+1break;…...常量1常量2常量ndefaultcase 3.3.5break语句表达式2?………...假(0)真(非0)for表达式1表达式3真(非0)do………...while(表达式)?假(0)while(表达式)?…………假(0)真(非0)break;break;break;2025/1/631[例3.16]求调和级数中第多少项的值大于10。调和级数的第n项形式为:1+1/2+1/3+…+1/n#include<stdio.h>#defineLIMIT10voidmain(){intn;floatsum;sum=0;n=1;

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

}printf("n=%d\n",n);}返回2025/1/632continue作用:只能用于循环语句中,立即结束本次循环,转去判断循环条件是否成立。while(表达式)?…………假(0)真(非0)do………...while(表达式)?假(0)真(非0)假(0)表达式2?………...真(非0)for表达式1表达式3continue;continue;continue; 3.3.6continue语句2025/1/633[例3.17]求输入的正数之和。#include<stdio.h>#defineNUM5voidmain(){int

i,n,sum=0;

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

scanf("%d",&n);

if(n<=0)continue;sum+=n;

}

printf("SUM=%d\n",sum);}2025/1/634无条件分支结构语句的三种形式:

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

continue语句:转向本层循环的末尾,结束本次循环。

break语句:转向本层复合结构的下一语句。返回2025/1/635#include<stdio.h>voidmain(){int

x,y,z;

for(x=1;x<=20;x++)

for(y=1;y<=33;y++){z=100-x-y;if((z%3==0)&&(5*x+3*y+z/3==100))

printf("cock=%d\then=%d\tchiken=%d\n",x,y,z);

}}举例:公鸡一,值钱五;母鸡一,值钱三

温馨提示

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

评论

0/150

提交评论