《c3第三章顺序结构程序设计(v).ppt》由会员分享,可在线阅读,更多相关《c3第三章顺序结构程序设计(v).ppt(48页珍藏版)》请在金锄头文库上搜索。
1、第三章第三章顺序结构程序设计顺序结构程序设计 How many classromm.C3.1 基本语句基本语句(1)空语句:即只有一个分号的语句。 ;(2)表达式语句:表达式后加一个分号。 如:m=0; x+y-10%2+2*x,10/2;无具体意义(3)函数调用语句:函数调用加一个分号。 如:printf(“this is a example. n”) ;(4)控制语句: 是C语言中完成一定控制功能的语句, 如表3.1所示。表3.1条件控制语句循环控制语句辅助控制语句if语句switch语句while语句do-while语句for语句break中断语句continue继续语句goto转向语句
2、return返回语句(5)复复合合语语句句。将将一一组组语语句句用用花花括括号号 括括起起来来就就形形成了复合语句,又称其为分程序。成了复合语句,又称其为分程序。如: m=10; printf(“m=%dn”,m);3.2 赋值语句赋值语句赋值表达式后加上一个分号 。例:利用赋值语句交换两变量的值。设有定义:int a=12, b=5, t;则可以用如下两种方式交换变量a和b的值: t=a; a=b; b=t; 第三者插足法第三者插足法 a=a+b; b=a-b; a=a-b; 3.3 数据的输入输出数据的输入输出 5C语言无I/O语句,I/O操作由函数实现5 #include 格式:prin
3、tf(格式控制串格式控制串,输出表,输出表)功能:按指定格式向显示器输出数据功能:按指定格式向显示器输出数据返值:正常,返回输出返值:正常,返回输出字符字符数;出错,返回数;出错,返回EOF(-1)EOF(-1)一、格式输出函数一、格式输出函数输出表:要输出的数据(可以没有,多个时以“,”分隔)格式控制串:包含两种信息1. 格式说明:%修饰符格式字符 ,用于指定输出格式2. 普通字符或转义序列:原样输出格式字符例例 main() short x=65535; printf(x=%dn,x); getch(); 输出结果:输出结果:x=-1例 int a=3,b=4; printf(“%d %d
4、n”,a,b); printf(“a=%d , b=%dn”,a,b);输出结果: 3 4 a=3, b=411 11 11 11 11 11 11 1165535d,ix,Xoucse,Efg%格式字符:格式字符:十六进制无符号整数十六进制无符号整数不带符号十进制整数不带符号十进制整数十进制整数十进制整数指数形式浮点小数指数形式浮点小数单一字符单一字符字符串字符串八进制无符号整数八进制无符号整数小数形式浮点小数小数形式浮点小数e和和f中较短一种中较短一种百分号本身百分号本身int a=567;printf ( “%d”,a);int a=255;printf(“%x”,a);int a=65
5、;printf(“%o”,a);int a=567;printf(“%u”,a);char a=65;printf(“%c”,a);printf(“%s”,“ABC”);float a=567.789;printf(“%e”,a);float a=567.789;printf(“%f”,a);float a=567.789;printf(“%g”,a);printf(“%”);567ff101567AABC5.677890e+02567.789000567.789%说明说明:格式字符要用小写格式字符要用小写 格式字符与输出项个数应相同,按先后顺序一一对应格式字符与输出项个数应相同,按先后顺序一
6、一对应 输出转换输出转换:格式字符与输出项类型不一致格式字符与输出项类型不一致,自动按指定格式输出自动按指定格式输出%p16进制全字长整数进制全字长整数printf(“%p”,10);0000000A格式符格式符用于输出用于输出示示 例例输输 出出%c单个字符单个字符printf(%c%c%c,a,t,b);a b%s一个字符串一个字符串printf(%s,Hi, how are you?);Hi, how are you?%d一个整数一个整数printf(%d,43);43%o一个一个8进制整数进制整数printf(%o,43);53%x一个一个16进制整数进制整数printf(%x,43)
7、;2b%f一个浮点数一个浮点数printf(%f,81.97);81.970000%e以科学计数法表示以科学计数法表示的一个浮点数的一个浮点数printf(%e,81.97);8.197000e+01%一个百分号一个百分号printf(%d%,10);10%l附加格式说明符(修饰符)附加格式说明符(修饰符).n对实数,指定小数点后位数(四舍五入)对字符串,指定实际输出位数修饰符功 能m输出数据域宽,数据长度m,左补空格;否则按实际输出输出数据在域内左对齐(缺省右对齐)指定在有符号数的正数前显示正号(+)输出数值时指定左面不使用的空位置自动填00在八进制和十六进制数前显示前导0,0x#在d,o,
8、x,u前,指定输出精度为long型在e,f,g前,指定输出精度为double型l printf(%5d%4d,100,2); printf(%2d with label,5210); 5210 with label printf(%-7s%d,its,28); its 28 printf(%15f,981.48); 981.480000 printf(%7.1f,981.48); 981.5 printf(%12.3e,981.48); 9.815e+02 printf(%.5E,0.098148); 9.8148E-021002 (补充补充) 场宽场宽m.n可以是变量可以是变量 scanf(
9、)中的字符宽度可以由一个中的字符宽度可以由一个”*”号而不是整号而不是整数来指定。数来指定。”*”号表示这个数取自输入列表。号表示这个数取自输入列表。 例如下边这个例子,通过输入例如下边这个例子,通过输入m,n来控制输出值的显示精度:来控制输出值的显示精度:#include main() float a=123.45678; int m,n; printf(m=); scanf(%d,&m); printf(n=); scanf(%d,&n); printf(a=%*.*fn,m,n,a); getch();(补充补充) 在在TC编译器中的编译器中的math.h中已经定义中已经定义, 可以直接
10、在程序里使用的可以直接在程序里使用的14个符号常量个符号常量l/* Constants rounded for 21 decimals. */l#define M_E 2.71828182845904523536 / 自然对数的底数自然对数的底数e l#define M_LOG2E 1.44269504088896340736 / log2el#define M_LOG10E 0.434294481903251827651 / lg el#define M_LN2 0.693147180559945309417 / ln 2l#define M_LN10 2.30258509299404568
11、402 / ln 10l#define M_PI 3.14159265358979323846 / l#define M_PI_2 1.57079632679489661923 / /2l#define M_PI_4 0.785398163397448309116 / /4l#define M_1_PI 0.318309886183790671538 / 1/l#define M_2_PI 0.636619772367581343076 / 2/l#define M_1_SQRTPI 0.564189583547756286948 / 1/l#define M_2_SQRTPI 1.12837
12、916709551257390 / 2/l#define M_SQRT2 1.41421356237309504880 / 2l#define M_SQRT_2 0.707106781186547524401 / 2 /2(补充补充) 使用使用M_PI和和M_E的程序的程序e 与与 e 哪个大哪个大 ?#include c:tc200includemath.h/* 这里使用这里使用math.h的绝对地址的绝对地址,使程序可在使程序可在VC+运行运行*/main() printf(epi = %fn,pow(M_E,M_PI); printf(pie = %fn,pow(M_PI,M_E); g
13、etch();可以用可以用 4*atan(1.0) 或或 acos(-1.0) 算出来算出来 #include main()double pi=4*atan(1.0),pi2=acos(-1.0);printf(%.10lfn%.10lfn,pi,pi2);getch();例 int a=1234; float f=123.456; static char c=“Hello,world!”; printf(“%8d,%-8dn”,a,a); printf(“%10.2f,%-10.1fn”,f,f); printf(“%10.5s,%-10.3sn”,c,c);运行结果:1234,1234 1
14、23.46,123.5 Hello,Hell 格式说明符例子例 int a=1234; float f=123.456; printf(“%08dn”,a); printf(“%010.2fn”,f); printf(“%0+8dn”,a); printf(“0+10.2fn”,f); l 附加格式说明符 0 、+ 的例子例 int a=123; printf(“%o,%#o,%X,%#Xn”,a,a,a,a); 例: #例 long a=65536; printf(“%d,%8ldn”,a, a); 例00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
15、00000012340000123.46000+1234000+123.56173,0173,7B,0X7B0, 65536例 int a=1234; float f=123.456; char ch=a; printf(“%8d,%2dn”,a,a); printf(“%f,%8f,%8.1f,%.2f,%.2en”,f,f,f,f,f); printf(“%3cn”,ch);运行 1234,1234结果: 123.456000,123.456000, 123.5,123.46,1.23e+02 a例 static char a=“Hello,world!” printf(“%sn%15sn
16、%10.5sn%2.5sn%.2sn”,a,a,a,a,a);运行结果:Hello,world! Hello,world! Hello Hello Hel 附加格式说明符 m.n 的例子printf()函数返回一个函数返回一个int值值,表示表示被显示的字符数:被显示的字符数:main() int x; x=printf(%dn,123); printf(x=%d,x); getch();输出输出:123x=4_实践中,可以用来检验输出结果。实践中,可以用来检验输出结果。二、二、格式输入函数格式输入函数格式: scanfscanf(“(“格式控制串格式控制串”,地址表,地址表)功能:按指定格式
17、从键盘读入数据,存入地址表指定的 存储单元中,并按回车键结束返值:正常,返回输入数据个数地址表:变量的地址,常用取地址运算符地址表:变量的地址,常用取地址运算符&格式字符:d,i,o,x,u,c,s,f,e例 scanf(“%d”,&a); 输入:10 则 a=10例 scanf(“%x”,&a); 输入:11 则 a=17常用的输入函数用法以以 int x; 为例为例 printf(x=); scanf(%d,&x);一个一个scanf()中只输入一个变量;中只输入一个变量;一个一个scanf()应当与一个应当与一个printf()成对出成对出现,其中的现,其中的printf()为提示语句为
18、提示语句 prompt statement;sccanf()中不要出现转义字符(例如中不要出现转义字符(例如n)。)。scanf()函数返回成功获得数据的个数,输入非法时其值当然为0main() int x,y; printf(x=); y=scanf(%d,&x); printf(x=%d y=%d,x,y); getch();输入输入123时时输出输出 x=123 y=1 表示输入了表示输入了1个数字个数字输入输入a时时输出输出 x=-858993460 y=0 表示输表示输入了入了0个数字个数字实际应用中,常用对实际应用中,常用对scanf()值的判断来确定用户输入的合法性值的判断来确定
19、用户输入的合法性main()int x,y,z; printf(x y=);z=scanf(%d%d,&x,&y); printf(x=%d y=%d z=%d,x,y,z); getch();输入输入12 23时时输出输出 x=12 y=23 z=2 表示正确输入了表示正确输入了2个数字个数字输入输入12 a时时输出输出 x=12 y=-858993460 z=1 表示只正确输入了表示只正确输入了1个数字个数字scanf()中的附加格式说明符(修饰符)l修饰符功 能hm*用于d,o,x前,指定输入为short型整数用于d,o,x前,指定输入为long型整数用于e,f前,指定输入为double
20、型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量例 scanf(“%4d%2d%2d”,&yy,&mm,&dd); 输入 19991015 则1999yy, 10 mm, 15 dd例 scanf(“%3d%*4d%f”,&k,&f); 输入 12345678765.43 则123k, 8765.43f例 scanf(“%2d%*3d%2d”,&a,&b); 输入 1234567 则12a, 67b例 scanf(“%3c%2c”,&c1,&c2); 输入 abcde 则ac1, d c2l输入分隔符的指定一般以空格、TAB或回车键作为分隔符其它字符做分隔符
21、:格式串中两个格式符间字符例 scanf(“%d:%d:%d”,&h,&m,&s); 输入 12:30:45 则12 h, 30 m, 45 s例 scanf(“%d,%d”,&a,&b) 输入 3,4 则3a, 4 b例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); 输入 a=12,b=24,c=36 例 scanf(“%d%o%x”,&a,&b,&c); printf(“a=%d,b=%d,c=%dn”,a,b,c); 输入 123123123 输出 a=123,b=83,c=291l说明:用“%c”格式符时,空格和转义字符作为有效字符输入如 scanf(“%c%c%
22、c”,&c1,&c2,&c3); 若输入abc 则ac1, c2, b c3输入数据时,遇以下情况认为该数据结束:遇空格、TAB、或回车遇宽度结束遇非法输入如 scanf(“%d%c%f”,&a,&b,&c); 若输入1234a123o.26 则 1234 a, a b, 123 c输入函数留下的输入函数留下的“垃圾垃圾”:例 int x; char ch; scanf(“%d”,&x); ch=getchar(); printf(“x=%d,ch=%dn”,x,ch);执行:123输出:x=123,ch=10 (换行符LF)例 int x; char ch; scanf(“%d”,&x);
23、scanf(“%c”,&ch); printf(“x=%d,ch=%dn”,x,ch);执行:123输出:x=123,ch=10 (换行符LF)解决方法:(1)用格式串中的空格或“%*c”来“吃掉”(2)用getchar()清除 (3) 用函数fflush(stdin)清除全部剩余内容例 int x; char ch; scanf(“%d”,&x); scanf(“ %c”,&ch);或 scanf(“%*c%c”,&ch); (1)格式:getch() 功能:从键盘无回显读入一字符 (不需要回车确认)(2)格式:getchar() 功能:从键盘读入一字符(需要回车确认)三、字符输入三、字符输
24、入输出输出函数函数 1. 字符输入函数字符输入函数例例 #include main() int c; printf(Enter a character:); c=getch(); printf(%c-hex%xn,c,c); getch(); 运行输入运行输入A 运行结果:Enter a character:AA-hex41格式: putchar(c)参数: c为字符常量、变量或表达式,或0-255的整数。功能:把字符c输出到显示器上返值:正常,为显示的代码值;出错,为EOF(-1)#include main() int c; char a; c=65; a=B; putchar(c); pu
25、tchar(n); putchar(a); getch():运行结果:A B例例2. 字符输出函数字符输出函数l除了putchar(),putch()也实现把字符输出到显示器上。l根据TC的解释,putchar()是输出到STDOUT(标准输出设备),而putch()是输出到screen。l在一般应用中,这两者没有区别。 注注:ANCI规定:规定: 使用使用getchar()和和putchar()须编译预处理须编译预处理 #include warning C4013: getch undefined; assuming extern returning int警告信息的解决警告信息的解决l添加
26、conio.h头文件:#include lconio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()、putch()函数等等。 3.4 程序举例程序举例#include main() float a,b,c,s,area; printf(Side a : ); scanf(%f,&a); printf(Side b : ); scanf(%f,&b); printf(Side c : ); scanf(%f,&c); s=1.0/2*(a+b+c); area=sqr
27、t(s*(s-a)*(s-b)*(s-c); printf(a=%7.2f, b=%7.2f, c=%7.2f, s=%7.2fn,a,b,c,s); printf(area=%7.2fn,area); getch();例 输入三角形边长,求面积编译预处理命令变量定义输入数据输出数据 输入:3,4,6 输出:a= 3.00, b= 4.00, c= 6.00 s= 6.50 area= 5.33例例 从键盘输入大写字母,输出对应的小写字母和从键盘输入大写字母,输出对应的小写字母和ASCII码码#include main() char c1,c2; printf(char=); c1=getch
28、ar(); printf(%c,%dn,c1,c1); c2=c1+32; printf(%c,%dn,c2,c2); getch();输入:A 输出:A,65 a,97#include main() float a,b,c,disc,x1,x2,p,q; printf(a=); scanf(%f,&a); printf(“b=); scanf(%f,&b); printf(c=); scanf(%f,&c); disc=b*b-4*a*c; p=-b/(2*a); q=sqrt(disc)/(2*a); x1=p+q; x2=p-q; printf(nnx1=%5.2fnx2=%5.2fn,
29、x1,x2); getch():提示:a= _输入:1 提示:b= _输入:3 提示:c= _输入:2 输出:x1=-1.00 x2=-2.00Programming Style 编程风格lIt is best just now if you simply adopt the styles presented by tutor, when you are a seasoned programmer, you can develop your own style.Programming Style 编程风格lPrograms can be highly readable and understa
30、ndable or they can be intelligible(清晰易懂的).lGood style 优雅的编程风格优雅的编程风格Meaningful names.有意义的变量名有意义的变量名White space to separate parts of statements.语句间留白语句间留白Consistent habits regarding indentation.养成阶梯状编程格式的习惯养成阶梯状编程格式的习惯lIndentation conveys controlling statements in control flow.Some common coding erro
31、rs常见的程序代码错误常见的程序代码错误常见的程序代码错误常见的程序代码错误lQuoting problems: 引号不配对unmatched quotes, mismatched quotes, incorrect quoteslUnending comments 注释没收尾lForgetting semicolons (;) 行尾没分号lUnmatched or mismatched braces or parentheses 括号不配对lControl strings not matching the arguments in printf(), scanf(), and other s
32、imilar functions I/O函数中的格式与I/O项不一致lForgetting & in arguments to scanf(). scanf()中忘了&lLoss of fractions due to use of int instead of float. 用int导致缺数lInconsistent lengths (e.g. double vs. float) between formats and arguments in scanf() and printf(). I/O函数中格式类型不一致常见的四类编程错误常见的四类编程错误l语法错误语法错误(syntax erro
33、r) 由于一个语法错会导致许多错误信息,所以出错处往往在编译器所指出错行之前。l运行时错误运行时错误(runtime error) 程序执行过程中试图执行非法操作l逻辑错误逻辑错误(logic error) 由不正确算法导致的错误。l未检测到的错误未检测到的错误(unchecked error) 导致不正确结果的程序执行错。以下以一个例子来分别加以说明:以下以一个例子来分别加以说明:1:语法错误(:语法错误(syntax error)lDEMO.C(3) : error C2146: syntax error : missing ; before identifier printflDEMO.
34、C(3) : warning C4013: printf undefined; assuming extern returning intlDEMO.C(3) : error C2001: newline in constantlDEMO.C(3) : error C2065: d : undeclared identifierlDEMO.C(3) : error C2296: % : illegal, left operand has type char 11lDEMO.C(3) : error C2143: syntax error : missing ) before stringlDE
35、MO.C(4) : warning C4013: scanf undefined; assuming extern returning intlDEMO.C(8) : warning C4013: getch undefined; assuming extern returning int/换算后仍输出换算后仍输出x原值原值main()int x,y,tprintf(x=);scanf(%d,&x);printf(y=);scanf(%d,&y);t=x/y;x=x/t;printf(x=%d,x);getch();/换算后输出换算后输出y的原值的原值main()int x,y,t;print
36、f(x=);scanf(%d,&x);printf(y=);scanf(%d,&y);t=x/y;x=x/t;printf(x=%d,x);getch();2:运行时错误(:运行时错误(runtime error)x=3y=4/换算后输出换算后输出y的原值的原值main()int x,y,t;printf(x=);scanf(%d,&x);printf(y=);scanf(%d,&y);t=x/y;x=x/t;printf(x=%d,x);getch();3:逻辑错误(:逻辑错误(logic error)x=4y=3x=3/换算后输出换算后输出y的原值的原值main()int x,y,t;pr
37、intf(x=);scanf(%d,&x);printf(y=);scanf(%d,&y);t=x/y;x=y/t;printf(x=%d,x);getch();4:未检测到的错误(:未检测到的错误(unchecked error)x=4y=3x=3/换算后输出换算后输出y的原值的原值main()int x,y,t;printf(x=);scanf(%d,x);printf(y=);scanf(%d,&y);t=x/y;x=y/t;printf(x=%d,x);getch();非法访问非法访问习题课(输入输出格式)1. 运行下面的程序,分析输出结果。运行下面的程序,分析输出结果。main()
38、int i=45;printf( i=%d,%u,%ldn ,i,i,i); printf( i=|%+8d|%2d|%-8d|%08d| ,i,i,i,i);运行结果运行结果 i=45,45,17104941 i=| +45|45|45 |00000045|分析:分析:为什么为什么45变成了变成了17104941呢?呢?将将i的值改成的值改成 - 45,重新运行:,重新运行:运行结果:运行结果:i=-45,65491,17170387 i=|-45|-45|-45 |-0000045|分析分析:为什么为什么 - 45变成了变成了65491和和17170387呢?呢? (2) main() u
39、nsigned k=50000; printf( n(1)k=%d, %u, %ld ,k,k,k); printf( n(2)k=|%+10u|%-10o|%10x| ,k,k,k); 运行结果运行结果:(1)k=-15536, 50000,171154896 (2)k=| +50000|141520 | c350|分析分析:为什么:为什么50000 变成了变成了-15536 呢?呢? (3) main() float x=6.72e-7; printf( n(1)x=%f, %e, %g ,x,x,x); printf( n(2)x=|%12e|%12.2e|%.1e| ,x,x,x);
40、运行结果运行结果: (1) x=0.000001, 6.72000e-07, 6.72e-07 (2) x=| 6.72000e-07| 6.7e-07|7e-07|分析结果:分析结果:以以%f格式显示太小的数不合适。格式显示太小的数不合适。(4) 输入以下程序输入以下程序main() int m; float x; printf(nInput: ); scanf(%d%f,&m,&x); printf(nm=%d, x=%f,m,x); 运行结果: m=10, x=20.000000运行程序,输入运行程序,输入10 20 或者输入或者输入10 20 运行程序运行程序,输入输入: 10.0 2
41、0.0 当输入当输入10.0 后程序就结束了。显示后程序就结束了。显示 m=10, x= 0.000000为什么?为什么?思考:当输入思考:当输入10.33 程序会怎么显示?程序会怎么显示?(5) 输入以下程序输入以下程序 main() int m; float x; printf( nInput: ); scanf( %3d%4f ,&m,&x); printf( nm=%d, x=%f”,m,x); 运行程序输入运行程序输入 1 345.7 输出结果是什么?分析原因输出结果是什么?分析原因 输出结果是:输出结果是:m=1, x=345.000000运行程序输入运行程序输入 234567 输
42、出结果是什么?分析原因输出结果是什么?分析原因输出结果是:输出结果是:m=234, x=567.000000(6) main() char ch=E; int m=65; printf(n(1)ch1=%c, %d,ch,ch); printf(n(2)m=%d,%c,m,m); 运行结果运行结果:(1)ch1=E, 69 (2)m=65,a 分析结果分析结果:对于字符型变量应当用对于字符型变量应当用%c格式显示格式显示,若用若用 %d显示则是其显示则是其ASCII码值;码值; 反之亦然。反之亦然。 将将m的值改成的值改成180,然后重新运行。,然后重新运行。运行结果运行结果:(1)ch1=E, 69 (2)m=180,