程序基本结构_第1页
程序基本结构_第2页
程序基本结构_第3页
程序基本结构_第4页
程序基本结构_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

1、 第一章中我们学习了顺序结构的第一章中我们学习了顺序结构的c c程序设计方法,程序设计方法,但是实际应用中,很多问题仅有顺序结构的方法是但是实际应用中,很多问题仅有顺序结构的方法是无法解决的。无法解决的。问题问题1:输入三个整数,按从大到小的顺序输出。:输入三个整数,按从大到小的顺序输出。问题问题2:编写程序计算:编写程序计算:1+2+3+1001+2+3+100。 s1:输入输入3个整数,个整数,分别赋值给分别赋值给a,b,cs2: 如果如果ab, 则则a b bs3: 如果如果ac,ac,则则a ac cs4: s4: 如果如果bc,b, .)非反后来自加减非反后来自加减; (! + -)

2、负类指针有地址负类指针有地址, (-, 类型转换类型转换, *, &) 长度唯一右在前长度唯一右在前. (sizeof ,单目运算,从右至左单目运算,从右至左)先乘除,再求余先乘除,再求余, (*, /, %)加减后,左右移加减后,左右移, (+, -, )关系运算左为先关系运算左为先. (, , )等于还是不等于等于还是不等于, (=, !=)按位运算与异或按位运算与异或; (&, , | )逻辑与,逻辑或逻辑与,逻辑或, (&, | )条件运算右至左条件运算右至左. (? : )赋值运算虽然多赋值运算虽然多, (=, +=, -=, *=, /=, %=,=, 全体单目第二全体单目第二;

3、/所有的单目运算符比如所有的单目运算符比如+ - +(正正) -(负负) 指针运算指针运算*&乘除余三乘除余三,加减四加减四; /这个这个“余余”是指取余运算即是指取余运算即%移位五,关系六移位五,关系六; /移位运算符:移位运算符: ,关系:,关系: = = 等等等于等于(与与)不等排第七不等排第七; /即即= !=位与异或和位或位与异或和位或; /这几个都是位运算这几个都是位运算: 位与位与(&)异或异或()位或位或(|) “三分天下三分天下”八九十八九十; 逻辑或跟与逻辑或跟与; /逻辑运算符逻辑运算符:| 和和 &十二和十一十二和十一; /注意顺序注意顺序:优先级优先级(|) 底于底于

4、 优先级优先级(&) 条件高于赋值条件高于赋值, /三目运算符优先级排到三目运算符优先级排到 13 位只比赋值运算符和位只比赋值运算符和“,”高高 /需要注意的是赋值运算符很多!需要注意的是赋值运算符很多!逗号运算级最低逗号运算级最低! /逗号运算符优先级最低逗号运算符优先级最低 b bs3:s3:输出输出a,ba,b一般形式:一般形式:流程图:流程图:#include void main( ) int a,b,temp; printf(input a,b:); scanf(%d%d,&a,&b); if (ab) /* 判断判断a、b的关系的关系 */ temp=a; a=b; b=temp

5、; /* a大于大于b,则交换则交换a,b的值的值 */ printf(“result is %d,%dn,a,b); /*按从小到大顺序按从小到大顺序输出输出 */例例2.1的的c语言程序如下:语言程序如下:#include void main() int x1,x2,x3,temp; scanf(“%d%d%d”,&x1,&x2,&x3); if(x1x2) temp=x1;x1=x2;x2=temp; if(x1x3) temp=x1;x1=x3;x3=temp; if(x2x3) temp=x2;x2=x3;x3=temp; printf(“%d,%d,%d”,x1,x2,x3);例例

6、2.32.3: 输入两个整数,输出其中较大的一个。输入两个整数,输出其中较大的一个。 , 否则输出否则输出b b一般形式:一般形式:流程图:流程图:#includevoid main() int x1,x2; scanf(“%d%d”,&x1,&x2); if(x1x2) printf(“%dn”,x1); else printf(“%dn”,x2);提示:闰年的判断,能被4整除不能被100整除,或者能被400整除的都是闰年。一般形式:一般形式:流程图:流程图:if (ab) t=a; a=b; b=t; if (a+bc & b+ca & c+ab) s=1.0/2*(a+b+c); are

7、a=sqrt(s*(s-a)*(s-b)*(s-c); printf(area=%.2fn, area); else printf(it is not a trilateral!n);程序程序1:if (x=0) if (x0) y=1; else y=0;else y=-1;y=- -1y=0y=1真真假假真真假假eg502.c程序程序3:y=0;if (x!=0) if (x0) y=1; else y=-1;y=1y=-1真真真真假假假假例:例: 求一元二次方程求一元二次方程ax2+bx+c=0的根,的根,a,b,c由键由键盘输入。盘输入。分析:对于一元二次方程有以下几种可能:分析:对于

8、一元二次方程有以下几种可能: a=0,不是二次方程;,不是二次方程; b2-4ac=0,有两个相等的实根;,有两个相等的实根; b2-4ac0,有两个不等的实根;,有两个不等的实根; b2-4acb?(a=100):(b=100) ab?printf(“”%dn”,a):printf(“%dn”,b)(4)表达式)表达式1、表达式、表达式2和表达式和表达式3的类型都可以不同。的类型都可以不同。表达式值的类型是表达式表达式值的类型是表达式2、3中类型较高的类型。中类型较高的类型。例如:例如:xy?1:1.5 表达式值是表达式值是double类型类型(1)优先级高于赋值,低于关系运算符和算数运算符

9、)优先级高于赋值,低于关系运算符和算数运算符例:例:x= ab? a:b+1;x= (ab)? a:(b+1);ab? a : cd? c : dab? a : (cd? c : d)if (ab) x=a;else x=b+1;例例2.7:输入一个字符,如果是大写字母,转换为小写,:输入一个字符,如果是大写字母,转换为小写,如果不是不转换。最后输出。如果不是不转换。最后输出。#includevoid main() char ch; scanf(“%c”,&ch); /*ch=getchar();*/ ch=(ch=a&ch=90) printf(a); else if(score=80) p

