71
第第 / 第第 C 第第第第第第II 第第第第第第第第第第第第

第九 / 十讲 C 程序设计导引( II )

  • Upload
    pancho

  • View
    178

  • Download
    0

Embed Size (px)

DESCRIPTION

第九 / 十讲 C 程序设计导引( II ). 北京大学信息科学技术学院. 主要内容. 语句与控制流 标准库函数:输入输出控制 其他标准库函数 程序风格. 1 、语句与控制流. 高级程序设计语言的运行单位是 语句 。 在 C 语言中,诸如表达式: x = 1 、 i++ , … 等之后加上 分号 就构成了 简单的语句 (所有的表达式加上分号之后都可以形成语句,但它们并不都是有效的语句,如: x + 5 )。 C 语言中的语句种类大致包括: 变量定义与初始化语句,如: int x, y = 1; 赋值语句,如: x = y + z; - PowerPoint PPT Presentation

Citation preview

Page 1: 第九 / 十讲   C 程序设计导引( II )

第九 / 十讲 C 程序设计导引( II )

北京大学信息科学技术学院

Page 2: 第九 / 十讲   C 程序设计导引( II )

语句与控制流 标准库函数:输入输出控制 其他标准库函数 程序风格

主要内容

Page 3: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流

高级程序设计语言的运行单位是语句。 在 C 语言中,诸如表达式: x = 1 、 i++ ,… 等之后加上分号就构成了简单的语句(所有的表达式加上分号之后都可以形成语句,但它们并不都是有效的语句,如: x + 5 )。 C 语言中的语句种类大致包括:

变量定义与初始化语句,如: int x, y = 1; 赋值语句,如: x = y + z; 函数调用语句,如: scanf(“%d”, &n); 自增(减)语句,如: i++; - -i; 程序控制语句 空语句 ……

Page 4: 第九 / 十讲   C 程序设计导引( II )

程序的执行顺序是由程序中的程序控制语句规定的。一般情况下,程序顺序地执行语句,语句出现的顺序就是其执行顺序(顺序程序结构)。 程序控制语句包括循环控制语句,使得程序能够反复执行某些语句(循环程序结构,将 n 条相同的语句简单地复制会使程序变得不合理的冗长)。此外,还包括分支控制语句,用于控制多路选一的分支情况(分支程序结构)。

1 、语句与控制流

Page 5: 第九 / 十讲   C 程序设计导引( II )

程序控制语句及其控制说明: 分支控制语句: if-else, switch-case/default

循环控制语句: while, do-while, for

这 2 种语句都是用大括号( {…… } )把修饰性描述和语句组

合在一起的,称为复合语句。复合语句在语法上和简单语句是

一样的。

此外,还有一些与程序转移控制有关的语句:

break, continue, return, goto

1 、语句与控制流

Page 6: 第九 / 十讲   C 程序设计导引( II )

对于复杂的实际问题,常常要求依据条件来改变程序的执行顺序,选择所要执行的语句。“ 如果今天不下雨,我就去游泳;否则就在家里读书。”

分支控制语句包括: 条件语句: if-else

多分支语句(开关语句): switch-case/default

1 、语句与控制流—— 分支控制语句

Page 7: 第九 / 十讲   C 程序设计导引( II )

if (expression1){

statements1;}else{

statements2;}

1 、语句与控制流—— 条件语句 if-else 的形式

if (expression1){

statements1;}

if (expression1){

statements1;}else if (expression2){

statements2;}…else if (expressionN){

statementsN;}else{

statements(N+1); }

expression

statements1

expression

statements1

真 假

statements1

exp1真 假

stmts1 exp2

stmts1 …

Page 8: 第九 / 十讲   C 程序设计导引( II )

表达式 expression 的值应该是数值( 0 表示假,非 0 表示真)。通常表达式 expression 是关系表达式或逻辑表达式。如:

x>(y+1) , x>y && x>z , x>10 || x<5

每个单一语句后面都要有分号。为了增强程序的可读性,应将 if 或 else 后的语句用 { } 括起来。

else if 和 else 子句是任选的,不能单独作为语句使用,它必须和 if 语句配对使用,并且总是与离它最近的 if 配对。

1 、语句与控制流—— 条件语句 if-else

Page 9: 第九 / 十讲   C 程序设计导引( II )

