C语言函数循环
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
讲授:汪瑾
递归问题:
age ( int n ) 有5个人坐在一起,问第五个人多少岁? { int c ; 他说比第4个人大2岁。问第4个人岁数, if ( n==1) c=10; 他说比第3个人大2岁。问第三个人, else c=age(n-1)+2; 又说比第2人大两岁。问第2个人,说 return(c); 比第一个人大两岁。最后问第一个人, } 他说是10岁。请问第五个人多大? main() { printf ( "%d", age(5) ); }
概述
C语言可实现循环的语句: 用goto 和 if 构成循环 while 语句 do ~ while 语句 for 语句
goto语句及用goto构成循环
goto语句一般格式: goto 语句标号; ….….. 标号:语句;
讲授:汪瑾
循环型程序设计
功能:无条件转移语句 说明:
讲授:汪瑾
do~while语句
一般形式: do 循环体语句; while(表达式);
do
执行流程:
循环体 真(非0) while expr 假(0)
讲授:汪瑾
do~while语句特点和说明
特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 do~while可转化成while结构
讲授:汪瑾
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z 三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和 x比,c说他不和x,z比,请编程序找出三队赛手的名单。 main() { char i , j , k ; /*i是a的对手,j是b的对手,k是c的对手*/ for ( i=‘x’ ; i<=‘z’ ; i++ ) for ( j=‘x’ ; j<=‘z’ ; j++ ) { if ( i != j ) for ( k='x'; k<='z'; k++ ) { if ( i!=k && j!=k ) { if (i!='x‘ && k!='x‘ && k!='z‘ ) printf("order is a--%c\tb--%c\tc--%c\n",i,j,k); } } } }
1, 1, 2, 3, 5, 8, 13, 21....
讲授:汪瑾
main ( ) { long fn1, fn2, fn3 ; int i, n ; printf ( "输入月数(少于40): “ ); scanf ( "%d", &n ) ; if ( n<1 ) n=1; fn1 = fn2 = 1; printf ( "M.1:%10ld“ , fn1 ) ; if ( n>1 ) printf ( "M.2:%10ld“ , fn2 ) ; for ( i=3; i<=n; i++ ) { fn3= fn1 + fn2 ; if ( i%4==0 ) printf ("\n") ; printf("M.%2d:%10ld",i,fn3); fn1=fn2; fn2=fn3; } }
while
expr
真(非0) …… continue; while expr ……
continue;
…...
continue;
…...
真(非0)
expr3
假(0)
讲授:汪瑾
百马百担
有100匹马,驮100担货,其中大马驮3担,中马驮 2担,两匹小马驮1担,请列出所有的可能组合
for ( i=1; i<=100; i++ ) { for ( j=1; j<=100-i; j++ ) { k = 100 – i – j ; if ( ( 3*i + 2*j + k/2.0 ) == 100 ) printf ( “ %d, %d, %d \n ", i, j, k ); } }
(1) while() { …… while() { …… } …... } (3) while() { …… do { …… }while( ); ……. }
(4) for( ; ;) { …… do { …… }while(); …… while() { …… } …... }
(2) do { …… do { …… }while( ); …... }while( );
讲授:汪瑾
猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不
瘾,又多吃了一个,第二天早上又将剩下的桃子吃
掉一半,又多吃了一个。以后每天早上都吃了前一 天剩下的一半零一个。到第10天早上想再吃时,见 只剩下一个桃子了。求第一天共摘了多少。
逆向思维
讲授:汪瑾
main() { int day, x1, x2 ; day = 9 ; x2 = 1 ; while ( day > 0 ) { x1 = (x2+1) * 2 ;
讲授:汪瑾
例:#include<stdio.h>
例:#include<stdio.h>
main( ) { int i=0; for(i=0;i<10;i++) putchar(‘a’+i); }
main( ) { int i=0; for(;i<10;i++) putchar(‘a’+i); }
例:#include<stdio.h> 例:#include<stdio.h> 运行结果: abcdefghij
不能用整数作标号
只能出现在goto所在函数内,且唯一 只能加在可执行语句前面 限制使用goto语句
讲授:汪瑾
例 用if 和goto语句构成循环
#include <stdio.h> main() { int i,sum=0; i=1; loop: if (i<=100) { sum+=i; i++; goto loop; } printf("%d",sum); }
讲授:汪瑾
void main() { char str[100]; char newstr[100]; int n, i, j; i=0; j=0; gets ( str ) ; while ( str[i] != '\0‘ ) { if ( !alread_saved ( str[i],newstr,j ) ) { newstr[j] = str[i] ; j++ ; } i++; } newstr [j] = '\0‘ ; puts ( newstr ) ; }
讲授:汪瑾
亲密数
如果整数A的全部因子(包括1,不包括A本身)之和等
于B;且整数B的全部因子(包括1,不包括B本身)之和 等于A,则将整数A和B称为亲密数。求3000以内的全 部亲密数。
穷举问题
讲授:汪瑾
main() { int a, i, b, n; for (a=1; a<3000; a++)
讲授:汪瑾
求和累加:
求s=a+aa+aaa+aaaa+aa...a的值,其 中a是一个数字。例如 2+22+222+2222+22222(此时共有5个数 相加),几个数相加有键盘控制。
main ( ) { int a, n, count = 1 ; long int sn = 0, tn = 0 ; printf ("please input a and n\n“ ) ; scanf ( "%d, %d", &a, &n ) ; printf ( "a=%d, n=%d\n", a, n ); while ( count<=n ) { tn = tn+a ; sn = sn+tn; a = a*10 ; ++count ; } printf ( "a+aa+...=%ld\n“ , sn ) ; }
C程序流程设计
程序的三种基本结构
选择型程序设计 循环型程序设计 辅助控制语句
讲授:汪瑾
程序的三种基本结构
结构化程序设计
基本思想:任何程序都可以用三种基本结构表示,限
制使用无条件转移语句(goto)
结构化程序:由三种基本结构反复嵌套构成的程序 优点:结构清晰,易读,提高程序设计质量和效率
/*第一天的桃子数是第2天桃子数加1后的2倍*/
x2 = x1; day -- ; } printf ( "the total is %d\n", x1 ) ;
}
讲授:汪瑾
古典问题:斐波那契数列
有一对兔子,从出生后第3个月起每个月都
生一对兔子,小兔子长到第三个月后每个月
又生一对兔子,假如兔子都不死,问每个月 的兔子总数为多少?
三种基本结构
顺序结构
A B
A B N-S图
讲授:汪瑾
流程图
选择结构
二分支 多分支
真
P
假
真
B A
P B
假
A
k
k=k1 A1 k=k2 A2 k=kn k=ki
...
Ai
...
An
讲授wk.baidu.com汪瑾
循环结构
P 真
假
当P为真 A
当型循环结构
A
直到型循环结构
假
A
P 真
A 直到P为真
讲授:汪瑾
循环型程序设计
讲授:汪瑾
while语句
一般形式: while(表达式) 循环体语句;
while
执行流程:
expr
假(0) 真(非0) 循环体
讲授:汪瑾
例子 用while循环求
#include <stdio.h> main() { int i,sum=0; i=1; while(i<=100) { sum=sum+i; i++; } printf("%d",sum); }
任何其它语句之中
讲授:汪瑾
辅助控制语句(图解1)
while 假(0) expr
真(非0) …… break; …... 真(非0) while expr do
……
break; ……
假(0)
讲授:汪瑾
for
expr1
辅助控制语句(图解2)
switch 假(0)
expr2
真(非0) …… break; expr case
main( ) ) main( { { intint i=0; i=0; for(;i<10;putchar(‘a’+i),i++) for(;i<10;) ; putchar(‘a’+(i++)); } }
讲授:汪瑾
循环的嵌套
三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程
const 1 语句组1
break;
const 2 语句组2
break; …...
const n 语句组n
break;
default 语句组
break;
…...
expr3
讲授:汪瑾
continue语句
for expr1 假(0) expr2 真(非0) …… …… do 假(0)
功能:结束本次循环,跳过循环体中尚未执 行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中
循环体
While循环
假(0) expr 真(非0) 循环体
讲授:汪瑾
一般形式: for([expr1] ;[ expr2] ;[ expr3])
循环体语句;
for expr1
执行流程:
for 语 句
假(0) expr2 真(非0) 循环体 expr3
讲授:汪瑾
for语句一般应用形式
for(循环变量赋初值;循环条件;循环变量增值) { 循环体语句; } 说明: for语句中expr1, expr2 ,expr3 类型任意,都可省略,但 分号;不可省 expr1; 无限循环: for(;;) while(expr2) for语句可以转换成while结构 { 循环体语句; expr3; }
讲授:汪瑾
调试例题:
输入一个长度不超过 100 的字符串, 删除串中的重复字符。 int alread_saved (char lastchar, char newstr[], int j ) { int i = 0 ; while ( i < j ) { if ( lastchar == newstr[i] ) return 1; i++ ; } return 0 ; }
/*穷举3000以内的全部整数*/
{ for ( b=0, i=1; i<=a/2; i++ ) if ( !(a%i) ) b += i ; for ( n=0, i=1; i<=b/2; i++ ) if ( ! ( b%i ) ) n += i ; if ( n==a && a!= b) printf ( "%4d..%4d ", a , b ) ; } }
讲授:汪瑾
嵌套循环的跳转
禁止: 从外层跳入内层 跳入同层的另一循环 向上跳转
讲授:汪瑾
辅助控制语句
break语句
功能:在循环语句和switch语句中,终止并跳出循 环体或开关体 说明: break只能终止并跳出最近一层的结构
break不能用于循环语句和switch语句之外的