10、rintf(b); else if(score=70) printf(c); else if(score=60) printf(d); else printf(e);void main( ) int score,temp; printf(input score of student:); scanf(%d,&score); temp=score/10; switch(temp) case 10: case 9: printf(a); break; case 8: printf(b); case 7: printf(c); break; case 6: printf(d); break; def

11、ault: printf(e); break;简单选择界面的编程。从键盘输入整数,输出不同的字符串:输入1,输出good morning;输入2,输出good afternoon;输入3,输出good evening;输入4,输出good night;输入其它数字,输出bye-bye。问题问题2:编写程序计算:编写程序计算:1+2+3+100。 2.3 循环结构循环结构2.3.1 循环结构的引出循环结构的引出算法算法1:直接写出算式:直接写出算式 s1: result=1+2+3+4+5+100 循环控制结构一般由四部分组成:、进入条件、退出条件、循环体:循环体需要完成的功能(需要重复执行的语

12、句) 、循环变量的修正 根据进入条件和退出条件,循环控制结构可以分为三种形式:、while结构:退出条件是进入条件的反条件。即满足 条件时进入,重复执行循环体直到进入的条件不再满足为止。、do-while结构:无条件进入,执行一次循环体后再判断是否满足再进入循环的条件。、for结构:与while结构类似,但结构更紧凑。适用于循环之前循环次数就已经确定的情况。使用形式:while(表达式) 语句;真(非0)表达式成立吗?语句假(0)特点:先判断表达式,后执行语句2.3.22.3.2 while while 语句语句例:求1+2+3+100 i=1,sum=0i=100sum=sum+ii=i+1

13、假真i=1,sum=0当i=100sum=sum+ii=i+1void main()int i, sum;i=1; sum=0;while (i=100) sum=sum+i; i+;printf (“sum=%dn”, sum);注意:while起作用的范围注意:要有改变循环结束条件的语句void main()int i, n, sum;i=1; sum=0;while (i=n) sum=sum+i; i+;printf (“sum=%dn”, sum);计算 1+2+3+n(n为任意正整数) scanf(%d,&n);思考问题:循环结束后循环变量的值是多少?void main()int

