Presentation is loading. Please wait.

Presentation is loading. Please wait.

第三章 结构化程序设计.

Similar presentations


Presentation on theme: "第三章 结构化程序设计."— Presentation transcript:

1 第三章 结构化程序设计

2 第三章 结构化程序设计 C程序组成 C 程序 …. …. 预编译命令 函数1 函数i { 说明部分 源程序文件1 源程序文件2 源程序文件n
第三章 结构化程序设计 C程序组成 C 程序 源程序文件1 源程序文件2 源程序文件n …. …. 预编译命令 函数1 函数i { 说明部分 执行部分 }

3 三种基本程序结构 顺序结构 选择结构 循环结构 a T F 判断 b c N-S流程图 T F

4 3.1 顺序结构程序设计 3.1.1赋值语句 格式:<变量>=<表达式>; 作用:将右边表达式的值赋给左边的变量
3.1 顺序结构程序设计 3.1.1赋值语句 格式:<变量>=<表达式>; 作用:将右边表达式的值赋给左边的变量 说明:(1) 赋值语句中的数可以是整数、浮点数和字符常数。C语言中,整数既可以是十进制数,也可以是八进制数或十六进制数。八进制整数用“0”开头,十六进制以“0x”开头。浮点数可以是小数型的也可以是指数型的。字符常数需要用单引号将字符括起,字符串常数需要用双引号括起。 (2)赋值语句中的变量应遵循先定义后使用的原则,否则将导致程序出错。 (3)表达式中出现的数学函数,如三角函数sin(x),cos(x),tan(x),对数函数log(x),指数函数exp(x)等。应事先说明这些函数是在标准函数库“math.h”中,即在程序开头要包含:# include “math.h”

5 {4)允许连续赋值,格式为: <变量1>=<变量2>=...<变量n>=<表达式>;
但是要注意在初始化时不能连续初始化,例如: int a=b=c=1;是错误的。 举例:交换两个变量a和b的值。 1.用普通变量实现。 关键语句:t=a; a=b; b=t; 2.用指针(*pa、*pb)实现。 关键语句:pa=&a; pb=&b; t=*pa; *pa=*pb; *pb=t; 讨论:int *pa,*pb,*p; pa=&a;pb=&b; p=pa; pa=pb;pb=p; printf(“a=%d b=%d\n”,a,b); 及printf(“a=%d b=%d\n”,*pa,*pb);的情况。

6 3.1.2 数据输入 字符输入函数 格式:getchar( ) 功能:从键盘读一字符 返值:正常,返回读取的代码值;出错,返回EOF(-1)
数据输入 字符输入函数 格式:getchar( ) 功能:从键盘读一字符 返值:正常,返回读取的代码值;出错,返回EOF(-1) /*ch3_4.c*/ #include <stdio.h> main() { int c; printf("Enter a character:"); c=getchar(); printf("%c--->hex%x\n",c,c); }

7 格式输入函数 例 scanf(“%d”,&a); 例 scanf(“%x”,&a); 输入:10  输入:11  则 a=10
功能:按指定格式从键盘读入数据,存入地址表指定的 存储单元中,并按回车键结束 返值:正常,返回输入数据个数 地址表:变量的地址,常用取地址运算符& 格式字符:d,i,o,x,u,c,s,f,e 例 scanf(“%d”,&a); 输入:10  则 a=10 例 scanf(“%x”,&a); 输入:11  则 a=17

8 例 scanf(“%4d%2d%2d”,&yy,&mm,&dd); 输入 19991015 
附加格式说明符(修饰符) l 修饰符 功 能 h m * 用于d,o,x前,指定输入为short型整数 用于d,o,x前,指定输入为long型整数 用于e,f前,指定输入为double型实数 指定输入数据宽度,遇空格或不可转换字符则结束 抑制符,指定输入项读入后不赋给变量 例 scanf(“%4d%2d%2d”,&yy,&mm,&dd); 输入  则1999yy, 10 mm, 15 dd 例 scanf(“%3c%2c”,&c1,&c2); 输入 abcde  则‘a’c1, ‘d’ c2 例 scanf(“%3d%*4d%f”,&k,&f); 输入  则123k, f 例 scanf(“%2d%*3d%2d”,&a,&b); 输入 1234567 则12a, 67b

9 例 scanf(“%d%o%x”,&a,&b,&c); printf(“a=%d,b=%d,c=%d\n”,a,b,c);
输入分隔符的指定 一般以空格、TAB或回车键作为分隔符 其它字符做分隔符:格式串中两个格式符间字符 例 scanf(“%d%o%x”,&a,&b,&c); printf(“a=%d,b=%d,c=%d\n”,a,b,c); 输入  输出 a=123,b=83,c=291 例 scanf(“%d:%d:%d”,&h,&m,&s); 输入 12:30:45 则12 h, 30 m, 45 s 例 scanf(“%d,%d”,&a,&b) 输入 3,4  则3a, 4 b 例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); 输入 a=12,b=24,c=36 

