第3章算法与控制语句_第1页
第3章算法与控制语句_第2页
第3章算法与控制语句_第3页
第3章算法与控制语句_第4页
第3章算法与控制语句_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

1第3章算法和控制语句2教学目标初步理解算法的概念和特点掌握常用问题的算法掌握用流程图表示算法了解结构化程序设计的方法掌握格式化输入输出函数的用法掌握分支结构的程序设计,理解分支语句的嵌套掌握循环结构的程序设计及其相互嵌套理解break和continue的控制能够编写较复杂的程序33.1算法初步3.2C语言的标准输入和输出3.3条件语句3.4多分支语句3.5循环语句3.6转移语句3.7综合应用43.1算法初步算法的概念算法的表示算法举例三种基本结构5算法的概念算法:解决问题的方法和步骤沃斯公式:数据结构+算法=程序改进的沃斯公式:数据结构+算法+程序设计方法+开发工具=程序6算法的表示自然语言传统流程图N-S流程图伪代码计算机语言

7传统流程图8计算机语言#include<stdio.h>intmain(){ inti,n,s=0; scanf("%d",&n); i=1; while(i<=n) { s=s+i; i++; } printf("s=%d\n",s); return0;}9算法举例例3.1用流程图表示求两个数a,b的最大值10例3.2:求n!11例3.3:判断某一年是否为闰年。12例3.4:输入一个正整数,将它反位输出(如输入12345,输出54321)。13例3.5:判断一个整数n是否为素数14例3.6:对三个整数a、b、c按从小到大排序。15算法的特点有穷性确定性有零个或多个输入有一个或多个输出可行性16三种基本结构顺序结构:根据操作的先后顺序执行17选择(分支)结构:根据某个给定条件进行判断,条件为真或假时分别执行不同的操作18循环结构:根据条件的真或假反复执行某些操作19三种基本结构的特点:只有一个入口和一个出口结构内的每一部分都有可能被执行到结构内不存在“死循环”203.2C语言的标准输入和输出3.2.1格式化输入输出3.2.2其它输入输出3.2.3C语言语句3.2.4顺序结构程序设计213.2.1格式化输入输出格式化输出函数printf()

:把信息输出到标准输出设备(显示器)上格式:printf(“控制字符串”,输出项列表)#include<stdio.h>22输出项常量、变量、表达式类型与个数必须与控制字符串中格式字符的类型、个数一致有多个输出项时,各项之间用逗号分隔控制字符串必须用双引号括起格式说明普通字符23格式说明符:%[<修饰符>]<格式字符>

格式字符含义举例结果c按字符输出chara=65;printf(“%c”,a);Ad按十进制整数输出inta=567;printf(“%d”,a);567u按十进制无符号整数输出inta=567;printf(“%u”,a);567f按浮点数输出floata=567.789;printf(“%f”,a);567.789000E或e按指数形式输出doublea=567.789;printf(“%e”,a);5.677890e+02o按八进制输出inta=65;printf(“%o”,a);101X或x按十六进制输出inta=255;printf(“%x”,a);ffs按字符串输出printf(“%s”,“ABC”);ABCg按e、f格式中较短的一种输出floata=567.789;printf(“%g”,a);567.78924修饰符含义M输出数据域宽,数据长度<m,左补空格;否则按实际输出.n对实数,指定小数点后位数(四舍五入);对字符串,指定实际输出位数-输出数据在域内左对齐(缺省右对齐)+指定在有符号数的正数前显示正号(+)0输出数值时指定左面不使用的空位置自动填0#在八进制和十六进制数前显示前导0,0xl在d,o,x,u前,指定输出精度为long型在e,f,g前,指定输出精度为double型修饰符:确定数据输出的宽度、精度、小数位数、对齐方式

25普通字符:打印字符和转义字符#include<stdio.h>intmain(){intx=1234,y=3,z=4;floatf=123.456;doublem=123.456;charch='a',a[]="Hello,world!";printf("%d%d\n",y,z);printf("y=%d,z=%d\n",y,z);printf("%8d,%2d\n",x,x);