14、i , n, sum;i=1; sum=0;while (i=n) sum=sum+i; i=i+2;printf (“sum=%dn”, sum); scanf(%d,&n);计算 1+3+5+7+n(n为奇数)例:输入一个字符,如果是大写字母,转换为小写,如果不例:输入一个字符,如果是大写字母,转换为小写,如果不是则不转换。输入是则不转换。输入“0”“0”结束程序。结束程序。#include void main() char ch; while(ch=getchar()!=0) ch=(ch=a&ch=z)?(ch+32):ch; printf(“%c”,ch); 2.3.3 do-whi

15、le 2.3.3 do-while 语句语句使用形式: do 循环体语句 while(表达式);特点:先执行循环体语句,后判断表达式循环体语句表达式0(假)非0(真)注意:、循环部分为多个语句时,必须用大括号构成复合语句;、循环体中应有使循环趋于结束的语句例:求1+2+3+100 sum=0i=1sum=sum+ii=i+1i=100假真int i, sum;i=1; sum=0;do sum=sum+i; i+;while (i=100);printf (“%dn”, sum);void main()while 和 do-while 循环的比较(?不同之处)main() int sum=0,

16、 i; scanf (“%d”, &i); while (i=10) sum=sum+i; i+; printf (“sum=%dn”, sum); main() int sum=0, i; scanf (“%d”, &i); do sum=sum+i; i+; while (i=10); printf (“sum=%dn”, sum); 2.3.4 for 语句语句一般形式: (表达式1;表达式2;表达式3) 语句一般使用格式:for(循环变量赋初值;循环条件表达式;循环变量修正值) 循环体;执行过程:(1)求解表达式1(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌

17、语句,然后执行(3)。若为假(值为0),则结束循环,转到(5)。(3)求解表达式3(4)转回执行(2)(5)循环结束,执行for语句下面的一个语句(表达式1;表达式2;表达式3) 语句例:求1+2+3+100 void main( ) int i,sum=0; for(i=1;i=100;i+) sum=sum+i; printf(“%d”,sum);循环变量赋初值循环变量赋初值循环条件循环条件循环变量修正循环变量修正循环体循环体例:计算某个班英语成绩的平均分, 学生人数和每个学生的成绩由键盘输入。void main() int i,n; float s,sum,ave; sum=0; for

18、 ( i=1; i=n ; i+ ) ave=sum/n; printf(“ave is %f”,ave);scanf(%d, &s);sum=sum+s ;scanf(%d, &n);想想这条语句是否能放到循环体内?for语句的三个表达式都可以缺省,但两个分号不能缺省;如果在for语句之前已经给循环变量赋初值,则for语句的循环变量赋初值部分可以省略,但其后得分号不省略; 也可以将循环变量修正值的工作纳入到循环体中去做;说明:说明:i=1;for ( ; i=10; i+) m=m*i;如:for (i=1; i=10; ) m=m*i; i+;如:也可以省略for语句的第一和第三部分;i=

19、1;for( ; i=10; ) m=m*i ; i+;如:for ( ; ; )但是注意不能两处同时修正值!通常不缺省表达式2;有时缺省表达式2,此时不判断循环条件,循环将无终止的执行,即认为表达式2始终为真;在循环体内用if和break控制循环结束。for (i=1; ; i+) if (条件) break; sum=sum+i; 如果有多个循环变量赋初值,或多个循环变量值要修正,应在各变量之间用逗号隔开。for(i=1, j=10; i=j; i+, j- -) k=i+j;如:循环条件表达式一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,每次系统判断该表达式的结果不为0

20、,就执行一遍循环体。for(m=0;( c=getchar( ) ) != !;) m=m+c;如:考虑问题:运行程序时如何停止循环?for、while、dowhile的互相转化i=1;sum=0;do sum=sum+i; i+;while(i=100);for (i=1; i=100; i+) sum=sum+i;i=1; sum=0;while(i=100) sum=sum+i; i+;输出所有的水仙花数。输出所有的水仙花数。(水仙花数就是一个三位数,这个数正好等于该数的(水仙花数就是一个三位数,这个数正好等于该数的每一位的立方和。每一位的立方和。 例如:例如: 153=1*1*1+5*

21、5*5+3*3*3)void main()for()a=i/100;c=i%10; 补充:循环的嵌套补充:循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环嵌套。内层的循环中还可以嵌套循环,构成多重循环。while ( ) while ( ) for ( ; ; ) for ( ; ; ) do do while ( ); while ( );while ( ) for ( ; ; ) for ( ; ; ) do while( ); while ( ) do while( ); 例:输出如图所示的矩形:例:输出如图所示的矩形:* * * * * * * * * * * * * * *

22、 * *void main( ) printf(*n); printf(*n); printf(*n); printf(*n);void main( ) int i, j ; i=1; while (i=4) while ( j=5 ) printf(“*”); j+;j=1;printf(“n”);i+;#include void main( ) int i , j ; i=1; while (i=4) for (j=1; j=5;j+) putchar(*); putchar(n); i+; #include void main( ) int i , j ; for ( i=1; i=4;

23、 i+) for (j=1; j=5; j+) putchar(*); putchar(n); 例:输出如图所示的矩形:例:输出如图所示的矩形:* * * * * * * * * * * * * * * * *内外层循内外层循环的循环环的循环控制变量控制变量不能重名不能重名例:输出如图所示的三角形:例:输出如图所示的三角形:* * * * * * * *特点:第i行有i个星号#include void main( ) int i , j ; for( i=1; i=4; i+) for (j=1; ; j+) putchar(*); putchar(n); j=i例:输出如图所示的等腰三角形:

24、例:输出如图所示的等腰三角形:* * * * * * * * * * * * *特点:一共有4行,第i行有2i-1个星号;第i行的第1个星号前有4-i个空格#include main( ) int i , j ; for( i=1; i=4; i+) for (j=1; j=4-i; j+) putchar(32); for (j=1; j=2*i-1; j+) putchar(*); putchar(n); 例:输出如图所示的菱形:例:输出如图所示的菱形:* * * * * * * * * * * * * * * * * * *分析:将图形分为上下两部分分别输出!* * * * * * *

25、* * * * * * * * * * * *for ( i=1; i=4 ; i+) for ( j=1; j=4-i ; j+) putchar( ); for ( k=1; k=1 ; i- -) for ( j=1; j=4-i ; j+) putchar( ); for ( k=1; k=2*i-1 ; k+) putchar(*); putchar(n); 几种循环的比较几种循环的比较、c语言中的三种循环结构都由表达式控制执行一个循环语言中的三种循环结构都由表达式控制执行一个循环体,体,一般情况下可以相互代替一般情况下可以相互代替;、用、用while和和do-while循环时,循环

26、变量初始化的操作应循环时,循环变量初始化的操作应在在while和和do-while语句之前完成;而语句之前完成;而for语句一般在表达式语句一般在表达式1中实现循环变量的初始化;中实现循环变量的初始化;、当、当循环次数及控制条件循环次数及控制条件要要在程序运行过程中确定在程序运行过程中确定时,时,选用选用while或或do-while语句;语句;、在、在初值、增量及控制条件明显初值、增量及控制条件明显,或,或循环次数已经给定循环次数已经给定的情况下,选用的情况下,选用for语句;语句;、在循环的执行过程中,应、在循环的执行过程中,应不断的改变循环控制表达式不断的改变循环控制表达式的值的值,以便

27、逐步形成使它为,以便逐步形成使它为0 0的条件,否则将可能出现死的条件,否则将可能出现死循环;循环;、三种循环可以相互嵌套,形成多重循环,外循环可以、三种循环可以相互嵌套,形成多重循环,外循环可以包含多个或多重内循环,包含多个或多重内循环,循环之间可以并列但不能相交循环之间可以并列但不能相交,并列的循环控制变量可以同名并列的循环控制变量可以同名,但,但嵌套的循环控制变量不嵌套的循环控制变量不能同名能同名;、不允许不允许用其它的控制语句用其它的控制语句把程序流程从循环体外转入把程序流程从循环体外转入循环体内循环体内,但必要时可以用,但必要时可以用breakbreak、gotogoto等语句把流程

28、从等语句把流程从循环体内转到循环体外。循环体内转到循环体外。2.4.1 break语句语句1 1、格式:、格式: break;2、功能:、功能: 中止当前循环语句或中止当前循环语句或switch语句的执行语句的执行3、说明:、说明:、若是多重循环,、若是多重循环,break只能使流程跳出离只能使流程跳出离break最近的一层;最近的一层;、break只用于只用于switch语句语句和和循环语句循环语句。例例2.14:计算:计算 r=1到到 r=10时的圆面积,直到面积大于时的圆面积,直到面积大于100为止为止#include void main( ) float r, area; for (r

29、 =1; r 100) break; printf(%6.2fn, area); 2.4.2continue语句语句1、格式:、格式: continue;2、功能:、功能: 提前结束本次循环体的执行提前结束本次循环体的执行(不再执行循环体中(不再执行循环体中continue后面的语句),后面的语句),接着进行下一次是否执行接着进行下一次是否执行循环的判定循环的判定3、说明:、说明:、continue语句只能用于语句只能用于循环语句循环语句中,它是一中,它是一种具有特殊功能的转移语句;种具有特殊功能的转移语句;、continue与与break不同不同:continue语句只结束语句只结束本次循环

