C语言程序设计教程.ppt

上传人:本田雅阁 文档编号:3479555 上传时间:2019-09-01 格式:PPT 页数:38 大小:372.02KB
返回 下载 相关 举报
C语言程序设计教程.ppt_第1页
第1页 / 共38页
C语言程序设计教程.ppt_第2页
第2页 / 共38页
C语言程序设计教程.ppt_第3页
第3页 / 共38页
C语言程序设计教程.ppt_第4页
第4页 / 共38页
C语言程序设计教程.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《C语言程序设计教程.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程.ppt(38页珍藏版)》请在三一文库上搜索。

1、C语言程序设计教程,Huanghuai University Department of Computer Science,主讲:傅 丰 黄淮学院计算机科学系,高等教育出版社,谭浩强 张基温等编著,第三章 C程序的流程设计,1 算法 2 C语句概述 3 选择结构程序设计 3.1 双分支结构(if-else) 3.13.2多分支结构(else if、switch) 4 循环结构程序设计,2学时,2学时,本节,4学时,4 循环结构程序,一、while和do-while 语句,while (条件) 循环体;,do 循环体; while (条件);,1、若循环体为多条语句,应用 括起来构成复合语句。

2、2、循环体中应有使循环结束的语句,否则会出现死循环。,说 明,条件为真(非0即真)时,执行循环体;然后再判断条件,为真时再执行循环体,直到条件为假时结束循环语句,执行后续语句。,先执行循环体,再判断条件。为真则执行循环体,然后再判断条件,为真时再执行循环体,直到条件为假时结束循环,执行后续语句。,先判断后执行,先执行后判断,P98习题10:,main( ) int n=0; while (n+=1) printf(“%dt”,n); printf(“%dn”,n); ,n=0+1,n=1+1,2=1不成立,输出n 的值,输出n 的值,输出n 的值,n,1,2,3,0=1成立,n=2+1,1=1

3、成立,n=0,0,1,2,3,循环体为多个语句时要用 括起来,应在条件表达式或循环体中改变条件表达式的值,否则会出现死循环。,2次,输出n 的值,P98习题10用do-while实现的对比:,main( ) int n=0; do printf(“%dt”,n); while(n+=1); printf(“%dn”,n); ,n=0+1,n=1+1,2=1不成立,输出n 的值,输出n 的值,输出n 的值,n,0,1,3,0=1成立,n=2+1,1=1成立,n=0,0,1,2,3,2,3次,P83例1416:,main( ) int number=0; while (number=1) numb

4、er+; printf(“%dn”,number); ,main( ) int number=0; while (number+=1) printf(“*%dn”,number); printf(“*%dn”,number); ,#include “stdio.h” main( ) int c; while (c=getchar( )!=EOF) putchar(c); ,main( ) int c; c=getchar( ); while (c!=EOF); putchar(c); c=getchar( ); ,e e h h z,*1 *2 *3,1 2,EOF为符号常数,在stdio.h

5、中定义:#define EOF 1(当键盘输入Z或遇到文件结束标志时,其值为-1),14,15,16,类似P98习题10,(1) 1+3+5+99 (2) 2+4+6+100 (3) 1-2+3-4+99-100 (4) (5),#include “stdio.h” void wait_a_char(char c) char ch; while (ch=getchar( )!=c); return( ); ,P83例17:口令检查函数,将循环体合并到了条件表达式中,P12例6:求1+2+3+10,main( ) int s=0, i=1; while (i=10) s=s+i; i=i+1;

6、printf(“s=%dn”,s); ,课后练习,main( ) int s=0, i=1; do s=s+i; i=i+1; while (i=10); printf(“s=%dn”,s); ,P85例18:搬砖问题。,main( ) int x=0,y,z; while (x=8) y=0; while (y=11) z=36-x-y; if (4*x+3*y+z/2= =36) printf(“men:%d”,x); printf(“women:%d”,y); printf(“children:%dn”,z); y+; x+; ,36块砖,36人搬;男搬4,女搬3,两个小孩抬一砖。要求一