// 求 2 个数的最大者int a = 123;int b = 456;if( a>b ){ printf(“The bigger one is: %d”, a);}else{ printf(“The bigger one is: %d”, b);}

1 、语句与控制流—— 条件语句 if-else 示例

// 判断一个数是否偶数int a = 123;if( a%2==0 ){ printf(“%d is an even.”, a);}

// 求 3 个数的最大者int a = 123;int b = 456;int c = 237;if( a>b && a>c ){ printf(“The biggest one is: %d”, a);}else if( b>a && b>c){ printf(“The biggest one is: %d”, b);}else{ printf(“The biggest one is: %d”, c);}

给定一个年份,判断是否闰年?

Page 10: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 条件语句 if-else

条件表达式“ ? :” 能够部分替代 if-else 语句,如:

x = (a>b) ? (a-b) : (b-a);======================if (a>b){ x = a - b;}else{ x = b - a;}

但是,初学者最好不使用条件表达式,而用 if-else

语句来替代。

Page 11: 第九 / 十讲   C 程序设计导引( II )
Page 12: 第九 / 十讲   C 程序设计导引( II )
Page 13: 第九 / 十讲   C 程序设计导引( II )
Page 14: 第九 / 十讲   C 程序设计导引( II )
Page 15: 第九 / 十讲   C 程序设计导引( II )

switch (expression)

{

case value1 :{

statements1; break;}

……case valueN :{ statementsN; break;}[default :{

defaultStatements;}]

}

1 、语句与控制流—— 多分支语句

switch-case/default

另一类问题,通常我们需要

将一个表达式的值与多个不

同的常量按顺序进行比较,

选择其中的匹配项,执行相

应部分的语句。这就是多分

支语句。

Page 16: 第九 / 十讲   C 程序设计导引( II )

表达式 expression 的值类型必须是整型或字符型: char,

short, int, long 。 case 子句中的值 valueI 也必须是整型或字符型常量,而且所有 case 子句中的值应是不同的。 执行 switch 语句时,首先对表达式 expression 求值,然后与每个 case 子句中的常量值比较,若找到匹配的常量(相等),程序就执行该分支的语句。

1 、语句与控制流—— 多分支语句

switch-case/default

Page 17: 第九 / 十讲   C 程序设计导引( II )

break 语句用来在执行完一个 case 分支后,使程序跳出switch 语句,即终止 switch 语句的执行。(如果某个 case 分支后没有 break 语句,程序将不再做比较而执行下一个分支,直到 break 语句或该复合语句结束。) 当没有 case 子句匹配时,就执行 default 子句。 default

子句是任选的(可有可无)。若无 default 子句,此时switch 语句就什么动作也没有做。 switch 语句的功能可以用 if-else 语句来实现,但某些情况下,使用 switch 语句更简炼。

1 、语句与控制流—— 多分支语句

switch-case/default

Page 18: 第九 / 十讲   C 程序设计导引( II )

int a = 100;int b = 20;int c; char oper;scanf(“%c”, &oper);switch(oper){

case ‘+’:{ c = a + b; break;}case ‘-’:{ c = a - b; break;}

1 、语句与控制流—— 多分支语句

switch-case/default

case ‘*’:{ c = a * b; break;}default :{ if( b==0) { c = a; } else { c = a / b; } break;}

}

输入一个算术运算符,求 2 个数的运算值。

Page 19: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 多分支语句

switch-case/default switch (expression)

{

case value1 :case value2 :case value3 :{

statements1; break;}

……case valueN :{ statementsN; break;}[default :{

defaultStatements;}]

}

当多个匹配项做相同的事情时,则可以用这种形式。

Page 20: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 多分支语句

switch-case/default

int year, month, days;

scanf(“%d”, &year, &month);

switch (month){

case 1 :case 3 :case 5 :case 7 :case 8 :case 10 :case 12 :{ days = 31; break;}

计算某年某月的天数。case 4 :case 6 :case 9 :case 11 :{ days = 30; break;}default : // month == 2{ if( (year%4==0&&year%100!=0) || (year%400==0) ) { days = 29; } else days = 28;}

}

Page 21: 第九 / 十讲   C 程序设计导引( II )

int year, month, days;

scanf(“%d”, &year, &month);

if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12 ){

days = 31;}else if (month==4 || month==6 || month==9 || month==11 ){ days = 30;}else //month == 2{ if( (year%4==0&&year%100!=0) || (year%400==0) ) {

