C程序设计教程(上)林小茶编ppt.ppt

上传人:za****8 文档编号:15799125 上传时间:2020-09-06 格式:PPT 页数:247 大小:2.98MB
返回 下载 相关 举报
C程序设计教程(上)林小茶编ppt.ppt_第1页
第1页 / 共247页
C程序设计教程(上)林小茶编ppt.ppt_第2页
第2页 / 共247页
C程序设计教程(上)林小茶编ppt.ppt_第3页
第3页 / 共247页
点击查看更多>>
资源描述
C 程序设计教程(上),林小茶,第一章,1.1 程序设计语言 1.2 通过实例认识C程序的结构 1.3 C语言的标准和编译器 1.4 程序的调试,1.1 程序设计语言,程序 计算机程序是由计算机指令构成的序列 。 计算机程序的操作对象是“数据” 。 程序设计语言 低级语言 机器语言 101110001110100000000011 汇编语言 mov ax,1000 高级语言 a=1000 a=a+1,编译程序 高级语言到机器语言要经过编译程序进行“翻译” 。 编译程序的种类 解释系统 对高级语言编写的程序翻译一句执行一句 。 编译系统 将高级语言编写的程序文件全部翻译成机器语 言,生成可执行文件以后再执行。,1.2 通过实例认识C程序的结构,问候界面 例1.1 在屏幕上显示 welcome 字样。 /*-*/ /*A program to print welcome -*/ #include stdio.h void main() printf(welcome); ,用 /* 和 */ 括起来的是注释行。注释行用于说明程序的功能和目的,编译系统会跳过注释行,不对其进行翻译。使用 /* 和 */ 括起来的语句并不一定在一行,可以是多行。 以#开始的语句是预处理命令。这些命令是在编译系统翻译代码之前需要由预处理程序处理的语句。 每个C程序都必须包含一个主函数main(),也只能包含一个主函数。用括起来的部分是一个程序模块,在C语言中也称为分程序,每个函数中都至少有一个分程序。C程序的执行是从主函数中的第一句开始,到主函数中的最后一句结束。,分号“;”是C语言的执行语句和说明语句的结束符。 C语句在书写上采用自由格式。但是好的程序员应该学会使用缩进格式。 C语言的关键字和特定字使用小写字母。 printf是C语言提供的标准输入输出库函数。,计算两个整数的差 例1.2 计算两个整数30与20的差,并将结果在屏幕上。 /*-The difference between a and b .*/ #include stdio.h void main( ) int a,b,difference; a=30; b=20; difference=a-b; printf(The difference between a and b is %d. n ,difference); 运行结果: The difference between a and b is 10.,分析与说明: 变量的数据类型定义。 变量是由程序命名的一块计算机内存区域,用来存储一个可以变化的数值。每个变量保存的是一个特定的数据类型的数值。在C语言中规定,任何变量都要经过数据类型的定义,以便在程序运行时分配相应的存储空间。 直接常量(又称无名常量或文字常量)。 常量是在程序执行过程中不会变化的数值,直接常量就是在代码中直接书写的数值,没有名字。,赋值运算符 =。 注意,这里的 = 与数学上的等号在概念上完 全不同。赋值运算符号最简单的用法是:赋值运 算符的左边是一个变量,右边是一个常量。其功 能是将右边常量的值送到左边的变量中,使变量 中的内容与常量相等。例如a=30;就表示使a中的 内容变为30。 运算符 -。 difference=a-b;表示将a的内容与b的内容相减 以后,赋值到difference变量中。,printf使用初步 printf是一个标准输出函数。 它执行格式化输出, 调用格式是: printf( 格式信息, 数据参数1, 数据参数2,); 数据参数可有可无。格式信息用于控制数据参数的输出格式。格式信息中字符除了冠以斜杠“”和“%”的字符,其它字符原封不动按照原样输出到屏幕上。,格式信息中的%d是转换说明,它指定了显示 数据参数的格式。printf(“%d”,i);表示将参数i 按整型十进制输出。C语言规定,转换说明符 的个数应与参数的个数相等。 例如:printf(“%d %d %dn”,x,y,z); 格式信息中的n是字符转义序列。n表示换行。,使用自定义函数计算两个整数的差 例1.3 /*- The difference between a and b ( using Function)*/ #include stdio.h void show(int x,int y); /*(自定义)函数说明 */ void main( ) /* main函数定义 */ int a,b; a=30; b=20; show(a,b); printf(See you!n); void show(x,y) /*(自定义)函数定义 */ int x,y; int difference; difference=x-y; printf(The difference between a and b is %d.n,difference); return; ,运行结果: The difference between a and b is 10. See you!,1.3 C语言的标准和编译器,C语言的标准 83 ANSI C 87 ANSI C ANSI/ISO standard C ISO C C99 常用的C语言编译器 Turbo C 2.0 Turbo C+ 3.0 Visual C+,1.4 C程序的调试,调试步骤 编辑源程序 编译源程序 连接目标程序 运行可执行程序,第二章 C语言的基础知识,2.1 标识符、变量与常量 2.2 C语言的数据类型 2.3 运算符和表达式 2.4 指针类型与指针运算符,2.1 标识符、变量与常量,字符集 字符集是高级语言的编译系统所能识别的字母、 数字、和特殊符号。每种高级语言都有自己特定的字 符集合。 标识符 标识符是用来标识在C程序中的变量、常量(指符号常量)、数据类型和函数的。通俗一点说,标识符是程序员为变量、常量或者函数起的名字,它实际上是一个字符序列。,2.1.1 标识符,(1) 大、小写英文字母: A ,B, ,Z,a,b,z (2) 数字: 0,1,2,9 (3) 运算符: + * / % = (6) 特殊符号: _ $ # (7) 空白符:空格符、换行符、制表符。,C语言的字符集合包括:,(1) 字母或下划线中的任一字符打头。 (2) 在第一个字符后,可以是任意的数字、字 母、下划线组成的序列。长度不超过8个。 关键字(保留字) 标识符的分类: 特定字 用户定义字,任何一个标识符必须符合下列语法规则:,关键字:又称保留字,一般为小写字母。 关键字是C编译程序预先登录的标识符,它们代表固定的意义,用户不能随便使用。 若随便使用,可能出现意想不到的错误,编译能通过,但运行结果不对,且不容易检查错误之所在。,关键字(保留字),特定字,特定字:具有特殊含义的标识符。它们虽然不是关键字,但是在习惯上把它们看成关键字。所以一般用户定义的标识符也不要使用它们。 特定字包括: define undef include ifdef ifndef endif line,用户按照语法规则定义的标识符。用户定义字可以用来标识用户自己使用的变量,符号常量、数据类型以及函数等。 注意 (1) 不能使用关键字和特定字。 (2) 用户定义字为了标识不同的对象,标识符的前8个(甚至7个)字符要有区别。 (3) 标识符最好有含义。 (4) 避免使用容易混淆的字符。如l与1,0与o, z与2等。 (5)大、小写代表不同的意义。 (6) 尽量不要与某个库函数同名。,用户定义字,2.1.2 变量,变量 变量是由程序命名的一块计算机内存区 域,是用来存储一个可以变化的数值。,在使用一个变量之前,程序员必须为每个变量起个名字,同时还要声明它的数据类型,以便编译系统根据不同的数据类型为其静态地分配内存空间。我们称之为定义变量。 定义变量的格式为: 类型说明符 变量名表 ; 关于不定值,定义变量,2.1.3 常量,常量 在程序的执行过程中数值不会发生改变的 量。 无名常量(或称文字常量) a=100; 100是无名常量 符号常量(用预处理命令#define为常量命名) #deine MAX 100,2.2 C语言的数据类型,整型 int 基本数据类型 浮点型 float double 字符型 char 数组 以为标志 结构 struct 构造类型 复杂数据类型 联合 union 枚举 enum 指针类型 以 * 为标志,C 语言的数据类型,整型 短整型 short int 长整型 long int 普通整型 int 浮点型 普通浮点型 float 双精度浮点型 double 字符型 char,不同数据类型的数据由于其在内存的存储方式不 同,存储所占的二进制位(bit)大多不相同。即使是 相同类型的数据在不同种类的计算机所占位(bit)数 也不完全相同。,2.2.2 问题的提出 问题一: 从键盘接收一个字符,输出该字符的按 字典排列顺序的下一个字符,例如,输入a, 输出b。 问题二: 从键盘接收两个整数,输出它们的和。 问题三: 从键盘接收两个浮点数,输出它们的乘积。,2.2.3 整型数据,整型数据在内存中的存储方式 整型变量 整型常量 整型数据的输出 整型数据的输入,在IBM PC机上,普通整型占 16位(bit),短整型也占 16位(bit),而长整型占32位(bit)。根据整型数据所占的位数,计算一个整型数据能表示的数据的取值范围。 第位是符号位,如果符号位为0,表示是正整数,从到15位全为1时表示的数最大。 01111 1215 15个1 则16bit能表示的最大整数是215 1 ,即32767。,整型数据在内存中的存储方式,如果符号位为1,表示是负整数,从到15 位都为0时表示的数最小。 10 00 15个0 在计算机中,这个数是-215的补码表示。因此, 最小整数是-215,即 -32768。,按照整型变量所占的二进制位数来分类: short(短整型) int (普通整型) long (长整型) 根据整型变量是否带符号位来分类: 不带符号的整型变量 带符号的整型变量 无符号用关键字unsigned表示 说明整型变量的语法是: 限定词 int 变量名表;,整型变量,整型常量表示: 十进制表示 八进制表示 以数字 0开头 十六进制表示 以数字0和x开头。 int a,b,c; a = 10; b = 010; c = 0 x10; 长整型:要在数字后加上字母L 。 long s; s=10L ;,整型常量,需要注意的是:如果整型常量超过机器所能表示的范围,则会发生溢出,而在C语言中的整数溢出并不会使程序出错,而是得到一个非正确的值。 int a,b; a = 10000; b = 10000000; 变量b的值会被系统认为是-27008。,%d 表示把数据按十进制整型输出; %o 表示把数据按八进制整型输出; %x 表示把数据按十六进制整型输出; %u 表示把数据参数按无符号整型输出。 注意: 除了%d,其余的格式都将数据作为无符号数输出。 printf(%ld,100000L); 正确 printf(%d,100000L); 结果 -31072,整型数据的输出,例2.1 #include stdio.h void main() int x,y,z; x=12, y=012 , z=0 x12; printf(%d,%d,%dn,x,y,z); printf(%o,%o,%on,x,y,z); printf(%x,%x,%xn,x,y,z); 运行结果: 12,10,18 14,12,22 c,a,12,例2.2 输出负数。 #include stdio.h void main() int x,y,z; x=-12, y=-012 , z=-0 x12; printf(%d,%d,%dn,x,y,z); printf(%o,%o,%on,x,y,z); printf(%x,%x,%xn,x,y,z); 运行结果: -12,-10,-18 177764,17766,177756 fff4,fff6,ffee 说明:本程序中的-012和-0 x12并不是八进制和十六进制常量,“-”实际是运算符,y=-012 ,是取012的负数,使用%o和%x格式显示的数据是无符号数。,scanf是格式输入函数,其功能是按指定的格式将标准输入设备(例如键盘)输入的内容送入变量中。 scanf函数的使用格式: scanf( 格式信息, 输入项1,输入项2,); 其中,“格式信息”与printf的用法相似,可以在其中使用%和转换字符来指定数据的输入方式。需要注意的是,输入项必须使用地址,普通变量的地址是在变量名前加取地址符 printf(nPlease enter two integers:n); scanf(%d%d, 运行情况: Please enter two integers: 10 20(回车符) 10+20=30,注意 (1) scanf读入一组整数时,scanf扫视输入信息,跳过空格、tab或换行,寻找下一个输入域。一个输入域就是一个连续的非空白字符的数字串。 例如,若输入为: 782 319 20 (回车符) 38 则输入域有四个。 (2) 格式信息中除了有 %开始的转换说明,还可以有普通字符,只是这些字符不是显示在屏幕上的,而是要求使用者在输入数据时,要在相应位置输入相同的字符(除了空格、tab或换行符)。,例2.4 输入格式与键盘输入的匹配。 #include stdio.h void main() int x, y, sum; printf(nPlease enter expression Like a+b=:n); scanf(%d+%d=, 运行程序: Please enter expression Like a+b=: 10+20=(回车符) 30,假设输入的内容是: 10 20 将会得到一个意想不到的结果,例如可能是: 510 scanf(“%d+%d=”,一句要求在两个 整数之间输入“+”号,并在第二个整数后面输入 “=”;否则,x和y接收的数据就不正确,也就是 说,并没有将10和20正确地送到x和y这两个变量 中,从而得出一个奇怪的结果510。,例2.5 输入两个普通八进制整数,计算并输出它们的和。 #include stdio.h void main() int x, y, sum; printf(nPlease enter two octal integers:n); scanf(%o%o, Please enter two octal integers: 10 20(回车符) 010+020=030 8+16=24,通过在%和转换说明符之前加整数数字就 可以控制显示数字的域宽。 在%后面加符号“-”,规定显示数据在显示 区域内左对齐;没有符号“-”,数据显示时右对 齐。 通过控制域宽和对齐方式的目的是为了使输 出的数字格式清晰明了,容易看懂。,例2.6 显示时整数增加域宽和左对齐。 #include stdio.h void main() int x, y, sum; printf(nPlease enter two integers:n); scanf(%d%d, Please enter two integers: 10 20(回车符) 10+ 20= 30 10 +20 =30,2.2.4 字符型数据,字符变量与字符常量 使用getchar和putchar函数对字符型数据进行输入和输出 使用printf和scanf函数对字符型数据进行输入和输出 字符串常量,字符变量 数据类型说明符 char 例如, char aloha,beta,c; 一个字符变量能存储一个字节的信息,每 个字符有固定的编码,最常用的就是ASCII 编 码。 标准ASCII编码是把每个字符和与0127的 数值联系起来,用7位二进制表示,再将最高位 充0,就是一个字节了。 例如,在ASCII编码表中,A用数值65表示, 其8位二进制表示是: 01000001,字符常量 C语言中的字符常量是用单引号将一个字符括起 来。例如a、b。可以用字符常量为字符变量赋值: char alpha=a; char beta=b; 注意: (1)引号中的字符只能是一个字符。 (2)不能用双引号括起一个字符表示单个字符常量。 (3)非图形字符,如退格,换行等,也可以表示成字符 型常量。表示方法是使用转义符与一些特殊字符构成转 义序列。例如n就是一个转义序列,表示“回车换行”。 (4)字符型数据可以像整型数据一样参与四则运算。 b- a=1 98-97=1,用getchar输入字符和用putchar输出字符 putchar()函数的用法 putchar()是向标准输入输出设备上输出一个字 符,一般的标准输出设备是屏幕终端。 注意,参数是不能缺省的。另外,尽管参数 可以是整型数,但参数的值最好在0127之间, 否则,输出可能是一些乱码。,例2.7输出字符a。 #include stdio.h void main() int c=a,i; putchar(c); ,getchar()函数的用法 getchar()是接收一个从标准输入输出设 备上输入的字符。 一般的标准输入设备是键盘。 该函数没有参数,函数返回的数据类型为整型, 值为字符的ASCII码值。,例2.8 getchar函数的用法。 #include stdio.h void main() char c; printf(nPlease enter one char:n); c=getchar(); putchar (c); 运行情况1: Please enter one char: a(用户输入) a,运行情况1: Please enter one char: abc(用户输入) a,例2.9从键盘接收一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入a,输出b。 #include stdio.h void main() char c; printf(nPlease enter one char:n); c=getchar(); putchar (c+1); ,或者 #include stdio.h void main() printf(nPlease enter one char:n); putchar(getchar()+1); 运行情况: Please enter one char: a(用户输入) b,使用printf和scanf函数对字符型数据进行输入和输出,例2.10 修改例2.9,使用printf和scanf函数完成操作。 #include stdio.h void main() char c; printf(nPlease enter one char:n); scanf(%c, 运行情况: Please enter one char: a(用户输入) b,注意: 使用scanf函数时,尽量不要将%c与其它转换 说明一起使用。 当scanf读入一组数据时,如果不使用%c做转 换时,scanf扫视输入信息,跳过空格、tab或换 行,寻找下一个输入域。 但是若使用%c做转换时,情况则不同,scanf 不会跳过空格、tab或换行,而是直接把下一个字 符输入给参数,不论它是什么。,例如, scanf(%d%c,字符串常量 用双引号括起来的字符序列是字符串常量。 how are you 1234.5 字符串的存储与字符不同。C编译程序在存储字符 串常量时自动采用0作为字符串结束标志。 how实际上所占的字节数是4。 “a”与a是完全不同的,前者是字符串常量,占的字节数是2,后者是字符常量,占的字节数是1。 字符串常量的输出 printf(how are you); printf(%s,how are you);,2.2.5 浮点数,浮点数据在内存中的存储方式 浮点变量与浮点常量 浮点数据的输入和输出,浮点数在机器中的表示一般分为三部分:符号位、阶码、尾数。 32位浮点数的有效数字的个数是7位十进制数字,取值范围为10-38 1038,64位浮点数的有效数字的个数是15位十进制数字,取值范围为10-308 10308。不同的机器可能会有一些微小的差别。,浮点数据在内存中的存储方式,浮点变量 单精度浮点数(float) 双精度浮点数(double) long double 定义浮点变量: float a,b; double c,d; 单精度浮点数和双精度浮点数两者在计算机 上的表示方式是完全相似的,只是所占的二进制 位数不同,单精度浮点数的有效数字(或称精度) 和取值范围与双精度浮点数不同。,浮点常量 小数表示法 127.3 科学计数法 1.273102 在C语言中,实际上也是用这两种方式,只不过102 用E+2表示。 C程序中的浮点常数由整数部分、小数部分、指数 部分构成。 浮点常量构成规则是: (1) 整数部分可以不写,小数部分也可以不写,但不能同时不写。 (2) 指数部分可以省略(相当于使用小数表示法) (3) 若有指数部分,e(或E)两边都至少有一位数。 (4) 指数的数字必须是整数(范围为1到3位的整数),可以为负或正,正号可以省略。,例如, 4.50E3、1.0、1.、.1234、123.4都是合法的浮点常量。 注意: 浮点常量在存储时按double类型存储,即占32位(bit)。 浮点常量也象整型常量一样,如果浮点常量超过机器所能表示的范围,则会发生溢出。 浮点溢出也不会使程序出错,而是得到一个非正确的值 。,%f显示小数表示的普通浮点数 %e显示科学记数法表示的浮点数 输出双精度(double)类型时,还需要在转换字符 前加上字母l。 输出浮点数时控制输出域宽和有效位: 在%与f(或e)之间加上两个数字并在两个数字之间加一个句点“.”。 例如,%10.3f表示输出格式是域宽10,有效位3。 注意 : 域宽的含义、缺省有效位、与数据本身的域宽的关系,浮点数据输入与输出,例2.11 输入两个浮点数,输出它们的和。 #include stdio.h void main() float x,y; float sum; printf(nPlease enter two reals:n); scanf(%f%f, 运行情况: Please enter two reals: 1.234567 1.234567(用户输入) 1.234567+1.234567=2.469134,输出浮点数时不仅可以控制输出域宽,还可以控制有效位 的输出位数。 例2.12 输出浮点数据。 #include stdio.h void main() float x; double y; x=12.3456789;y=987654.321098; printf(n%e,%le,x,y); printf(n%f,%lf,x,y); printf(n%.3f,%.3lf,x,y); printf(n%14.3f,%14.3lf,x,y); printf(n%-14.3f,%-14.3lf,x,y); printf(n%8.3f,%8.3lf,x,y); printf(n%14f,%14lf,x,y); ,2.3 运算符和表达式,2.3.1 表达式与简单语句 2.3.2 算术运算符 2,3.3 赋值运算符 2.3.4 增1/减1运算符 2.3.5 位逻辑运算符 2.3.6 逗号运算符 2.3.7 求字节运算符 2.3.8 不同数据类型数据间的混合运算 2.3.9 赋值表达式的类型转换,2.3.1 表达式与简单语句,表达式的概念 表达式是用运算符与圆括号将操作数连接起来所 构成的式子。C语言的操作数包括常量、变量、函数值 等。 根据表达式进行运算,得到的数值即为表达式的解。 表达式与简单语句 在C语言中,在一个表达式的后面加上分号“;”就构成了简单语句。 有意义的简单语句 无意义的简单语句,2.3.2 算术运算符,种类及运算 + - * / % 注意: 两个整数相除,结果仍为整数,商向下取整。 取模运算符%实际上是数学运算的求余数运算,其两个操作对象都必须是整数 。 减法运算符还可以用做单目运算符,是取负 运算。其余操作符均为双目运算符。,算术表达式及算术运算符的优先级 算术表达式就是用算术运算符和圆括号将 操作数连接起来的式子。算术表达式的解就是 经过算术运算得到的表达式的值。 算术运算符的优先级与数学基本相同,即 先乘除,后加减。取模运算的优先级与乘除相 同。函数和圆括号的优先级最高。,注意: 算术表达式应能正确的表达数学公式。 例如:数学表达式是 3+x 2a 相应的C语言表达式应该是什么呢? 算术表达式的结果应该不超过其所能表示的 数的范围。例如,最大的整型数是32767, 那么,32767+3就不会是正确的结果。而 32767L+3的结果是正确的,因为32767L是长 整型数。,算术运算符的结合性 运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算的操作符。 例如:a+b-c 操作数b左右的运算符+和-的优先级相同, 那么,是先计算b-c,还是先计算a+b呢?C语言 规定双目算术运算符的结合性是自左至右,也就 是b先与左边a结合,再与右边c结合。所以是先 计算a+b,然后用a+b的结果减c。 双目运算符的结合性与数学运算并无不同。,2.3.3 赋值运算符,普通赋值运算符 赋值表达式的一般形式是: 变量名=表达式 赋值语句的一般形式是: 变量名=表达式; 赋值运算符的优先级小于算术运算符。 赋值运算符的结合性是自右至左, 以a=b=2为例,复合赋值运算符 把赋值运算符与算术、位逻辑、移位运算 符放在一起,就构成复合赋值运算符。 复合算术赋值运算符有5个+= 、- =、*=、/=、%=。 还有与移位和位逻辑结合的复合赋值运算符5个(=、和i+;前缀与 后缀并无区别(减符号也一样)。但是,将 它们用在表达式中则前缀与后缀是有区别的。,前缀表示法是先将i值增/减1,再在表达 式中使用;而后缀表示法是先在表达式中使 用i的值,再将i值增/减1。 例如: i=3; i=3; j=i+; j=+i; 结果 j的内容为3 j的内容为4 i的内容为4 i的内容为4,注意: 增1/减1运算符的操作对象是一个变量 2+、-2以及(x/y)+均为非法 增1/减1运算符的优先级高于算术运算符, 与单目运算符-(取负)、!(逻辑非)的 优先级相同,结合方向自右至左。 例如表达式 -i+ 等价于 -(i+) 副作用:printf(“ %d ,%d”,i,i+);在不同 的编译环境下结果有可能不同。 尽量不要在一般的表达式中将增1/减1运算 符与其它运算符混合使用。,2.3.5 位逻辑运算符, w1=10; w2=8; w3= w1|w2 ; w3的内容可以通过下式运算: 00001010 00001000 (按位或 |) 00001010 (结果),按位异或 按位或的运算规则是: 0 0=0 0 1=1 1 0=1 1 1=0 例如: char w1,w2,w3; w1=10; w2=8; w3= w1w2 ; w3的内容可以通过下式运算: 00001010 00001000 (按位异或 ) 00000010 (结果),按位取反 按位取反的规则是: 0 = 1 1 = 0 注意: 对于位逻辑反来说,0 x7在16位机上的 表示是1111111111111000即0 xfff8,但在32位 机上的表示是0 xfffffff8,所以通常用0 x7 来表 示7的逻辑非,而不用0 xfff8或oxfffffff8。,移位运算符 左移 双目运算符,运算符右边的表达式表示移位的位数。 x=x2 表示把x进行左移以后赋值给x, 注意 不能只用x2 左移可以扩大原数的倍数,左移位扩大 倍,左移位扩大倍,。右移可以缩小 原数的倍数。右移时,若符号位为,则右边 填零。若符号位为,根据机器不同分为算术 移位(填充)逻辑移位(填充)。,2.3.6 逗号运算符 表达式1,表达式2 逗号表达式的求值过程是:先求解表达式1, 再求解表达式2,并将表达式2的解作为逗号表达 式的解。 例如5,6 的值是6 z=(y=3,x*y) 与z =x*(y=3)是等价的 逗号运算符一般用于循环for语句,不提倡使 用在其它的表达式中。,2.3.7 求字节数运算符 sizeof是一个比较特殊的单目运算符,也 是一个非常有用的运算符,经常用于动态分 配空间。 其语法格式为: sizeof(表达式) 表达式可以是变量名、常量、以及数据 类型名。,它的功能是:求表达式中变量名所代表的 存储单元所占的字节数;或是求表达式中常量 的存储单元所占的字节数;或是求表达式中的 数据类型表示的数据在内存单元中所占的字节 数。 sizeof(int)的结果是2, sizeof运算符比较灵活,同样是求整型int 数据所占的字节数,可以使用三种办法: (1) 求sizeof(int) (2) 求sizeof(10) (3) 使用int a; 求sizeof(a),例2.13 求各种数据类型在内存中所占的字节数。 #include stdio.h void main() printf(char =%d byten,sizeof(char); printf(short int =%d byten,sizeof(short int); printf(int =%d byten,sizeof(10); printf(long int =%d byten,sizeof(10L); printf(float =%d byten,sizeof(float); printf(double =%d byten,sizeof(2.3); printf(china=%d byten,sizeof(china); ,2.3.8 不同数据类型数据间的混合运算 自动转换 所谓“自动转换”就是系统根据规则 自动将两个不同数据类型的运算对象转换成同一 种数据类型的过程。而且,对某些数据类型,即 使是两个运算对象的数据类型完全相同,也要做 转换,例如float。,强制转换 在C语言中,允许程序员根据自己的意愿将一种数据类型强制转换成另一种数据类型。 强制转换的格式为: (数据类型名) 操作对象 注意,强制转换并不改变操作对象的数据类型 和数值。例如,(int)f的确切含义是将f转换成 为整型值参与运算,而f本身的数据类型和数 值都没有任何改变。,2.3.9 赋值表达式的类型转换 当赋值运算符左边的变量与赋值运算符右 边的表达式的数据类型相同时,不需要进行数 据类型的转换。 当赋值运算符左边的变量与赋值运算符右 边的表达式的数据类型不相同时,系统负责将 右边的数据类型转换成左边的数据类型。此时, 会有两种情况产生,一种是转换以后会丢失数 据,另一种是转换以后不会丢失数据。这与赋 值号两边的表达式的数据类型所占的字节数及 存储表示方式有关。(详细内容自学),例2.15 字符赋值给整型变量。 #include stdio.h void main() int c; /* char c;*/ c=B; printf(n c=%c,c+a-A); 运行结果: c=b,例2.16整型变量赋值给长整型变量。 #include stdio.h void main() long c; int a; a=32763; c=a; printf(n c=%ld,c); 运行结果: c=32763,例2.17 float类型的数赋值给double类型的变量。 #include stdio.h void main() float x; double y; x=1.234567E+37; y=x; printf(n y=%le,y); 运行结果: y=1.234567E+37,例2.17 float类型的数赋值给double类型的变量。 #include stdio.h void main() float x; double y; x=1.234567E+37; y=x; printf(n y=%le,y); 运行结果: y=1.234567E+37,2.4 指针的基本概念和运算,2.4.1 指针概念 内存是以一个字节为单位的连续的存储空间,每个内存单元都有一个编号,称为内存地址。 请看下图,变量i的地址是1000,变量 i的内容是30。,30,1000,i,用另一个变量记住i的地址,这个变量 就是指针类型的变量,一般称为指针变量。 因此,一个指针变量的值就是某个内存单 元的地址,称为某内存单元的指针。,30,1000,i,1000,p,用p变量记住了i的地址,p的数据类 型就是指针类型。,这时,我们可以称p指向变量i,或者 说p是指向变量i的指针。 严格地说,一个指针是一个地址,是 一个常量,例如1000,2000都是指针。而 一个指针变量的内容是可以变化的,是变 量。但实际上为了方便,在不会引起混淆 的情况下,经常把指针变量简称为指针。,变量就需要在使用之前事先定义,然后才能使用。 指针变量的定义格式: 指针所指对象的数据类型 *指针变量名1,*指针变量名2,; 定义格式中的“*”表示变量是一个指针变量。,int *p; 表示p是一个指针变量,p指向的存 储单元是整型的。 注意,指针变量与其他变量一样,如果是 自动变量并且未赋值,指针变量的值将是不定 值。如果想让p的内容是i的地址,需要做一个 取地址运算。 int i; /*定义整型变量i */ int *p; /*定义指针变量p */ p= /*p指向i */,定义指针的目的是为了通过指针去访问内存单元。 运算符“*”写在指针变量的前面,就是通 过该指针访问它所指向的存储单元。我们在上 面三条语句后面,再加上一条执行语句,变成: int i; /*定义整型变量i */ int *p; /*定义指针变量p */ p= /*使i的内容为3 */ 最后一句是将p指向的存储单元i的内容赋值为3。,要点 (1) 如果有了定义int *p,说明p是指针变 量(也可以简称指针),p的值应该是地址, 可以通过取地址运算符 float *p; p= /*错误 */ 上述程序段可能会引起预想不到的结果。,要点 (3) 注意“*”号的不同含义,它可以作为 算术运算符乘号,可以定义指针,还可以 存取指针所指的存储单元的内容。 例如: int i; /*定义整型变量i */ int *p; /*定义指针变量p */ p= /*使i的内容为3*6=18 */,要点 (4) 指针只是概念上的地址,不需要关心 它的具体数值,是2000还是3000,都无关 紧要。因为对某个变量来说,由系统为它 申请动态或静态内存,在C程序中不可直 接将内存地址值赋值给一个指针变量。 int*p; p=2000; /*错误 */,要点 (5) 指向相同的数据类型的指针变量可以 相互赋值,指向不同类型对象的指针一般 不要做相互赋值,除非做强制转换。而且 有时候,强制转换也可能不能完全移植。 int i; int *py= 上面程序段执行以后,px也指向i。,2.4.2 指针运算符 运行结果: y=7,注意: (1) 使用指针运算符*和 int *pointer,*q; pointer= 运行结果:*q=50,例2.25指针作为scanf函数的参数。 #include stdio.h void main() int x, y, sum,*p; p= ,第3章 结构化程序设计,3.1 结构化程序设计思想 3.2 语句与分程序 3.3 顺序结构程序设计 3.4 关系运算符与逻辑运算符 3.5 选择结构程序设计 3.6 循环结构程序设计,3.1 结构化程序设计思想,3.1.1 结构化程序设计思想的产生 20世纪60年代“软件危机” 的产生 是否在程序设计中使用“goto”语句的争论 Corrado Bhm和Guiseppe Jacopini.就证明了只要有顺序、选择和循环三种形式的控制结构,就足以导出其它各式各样的程序结构,从而在理论上奠定了结构化程序设计的基础。,3.1.2 结构化程序设计的三种基本结构,(1) 顺序结构 顺序结构就是一组逐条执行的可执行语句。按照书写顺序,自上而下的执行。 (2) 选择结构(分支结构) 选择结构是一种先对给定条件进行判 断,并根据判断的结果执行相应命令的结 构。,(3) 循环结构 循环结构是指多次重复执行同一组 命令的结构。 具有循环结构的程序一般必须指定循 环的终止条件,以便对程序的循环进行有 效的控制,以免进入无限循环(或称死循 环)的状态。,C程序的执行部分由执行语句构成。 执行语句的种类 表达式语句 函数调用语句 控制语句 复合语句(或称分程序) 空语句,3.2 语句与分程序,最简单的可执行语句。只要在表达 式后面加上分号就可以了。 例如: +i; x=y; 有效的表达式语句一般都要有赋值 运算, 否则,不做任何赋值运算的表达 式大多数是无意义的。,表达式语句,函数调用语句,由函数名、实际参数以及分号构成。 例如: printf(welcome); printf是函数名,“welcome”是实际参数。函 数名既可以是C语言提供的库函数名,也 可以是我们自己定义的函数名。,控制语句,控制语句是用于控制程序流程的语句,控 制语句一般指那些改变了顺序结构的语句。 C语言的控制语句 分支语句(if 和 switch) 循环语句(while、do-while、for) 转向语句(break、goto、continue、return)。 熟练掌握控制语句是学会程序设计的基础。,复合语句和分程序结构,复合语句是用 和 把数据说明语句和若干个有序的执行语句组合在一起而构成。 其一般格式为 数据说明; 语句; 复合语句在语法上相当于一个简单语句,在程序中可以作为一个独立语句来看待,因此又称为分程序。,空语句,C语言中有一个很特殊的语句,即空语句。空语句,顾名思义,就是什么也不存在的语句,只有一个分号: ; 尽管空语句不会有任何命令执行,但仍然是一个有用的语句。常用于循环语句中,使循环体为空。 例如:for (sum=0,i=0;i=9;i+;sum=sum+i);,3.3 顺序结构程序设计,顺序程序设计的步骤可以归纳为: (1) 用预处理命令包含文件或进行宏定义(不是必须的,根据具体情况); (2) 定义变量(分配内存空间); (3) 为变量赋初值(可以用赋值语句或 输入函数); (4) 计算; (5) 输出结果(用输出函数)。,例3.1编写程序输入长方形的长和宽,求长方形的面积和周长并输出,用浮点数据处理。 #includestdio.h void main() double length,width,area; /* 定义变量 */ printf(n Enter length of rectangle:); /* 提示用户输入长方形的长*/ scanf(%lf, /* 输出长方形的周长 */ ,例3.2 编写程序,输入x和y,交换它们的值,并输 出交换前后接收输入。 /*- swap x and y -*/ #include stdio.h void main() int x,y,temp; printf(nPlease input two int number:); /* 提示用户输入两个整数 */ scanf(%d%d, /* 输出交换以后x和y的内容*/ ,3.4 关系运算符与逻辑运算符,3.4.1 关系运算符 所谓关系运算,实际上就是比较两个数值 的大小。那么,比较两个数值的大小的运算符 就是关系运算符。 关系运算符有六个、=、=、 =、!=。 由关系运算符连接起来的表达式就是关系 表达式。 关系表达式的解一般应为真或假,C语言 用整数1表示真,整数0表示假。,初学者经常会混淆关系运算符“=”和赋值运算符“=”,因此要注意区分这两个运算符。 例3.3 #include stdio.h void main() int x,y,z1,z2; x=2 ;y=2 ; z1=(x=y); z2=(x=y); printf(%d,%dn,z1,z2); ,六个关系运算符中的“!=”和“=”的优先 级小于其余四个运算符。 关系运算符的优先级小于算术运算符, 大于赋值运算符。关系运算符的结合性均为自 左至右。 当多种运算符在一个表达式中同时使用时, 要注意运算符的优先级,防止记错运算符优先 级的最好方法是加圆括号。,3.4.2 逻辑运算符,如果将“与、或、非”运算应用于逻辑值 (逻辑真和逻辑假)则称为逻辑运算。 C语言中的逻辑运算符有三个: 逻辑与 scanf(%d, ,例3.5使用if形式编写程序:若ab将两个数的位置调换;否则,保持不变。 #include stdio.h /*-swap a and b-*/ void main() int a,b,temp; scanf(%d%d, ,例3.6请判断下面程序的执行结果,并解释该程序的功能。 #include stdio.h void main() int a=10,b=20,x; x=a; if (ab) x=b; printf(%dn,x); ,2. if else 形式,if else 形式的语法是: if (表达式) 语句1; else 语句2; 下一条语句; 功能: 检测表达式,如果值为非0(真),则执行语 句1,然后执行下一条语句;如果值为0(假), 执行语句2,再执行下一条语句。,例3.7编写程序,输入两个浮点数,分别表示昨天和今天的鸡蛋的单价,如果鸡蛋涨价了提示“不要买鸡蛋”,否则提示“可以买鸡蛋”。 #include stdio.h /*-price of egg-*/ void main() float a,b; printf(nPlease input price of egg yesterday:); /*提示用户输入昨天的鸡蛋单价*/ scanf(%f, /*输出提示今天可以买鸡蛋 */ ,例3.8 编写程序:输入两个数,求两个数的商,要求除数不为零时输出商,除数为零时,提示用户输入有误。 #include stdio.h /*-a divided by b-*/ void main() int a,b; printf(nPlease input two int number:); scanf(%d%d, ,例3.9 将输入字符的大写字符转换成小写字符输出,小写字符原样输出。 #include stdio.h /*-lowercase-*/ void main() int c; c=getchar(); if (c=A ,例3.10请问下面程序是否能够通过编译?为什么? #include stdio.h /*-max-*/ void main() int a=30,b=20,*x; if (ab) x= ,#include stdio.h /*-max-*/ void main() int a=30,b=20,*x; if (ab) x= ,3.5.4 else if 形式,例如我们要解决这样一个问题:输入一个股 票今天和昨天的收盘价,如果今天的收盘价大于 昨天的收盘价,提示“上涨”;如果今天的收盘价 小于昨天的收盘价,提示“下跌”;如果今天的收 盘价刚好等于昨天的收盘价,提示“平盘”。 判断条件的结果实际上是三种情况,我们先 用if else 解决这个问题:,用if else解决这个问题: #include stdio.h /*-price of stock-*/ void main() float x,y; printf(nPlease input price of stock yesterday:); /*提示用户输入昨
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!