7、次搬完,问男、女、小孩各若干?,穷 举 法,算法分析:,在某一范围内逐个验证是否满足要求的方法称为穷举法,P99习题7:百马百担问题 P99习题6:换零钱问题 P99习题8:客票问题 P99习题9:验证欧拉公式,类似问题:,若问有几种解决方法,则应如何修改程序?,用变量k作为计数器,在if语句中增加“k+;”语句,P87例19:爱因斯坦阶梯问题。,设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶,正好到阶梯顶。问共有多少阶梯?,穷举法,设共有x个台阶,则: x%2= =1 x%3= =2 x%5= =4 x%6= =5 x%

8、7= =0,算法分析:,X是奇数,X是7 的倍数,X:7,7+7,7+7+7,7+7+7+7,7+7+7+7+7,X:7, 7+14, 7+14+14,哪个X满足? 要逐个验证,当中有一者不满足时, 便验证X的下一个值是否满足,main ( ) int x=7; while (x%3= =2 ,当中有一者不满足时, 便验证X的下一个值是否满足,运行结果:flight of stairs=119,(x%3!=2 | x%5!=4 | x%6!=5),P87例19(续):,程序中有无错误?,P87例20:欧几里德算法,求非负整数u和v的最大公因数,迭 代 法,不断由旧值递推出新值的方法,辗转相除(

9、设u=24,v=15):,int gcd(int u,int v) int r; r=u%v; while (r!=0) u=v; v=r; r=u%v; return(v); ,u=24 v=15 r=u%v=9,u=v=15 v=r=9 r=u%v=6,u=v=9 v=r=6 r=u%v=3,u=v=6 v=r=3 r=u%v=0,u=v=3 v=r=0,r=0时,v为所求,v=0时,u为所求,int gcd(int u,int v) int r; while (v!=0) r=u%v; u=v; v=r; return(u); ,P80例11:人口增长问题。,main( ) float

10、m=12; int n=1; while (n=10) m=m*(1+0.02); n=n+1; printf(“%fn”,m); ,按年2%的增长速度,现有12亿人,则10年后将有多少人?,算法分析:,迭代法,课后作业及上机任务,教材P98习题: 11、13(4)(6)(9)、2(3)(5),上机调试P98习题10、12 编写并调试本节例题,(1) 1+3+5+99 (2) 2+4+6+100 (3) 1-2+3-4+99-100 (4) (5),课后练习,for (初始表达式; 条件表达式; 修正表达式) 循环体;,二、for语句,Y,N,s=0; for (i=1;i=10;i+) s=

11、s+i;,s=0; i=1; for ( ;i=10;i+) s=s+i;,初始表达式; while (条件表达式) 循环体; 修正表达式; ,执行过程,for (s=0,i=1;i=10;) s=s+i; i+,s=0; i=1; while (i=10) s=s+i; i+; ,1、省略初始表达式时,分号不能省。 2、省略修正表达式时,循环体内应有改变条件表达式的值的语句。,说明:,形状,形状,main( ) int i,j; for (i=1;i=9;i+) printf(“%4d”,i); printf(“n”); for (i= 1;i=9;i+) printf(“%c”,-); p

12、rintf(“n”); for (i=1;i=9;i+) for (j=1;j=9;j+) printf(“%4d”,i*j); printf(“n”); ,P91例22:打印九九乘法表,形状,1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 ,打印表头 9个数字,打印虚线,打印 表体, for (i=1;i=9;i+) for (j=1; j=i; j+) printf(“%4d”,i*j); printf(“n”); ,打印 表体,for (i=1;i=9;i+) for (j=0;j=i-1;j+) p

13、rintf(“%4c”, ); for (j=i; j=9; j+) printf(“%4d”,i*j); printf(“n”); ,打印 表体,打印 空格,判断一个正整数n3是否为素数,main( ) int n,m,yes=1; scanf(“%d”, ,P93例23:验证素数,素数是除了1和它自身外,再也找不到能被它整除的数。 即:若n不能被2到n-1中所有整数整除,则n为素数。 已证明只要从2判断到n/2或 即可。,算法分析:,也可用m=n-1,求100200间的全部素数,课后练习:,也可用n/2或sqrt(n),P80例12:兔子繁殖问题(Fibonacci提出的) P94例24:

14、打印Fibonacci数列前n项,main( ) int n,m; long f1=1,f2=1,f3; scanf(“%d”, ,设有一对新生兔子,从第3个月开始,每个月都生一对兔子。按此规律,若所有兔子都不死,问一年后共有多少对兔子?,迭代法,f1 f2 1 1 f3=f1+f2 2 f1 f2 f3=f1+f2 3 f1 f2 f3=f1+f2 5 f1 f2 f3=,初始条件,终止条件,迭代公式,思考:f1=f2和f2=f3能否对换位置?不,main( ) int x,y,z; for (x=0;x20;x+) for (y=0;y33;y+) z=100-x-y; if (5*x+3

15、*y+z/3= =100) printf(“x=%d”,x); printf(“y=%d”,y); printf(“z=%dn”,z); ,补充例题:百钱百鸡问题,P85例18:搬砖问题 P99习题7:百马百担问题 P99习题6:换零钱问题 P99习题8:准备客票问题 P99习题9:验证欧拉公式,穷举法,类似问题:,每只公鸡5元,每只母鸡3元,三只小鸡1元。用100元钱买100只鸡,问公、母、小鸡各买多少只?,算法分析:,补充举例:打印图形。,算法分析:,第1行:1个空格,5个*号,换行 第2行:2个空格,5个*号,换行 第3行:3个空格,5个*号,换行 第4行:4个空格,5个*号,换行 第5

16、行:5个空格,5个*号,换行,第i(15)行:i个空格,5个*号,换行,main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=i;j+) printf(“ ”); for (j=1;j=5;j+) printf(“*”); printf(“n”); ,i个空格,5个*号,换行,循环语句嵌套时,当外层循环变量取1个值时,内层循环变量要取遍所有值,补充举例(续):打印图形。,小结,循环控制有两种方法:计数法和标志法。 能确定循环次数时,采用计数法,用for语句比较清晰; 不能确定循环次数时,采用标志法,设法找出循环终止条件,用while或do-while语句来实

17、现。 用while与do-while语句能实现的程序,用for语句未必可以实现。 while语句是先判断后执行,do-while语句是先执行后判断。在循环体至少执行一次的情况下两者等价。,课后作业及上机任务,教材P97习题: 11、13(2)(3)(5)(9),编写并调试例22、例23 编程求100200间的全部素数,(1) 1+3+5+99 (2) 2+4+6+100 (3) 1-2+3-4+99-100 (4) (5),课后练习,习题课,main( ) int value1, value2; value1=50; value2=25; sum=value1+value2; printf(“

18、%d+%d=%dn”,value1,value2,sum); ,P96习题1:用N-S图描述算法,main( ) int a; scanf(“%d”, ,main( ) int x,max,i; scanf(“%d”, ,P97习题2:设计算法,(2)依次输入不10个数,找出最大数。,main( ) int n; scanf(“%d”, ,P97习题2:设计算法,(4)判断一个整数n能否被3和5整除。,main( ) int y; scanf(“%d”, ,P98习题7:,设计一个判断输入年份是否为闰年的程序: (1)能被4整除但不能被100整除的年份; (2)能被4整除且能被400整除的年份

19、。,main( ) float s,a,b,c; scanf(“%f%f%f”, ,P98习题8:计算以输入的三个数为边长的三角形面积,若S=(a+b+c)/2,则面积为,main( ) int yes; /*设1表示float,否则为int*/ char c; c=getchar( ); while (c!=n) if (c=.) yes=1; c=getchar( ); if (yes=1) printf(“floatn”); else printf(“intn”); ,P98习题9:,输入的必须是数字,将程序段改写得更合理,while (A) if (!B) C;,do if (A) B

20、; C; while (A);,输入一个数,打印其类型标识符,P98习题11:,P98习题12:输入“qwert?”时,程序的执行结果。,#include “stdio.h” main( ) char c; c=getchar( ); while (c!=?) putchar(c); c=getchar( ); /*不是?时原样输出*/,#include “stdio.h” main( ) char c; while (c=getchar( )!=?) putchar(+c); /*不是?时输出其后的字符*/,#include “stdio.h” main( ) while (putchar(

21、getchar( )!=?); /*立即原样输出输入字符, 当输入的是?时退出*/,qwert,rxfsu,qwert?,main( ) int n; for (n=33;n=255;n+) if (n%8=0) printf(“n”); printf(“%4d%2c”,n,n); ,P99习题(2):,打印码值为33255的ASCII码值-字符对照表,每8个换行,main( ) int i=1; double e=1.0, y, x, d; scanf(“%lf), ,P99习题(4):,计算e= ,使误差小于给定值d。,即i!,main( ) int i; long f(int n); d

22、ouble e=0.0, y=1.0, d; scanf(“%lf), printf(“%12.10lfn”,e) ,long f(int n) long x=1; int i; for (i=1;i=n;i+) x=x*i; return(x); ,f( )为求n!的函数,不能用for,因不能确定n值,迭代法,自定义函数法,P99习题(5):递增的牛群,若有一头母牛,从第4年开始,每年生一头母牛。按此规律,第n年时有多少头母牛?,main( ) int n,y; long f1,f2,f3,f; scanf(“%d”, ,算法分析:,1 1 1 2 3 4 6 9 13 19 28 41 f

23、1 f2 f3 f=f1+f3 f1 f2 f3 f=f1+f3 f1 f2 f3 f=f1+f3 f1 f2 f3 f=f1+f3 ,迭代法,P99习题(6):换零钱,把一元钱兑换成硬币(1、2、5分),有几种兑换方法?,设5、2、1分钱各为x、y、z: 5x+2y+z=100 可得: 0x20 0y50 0z100,算法分析:,main( ) int x,y,z,k=0; for (x=0;x=20;x+) for (y=0;y=50;y+) z=100-5*x-2*y; printf(“x=%d”,x); printf(“y=%d”,y); printf(“z=%dn”,z); k+;

24、printf(“%dn”,k); ,P85例8:搬砖问题 补充举例:百钱百鸡问题,问题对比:,穷举法,541种,P99习题(7):百马百担,有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担。问有大、中、小马各多少?,算法分析:,main( ) int x,y,z,k=0; for (x=0;x33;x+) for (y=0;y50;y+) z=100-x-y; if (3*x+2*y+z/2=100) printf(“x=%d”,x); printf(“y=%d”,y); printf(“z=%dn”,z); k+; printf(“%dn”,k); ,穷举法,7种,P99习

25、题(8):准备客票,某铁路线上共10个车站,问需要准备几种车票?,穷举法,算法分析:,两个站点往返,需要设2种车票(往返票)。 设两站点分别为x和y,则从x站到y站: 1x10 x+1y10 x:1 2 3 4 5 6 7 8 9 10 y:1 2 3 4 5 6 7 8 9 10,main( ) int x,y,k=0; for (x=1;x10;x+) for (y=x+1;y=10;y+) k=k+2; printf(“%dn”,k); ,内层循环的for语句能否改为: for (y=x;y10;y+),90种,main( ) int a,n,i; for (n=-39;n=40;n+)

26、 a=n*n+n+41; for (i=2;i=sqrt(a);i+) if (a%i=0) printf(“errorn”); exit(0); printf(“OKn”); ,P99习题(9):验证欧拉公式 an=n2+n+41,验证:是否为在-3940之间范围内计算素数的通项公式,穷举法,不是素数正常终止程序,算法分析:,n取-3940时: (1) 求出an (2) 判断an是否为素数,main( ) int n; double s=0.0,x=1.0; for (n=1;n=64;n+) s=s+x; x=x*2; printf(“%lfn”,s/1.4e8); ,P99习题(12):

27、印度国王的奖励,古印度国王奖励他能干的宰相达依尔(国际象棋发明者),问他想要什么?达依尔说:“只要在国际象棋棋盘的第1个格上放1粒麦子,第2个格上放2粒麦子,以后每个格上都按前一格的两倍计算。给我64格麦子就感激不尽了”。国王让人扛了一袋麦子,但很快用光了还不够,请计算共需要多少小麦(设1m3小麦约1.4*108粒)?,迭代法,算法分析,设前1格放x粒,则后一格放x*2粒: 初值:x=1 迭代公式:x=x*2 终止条件:64格,1.317*1011m3,1+2+22 +23 +24 +25 + +263,补充举例:猴子吃桃问题。,猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃掉前一天剩下的一半零一个。到第10天早上再想吃时,就只剩一个桃子了。问第一天共摘了多少个桃子?,迭代法,设第n天为xn个,第n+1天为xn+1 则:xn+1= xn/2-1 可得递推公式: xn=(xn+1+1)*2 1n9 x10=1 n=10 即: x10=1 x9=(x10+1)*2=4 x8=(x9+1)*2 =10 x1=(x2+1)*2=1534,算法分析:,1534个,倒推,main( ) int x=1; for (n=9; n=1; n- -) x=(x+1)*2; printf(“%dn”,x); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1