10 说明: 用“%c”格式符时,空格和转义字符作为有效字符输入 输入数据时,遇以下情况认为该数据结束: 遇空格、TAB、或回车 遇宽度结束 遇非法输入 如 scanf(“%c%c%c”,&c1,&c2,&c3); 若输入abc 则ac1,  c2, b c3 例 int x; char ch; scanf(“%d”,&x); scanf(“ %c”,&ch); 或 scanf(“%*c%c”,&ch); 输入函数留下的“垃圾”: 如 scanf(“%d%c%f”,&a,&b,&c); 若输入1234a123o.26  则 a, ‘a’ b, 123 c 解决方法: (1)用getchar()清除 (2)用函数fflush(stdin)清除全部剩余内容 (3) 用格式串中空格或“%*c”来“吃掉” 例 int x; char ch; scanf(“%d”,&x); ch=getchar(); printf(“x=%d,ch=%d\n”,x,ch); 执行:123 输出:x=123,ch=10 例 int x; char ch; scanf(“%d”,&x); scanf(“%c”,&ch); printf(“x=%d,ch=%d\n”,x,ch); 执行:123 输出:x=123,ch=10

11 3.1 .3数据输出 字符输出函数 格式: putchar( c ) 参数: c为字符常量、变量或表达式 功能:把字符c输出到显示器上
返值:正常,为显示的代码值;出错,为EOF(-1)

12 /*ch3_1.c*/ #include <stdio.h> main() { int c; char a; c=65; a='B'; putchar(c); putchar('\n'); putchar(a); } 运行结果:A B

13 格式输出函数 输出表:要输出的数据(可以没有,多个时以“,”分隔)格式控制串:包含两种信息 格式说明:%[修饰符]格式字符 ,
格式:printf(“格式控制串”,输出表) 功能:按指定格式向显示器输出数据 返值:正常,返回输出字节数;出错,返回EOF(-1) 输出表:要输出的数据(可以没有,多个时以“,”分隔)格式控制串:包含两种信息 格式说明:%[修饰符]格式字符 , 用于指定输出格式 普通字符或转义序列:原样输出格式字符

