c语言程序设计 算法ppt,c程序设计_5_C语言程序设计(ppt课件)_ppt_大学课件预览_高等教育资讯网...

? 第一章 C语言概述

? 第二章 数据类型、运算符与表达式

? 第三章 最简单的 C程序设计

? 第四章 逻辑运算和判断选取控制

? 第五章 循环控制

? 第六章 数组

? 第八章 编译预处理

? 第九章 指针

? 第十章 结构体与共用体

? 第十二章 文件的基本操作

? 第十三章 位运算

§ 4.4 switch 语句 –––开关语句

问题, 当某一表达式有 n个取值,每一取值执行一

语句,则如果用内嵌 if十分繁锁,而用 switch简单,

一般形式, switch(表达式 )

{ case 常量表达式 1,语句 1

case 常量表达式 2,语句 2

?

case 常量表达式 n,语句 n

default, 语句 n+1

}

例, 根据成绩等级打印百分数段,

switch (grade)

{ case 'A',printf ("85~100\n");

case 'B',printf ("70~84\n");

case 'C',printf ("60~69\n");

case 'D',printf ("<60\n");

default,printf ("error\n");

}

? 根据表达式的取值,判断其与哪一个

常量表达式相等。如 =表达式 i,则自语

句 i开始执行,直到语句 n+1止。

? 若与所有常量表达式值不相等,则从

default后的语句开始执行。

功能,

例如, /*exp55.c*/

#include

main()

{ char grade;

scanf("%c",&grade);

switch (grade)

{ case 'A':printf("85-100\n");

case 'B':printf("70-84\n");

case 'C':printf("60-69\n");

case 'D':printf("<60\n");

default:printf("Error\n");

}

}

运行结果,

A?

程序运行结果不在预料之中!

产生错误的原因, 没有完全起到分支作用。

85-100

70-84

60-69

<60

Error

switch (表达式 )

{ case 常表 1,语句 1;

break;

case 常表 2, 语句 2;

break;

… …

case 常表 n, 语句 n;

break;

default,语句 n+1;

}

一般形式为,

解决办法, 增加 break语句,使之跳出 switch结构。

修改程序为, /*exp56.c*/

#include

main()

{ char grade;

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");

}

}

1,常量表达式的值必须互不相等,否则会有

二异性。

2,case顺序无关紧要。

3,不一定非用 break不可,有时几种情况合并

执行一组语句。

注意

switch (grade)

{case 'A',

case 'B',

case 'C',printf(">60\n");

break;

case 'D',printf("<60\n");

break;

}

例如,

§ 4.5 程序举例

例 1,写一程序,输入年号,判断是否为闰年。

1,算法, 根据闰年的判断条件为下列条件之一,

? 当年号能被 4整除但不能被 100整除时,它为闰年。

? 当年号能被 400整除时,它为闰年。

设用变量 year表示年号,leap为待置值变量,当 year

为闰年,leap?1,否则 leap?0,

输入 year

year%4=0

year%100=0

leap?0

leap?1

yes A

No

No

yes

2,流程图

year%400=0

leap?1

leap=0

打印非闰年 打印是闰年

结束

leap?0

yes

No yes

No

A

3,程序, #include

main ( )

{ int year,leap;

scanf("%d",&year);

if (year%4= =0)

{ if (year%100= =0)

{ if (year%400= =0)

leap=1;

else

leap=0; }

else

leap=1;}

else

leap=0;

if (leap)

printf("%d is",year);

else

printf("%d is not",year);

printf ("a leap year\n");

}

运行情况如下,

第二次,2000 ?

2000 is a leap year

第一次,1989 ?

1989 is not a leap year

if ( ( year%4=0)&& year%100!=0) |

(year%400= =0))

leap=1;

else leap=0;

注,上述条件也可用一个逻辑表达式表示为

§ 5.1 概述

前面已介绍了顺序结构,选择结构,本章

介绍循环结构。

如, sum=1+2+3+…+100;,i100

1i

?

?

实际问题, 一组重复执行的语句。

可用循环结构解决。

C语言一般采用三种形式循环

1,while 语句

2,do …while 语句

