410 likes | 511 Views
第 4 章 最简单的 C 程序设计 -- 顺序程序结构设计. 4.1 C 语句概述 程序的三种基本结构 4.2 赋值语句 4.3 数据输入输出的概念及其语言实现 4.4 字符的输入和输出 4.5 格式输入 与输出 4.6 程序举例. C 程序. C 程序. 源程序文件 1. 源程序文件 1. 源程序文件 2. 源程序文件 2. 源程序文件 n. 源程序文件 n. 预编译命令. 预编译命令. 函数 1. 函数 1. 函数 n.
E N D
第4章 最简单的C 程序设计--顺序程序结构设计 4.1 C 语句概述 程序的三种基本结构 4.2 赋值语句 4.3 数据输入输出的概念及其语言实现 4.4 字符的输入和输出 4.5 格式输入 与输出 4.6 程序举例
C程序 C程序 源程序文件1 源程序文件1 源程序文件2 源程序文件2 源程序文件n 源程序文件n 预编译命令 预编译命令 函数1 函数1 函数n 函数n 说明部分 说明部分 执行部分(语句) 执行部分(语句) 4.1 C 语句概述一个语句经编译后产生若干条机器指令。C语句用来完成一定操作。声明部分不称为语句,int a;
C 程序语句分五类 1.控制语句 2.函数调用语句 3.表达式语句 4.空语句 5.复合语句
程序的三种基本结构 近年来广泛采用结构化程序设计方法,使程序结构清晰、易读性强。强调今后在学习中要采用此方法。 • 有三种基本结构: 顺序结构 选择结构 循环结构 已经证明,由以上基本结构组成的程序能处理任何复杂的问题。
A 当P成立 P Y N B A A B A 直到P成立 直到型循环 选择结构 当型循环 顺序结构
2000-2050年的leap year,能被4整除但不能被100整除,或者能被100整除且能被400整除。 Y 2000 Y/4的余数为0 Y N Y/100不为0 是 否 y非 闰年 打印y 闰年 Y/400余 数为0 是 否 打印y 闰年 打印y 非闰年 y+1 y 直到Y>2500
§4.2 赋值语句 赋值语句是由赋值表达式加上一个分号构成的。 它的应用十分普遍,但要注意: ①“=”是赋值运算符,不是“等号”。如: x=x+1 a = 1 与 a = = 1 ②赋值运算符具有“右结合性”,如: a=2;x=b;与 2=a; b=x; ③赋值表达式可以被包含在其它表达式中,而赋值语句不行。如: if (x > 0) t = a; if ((a = b) > 0) t = a; if ((a = b ;) > 0) t = a;
§ 4.3 数据输入输出的概念及在C语言中的实现 • 输入和输出是以计算机主机为主体而言。 输出指外部设备:显示屏,打印机,磁盘,输入设备: 键盘,磁盘,光盘,扫描仪等。 默认输入设备是键盘,输出设备是显示器 • C 语言不提供输入输出语句,输入输出操作是由函数来完成的。如前面提到的printf和scanf。它们是函数名不是C 语言的关键字。 sizeof是关键字 a=sizeof(int) 是编译系统提供的 • 要用预编译命令将库函数文件包括到用户源文件中。如: #include “stdio.h” #include “math.h” #include “string.h” 只有printf和scanf例外。
4.4字符数据的输入和输出 4.4.1 putchar函数(字符输出函数) 其作用是向终端输出一个字符,如putchar(c);输出字符变量c的值其中c 可以是字符型变量或整型变量 例:#include “stdio.h” main ( ){ char a ,b ,c ; a =‘B’ ; b =‘O’ ; c =‘Y’ ; putchar(a) ; putchar(b) ; putchar( c);} 运行结果:BOY 若改为: putchar(a) ; putchar(‘\n’) ; putchar(b); putchar(‘\n’) ; putchar(c) ; putchar (‘\n’);} 运行结果为?
也可以输出其它转义字符 putchar(‘\101’) 等效 putchar(‘A’),和putchar(65); putchar(‘\’’) putchar(‘\015’)与等效 putchar(‘\r’)
4.4.2 getchar()函数(字符输入函数) 从隐含终端设备读入一个字符, getchar() 函数的返回值为字符的值。 例4.2 #include <stdio.h> main() {char c; c=getchar();putchar(c); } a a putchar (getchar()); printf(“%c”, getchar()); 不要忘记#include <stdio.h> 可以用getchar() 暂停程序执行执行; 读入控制字符 例子
4.5 格式输入与输出 4.5.1 printf 函数(格式输出函数format) printf的作用是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。 1. 一般格式:printf(格式控制,输出列表) 例如: printf(“%d%d”,a,b); 格式控制输出列表 printf(“a=%d b=%d”,a,b) 格式说明 普通字符输出列表 结果 a=3 b=4
2. 格式字符 1. d格式符。用来输出十进制整数。 • %d printf(“%d,%d”,a,b); • %md printf(“%4d,%4d”,a,b) a=123; b=12345; printf(%4d,%4d”,a,b); 123,12345 • %ld 输出长整型数 printf(“%ld,%ld”,a,b); printf (“%10ld”),a) ; 如:a=1234 则: 1234 2. o格式符。用来输出8进制整数。 • %o %mo • %lo int a = -1 printf(“%d,%o”,a,a); 结果:- 1 ,177777
3. x格式符。用来输出16进制整数。 • %x %mx %lx printf(“%d,%o,%x”,a,a,a); 结果:- 1 ,177777,ffff 注意在八进制和十六进制中并不能, 打印出0或 0x printf(“%d,0%o,0x%x”,a,a,a); 结果:- 1 ,0177777,0xffff
4. u格式符. 用来输出十进制无符号整数 例:main ( ){unsigned int a = 65535; int b = -2 ;printf(“a=%d,%o,%x,%u\n”,a,a,a,a);printf(“b=%d,%o,%x,%u\n”,b,b,b,b);} 运行结果为:a= -1,177777,ffff,65535 b= -2,177776,fffe,65534 以上四种格式可以互换,但是后三种无负数形式; 第一种格式应用较多,但是要注意数据的表示范围与输出格式的对应。 int -32768~+32767 unsigned 0~65535 int、short 占2B内存,long 占4B内存
5. c格式符。用来输出一个字符。 例:main ( ) {char a =‘a’;int b = 97; print(“%c,%d\n”,a,a); print(“%c,%d”,b,b);} 结果:a,97 a,97 整数的范围在0~255之间,可以用字符形式输出; 一个字符数据可以用整数形式输出。 也可指定字符宽度,如: printf(“%3d”,c)
6. s格式符。用来输出一个字符串。 • % s 原长输出 • % ms 字符串占m列,小于m左补空格 • % -ms 大于m原样输出,小于m右补空格 • % m.ns 输出占m列,只取字符串左端n个字符 • % -m.ns n个字符输出在m列的左侧,右补空格 例:main ( ) {printf(“%3S,%7.2s,% .4s,% -5.3\n”,“CHINA”,“CHINA”,“CHINA”,“CHINA”);} 结果:CHINA,CH,CHIN,CHI
7. f格式符。用来输出实数,以小数形式输出。 %f,不指定字段宽度,由系统自动指定。整数部分如数输出,并输出6位小数。单精度实数有效位数为7位;双精度实数有效位数为16位,小数6位。 如:main ( ){float x,y;x=111111.111;y=222222.222;printf(“%f”,x+y);} 结果:333333.326125 又如:main ( ){double x,y;x=1111111111111.111111111;y=2222222222222.222222222;printf(“%f”,x+y);} 结果:3333333333333.333010
%m.nf 指定输出的数据占m列,其中n位小数;右对齐。 % -m.nf 同上,左对齐。 例:main ( ){ float f=123.456;printf(“%f %12f %12.2f % -12.2f %.2f \n”,f,f,f,f);} 结果:123.455994123.455994123.46123.46123.46
8. e格式符。以指数形式输出实数。 % e 整数一位,小数6位,指数5位包括e和符号位. 例: printf(“%e,%e”,123.456,0.006543); 输出:1.234560e+002,6.543000e-003 % m.ne和% -m.ne 其中m为输出宽度,- 为左齐, n为尾数的小数位数. 例: float f = 123.456; printf(“% e,%10e,%10.2e,% .2e,% -10.2e”,f,f,f,f,f); 结果:1.234560e+002,1.234560e+002,1.23e+002, 1.23e+002,1.23e+002
9. g格式符。用来输出实数,自动选用%f或%e格式中格式较短的一种格式,不输出无意义的零。 如:float f = 123.456; printf(“%f,%e,%g”,f,f,f); 输出:123.456000,1.234560e+002,123.456
使用printf函数时,要注意: • X,E,G可以用大写, 但d不能写成D • 格式控制字符串中可以包括转义字符 • d、o、x、u、c、s、f、e、g等字符,紧接在“%”后面即为格式字符,在其它位置则为普通字符 printf(“c=%cf=%fs=%s”,c,f,s): • 若想输出“%”,则用连续两个“%”表示 如:printf(“%f % %”,1.0/3); 输出:0.333333% • 不同系统的格式输出,可能会有些小差别
4.5.2 scanf 函数(格式输入函数) scanf格式输入函数,用来输入任何类型的多个数据 一般格式:scanf (格式控制,地址列表) 例: main ( ) { int a,b,c; scanf(“%d%d%d”,&a,&b,&c); printf(“%d,%d,%d\n”,a,b,c);} 运行时的合法输入可以是: ①345 ②345 ③3 ④3(按Tab键)4 45 5 非法输入为:3 , 4 , 5
3 a 1cf4 8 b 1cf6 5 c 1cf8
scanf函数格式说明: 1. 格式字符与printf相同,只是没有%u和%g 2. 可以指定输入数据所占列数,系统自动按它截取所需数据,如: scanf(“%3d%3d”,&a,&b); 输入:123456 3. %号后的“”附加说明符,用来表示跳过它相应的数据,如: scanf(“%2d%*3d%2d”,&a,&b); 输入:1234567 4.输入数据时不能规定精度,如: scanf(“%7.2f”,&a);是不合法的.
应用scanf函数应注意: 1.格式控制后面是变量地址,而不是变量名 如:scanf(“%d,%d”,a,b); 是不对的 2.格式控制字符串中除了格式说明符以外的其它字符,在输入时要原样输入,如: scanf(“%d : %d : %d”, &a , &b ,&c); scanf(“a=%d , b=%d , c=%d”, &a , &b ,&c); 3.在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符,如: scanf(“%c %c %c”, &a , &b ,&c);输入:a b c 4.输入数据时,遇空格、回车、跳格、宽度结束、非法输入,该数据认为结束 scanf(“%d%c%f”,&a,&b,&c); 1234a1230.26
§4.6程序举例 例4.10 s=(a+b+c)/2 #include “math.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\n”,a,b,c); printf(“s=%7.2f,area=%7.2f\n”,s,area);} 运行: 3,4,6 a=3.00,b=4.00,c=6.00 s=6.50,area=5.33
例2: #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
#include “stdio.h” main() {char c1 ,c2 ,c3,c4; c1 = getchar(); c3 = getchar(); printf(“%c,%d\n”, c1 ,c1); printf(“%c,%d\n”, c3 ,c4); c2 = c1+32; c4 = c4+32; printf(“%c,%d\n”,c2 ,c2); printf(“%c,%d\n”,c4 ,c4);} A B
第三章结束 熟练掌握printf和scanf函数的用法
1.if ( ) ~ else ~ 2.for ( ) ~ 3.while ( ) ~ 4.do ~ while ( ) 5.continue 6.break 7.switch 8.goto 9.return 条件语句 循环语句 循环语句 循环语句 结束本次循环语句 中止执行switch或循环语句 多分支选择语句 转向语句 从函数返回语句 控制语句,完成一定的控制功能,共9种 例如: if (x > y) z = x;else z = y; while ( i <= 100 ) i=i+1;
函数调用语句 由一次函数调用加一个分号构成的语句 如: printf (“This is a C program!”); scanf(“%d”, &a); putchar(a); 又如:自定义函数 max( ) max (2 , 5); 函数调用语句 x = max (2 , 5);
表达式语句 有一个表达式构成一个语句 • 赋值表达式 a = 3 赋值语句 a = 3 ; • 分号是语句中不可缺少的一部分 • 任何表达式加上分号后都可以成为语句 如: i = i + 1 i = i + 1;n + + n + + ;x + y x + y ;(合法无意义) z = max (2 ,5) z = max (2 ,5) ; • C 程序中大多数语句是表达式语句,有人把C 称为“表达式语言” .
空语句 只有一个分号的语句,它什么也不做 如: ; 常用于被转向点、或循环语句的循环体 如: if ( x > = 0) ;else y = x ; while ( x = = 1) ;
复合语句 用 { } 把一些语句括起来成为复合语句 如: if (x > 0) {i+ +;sum = sum + x ;} else { j+ +;sub = sub + x;} 又如:循环体 while (x= = 1)i+ +;a = b + c ; while (x= = 1){i+ +;a = b + c ;}
A B 顺序结构 如流程图: 先执行A操作,再执行B操作,两者是顺序执行的关系。例程1: int x ,y,z;x = 2;y = 3;z = x+y; 例程2:main ( ) {int a,b,c,d;a = 8;b = 9;c = + +a;d = + +b;printf(“%d,%d,%d,%d”,a,b,c,d);}
p a b 选择结构 如流程图: 真 假 其中p代表一个条件,当条件成立则执行a,否则执行b;且只能执行a、b之一。例如: if (x > y) z = x;else z = y; 再如:if (x > 0) {i+ +;sum = sum + x ;} else { j+ +;sub = sub + x;}
P A A P 循环结构 有两种循环结构:当型结构和直到型结构 假 真 假 真 如:while ( I<= 10){i+ +;a = a + c ;} do {i+ +;a = a + c ;} while (i<= 10)
注意控制字符的问题 #include “stdio.h” main() { char b; printf (“Please enter a character:”); b=getchar(); putchar (b); getchar(); } 返回
思考题: 1. 正确的赋值语句是: A) a=1,b=2 B) i++; c) a=b=5 d) y=int (x); 2 . 非法的转义字符是: (1) A) ‘\t’ B) ‘\018’ C) ‘\n’ D) ‘\xaa’ (2) A) ‘\\’ B) ‘101’ C) ‘\’’ D) ‘\xaa’ (3) A) ‘\t’ B) ‘\011’ C) ‘\n’ D) ‘\o17’ 3. 不正确的八进制和十六进制数是: (1) A) 0x16 B) 016 C) -16 D) 0xaaaa (2) A) oxcc B) -017 C) -0x12 D) 0xffff 4. 不正确的数值和字符常量是: (1) A) 0.0 B) 5L C) o13 D) 986l (2) A) 8.9e1.2 B) 1e1 C) 0xFF00 D) 0.825e2 (3) A) “a” B)’\’” C) 0xaa D) 50.
5. printf (“%d\n”, (int)(2.5+3.0)/3);输出结果是: A) 有语法错误 B) 2 C) 1 D) 0 6.main() {int a=9; a+=a-=a+a; printf(“%d\n”,a);}输出结果是: A) 18 B) 9 C) -18 D) -9 7. #include <stdio.h> main() { char c1,c2,c3,c4,c5,c6; scanf(“%c%c%c%c”, &c1, &c2, &c3, &c4); c5=getcahr(); c6=getchar(); putchar(c1); putchar(c2); printf (“%c%c\n”,c5,c6);} 若输入为: 123 45678 则输出: A) 1267 B) 1256 C) 1278 D) 1245