printf("%f,%8f,%8.1f,%.2f,%.2e\n",f,f,f,f,f);

printf("%lf\n",m);printf("%3c\n",ch);printf("%s\n%15s\n%10.5s\n%2.5s\n%.3s\n",a,a,a,a,a);return0;}26程序运行结果:34y=3,z=41234,1234123.456001,123.456001,123.5,123.46,1.23e.456000aHello,world!Hello,world!HelloHelloHel27格式化输入函数scanf()

:从标准输入设备(键盘)上输入信息一般形式:scanf(“控制字符串”,地址表列)#include<stdio.h>控制字符串:%[<修饰符>]<格式字符>28l修饰符功能hm*用于d,o,x前,指定输入为short型整数用于d,o,x前,指定输入为long型整数用于e,f前,指定输入为double型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量例scanf(“%4d%2d%2d”,&yy,&mm,&dd);

输入19991015

则1999yy,10mm,15dd例scanf(“%3d%*4d%f”,&k,&f);

输入12345678765.43

则123k,8765.43f例scanf(“%2d%*3d%2d”,&a,&b);

输入1234567

则12a,67b例scanf(“%3c%2c”,&c1,&c2);

输入abcde

则‘a’c1,‘d’c229输入分隔符的指定一般以空格、TAB或回车键作为分隔符其他字符做分隔符:格式串中两个格式符间字符例scanf(“%d%o%x”,&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);

输入123123123

输出a=123,b=83,c=291例scanf(“%d:%d:%d”,&h,&m,&s);

输入12:30:45则12h,30m,45s例scanf(“%d,%d”,&a,&b)

输入3,4

则3a,4b例scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);

输入a=12,b=24,c=3630说明:用“%c”格式符时,空格和转义字符作为有效字符输入scanf(“%c%c%c”,&c1,&c2,&c3);

若输入abc

则ac1,

c2,bc3输入数据时,遇以下情况认为该数据结束:遇空格、TAB、或回车遇宽度结束遇非法输入scanf(“%d%c%f”,&a,&b,&c);

若输入1234a123o.26

则1234a,‘a’b,123c31输入函数留下的“垃圾”例intx;charch;scanf(“%d”,&x);scanf(“%c”,&ch);printf(“x=%d,ch=%d\n”,x,ch);执行:123

输出:x=123,ch=10解决方法:(1)用getchar()清除(2)用函数fflush(stdin)清除全部剩余内容(3)用格式串中空格或“%*c”来“吃掉”32例intx;charch;scanf(“%d”,&x);ch=getchar();printf(“x=%d,ch=%d\n”,x,ch);执行:123

输出:x=123,ch=10例intx;charch;scanf(“%d”,&x);

scanf(“%c”,&ch);或scanf(“%*c%c”,&ch);

333.2.2其它输入输出putchar()函数:向标准输出设备输出一个字符格式:putchar(ch)ch为一个字符变量或常量#include<stdio.h>intmain(){

charc;

c='B';

putchar(c);

putchar('\x42');

putchar(0x42);

return0;}

BBB34getchar()函数:从键盘输入的一个字符格式:getchar()#include<stdio.h>intmain(){charch;ch=getchar();putchar(ch);printf("%d\n",ch);return0;}353.2.3C语言语句控制语句:用来完成控制功能。if…elsefor()、while()、do…whilecontinuebreakswitchreturn函数调用语句:用来实现函数调用,由函数调用加一个分号构成。表达式语句:由一个表达式加一个分号构成,最典型的是赋值表达式加一个分号构成赋值语句。空语句:;复合语句:当一个语句不能完成某一功能,需要用多个语句才能实现,这时用{}把这些语句括起来,构成复合语句。363.2.4顺序结构程序设计例3.10:编写一个程序,从键盘上输入两个整数,输出其中最大者。#include<stdio.h>intmain(){ intx,y,max; scanf("%d%d",&x,&y); max=x>y?x:y; printf("max=%d\n",max); return0;}373.3条件语句3.3.1if语句3.3.2if…else语句3.3.3if…elseif语句3.3.4条件语句的嵌套3.3.5条件语句的应用383.3.1if语句格式:if(表达式){