days = 29;}else days = 28;

}计算某年某月的天数。

1 、语句与控制流—— 多分支语句

switch-case/default

Page 22: 第九 / 十讲   C 程序设计导引( II )
Page 23: 第九 / 十讲   C 程序设计导引( II )

很多实际问题中会遇到具有规律性的重复运算,因此,在程序中就需要将某些语句重复执行。 比如,求 1 到 N 的和,如果没有循环,我们该如何编程? 1 + 2 + 3 + … + N ???

1: int N, i, S = 0;

2: i = 1;

3: if( i<=N )

4: S = S + i;

5: i = i + 1;

6: 回到 3

1 、语句与控制流—— 循环控制语句

Page 24: 第九 / 十讲   C 程序设计导引( II )

循环控制语句包括: 当型循环语句: while

直到型循环语句: do-while

另一种 当型循环语句: for

1 、语句与控制流—— 循环控制语句

Page 25: 第九 / 十讲   C 程序设计导引( II )

循环语句 while (当型循环) [initialization] // 初始化条件 while (termination){ // 循环条件

body; // 循环体[iteration] // 迭代,变更循环条件

}

当表达式 termination 的值为“真”(非 0 )时,执行 {} 中的语句,否则终止循环。

1 、语句与控制流—— 循环语句 while (当型循

环)

body

init

t

itera

Page 26: 第九 / 十讲   C 程序设计导引( II )

int sum = 0; // 注意 sum 要赋初值int i = 1; // initialization

while ( i<=100 ) // termination{

sum = sum + i;

i++; // iteration}

while 循环

求 1 ~ 100 的和

1 、语句与控制流—— 循环语句 while (当型循

环)

Page 27: 第九 / 十讲   C 程序设计导引( II )
Page 28: 第九 / 十讲   C 程序设计导引( II )
Page 29: 第九 / 十讲   C 程序设计导引( II )

循环语句 do-while (直到型循环) [initialization] // 初始化条件 do{

body; // 循环体[iteration] // 迭代,变更循环条件

} while (termination) ; // 循环条件

首先执行一遍 {} 中的语句,当表达式 termination 为“真”(非 0 )时,继续执行 {} 中的语句,否则终止循环。

1 、语句与控制流—— 循环语句 do-while (直到型循环)

t

body

init

itera

Page 30: 第九 / 十讲   C 程序设计导引( II )

int sum = 0; // 注意 sum 要赋初值int i = 100; // initializationdo

{

sum += i;

i--; // iteration

}while( i>0); // termination

do-while 循环

求 1 ~ 100 的和

1 、语句与控制流—— 循环语句 do-while (直到型循环)

Page 31: 第九 / 十讲   C 程序设计导引( II )
Page 32: 第九 / 十讲   C 程序设计导引( II )

循环语句 for (另一种当型循环)for (initialization; termination; iteration)

{

body; // 循环体}

for 语句执行时,首先执行初始化操作initialization ,然后判断终止条件 termination是否满足,如果满足,则执行循环体中的语句 (body) ,最后执行迭代部分 iteration 。完成一次循环后,重新判断终止条件 termination。

t

body

itera

init

1 、语句与控制流—— 循环语句 for (另一种当型循

环)

Page 33: 第九 / 十讲   C 程序设计导引( II )

for 语句中初始化、终止以及迭代部分都可以为空语句 ( 但分号不能省 ) ,三者均为空的时候,相当于一个无限循环。

for( ; ; )

{

……

}

在初始化部分和迭代部分可以使用逗号语句,来进行多个操作。逗号语句是用逗号分隔的语句序列。

for( int i=0, int j=10; i<j; i++, j--){……}

1 、语句与控制流—— 循环语句 for (另一种当型循环)

Page 34: 第九 / 十讲   C 程序设计导引( II )

int sum = 0; // 注意 sum 要赋初值int i;

for( i=1; i<=100; i++ ) // initialization; termination; iteration{

sum = sum + i;

}

for 循环 求 1 ~ 100 的和

1 、语句与控制流—— 循环语句 for (另一种当型循环)

Page 35: 第九 / 十讲   C 程序设计导引( II )

在 while, do-while, for 这三种循环控制语句中,都包括下面三个要素:

initialization // 初始化条件 termination // 循环条件 iteration // 迭代,变更循环条件