30、本次循环,而不是终止整个循环的执行;而,而不是终止整个循环的执行;而break语语句则结束整个循环句则结束整个循环,不再判断循环条件是否成立。,不再判断循环条件是否成立。例例2.15:把:把10到到20之间能被之间能被3整除的数输出整除的数输出#includevoid main( ) int n; for (n=10; n=20; n+) if (n%3!=0) continue; printf(%d , n); printf(“n%dn”,n)经典问题:判断素数经典问题:判断素数素数是除了素数是除了1和它自身不能被任一个数整除的数。和它自身不能被任一个数整除的数。算法提示:算法提示:1、可以

31、让除数从、可以让除数从2n1逐个去除该数逐个去除该数n,判判断是否被其中的任何一个整数整除,如果是,则说明不是断是否被其中的任何一个整数整除,如果是,则说明不是素数。如果一直都没有出现过整除现象,则说明该数是素素数。如果一直都没有出现过整除现象,则说明该数是素数。数。for(i=2;i=n) printf(“ %d is sushu!”,n);判断素数判断素数算法改进算法改进1:可以定义一个标志变量,判断起来很方便。可以定义一个标志变量,判断起来很方便。flag0;for(i=2;in;i+) if(n%i=0) flag=1; break;if(flag=0) printf(“ %d is

32、sushu!”,n);判断素数判断素数算法改进算法改进2:可以进一步减少循环次数。循环的终止条件可可以进一步减少循环次数。循环的终止条件可缩小为缩小为n/2,或或k=n/2; 或或 k=for(i=2;i=k+1) printf(“ %d is sushu!”,n);nn例:打印例:打印3100之间的全部素数。之间的全部素数。for (m=3; m=100; m+=2) k=sqrt(m);for (i=2; i=k; i+) if (m%i=0) break; if (i= = ) printf(%-5d,m);k+1?void main() int i,k,m; 判断n是否素数,补全程序m