语句序列}39说明:表达式可以是任何类型的表达式,只要值是非0就是真,是0就是假。语句序列既可以为单条语句,也可以是复合语句。if语句表达式必须书写在小括号()内,如果省略编译会出现语法出错。40例3.12:从键盘输入一个整数,如果该整数为奇数则将其乘3加1后输出,如果为偶数则直接输出。41例3.13:从键盘输入三个整数a、b、c,对这三个数从小到大排序#include<stdio.h>intmain(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d,%d,%d\n",a,b,c);return0;}423.3.2if…else语句格式:if(表达式)

{

语句序列1}else{

语句序列2}43例3.14:从键盘上输入两个整数,求它们的最大值。#include<stdio.h>intmain(){ inta,b,max; scanf("%d%d",&a,&b); if(a>b) max=a; else max=b; printf("最大值:%d\n",max); return0;}44例3.15:从键盘输入一个整数,如果该整数为奇数则将其乘3加1后输出,如果为偶数则除以2输出。#include<stdio.h>intmain(){intn,b;scanf("%d",&n);if(n%2==1) b=3*n+1;else b=n/2;printf("变换后的数为:%d\n",b);return0;}453.3.3if…elseif语句格式:

if(表达式1)

{

语句序列1}elseif(表达式2)

{

语句序列2}elseif(表达式3)

{

语句序列3}

…else{

语句序列n}46说明:语句序列为单条语句,{}可以省略。if…elseif满足完全排斥的特性,绝不会出现某次执行了其中两路分支以上的情况。if…elseif语句中的elseif可以有有限多个,取决于编程的实际需求。47例3.16:从键盘上输入字符,判断输入字符的种类。#include<stdio.h>intmain(){charc;printf("输入一个字符:");c=getchar();if(c<32)printf("是控制字符\n");elseif(c>='0'&&c<='9')printf("是数字字符\n");elseif(c>='A'&&c<='Z'||c>='a'&&c<='z')printf("是字母\n");elseprintf(“是其他字符\n"); return0;}输入一个字符:ctrl回车,是控制字符输入一个字符:A回车,是字母输入一个字符:9回车,是数字字符输入一个字符:/回车,是其他字符48例3.17:已知2010年12月1日为星期三,从键盘上输入1~31之间的整数,按下述格式输出该日是星期几的信息在对应栏下。2010年12月日历SunMonTueWenTurFriSta----------------------------------------------149if(weekday==0) printf("%2d\n",date);elseif(weekday==1) printf("%7d\n",date);elseif(weekday==2) printf("%12d\n",date);elseif(weekday==3) printf("%17d\n",date);elseif(weekday==4) printf("%22d\n",date);elseif(weekday==5) printf("%27d\n",date);else printf("%32d\n",date);return0;}#include<stdio.h>intmain(){intdate,weekday,original_date=3;scanf("%d",&date);if(date<1||date>31){ printf("数据输入错误!\n"); return1;}weekday=(date+original_date-1)%7;printf("2010年12月日历\n");printf("----------------------------------\n");printf("SunMonTueWenThrFriSta\n");printf("----------------------------------\n");50例3.18输入学生的成绩,输出学生的等级:90~100(优)、80~89(良)、70~79(中)、60~69(及格)、60分以下(不及格)。#include<stdio.h>#include<stdlib.h>intmain(){ intcj; scanf("%d",&cj); if(cj<0||cj>100) { printf("数据输入错误\n"); exit0; } if(cj>=90&&cj<=100) printf("优\n"); elseif(cj>=80&&cj<90) printf("良\n"); elseif(cj>=70&&cj<80) printf("中\n"); elseif(cj>=60&&cj<70) printf("及格\n"); else printf("不及格\n"); return0;}513.3.4条件语句的嵌套嵌套具有else子句的if语句if(表达式1)if(表达式2)