3,for语句

另, 用 if语句与 goto语句的结合也可构成循环,

§ 5.2 goto语句及与 if语句构成循环

1,goto语句

2,与 if构成循环,

例, 求

10021

1 0 0

1

?????

?

?

i

i

#include

main ( )

{ int i,sum=0;

形式, goto标号 ;

功能, 无条件转向标号处。

标号,用标识符命名。

i=1;

loop:if (i<=100)

{sum=sum+i;

i++;

goto loop;}

printf(”sum=%d",sum);

}

运行结果如下,

sum=5050

#include

main ( )

{ int sum=0,i=0;

loop,sum=sum+i;

i + +;

if (i<=100) goto loop;

printf ("sum=%d",sum);

}

上面的程序相当于当型循环,可改为直到型,

建议,尽可能的不用 goto语句,以免破坏程

序的结构化。

§ 5.3 while语句

1,形式, while (表达式 )

语句

2,执行过程, 先判断表达式的值。若 ?0.则执行其后

面的语句,否则 while执行完毕。

专门的 当型 循环语句 ––while语句

3,流程图,

表达式

语句

?0

=0

下一语句

将上述例子用 while语句写出

while (i<=100)

{ sum+ =i;

i++;

}

? 语句中应有使表达式 =0的语句。

否则会出现无限循环 –––"死 "循环。

注, ?若 while后面的语句 为复合语句,必须加 { }

? 语句有可能一次也不执行

§ 5.4 do … while语句

一种专门的,直到型” 循环语句。

2,执行过程, 先执行语句,再判表达式的值,若 ?0,再

执行语句,否则结束循环

3,流程,

语句

表达式

?0

=0

1,形式, do语句 while(表达式 );

#include

main ( )

{ int i,sum=0;

i=1;

do

{sum=sum+i;

i++;

}

while (i<=100);

printf("%d",sum);

}

程序如下,

注, 1,do····while结构的作用与 while基本

相同。

2、语句至少要执行一次。

§ 5.5 for语句

1,形式

?、计算初始表达式的值。

?、判断条件表达式,若条件表达式的值 ?0,则执行语句。

若 条件表达式的值 =0,则跳出循环体。

?、计算循环表达式。

?、转到第 ?步。

一种形式更为灵活的循环语句。

2.执行过程

for(初始 表达式 ;条件表达式 ; 循环表达式 )

语句

3,流程, 计算表达式 1

求表达式 2值

语句

计算表达式 3

结束 for语句

=0(假 )

?0(真 )

用 for语句重写上述例子,

for用 while代替的流程,

表达式 1;

while(表达式 2)

{ 语句

表达式 3;

}

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

sum+=i;

for语句完全可以用 while代替,

但 for直观、简单、方便。

4,for语句的几种特例

例, 任意输入两个整数 a,b,求 ??

?

bi

ai

i

#include

main ( )

{ int i,j,a,b,sum;

printf ("please input two number!\n");

scanf ("a=%d,b=%d",&a,&b);

i=a; j=b; if (a>b) {i=b; j=a;}

for (; i<=j; i++)

sum=sum+i;

printf (" \n sum=%d",sum);

}

? 可以省略初始表达式,但须保留分号 ;且在 for之前必须给

循环变量赋值 ;

? 条件表达式一般不可省略,否则为无限循环

相当于, while (1)

{ sum=sum+i;

i++;

}

例, for (i=1; ; i++) sum=sum+i;

相当于条件永真、永不为 0,若用 while表示

? 循环表达式亦可省略,但在循环体中必须有语句

来修改循环变量,以使条件表达式在某一时刻

为 0而正常结束循环。

例, for (sum=0,i=1;i<=100;) /* 没有循环表达式 */

{ sum=sum+i;

i++;

}

? 若同时省略 初始表达式,和 循环表达式,则相当

于 while语句。

相当于 while (i<=100)

{sum+= i;

i++;

}

例, for (; i<=100;) {sum+=i; i++;}

? 三个表达式均省略 即 for(;;)语句则相当于 while(1)

语句,为无限循环。

?初始表达式, 循环表达式 可以是逗号表达式,以

使循环变量值在修改时可以对其它变量赋值。

如, for (sum=0,i=1; i<=100; i++,i++)

相当于,sum=0;

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

? 条件表达式可以是关系表达式,也可以是数值表

达式或字符表达式。只要值 ?0.即执行循环体,

例, for (i=0; (c=getchar( ))!='\n'; i+=c);

条件表达式

§ 5.6 循环的嵌套

与其它语言一样,当循环体中又包含了另一个完

整的循环语句时 –––嵌套。

C语言 有三种循环语句,均可以相互嵌套,

例 1,while ( )

{…

while ( )

{…

}

}

例 2,for (; ;)

{…

while ( ) { }

do

{ } while ( );

}

均为正确的嵌套

但,

while ( )

{ …

while ( )

{

}…

}

for (; ; )

{ for (; ; )

{…

}

}

不能理解为正确的形式。但要注意语句的

包含关系。

§ 5.7 几种循环的比较

1,对于同一问题,三种循环可相互替代。但不

要用 goto语句。

2,for循环功能强于 while和 do…while 。 但若不

是明显地给出循环变量初终值 (或修改条件 ),

则应用 while 或 do …while 。 以增强程序的结

构化和可读性。

3,要防止无限循环 ––死循环。

4,循环过程中,为了结束本次循环或跳出整个

循环。分别要用到 continue和 break语句。

§ 5.8 break语句和 contiune语句

问题, 计算圆的面积 ?r2,半径取 1,2,3,4…,

当面积 >100时结束。

5.8.1 break语句 (作用,从 循环体中退出 )

pi =3.14159;

for( r=1; r<=10; r++)

{ area=pi?r?r;

if (area>100) break;

}

printf ("%f",area);

}