在使用循环控制语句时,要注意正确处理以上三个要素,以避免死循环。 要清楚循环的执行次数:往往容易多一次、少一次。

1 、语句与控制流—— 循环控制语句

Page 36: 第九 / 十讲   C 程序设计导引( II )

int total = 1; // 注意 total 要赋初值int i = 1; // initialization

while ( i<=15 ) // termination{

total = total * i;

i++; // iteration}

求 15 !

1 、语句与控制流—— 循环控制语句

Page 37: 第九 / 十讲   C 程序设计导引( II )

程序转移相关语句包括: break

continue

return

goto

1 、语句与控制流—— 其它控制语句

Page 38: 第九 / 十讲   C 程序设计导引( II )

在 switch 语中, break 语句用来终止 switch 语句的执行,使程序从整个 switch 语句后的第一条语句开始执行。

在循环语句中 (while, do-while, for) , break 用于终止并跳出循环,从紧跟着循环体代码段后的语句执行。

break 语句的格式为:break;

1 、语句与控制流—— 程序转移相关语句 break

int i;for( i= 0; i <10; i++ ){ … if( i == 5 ) { break; } ……}

到第 5 次循环时,就不再继续循环了

Page 39: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 程序转移相关语句 break

int a[10], i;for( i= 0; i <10; i++ ){ scanf(“%d”, &a[i]);}for( i= 0; i <10; i++ ){ if( a[i] < 0 ) { break; }}printf(“The first negative element is %d.”, i);

寻找一组数中第一个小于 0 的元素的下标。

Page 40: 第九 / 十讲   C 程序设计导引( II )

continue 语句用来结束本次循环 (while, do-while, for) ,跳过循环体中 continue 之后尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。注意:在进行终止条件的判断前,都应先保证执行迭代语句。它的格式为:

continue ;

1 、语句与控制流—— 程序转移相关语句 continue

for( int i= 0; i <10; i++ ){ if( i == 5 ) { continue; } ……}

第 5 次循环时,什么也不做

Page 41: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 程序转移相关语句 continue

求 1 ~ 100 之间除 7 的倍数之外其他数的和?

int sum = 0;int i = 1; // initializationwhile ( i<=100 ) // termination{ if( i%7 ==0 ) { i++; // iteration continue; } sum = sum + i; i++; // iteration}

Page 42: 第九 / 十讲   C 程序设计导引( II )

return 语句从当前函数中退出,返回到调用该函数的语句处,并从紧跟该语句的下一条语句继续程序的执行。返回语句有两种格式:

return expression; // 当函数需要返回某种类型数据时 return; // 当函数的返回类型为 void 时

单独一条 return 语句放在函数中间时,会使程序不能正常运行,因为其后的语句将不会执行到。若真需要退出函数,可以通过将 return 语句嵌入某些语句(如 if-else )来使程序在未执行完函数中所有语句时退出。

1 、语句与控制流—— 程序转移相关语句 return

Page 43: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 程序转移相关语句 return

void main(){ … … return;}

int main(){ … … return 0;}

#include <stdio.h>float getArea(float r);void main(){ float area, radius = 3.0f; area = getArea(radius); printf(“Area is %f.”, area); return;}float getArea(float r){ float s; s = 3.14159*r*r; return s;}

Page 44: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 程序转移相关语句 goto

程序跳转控制语句,不提倡使用。与程序标号(也是一个标识符,其后要跟一个“ :” )一起使用:

for(…){ … if(…) goto error; …}…error: ……

也可以用于实现循环控制

int i=1, sum=0;loop: sum += i; i++;if (i<=100) goto loop;…

Page 45: 第九 / 十讲   C 程序设计导引( II )

仅由一个分号组成的语句为空操作语句。空语句不做任何操作,它在一些特殊情况下是很有用的,如用循环来跳过输入字符开始的空格或制表符:

while( ( c = getchar() ) = = ‘ ’ || c = = ‘\t’ ) ;

不要以为空语句不做任何操作就可以滥用它,有时会造成语法错误:

1 、语句与控制流—— 空语句

if(d>=0){ x = 1;};else{ x = 2;}

else 子句和前面的 if子句被空语句分隔开了,这会导致程序语法错误。

Page 46: 第九 / 十讲   C 程序设计导引( II )

程序 = 函数的集合

函数 = 语句的集合

