1.8k likes | 1.96k Views
C 语言程序设计. 课程设置目的. 本课程是非计算机专业学生的技术基础课,通过本课程的学习,应使学生掌握传统的结构化程序设计的一般方法,以 C 为语言基础,培养学生严谨的程序设计思想、灵活的思维方式及较强的动手能力,并以此为基础,让学生逐渐掌握复杂软件的设计和开发手段,为后续专业课程的学习打下扎实的理论和实践基础,因此,本课程是一门理论性和实践性均较强的课程。. 教学基本要求. 学生应在教师的指导下,深入钻研教材内容,通过 C 语言的例题掌握其使用方法,从而深刻理解和牢固掌握程序设计的一般方法。
E N D
课程设置目的 本课程是非计算机专业学生的技术基础课,通过本课程的学习,应使学生掌握传统的结构化程序设计的一般方法,以C为语言基础,培养学生严谨的程序设计思想、灵活的思维方式及较强的动手能力,并以此为基础,让学生逐渐掌握复杂软件的设计和开发手段,为后续专业课程的学习打下扎实的理论和实践基础,因此,本课程是一门理论性和实践性均较强的课程。
教学基本要求 • 学生应在教师的指导下,深入钻研教材内容,通过C语言的例题掌握其使用方法,从而深刻理解和牢固掌握程序设计的一般方法。 • 学生在学习过程中,应加强上机实践,将理论与实践充分结合起来,在实践的基础上深刻理解理论知识的真正含义,避免死记硬背和机械式的套用,主动将所学知识转化成实际能力。 • 上机前准备好上机所需的程序。上机输入和调试自己所编写的程序。上机结束后,应整理出实验报告,实验报告的内容应包括:题目、程序清单、运行结果及对运行情况的分析和上机体会。
教学内容 第一章、c语言概述 第二章、数据类型、运算符与表达式 第三章、顺序结构程序设计 第四章、选择结构程序设计 第五章、循环结构程序设计 第六章、数组 第七章、函数 第八章、指针 第九章、结构体与共同体 第十章、文件 第十一章、编译预处理与位运算
教材及参考书 教材: • 《C语言程序设计》(第二版) 清华大学出版社 谭浩强等 编著 • 《C语言程序设计实习指导与习题集》 天津大学出版社 高福成等主编 参考书: • 《C语言程序设计》 天津大学出版社 高福成 主编 • 《C语言程序设计实习指导与习题集》 清华大学出版社 谭浩强等 编著
第一章 C语言概述 【教学要求】 1.了解C语言的主要应用范围,C语言为什么被称为“中级语言”。 2.理解并掌握结构化程序设计的概念和一般方法。 3.了解C语言的基本结构。 4.掌握TURBO C的上机步骤及注意事项。
教学要点 一、C语言概述 1.C语言的由来 2.C的产生与发展 二、C语言的特点 三、C语言的应用场合:适用于面向过程的中小型程序设计。 四、简单的C语言程序介绍 1.C源程序的结构形式 2.对C源程序的结构的说明 五、C程序的上机过程 1.常用术语:源程序、目标代码、连接程序、库、编译状态、运行状态。 2. TURBO C上机运行程序的过程 3.TURBO C集成环境的使用
C语言的特点 1、语言简洁,紧凑使用方便,灵活。只有9种控制语句、32个关键字。 2、运算符丰富,共有32种运算符,表达式书写灵活多样 3、数据结构丰富,有:整型,实型,字符型,数组型,指针类型,结构体类型和共用体类型。
C语言的特点 4、具有结构化的控制语句。以函数实现程序的模块化设计。 5、程序书写自由,语法规则宽松,对编程人员要求高。 6、能直接对计算机硬件进行操作。 7、程序执行效率高 8、程序可移植性好
简单C程序介绍 例1—1 main( ) { printf(“This is a c program.\n”); } 输出信息: This is a c program.
简单C程序介绍 例1—2 main( ) /*求两个数之和*/ {int a,b,sum; /*定义变量*/ a=123;b=456; sum=a+b; printf(“sum is %d\n”,sum); } 输出信息:sum is 579
简单C程序介绍 int max(x,y) int x,y; {int z; if (x>y) z=x; else z=y; return (z); } 例1-3 main() {int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max=%d”,c); }
C语言程序的基本构成 1、源程序以.c作为扩展名(*.c) 2、C程序由若干函数构成 3、函数由说明部分和函数体构成 4、一个C程序总是从main()函数开始的 5、C程序书写自由,一行可以写多个语句,一个语句也可以分为多行来写 6、语句以及数据定义后面必须有一个分号“;” 7、可用/*….*/对程序进行注释
函数类型 说明部分 函数名 函数参数 函数 变量定义 函数体 执行部分
常用术语 源程序:用户可读的程序文本,即程序本身。 目标代码:由源程序翻译而成的机器码,计算机能读并能直接运行。 连接程序:将各自分别编译后的程序连接为一个可运行程序的程序。(它将C语言的标准库函数与用户所编的程序联合在一起) 库:包含标准函数的文件,这些函数可用在用户的程序中。(包括所有的输入输出函数及其它有用的例行函数) 编译状态:在程序编译过程中所出现的事件。 运行状态:在程序运行过程中所发生的事件。
TURBO C上机运行程序的过程 1、在磁盘搜索路径已经设置为turbo c的子目录下情况下,键入tc 2、编辑源文件:程序的输入、编辑与保存 3、编译源程序:Compile 4、执行程序,查看结果: Run 5、Alt+x退出 编译 连接 调试 源程序编辑 产生目标 代码 生成可执行 程序 产生正式 程序
TURBO C集成环境的使用 一、 TURBO C集成环境的窗口构成 菜单窗口、编辑窗口、信息窗口、功能键窗口 二、菜单项的使用 1.File 2.Edit 3.Run 4.Compile 5.Option
第二章 数据类型、运算符和表达式 [教学要求] 1.掌握C的几种基本数据类型。 2.掌握标识符的概念,熟悉变量和符号常量先定义后使用特点。 3.熟练掌握整型、长整型、短整型、无符号整型数据的定义与存储特点。 4.熟练掌握单精度、双精度浮点数的定义与存储特点。 5.熟练掌握字符型数据的的定义与存储特点,并熟悉整型数据与字符型数据间的关系。 6.掌握定义变量的同时,赋初值的方法。 7.掌握不同类型数据间的混合运算规则。 8.掌握不同运算符(算术、关系、逻辑运算符等)的使用特点、清楚每种运算符的优先级与结合性. 9.掌握各种表达式的含义与使用要点。
第二章 教学要点 一、C数据类型概述 二、数据的定义 1.常量的定义(常量的含义、类型、定义方法) 2.变量的定义(变量的含义、类型、命名、定义与使用) 三、运算符与表达式 四、数据类型的相互转换
C语言数据类型概述 一、基本概念 1、程序的概念 为完成某一任务的计算机描述。 2、程序的组成 程序=数据结构+算法 =数据结构+算法+程序设计方法+语言工具和环境 =操作对象+操作行为 =数据描述+动作描述 =数据+程序代码 数据结构:数据的类型与数据的组织形式. 算法:即解题的操作步骤。 是一个解题过程、这个过程由一套规则组成,这些规则指定一个操作顺序,使得通过有限的步骤,对特定类型的问题给出解答。
C语言数据类型概述 二、C语言的数据类型 整型 基本类型 字符型 单精度 实型 双精度 枚举型 数据类型 数组 构造类型 结构体 指针类型 共用体 空类型
常量 1、常量的含义:在程序运行过程中,其值保持不变的量。 2、符号常量 1)含义:用一个标识符表示的常量。 2)定义方法:#define 符号常量 数值 例:#define PRICE 30 作用是定义符号常量PRICE的值为30,在程序中任何用到PRICE符号常量的地方,系统将自动用常量30代替。 3)使用要点: 为区分符号常量与变量的不同,通常符号常量用用大写字母表示(但不是必须)。 例exp2_1:#define PRICE 30 main() { int num=10,total; total=num*PRICE; printf(“total=%d”,total);} 3、常量的类型:根据字面形式可将常量区分为不同的类型。
常量的类型 • (1) 整型常量: • C语言表示整型常量的方法有以下三种: • 十进制整数:用不带任何修饰的整数表示。如123、-456、0等; • 八进制整数:以数字0开头的整数。如0123、-011等; • 十六进制整数:以数字0x开头的整数。如0x123、0x2ef; • (2)字符常量: • C语言规定以单引号‘’包围的单个字符为字符常量。 • 如:‘A’、‘a’、‘2’ 、’!’等。 • 注意: • 请区别‘A’和‘a’的不同; • ‘ ’中的字符引用的是该字符的ASCII码值。 • 字符常量的存放形式与整数的存放形式相类似,故C中的字符数据与整型数据之间具有相通性。
常量的类型 (3)转义字符常量(也称控制字符常量) 用‘\’开头的特殊形式的字符常量,用以产生一个动作。(P48) 如:‘\n’、‘\r’、’\t’、’\v’、’\\’、’\123’等。 请同学们理解并记忆常用的转义字符,学会其使用方法。(课本例3.5) (4)字符串常量 C语言中用双引号将一串字符括起来称为字符串常量。 如 “asee”、 “011”、“We are studing C”等。 要点:·请区别”A”与’A’的不同。 因为它们各自在内存中存放的长度不同。 ”A” ’A’ ASCII码为0的字符 A \0 A
转义字符常量 转义字符 功能 例exp2_2: \n 换行main( ) \t 横向跳格 { printf(“??ab?c\t?de\rf\tg\n”); \v 竖向跳格 printf(“h\ti\b\bj???k”); \b 退格 } \r 回车 程序在屏幕上的输出结果为: \f 走纸换页 f???????gde (?表示空格) \\ “\”字符 h??????j???k \’ “’”字符 \0 ASCII码字符 \ddd 1至3位八进制数所代表的字符 \xhh 1至2位八进制数所代表的字符
常量的类型 5)实型常量(浮点数) • 十进制数形式的浮点数:由数字和小数点组成。 如:123.456、0.123、123.0、0.0、123.等。 • 指数形式的浮点数:用字母e表示十进制指数中的10。 如:123e3(表示123*103) 注意:e字母前必须有数字,且e后的指数必须为整型。 如:e3、2.1e3.5、.e3为不合法。
变 量 12 1、变量的含义: 在程序执行过程中,其值可以被改变的量。 变量的构成:变量名、变量值。 (注意区分变量名和变量值:存储单元地址与存储单元内容) a 2、标识符与变量的命名 3、不同类型变量的定义与使用
标识符与变量的命名 1、标识符:用于标识变量名、符号常量名、数组名、函数名、 类型名、文件名的有效字符序列。 2、标识符的组成:由字母、数字和下划线组成。 3、变量的命名 • 每个变量具有一个名称,以区分不同的变量, • 变量的命名原则:按“见名知意”的原则。 4、变量的定义方法: 变量类型 变量名称 说明: • 变量必须先定义、后使用。 • 应保证变量名使用正确(严格区分大小写) • 定义后的变量,在编译时可为其分配相应大小的存储单元。 • 可在编译时依变量类型的定义检查该变量所进行的运算是否合法。
整型变量 1、含义:用于存放整型数据的变量。 2、分类:int、short int、long int、unsigned int、 unsigned short、unsigned long。 3、存储特点: C语言没有具体规定各类型数据所占内存的字节数,根据机型不同而不同,一般以一个机器字长存放 一个int 型数据(见P41图3.2),即2B。 4、整型变量的定义方法:int 变量名 C程序规定变量要先定义后使用,并且,所有变量的定义都要放在变量的说明部分。例: 5、整型变量可表示的数据范围
不同类型机器所对应的不同形式整型数据的存储情况不同类型机器所对应的不同形式整型数据的存储情况
例exp2_3: /*求两个数之和*/ main() { int a,b,sum; /*定义变量*/ a=123;b=456; sum=a+b; printf(“sum is %d\n”,sum); } 输出信息:sum is 579
整型变量可表示的数据范围 ·参见课本P43表3.1 ·如果值在-32768至32767之间,可以赋值给int ,long int型变量。 ·如果值超出上述范围在-2147483648至2147483647内,可以赋值给long int型变量。 ·只有数值后面加上“l”或“L”的常量才认为是长整型常量。如123L. ·无符号型变量只能存放不带符号的整数,而不能存放负数。 ·无符号型整型变量中可以存放的数的范围比一般整型变量中数的范围扩大一倍。 ·没有unsigned型的常量。
IBM PC机器所对应的不同形式整型数据的存储范围
实型变量 1、含义:用于存放实型(浮点型)数据的变量。 2、定义方法: • 单精度实型变量的定义: float 实型变量名; • 双精度实型变量的定义: double 实型变量名; • 长双精度实型变量的定义: long double 实型变量名; 如: float x,y; double z; 3、存储特点:在PC机中 • float型变量一般占4B内存空间,有效数字为6至7位. • double型型变量一般占8B内存空间,并提供15至16位有效数字。 • long double型型变量一般占16B 内存空间,并提供18至19位有效数字。 4、说明: 一个实型常量可以赋值给一个float型变量或double型变量。
字符变量 1、 含义:用于存放字符常量 (存储ASCII码字符或8位二进制数) 2、 定义方式:char 字符变量名 如:1)char c1,c2; c1=‘d’; c2=‘s’; 2) unsigned char sum; 3、字符数据在内存中的存放形式: 字符数据在内存中存放的是它的ASCII编码。当以字符格式输出时,输出为字符;当以整型输出时,输出为整型数。 4、例:
例exp2_4: main() {char c1,c2; c1=‘a’; c2=‘A’; printf(“c1=%c,c2=%c\n”,c1,c2); printf(“c1=%d,c2=%d\n”,c1,c2); } 程序输出为: c1=a,c2=A 说明:·字符数据与整型数据之间可以相互赋值。 c1=97,c2=65 ·字符数据可以以字符或整型数据两种方式输出。
例exp2_5: 将两个小写字母转换成大写字母。 main() {char c1,c2; c1=‘a’; c2=‘b’; c1=c1-32;c2=c2-32; printf(“c1=%c,c2=%c\n”,c1,c2); } 程序输出为: c1=A,c2=B
变量定义:小结 1、将整型、字符型、实型数据称为C的基本数据类型; 2、对变量的初始化: C允许在变量定义时直接用“=”对其进行赋值。 如:int sum=0; int a,b,c=5; int a=3,b=3,c=5; char c1=‘w’; 不能这样写: int a=d=e=10; 3、C语言中没有定义字符串变量,对字符串的处理将采用数组或指针。请同学们注意区别字符与字符串的不同。 4、例:
例exp2_6:列出不同数据类型所占内存的长度。 main() { printf(“char %2d\n”,sizeof(char)); printf(“int %2d\n”,sizeof(int)); printf(“unsigned %2d\n”,sizeof(unsigned)); printf(“short %2d\n”,sizeof(short)); printf(“long %2d\n”,sizeof(long)); printf(“float %2d\n”,sizeof(float)); printf(“double %2d\n”,sizeof(double)); } 其中:sizeof是用于计算各种数据类型占用存储单元的字节数的运算符。 请同学们思考程序的运行结果,并分析。
运算符与表达式概述 一.运算符 1、含义:完成特定运算功能的符号。 2、运算符的类型:C语言的运算符范围很宽,除了控制语句和输入输出以外的几乎所有的基本操作都包含在其中。 算术运算符赋值运算符 逗号运算符关系运算符 逻辑运算符 3、运算的优先级与结合性 二、表达式 1、含义:由运算符和运算对象组成的字符序列。 2、表达式的种类: 算术表达式:如 a+b+c 赋值表达式:如 x=3.15 逗号表达式:如 a=3,a+15 关系表达式:a>10 逻辑表达式:x>1 && x<10
运算的优先级与结合性 1、优先级的含义: 决定运算的先后顺序的一组规则(课本P375附录Ⅲ)。 2、结合性的含义: 当表达式的运算具有相同优先级别时,C规定了运算符的结合方向。 1)左结合性:运算对象与左边的运算符进行运算 如:a+b+c表达式中,运算对象b按照先a+b再(a+b)+c的顺序进行运算。 此处的b具有左结合性。 2)右结合性:运算对象与右边的运算符进行运算 3、使用要点: • 表达式的运算以优先级为准,若优先级相同再考虑结合性。 • 结合性是C语言区别于其它任何语言的特点之一。 • 请同学们在学习运算符时应搞清每一种运算符的优先级与结合性。
算术运算符使用要点 1、组成:+、-、*、/、%(求余)、++(自增)、--(自减) 2、使用要点: 1)两个整型数相除,其结果为整型; 如:10/3=3 -5/3=-1 (负数采用“向零取整”) 2)%运算符的两个操作数必须是整型的; 如:7%4=3 特别情况: 0%5=0;5%0=5; -7%4=-3;-7%-4=-3; 7%-4=3。 即: %运算的符号只取决于第一个数符。
算术运算符使用要点 3)++与--运算符的使用: • ++与--运算只能用于变量,而不能用于常量或表达式。 如:5++或(a+b)++为不合法的。 • i++ 与++i,i--与--i的区别 ++i与--i称为前缀形式:在计算时先改变变量的值,再参与其它运算 i++与i--称为后缀形式:在计算时先参与其它运算,再改变变量的值 例:若 i=1 则 k=++i+2 运行后 i=2、k=4 而 k=i+++2 运行后 i=2、k=3 • ++与--运算符的的结合性为右结合。 • 例如:
特殊情况: (1)若i=3 则:(i++)+(i++)+(i++) 表达式的值为9,i=6 而:(++i)+(++i)+(++i) 表达式的值为18,i=6 (2)对i+++j 表达式的处理: 采用“自左至右”的原则 即: i+++j 与(i++)+j 等价 而不是与i+(++j )等价 (3)对printf(“%d,%d”, i,i++);的理解 若 i=3 ,则对输出函数参数的求值顺序采用“自右至左” 结果为:4,3(而不是3,3)
赋值运算符的使用要点 1、含义:将“=”右边的运算对象之值赋给左边的运算对象。 如:x=1; x=x+1; 2、使用要点: (1)当“=”两边数据类型不同时,将进行数据类型的自动转换,原则是:以“=”左边运算对象的数据类型为准。 如: int x; float y=3.5; x=y; 则运行结果为int型 说明: (2)复合赋值运算符
赋值运算时不同类型数据间的自动转换 1、实型数据赋值给整型数据时,舍弃小数部分; 即:int=float的结果为int型。 如:float a; int s; a=12.34; s=a; 这时s的值为12。 2、将整型数据赋值给实型变量时,数值不变,但数据是浮点形式的; 即float=int的结果为float型。 如:int s; float a; s=12; a=s; 这时a的值为12.00000。
赋值运算时不同类型数据间的自动转换 3、当字符数据赋值给整型变量时,则将字符数据放到整型变量的低8位中,高8位数根据的存放数据有两种情况: 即: int=char • 当char为无符号或unsigned char时,高8位应补0; 如:unsigned char c; int x; c=‘\376’; x=c; 则x的值为254。 • 当char为有符号数据时,高8位需进行“符号位扩展”,即高8位将依据符号位的值来决定是补0或补1; 如:char c; int x; c=‘\376’; x=c; 则x的值为-2。 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
赋值运算时不同类型数据间的自动转换 4、将带符号的整型数据赋值给长整型数据时,要进行符号扩展。如果int型数据为正值,则long int 型数据的高16位补0;如果int型数据为负值,则long int 型数据的高16位补1,以保持其原有数据不变。 5、将 long int 型数据赋值给int型数据时,只将long int 型数据的低16位原封不动的送到int 型变量中去(截断)。 6、将unsigned int型数据赋值给long int型数据时,不存在符号扩展问题,只需将高位补0;将unsigned int型数据赋值给int型数据时,有可能出现错误数据。 如: int a; unsigned b=65535; a=b; printf(“%d\n”,a); 此时a的值为-1。(补码) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
关于补码: 1、数据在计算机中是以补码的形式存放的。 2、补码是数据在计算机中的一种编码原则。 • 正数的补码仍为它的原码(8位二进制) • 负数的补码是将原码的除最高位以外的所有位取反然后加1,最高位为1。 如:15的补码为:00001111(8位) 0000000000001111(16位) -15的补码为:11110001(8位) 11111111111110001(16位)