注意, break只能用于 循环语句 和 switch语句。

程序段,

5.8.2 continuce语句

程序一:不用 continue语句,

#include

main( )

{ int n;

for (n=100; n<200; n++)

if (n%3!=0) /*n不能被 3整除 */

printf("%d",n);

}

例, 编写程序,打印 100~200中不能被 3整除的数。

作用:结束 循环。

程序二:使用 continue语句,

main ( )

{ int n;

for (n=100; n<=200; n++)

{ if (n%3= =0) /*n能被 3整除 */

continue;

printf ("%d",n);

}

}

§ 5.9 程序举例

例 1,求 Fibonacci数例, 1,1,2,3,5,8,… 前 40个数。

规律, F1=1,F2=1

Fn=Fn – 1 + Fn – 2 (n>2)

程序要点,

? 每输出 4个数时换行。

? f1=f1+f2;

f2=f1+f2; 交替的结果正好为一序列

程序如下,

/*exp61.c*/

#include

main ( )

{ long int f1,f2;

int i;

f1=1; f2=1;

for (i=1; i<=40; i++)

{ printf(%12ld %12ld ",f1,f2);

if (i%2= =0)

printf("\n ");

f1=f1+f2;

f2=f2+f1;

}

}

f1=1,f2=1

for i=1 to 40

输出 f1,f2

f1=f1+f2

f2=f2+f1

运行结果为,

1

5

34

233

1597

10946

75025

514229

3524578

24157817

1

8

55

377

2584

17711

1211393

832040

5702887

39088169

2

13

89

610

4181

28657

196418

1346269

9227465

63245986

3

21

144

987

6765

46368

317811

2178309

14930352

102334155

? 判一个数 m是否为素数的方法,

? 每打印 10个数,换一次行。

m当用 2,3,… 的整数去除它时均不能除

尽,则为素数。

例 2,求 100~200的素数,

int m,k,i,n=0;

for (m=101; m<=200; m=m+2)

{if ( n%10= =0)

printf("\n");

k=sqrt(m);

for (i=2; i<=k;i++)

if (m%i= =0) break;

if (i>=k+1)

{ printf("%d ",m);

n=n+1;

}

}

}

/*exp62.c*/

#include

#include

main ( )

{

程序如下,

101 103 107 109 113 127 131 137 139 149

151 157 163 167 173 179 181 191 193 197

199

运行结果如下,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值