语句 = 简单语句 + 复合语句

简单语句 = 变量定义与初始化语句、赋值语句、函数调用语句、自增(减)语句、 return 、空语句, …

复合语句 = if-else 、 switch-case/default 、 while 、do-while 、 for 、 break 、 continue 、 goto

1 、语句与控制流

Page 47: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流

分支控制语句和循环控制语句中大括号( {…… } )括起来的语句,可以是简单语句,也可以是这两种复合语句本身。这样, C 语言程序中的语句就形成了一种嵌套的层次结构,并且原则上这种嵌套的层次是可以不断扩大的。

Page 48: 第九 / 十讲   C 程序设计导引( II )

1 、语句与控制流—— 程序控制语句的嵌套if(…){

while ( … ){ … if( … ) { … } else if( … ) { … } else { … } …}

}else{ …}

Page 49: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制

在标准输入输出函数库( stdio.h )中,提供了通过标准输入输出设备(键盘和显示器)进行数据的输入输出函数:

单个字符输入: int getchar() ,返回的是字符的 ASCII

码 格式化输入: int scanf(constrol_string, arg1, arg2, …)

单个字符输出: int putchar(int)

格式化输出: int printf(constrol_string, arg1, arg2, …)char c;int n;float f;c = getchar();scanf(“%d %f %c %s”, &n, &f, &c);

putchar(c);printf(“%d %f %c %s \n”, n, f, c);

Page 50: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制

scanf() 的基本格式控制符有: %d :整数 (int)

int a; scanf(“%d”, &a);

%ld :整数 (long) long b; scanf(“%ld”, &b);

%hd :整数 (short) short d; scanf(“%hd”, &d);

%c :字符 (char) char c; scanf(“%c”, &c);

%s :字符串 ( 字符数组 ) ,第 12讲中介绍

char s[20]; scanf(“%s”, s);

%f :单精度浮点数 (float) float x; scanf(“%f”, &x);

%lf :双精度浮点数 (double) double y; scanf(“%lf”, &y);

Page 51: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制

scanf() 主要是将从键盘中输入的数据赋给变量,它要求指示变量的在内存中的地址,才能正确将有关数据赋给变量。在 C 语言中,变量地址的获得是

通过运算符“ &” (取地址运算符)来得到的,如: int x; 则 &x 表示得到变量 x 在内存中的地址。 scanf(“%d”, &x);

Page 52: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制

在同一个 scanf() 函数中输入多个变量的值: char c; int a; float x; double y; scanf(“%c%d%f%lf”, &c, &a, &x, &y);

在 scanf() 中的格式控制中,还可以控制多个输入数据之间的分隔标记,如: scanf(“%c,%d,%f”, &c, &n, &f) ,则在输入数据时各数据之间用“ ,” 作为分割。若多个输入控制符之间没有任何分隔标记,如: scanf(“%c%d%f”, &c, &n,

&f) ,则输入数之间以换行(回车)或空格作为分隔。

Page 53: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制

printf() 的基本格式控制符有: %d :整数 (int) %ld :整数 (long) %c :字符 (char) %s :字符串 ( 字符数组 ) %f :浮点数 (float , double) ,缺省输出 6 位小数 %e :浮点数 (double) ,以科学计数法输出,其输出格式为: [-]m.nnnnnne[+/-]xx

可以用 %.Nf 或 %.Ne 来控制小数的输出位数,如 %.8f ,可以输出 8 位小数, %.10e ,可以输出 10 位小数

%g : %f 和 %e 的紧凑形式,不输出无意义的 0

Page 54: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制

printf() 主要是将变量的值输出到屏幕上去,它只要直接对变量引用即可。

char c=‘a’;

printf(“%c”, c);

int a=10;

printf(“%d”, a);

float x=1.321f;

printf(“%f”, x);

double y=2.7123;

printf(“%f”, y);

printf(“%.10f”, y);

printf(“%g”, y);

printf(“%e”, y);

printf(“%.8e”, y);

Page 55: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制

在 printf() 中的格式控制中,还可以包含其他希望输出字符(串),如:

printf(“\nThis is a %d !”, n); 如果 n 的值为 10 ,则输出效果为:

在 printf() 中,可以只输出一些字符,而不包含变量,如: printf(“\nPlease input data:\n”);

也可以在同一个 printf() 函数中输出多个变量的值,并夹以其他提示字符,如:

double r, s; r = 5.0; s = 3.14*r*r; printf(“\nThe area of a circle with radius %.2f is %.2f.”, r, s);

<空行 >The area of a circle with radius 5.00 is 78.50.

<空行 >This is a 10 !

Page 56: 第九 / 十讲   C 程序设计导引( II )

2 、输入输出控制void main(){ int a; long b; float f; double d;

printf("Please input data:\n"); scanf("%d %ld %f %lf", &a, &b, &f, &d); printf("\nThe integer is %d and %ld.", a, b); printf("\nThe float is %f or %e or %g", f, f, f); printf("\nThe double is %f or %e or %g", d, d, d); printf("\nAnother number is %.10f or %.12e or %g\n", f/a, f/a, f/a);

return;}

Page 57: 第九 / 十讲   C 程序设计导引( II )

多数编程语言都有预选编译好的开发库以支持各种特定的功能

在 C 中,标准开发库以库函数的形式提供,常用的有: 基本输入输出 (stdio.h)

键盘与屏幕: scanf(), printf(), getchar(), putchar(), … 文件操作: fopen(), fclose(), fsanf(), fprintf(), …

数学函数 (math.h) abs(), cos(), sin(), sqrt(), pow(), exp(), log(), log10(), …

字符串处理 (string.h) strlen(), strcat(), strcpy(), strcmp(), …

……

(\Microsoft Visual Studio\VC98\Include)

3 、标准库函数

Page 58: 第九 / 十讲   C 程序设计导引( II )

4 、程序风格

源文件、变量、函数等命名:要体现各自的含义。 适当使用大小写 简洁、清晰 程序书写格式:保证良好的可读性,使程序一目了然。 大括号 {} 的使用与对齐 语句段的对齐 在语句段之间适当空行 语句段之间的层次性 程序注释:帮助了解程序的功能。 文件注释 变量注释 函数注释 语句注释 语句段注释

Page 59: 第九 / 十讲   C 程序设计导引( II )

4 、程序风格—— 一些禁忌

神秘数int map[242760];int i, j;int count = 0;for(i=0; i<578; i++) for(j=0; j<420; j++) if(map[i*420+i]==0) count ++;printf(“%d\n”, count);

#define MAPHEIGHT 578#define MAPWIDTH 420#define BLACK 0int map[MAPHEIGHT * MAPWIDTH];int i, j;for(i=0; i< MAPHEIGHT; i++) for(j=0; j< MAPWIDTH; j++) if(map[i*MAPWIDTH+j]==BLACK) count ++;printf(“%d\n”, count);

Page 60: 第九 / 十讲   C 程序设计导引( II )

4 、程序风格—— 一些禁忌

