• 1. C语言程序设计
  • 2. 第1篇 欢迎您进入C语言大门1、了解C语言程序设计 2、C语言的语法规则
  • 3. 第2篇 设计C语言结构程序1、设计顺序结构程序 2、设计选择结构程序 3、设计循环结构程序 4、多功能计算软件项目实训
  • 4. 第3篇 指导开发中型项目1、近距离接触C语言函数 2、编译预处理 3、应用数组设计程序 4、如何应用指针解决实际问题 5、学生成绩管理系统项目实训
  • 5. 第4篇 齐心协力、开发大型项目1、探究结构体、共用体、枚举以及位运算 2、学习文件 3、小型家庭财务管理项目实训
  • 6. 第1章 了解C语言程序设计 教学目标: 1. 了解什么是算法 2. 掌握C语言基础知识 3. 熟悉编译和运行C语言应用程序
  • 7. 1.1 什么是算法和程序设计1.1.1 了解程序设计语言 程序设计语言的发展: 面向机器的语言(机器语言和汇编语言) 面向过程的语言(高级语言) 面向对象的语言(高级语言)
  • 8. 1.1 什么是算法和程序设计1.1.2 算法的描述 算法的概念: 所谓算法,就是一个有穷规则的集合,其中的规则确定了一个解决某个特定类型问题的运算序列。 描述算法: 流程图描述 N—S图(框图)描述 伪代码描述
  • 9. 1.1 什么是算法和程序设计1.1.3 程序设计方法简介 程序设计的步骤: 建立数学模型 选定算法 编写程序 测试与调试
  • 10. 1.1 什么是算法和程序设计1.1.4 结构化程序设计 结构化程序设计的方法: 自顶向下 逐步细化 模块化
  • 11. 1.2 了解C语言基础知识1.2.1 探究C语言发展和特点 C语言的发展过程 C语言的特点: C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。
  • 12. 1.2 了解C语言基础知识1.2.2 阅读简单的C程序 例1.1 用C语言编程在屏幕上显示“您好,欢迎学C语言!” main() { printf("您好,欢迎学习C语言!\n"); } 解释:main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,且只能有一个主函数。函数调用语句printf函数的功能是把要输出的内容送到显示器显示出来。printf函数是一个由系统定义的标准函数,可在程序中直接调用。
  • 13. 1.2 了解C语言基础知识 1.2.2 阅读简单的C程序 例1.2 用C语言编程实现通过键盘输入一个数并 把它的正弦值求出来。 #include /*预处理命令*/ #include /*预处理命令*/ main() /*主函数*/ { double x,s; /*定义两个变量*/ printf("input number:\n"); scanf("%lf",&x); /*输入数据给变量x*/ s=sin(x); /*求变量x的正弦值*/ printf("sine of %lf is %lf\n",x,s);/*输出结果*/ }
  • 14. 1.2 了解C语言基础知识1.2.2 阅读简单的C程序 阅读以上程序,可以得出以下结论: 1.C语言程序的构成 一个源程序可以有一个或多个函数组成,而且都有且只有一个main函数,即主函数,C语言的程序总是从主函数开始执行 源程序中可以有预处理命令,预处理命令通常放在源文件或源程序的最前面 每一个语句都必须以分号结束,但预处理命令、函数头和花括号之后不加分号。 标识符和关键字之间,至少要加一个空格。 源程序中需要解释和说明的部分,可以用“/*......*/加以注释,以增加程序的可读性。
  • 15. 1.2 了解C语言基础知识1.2.2 阅读简单的C程序 阅读以上程序,可以得出以下结论: C语言程序的书写规则 在C语言中,虽然一行可以多个语句,一个语句也可占多行,但建议一行只写一个语句。 一般采用缩格式书写格式,以提高程序的可读性和清晰性。 C语言源代码一般用小写字母书写,除非另有约定。 在程序代码中,应加上必要的注释。
  • 16. 1.3 编译和运行C语言应用程序1.3.1 C语言应用程序的处理流程 写好一个C语言源程序后,一般要经过编辑、编译、连接、运行才能得到程序结果。 1.编辑:在文本编辑器中,用C语言语法编写源程序代码。扩展名为.c。 2.编译:通过编译器将源程序转换成机器代码,生成目标程序(*.obj),在C语言源程序的编译过程中,可以检查出程序中的语法错误。 3.连接:C语言是模块化程序设计语言,一个C语言应用程序可能由多个程序设计者分工合作完成,需要将所用到的库函数以及其他目标程序连接为一个整体,生成可执行文件(*.exe)。 4.运行:运行可执行文件后,可获得程序运行结果。
  • 17. 1.3 编译和运行C语言应用程序1.3.2 Turbo C2.0上机环境介绍 Turbo C工作环境介绍 从DOS环境进入; 从Windows环境进入: 主菜单 Turbo 环境中运行C语言源程序的步骤 编辑源文件 源程序的编译、连接 执行程序 退出Turbo C集成环境
  • 18. 1.4真正运行几个简单的C语言程序 例1.3 编程实现在屏幕上显示如下三行文字: Hello, world ! Welcome to the C language world! Everyone has been waiting for.
  • 19. 1.4真正运行几个简单的C语言程序 例1.3 程序如下: main() { printf("Hello,World!\n"); printf("Wolcome to the C language world!\n"); printf("Everyone has been waiting for.\n"); }
  • 20. 1.4真正运行几个简单的C语言程序 例1.4 输入并运行程序,写出运行结果。 main() { int a,b,sum; a=123;b=456; sum=a+b; printf(“sum is %d\n”,sum); } 运行最后结果为:sum is 579。
  • 21. 1.4真正运行几个简单的C语言程序例1.5 输入并运行程序,写出运行结果。 main() { int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max=%d”,c); } int max(int x,int y) { int z; if (x>y) z=x; else z=y; return(z); }
  • 22. 本章小结在计算机领域,程序是指按照计算机程序设计语言规范书写出来的一系列有序且有限的语句,它表达了程序员要求计算机所要执行的操作。 算法就是指解决方案及对方案准确、完整的描述。算法有五个特性:有穷性、确定性、可行性、输入、输出。算法含有两大要素:一个是操作,另一个是控制结构。控制结构只能有顺序、选择和循环三种基本结构或由它们派生出来的结构组成。相互之间存在一定关系的数据元素的集合及定义在其上的基本操作称为数据结构。 C语言有如下特点:过程化、模块化、结构化、灵活性、可移植性、丰富的数据类型、有丰富的运算符号等。 C语言的生成和运行包括编辑、编译、连接和运行四个步骤。
  • 23. 第2章 了解C语言的语法规则 教学目标: 1. 了解C语言的数据类型 2. 掌握常量、变量 3. 熟悉C语言的基本数据类型及其转换 4. 会书写表达式 5. 能进行简单的项目开发
  • 24. 2.1 C语言的数据类型 C语言的数据类型
  • 25. 2.2 常量和变量2.2.1 标识符 标识符的分类: 1. 用户标识符 在程序中使用的变量名、常量名、数组名、函 数名、标号等统称为标识符。除标准库函数的函数名由系统定义外,其余都由用户自定义,因此称之为用户标识符。 C 规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线和()组成的字符串,并且其第一个字符必须是字母或下划线。
  • 26. 2.2 常量和变量2.2.1 标识符 标识符的分类: 2. 系统标识符(关键字) C语言的关键字分为以下几类: 类型说明符 语句定义符 预处理命令字 运算符 分隔符 注释符
  • 27. 2.2 常量和变量2.2.2 常量 概念: 在程序的运行过程中,其值不能被改变的量。 分类: 直接常量 符号常量
  • 28. 2.2 常量和变量2.2.2 常量 实例: 例 2.1 定义一个符号常量PI表示圆周率,求圆的面积。 #define PI 3.14159 main() {int r; float s; r=1; s=PI*r*r; printf(“s=%f”,s); }
  • 29. 2.2 常量和变量2.2.3 变量 概念: 变量是指在程序执行过程中值可以改变的量,变量具有三要素:名称、类型和值。 使用变量: 定义变量 如:int a,b,c;等 初始化变量 如:float x=4.5;等 给变量赋值 如:x=6;等
  • 30. 2.3 C语言的基本数据类型及其转换2.3.1掌握C语言的基本数据类型 概念: 数据类型是按被定义变量的性质、表示形式、占据存储空间的多少,构造特点来划分的。 在C语言中,基本数据类型可以分为整型、字符型、实型。
  • 31. 2.3 C语言的基本数据类型及其转换2.3.1掌握C语言的基本数据类型 整型数据: 其值不可以再分解为其它类型。 整型数据的分类: 整型常量 整型变量
  • 32. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 整型常量的分类: 1. 八进制整常数 八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。 2. 十六进制整常数 十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。 3. 十进制整常数 十进制整常数没有前缀。其数码为0~9。
  • 33. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 整型变量的分类: 1.基本型: 类型说明符为int,在内存中占2个字节,其取值为基本整常数。 2.短整量:类型说明符为short int。所占字节和取值范围均与基本型相同。 3.整型:类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。 4.符号型
  • 34. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 整型数据表示范围及占用字节数 :
  • 35. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 特别提示: 1.允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 2.最后一个变量名之后必须以“;”号结尾。 3.变量说明必须放在变量使用之前。一般放在函数体的开头部分。
  • 36. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 实型数据的分类: 实型常量 实型变量
  • 37. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 实型常量的分类: 1.单精度实型(float) 2.双精度实型(double) 3.长双精度实型(long double)
  • 38. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 实型变量的分类: 1.单精度型 2.双精度型 3.长双精度型
  • 39. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 实型数据表示范围及分配字节数:
  • 40. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 字符型数据的分类: 字符常量 字符串常量
  • 41. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 字符常量的分类: 1.普通字符:用单引号括起来的单个字符。例如:‘%’、‘2’、‘a’、‘A’等。 ①‘a’和‘A’不同。 ②单引号中的空格符也是一个字符常量。 ③字符常量在内存中占一个字节,存放的是字符的ASCII值(见附录ASCII表)。 2.转义字符:以“\”开头的具有特殊含义的字符。
  • 42. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 字符串常量的分类: 用双引号括起来的零个、一个或多个字符序列,如,“Beijing”、“I`m a student”、“%d%d”等都是合法的字符串常量。
  • 43. 2.3 C语言的基本数据类型及其转换2.3.1 掌握C语言的基本数据类型 字符变量 : 用来存放字符常量,即只能放字单个字符,在内存中占1个字节的存储空间。 注意:C语言中没有字符串变量,决不能将一个字符串常量赋给一个字符型变量。
  • 44. 2.3 C语言的基本数据类型及其转换2.3.2 数据类型转换 自动转换 : 整型、单精度型、双精度型、字符型数据可以混合 运算,但在运算时,不同类型的数据先转换成同一类型。如下:
  • 45. 2.3 C语言的基本数据类型及其转换2.3.2 数据类型转换 强制转换 : 1.当自动转换不能实现目的时,可以用强制类型转换,其一般形式:(类型名)(表达式) 2.功能:把表达式结果的类型转换为圆括号中的数据类型。注意,类型名必须用括号()括起来。表达式一般用括号()括起来,但单个变量可以不用括号括起来。
  • 46. 2.4 学会书写表达式 概念: 1.运算符:狭义的运算符是表示各种运算的符号。 2.表达式:使用运算符将常量、变量、函数连接起来,构成表达式。
  • 47. 2.4 学会书写表达式2.4.1 算术运算符和算术表达式 算术运算符: +(加法运算符。如3+5) -(减法运算符或负值运算符。如5-2,-3) *(乘法运算符。如3*5) /(除法运算符。如5/3,5.0/3) %(模运算符或求余运算符,%要求两侧均为整型数据
  • 48. 2.4 学会书写表达式2.4.1 算术运算符和算术表达式 算术表达式: 1.用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。 2.运算对象可以是常量、变量、函数等。
  • 49. 2.4 学会书写表达式2.4.1 算术运算符和算术表达式 算术运算符的优先级与结合性 : 1.C语言规定了运算符的“优先级”和“结合性”。在表达式求值时,先按运算符的“优先级别”从高到低次序执行。 2.如果在一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。 3.在书写多个运算符的表达式时,应当注意各个运算符的优先级,确保表达式中的运算符能以正确的顺序参与运算。
  • 50. 2.4 学会书写表达式2.4.2 赋值运算符和赋值表达式 赋值运算符、赋值表达式 : 1.赋值运算符:赋值符号“=”就是赋值运算符。 2.赋值表达式:由赋值运算符组成的表达式称为赋值表达式。一般形式:〈变量〉〈赋值符〉〈表达式〉 3.赋值表达式的求解过程:将赋值运算符右侧的表达式的值赋给左侧的变量,同时整个赋值表达式的值就是刚才所赋的值。 4.赋值的含义:将赋值运算符右边的表达式的值存放到左边变量名标识的存储单元中。
  • 51. 2.4 学会书写表达式2.4.2 赋值运算符和赋值表达式 赋值运算符左边必须是变量,右边可以是常量、变量、函数调用或常量、变量、函数调用组成的表达式。 赋值符号“=”不同于数学的等号,它没有相等的含义。(“==”相等) 赋值运算时,当赋值运算符两边数据类型不同时,将由系统自动进行类型转换。 转换原则是:先将赋值号右边表达式类型转换为左边变量的类型,然后赋值。 C语言的赋值符号“=”除了表示一个赋值操作外,还是一个运算符。
  • 52. 2.4 学会书写表达式2.4.2 赋值运算符和赋值表达式 赋值运算符、赋值表达式举例 a=5 a=b=5 a=(b=4)+(c=3)
  • 53. 2.4 学会书写表达式2.4.2 赋值运算符和赋值表达式 自增、自减运算符及表达式 ++i,--i(前置运算):先自增、减,再参与运算;i++,i—(后置运算):先参与运算, 再自增、减。 自增、减运算符只用于变量,而不能用于常量或表达式。 ++,--的结合方向是“自右向左”(与一般算术运算符不同)。 自增、自减运算符常用于循环语句中,使循环变量自动加1,也用于指针变量,使指针指向下一个地址。
  • 54. 2.4 学会书写表达式2.4.2 赋值运算符和赋值表达式 有关表达式使用过程中的问题说明 1.C运算符和表达式使用灵活,利用这一点可以巧妙 处理许多在其它语言中难以处理的问题。 2.C语言有的运算符为一个字符,有的由两个字符组成,C编译系统在处理时尽可能多地将若干字符组成一个运算符。 3.C语言中类似的问题还有函数调用时,实参的求值顺序,C标准也无统一规定。
  • 55. 2.4 学会书写表达式2.4.3 逗号运算符和逗号表达式 有关表达式使用过程中的问题说明 1.C语言提供一种特殊的运算符-逗号运算符(顺序求值运算符)。用它将两个或多个表达式连接起来,表示顺序求值(顺序处理)。 2.用逗号连接起来的表达式称为逗号表达式。
  • 56. 2.5 项目开发实训2.5 项目开发实训——银行利息计算程序 例2.7 假定银行定期存款的年利率为2.25%,并已知存款期为n年,存款本金为x元,试编程计算n年后可得到本利之和是多少?
  • 57. 2.5 项目开发实训——银行利息计算程序 #include #include main( ) { float a=0.0225; double x,y; int n; scanf(“x=%f”,&x); scanf(“n=%d”,&n); y=x*pow((1+a),n); printf(“y=%f”,y); } 请大家分析以上程序并上机调试,看一看程序会输出什么结果?
  • 58. 本章小结 数据是程序处理的对象。处理数据前,要知道该数据的数据类型和它是作为常量还是变量来使用。 C语言提供了丰富的数据类型,基本的数据类型有整型、实型、字符型和枚举类型。 常量是指在程序运行期间不可改变的量。常量有:整型常量、实型常量、字符型常量和字符串常量。而且可以用符号常量。 变量是指在程序运行期间可以改变的量。变量实际上是代表了某个存储空间。 C语言的表达式非常丰富,它有算术表达式、赋值表达式、逗号表达式等。其他类型的表达式后续章节再做介绍。 本章重点介绍的是常量、变量的概念和区别,数据类型的节本概念;难点是算术运算符的自增、自减及类型转换。
  • 59. 第3章 设计顺序结构程序教学目标: 1. 了解C语言的语句类型 2. 掌握常用的输入数据函数和输出数据函数
  • 60. 3.1 了解C语言的语句类型3.1.1 C语言中的语句分类 表达式语句 赋值语句 自加减运算符构成的表达式语句 逗号表达式语句
  • 61. 3.1 了解C语言的语句类型3.1.1 C语言中的语句分类 函数调用语句 由函数名、实际参数加上分号“;”组成。其一般形式为:函数名(实际参数表);
  • 62. 3.1 了解C语言的语句类型3.1.1 C语言中的语句分类 控制语句 条件判断语句--if语句,switch语句 循环执行语句--do while语句,while语句,for语句 转向语句--break语句,goto语句,continue语句,return语句
  • 63. 3.1 了解C语言的语句类型3.1.1 C语言中的语句分类 复合语句 把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句。
  • 64. 3.1 了解C语言的语句类型3.1.1 C语言中的语句分类 空语句 只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。
  • 65. 3.1 了解C语言的语句类型3.1.2 最简单的C语言语句——赋值语句 概念: 赋值语句是由赋值表达式再加上分号构成的表达式语句。 其一般形式为: 变量=表达式; 赋值语句的功能和特点都与赋值表达式相同。
  • 66. 3.1 了解C语言的语句类型3.1.2 最简单的C语言语句——赋值语句 使用赋值语句的注意事项: 展开后的一般形式为: 变量=变量=…=表达式; 注意在变量说明中给变量赋初值和赋值语句的区别。 在变量说明中,不允许连续给多个变量赋初值。 赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。
  • 67. 3.2 输入和输出数据3.2.1 输出数据 printf函数调用的一般形式 printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。 printf函数调用的一般形式为:printf(“格式控制字符串”,输出表列); 其功能是按照格式控制字符串,将输出表列中的项按照一定格式进行输出。
  • 68. 3.2 输入和输出数据3.2.1 输出数据 printf函数的有关说明 格式控制字符串可以包括:“格式转换说明符”,用于规定相应输出项内容的输出格式,格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。 “输出表列” 输出表列中给出了各个输出项,可以是变量和表达式,输出项之间用逗号分隔。 要求格式字符串和各输出项在数量和类型上应该一一对应。
  • 69. 3.2 输入和输出数据3.2.1 输出数据 格式转换说明符 一般情况下,每个格式说明都是以字符%开始,以转换字符结束,在%和转换字符之间可以有: 减号- 数字0 正整数m(数据宽度) 英文句号. 正整数n(精度) 长度修饰符l(字母l)
  • 70. 3.2 输入和输出数据3.2.2 输入数据 scanf函数 scanf函数的一般形式 :scanf(“格式控制字符串”,地址表列); 格式字符串的一般形式为:%[*][输入数据宽度][长度]类型  
  • 71. 3.2 输入和输出数据 scanf函数的使用说明 scanf函数中没有精度控制 scanf中要求给出变量地址,如给出变量名则会出错。 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。 如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
  • 72. 3.2 输入和输出数据3.2.2 输入数据 键盘输入函数(getchar函数) getchar函数的功能是从键盘上输入一个字符。其一般形式为: getchar(); 通常把输入的字符赋予一个字符变量,构成赋值语句。
  • 73. 3.2 输入和输出数据3.2.2 输入数据 使用getchar函数还应注意几个问题: getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。 使用本函数前必须包含文件“stdio.h”。 在TC屏幕下运行含本函数程序时,将退出TC 屏幕进入用户屏幕等待用户输入。输入完毕再返回TC屏幕。
  • 74. 3.3 项目开发实例—学会大小写字母的转换 例3.17输入三个小写字母输出其ASCII码和对应的大写字母。 问题分析:大家可以查阅ASCII码表,我们发现,小写字母和大写字母的ASCII码相差32。
  • 75. 3.3 项目开发实例—学会大小写字母的转换 程序: void main(){ char a,b,c; printf("input character a,b,c:\n"); scanf("%c %c %c",&a,&b,&c); printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32); }
  • 76. 本章小结 本章介绍了顺序结构程序设计思想和方法,而顺序结构是最简单的一种结构,是组成其他复杂程序的基础。 介绍了C语言实顺序结构的语句的使用方法,包括赋值语句和标准输入输出语句。C语言的标准输入输出是由函数实现的,这些函数的格式描述比较复杂,它是本章的重点和难点。
  • 77. 第4章 设计选择结构程序 了解关系表达式、逻辑表达式、条件表达式的书写规则; 掌握构成选择结构的各种条件语句的用法; 掌握if语句、If-else语句、if-else-if语句和switch语句的区别。
  • 78. 4.1 了解选择结构 单分支结构 单分支结构如图4.1所示,当条件成立时,执行语句序列。
  • 79. 4.1 了解选择结构 双分支结构 双分支结构如图4.2所示,当条件满足时,执行语句序列1,当条件不成立使执行语句序列2。
  • 80. 4.1 了解选择结构 多分支结构 多分支结构如图4.3所示,当满足条件1时,执行语句序列1;当满足条件2时,执行语句序列2;以此类推,当满足条件n时,执行语句n;当给定的条件都不满足时,执行语句n+1。在多个条件中选择一个去执行。
  • 81. 4.1 了解选择结构4.1.1解决选择问题的基本步骤和方法 选择结构是结构化程序设计的三种结构之一,也是常用的一种结构,在大多数的程序中都包含有选择结构,一般来说解决这样的问题用以下方法和步骤: 1.判断解决的问题是否是选择问题。依据是有没有条件判断的操作,若有就是选择问题。 2.若是选择问题,则判断是哪种选择结构类型,是单分支、双分支还是多分支结构。 3.若是选择问题,确定选择结构,确定选择条件、执行过程与结束过程并用语句进行描述。 4.用C语言描述。
  • 82. 4.1 了解选择结构4.1.1解决选择问题的基本步骤和方法 例4.1根据学生成绩分出优秀、良好、中等、及格和不及格。 分析是否是选择问题,从上边的问题我们可以看出,这是个选择问题。 分析是哪种选择结构类型,显然是一个多分支结构。 描述选择过程。 P1:输入学生成绩(用变量G来表示) P2:判断学生成绩是否大于等于90分,如果是,评为优秀。 P3:判断学生成绩是在80—89之间,如果是,评为良好。 P4:判断学生成绩是在70—79之间,如果是,评为中等。 P5:判断学生成绩是在60—69之间,如果是,评为及格。 P6:判断学生成绩是否小于60分,如果是,评为不及格。 P7:结束
  • 83. 4.1 了解选择结构4.1.2学会描述条件 关系运算符和关系表达式 在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作,比较两个量的运算符称为关系运算符。 在C语言中,有以下关系运算符: < 小于 <= 小于或等于 > 大于 >= 大于或等于 == 等于 != 不等于
  • 84. 4.1 了解选择结构4.1.2学会描述条件 逻辑运算符和逻辑表达式 C语言提供了3种逻辑运算符: && 与运算 || 或运算 ! 非运算 与运算符“&&”和或运算符“||”都是双目运算符,具有左结合性,非运算符“! ”是单目运算符,具有右结合性 。“&&”和 “||”的优先级别低于算术运算符和关系运算符,而 “! ”的优先级则高于算术运算符和关系运算符。
  • 85. 4.1 了解选择结构4.1.2学会描述条件 逻辑运算符和逻辑表达式 一般情况下,逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式 其中的表达式又可以是逻辑表达式,从而组成嵌套的情形。
  • 86. 4.1 了解选择结构4.1.2 学会描述条件 条件运算符和条件表达式 条件运算符?:它是C语言中唯一的一个三目运算符 条件表达式的一般形式:表达式1?表达式2:表达式3 运算过程:先求表达式1的值,若为非零(真),去求表达式2的值,此时,表达式2的值就是整个条件表达式的值。若表达式1的值为零(假),去求表达式3的值,此时,表达式3的值就是整个条件表达式的值。
  • 87. 4.2 学会设计双分支选择结构程序4.2.1 不含else子句的if语句 语法格式: if(<表达式>) <语句1> 例如if(a
  • 88. 4.2 学会设计双分支选择结构程序4.2.2 含else子句的if语句 语法格式: if(<表达式>) <语句体1> else <语句体2> 执行过程: 首先计算<表达式>的值,如果该表达式的值为非零("真"),则执行<语句体1>,如果该表达式的值为零("假"),则跳过<语句体1>,直接执行<语句体2>,两者执行其一后再去执行if语句后的下一个语句。
  • 89. 4.2 学会设计双分支选择结构程序4.2.2 含else子句的if语句 特别提示: C语言中有一种特有的条件运算符“?:”,我们在前面章节已作介绍,它在某种程序上可以起到逻辑判断的作用。本例中的if语句也可用条件运算符表达式实现如下:y=x>=0?2*x+1:0; 但有些判断不能用条件表达式完成,或者很繁琐、表达不清晰。 如果两个分支中需要执行的语句不止一条,必须用“{}”括起来,作为一个复合语句使用。若只是一条语句,“{}”可以省略。
  • 90. 4.2 学会设计双分支选择结构程序4.2.2 含else子句的if语句 特别提示: if后面的<表达式>一定要有括号; if和else同属于一个if语句,else不能作为语句单独使用,它只是if语句的一部分,与if配对使用,因此程序中不可以没有if而只有else; 只能执行与if有关的语句或者执行与else有关的语句,而不可能同时执行两者; 如果<语句1>和<语句2>是非复合语句,那么该语句一定要以分号结束, if语句的表达式可以是任意类型的C语言的合法的表达式,但计算结果必须为整型、字符型或浮点型之一。
  • 91. 4.2 学会设计双分支选择结构程序4.2.2 含else子句的if语句 特别提示:非关系、非逻辑表达式构成的条件表达式 分支条件<表达式>的类型不限于逻辑/关系表达式,可以是任意的C语言有效表达式(如赋值表达式,算术表达式等等),因此也可以是作为表达式特例的常量或变量。
  • 92. 4.2 学会设计双分支选择结构程序4.2.3 嵌套的if语句 在一个if语句中又包含另一个if语句,从而构成了if语句的嵌套使用。内嵌的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。
  • 93. 4.2 学会设计双分支选择结构程序4.2.3 嵌套的if语句 特别提示:if与else的配对规则 if语句出现嵌套形式时,C语言规定:else子句总是和前面最近的不带else子句的if语句配对,与书写格式无关。注意从书写格式要有层次感(好的程序员应该养成这一习惯,以便他人理解你的程序和自己将来的修改)。如果if的数目和else的数目相同,从内层到外层一一对应,不易出错。如果if与else的数目不一致,为实现编程者的意图,必要的时候必须加"{}",来强制确定配对关系。否则,就不能实现编程者的真正意图。
  • 94. 4.3 设计多分支选择结构程序多路分支语句--switch语句 switch语句语法格式 switch(<表达式>) {case <常量表达式1>:<语句序列1> case <常量表达式2>:<语句序列2> …… case <常量表达式n>:<语句序列n> [default:<语句序列n+1>] }
  • 95. 4.3 设计多分支选择结构程序多路分支语句--switch语句 执行过程 首先计算<表达式>的值,然后在switch语句体内寻找与该吻合的case标号,如果有与该值相等的标号,则执行从该标号后开始的各语句,包括在其后的所有case和default语句,直到switch语句体结束。如果没有与该值相等的标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句体结束。如果没有与该值相等的标号,并且不存在default标号,则跳过switch语句体,什么也不执行。
  • 96. 4.3 设计多分支选择结构程序多路分支语句--switch语句 特别提示:在switch语句中使用break语句 break语句也称间断语句。可以在各个case之后的语句最后加上break语句,每当执行到break语句时,立即跳出switch语句体。 switch语句通常总是和break语句联合使用,使得switch语句真正起到多个分支的作用。
  • 97. 4.4 典型案例分析例4.11 运算符的优先级和短路运算符 #include main() { int a=0,b=4,c=3; int x,y,z; printf(“%d %d\n”,!a,!b); printf(“%d \n”,a
  • 98. 4.4 典型案例分析例4.12 试编写程序解决:判断某人是否属于肥胖体型 分析:根据身高和体重的关系,医务工作者金国广泛的调查分析得出以下“体指数”与肥胖程度的关系: 体指数t=体重w/(身高h)2 ((w单位为kg,h单位为m) 当t<18时,为低体重 当t介于18和25之间时,为正常体重 当t介于25和27之间时,为超重体重 当t≥27时,为肥胖
  • 99. 本章小结 分析本章主要介绍了选择结构程序设计的基本思想和设计方法。详细讲解了关系表达式、逻辑表达式、条件表达式的书写规则;讲解了构成选择结构的各种条件语句. if语句主要用于单向选择、If-else语句主要用于双向选择、if-else-if语句和switch语句主要用于多向选择。应当注意的是:这几种形式的条件语句一般来说是可以相互替代的。通过本章的学习,大家应该掌握选择结构程序设计的基本方法,并能用各种选择语句编写程序。
  • 100. 第5章 设计循环结构程序教学目标: 1.理解循环结构的概念; 2.能设计单重循环结构程序; 3.会设计复杂循环结构程序。
  • 101. 5.1了解循环结构 引言:有关循环的例子有很多,在自然界中,地球绕太阳旋转、每年的四季更替;在生活中,运动的车轮、旋转的电扇等。那么什么是循环呢?循环就是在给定条件成立(或不成立)时,反复执行的某个操作,直到某个条件不成立(或成立)为止 给定的条件称为循环条件,反复执行的程序段(语句序列)为循环体。 C语言提供了3种循环语句,while、do-while和for语句。利用它们可以组成各种不同形式的循环结构。
  • 102. 5.2 设计单重循环结构程序5.2.1 当型单重循环程序设计(while) while语句语法格式 while(<表达式>)<语句序列> 其中表达式是循环条件,语句序列为循环体。 while语句的执行过程 计算while后一对括号中的<表达式>的值。当值为非零时,则执行步骤(2);当值为零时,则执行步骤(3)。 执行<语句序列>后,转去执行步骤(1)。 退出while循环。
  • 103. 5.2 设计单重循环结构程序5.2.1 当型单重循环程序设计(while) while语句实现循环实例 例5.2 统计从键盘输入一行字符的个数。 #include void main() { int n=0; printf("input a string:\n"); while(getchar()!='\n') n++; printf("%d",n); }
  • 104. 5.2 设计单重循环结构程序5.2.1 当型单重循环程序设计(while) while语句实现循环实例 例5.3 用while循环语句实现从1加到100,并将结果打印出来。 #include "stdio.h" main() { int sum=0,i=1; while(i<=100) { sum+=i; i++; } printf("其和是 %d\n",sum); }
  • 105. 5.2 设计单重循环结构程序5.2.2 直到型单重循环程序设计(do while循环) do-while语句语法格式 Do <循环体语句> while(<表达式>); 说明:do是C语言的关键字,必须和while联合使用。do-while循环由do开始,用while结束;注意,在while结束后必须有分号,它表示该语句的结束。其它同while循环语句。
  • 106. 5.2 设计单重循环结构程序5.2.2 直到型单重循环程序设计(do while循环) do-while语句的执行过程 执行do后面的<循环体语句>。 计算while后一对括号中的<表达式>的值。当值为非零时,转去执行步骤(1)。当值为零时,则执行步骤(3)。 退出while循环。
  • 107. 5.2 设计单重循环结构程序5.2.2 直到型单重循环程序设计(do while循环) do-while语句实现循环实例 例5.5 用do-while语句实现求1+2+…+100的和。 #include "stdio.h" main() { int sum=0,i=1; do { sum+=i; i++;} while(i<=100); printf("其和是 %d\n",sum); }
  • 108. 5.2 设计单重循环结构程序5.2.2 直到型单重循环程序设计(do while循环) 特别提示: 在if语句,while语句中, 表达式后面都不能加分号, 而在 do-while语句的表达式后面则必须加分号。 do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。 在do和while之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。 do-while和while语句相互替换时,要注意修改循环控制条件。
  • 109. 5.2 设计单重循环结构程序5.2.3 for语句实现循环 for语句语法格式 for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为: for(表达式1;表达式2;表达3) 语句; 表达式1:通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。 表达式2:通常是循环条件,一般为关系表达式或逻辑表达式。 表达式3:通常可用来修改循环变量的值,一般是赋值语句。
  • 110. 5.2 设计单重循环结构程序5.2.3 for语句实现循环 特别提示: for语句中的各表达式都可省略,但分号间隔符不能少。 在循环变量已赋初值时,可省去表达式1,如例5.7即属于这种情形。如省去表达式2或表达式3则将造成无限循环,这时应在循环体内设法结束循环。
  • 111. 5.2 设计单重循环结构程序5.2.3 for语句实现循环 特别提示: 空语句后的分号不可少,如缺少此分号,则把后面的printf语句当成循环体来执行。反过来说,如循环体不为空语句时,决不能在表达式的括号后加分号,这样又会认为循环体是空语句而不能反复执行。
  • 112. 5.2 设计单重循环结构程序5.2.4 强制缩短与中止循环过程设计 程序中的语句通常总是按顺序方向,或按语句功能所定义的方向执行的。如果需要改变程序的正常流向,可以使用本小节介绍的转移语句。在C语言中提供了4种转移语句goto,break,continue和return。 其中的return语句只能出现在被调函数中, 用于返回主调函数。
  • 113. 5.2 设计单重循环结构程序5.2.4 强制缩短与中止循环过程设计 goto语句 goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。 C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向,转去执行语句标号所标识的语句。 goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。 在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
  • 114. 5.2 设计单重循环结构程序5.2.4 强制缩短与中止循环过程设计 break语句 break语句只能用在switch 语句或循环语句中,其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。break语句的一般形式为:break;使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。
  • 115. 5.2 设计单重循环结构程序5.2.4 强制缩短与中止循环过程设计 continue语句 continue语句只能用在循环体中,其一般格式是:continue;其语义是:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。 本语句只结束本层本次的循环,并不跳出循环。
  • 116. 5.2 设计单重循环结构程序5.2.5 区别三种循环结构 while和do一whi1e循环,只在while后面指定循环条件,在循环体中包含应反复执行的操作语句,包括使循环趋于结束的语句(如 i++,或i=+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 用while和do一while循环时,循环变量初始化的操作应在while和dO一whi1e语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
  • 117. 5.2 设计单重循环结构程序5.2.5 区别三种循环结构 while和for循环是先判断表达式,后执行语句;而do-- while循环是先执行语句,后判断表达式。 对while循环、do--while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。而对用for语句构成的循环,不能用break语句和continue语句进行控制。 几种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。
  • 118. 5.3 设计复杂循环结构程序 如果一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中又可以嵌套循环,这就是多重循环。以上讲的三种循环结构可以相互嵌套,但要注意,一个循环结构必须完整地包含在另一个循环结构中,两个循环不能交叉。 多重循环的嵌套次数可以是任意的,按照嵌套层次数,分别叫做两重循环、三重循环等。处于内部的循环叫内循环,处于外部的循环叫外循环。在使用多重循环时,要注意内外循环秒年 的关系,以及语句的安放位置,不要搞错。
  • 119. 5.4典型案例分析 结构化程序设计的思想是:一个程序的任何逻辑问题均可用“顺序”、“选择”和“循环”这三种基本逻辑结构来描述。实现这些程序流程的语句都是流程控制语句。流程控制语句在程序设计中起着重要的作用,通过三种基本控制结构,使结构化程序具有唯一入口和唯一出口,没有死循环。再一个特点是程序组织结构化,即程序设计采用自顶向下,逐步细化,功能模块化的方法。这种方法就是将程序设计成一个个功能简单独立的模块. 循环程序设计是有一定的编程规律和思路的,穷举与迭代是两类具有代表性应用的基本算法。
  • 120. 5.4 典型案例分析 例5.17 百钱百鸡问题。公元前,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
  • 121. 5.4 典型案例分析 分析:这是一个有名的不定方程问题。设:cocks:鸡翁数、 hens:鸡母数、chicks:鸡雏数,则有: cocks+hens+chicks=100 5*cocks+3*hens+chicks/3=100 据上述不定方程,很容易得到三个变量的取值条件: cocks:0-19之间的整数。 hens:0-33之间的整数。 chicks:0-100之间的整数。
  • 122. 5.4 典型案例分析 解题思路:依次取cocks值域中的一个值,然后再在试取hens值域中的每一个值,根据前两者取值,求出chicks后,看是否符合题意,符合者为解,编程如下: #include "stdio.h" main() { int cocks,hens,chicks; for(cocks=1;cocks<=19;cocks++) for(hens=1;hens<=33;hens++) { chicks=100-cocks-hens; if(5*cocks+3*hens+chicks/3.0==100) printf("cocks=%d,hens=%d,chicks=%d\n",cocks,hens,chicks"); } }
  • 123. 本章小结 本章介绍了循环结构程序设计方法,主要介绍了三种循环语句(while、do-while、for)和goto、break以及continue语句。三种循环语句的比较如下: 1.三种循环结构一般情况下都可以对同一问题进行处理,通常三者可以互换。 2.while、for属于“当型”循环, do-while属于“直到型”循环。 3.使用while、do-while循环时,循环控制变量的初值是在while、do-while语句之前赋予的,对循环控制变量的修改则是在循环体内完成;而for语句通常是在表达式1的位置实现对循环控制变量的初始化,在表达式3的位置对循环控制变量进行修改。 注意goto、break以及continue语句的用法。
  • 124. 第6章 多功能计算软件项目实训 6.1项目实训涉及知识要点综述 作为一个小型的实训项目,本实训旨在培养学生建立一定的编程逻辑思维能力,并掌握软件开发的基本方法及步骤。 涉及到的知识点主要包括:C语言基础知识、if-else选择结构、switch多路选择结构程序设计、循环结构程序设计、辅助控制语句以及以上知识点的综合应用。
  • 125. 6.2 项目实训的目的和任务 本项目实训的目的和任务是:掌握软件开发的基本方法;巩固和加深学生对C语言课程基本知识的理解和掌握,培养学生利用C语言进行软件设计的能力。
  • 126. 6.3 项目需求分析 本项目实训的目的和任务是:掌握软件开发的基本方法;
  • 127. 6.3 项目需求分析6.3.1 项目概述 本项目用于实现一个多功能计数器,主要具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
  • 128. 6.3 项目需求分析6.3.2 系统运行环境 操作系统:Windows98/ME/2000/XP等 开发工具:Turbo C/Visual C++
  • 129. 6.3 项目需求分析6.3.2 功能需求描述 功能要求:具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。依次输入运算符(+,-,*,/)、第一个运算数、第二个运算数,然后输出结果,当用户输入‘Q’则退出系统,否则允许用户连续进行运算。 界面要求:美观简洁
  • 130. 6.4 项目总体设计6.4.1 项目开发的总体思想 本项目开发的总体思想基于面向数据流的软件开发方法,在开发过程中采用自顶向下、逐步细化的设计方法。
  • 131. (本页无文本内容)
  • 132. 6.5 项目详细设计6.5.1数据定义 变量名定义及其意义: float data1,data2;/*存放参与运算的两个操作数*/ char operator;/*存放运算符*/ char bz; ;/*存放是否退出的标志*/
  • 133. 6.5 项目详细设计6.5.1核心功能代码设计 switch(operator) { case ‘+’:printf(“%.2f+%.2f”,x,y,x+y);break; case ‘-’: printf(“%.2f-%.2f”,x,y,x-y);break; case ‘*’: printf(“%.2f×%.2f”,x,y,x*y);break; case ‘/’: if(y= =0) {printf(“除数为零,无意义”); break; } printf(“%.2f÷%.2f”,x,y,x/y);break; default:printf(“运算符无效”); }
  • 134. 6.6 项目实训小结 本项目实现了整型数据、浮点型数据的算术(加、减、乘、除)运算功能,综合利用了分支结构、循环结构以及辅助控制语句,随着日后知识的积累,可进一步扩充其功能以求趋于完善。
  • 135. 第7章 近距离接触C语言函数教学目标: 1.理解函数的定义 2.会进行函数调用、参数传递 3.掌握变量的作用域和存储类别
  • 136. 7.1 了解C语言函数7.1.1 用函数解决实际问题的方法与步骤 确定问题的一个功能:如果一个问题很复杂可以划分多个功能,每一个功能可以用一个函数来实现。 分析函数:确定函数名称、函数参数、函数的返回值以及类型。 构造函数:设计函数体。 实现函数:用C语言的函数格式表示。 测试函数:验证函数分析、设计是否正确。
  • 137. 7.1 了解C语言函数7.1.2 进入常用标准库函数大门 函数的分类: 从函数定义的角度看,函数可以分为标准库函数和自定义函数。 C语言函数兼有其他语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。 从主调函数和被调函数之间数据传送的交付看又可分为无参函数和有参函数。
  • 138. 7.1 了解C语言函数7.1.2 进入常用标准库函数大门 函数的分类: C语言的库函数从功能上做以下分类: 字符类型分类函数:用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。 转换函数:用于字符或字符串的转换;在字符量和各类数字量 (整型, 实型等)之间进行转换;在大、小写之间进行转换。 目录路径函数:用于文件目录和路径操作。 诊断函数:用于内部错误检测。 图形函数:用于屏幕管理和各种图形功能。 输入输出函数:用于完成输入输出功能。
  • 139. 7.1 了解C语言函数7.1.2 进入常用标准库函数大门 函数的分类: C语言的库函数从功能上做以下分类: 接口函数:用于与DOS,BIOS和硬件的接口。 字符串函数:用于字符串操作和处理。 内存管理函数:用于内存管理。 数学函数:用于数学函数计算。 日期和时间函数:用于日期,时间转换操作。 进程控制函数:用于进程管理和控制。 其它函数:用于其它各种功能。
  • 140. 7.2 定义函数7.2.1 定义一个自己的函数 从函数定义的角度看,函数可以分为库函数和用户定义函数两种。 而有些功能系统没有提供给用户,但在程序中需要多次反复使用,这就要求用户根据需要自己编写设计函数,我们将这样的函数称为用户自定义函数。 在C语言中,所有的函数定义,包括主函数main在内,都是平行的。 定义函数要完成3项任务:指明函数的入口参数;指明函数执行后的状态,即返回值或返回执行结果;指明函数所要做的操作,即函数体。
  • 141. 7.2 定义函数7.2.1 定义一个自己的函数 定义无参函数 类型说明符 函数名() { 说明部分; 语句部分; }
  • 142. 7.2 定义函数7.2.1 定义一个自己的函数 定义有参函数 [存储类别] [类型说明符] 函数名(形式参数表) { 说明部分 语句部分 }
  • 143. 7.2 定义函数7.2.1 定义一个自己的函数 特别提示: 方括号中的内容可以省略。 函数名是用户为函数所起的名字,是一个标识符。在同一个程序中,函数名不能相同,也不能与同一作用域中的其他标识符相同。 当函数需要返回值,必须在函数名前注明返回值的类型,即函数类型。在某些情况下,还应说明函数的存储类别。形式参数表简称形参,列出该函数所用的全部形式参数,若形式参数表有多个参数时,参数间用逗号分隔。形参表的一般形式为:形参类型1 形参1,形参类型2 形参2,……,形参类型n 形参n。
  • 144. 7.2 定义函数7.2.1 定义一个自己的函数 例7.2 定义一个函数, 用于求两个数中的大数 int max(a,b) int a,b; { if (a>b) return a; else return b; } 第一行说明max函数是一个整型函数,其返回的函数值是一个整数。形参为a,b。第二行说明a,b均为整型量。 A,b的具体值是由主调函数在调用时传送过来的。
  • 145. 7.2 定义函数7.2.2 函数的参数 函数的参数分为形参和实参两种,形参出现在函数定义当中,在整个函数体内部都可以使用,离开该函数则不能使用。而实参则出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。 发生函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。
  • 146. 7.2 定义函数7.2.2 函数的参数 特别提示: 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量。 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,都必须有确定的值,以便把这些值传递给形参。因此必须预先用赋值、输入等办法使实参获得一定的值。 实参和形参在数量、类型、顺序上应严格一致。 函数调用中发生的数据传送是单向的。即只能把实参的值传递给形参,而不能把形参的值反向传递给实参。因此在函数调用过程中,形参的值发生改变,而实参中值不会变化。
  • 147. 7.2 定义函数7.2.3 函数的返回值 return语句的语法格式 return (表达式); return 表达式; return ; return语句的用途是:用于结束函数的执行并返回到调用函数;用来向调用者传递一个返回值。该语句对非void函数适用。
  • 148. 7.2 定义函数7.2.3 函数的返回值 函数值的类型 int max(int x,int y) char letter(char c1,char c2) double min(double m,double n)
  • 149. 7.2 定义函数7.2.3 函数的返回值 特别提示 : 函数的类型就是返回值的类型,return语句中表达式的类型应该与函数类型一致,如果不一致,以函数类型为准。 如果被调函数中没有return语句,则函数带回一个不确定的值,为了明确表示“不带回值”,可以用“void”定义“空类型”。
  • 150. 7.3 调用函数 7.3.1 调用函数的一般格式 函数名(实参表); 对无参函数调用时则无实参表,但是“()”不能省略。 实参表中的参数可以是常数,变量或其它构造类型数据及表达式。
  • 151. 7.3 调用函数7.3.1 调用函数的一般格式 函数表达式 函数作表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如: z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。
  • 152. 7.3 调用函数7.3.1 调用函数的一般格式 函数语句 函数调用的一般形式加上分号即构成函数语句。以函数语句的形式调用的函数可以有返回值,也可以没有返回值。例如: printf ("%d",a); scanf ("%d",&b);都是以函数语句的方式调用函数。
  • 153. 7.3 调用函数7.3.1 调用函数的一般格式 函数实参 函数作为另一个函数调用的实际参数出现。 这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y)); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。
  • 154. 7.3 调用函数7.3.1 声明一个函数 函数声明的一般形式为: 类型说明符 被调函数名(类型 形参,类型 形参…); 或为:类型说明符 被调函数名(类型,类型…); 在以上说明中,括号内给出了形参的类型和形参名, 或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。
  • 155. 7.3 调用函数7.3.1 声明一个函数 C语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明。 如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。 当被调函数的函数定义出现在主调函数之前时, 在主调函数中也可以不对被调函数再作说明而直接调用。 如在所有函数定义之前, 在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。 对库函数的调用不需要再作说明,但必须把该函数的头文件用include命令包含在源文件前部。数组作为函数参数数组可以作为函数的参数使用,进行数据传送。
  • 156. 7.3 调用函数7.3.3 调用函数中的参数传递方式 在调用函数时,主调函数和被调函数之间有数据的传递——实参传递给形参,具体的传递方式有两种: 值传递方式(传值):将实参单向传递给形参的一种方式。 地址传递方式(传址):将实参地址单向传递给形参的一种方式。
  • 157. 7.3 调用函数7.3.3 调用函数中的参数传递方式 特别提示: 单向传递,不管是传“值”还是传“址”,C语言都是单向传递数据的,一定是实参传递给形参,反过来不行。也就是说C语言中函数参数传递的两种方式本质是相同的,即单向传递。
  • 158. 7.3 调用函数7.3.3 调用函数中的参数传递方式 特别提示: 区别“传值”和“传址” “传值”和“传址”只是传递的数据类型不同(传值——一般的数据,传址——地址)。传址实际上是传值方式的一个特例,本质还是传值,只是此时传递的饿是一个地址数据值。 系统分配给实参、形参的内存单元是不同的。对于传值,即使函数中修改了形参的值,也不会影响实参的值;同样,对于传址,即使函数中修改了形参的值,也不会实参的值。但是,传址与传值一样不能通过参数返回数据,但因为传递的是地址,那么就可能通过实参参数所指向的空间间接返回数据。 对于传址不会影响实参的值,不等于不影响实参指向的数据。
  • 159. 7.4 深入探讨C函数7.4.1 函数的嵌套调用 C语言的函数定义都是相互平行、独立的。也就是说,在定义一个函数时,该函数体内不再定义另一个函数。C语言不允许嵌套定义函数,但是允许嵌套调用函数。即在调用一个函数的过程中,又可以调用另一个函数。
  • 160. 7.4 深入探讨C函数7.4.1 函数的嵌套调用
  • 161. 7.4 深入探讨C函数7.4.1 函数的嵌套调用 图7.1中表示了两层嵌套调用的情形。其执行过程是:执行 main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕后返回main函数的断点继续执行。
  • 162. 7.4 深入探讨C函数7.4.2 函数的递归调用 一个函数在其函数体内调用它自身成为递归调用,它是函数嵌套调用的一种特殊情况。C语言中允许函数的递归调用。例如: int f(int x) { int y; z=f(y); return z; } 这个函数是一个递归调用。
  • 163. 7.4 深入探讨C函数7.4.2 函数的递归调用 特别提示: 在递归函数中,由于存在着自调用过程,程序控制将反复地进入它的函数体。为防止自引用过程无休止地继续下去,在函数体内必须设置某种条件。这种条件通常用if语句来控制。当条件成立时终止自调用过程,并使程序控制逐步从函数中返回。
  • 164. 7.5 了解变量的作用域和存储类别7.5.1 了解变量的作用域 局部变量 局部变量也称为内部变量。局部变量是在函数内部作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
  • 165. 7.5 了解变量的作用域和存储类别7.5.1 了解变量的作用域 局部变量特别提示: 主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。这一点是与其他语言不同的,应予以注意。 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。 在复合语句中也可定义变量,其作用域只在复合语句中起作用。
  • 166. 7.5 了解变量的作用域和存储类别7.5.1 了解变量的作用域 全局变量 全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。 但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
  • 167. 7.5 了解变量的作用域和存储类别7.5.1 了解变量的作用域 全局变量的几点说明: 对于局部变量的定义和说明,可以不加区分。而对于外部变量则不然,外部变量的定义和外部变量的说明并不是一回事。 外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,因而使得函数的独立性降低。从模块化程序设计的观点来看这是不利的, 因此在不必要时尽量不要使用全局变量。 在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。
  • 168. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 动态存储方式与静态存储方式 从变量的作用域角度来分,可以分为全局变量和局部变量,从变量尊在的作用时间(即生存周期)角度来分,可以分为静态存储方式和动态存储方式。 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。 动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。
  • 169. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 动态存储方式与静态存储方式 用户存储空间可以分为三个部分: 程序区 静态存储区 动态存储区
  • 170. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 自动变量 这种存储类型是C语言程序中使用最广泛的一种类型。C语言规定, 函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可省去说明符auto。
  • 171. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 自动变量的特点: 自动变量的作用域仅限于定义该变量的个体内。在函数中定义的自动变量,只在该函数内有效。在复合语句中定义的自动变量只在该复合语句中有效。 自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。函数调用结束,释放存储单元,结束生存期。因此函数调用结束之后,自动变量的值不能保留。在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则将引起错误。 由于自动变量的作用域和生存期都局限于定义它的个体内, 因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量也可与该函数内部的复合语句中定义的自动变量同名。
  • 172. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 寄存器变量 当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样可提高效率。
  • 173. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 对寄存器变量的几点说明: 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。 在Turbo C,MS C等微机上使用的C语言中, 实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。而在程序中允许使用寄存器变量只是为了与标准C保持一致。 即使能真正使用寄存器变量的机器,由于CPU中寄存器的个数是有限的,因此使用寄存器变量的个数也是有限的。 凡需要采用静态存储方式的变量不能定义为寄存器变量。
  • 174. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 外部变量 外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变是是从它的作用域提出的,外部变量从它的存储方式提出的,表示了它的生存期。 当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量在其它的源文件中也有效。 对构造类型的外部变量, 如数组等可以在说明时作初始化赋值,若不赋初值,则系统自动定义它们的初值为0。
  • 175. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 静态变量 静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,前面已经介绍它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
  • 176. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 静态局部变量 概念: 在局部变量的说明前再加上static说明符就构成静态局部变量。
  • 177. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 静态局部变量的特点: 静态局部变量在函数内定义,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,它的生存期为整个源程序。 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。 允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。 对静态局部变量若在说明时未赋以初值,则系统自动赋予0值。对自动变量不赋初值,其值是不定的。
  • 178. 7.5 了解变量的作用域和存储类别7.5.2 了解变量的存储类别 静态全局变量 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
  • 179. 7.6 内部函数与外部函数 函数的本质是全局的,因为一个函数要被另一个函数调用,但是也可以指定函数不能被其他文件调用。根据函数能否被其他源文件所调用,将函数分为内部函数和外部函数。
  • 180. 7.6 内部函数与外部函数 内部函数的定义: static 类型说明符 函数名(形参表) {……} 外部函数的定义: extern 类型说明符 函数名(形参表) 关于内部函数和外部函数的使用请参阅其他手册。
  • 181. 本章小结 函数是C语言的基本组成单位,任何复杂的C语言程序都是由函数组成。每个C程序有且仅有一个主函数,而且总是从主函数开始执行。可以将主函数放在整个程序的前面,也可以放在其他函数的后面。 函数是C语言中重要的概念,也设计程序设计的重要手段。本章重点介绍了函数的定义与调用、函数的参数传递、函数的嵌套与递归、变量的作用域和存储类别等。 在实际应用中,函数是必不可少的,因此,本章是非常重要的章节,应该重点掌握。
  • 182. 第8章 编译预处理 教学目标: 1. 了解预处理的概念 2. 掌握宏定义 3. 了解文件包含 4. 了解条件编译
  • 183. 8.1 学会定义宏8.1.1 定义不带参数的宏(无参宏的宏名后不带参数) 定义的一般形式为: #define 标识符 字符串 例如:#define PI 3.1415926 作用:指定标识符PI来代替3.1415926这个字符串,编译预处理时,将程序在该命令后面出现的所有的PI都用3.1415926代替。
  • 184. 8.1 学会定义宏注意: ①替换后面不要加上不必要的分号。 ②习惯上宏名用大写字母表示,以便与变量名区别。当然也可以用小写字母表示。 ③宏定义是用宏名代替一个字符串,替换时只做简单的置换,不进行正确性检查。 ④对于程序中用双引号括起来的符串内字的字符,即使与宏名相同,也不进行置换。 ⑤宏定义不为宏名分配存储空间。 ⑥宏定义必须写在函数外,其作用域为宏定义命令起到源程序结束。 ⑦宏定义允许嵌套。 案例分析 :8.1 、8.2 、8.3
  • 185. 8.1 学会定义宏8.1.2 定义带参数的宏 带参宏定义的一般形式为: #define 宏名(形参表) 字符串 在字符串中含有各个形参。 例如 : #define M(y) y*y+3*y /*宏定义*/ 带参宏调用的一般形式为: 宏名(实参表); 例如 : k=M(5); /*宏调用*/
  • 186. 8.1 学会定义宏注意: ①带参宏定义中,宏名和形参表之间不能有空格出现。 ②在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。 ③在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。 ④在宏定义中,字符串内的形参通常要用括号括起来以避免出错。 ⑤带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。 案例分析:8.4 -8.10
  • 187. 8.1 学会定义宏8.1.3 终止宏定义 宏定义必须写在函数外,其作用域为宏定义命令起到源程序结束。 如果要终止其作用域,可以使用#undef命令。 例如: #define PI 3.1415926 /*定义PI*/ #undef PI /*取消PI的定义*/
  • 188. 8.2 了解文件包含8.2.1 初识文件包含 文件包含的一般形式为: #include <文件名> 或者写成: #include “文件名” 用双引号或尖括号括起文件是有区别的:若用双引号,则系统先在引用被包含文件的C源程序所在的文件目录中寻找,若找不到,再按系统指定的标准方式寻找其他目录;而用尖括号则仅仅查找按系统标准方式指定的目录。
  • 189. 8.2 了解文件包含8.2.2 调试多文件程序 一个大的程序可以分为多个模块,由多个程序员分别编程。有些公用的符号常量或宏定义等可单独组成一个文件,在其他文件开头用包含命令包含该文件即可。 说明 : ①一个include命令只能指定一个被包含文件, 若有多个文件要包含,则需用多个include命令。 ②文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。
  • 190. 8.3 了解条件编译 条件编译也是C具有的一种预处理功能。 条件编译有三种形式 : ①第一种形式: #ifdef 标识符 程序段1 #else 程序段2 #endif 案例分析:8.11
  • 191. 8.3 了解条件编译②第二种形式: #ifndef 标识符 程序段1 #else 程序段2 #endif ③第三种形式: #if 常量表达式 程序段1 #else 程序段2 #endif
  • 192. 本章小结编译预处理命令是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。 宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用时将用该字符串替换宏名。宏定义可以带参数,也可以不带参数。文件包含是预处理的一个重要的功能,它可以把多个源文件连接成一个源文件进行编译,生成一个目标文件。 总之,使用编译预处理功能便于对程序进行修改、阅读、移植和调试,也便于实现模块化程序设计。
  • 193. 第9章 应用数组设计程序 教学目标: 1. 了解数组概念 2. 掌握使用一维数组 3. 理解二维数组并应用 4. 熟练应用字符数组处理实际问题
  • 194. 9.1 学会使用一维数组 9.1.1 定义一维数组 定义一维数组的格式 类型说明 数组名[整型常量表达式]; 例如:int a[100]; 说明: ①整型常量表达式:表示数组元素的个数(数组的长度)。可以是整型常量或符号常量,不允许是变量。 ②C语言编译程序为数组分配了一片连续的存储空间。 ③C语言规定,数组名是数组的首地址,即a=&a[0]。
  • 195. 9.1 学会使用一维数组9.1.2 引用一维数组元素 数组必须先定义,然后使用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。 数组元素表示形式为:数组名[下标] 下标可以是整型常量或整型表达式。 案例分析:9.1
  • 196. 9.1 学会使用一维数组9.1.3 初始化一维数组 在定义数组时对数组元素赋以初值。例如: static int a[8]={0,1,2,3,4,5,6,7}; 可以只给一部分元素赋值。例如: static int a[8]={0,1,2,3,4}; 如果想使一个数组中全部元素值为0,可以写成 static int a[8]={0}; 在对全部数组元素赋初值时,可以不指定数组长度。 例如:static int a[]={1,2,3,4,5};
  • 197. 9.1 学会使用一维数组9.1.4 应用一维数组解决实际问题 案例分析:9.2 、 9.3、 9.4
  • 198. 9.2 真正理解二维数组9.2.1 定义二维数组 定义的一般形式: 类型说明符 数组名[常量表达式1][常量表达式2] 例如:f1oat a[3][4]; 说明: ①常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。 ②二维数组存储顺序是按行存储的,也就是说数组a[3][4]在内存中的存放顺序是:a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[1][0]……a[2][3]
  • 199. 9.2.2 引用二维数组元素 二维数组中的元素也称为双下标变量,其表示形式为: 数组名[下标1][下标2] 注意:其中下标应为整型常量或整型表达式。 案例分析:9.5 9.2 真正理解二维数组
  • 200. 9.2 真正理解二维数组9.2.3 初始化二维数组 按行分段赋值 int a[3][3]={{2,3,4},{5,6,7},{7,8,9}}; 按行连续赋值 int a[3][3]={ 2,3,4, 5,6,7,7,8,9}; 特别提示: ①可以只对部分元素赋初值,未赋初值的元素自动取值为0。 例如:int a[3][3]={{2},{5},{7}}; ②若对全部元素赋初值,第一维的长度可以省略,系统将依据元素个数来判断第一维的长度。 例如:int a[][3]={ 2,3,4, 5,6,7,7,8,9};
  • 201. 9.2 真正理解二维数组9.2.4 应用二维数组解决实际问题 案例分析:9.6 、9.7
  • 202. 9.3 深入探讨数组——字符数组9.3.1 字符数组的定义、引用和初始化 定义: 字符数组类型说明的形式与前面介绍的数值数组相同。例如: char c[10]; 引用:字符数组类型说明的形式与前面介绍的数值数组相同。 初始化: ①在类型说明时作初始化赋值。 static char c[8]={`a`,`.`,`p`,`r`,o`,g`,r`}; ②当对全体元素赋初值时也可以省去长度说明。例如:static char c[]={`p`,`r`,`o`,`g`,`r`};
  • 203. 9.3 深入探讨数组——字符数组9.3.2 字符串处理函数 字符串输出 格式:puts (str) 功能:从str指定的地址开始,依次将存储单元中的字符输出到显示器,直到遇到字符串结束标志。 字符串输入 格式:gets (str) 功能:从键盘输入一个字符串(可以包括空格),直到遇到回车符,并将字符串存放到由str指定的字符数组(或内存区域)中。
  • 204. 9.3 深入探讨数组——字符数组 字符串拷贝函数strcpy 格式: strcpy (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 字符串连接函数strcat 格式:strcat (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。
  • 205. 9.3 深入探讨数组——字符数组字符串比较函数strcmp 格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串2〉字符串2,返回值〉0; 字符串1〈字符串2,返回值〈0。
  • 206. 9.3 深入探讨数组——字符数组 测字符串长度函数strlen 格式: strlen(字符数组名) 功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。
  • 207. 9.4 典型案例分析把一个整数按大小顺序插入已排好序的数组中 在二维数组a中选出各行最大的元素组成一个一维数组b 输入五个国家的名称按字母顺序排列输出
  • 208. 本章小结 数组是程序设计中的重要内容,在实际应用中有很多的应用,数组常常和循环在一起使用,一维数组通常用单重循环来完成,二维数组通常用双重循环来完成,本章主要介绍的一维数组、二维数组和字符数组的概念以及它们的引用方式。要学会在实际应用中灵活运用。
  • 209. 第10章 如何应用指针解决实际问题设计 教学目标: 1.理解地址和指针 2. 掌握指针的基本运算 3.综合应用指针与数组 4.指向指针的指针 5.综合应用指针与函数 6.综合应用指针与函数 7.指向函数的指针变量与指针函数
  • 210. 10.1 了解指针基本知识10.1.1理解地址和指针 地址 编程中定义或说明变量,编译系统就为已经定义的变量分配相应的内存单元。也就是说,每个变量在内存中会有固定的位置,即具体的地址。 ①变量的地址 :只需在变量名的前面加上取地址运算符“&”即可。 ②数组的地址 :数组名代表数组的首地址。
  • 211. 指针 指针是存放地址值的变量或常量 。 ①指针变量:存放其它某一类型变量的地址。 ②指针常量:引用的对象的地址,是不能改变的地址 。 10.1 了解指针基本知识
  • 212. 10.1 了解指针基本知识10.1.2 定义指针变量 一般形式为: 类型说明符 *变量名; 例如:int *ptr; 说明: ① *表示这是一个指针变量。 ② 类型说明符表示本指针变量所指向的变量的数据类型,指针变量的基类型。一个指针变量只能指向同类型的变量,如ptr只能指向int变量。
  • 213. 10.1 了解指针基本知识10.1.3 指针的基本运算 指针变量的赋值 指针变量一定要有确定的值以后,才可以使用。禁止使用未初始化或未赋值的指针 。 指针变量的赋值可以有两种方法 : ①地址直接赋值给指针变量 例如:float *f=(float *)malloc(4); ②变量的地址赋值给指针变量 例如:int a,*p;p=&a;
  • 214. 10.1 了解指针基本知识指针运算符 ①&、*运算符 : &运算符:表示取变量的地址。 *运算符:访问指针变量指向的变量的值。 ②指针变量的比较运算 注意:比较两个指针,在他们同时指向内存的一片连续空间的境况下,才有意义。 ③指针变量的加减整数运算 当两个指针指向同一连续空间时,加减表示将指针向后或向前移动了n个元素。
  • 215. 10.2 综合应用指针与数组 指针变量可以指向数组或数组元素,对于数组而言,数组和数组元素的引用,也同样可以用指针变量。 10.2.1 指向一维数组的指针变量 指向数组的指针变量:存放数组数组首地址的变量 。 数组指针变量的定义以及获取初始值: ①定义时初始化 ②通过赋值将数组的首地址赋值给数组的指针变量
  • 216. 10.2 综合应用指针与数组通过指针引用数组元素 ①指针p+i的含义:不是地址值p增加i个字节后的地址值,而是指p向后移动i个基类型元素后的地址值。p-i,p++,p--都有类似的含义。 ②指针与数组的关系 如果指针p指向数组a,那么,p+i指向数组a的第i个元素a[i]。也就是p+i=&a[i]。 ③通过指针引用数组元素 若有int a[10],*p=a; 则数组元素a[i]的访问可以是:a[i],*(p+i),*(a+i)。
  • 217. 10.2 综合应用指针与数组10.2.2 指向字符串的指针变量 访问字符串的两种方式: ①用字符数组存放一个字符串 ②用字符串指针指向一个字符串 字符串指针变量与字符数组的区别 ①字符串指针变量本身是一个变量,用于存放字符串的首地址。字符数组是由若干个数组元素组成的,它可以用来存放整个字符串。 ②操作方式不同
  • 218. 10.2 综合应用指针与数组10.2.3 指针与二维数组 二维数组的地址 假设一个二维数组int s[3][4] ,可以看成由一维数组作为数组元素的数组 ,s是元素为行数组的一维数组的数组名, 就是说s是元素为行数组的一维数组的首地址。s+i即就是元素为行数组的一维数组的第i个元素的地址,即:*(s+i)=s[i]。 则:二维数组任何一个元素s[i][j]的地址可以表示为:&s[i][j]=s[i]+j=*(s+i)+j 二维数组任何一个元素可以表示为: s[i][j]=*(s[i]+j)=*(*(s+i)+j)
  • 219. 10.2 综合应用指针与数组指向二维数组的指针变量 定义格式:基类型 (*p)[m]; 说明:指定p是一个指针变量,它指向包含m个元素的一维数组。()不能省略,否则表示指针数组。 案例分析:10.6、10.7
  • 220. 10.2 综合应用指针与数组10.2.4 指针数组 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。 说明的一般形式为: 类型说明符*数组名[数组长度] 案例分析:10.8
  • 221. 10.2 综合应用指针10.2.5 指向指针的指针 当指针变量用于指向指针类型变量时,称为指向指针的指针变量。 指向指针的指针变量定义的一般形式: 类型说明符 **标识符; 案例分析:10.9
  • 222. 10.3 综合应用指针与函数10.3.1 指针变量作函数参数 指针变量作为函数参数时,同样是从实参单向传递指针变量的内容给形参,只是传递的内容是一个地址值。可以通过这个地址值间接改变实参、形参所共同指向的变量。 应用案例10.10来详细说明应用指针作为参数的特点:由于指针(地址)作为函数的参数按地址传递,则对形参的改变将直接影响实参的值。
  • 223. 10.3 综合应用指针与函数10.3.2 带参数的主函数 前面介绍的main函数都是不带参数的。因此,main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是main函数的形式参数。 main函数的两个参数 main(int argc,char *argv) 参数值的获得 由于 main 函数不能被其他函数调用,因此不可能在程序内部取得实际值,main函数的参数值是从操作系统命令行上获得的。 案例分析:10.11
  • 224. 10.3 综合应用指针与函数10.3.3 指向函数的指针变量 函数的指针:函数的入口地址(函数的首地址)。C语言规定函数的首地址就是函数名,所以函数名就是函数的指针。 指向函数的指针变量:存放函数入口地址(函数指针)的变量,称为指向函数的指针变量。简称函数的指针变量。 案例分析:10.12、10.13
  • 225. 10.3 综合应用指针与函数10.3.4 返回指针值的函数(指针函数) 返回指针值的函数定义:类型名 * 函数名(参数表) 例如:int *fun(int x,int y)表示fun是返回整型指针的函数,返回的指针值指向一个整型数据。该函数还包含两个整型参数x,y。 案例分析:10.14、10.15
  • 226. 本章小结 本章主要讲解了指针的基本概念和基本用法,它是本书的重点和难点,其中指针的含义与使用,函数之间的制止传送是本章的重点,而有关指针和数组、指针和函数、指针和字符串的关系及其应用则是本章的难点内容。
  • 227. 第11章 学生成绩管理系统项目实训 11.1 项目实训涉及知识要点综述 本系统主要对学生成绩进行基本管理,在项目开发过程中,涉及到的知识点主要包括函数、数组、指针,以及利用三者有机结合来处理实际问题。
  • 228. 第11章 学生成绩管理系统项目实训11.2 项目实训的目的和任务 本项目实训的目的和任务是:掌握模块化编程的基本方法和步骤;巩固和加深学生对C语言课程基本知识的理解和掌握,培养学生利用C语言进行软件设计的能力。
  • 229. 第11章 学生成绩管理系统项目实训11.3项目需求分析 11.3.1系统概述 本项目主要实现对学生成绩信息的管理,主要具备查询特定学生的记录、求其总分、平均分;以及显示所有学生的成绩记录、总分、平均分;查询有不及格课程的学生信息。 本项目实现的功能相对比较简单,但是其实现技术较为复杂,应用指针函数来实现。
  • 230. 第11章 学生成绩管理系统项目实训11.3.2 系统运行环境 操作系统:Windows98/ME/2000/XP等 开发工具:Turbo C/Visual C++ 11.3.3 功能需求描述 功能要求:根据用户输入的学生序号,输出该学生的全部成绩,总分、平均分;显示所有学生的信息;显示有不及格课程的学生信息。 界面要求:美观简洁,操作性强。
  • 231. 第11章 学生成绩管理系统项目实训11.4项目总体设计 11.4.1 项目开发的总体思想 本项目开发的总体思想基于模块化的程序设计,采用C语言中的指针、函数、数组来实现系统的典型功能,在Turbo C或Visual C++下进行开发。 11.4.2系统功能模块设计
  • 232. 第11章 学生成绩管理系统项目实训11.5 项目详细设计 11.5.1 数据说明 static float score[][4]={{60,70,80,90},{56,89,67,88},{34,45,77,93}}; /*二维数组存放3个学生4门课程的成绩*/ 11.5.2 系统部分功能代码设计
  • 233. 第11章 学生成绩管理系统项目实训11.6 项目实训小结 本项目功能相对比较简单,其侧重指针函数的应用,指针是C语言的一种典型数据类型,比较难以掌握,通过本实训促使学生进一步掌握应用指针进行高质量程序代码设计的能力。 在学习了结构体和文件部分内容之后,可进一步完善该项目。
  • 234. 第12章 结构体、共用体、枚举以及位运算 教学目标: 1. 理解结构体 2. 掌握结构体定义形式 3. 熟练引用结构体变量、数组、指针 4. 能简单应用链表进行插入和删除操作 5. 了解共用体、枚举类型、位运算
  • 235. 12.1 理解结构体 首先看一个例子: 问题提出:用以前的知识如何来解决此表格结构 的数据存储问题? 拟解决方案:应用数组,进而分析应用数组的弊端。 解题方案:应用结构体,并分析应用结构体优点。
  • 236. 12.1 理解结构体 结构体是一种构造类型(自定义类型), 本身需要定义。结构体由若干“成员”组成。每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造类型。 12.1.1 定义结构体类型 结构类型定义的一个实例: struct student { int no; char name[20]; char sex; };结构类型定义的一般形式: struct 结构体名 { 类型1 成员1; 类型2 成员2; ...... 类型n 成员n; };
  • 237. 12.1 理解结构体 说明: ①结构体名:结构体类型的命名遵循标识符规定 。 ②使用结构体类型时,struct 结构体名作为一个整体,表示名字为“结构体名”的结构体类型。 ③结构体类型的成员可以是基本数据类型,也可以是其它的已经定义的结构体类型-结构体嵌套。
  • 238. 12.1 理解结构体12.1.2 定义和初始化结构体变量 定义结构类型变量 ①定义结构体类型,再定义结构体变量 ②定义结构体类型的同时定义结构体变量 ③直接定义结构体变量(不给出结构体类型名,匿名的结构体类型)
  • 239. 12.1 理解结构体12.1.2 定义和初始化结构体变量 结构体变量的初始化 形式如下: struct 结构体名 { 类型1 成员1; 类型2 成员2; ...... 类型n 成员n; }变量名={初始化数据};
  • 240. 12.1 理解结构体12.1.3结构体变量的引用 引用结构体变量中的一个成员 格式:结构体变量名.成员名 成员本身又是结构体类型时的子成员的访问-使用成员运算符逐级访问。 同一种类型的结构体变量之间可以直接赋值(整体赋值,成员逐个依次赋值)。 不允许将一个结构体变量整体输入/输出
  • 241. 12.1 理解结构体12.1.4 深入探究结构体 结构体数组 ①结构体数组的定义 ②结构体数组元素的成员引用 ③结构体数组的初始化 结构体指针变量 ①结构体指针变量的定义 ②通过结构体指针变量访问结构体变量的成员
  • 242. 12.1 理解结构体12.1.5 使用结构体变量、结构体指针变量作函数参数 结构体变量、结构体指针变量都可以像其它数据类型一样作为函数的参数,也可以将函数定义为结构体类型或结构体指针类型(返回值为结构体、结构体指针类型)。 案例分析:12.5 、12.6
  • 243. 12.1 理解结构体12.1.6结构体指针的应用—链表 动态存储结构 在实际编程中,往往所需的内存空间无法事先确定 ,C语言提供了一些动态分配内存空间的函数,有效地利用了内存资源。 常用的内存管理函数有以下三个 : ①分配内存空间函数malloc pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。 ②分配内存空间函数 calloc ps=(struet stu*) calloc(2,sizeof (struct stu)); ③释放内存空间函数free
  • 244. 12.1 理解结构体链表的概念 链表是一种常见的重要的数据结构,是利用指针链在一起的线性组合 。 链表的示意图 : 图中,第0个结点称为头结点, 它存放有第一个结点的首地址,它没有数据,只是一个指针变量。以下的每个结点都分为两个域,一个是数据域,另一个域为指针域,存放下一结点的首地址。链表中的每一个结点都是同一种结构类型。
  • 245. 12.1 理解结构体链表操作 ①建立链表; ②结构的查找与输出; ③插入一个结点; ④删除一个结点;
  • 246. 12.2 了解共用体(联合体) 将不同类型的数据项存放于同一段内存单元的一种构造数据类型。 12.2.1定义共用体类型、共用体类型变量 共用体类型定义的一般形式: union 共用体名 { 类型1 成员1; 类型2 成员2; ...... 类型n 成员n; };
  • 247. 12.2 了解共用体(联合体)共用体类型变量的定义,方法同结构体变量的定义 union data { int a; float b; char c; }x;
  • 248. 12.2.2引用共用体变量 对共用体变量的赋值,使用都是对变量的成员进行的,共用体变量的成员表示为: 共用体变量名.成员名
  • 249. 12.3 了解枚举类型只能取事先定义值的数据类型是枚举类型。 枚举类型定义 enum 枚举类型名{枚举元素列表}; 枚举变量定义 ①定义枚举类型的同时定义变量 ②先定义类型后定义变量 ③匿名枚举类型
  • 250. 12.4用typedef定义类型 typedef是定义了一个新的类型的名字,没有建立新的数据类型,它是已有类型的别名。使用类型定义,可以增加程序可读性,简化书写。 格式:typedef 类型定义 类型名 案例: typedef struct { int month; int day; int year; }DATE; /* 定义DATE是一种结构体类型 */ DATE birthday,*p,d[7];
  • 251. 12.5 了解位运算 位运算是C语言的低级语言特性,广泛应用于对底层硬件,外围设备的状态检测和控制。 ①左移“<<”运算符 ②右移“>>”运算符 ③按位取反“~”运算符 ④按位位与“&”运算符
  • 252. 本章小结 结构体类型:结构体类型的定义,结构体变量的定义,结构体成员占用存储器情况,结构体变量的引用和初始化,结构体与数组之间的关系,结构体与指针之间的关系,结构体与函数之间的关系、用结构体来处理链表。 共用体类型:共用体与结构体之间的区别,共用体类型的定义,共用体变量的定义,共用体成员占用存储器情况,共用体变量的引用和初始化。 用typedef定义新的类型名的方法。
  • 253. 第13章 文件 教学目标: 1. 了解文件的概念 2. 掌握文件的分类 3. 熟悉操作文件的基本方法和步骤 4. 熟练应用函数来操作文件
  • 254. 项目演示:小型家庭财务管理系统 第13章 文件
  • 255. 13.1 初识文件13.1.1 区别不同的文件 文件概念: 文件是计算机中的一个重要概念,通常是指存储在外部介质上的数据的集合。 文件的分类: ①从文件组织形式角度:ASCII文件、二进制文件 ②从是否引用缓冲区角度:缓冲、非缓冲文件 ③从存取文件方式角度:顺序存取文件、随机存取文件
  • 256. 13.1 初识文件13.1.2 操作文件的基本方法和步骤 C语言操作文件主要有以下3个基本步骤: ①打开文件 ②读写数据 ③关闭文件
  • 257. 13.1 初识文件13.1.3 文件类型指针 文件类型(结构体)——FILE类型 : FILE类型是一种结构体类型,在stdio.h中定义,用于存放文件的当前的有关信息。 文件指针 对文件的访问是通过FILE类型指针变量(简称:文件指针)来完成的。
  • 258. 13.1 初识文件13.1.4 打开与关闭文件 打开文件:调用fopen函数实现 格式: FILE *fp; fp=fopen(“d:\\a1.txt”,“r”); ★注意:文件名和读写方式 关闭文件:调用 fclose函数实现 格式:fclose(文件指针);
  • 259. 13.2 读写文本文件(ASCII码文件) 13.2.1 文件的字符输入输出函数 fputc()函数 格式:fputc(ch,fp) 功能:将字符ch写入fp所指向的文件。 返回:输出成功返回值——输出的字符ch;输出失败——返回EOF(-1)。 说明:每次写入一个字符,文件位置指针自动指向下一个字节。 案例分析:13.2
  • 260. 13.2 读写文本文件(ASCII码文件)fgetc()函数 格式:ch= fgetc(fp); 功能:从fp所指向的文件读一个字符。 返回:输入成功返回输入的字符;遇到文件结束返回EOF。 说明:每次读入一个字符,文件位置指针自动指向下一个字节。
  • 261. 13.2 读写文本文件(ASCII码文件)13.2.2 测试文件结束函数feof() 文本文件可以使用EOF(-1)确定文件结束;但是对于二进制文件,使用-1判断文件结束是不恰当的。为了解决这个问题,ANSIC提供了feof(fp)函数判断文件是否真正结束。
  • 262. 13.2 读写文本文件(ASCII码文件)feof()函数——测试文件是否结束 格式: feof (fp); 功能:在程序中判断被读文件是否已经读完。 返回:当遇到结束标志时,函数返回值是1,否则返回值为0。 案例分析:13.3
  • 263. 13.2 读写文本文件(ASCII码文件) 13.2.3 文件的字符串输入输出函数 fgets()函数 格式: fgets(字符串指针变量str,字符串长度n, 文件指针变量fp) 功能:从fp所指向的文件读n-1个字符,并将这些字符放到以str为起始地址的单元中。 返回:输入成功返回输入串的首地址;遇到文件结束或出错返回NULL。 案例分析:13.4
  • 264. 13.2 读写文本文件(ASCII码文件)fputs()函数 格式:fputs(字符串str,文件指针变量fp) 功能:向fp所指向的文件写入以str为首地址的字符串。 返回:输入成功返回0;出错返回非0值。 案例分析:13.4
  • 265. 13.2 读写文本文件(ASCII码文件)13.2.4 文件的格式输入输出函数 格式化文件读写函数fprintf,fscanf与函数printf,scanf作用基本相同,区别在于fprintf,fscanf读写的对象是磁盘文件,printf,scanf读写的对象是终端。
  • 266. 13.2 读写文本文件(ASCII码文件)格式: fprintf(fp,格式字符串,输出表列); fscanf(fp,格式字符串,输入表列); 例如: fprintf(fp,“%d,%f”,i,j); 其含义是:将整型变量i和实型变量j的值按照%d和%f的格式输出到fp指向的文件中。 fscanf(fp,“%d%f”,i,j); 其含义是:从fp所指向的文件中读取一个整型数据赋值给变量i,一个实型数据赋值给变量j。
  • 267. 13.3 读写二进制文件 读写函数形式 : int fread(void *buffer,int size,int count,FILE *fp); int fwrite(void *buffer,int size,int count,FILE *fp); 说明: buffer是指针,对fread用于存放读入数据的首地址;对fwrite是要输出数据的首地址。 size是一个数据块的字节数(每块大小),count是要读写的数据块块数。 fread、fwrite返回读取/写入的数据块块数。
  • 268. 13.4 文件的定位 对文件的读写可以顺序读写,也可以随机读写。可以通过文件位置指针函数,实现文件的定位读写 。 13.4.1 rewind()函数 功能:使文件位置指针重返文件的开头。 格式:rewind(fp); 案例分析:13.7
  • 269. 13.4 文件的定位 13.4.2 fseek()函数 功能:移动文件读写位置指针,以便文件的随机读写。 格式:fseek(FILE *fp,long offset,int whence); 说明: ①whence参数代表计算起始点(计算基准).计算基准可以是下面符号常量: 符号常量 值 含义 SEEK_SET 0 从文件开头计算 SEEK_CUR 1 从文件指针当前位置计算 SEEK_END 2 从文件末尾计算
  • 270. 13.4 文件的定位 说明: ②offset代表偏移量(单位:字节).从计算起始点 开始再偏移offset,得到新的文件指针位置。 offset为正,向后偏移;offset为负,向前偏移。 案例分析:13.8 、13.9
  • 271. 13.4 文件的定位13.4.3 获取当前位置指针——ftell()函数 功能:得到文件当前位置指针的位置,此位置相对于文 件开头的。 格式:long ftell(FILE *fp); 返回值:就是当前文件指针相对文件开头的位置。
  • 272. 本章小结文件分类 文件操作步骤 操作文本文件 操作二进制文件 文件操作都是通过函数实现的,大家要学会文件的打开、文件的关闭、文件的定位与文件内容的读写的实现方法。
  • 273. 第14章 小型家庭财务管理项目实训 14.1 项目实训涉及知识要点综述 本系统主要对家庭的各项财务收支进行计算机管理,作为本课程的一个综合型实训内容,涉及的知识点贯穿了整个课程,在项目开发过程中,主要应用的关键知识点集中在函数、数组的应用、以及结构体、文件的综合应用上。
  • 274. 第14章 小型家庭财务管理项目实训14.2 项目实训的目的和任务 本项目实训的目的和任务是:巩固和加深学生对C语言课程基本知识的理解和掌握;掌握C语言编程和程序调试的基本技能;利用C语言进行基本的软件设计;掌握书写程序设计说明文档的能力;提高运用C语言解决实际问题的能力。
  • 275. 第14章 小型家庭财务管理项目实训14.3 项目实训要求 ①分析项目实训项目的要求 ②写出详细设计说明 ③编写程序代码,调试程序使其能正确运行 ④设计完成的软件要便于操作和使用
  • 276. 第14章 小型家庭财务管理项目实训14.4项目需求分析 14.4.1系统概述 本系统给家庭提供了一个利用计算机对财务进行有效管理的平台,实现了家庭财务管理过程中对财务信息的增加、删除和修改等基本功能,另外,本系统还提供了成员的管理功能,不同级别的成员拥有不同的权限,比如,系统可以根据登录的用户名和密码来判断该成员能够使用系统那些特定功能。 14.4.2系统运行环境 操作系统:Windows98/ME/2000/XP 开发工具:Turbo C/Visual C++
  • 277. 第14章 小型家庭财务管理项目实训14.4.3 功能需求描述 ①用户登录 ②创建财务信息管理文件 ③增加成员财务收支信息 ④删除成员财务收支信息 ⑤修改成员财务收支信息 ⑥查询成员财务收支信息 ⑦成员管理
  • 278. 第14章 小型家庭财务管理项目实训14.5 项目总体设计 14.5.1 项目开发的总体思想 本项目开发的总体思想基于模块化的程序设计,完全采用C语言来实现系统的增加、删除、修改、查询等典型功能,在Turbo C或Visual C++下进行开发。 14.5.2 项目模块结构设计
  • 279. 第14章 小型家庭财务管理项目实训14.5.3项目数据结构设计 成员信息数据结构设计 用户登录数据结构设计
  • 280. 第14章 小型家庭财务管理项目实训14.6项目详细设计 14.6.1 成员用户登录模块设计 14.6.2成员财务管理模块设计
  • 281. 第14章 小型家庭财务管理项目实训14.6.3成员管理模块设计
  • 282. 第14章 小型家庭财务管理项目实训14.6.4项目部分代码设计 创建成员信息模块关键代码设计: 财务信息删除模块部分代码设计:
  • 283. 第14章 小型家庭财务管理项目实训14.7项目实训小结 本项目实现了家庭财务管理过程中对信息的增、删、改等基本操作,根据软件工程的基本流程对各个模块的设计过程进行了阐述。 本系统对信息的管理使用了文件的形式,另外使用C语言进行图形界面设计较为复杂,本系统只提供一些简洁的提示信息,不支持图形用户界面,在程序的运行中提供的只是一些文本信息,阅读和处理都不太方便。大家课下可以利用C语言提供的图形处理功能,把一些界面变得更漂亮一些。