33、ain() int i, n, flag=0; for(i=2; _; i+) if ( _ ) flag=1; if ( _ ) printf(“是素数n”); inn%i=0flag=0经典算法一(穷举法):百鸡百钱问题一只公鸡值一只公鸡值5元,一只母鸡值元,一只母鸡值3元,三只小鸡值元,三只小鸡值1元,元,总共有总共有100元钱要买一百只鸡,问有多少种方案?元钱要买一百只鸡,问有多少种方案?#include void main( ) int x,y,z; printf(* 百鸡问题百鸡问题 *n); for (x=1;x20;x+) for (y=1;y33;y+) for (z=3;z

34、100;z+=3) if (5*x+3*y+z/3=100 & x+y+z=100) printf(cock:%d,hen:%d,chicken:%dn,x,y,z);v程序使用了三层循环来解决问题,程序结程序使用了三层循环来解决问题,程序结构简单明了。但是我们设计程序不仅要正构简单明了。但是我们设计程序不仅要正确无误,还要注意程序的执行效率。确无误,还要注意程序的执行效率。v一般来说,在循环嵌套中,内层循环执行一般来说,在循环嵌套中,内层循环执行的次数等于该循环嵌套结构中每一层循环的次数等于该循环嵌套结构中每一层循环重复次数的乘积。重复次数的乘积。 例如,上面的程序中,外层每循环一次,第二层

