510 likes | 707 Views
第二讲 C 语言概述. 主讲:周春容. 2.0 预备知识 2.1 常量与变量 2.2 数据类型 2.3 常用输出与输入函数 练习与实践. 2.0 预备知识 计算机中数的表示及进制转换 数码、基与权 数码:表示数的符号 基:数码的个数 权:每一位所具有的值 数制. 十六进制数. 数制. 十进制数. 二进制数. 八进制数. 数码. 0~9. 0~1. 0~7. 0~9,A~F,a~f. 基. 10. 2. 8. 16. 权. … ,10²,10¹ 10 º. … , 2², 2¹, 2 º.
E N D
第二讲 C语言概述 主讲:周春容
2.0预备知识 • 2.1常量与变量 • 2.2数据类型 • 2.3常用输出与输入函数 • 练习与实践
2.0预备知识 计算机中数的表示及进制转换 数码、基与权 数码:表示数的符号 基:数码的个数 权:每一位所具有的值 数制
十六进制数 数制 十进制数 二进制数 八进制数 数码 0~9 0~1 0~7 0~9,A~F,a~f 基 10 2 8 16 权 …,10²,10¹10º …,2², 2¹, 2º … ,8², 8¹, 8º …,16², 16¹, 16º 表示 特点 逢十进一 逢二进一 逢八进一 逢十六进一 十六进制:81AE=816³+116² +1016¹+1416º 八进制:4275=48³+28² +78¹+58º 十进制:4956= 410³+910² +510¹+610º 二进制:1011=12³+02² +12¹+12º
各种进制之间的转换 • 二进制、八进制、十六进制转换成十进制 • 方法:按权相加
例 把十进制数159转换成八进制数 余 7 余 3 余 2 例 把十进制数59转换成二进制数 0 2 8 59 159 1 余 2 2 2 8 2 8 2 7 19 3 14 29 2 1 (159)10=(237)8 余 1 例 把十进制数459转换成十六进制数 余 0 2 3 7 1 C B 余 1 459 16 余11 余 1 余12 16 28 余 0 1 16 1 余 1 1 1 1 0 1 1 0 (59)10=(111011)2 (459)10=(1CB)16 • 各种进制之间的转换(整数) • 二进制、八进制、十六进制转换成十进制 • 方法:按权相加 • 十进制转换成二进制、八进制、十六进制 • 原理: • 方法:连续除以基,从低到高记录余数,直至商为0
二进制与八进制之间的转换 • 二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制 • 八进制转换成二进制:用3位二进制数代替每一位八进制数 000 ~ 0 001 ~ 1 010 ~ 2 011 ~ 3 100 ~ 4 101 ~ 5 110 ~ 6 111 ~ 7 例 (1101001)2=(001,101,001)2=(151)8 例 (246)8=(010,100,110)2=(10100110)2
二进制与十六进制之间的转换 • 二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制 • 十六进制转换成二进制:用4位二进制数代替每一位十六进制数 0000 ~ 0 0001 ~ 1 0010 ~ 2 0011 ~ 3 0100 ~ 4 0101 ~ 5 0110 ~ 6 0111 ~ 7 1000 ~ 8 1001 ~ 9 1010 ~ A 1011 ~ B 1100 ~ C 1101 ~ D 1110 ~ E 1111 ~ F 例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16 例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2
0 1 2 3 4 5 7 6 7 6 5 4 3 2 1 0 7 6 8 5 9 4 10 3 ……... 2 1 • 字节和位 • 内存以字节为单元组成 • 每个字节有一个地址 • 一个字节一般由8个二进制位组成 • 每个二进位的值是0或1
12 1 11 2 10 9 3 8 4 5 7 6 • 数值的表示方法——原码、反码和补码 • 原码:最高位为符号位,其余各位为数值本身的绝对值 • 反码: • 正数:反码与原码相同 • 负数:符号位为1,其余位对原码取反 • 补码: • 正数:原码、反码、补码相同 • 负数:最高位为1,其余位为原码取反,再对整个数加1 9-5=4 9+7=16=(14)12
为什么用补码表示? 25-19=25+(-19) (25)10=(00011001)2 (-19) 10 =(11101101) 2 00011001 + 11101101 ----------------- 100000110
为什么用补码表示? 19 - 25 = 19 +(- 25) (19)10=(00010011)2 (-25) 10 =(11100111) 2 00010011 + 11100111 ----------------- 11111010 -------(-6)? 引入补码之后符号位也进入了运算,不用再单独处理符号位
(用一字节表示数) 原码 反码 补码 +7 00000111 00000111 00000111 -7 10000111 11111000 11111001 +0 00000000 00000000 00000000 -0 10000000 11111111 00000000 01111111~ 10000000 (-128~+127) 01111111~ 10000000 (-127~+127) 01111111~ 11111111 (-127~+127) 数的范围 • 负数补码转换成十进制数:最高位不动,其余位取反加1 例 补码:11111001 取反:10000110 加1: 10000111=-7
2.1常量与变量 标识符 定义:用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 大小写敏感 不能使用关键字 长度:最长32个字符 命名原则: 见名知意 不宜混淆 如l与I, o与0 • 例:判断下列标识符号合法性 • sum Sum M.D.John day Date 3days • student_name #33 lotus_1_2_3 • char a>b _above $123 M.D.John 3days #33 char a>b $123
常量 • 定义:程序运行时其值不能改变的量(即常数) • 分类: • 符号常量:用标识符代表常量 • 定义格式: #define符号常量 常量 • 一般用大写字母 • 是宏定义预处理命令,不是C语句 • 直接常量: • 整型常量 • 实型常量 • 字符常量 • 字符串常量 例 符号常量举例 #define PRICE 30 main() { int num,total; num=10; total=num*PRICE; printf("total=%d",total); } 如 #define PRICE 30 运行结果:total=300
变量------其值可以改变的量 概念: 每个变量有一个名字:用标识符表示。 每个变量有一个存储空间(存储单元),该单元中的状态所表示的数为此时变量的值。 • 变量的使用:先定义,后使用 • 变量定义的一般格式: 数据类型 变量1[,变量2,…,变量n]; 如:int a,b,c; float x,y; 合法标识符 • 变量初始化:定义时可以赋初值
int a=1, b=-3,c; 地址 地址 地址 …... 1 a 2字节 b -3 2字节 c 2字节 …... 随机数 内存 编译程序根据变量定义为其 分配指定字节的内存单元
main() { int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%f\n”,data); } 变量定义 可执行语句 main() { int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%f\n”,data); } • 变量定义位置:一般放在函数开头 例: 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; 例1 int student; stadent=19; //Undefined symbol ‘statent’ in function main 例2 float a,b,c; c=a%b; //Illegal use of floating point in function main
每一个变量都有一个类型,表明了为它的存储属性:每一个变量都有一个类型,表明了为它的存储属性: 分配空间的大小; 表示的数的范围; 所能进行的运算。
例2.1 main() { float length,area,radius; /*length为周长,area为面积,radius半径*/ printf("\nEnter a radius: "); scanf("%f",&radius); length=2*PI*radius; /*计算圆的周长*/ area=PI*radius*radius; /*计算圆的面积*/ printf("\n length is : %f ",length); printf("\n area is : %f ",area); } 程序的运行情况为: Enter a radius: 2.8 ↙ length is : 17.584000 area is : 24.617599
整 型 基本类型 单精度型float 实型 双精度型double 字符类型char 数组 短整型short 结构体struct C 数 据 类 型 整型int 共用体union 构造类型 长整型long 枚举类型enum 指针类型 空类型void 定义类型typedef • 2.2数据类型 • 数据类型总表 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作
2.2.1整数类型 整数类型的标识符是int。整型数据根据其占用的内存字节数不同,可加限定词: short(短整型),int ,long(长整型), short≤int≤long 可用sizeof(类型标识符)测量 unsigned short (无符号短整型), unsigned int (无符号整型), unsigned long (无符号长整型), 其中short和long的引入是为满足实际要求的不同长度的整数,而经unsigned限定词限定的整数总是正的。
int型: 最大:32767 01 11 11 11 11 11 11 11 10 00 00 00 00 00 00 00 11 11 11 11 11 11 11 11 最小:-32768 unsigned int型: 最大:65535 00 00 00 00 00 00 00 00 最小:0
问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10 83 291 255 • 整型常量(整常数) • 三种形式: • 十进制整数:由数字0~9和正负号表示.如 123,-456,0 • 八进制整数:由数字0开头,后跟数字0~7表示.如0123,011 • 十六进制整数:由0x开头,后跟0~9,a~f,A~F表示. 如0x123,0Xff 问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10 例 30000 为int型 65536 为long int 型 例 12 与 12L
整型常量的类型 • 根据其值所在范围确定其数据类型: 一个整数若值在-32768~32767内,则默认为它是int型;一个整数若值在-2147483648~2147483647之间,可使用长整型常量表示。 • 在整常量后加字母l或L,认为它是long int型常量 • 无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。 例如: 358u,0x38Au,235Lu 均为无符号数;0XA5Lu表示十六进制无符号长整数A5,其十进制为165。 一个非负的整数,只要它的值不超过相应变量的取值范围,就可以赋给unsigned型变量。例如,可以将6000赋给一个 unsigned int型变量,但却不可以将66000赋给一个unsigned int型变量(将会出现溢出错误)
整型变量 定义方法: int a1,a2; unsigned int b1,b2; 一个整型常量只可以赋给能容纳下其值的整型变量。 如a1,a2的取值范围为-32768----32767 b1,b2的取值范围为 0----65535 如果:a1=65535; 或者: b1=-1; 在内存中数值将不是所赋的数值。
2.2.2 实数类型 实数类型分为单精度(float)和双精度(double)类 型,二者的区别在于所占存储位的多少,从而决定了其取值范围。 通常以32位(bits)来存储单精度实数型数据,以64位来存储双精度实型数据。
实型常量(实数或浮点数) • 表示形式: • 十进制数形式:由数字和小数点组成,小数点的左右至少一边要有数字。 (必须有小数点) 如0.123, .123, 123.0, 0.0, 123. • 指数形式:由尾数、e或E和指数部分组成,E的两边都至少要有一位数且E的右边只允许是整数形式(e或E之前必须有数字;指数必须为整数)如12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-3.5 • 实型常量的类型 • 默认double型 • 在实型常量后加字母f或F,认为它是float 型
实型变量 • 实型变量的说明形式如下: • float 变量名1[,变量名2,……变量名n]; • double 变量名1[,变量名2,……变量名n]; • float:占4字节,提供7位有效数字 • double:占8字节,提供15~16位有效数字 float a,b,c; double x,y; 例 float a; a=111111.111; /* a=111111.1*/ double b; b=111111.111; /* b=111111.111*/
【例2.2】实型变量的有效数字。 main( ) { double a; a=6.152367864359046178294901; printf("\n%25.20f",a); } 输出结果为: 6.15236786435904648000 在这个例子中,a被赋值了一个有效位数为25位的数字。但由于a是double类型的,所以a只能接收15~16位有效数字。在printf语句中,我们使用了%20.18f这样的格式符号,这指示printf语句在输出a时总长度应为25位,小数点位数占20位。输出的结果显然显示了25位数,但只有6.152367864359046共16位有效数字被正确显示出来,后面的数字是一些无效的数值。这就表明double型的数据只接收15~16位有效数字。
2.2.3 字符类型 整型、实型都是数值型,是大家比较熟悉的。除数值型外,还有一类数据是计算机经常处理的数据,这就是字符型。 • 字符型数据包含的是一个字符集。一般用的是ASCII码字符集见附录A(p249) 。 • 字符集中的每一个字符都有一个序号,称为ASCII码。 ASCII码大的字符比ASCII码小的字符值大。 • 字符类型的标识符是char。
转义字符及其含义: 转义字符 含义 转义字符 含义 \t \n 换行 水平制表 垂直制表 \b 退格 \v \r 回车 \f 换页 \a 响铃 \\ 反斜线 \‘ 单引号 \“ 双引号 < 2位16进制数代表的字符 \ddd 3位8进制数代表的字符 \xhh • 字符常量 • 定义:用单引号括起来的单个普通字符或转义字符. 如 ‘a’ ‘A’ ‘?’ ‘\n’ ‘\101’ • 字符常量的值:该字符的ASCII码值 • 转义字符:反斜线后面跟一个字符或一个代码值表示 如 ‘A’——65, ‘a’——97, ‘0’——48 , ‘\n’——10 例 转义字符举例(ch2_001.c,ch2_004.c) main() { printf("\101 \x42 C\n"); printf("I say:\"How are you?\"\n"); printf("\\C Program\\\n"); printf("Turbo \'C\'"); } 例: ‘A’-------’\101’-------’\x41’--------65 如 ‘\101’ -----------‘A’ ‘\012’ -----------’\n’ ‘\376’ -----------’’ ‘\x61’ -----------’a’ ‘\60’ -----------’0’ ‘\483’ ----------() 运行结果:(屏幕显示) A B C Isay:”How are you?” \C Program\ Turbo ‘C’ 例 main() { printf(“Y\b=\n”); } 运行结果: 屏幕显示:= 打印机输出:¥
字符型变量 • char 变量名1,[变量名2,......变量名n]; 如:char c1,c2 ; • 一个字符型变量的值只能是一个单个字符;在内存中占一个字节; • 字符变量存放的是字符的ASCII码; • char与int数据间可进行算术运算; 由于字符型变量在内存中是以字符的ASCII码—一个无符号整数的形式来存放的,所以在一定范围内,字符型数据和整型数据是可以互相通用的,二者的区别仅在于:字符型常量占一个字节,而整型常量占两个字节。 例 a=‘D’; /* a=68; */ x=‘A’+5; /* x=65+5; */ s=‘!’+‘G’ /* s=33+71; */
【例2.3】将小写字母转化为大写字母。 main( ) {char c1,c2; c1='x';c2='y'; c1=c132; c2=c232; printf("\n%c,%c",x1,x2); } 程序的输出结果是:X,Y 这个例子是将小写字母转化为大写字母的程序。我们在对ASCII码字符表进行观察后会发现,大小写对应的字母,它们之间的ASCII码正好相差32。利用这个特性和上一个特性,我们可以编写出非常简单的大小写字母转换程序。
h e l l o \0 例 字符串“hello”在内存中 例 空串 “” \0 例 ‘a’ “a” a a \0 例: char ch; ch=‘A’; • 字符串常量 • 定义:用双引号(“”)括起来的字符序列 • 存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志 • 字符常量与字符串常量不同 例: char ch; ch=“A”; 没有字符串变量,用字符数组存放
类型 符号 关键字 数的表示范围 所占位数 (signed)int 16 -32768~32767 16 (signed)short -32768~32767 32 (signed)long -2147483648~2147483647 unsignedint 16 0~65535 unsignedshort 16 0~65535 unsignedlong 32 0~4294967295 32 float 有 3.4e-38~3.4e38 64 有 double 1.7e-308~1.7e308 8 有 char -128~127 无 8 0~255 unsigned char • 基本数据类型 有 整型 无 实型 字符型 说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例:
宏定义 变量定义 输出结果 例 /*ch2_003.c*/ #define PRICE 12.5 main() { int num=3; float total; char ch1,ch2=‘D’; total=num*PRICE; ch1=ch2-‘A’+‘a’; printf(“total=%f,ch1=%c\n”,total,ch1); } 运行结果: total=37.500000, ch1=d
2.3常用输入与输出函数 C语言无I/O语句,I/O操作由函数实现 #include <stdio.h>
2.3.1格式输出函数 • 格式:printf(“格式控制串”,输出表列); • 功能:按指定格式向显示器输出数据 • 返值:正常,返回输出字节数;出错,返回EOF(-1) • 输出表列:要输出的数据,通常是表达式,可以没有,多个时以“,”分隔) • 格式控制串:包含两种信息: • 格式说明: %[修饰符]格式字符---用于指定所输出的表达事的格式; • 普通字符或转义序列:原样输出; • 格式字符
格式字符: 十进制整数 d,i 十六进制无符号整数 x,X 11 11 11 11 11 11 11 11 八进制无符号整数 o 不带符号十进制整数 u 单一字符 c 字符串 s 指数形式浮点小数 e,E 小数形式浮点小数 f e和f中较短一种 g 百分号本身 %% 65535 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 ABC printf(“%s”,“ABC”); float a=567.789;printf(“%e”,a); 5.677890e+02 567.789000 float a=567.789;printf(“%f”,a); float a=567.789;printf(“%g”,a); 567.789 printf(“%%”); % • 说明 • 格式字符要用小写 • 格式字符与输出项个数应相同,按先后顺序一一对应 • 输出转换:格式字符与输出项类型不一致,自动按指定格式输出
附加格式说明符(修饰符) 修饰符 功 能 m 输出数据域宽,数据长度<m,左补空格;否则按实际输出 对实数,指定小数点后位数(四舍五入) 对字符串,指定实际输出位数 .n 输出数据在域内左对齐(缺省右对齐) - 指定在有符号数的正数前显示正号(+) + 输出数值时指定左面不使用的空位置自动填0 0 # 在八进制和十六进制数前显示前导0,0x 在d,o,x,u前,指定输出精度为long型 在e,f,g前,指定输出精度为double型 l
例2.4 main() { int n1,n2; float f1,f2,sum; char ch; n1=65; n2= 3; f1=234.5; f2=18.75; sum=f1+f2; ch='A'; printf("%d ,%c ,%d,%o ,%f ,%c, %d ",n1,n1,n2,n2,sum,ch,ch); printf("%s","Very good!"); } 运行结果: 65, A ,–3 ,177775, 253.250000 ,A ,65 ,Very good! 运行结果:Hello,world! Hello,world! Hello Hello Hel 例 static char a[]=“Hello,world!” printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a);
例 - 例 int a=1234; float f=123.456; 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
例 0 、+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 例 int a=1234; float f=123.456; printf(“%08d\n”,a); printf(“%010.2f\n”,f); printf(“%0+8d\n”,a); printf(“0+10.2f\n”,f); //00001234 //0000123.46 //000+1234 //000+123.56 例 # 例 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
2.3.2 格式输入函数 • 格式: scanf(“格式控制串”,地址表) • 功能:按指定格式从键盘读入数据,存入地址表指定的 • 存储单元中,并按回车键结束 • 返值:正常,返回输入数据个数 • 地址表:变量的地址,常用取地址运算符& • 格式字符:d,i,o,x,u,c,s,f,e 例 scanf(“%d”,&a); 输入:10 则 a=10 例 scanf(“%x”,&a); 输入:11 则 a=17
附加格式说明符(修饰符) 修饰符 功 能 h 用于d,o,x前,指定输入为short型整数 用于d,o,x前,指定输入为long型整数 l 用于e,f前,指定输入为double型实数 m 指定输入数据宽度,遇空格或不可转换字符则结束 抑制符,指定输入项读入后不赋给变量 * 例 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(“%3c%2c”,&c1,&c2); 输入 abcde 则‘a’c1, ‘d’ c2 • 例 scanf(“%2d%*3d%2d”,&a,&b); • 输入 1234567 • 则12a, 67b
输入分隔符的指定 • 一般以空格、TAB或回车键作为分隔符 • 其它字符做分隔符:格式串中两个格式符间字符 例 scanf(“%d%o%x”,&a,&b,&c); printf(“a=%d,b=%d,c=%d\n”,a,b,c); 输入 123 123 123 输出 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 • 则3a, 4 b • 例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); • 输入 a=12,b=24,c=36
说明:用“%c”格式符时,空格和转义字符作为有效字符输入说明:用“%c”格式符时,空格和转义字符作为有效字符输入 • 输入数据时,遇以下情况认为该数据结束: • 遇空格、TAB、或回车 • 遇宽度结束 • 遇非法输入 如 scanf(“%c%c%c”,&c1,&c2,&c3); 若输入abc 则ac1, 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 则 1234 a, ‘a’ b, 123 c • 输入函数留下的“垃圾”: 例 int x; char ch; scanf(“%d”,&x); ch=getchar(); printf(“x=%d,ch=%d\n”,x,ch); 执行:123 输出:x=123,ch=10 解决方法: (1)用getchar()清除 (2)用函数fflush(stdin)清除全部剩余内容 (3) 用格式串中空格或“%*c”来“吃掉” 例 int x; char ch; scanf(“%d”,&x); scanf(“%c”,&ch); printf(“x=%d,ch=%d\n”,x,ch); 执行:123 输出:x=123,ch=10
2.3.3 字符输出函数------putchar() • 格式: putchar( c ) • 参数: c为字符常量、变量或表达式 • 功能:把字符c输出到显示器上 • 返值:正常,为显示的代码值;出错,为EOF(-1) #include <stdio.h> main() { int c; char a; c=65; a='B'; putchar(c); putchar('\n'); putchar(a); } 运行结果:A B
2.3.4 字符输入函数------getchar() • 格式:getchar( ) • 功能:从键盘读一字符 • 返值:正常,返回读取的代码值;出错,返回EOF(-1) #include <stdio.h> main() { int c; printf("Enter a character:"); c=getchar(); printf("%c--->hex%x\n",c,c); } 例 运行结果: Enter a character:A A--->hex41