语句序列1else

语句序列2嵌套不含else子句的if语句

if(表达式1)

语句序列1elseif(表达式2)

语句序列2一般形式if(表达式1)if(表达式2)

语句序列1else

语句序列2elseif(表达式3)

语句序列3else

语句序列452if~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对if(……)if(……)if(……)else…...else…...else…...53例: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正确配对方法:加{}54例3.19:判断两个数的大小关系#include<stdio.h>intmain(){intx,y;printf("输入两个整数x,y:");scanf("%d,%d",&x,&y);if(x!=y)if(x>y) printf("x>y\n");else printf("x<y\n");elseprintf("x==y\n");return0;}输入两个整数

x,y:12,23回车x<y输入两个整数

x,y:20,10回车x>y输入两个整数

x,y:12,12回车x==y553.3.5条件语句的应用例3.21:输入年份,判断是否为闰年。例3.22:从键盘输入一元二次方程的系数a、b、c,求它的根。56573.4多分支语句3.4.1switch多分支语句3.4.2多分支语句的嵌套3.4.3多分支语句应用583.4.1switch多分支语句多分支语句switch的格式:switch(表达式){caseE1:

语句序列1;

caseE2:

语句序列2;

……caseEn:

语句序列n;

[default:

默认语句序列;]}59说明:switch后面表达式的值必须是整型或字符型。E1,E2,…En是常量表达式,且值必须互不相同。每个case语句的冒号后面可以是0条或多条语句,多条语句时,可以不加{}。各case的顺序可以是任意的。允许多个case语句使用同一语句序列。default语句不是必须的。每个case后面语句序列里的break语句可有可无,但执行效果不同。60#include<stdio.h>#include<stdlib.h>intmain(){intscore;scanf("%d",&score);

if(score<0||score>100){ printf("输入数据错误\n"); exit(0);}switch(score/10){ case10: case9:printf("优秀\n");break; case8:printf("良好\n");break; case7:printf("中等\n");break; case6:printf("及格\n");break;default:printf("不及格\n");break;}return0;}613.4.2多分支语句的嵌套switch语句嵌套if语句switch(…){

…… if(…) {

…… } else {

…… }

语句序列}switch语句嵌套switch语句

switch(…){

……switch(…){

语句序列1}

语句序列2}if语句嵌套switch语句623.4.3多分支语句应用例3.24:已知银行整存整取存款不同期限的年利率分别为:

2.25%期限1年

2.79%期限2年年息=3.33%期限3年

3.60%期限5年

4.14%期限8年要求输入本金和期限,求到时候能从银行得到的利息与本金的合计。63#include<stdio.h>intmain(){ intyear; doublemoney,rate,total; printf("输入存款和存期:"); scanf("%lf%d",&money,&year); switch(year) { case1:rate=0.0225;break; case2:rate=0.0279;break; case3:rate=0.0333;break; case5:rate=0.0360;break; case8:rate=0.0414;break; default:rate=0.0;printf("输入的存期错误!\n");break; } total=money+money*rate*year; printf("从银行获得的总金额为:%.2lf\n",total); return0;}64例3.25:从键盘上输入年份和月份,求该月有多少天?653.5循环语句3.5.1while循环语句3.5.2do…while循环语句3.5.3for循环语句3.5.4循环语句的嵌套663.5.1while循环语句格式:while(表达式){