35、例如,上面的程序中,外层每循环一次,第二层要循环要循环32次,而第三层要循环次,而第三层要循环32*33=1056次。这次。这样程序执行下来,最内层的样程序执行下来,最内层的if语句要执行语句要执行19*32*33次。所以我们在编写程序时,需要考虑次。所以我们在编写程序时,需要考虑尽可能的减少循环执行的次数,特别是循环的嵌尽可能的减少循环执行的次数,特别是循环的嵌套。套。对于“百鸡问题”,由方程组:x+y+z=100,5x+3y+z/3=100可以导出: x=4z/3-100 y=100-x-z这样就只有z一个未知数,如果知道了z就可以求出x值,进而求出y值。因此我们只要将z作为循环变量就可以

36、了。#include void main() int x,y,z; printf(“* 百鸡问题百鸡问题 *n”); for (z=3;z=1;day-) x1=(x2+1)*2; x2=x1; printf(peach are %dn,x1);2.6.1指针指针变量名称变量名称 内存地址内存地址 变量的值变量的值 char c 0012 ff7c 10101111 0012 ff7b 11010101 0012 ff7a 01010101 0012 ff79 11100110 int i 0012 ff78 01001001 变量、内存地址、变量值的关系变量、内存地址、变量值的关系 变量名前

37、的变量名前的* *表示该变量表示该变量是一个指针变量,以示是一个指针变量,以示与普通变量的区别。与普通变量的区别。可以是可以是c c语言中的任何一语言中的任何一种数据类型,是指针变量种数据类型,是指针变量所指向的对象的类型。所指向的对象的类型。01111000111111110001001000000000.01111100111111110001001000000000.1111111111111111000000000000000001111010变量的值变量的值0012ff670012ff680012ff690012ff6a.0012ff700012ff710012ff720012ff7

38、3.0012ff780012ff790012ff7a0012ff7b0012ff7c内存地址内存地址指针变量指针变量 pi指针变量指针变量 pc整型变量整型变量 i字符变量字符变量 c变量名称变量名称 指针变量、变量、变量地址和变量的值的关系示意图指针变量、变量、变量地址和变量的值的关系示意图122 z655352.6.2 指针变量的使用指针变量的使用1、指针变量的赋值、指针变量的赋值(1)通过地址运算)通过地址运算(&)赋值赋值 例如:例如: float f, *p; p=&f;(2)通过指针变量的初始化赋值)通过指针变量的初始化赋值 例如:例如:float f, *p=&f;(3)通过其他指针变量赋值)通过其他指针变量赋值 例如:例如:int i, *p1=&i, *p2; p2=p1;(4)用)用null给指针变量赋空值给指针变量赋空值 例如:例如:int *p; p=null;单目运算符单目运算符两个指针变量的两个指针变量的类型必须相同类型必须相同null是符号常量,是符号常量,和整数和整数0对应。对应。相当于:相当于:p=0;或或p=0;除了上述除了上述4种情况外,指针变量还可以指向数种

温馨提示

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

评论

0/150

提交评论