450 likes | 512 Views
第 2 章 基本数据类型与常用库函数. 第 2 章 基本数据类型与常用库函数. 2.1 字符集与标识符 2.2 基本数据类型 2.3 常量与变量 2.4 输入 / 输出函数 2.5 常 用 函 数. 学习目标. 掌握标识符的命名规则 掌握标识符的命名规则 掌握各种基本类型常量的使用 学会变量的定义和初始化 理解整型数据的内存存储形式 学会使用基本数据的输入、输出函数 学会常用库函数的使用. 2.1 字符集与标识符. C 语言的字符集 大写英文字母 小写英文字母 数字: 0 1 2 3 4 5 6 7 8 9
E N D
第2章 基本数据类型与常用库函数 • 2.1 字符集与标识符 • 2.2 基本数据类型 • 2.3 常量与变量 • 2.4 输入/输出函数 • 2.5 常 用 函 数
学习目标 • 掌握标识符的命名规则 • 掌握标识符的命名规则 • 掌握各种基本类型常量的使用 • 学会变量的定义和初始化 • 理解整型数据的内存存储形式 • 学会使用基本数据的输入、输出函数 • 学会常用库函数的使用
2.1 字符集与标识符 • C语言的字符集 • 大写英文字母 • 小写英文字母 • 数字:0 1 2 3 4 5 6 7 8 9 • 其他符号:+ - * / % < > = ^ ~ | & ! # ’“ , . : ; ()[ ] { } _ ? \ 空格 • 标识符 • 给程序中的实体——变量、函数、数组、结构体及文件起的名字。
符号常量名 变量名 用户函数名 等 用户标识符 • 关键字 • 数据类型关键字:char、int、short、long、float、double、signed、unsigned、struct、union、enum、void。 • 存储类型关键字:auto、register、static、extern、typedef。 • 流程控制关键字:if、else、switch、default、case、while、do、for、break、continue、return、goto。 • 其他关键字:sizeof、const、volatile。 标识符 关键字 系统函数名 预编译命令 系统标识符
标识符的定义方法 规定:1. 只能由字母、数字、下划线三种字符组成。 2 .第一个字符必须是字母或下划线。 3 .C语言中大写字母与小写字母不同。 4 .标识符的命名要做到见名知义。 例如 NAME、_sum、max、i12、j_3、x1ab2、z2009_5是合法标识符。 NUM 1、3sum、double、usa$a5 是非法标识符。 AB、Ab、aB、ab各不相同。 空格 关键字 非字母或下划线开头 非字母、数字、下划线
短整型(short) 整型(int) 长整型(long) 整型 字符型(char) 实型(浮点型) 枚举类型(enum) 基本类型 构造类型 指针类型 空类型(void) 单精度型(float) 双精度型(double) 数组类型 结构体类型(struct) 共用体类型(union) 数据类型 2.2 基本数据类型
整型数据在内存中的存放形式 以补码形式表示,最高位为符号位 例:int a=-1,b=2; a 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 b 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2.2.1 整型数据 整型数据的长度、标识符与范围(VC++6.0 见表2.1) 1. int ( 32 bit 数的范围 -231 --(231-1) ) 2. short int ( 16 bit 数的范围-32768--32767 ) 3. long int -231--(231-1) 4. unsigned int 0-- (232-1) unsigned short int 0--65535 unsigned long int 0--4294967295 测定数据类型所占存储空间长度的运算符:sizeof 例:int a; sizeof(int) 或 sizeof(a) sizeof(类型标识符) 或 sizeof(变量名)
2.2.2 实型数据 • 实型数据在内存中的存放形式 占4或8个字节,在内存中以指数形式存放 • 实型变量的分类 • float 32 bit, 数范围 10-38---1038 6位有效位 • double 64 bit, 数范围 10-308---10308 16位有效位 float a,b,x; a=11111111.1111; b=11111111.1; x=123.456789E10; double y; y=123.456789E10; • 实型数据的舍入误差 有效位数float 6位 double 16位 #include <stdio.h> main() { float a,b; a=123456.789e5; b=a+20; printf(“\nb=%f\n”,b); } 运行结果: b=12345678848.000000
0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 a=‘A’; b=‘8’; c=‘\n’; 2.2.3 字符型数据 • 字符类型的数据存储单元中存放的是对应字符的ASCII代码。 • 一个字节存储一个字符。 • char a,b,c; • 以ASCII码参加运算,处理方法与整数相同。
2.3 常量与变量 2.3.1 常量 • 常量:在程序执行过程中,其值不能被改变的量。常量的类型由其书写格式决定。 • 整型常量(三种形式) 1.十进制整数——由数字0~9和正负号表示。 123, -56, 0, -19 2.八进制整数——由数字0开头,后跟数字0~7表示。 0123 即十进制的 83 -011 -9 020 16 3.十六进制整数——由0x开头,后跟0~9,a~f,A~F表示。 0x123 即十进制的 291 -0x56 即十进制的 -86 0x1a 即十进制的 26
2.3 常量与变量 • 整型常量的类型 1.int 2. long 3. int short 4. unsigned short a,b; unsigned int x,y; a=50000; x=50000; b=70000; 溢出 y=70000; 注意: 非负整型常数可视为无符号型常量,也可加后缀字符u或U,注意数的范围。 5. 整型数后加 L,l 表示long int 型。 12l, 89L, 02L
2.3 常量与变量 • 实型常量的表示方法 1.十进制小数形式。 0.123, 98.78 , 123. 0.0 2. 指数形式。 注意 : E 或e 前必须有数字,后为整数。 1e3, (1*103=1000) 142e-3 (142*10-3=0.142) 2.3E2 (2.3*102=230) 3. float类型实常量 实型常量均为double类型,即以8个字节存放,有效位数为16位,加f后缀则为float型实常量,有效位数为6--7。
转义字符 含义 转义字符 含义 \t \n 换行 水平制表 垂直制表 \b 退格 \v \r 回车 \f 换页 \a 响铃 \\ 反斜线 \‘ 单引号 \“ 双引号 2位16进制数代表的字符 \ddd 3位8进制数代表的字符 \xhh 2.3 常量与变量 • 字符常量 • 定义:用单引号括起来的单个普通字符或转义字符 • 字符常量的值:该字符的ASCII码值 • 转义字符:反斜线后面跟一个字符或一个代码值表示 • 转义字符及其含义:
例 2-1 输入一个字符,输出该字符的字形及其ASCII码。 #include <stdio.h> void main() { char ch; scanf(“%c”,&ch); // 输入一个字符 printf(“%c ASCII:%d\n”,ch,ch); // 输出该字符的字形及其ASCII码 } 运行结果: A↙ A ASCII:65
2.3 常量与变量 • 符号常量 • 在程序中指定用符号名代表一个常量,程序中可以使用符号名代替常量。 例 2-2 输入一个半径值,求圆周长和圆面积。 • #include <stdio.h> • #define PI 3.14159 • void main() • { • double r,k,s; • scanf("%lf",&r); // 输入半径 • k=2*PI*r; • s=PI*r*r; • printf("circle:%.2f area:%.2f\n",k,s); • // 其中%.2f表示保留2位小数 • } 运行结果: 1↙ circle:6.28 area:3.14
int a=1, b=-3,c; 地址 地址 地址 …... 1 a 4字节 变量名 a b -3 4字节 变量值 1 存储单元 c 4字节 …... 随机数 内存 编译程序根据变量定义为其 分配指定字节的内存单元 2.3.2 变量 • 概念:在程序运行过程中,其值可以被改变 • 变量定义的一般格式: 数据类型 变量1[,变量2,…,变量n]; • 变量初始化:定义时写作“变量名=表达式”的形式赋初值 例: float x,y; int i,j; char c; 决定分配字节数 和数的表示范围 • 变量的使用:先定义,后使用 • 变量定义位置:一般放在函数开头 • 变量名与变量值 合法标识符 例: int a=2,b,c=4; float data=3.67; char ch=‘A’; int x=1,y=1,z=1; int x=y=z=1;
2.3.2 变量 • 整型变量 • 占字节数随机器不同而不同,一般占一个机器字 • short≤int≤long • 可用sizeof(类型标识符)或sizeof(变量名)测量 • 实型变量 • float:占4字节,提供6~7位有效数字 • double:占8字节,提供16位有效数字 • 字符型变量 • 字符变量存放字符ASCII码 • char与int数据间可进行算术运算 例 a=‘D’; /* a=68; */ x=‘A’+5; /* x=65+5; */ s=‘!’+‘G’ /* s=33+71; */
2.4 输入/输出函数 C语言无I/O语句,I/O操作由函数实现 如:scanf()、printf()、putchar()、getchar()、puts()、gets()等函数 使用时应在源文件中包含头文件stdio.h #include <stdio.h>
2.4.1 格式化输入输出函数 • 格 式:printf(“格式控制串”,输出表) • 功能:按指定格式向显示器输出数据 • 返回值:正常,返回输出字节数;出错,返回EOF(-1) • 输出表:要输出的数据(可以没有,多个时以“,”分隔) • 格式控制串:包含两种信息 • 格式说明:%[修饰符]格式字符,用于指定输出格式 • 普通字符或转义序列:原样输出 • 例:int a=1,b=2; printf(“a=%d,b=%d”,a,b); 运行结果: a=1,b=2
printf()函数的格式说明符及其作用 十进制整数 567 d,i int a=567;printf ( “%d”,a); 十六进制无符号整数 x,X int a=255;printf(“%x”,a); ff 11 11 11 11 11 11 11 11 o 八进制无符号整数 int a=65;printf(“%o”,a); 101 不带符号十进制整数 u 567 int a=567;printf(“%u”,a); 单一字符 char a=65;printf(“%c”,a); A c printf(“%s”,“ABC”); ABC 字符串 s float a=567.789;printf(“%e”,a); 5.677890e+02 指数形式浮点小数 e,E 小数形式浮点小数 f float a=567.789;printf(“%f”,a); 567.789000 g e和f中较短一种 567.789 float a=567.789;printf(“%g”,a); 百分号本身 %% printf(“%%”); % 65535 例 main() { unsigned short int u=65535; printf(”u=%d\n",u); } 输出结果:u=-1 例 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 • 说明 • 格式字符要用小写 • 格式字符与输出项个数应相同,按先后顺序一一对应 • 输出转换:格式字符与输出项类型不一致,自动按指定格式输出
例2.3 分别用十、八、十六进制形式输出整型数据。 #include <stdio.h> void main() { int a=27; printf("%d%o%x%u\n",a,a,a,a); // 输出各数间无分隔符 printf(“%d,%o,%x\n”,a,a,a); // 输出各数间用逗号分隔 printf("a=%5d,a=%5o,a=%5x\n",a,a,a,a); // %5d指定a的输出宽度占5列 } 程序执行: 27331b27 27,33,1b a= 27,a= 33,a= 1b
例2.4 字符的输出。 #include <stdio.h> void main() { char c='a'; int b=97; printf("%c,%d\n",c,c); printf("%c,%d\n",b,b); printf("%c,%d\n",c+1,c+1); // 计算c+1的值为98,即b printf("%c,%d\n",c-32,c-32); // 将小写字母转换为大写字母 } 程序执行: a,97 a,97 b,98 A,65
修饰符 功 能 m 输出数据域宽,数据长度<m,左补空格;否则按实际输出 对实数,指定小数点后位数(四舍五入) 对字符串,指定实际输出位数 .n 输出数据在域内左对齐(缺省右对齐) - 指定在有符号数的正数前显示正号(+) + 输出数值时指定左面不使用的空位置自动填0 0 # 在八进制和十六进制数前显示前导0,0x 在d,o,x,u前,指定输出精度为long型 在e,f,g前,指定输出精度为double型 l printf()的附加说明符及其意义
例2.5 单、双精度实型数据的输出。 #include <stdio.h> void main() { float f=314.15; double d=3.1415926; printf("f=%f, f=%e\n",f,f); printf("d=%f, d=%e\n",d,d); printf("d=%6.3f, d=%6.2f, d=%.3f\n",d,d,d); } 程序执行: f=314.149994, f=3.141500e+002 d=3.141593, d=3.141593e+000 d= 3.142, d= 3.14, d=3.142
例2.6输入一个整数,表示时间秒数,转换成时间格式hh:mm:ss输出。例2.6输入一个整数,表示时间秒数,转换成时间格式hh:mm:ss输出。 #include <stdio.h> void main() { int t,h,m,s; scanf("%d",&t); h=t/3600; // 小时数,1小时合3600秒 m=(t-h*3600)/60; // 分钟数,1分钟合60秒 s=t-h*3600-m*60; // 秒数 printf("%02d:%02d:%02d\n ",h,m,s); } 程序执行: 10000↙ 02:46:05
scanf函数 • 格 式: scanf(“格式控制串”,地址表) • 功能:按指定格式从键盘读入数据,存入地址表指定的 • 存储单元中,并按回车键结束 • 返回值:正常,返回输入数据个数 • 地址表:变量的地址,常用取地址运算符& • scanf函数从格式控制字符串的首字符开始输入,到格式控制字符串尾部结束输入。 • 遇非格式说明符则必须原样输入与之抵消。 • 遇格式说明符则以此格式输入数据存放到地址列表中对应的变量内存单元中。
作用 %d 输入一个十进制整数 格式说明符 %I或%i 用来输入一个整数,可以是十进制数、带前导0或0x的八进制或十六进制数 %o 以八进制形式输入一个整数(可带前导0,也可不带) %x 以十六进制形式输入一个整数(可带前导0x或0X,也可不带) %u 输入一个无符号的十进制整数 %c 用来输入一个字符 %s 输入一个字符串,将输入的整个字符串存入到一个字符数组中。遇空格或回车键结束,并自动在最后加存一个’\0’,作为字符串的结束标志 %f或%e 两个格式相同,用来输入实数,可以以小数形式或指数形式输入 scanf()的格式说明符及其作用
例2.7 以hh:mm:ss形式输入当前时间,输出合时间秒数。 #include <stdio.h> void main() { int t,h,m,s; scanf("%d:%d:%d",&h,&m,&s); // 输入时间 t=h*3600+m*60+s; // 计算合时间秒数 printf("%d\n",t); } 程序执行1: 8:10:12↙ 29412 程序执行2: 8 10 12↙ -858964708
例2.8 整型数据的输入。 #include <stdio.h> void main() { int a,b; scanf("%d%x",&a,&b); // 分别以十进制、十六进制形式输入a、b printf("a=%d,b=%d\n",a,b); } 程序执行1: 27 27↙ a=27,b=39 程序执行2: 27,27↙ a=27,b=-858993460
例2.9字符型数据的输入。 #include <stdio.h> void main() { char c1,c2,c3; scanf("%c%c%c",&c1,&c2,&c3); printf("%c,%c,%c\n",c1,c2,c3); } 程序执行1: abc↙ a,b,c 程序执行2: a b c↙ a, ,b
例2.10浮点型数据的输入。输入两个数,求它们的和。例2.10浮点型数据的输入。输入两个数,求它们的和。 #include <stdio.h> void main() { double x,y,sum; printf("Input x y:\n"); // 输入提示 scanf("%lf%le",&x,&y); // 输入double类型数据要用格式符%lf或%le sum=x+y; printf("sum=%.3f\n",sum); } 程序执行: 1.2345 6.789↙ sum=8.024
修饰符 功 能 h 用于d,o,x前,指定输入为short型整数 用于d,o,x前,指定输入为long型整数 l 用于e,f前,指定输入为double型实数 m 指定输入数据宽度,遇空格或不可转换字符则结束 抑制符,指定输入项读入后不赋给变量 * scanf()的附加说明符及其意义 例 scanf(“%4d%2d%2d”,&yy,&mm,&dd); 输入 20090308 或 输入 2009 3 8 则2009yy, 3 mm, 8 dd • 例 scanf(“%3d%*4d%6f”,&k,&f); • 输入 12345678765.43 • 则123k, 8765.4f 例 scanf(“%3c%2c”,&c1,&c2); 输入 abcde 则‘a’c1, ‘d’ c2 • 例 scanf(“%2d%*3d%2d”,&a,&b); • 输入 1234567 • 则12a, 67b
例2.11 输入数据时规定域宽。 #include <stdio.h> void main() { int a; double x; scanf("%3d%lf ",&a,&x); printf("a=%d,x=%f\n",a,x); } 程序执行: –1234 56.78↙ a=-12,x=34.000000
scanf函数 • 说明: • 用“%c”格式符时,空格和转义字符作为有效字符输入 • 输入的数据项先存放在内存输入缓冲区中,在按回车键后,才按输入格式从缓冲区依次读数据,多出数据留在缓冲区内,可被下一个输入语句使用 • 输入数据时,遇以下情况认为该数据结束: • 遇空格、TAB、或回车 • 遇宽度结束 • 遇非法输入 如 scanf(“%d%c%f”,&a,&b,&c); 若输入1234a123o.26 则 1234 a, ‘a’ b, 123 c
2.4.2 单个字符的输入输出 字符输出函数putchar • 格 式: putchar( c ) • 参 数: c为字符常量、变量或表达式 • 功能:把字符c输出到显示器上 • 返回值:正常,为显示的代码值;出错,为EOF(-1) 例2.13 putchar()函数的使用。 #include <stdio.h> void main() { char c='A'; putchar(c); putchar('A'); // 输出字符A putchar('\n'); // 输出一个回车换行符 putchar('\101'); // 输出ASCII码为101(八进制)对应的字符A putchar(65); // 输出ASCII码为65(十进制)对应的字符A } 程序执行: AA AA
2.字符输入函数(getchar) • 格 式: getchar( ) • 功能:从键盘读一字符 • 返回值:正常,返回读取的代码值;出错,返回EOF(-1) 例2.14 getchar()函数的使用。 #include <stdio.h> void main() { char c1,c2,c3; c1=getchar(); // 输入一个字符赋值给变量c1 c2=getchar(); c3=getchar(); putchar(c1); putchar(c2); putchar(c3); } 程序执行1: abc↙ abc 程序执行2: a b c↙ a b 程序执行3: a↙ b↙ a b
2.5 常用函数 • C语言处理程序提供的函数称为库函数。 • 用户使用库函数时只需将包含库函数执行所需信息的头文件包含到程序中即可使用它。 • #include <头文件名> 例:#include <stdio.h> • 库函数名(实参数表列) 例:sin(0.5); • 函数原型 • 确定函数的实参类型及返回值类型 例:cos的函数原型是 double cos(double x)
文件包含预处理命令 变量定义 输入数据 调用函数 输出数据 例 2.15 输入一个正数,求它的平方根值。 #include <stdio.h> #include <math.h> void main() { double x,y; scanf(“%lf”,&x); x=fabs(x);// 调用函数求|x| y=sqrt(x); // 调用函数求 printf(“%.4f\n”,y); } 运行结果: 3↙ 1.7321
2.5.1 常用数学函数 使用时,应在源文件中包含头文件math.h 1.平方根函数sqrt 函数原型:double sqrt(double x) 功能:计算 。例:sqrt(56.78); 2.绝对值函数fabs 函数原型:double fabs(double x) 功能:计算|x|。例:fabs(-123.456);返回值为123.456。 3.指数函数pow 函数原型:double pow(double x,double y) 功能:计算x y。例:pow(2.2,3.5); 返回值为2.23.5。 4. e的指数函数exp 函数原型:double exp(double x) 功能:计算e x。例:exp(7.8); 返回值为e7.8。 5.正弦函数sin 函数原型:double sin(double x) 例:sin(60*3.14159/180); 返回值为60°正弦值。
2.5.2 常用字符函数 使用时,应在源文件中包含头文件ctype.h 1.大写字母转换为小写字母函数tolower 函数原型:char tolower(char x) 返回值:x是大写字母时返回对应的小写字母,否则返回x。 例:tolower(‘D’)为d, tolower(‘#’)为# 。 2.检查字母函数isalpha 函数原型:int isalpha(char x) 返回值:x是字母时,返回非0,否则返回0。 例:isalpha(‘x’)为非0 , isalpha(48)为0 。 3.检查大写字母函数isupper 函数原型:int isupper(char x) 返回值:x是大写字母时,返回非0,否则返回0。 例:isupper(‘B’)为非0, isupper(‘b’)为0 。
2.5.2 常用字符函数 4.检查数字字符函数isdigit 函数原型:int isdigit(char x) 返回值:x是数字字符时,返回非0,否则返回0。 例:isdigit(‘7’)为非0, isdigit(‘\007’)为0 。 5.检查字母、数字字符函数isalnum 函数原型:int isalnum(char x) 返回值:x是字母、数字时,返回非0,否则返回0。 例:isalnum(‘\X20’)为0 , isalnum(‘A’)为非0 , isalnum(27)为0 。
2.5.3 其他常用函数 使用时,应在源文件中包含头文件stdlib.h 1.随机数发生器函数rand 函数原型: int rand(void) 返回值:产生一个0~32767之间的随机整数。 例:rand()返回产生的随机数。 2.初始化随机数发生器函数srand 函数原型: void srand(unsigned a) 功能:以给定数初始化随机数发生器。 例:srand(time(0));rand(); 以当前系统时间初始化随机数发生器,再产生一个随机数。其中time为系统库函数,对应头文件为time.h,它能得到当前的系统时间。
例2.16 由计算机随机生成一道加法题目。 #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { int a,b; srand(time(0)); // 第6行 a=rand(); b=rand(); printf("%d+%d=\n",a,b); } 程序执行1: 28141+24840= 程序执行2: 2591+11861=
3. 终止程序运行函数 exit 函数原型: void exit(int a) 使用方式: exit(a) 功能:使程序立即正常地终止,a的值传给调用过程。 例如:exit(0);立即终止程序的执行。