神秘数main(){ float length ; float area ; scanf(“%f\n”, &length) ; // 正方形的边长 area = length * length ; // 正方形的面积 printf(“The area of the square is %f\n”, area) ; scanf(“%f\n”, &length) ; //圆的半径 area = length * 2 * 3.14159; //圆的周长 printf(“The circumference of the circle is %f\n”, area) ;}

main(){ float edgeLength ; // 正方形的边长 float squareArea ; // 正方形的面积 float radius ; //圆的半径 float circumference ; //圆的周长 scanf(“%f\n”, &edgeLength) ; squareArea = edgeLength * edgeLength ; printf(“The area of the square is %f\n”, squareArea) ; scanf(“%f\n”, &radius) ; circumference = radius * 2 * 3.14159; // pie is 3.14159 printf(“The circumference of the circle is %f\n”, circumference) ;}

中途更改变量的用途

Page 61: 第九 / 十讲   C 程序设计导引( II )

4 、程序风格—— 一些禁忌

a = a + b;

b = a - b;

a = a - b;

temp = a;

a = b;

b = temp;

清晰简单的表达:不要为了追求某方面的效率而使程序变得晦涩难懂。

( a 、 b两个数互换)

这 3 条语句的作用?

Page 62: 第九 / 十讲   C 程序设计导引( II )

4 、程序风格

在刚一开始学习写程序时,就应该注意培养良好的书写习惯。良好的程序风格有助于我们写出正确的代码,并且使得我们的程序更容易被其他人使用。

良好的程序风格示例(课堂例子)

Page 63: 第九 / 十讲   C 程序设计导引( II )

有一对兔子,出生后第 3 个月起每个月都生一对兔

子。小兔子长到第 3 个月后每个月又生一对兔子。假设所有兔子都不死,问 40个月的兔子总数为多少?解题思路

第几个月 小兔子对数 中兔子对数 老兔子对数 兔子总数1 1 0 0 1

2 0 1 0 1

3 1 0 1 2

4 1 1 1 3

5 2 1 2 5

6 3 2 3 8

7 5 3 5 13

┆ ┆ ┆ ┆ ┆

5 、程序示例

Page 64: 第九 / 十讲   C 程序设计导引( II )

可以看到每个月的兔子总数依次为

1,1,2,3,5,8,13…

这就是有名的费波那西 (Fibonacci)数列。

5 、程序示例

Page 65: 第九 / 十讲   C 程序设计导引( II )

#include <stdio.h>void main()

{ long int f1,f2; int i; f1=1;f2=1; for(i=1; i<=20; i++) { printf("%12ld %12ld ",f1,f2); if(i%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; }

}

5 、程序示例

Page 66: 第九 / 十讲   C 程序设计导引( II )

说明:说明:(1) 变量 f1 和 f2 用长整型,在 printf 函数中输出

格式符用“ %12ld” ,而不是用“ %12d” ,这是由于

在第23 个数后,整数值已超过整数最大值 32767 ,因

此必须用长整型变量才能容纳,并用“ %ld”格式输出。(2)if 语句的作用是使输出 4 个数后换行。 i是循环

变量,当 i为偶数时换行,而 i每增值 1 ,就要计算

和输出 2 个数 (f1 , f2) ,因此 i每隔 2 换一次行相当

于每输出 4 个数后换行输出。

说明:说明:(1) 变量 f1 和 f2 用长整型,在 printf 函数中输出

格式符用“ %12ld” ,而不是用“ %12d” ,这是由于

在第23 个数后,整数值已超过整数最大值 32767 ,因

此必须用长整型变量才能容纳,并用“ %ld”格式输出。(2)if 语句的作用是使输出 4 个数后换行。 i是循环

变量,当 i为偶数时换行,而 i每增值 1 ,就要计算

和输出 2 个数 (f1 , f2) ,因此 i每隔 2 换一次行相当

于每输出 4 个数后换行输出。

5 、程序示例

Page 67: 第九 / 十讲   C 程序设计导引( II )

给一个整数 m ,判断它是否素数。解题思路 让 m 被 i(i由 2 变到 k= )除,如果 m 能被某一个

i(2~ k 之间的任何一个整数 ) 整除,则 m 必然不是素

数,不必再进行下去。此时的 i 必然小于或等于 k ;如果 m 不能被 2 ~ k 之间的任一整数整除,则 m 应是素

数,此时在完成最后一次循环后,使 i 再加 1 ,因此

i 的值就等于 k+1,这时才终止循环。在循环结束之

后判别 i 的值是否大于或等于 k+1,若是,则未曾被

2 ~ k 之间任一整数整除过,因此输出“是素数”。

m

5 、程序示例

Page 68: 第九 / 十讲   C 程序设计导引( II )

#include <stdio.h>#include <math.h>void main() {int m,i,k; printf(“please enter a integer number:”); scanf(“%d”,&m); /* 输入一个整数 m */ k=(int)sqrt(m); /* 对m求平方根,再取整 */ for (i=2;i<=k;i++) /* i 作为除数 */ /* 如果m被 i整除,m 肯定不是素数 */ if(m%i==0) break; if(i>k) printf("%d is a prime number.\n",m); else printf("%d is not a prime number.\n",m);}

5 、程序示例

Page 69: 第九 / 十讲   C 程序设计导引( II )

5 、程序示例

课堂编程:求 1 ~ 1000 之间与 7 有关的数( 7 的倍数)的和。

Page 70: 第九 / 十讲   C 程序设计导引( II )

总结

C 语言语句及控制流: if/else

switch/case/default (break)

while 、 do-while 、 for

break 、 continue

标准输入输出及库函数 程序风格

Page 71: 第九 / 十讲   C 程序设计导引( II )

上机作业

编程网格 上机时间做完。上机时交练习和作业权值

为 1 , 3 天内 0.8 , 7 天内 0.6 , 14 天内0.3 ,其他情况为 0 。

10 月 30日下午 1 点 -4点 方正大厦 4 楼417房间。