1、第四讲 输入输出和库函数,引例 字符串常量 符号常量 格式化输入输出 字符输入输出 库函数,2/30,引例,输入输出和库函数,/*计算任意一个球体的体积。volume = 4/3r3(cw03-01.c)*/ #include #include #define PI 3.14159 /定义符号常量一般用大写,也可以用小写 #define XIN “* “ /定义符号常量为一串字符int main() /定义主函数 double r, volume; /定义r和volume为双精度变量,为什么?system(“color 1a“); /颜色函数printf(“Please input the r
2、adius of a ball: “); /提示信息scanf(“%lf“, ,问题:计算任意一个球体的体积。 volume = 4/3r3 源程序(cw03-01.c),3/30,符号常量,符号常量 符号常量是用一个标识符表示的常量。 定义规则#define 举例,输入输出和库函数,#define MAXSIZE 20#define WELCOME “Welcome to you!“#define BX “=“#define PI 3.1415926#define P printf(“*”),编译预处理器将会用3.1415926替换以后出现的PI标识符。,#undef PI /是用来撤销宏定
3、义的,定义符号常量的目的是便宜维护。如果需要在多个地方用到同一个常量,而且必须改变它的值,则只需要修改其符号常量的定义。就可以了,4/30,用const定义变量为只读变量,在定义宏常数的时候用const,编译器给const修饰的只读变量做类型校验,减少错误的可能。但要注意const修饰的不是常量而是readonly的变量,const修饰的只读变量不能用来作为定义数组的维数,也不能放在switch关键字后面。定义时初始化。,另一种定义近似符号常量-只读变量-的方法 使用const把一个变量声明转换成只读变量。 const float pi=3.1425926; 常量只能在定义时赋值,然后不能再改
4、变其值 常数、 const常量、宏常量和枚举常量,都可以用来表示一个永远不会改变的数 如重力加速度G=980,()PI=3.14因为有可能在不同的地方重力加速度可能不一样,PI的精度可能不一样,可以在程序中稍加修改即可使用。 注意: const修饰定义的变量为常量,有值和类型。宏没有,5/30,字符串常量,字符串常量 用双引号括起来的字符序列。“this is a string“ “x“ “12345“ 字符串常量的存储方式 字符串中的字符存放在相邻的存储单元中,每个字符占用一个单元,在最后加上一个空字符(0)作为结束标识符。所以字符串常量的占内存长度比其所占字节多1个字节。 举例,输入输出和
5、库函数,多少字符?16 占多大内存?17,6/30,字符串常量,字符串常量和字符常量的区别 字符x是基本型数据。 字符串”x”是构造型数据。 占用的存储空间大小不同。,输入输出和库函数,0 表示数字 0表示0字符-常用在将数字转换为字符 0表示具有0值的字符(NUL空字符) “0”表示字符串0和0的字符,用两个字节存储,注意 区别:,Char c; C=5+0;,注意: 有字符常量,有字符变量 但有字符串常量,而无字符串变量,7/30,字符串(String)常量,用双引号括住的由0个或多个字符组成的字符序列 “I am a string“ “表示空字符串 转义字符也可以在字符串中使用 引号只作
6、为字符串开始和结束的标志 C语言内部用0表示字符串的结束 除注释外,是唯一可以出现中文的地方 “x“和x是不同的 里定义了一系列专门的字符串处理函数,8/30,字符串是用双引号括起来的字符序列。 (1)字符用单引号括起来,而字符串用双引号括起来;两者不能混淆。 (2) 不能将字符串赋给一个字符变量。 (3)单引号括起来的只有一个字符,而双引号括起来的有多个字符。不管显示出来有多少个字符,字符串都有一个看不见的字符0 。C语言规定:以字符0作为字符串结束的标志。在写字符串时不必加0 , 0字符是系统自动加上的。字符:a ,字符串:”a ”中有两个字符a 和0 , 其中0 是ASCII码值为0的字
7、符,是空字符。比如字符串“CHINA” 个字符,占个字节内存。,字符串(String)常量,9/30,输入输出,输入输出是以计算机主机为主体而言的。 输出(Output):从主机向外部输出设备输出数据。 输入(Input):从外部通过输入设备向主机输入数据。,输入输出和库函数,按直线排列的字符序列 每个序列包括0个或多个字符,并用换行符结尾 ANSIC支持至少254个字符的序列 所有的输入/输出都是用流来进行的。,流(stream),10/30,标准输入输出流,开始执行程序时,3个流自动连接到程序上 标准输入流(standard input)对应的源端设备:keyboard 标准输出流(sta
8、ndard output)对应的目的端设备:screen 标准错误流(standard error)对应的目的端设备:screen操作系统允许这些流重定向到其它设备,输入输出和库函数,type myprog.c prn,输出重定向符,myprog data.txt,输入重定向符,11/30,输入输出函数,C语言中数据的输入、输出是由函数来实现的。 字符输入函数:getchar() 字符输出函数:putchar() 格式输入函数:scanf() 格式输出函数:printf()它们都属于函数库的输入输出函数,其原型(prototype)都在stdio.h头文件(header file)中。程序中必
9、须包含 stdio.h 头文件,输入输出和库函数,#include ,12/30,字符输出,putchar 使用形式 putchar(character); 向标准输出流输出一个字符character,输入输出和库函数,举例(cw0302.c),#include int main() char a; int b;a=B;b=79;putchar(a); putchar(n);putchar(b); putchar(n);putchar(Y);return 0; ,B O Y,使用说明 character可以是以下数据: 字符型数据 整型数据 转义字符,如果b=7或者10输出什么?,13/30,
10、字符输入,getchar 使用形式 variable = getchar(); 从标准输入流读取一个字符。 使用说明 只读取一个字符。 (输入多于一个时只接收第一个字符) 该字符可赋给字符变量、整型变量或作为表达式的一部分。,输入输出和库函数,举例(cw0303.c),#include int main() char c;c=getchar();putchar(c); putchar(“n”);return 0; ,a a,abc a,98 9,1,2,3,14/30,使用形式 printf(, ); 按格式控制字符串规定的格式,向指定的输出设备输出列表中的输出项。,输入输出和库函数,prin
11、tf,格式控制字符串由双引号括起来的字符串,用于指定输出格式 输出列表需要输出的数据列表,彼此间用逗号分隔,输出项可以是任意合法的表达式,使用说明,格式输入输出,printf()函数 scanf()函数,格式输出,程序中一般必须指定包含 stdio.h 头文件,使用说明,#include ,仅有printf可以省略此命令,15/30,格式输出,格式控制字符,输入输出和库函数,只表示将输出项转换成指定的格式输出,16/30,格式输出,格式修饰符,输入输出和库函数,17/30,l 长整型整数,加在d、o、x、u前 L long double型数,加在f、e、g前 m 表示数据占用的最小宽度数据宽度
12、大于m,按实际宽度输出数据宽度小于m时,输出数据前或后补空格 n 对实数表示输出n位小数对字符串表示最多输出的字符个数改变输出内容的对齐方式,缺省为右对齐 + 指定在有符号数的正数前显示正号(+) 0 输出数值时指定左面不使用的空位置自动填0 # 在八进制和十六进制数前显示前导0,0x,printf附加格式说明符,18/30,输入输出和库函数,printf(“n=%5d,x=%-5d,f=%5.2fn”, 3,8,6.235),普通字符 原样输出,格式说明符(转换规则) % 修饰符 格式字符 指定数据的输出格式,5字符宽,2位小数,举例,例 int a=1234;float f=123.456
13、;printf(“%08dn”,a); /00001234 printf(“%010.2fn”,f); /0000123.46printf(“%0+8dn”,a); /000+1234printf(“0+10.2fn”,f); /000+123.56,输出,19/30,格式输出,举例,/*输出不同格式的数cw0304.c */ #include int main() int x=97,b=-1,a=567;float f=123.456;printf(“%d,%cn“,x,x); /%d改%i效果一样printf(“%d,%o,%x,%un“,b,b,b,b);printf(“%f,%e,%g
14、ENDn“,f,f,f);printf(“%8.2fn“,f); printf(“+8.2fn“,f); printf(“%8dn“,a); printf(“%-8dn“,a); return 0; ,VC,基本整型长4个字节,TC或者其他编译环境或者是不同的机型,结果可能不同,输入输出和库函数,20/30,格式输出,举例(cw0305.c),输入输出和库函数,int main() int a=1,b=2,c=3;printf(“%d,%d,%d,%dn”,a,b,c); /%d改%i效果一样printf(“%d,%d,%dn”,a,b,c,a+b+c);return 0; ,1,2,3,89
15、8 1,2,3,格式说明符和输出项在数量和类型上应该一一对应。,不同时间,结果可能不同,VC+6.0结果,可见输出的格式和项数由格式决定。,有格式无输出项,则输出c变量之后的4字节内存值。,21/30,scanf,使用形式scanf(, ); 按格式控制字符串规定的格式,从指定的输入设备读入数据,并存放到地址列表中的各地址项指定的变量中。,格式输入,输入输出和库函数,用 %d 格式符:输入的数据必须是整数。 用 %f 格式符:输入的数据可以是整数或浮点数(定点表示、指数表示均可),系统将自动转换为 float 型或 double 型。 用 %c 格式符:输入的的字符不能加单引号。 用 %s 格
16、式符:输入的的字符串不必加双引号。但遇到空格、制表符、或换行符时将终止接收。,对输入数据的要求,对于非格式字符串,输入时必须原样输入,即使是转义字符也必须输入。 如果数值输入完后再输入字母则不能加格式分隔符,直接输入字母见实验教材P29体验2. 只要能正确区分输入就不加任何多余的符号,请一定不要加转义字符。,输入不能像输出一样加精度控制%5.2d。,22/30, 如果两个格式符之间无任何分隔符,输入时两个数据之 间可以用下列符号分隔: 空格 Tab 符 回车 应使用回车键结束一个scanf函数中所有数据的输入。 如果格式符之间有普通字符或转义符,输入时在对应的两个输入数据之间输入这些字符或转义
17、符对应的符号。,int m,n ; scanf(“%d%d“,例:,输入: a= 25, 50n,例:,int m,n ; scanf(“%dABC%d“,输入: 25ABC 30,输入: 25 50,例:,int m,n ; scanf(“a=%d,%dn“,/*输入几个字符间是不用分隔的,不用按空格、Tab键、回车,但输入完毕后要按回车键*/,使用说明,23/30,格式输入,格式字符,输入输出和库函数,24/30,格式输入,格式修饰符,输入输出和库函数,注意:scanf()函数中无精度控制,scanf($5.3f”,&x)是错误的 这里不能指定小数位数。与输出修饰符有明显的不同,25/30
18、,输入输出和库函数,scanf(“%d%d”, &a, &b),取地址运算符:& &,得到变量在内存中的地址。,地址列表,/*注意,数值输入完后的结束符可以是回车、空格、Tab键,也可以是其它字母,因此在下一个输入项是字符时,直接输入字符即可不用再按回车或者Tab键这里例如输入:87 100 45.34 78.85Ac*/,scanf(“%d,%d”, &a, &b),格式符间用逗号,输入数间也用逗号,格式符间无符号,输入数间用空格,请注意!,scanf(“%2d%4d%d”,&x,&y,&z);,终端输入:1234567,x为12,y为3456,z为7,如果输入1 234567则x=1,y=
19、2345,z=67,26/30,格式输入,举例(cw0306.c),输入输出和库函数,#include int main() char a,b,c;scanf(“%c%c%c”, ,用 c 格式字符输入字符时,若格式控制字符串中无普通字符,那么认为所有输入的字符(包括空格、制表符、换行符)均为有效字符。,输入缓冲区,输入流,输入流,scanf(); getchar();,TC,VC,格式符间无符号,输入字符间不用空格,27/30,格式输入,用c格式字符输入字符时,若格式控制字符串中加入空格作为分隔符,那么输入时各数据之间可以加任意多个空格、制表符或回车符)。 例:scanf(“%c %c %c
20、”, 输入:a b c 则 a=a,b=b,c=c 输入多项数值数据时,格式控制字串中无非格式字符作输入数据间的分隔,在下列情况下可认为数据输入结束: 遇到空格、回车、制表符。 按指定的宽度结束 遇非法输入结束(如用%d输入125A时A为非法输入),输入输出和库函数,28/30,输入输出和库函数,#include void main() int a,b;float x,y;char c1,c2;/*printf(“请按格式输入2个整数,2个浮点数,2个字符n“); */*如果按书上的格式输入程序,则应当如下形式输入数据:a=3b=8x=9.34y=786.4c1=Ac2=a (注意:这里每一个
21、输入语句中都没有换行符)。 否则结果不正确,为什么?因为节约内存,只要能区分开数值与字符就不加多余的按键*/scanf(“a=%db=%d“, ,/*按格式输入数据,则应当:a=3b=8x=9.34y=786.4c1=Ac2=a 否则结果不对,为什么?因为节约内存,只要能区分开数值与字符就不加多余的按键*/,/* p28ty2.c实验教材P28体验2应当怎样输入?*/,这样输入麻烦不麻烦?当然麻烦,因此,我们在写输入格式时,尽量不写原样输入的字符。要加提示,就在上行加printf()函数说明。,29/30,数学库函数,使用标准库中的数学函数 包含数学函数库的头文件#include 常用的数学函
22、数的原型 int abs(int n) double fabs(double x) double sqrt(double x) 使用举例 int n = abs(-21); double v = pow(r, 3.0);,输入输出和库函数,C语言是函数语言, 为了方便用户编程,每一种C语言编译系统都提供了一批由厂家开发的函数来完成一定的功能,放在一个库中,这就是函数库。其中的函数称为库函数。有许多类,如输入输出、日期和时间、字符、字符串、数学、诊断、图形、分类、目录路径、转换、接口、内存管理、进程控制等。由命令#include 调用,它不是C语言的语句,所以不用加分号。多达几百甚至更多。在:C
23、:Program FilesMicrosoft Visual StudioVC98Include,标准库函数见附录四,注意!对数函数和指数函数。,1、使用库函数,必须先调用相应的预处理头文件。 2、注意函数的变量和函数本身的数据类型甚至单位(三角函数用弧度) 3、不清楚时请查编译系统的函数手册。,30/30,小结,C语言中的字符串常量 C语言中的符号常量 C语言中常用的输入输出函数 使用标准库中的数学函数,#include int main() long int x;x=time(0); printf(“%ld“,x); return 0; /计算从1970年1月1日午夜以来的时间秒数,举例(cw0307.c),请自学本章教材内容并 预习下一章的内容与实验,请自己做本章的习题与实验体验,本章到此结束,谢谢您的光临!,THANK YOU VERY MUCH !,