14 printf(“a=%d , b=%d\n”,a,b); 例 int a=3,b=4; printf(“%d %d\n”,a,b);
d,i x,X o u c s e,E f g %% 格式字符: 十六进制无符号整数 不带符号十进制整数 十进制整数 指数形式浮点小数 单一字符 字符串 八进制无符号整数 小数形式浮点小数 e和f中较短一种 百分号本身 int a=567;printf ( “%d”,a); 567 int a=255;printf(“%x”,a); ff int a=65;printf(“%o”,a); 101 int a=567;printf(“%u”,a); 567 例 main() { unsigned int u=65535; printf(”u=%d\n",u); } 输出结果:u=-1 char a=65;printf(“%c”,a); A 例 int a=3,b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b); 例 int a=3,b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b); 输出结果: 3 4 a=3, b=4 printf(“%s”,“ABC”); ABC float a= ;printf(“%e”,a); e+02 float a= ;printf(“%f”,a); float a= ;printf(“%g”,a); printf(“%%”); % 说明 格式字符要用小写 格式字符与输出项个数应相同,按先后顺序一一对应 输出转换:格式字符与输出项类型不一致,自动按指定格式输出 65535

15 附加格式说明符(修饰符) .n 对实数,指定小数点后位数(四舍五入) 对字符串,指定实际输出位数 修饰符 功 能 m 输出数据域宽,数据长度<m,左补空格;否则按实际输出 输出数据在域内左对齐(缺省右对齐) - 指定在有符号数的正数前显示正号(+) + 输出数值时指定左面不使用的空位置自动填0 在八进制和十六进制数前显示前导0,0x # 在d,o,x,u前,指定输出精度为long型 在e,f,g前,指定输出精度为double型 l

16 例 m.n 例 int a=1234; float f= ; char ch=‘a’; printf(“%8d,%2d\n”,a,a); printf(“%f,%8f,%8.1f,%.2f,%.2e\n”,f,f,f,f,f); printf(“%3c\n”,ch); 运行 1234,1234 结果: , , 123.5,123.46,1.23e+02 a 例 static char a[]=“Hello,world!” printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a); 运行结果:Hello,world! Hello,world! Hello Hello Hel

17 例 - 例 int a=1234; float f= ; static char c[]=“Hello,world!”; printf(“%8d,%-8d\n”,a,a); printf(“%10.2f,%-10.1f\n”,f,f); printf(“%10.5s,%-10.3s\n”,c,c); 运行结果:1234,1234 123.46,123.5 Hello,Hel

18 printf(“%o,%#o,%X,%#X\n”,a,a,a,a);
例 0 、+ 例 int a=1234; float f= ; printf(“%08d\n”,a); printf(“%010.2f\n”,f); printf(“%0+8d\n”,a); printf(“0+10.2f\n”,f); // // // // 例 # 例 int a=123; printf(“%o,%#o,%X,%#X\n”,a,a,a,a); //173,0173,7B,0X7B 例 l 例 long a=65536; printf(“%d,%8ld\n”,a, a); //0, 65536

19 3.1.4 程序举例 例 输入三角形边长,求面积 /*ch3_12.c*/ #include <math.h>
例 输入三角形边长,求面积 /*ch3_12.c*/ #include <math.h> #include <stdio.h> main() { float a,b,c,s,area; scanf("%f,%f,%f",&a,&b,&c); s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("a=%7.2f, b=%7.2f, c=%7.2f, s=%7.2f\n",a,b,c,s); printf("area=%7.2f\n",area); } 文件包含预处理命令 变量定义 输入数据 输出数据 输入:3,4,6  输出:a= , b= , c= s= area=

20 /*ch3_13.c*/ #include "stdio.h" main() { char c1,c2; c1=getchar();
例 从键盘输入大写字母,用小写字母输出 /*ch3_13.c*/ #include "stdio.h" main() { char c1,c2; c1=getchar(); printf("%c,%d\n",c1,c1); c2=c1+32; printf("%c,%d\n",c2,c2); } 输入:A  输出:A,65 a,97

21 /*ch3_14.c*/ #include <stdio.h> #include <math.h> main() { float a,b,c,disc,x1,x2,p,q; scanf("a=%f,b=%f,c=%f",&a,&b,&c); disc=b*b-4*a*c; p=-b/(2*a); q=sqrt(disc)/(2*a); x1=p+q; x2=p-q; printf("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2); } 输入:a=1,b=3,c=2  输出:x1=-1.00 x2=-2.00

22 3.2 分支程序设计 3.2.1条件语句(if) 条件 语句 条件 语句1 语句2 1.单臂式if语句:if (表达式){语句序列;}
{语句序列;} F T else {语句序列;} 条件 语句 条件 语句1 语句2

23 例如: if (x>0) printf(“x>0\n”);
else if { 语句序列2;} else if { 语句序列3;} 例如: if (x>0) printf(“x>0\n”); else if(x<0) printf(“x<0\n”); else printf(“x=0\n”); 4.if语句的嵌套 配对原则:1.一个else总是与离它最近的并没有与其他else配对的if配对。2.加括号

24 If (…...) if (……) if (……) …… else …...

25 例:在a,b,c三个数中选出最大数 main() { int *p1,*p2,*p3;int a,b,c;
printf("Enter a,b,c="); scanf("%d%d%d",&a,&b,&c); p1=&a;p2=&b;p3=&c; if(*p1>=*p2) if(*p1>=*p3) printf("max is %d \n",*p1); else printf("max is %d\n",*p3); if(*p2>*p3) printf("max is %d\n ",*p2); printf("max is %d \n",*p3); }

26 5.条件运算符与条件表达式 例:把从键盘输入的大写字母化为小写打印出来 mian() { char ch; ch=getchar();
printf(“%c\n”,ch>=‘A’&&ch<=‘Z’?ch+32:ch); }

27 3.2.2 开关选择语句 流程图如下: 格式:switch (表达式) { case 常量1:语句1; case 常量2:语句2;
开关选择语句 格式:switch (表达式) { case 常量1:语句1; case 常量2:语句2; case 常量3:语句3; …… case 常量n:语句n; default:语句n+1; } 作用:可实现多分支选择 流程图如下:

28 表达式 switch …... default 语句序列1 语句序列2 语句序列n 语句序列n+1 表达式=常数2 表达式=常数n
表达式=常数1 switch 语句序列1 表达式=常数2 语句序列2 …... 表达式=常数n 语句序列n default 语句序列n+1

29 [例] 编制给学生写评语的程序。 若学生成绩在60~79则打印“Pass”; 若成绩在80~89则打印“Good”; 若成绩为90~100 打印“Excellent”; 59分以下打印“Fail”。算法用: select=score/10来计算,如果select的值在0~5之间则表明成绩是0~59分,这时应该输出“Fail”, 如果select的值在6~7之间则表明成绩是60~79分,如果select的值是8表明成绩是80~89分,成绩在90~100分之间时,select的值是9~10。 Ex325.c 程序中case 0 到case 5都是执行的相同的语句,这时程序采用了多个case重叠,共用一个语句组的情形,case 6 和case 7, case 9 和case 10都是重叠共用的情况。

30 【例】: 统计某班成绩状况. Exscore.c
说明变量 输入成绩 总人数计数,总分累加 输入成绩 x 计算平均分 计算通过率 显示结果 x>=0 x>=60 T F 及格人计数 不及格计数 X>=60

31 3.3 循环结构程序设计 循环体 while 零 do 循环体 表达式 非零 while 表达式 零
3.3 循环结构程序设计 1. while 格式: while(<表达式>) { 循环体(语句组) } /*当表达式值为真时循环。*/ 循环体中应有能退出循环的机制 (使表达式逻辑值为假)。 【例】 牛数递增(excow.c) 2. do-while 格式: do } while(<表达式>) ; while 表达式 非零 循环体 do 循环体 while 表达式 非零

32 循环体 for 3. for ( ) 零 表达式2 非零 表达式3 以上两种格式的区别在于前者在开始时表
达式的值为假时不执行循环;后者则无论 如何先执行一次。 【例】 猴子吃桃问题(exmonkey.c) 3. for ( ) 格式: for(<表达式1>;<表达式2>;<表达式3>) { 循环体(语句组) } 【例] “水仙花数”(100~999,exflower.c) 【例] 求平均成绩。(exave.c) [例] 实现字符串拷贝。(exstrcpy.c) for 表达式1 表达式2 非零 循环体 表达式3

33 4. 循环嵌套 上述各个语句构成的循环都可嵌套, 可以多层。不可交叉;能由内向外转 移,反之不可;各层循环次数。 [ 例1 ]求阶乘的和 (1!+2!+3!+…n!)。(exsum.c) [例2] 打印杨辉三角形(10)。 (extriangle.c) 1 1 1 …... for (……) {…… …… for(……) } 外循环 内循环

34 for 零 K++ flag=0 flag=1,k=2 零 非零 非零 5. 循环辅助控制 1. continue 中止当次循环.
[例] excontin.c 2. Break(exprime.c) 退出本层循环。 [例] 打印输出100~1000之 间的素数。 分析:素数为只能被1和 它本身整除的数。 用2~n-1除n 用2~sqrt(n)除n for flag=1,k=2 K<=sqrt(n) 非零 N%k==0 K++ 非零 正常退出 flag=0


Download ppt "第三章 结构化程序设计."

Similar presentations


Ads by Google