语句序列}语句序列称为循环体,当为一条语句时,表示复合语句的{}可以省略。表达式可以为任何类型先判断,后执行,若条件不成立,有可能一次也不执行。语句序列中必须有改变while后面括号的表达式值的语句,否则有可能死循环。67例3.26:从键盘上输入多个整数,计算机它们的和并输出,输入0表示数据输入结束68例3.27:输入一个正整数,将它反位组成一个新的数输出(如输入12345,组成54321输出)693.5.2do…while循环语句格式:do{

语句序列}while(表达式);语句序列称为循环体,当为一条语句时,表示复合语句的{}可以省略。表达式可以为任何类型。其特点是先执行,后判断,若条件不成立,就跳出循环。语句序列中必须有改变while后面括号的表达式值的语句,否则有可能死循环。while(表达式)后面的“;”不能少。70用do…while语句重新编写例3.26的问题#include<stdio.h>intmain(){intx,sum=0;do{ scanf("%d",&x); sum=sum+x;}while(x!=0);printf("sum=%d\n",sum);return0;}例3.26:从键盘上输入多个整数,计算机它们的和并输出,输入0表示数据输入结束71例3.29:从键盘上输入两个整数,求它们的最大公约数。辗转相除法迭代法72while语句和do…while语句比较while语句是先判断后执行,只要不满足条件,循环体语句根本不会执行do…while语句是先执行后判断,不管条件是否满足,循环体语句总会执行一次#include<stdio.h>intmain(){inti,sum=0;scanf("%d",&i);while(i<=10){sum+=i; i++;}printf("%d",sum);return0;}#include<stdio.h>intmain(){inti,sum=0;scanf("%d",&i);do{sum+=i;i++;}while(i<=10);printf("%d",sum);return0;}733.5.3for循环语句格式:for(<表达式1>;<表达式2>;<表达式3>){

语句序列}语句序列称为循环体。当语句序列只有单条语句,表示复合语句的{}可以省略。表达式1一般为赋值表达式,给控制变量赋初值。可以省略。表达式2一般为关系表达式或逻辑表达式,称为循环控制条件。可以省略。表达式3一般为赋值表达式,给控制变量增量或减量。可以省略。for(;;)也是合法的。74#include<stdio.h>#include<stdlib.h>intmain(){inti,sum=0,p=1,n;scanf("%d",&n);if(n<0){ printf("负数没有阶乘!\n"); exit(0);}for(i=1;i<=n;i++){ p=p*i; sum=sum+p;}printf("阶乘的和为:%d\n",sum);return0;}例3.30:计算75例3.31:从输入一个正整数,判断该数是否为素数#include<stdio.h>#include<math.h>#include<stdlib.h>intmain(){inti,m,n;scanf("%d",&n);if(n<0){ printf("输入数据错误!\n"); exit(0);}m=sqrt(n);for(i=2;i<=m;i++)if(n%i==0)break;if(i>m) printf("%d是素数\n",n);else printf("%d不是素数\n",n);return0;}76例3.32:求所有水仙花数#include<stdio.h>intmain(){inti,m,n,k;for(i=100;i<1000;i++){ m=i/100; k=i%10; n=(i-100*m)/10; if(i==m*m*m+n*n*n+k*k*k) printf("%d",i);}return0;}773.5.4循环语句的嵌套循环语句的嵌套:一个循环语句的循环体中又包含循环语句while(){……while(){

……}

…...}do{……do{

……}while();

…...}while();while(){……do{

……

}while();

…….}for(;;){……do{

……}while();

……while(){

……}

…...}三种循环可互相嵌套,层数不限。外层循环可包含两个以上内循环,但不能相互交叉。嵌套循环的执行流程:外层循环执行一次,内层循环要执行完。嵌套循环的跳转:只能跳转出本层循环。禁止从外层跳入内层、禁止跳入同层的另一循环和向上跳转。78例3.33:编写C语言程序,输出乘法九九表。

乘法九九表-------------------------------------------------------123456789---------------------------------------------------------1123456789224681012141618336912151821242744812162024283236551015202530354045661218243036424854771421283542495663881624324048566472991827364554637281---------------------------------------------------------7980#include<stdio.h>intmain(){inti,j;printf("\n---------------------------------------\

温馨提示

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

评论

0/150

提交评论