已阅读5页,还剩412页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C C程序设计程序设计 2 C程序设计 第一章C语言概述 第二章数据类型及基本运算 第三章顺序结构程序设计 第四章选择结构程序设计 第五章循环结构程序设计 第六章数组 第七章函数 第八章指针 第九章结构与其他自定义类型 第十章文件 3 第一章 C语言概述 l 概述 l C程序简介 4 概述 l 程序设计与高级语言 l C语言的产生与发展 l C语言的特点 5 程序设计与高级语言 l 机器指令 l 指令系统 l 机器语言 l 机器程序 6 程序设计与高级语言 l 汇编指令 l 汇编语言 l 汇编语言源程序 l 汇编程序 例 7 程序设计与高级语言 l 程序设计语言 l 低级语言和高级语言 l 高级语言源程序、编 译程序 l 集成环境 例:TC、VC等 8 C语言的产生与发展 l C语言发明于1972年 l C+发明于1980年 9 C语言的特点 l 语言描述简洁、灵活、高效 l 有丰富的数据类型和运算符 l 提供了功能齐全的函数库 l 具有结构化程序设计风格 l 具有汇编语言特征 l 具有良好的通用性和程序的可移埴性 10 C程序简介 l C程序设计规则 l C程序的编译与运行 简单的C程序(一)简单的C程序(二)简单的C程序(三) 11 C程序设计规则 l 程序中使用到的一切数据都必须在 使用之前对其类型和存储属性加以 定义和说明 l 函数是C程序的基本模块,它应该包 括函数名、参数说明表和函数体三 个部分 12 C程序设计规则 l一行上允许写多个语句,或一句语句分写 在多行上,但语句结束前必须加分号 l允许在程序中插入注释,注释行必须以规 定的符号“/*”开头,以符号“*/”结束 l书写格式自由,为提高程序的可读性,可 采用“缩进”方式书写 13 C程序的编译与运行 l l Turbo CTurbo C的使用的使用 l l Visual C+ 6.0 Visual C+ 6.0 的使用的使用 14 EE Turbo CTurbo C的使用的使用 将Turbo C编译程序装入磁盘某一目录下 例如: 放在C盘根目录下一级TC子目录下。 (1)进入Turbo C集成环境 在DOS环境下 C:TCtc 在在WindowsWindows环境下环境下 找到可执行文件tc.exe,执行该文件。 主菜单:主菜单:1111个菜单项个菜单项: : File Edit Search Run Compile Debug Project File Edit Search Run Compile Debug Project Options Window Help Options Window Help 15 (2) (2) 编辑源文件编辑源文件 新建:新建:单击单击“ “File”File”菜单下菜单下 的的“ “New”,New”, 修改:修改:选择选择“ “File”“Open”(File”“Open”(即单击即单击“ “File” File” 的下拉的下拉 菜单中的菜单中的“ “Open”Open”项,修改已有的源程序。项,修改已有的源程序。 在编辑(EDIT) 状态下光标表示当前进行编辑的位 置,在此位置可以进行插入、删除或修改,直到 自已满意为止。 保存:在编辑(EDIT) 状态下光标表示当前进行编辑 的位置,在此位置可以进行插入、删除或修改, 直到自已满意为止。 16 (3) 对源程序进行编译 选择“Compile”(或“Alt+F9”)对源程序进行编译。 17 (4) 将目标程序进行连接 选择菜单“Compile” “Link” ,如果不出现错 误,会得到一个后缀为.exe的可执行文件。 (5) 执行程序。 选菜单“Run” “Run”( 或按“Ctrl+F9” 键)。 (6) 退出Turbo C环境 选择“File”“Quit” 。 18 EE Visual C+ 6.0 Visual C+ 6.0 的使用的使用 Visual C+ 6.0是在Windows环境中工作的。 (1)进入Visual C+ 6.0 集成环境 在Windows双击图标 几个重要菜单项: File(文件) , Edit(编辑) , Project(项目) , Build(构建) 19 (2) (2) 输入和编辑源程序输入和编辑源程序 新建一个源程序:新建一个源程序:选择选择“ “File”File”菜单下菜单下 的的“ “New”New” 单击单击“ “OK” OK” 按钮后,即可进行输入和编辑源程按钮后,即可进行输入和编辑源程 序,保存之后源程序就以序,保存之后源程序就以c1-1.cc1-1.c为文件名存放在为文件名存放在 D D盘的盘的cccc目录下。目录下。 20 在VC+主窗口的标题栏中显示出D:ccc1-1.c。光 标闪烁表示程序编辑窗口已激活,可以输入和编 辑源程序了。 别忘了保存! 21 (2) 对源程序进行编译 编译是对单个文件进行的,源程序文件经编译后将生成目标文件(*.obj文件 ),供链接用。 编译操作的方法为选择BuildCompile菜单命令,也可使用快捷键“Ctrl+F7” 或直接点击编译按钮。 编译按钮 为程序建立一个项目工作区! 说明:说明:编译时系统检查源程序中有无语法错误,并在 主窗口下部的调试信息窗口输出错误(error)或警告 (warming)信息 ,用户需要改正错误并重新编译。 22 (4) 将目标程序进行连接 连接是将编译生成的目标程序与系统中的库函数连接(Link),生成可执行的.exe文 件。 链接操作的方法为选择BuildBuild菜单命令,也可使用快捷键“F7”或直接点击链接 按钮 生成.exe 文件 连接按钮 23 (5) 执行程序 选择BuildExecute菜单命令或者快捷键“Ctrl+F5”或直接点击运行按钮来运行程 序。 运行按钮 常用的工具按钮 24 (6) 查看结果 程序执行后,系统将自动切换到输出结果的窗口, 显示出运行结果如下: 说明:说明:按任何一键后,屏幕将自动切换到主窗口。 25 (7)关闭工作区 如果已完成对一个程序的操作,不再对它进行其他 的处理,需要关闭工作区。 应当选择“File”“Close Workspace”(关闭工 作区) ,以结束对该程序的操作。 26 第二章 数据类型及基本运算 l 数据的表示 l 基本数据类型及其表示 l 算术运算符和算术表达式 27 数据的表示 l 信息与数据的特征 l 数据类型 28 信息与数据的特征 l 信息 l 数据 l 数据处理 29 数据类型 在C语言中,数据总体上可分为 l 基本类型 l 构造类型 l 指针类型 30 基本数据类型及其表示 l 标识符、常量与变量 l 整型数据 l 实型数据 l 字符型数据 31 标识符、常量与变量 l 标识符 l 常量 l 变量 32 标识符必须满足以下定义规则: l 必须由字母或下划线开始,由字 母、数字和下划线组成的长度不 超过32的字符串 l 大、小写字母表示不同意义 l 不能与C关键字同名 标识符、常量与变量 有关标识符练习 33 常量可分为: l 数值常量 l 字符常量 标识符、常量与变量 34 l 符号常量 l 符号常量的定义: #define l 例: #define PI 3.1415926 标识符、常量与变量 35 l 变量 l 规定变量在使用前必须说明 l 变量的说明: l 例: int a,b,x; 标识符、常量与变量 36 l 在程序中,一个变量占据着一个 实际的存储单元,变量名实际上 是存储单元的标志,存储单元中 的内容是变量的值。 l 允许在定义变量的同时对其赋初 值 标识符、常量与变量 37 整型数据 int a,b; short c,d; long m=6; long n=j=8; unsigned long k; a=123; b=045; c=d=0x3d8; k=0773L; 简单的C程序(二) 38 实型数据 float a,b; double x,sum; a=29.56; b=6.8e-07; x=.33; sum=55.; 错误的数据表示 简单的C程序(三) 39 字符型数据 l 字符型常量 l 字符型常量中字母区分大小写 l 转义字符以“”开头来标记 40 字符型数据 char c1,c2,c3=A; c1=98 int a,b=49; c2=b; a=c1; 41 基本运算符和表达式 l 算术运算符和算术表达式 l 赋值运算符和赋值表达式 l 逗号运算符和逗号表达式 l 关系运算符和关系表达式 l 逻辑运算符和逻辑表达式 l 位运算符和位表达式 42 算术运算符和算术表达式 l 算术运算符 简单的C程序(四) 43 算术运算符和算术表达式 l 算术运算符的运算优先级 和结合性 44 算术运算符和算术表达式 l 算术表达式 l 说明: l在算术表达式中没有上标和下标 l乘号必须用*表示,不能省略 l括号一律使用圆括号 45 算术运算符和算术表达式 l 写出下列代数式的C表达式: l x是个三位数,写出取其各位数的 表达式 46 算术运算符和算术表达式 l 自动类型转换: main() float y,z=242.5; unsigned x=2; short s=4; y=10+b+5.7*x+z/a-s*12.5; printf(“y=%f“,y); 47 算术运算符和算术表达式 l 强制类型转换: main() float x=4.55; printf(“(int)x=%d,x=%f“,(int)x,x); x=8*(int)(1/2+5/(float)2); 48 算术运算符和算术表达式 例:设float x,y,z; x=6/4; y=6./4; z=-6%4 结果:x的值为1.0, 结果:y的值为1.5 结果:z的值为-2.0, 49 算术运算符和算术表达式 l 自增1、自减1运算符为单目运算符 l 其有两种运算形式:前缀形式和后缀 形式,功能不同 l 前缀形式的自增、自减1运算的优 先级高于算术运算符中的所有双目运 算符 l 其运算对象只能是变量(可以是实数) 50 算术运算符和算术表达式 例:设int x=5;则: y=+x; 结果:y=6,x=6 y=x+; 结果:y=5,x=6 x+; 结果:x=6 y=x+*-x 结果:y=16,x=5 51 赋值运算符和赋值表达式 l 基本赋值运算符 形式:= 功能:将赋值运算符右边的表达式 的值赋给其左边的变量。 52 赋值运算符和赋值表达式 注意: l 赋值号左边只能是变量 l 如果右边表达式类型与左边变量的 类型不一致,则先将右边表达式的 值自动转换成与左边变量相同的类 型,再进行赋值 53 赋值运算符和赋值表达式 l 复合赋值运算符 形式:= 功能:对赋值运算符左、右两边的 运算对象进行指定的算术运算符 的运算,再将运算结果赋予左边 的变量。 54 赋值运算符和赋值表达式 l a+=b;等价于a=a+b; l a-=b; 等价于a=a-b; l a*=b+1; 等价于a=a*(b+1); l x+=3+x%(-3);设x=11 l 结果:16 55 赋值运算符和赋值表达式 l 赋值表达式 l k=j=1; l int k,a=1,j=5; l a+=j+; l a=20+(j=7); l a=(j=9)+(k=7); 56 逗号运算符和逗号表达式 l 逗号的用法有两种:分隔符; 运算符。 l C允许用逗号连接表达式,双目 运算符,运算优先级最低。 a=2*6,a-4,a+15; 57 逗号运算符和逗号表达式 l 逗号表达式 t=a;a=b;b=t;t=a,a=b,b=t; x=(5+5,10+10);x=? int j=5; a=(a=j+1,a+2,a+3);a=? 58 关系运算符和关系表达式 关系运算符 l 6种关系运算符:、=、y+x x!=y=z-2 x=y=z-1 若关系表达式成立,其值为非零,否则为零 60 逻辑运算符和逻辑表达式 逻辑运算符 l 3种逻辑运算符:!、 功能:在显示器上输出一个字符 参数:可以是字符型变量、整型变量 或相应的常量 77 putchar函数 例:使用库函数putchar()输出各种字符。 main() char ch1,ch2;int i; ch1=C;ch2=h; i=105; putchar(ch1);putchar(ch2); putchar(i);putchar(n); putchar(141);putchar(n); 78 printf函数 形式: printf(“”,); 79 printf函数 功能: l 将各输出项的值按指定的格式 显示在屏幕上 printf函数示例 80 printf函数 参数: l输出项可以是变量、常量和表达式 l格式控制字符串中允许包含格式编辑符和原 样输出的字符串 l格式编辑符形式:% l格式修饰包括:标志、类型修饰、输出最小 宽度和精度等 81 printf函数 标志: l 标志字符主要有-、+等。 82 printf函数 输出宽度: l 可以用十进制数限定输出数据 的位数 83 printf函数 精度: l 对于float或double类型的实型 数,可以用“m.n”的形式指定数 据的输出宽度和小数位数 84 printf函数 类型修饰: l 类型修饰符有h和l两种,l表示输出 项是长整型、无符号长整型或双精 度实型 85 printf函数 特殊字符的输出: l 可以用“”输出一个“”;用 “%”输出一个“%” 86 printf函数 注意: l 格式控制字符串中的格式说明 与输出项必须保持类型相同和 个数一致 87 数据的输入 88 getchar函数 形式:getchar (); 功能:从键盘上读取一个字符 参数:不带任何参数,函数的返回值 是输入字符的ASCII码 89 getchar函数 main() char c; c=getchar(); printf(“%c:%dn“,c,c); 90 scanf函数 形式: scanf (“”,输入项1, 输入项2,); 91 scanf函数 功能: l 按指定的格式接收由键盘输入的 数据,并存入输入项变量所在的 内存单元中 92 scanf函数 参数: l 格式控制字符串与printf函数 类似,包含格式编辑符和原样 输入字符 l 输入项必须为地址引用,通常 由“ 107 条件运算 说明: l 条件表达式中的表达式2和表达式3 应该有确定的值,二者通常为同类 型 l 条件运算符的结合方向是“自右至 左”的。 108 if语句 l if语句是用于选择结构的控制 语句,根据给定条件进行判断 ,以决定所要执行的操作。 109 单边形式if语句 形式: if(); 语义: l 先计算“表达式”的值,若结果为非0, 就执行“语句”,否则直接执行if语句的 后续语句 110 单边形式if语句 注意: l if是C语言的关键字 l “表达式”允许是任何表达式,其两侧的 圆括号不可少 l “语句”为if的执行块,如果其中包含多 个语句,必须用将其括成复合语句 111 双边形式if语句 形式: if();else 语义: l 先计算“表达式”的值,若结果为非 0,则执行“语句1”;若为0,则执 行“语句2”。 112 双边形式if语句 说明: l else必须与if语句配对使用 l else前面的语句必须用分号结束 l 虽然条件表达式和if语句都能构 成选择结构,但条件表达式不能 取代所有的if语句 113 if语句的嵌套 l 当if语句或else语句的执行块 中又出现if语句时,就形成了 if语句的嵌套。 114 if语句的嵌套 说明: l 在多层嵌套中,C语句规定,else 总是与前面最近的没有配过对的if 配对,与程序书写格式无关 115 switch语句 形式: switch() case :;break; case :;break; case :;break; default: ; switch语句示例 116 switch语句 语义: l先计算switch右边“表达式”的值,并将其逐 个与case行中的“常量表达式”的值相比较, 若相等,则执行该case行给出的语句,然后 跳出switch语句;若“表达式”的值不等于任 何case行给出的“常量表达式”的值,则转向 并执行default行指引的语句;若没有 default行,则直接跳出switch结构,转去 执行后续语句。 117 switch语句 说明: lswitch是关键字,其后面用括起来的 部分是其语句体 lcase也是关键字,其后跟的“常量表达 式”与冒号一起构成语句标号,case与“ 常量表达式”之间必须有空格 118 switch语句 说明: l在同一个switch语句中,“常量表达式” 的值必须唯一 lswitch后面的“表达式”可以是整型、字 符型和枚举型,但不能是实型,“表达式 ”的值与“常量表达式”的值应保持类型一 致 119 switch语句 说明: ldefault行可以出现在switch语句体的任 何位置,也可以省略 lcase标号后面跟的语句允许是多个语句, 可以不加语句括号 l一个语句也可以被多个case行共用 lbreak也是关键字,其可以中止switch语 句继续往下执行 120 应用举例 l 编写程序,从键盘输入1到7之间 的一个整数,要求:输入正确则输 出相应的星期名称,否则输出错误 提示。 121 第五章 循环结构程序设计 l 在C语言中,用于循环结构程序设计 的语句有:while语句、do-while语 句和for语句。 l 循环结构是结构化程序设计的三种 基本结构之一,它与顺序结构、选 择结构一起,构成各种复杂的程序 。 122 第五章 循环结构程序设计 l while语句 l do-while语句 l for语句 l 循环结构中的转移语句 l 循环结构的嵌套 l 应用举例 123 while语句 形式: while(); 124 while语句 语义: l 先计算圆括号中表达式的值,判断 其是否为0,若为非0,表示循环条 件满足,执行循环体,如此重复, 直至表达式的值为0,退出while循 环,执行后续语句。 125 while语句 k=4; while(k2)printf(“*”);k=k-1; printf(“k=%d”,k); 126 while语句 说明: l while是C关键字,圆括号内的“表 达式”可以是任意合法的表达式 l 循环体只包含一句语句 l 注意if语句和while语句的差别 l 循环体要有使循环结束的语句 127 while语句 实例: l 求正整数n的阶乘 l 用字符打印图形 128 do-while语句 形式: do ; while(); 129 do-while语句 语义: l 先执行循环体一次,然后判断表 达式是否成立,若为非0,表示 成立,就继续执行循环体,否则 结束循环,执行do-while语句的 后续语句。 130 do-while语句 int sum=0,i=1; do sum=sum+i;i+; while(i;) ; 134 for语句 语义: l先计算表达式1的值; l再计算表达式2的值,并判断其是否为 0,若为0,则跳出循环,执行for语句 的后续语句; l表达式2的值若为非0,则执行循环体 一次,再计算表达式3的值,转到步骤 2重复执行。 135 for语句 product=1 for(i=1;i5)break; printf(“y=%dn”,y); 实例: 判断一个整数是否为素数 141 循环结构中的转移语句 continue语句 l 形式:continue; l 该语句只能用在循环中,其功能是 结束本次循环,即跳过循环体中位 于continue语句后面的语句,转入 下一次循环条件的判断与执行,并 不结束循环。 142 循环结构的嵌套 l 当一个循环语句的循环体中又 出现另一个循环语句时,就构 成了循环的嵌套。 143 循环结构的嵌套 注意: l 内循环是外循环的循环体,外 循环每执行一遍,内循环就执 行一周 144 应用举例 l 求解百鸡问题 l 输出2到200之间的所有素数 l 求两个整数的最大公约数和最 小公倍数 145 第六章 数组 l C语言支持两种构造数据类型: 数组类型和结构类型 l 构造类型的数据可分解为多个元 素,其中每一个元素可以是基本 类型或又是一个构造类型。作为 构造类型的最低层元素只能是基 本类型 146 第六章 数组 l 数组概念的引入 l 数组的说明 l 数组的引用 l 数组的存储结构 l 数组的赋初值 l 数组应用举例 l 字符数组与字符串处理 147 数组概念的引入 l 数组是个多值变量,一个数组 变量由一组同名但不同下标的 元素构成 l 用数组来存储逻辑相关的数据 实体,程序可方便地按下标组 织循环 148 数组概念的引入 l 数组包含的所有元素都具有 相同名字和相同的数据类型 l 用数组名和元素在数组中的 序号可唯一地确定某个数组 元素 l 多维数组 149 数组的说明 形式: 例: int a5,b45; float x4; 150 数组的说明 l 数组说明的作用是为数组预留 空间 l 数据类型为数组的“基类型”, 整数表达式定义了数组中所含 元素的个数,运算符的个数 决定了数组的维数。 151 数组的说明 注意: l 在C语言中,数组元素的下标起 始值为0而不是1 l 下标运算符中的整数表达式代表 数组每一维的长度 l 下标运算符中不允许使用变量定 义数组长度,允许包含常量和 sizeof表达式 152 数组的说明 #define N 50 int a3+2; char cN; float dsizeof(double); double fsizeof(a); 153 数组的引用 形式: 其中:“下标1”、“下标2”等为整型 表达式,代表了该元素在内存中的 排列位置。 154 数组的引用 说明: l 引用下标变量时,所给出的下标 个数必须与所定义的数组维数相 一致,而且每一个下标表达式的 值不得超界 l 凡是数组基类型变量能使用的运 算,数组元素也能使用 155 数组的赋初值 形式: =; 156 数组的赋初值 float x4=-1.0,0.0,2.7,5.2E-8; int y32=0,1,2,3,4,5; int z32=0,1,2,3,4,5; char s5=H,e,l,l,o 或:char s5=“hello” 157 数组的赋初值 注意: l 对数组赋初值时,若初值表中常数 个数少于数组元素的个数,这表示 仅对数组中排列靠前的元素赋初值 ;若初值表中给定的初值多于下标 变量的个数,将出现编译错误 158 数组的赋初值 注意: l C语言允许使用一维数组赋初值的 方法对多维数组赋初值 l C语言允许在数组定义时不指定维 的长度,由初值表中初值的个数来 间接决定长度 159 数组的赋初值 float x=-1.0,0.0,2.7,5.2E-8; int y2=0,1,2,3,4,5; int z2=0,1,2,3,4,5; char s=“hello” 160 数组应用举例 l 阅读程序写出结果: l 冒泡排序(选择排序) l 打印杨辉三角形 数组应用 161 数组的存储结构 l 一维数组的存储结构 l 二维数组的存储结构 162 数组的存储结构 l 数组第一个元素的存储 地址就是整个数组的存 储首地址,该地址放在 数组名中 l 一维数组的存储结构 163 数组的存储结构 l 二维数组的存储结构为“按 行线性展开,顺序存放”, 即按: a00,a01,a02, a10,a11,a12, l 二维数组的存储结构 164 数组的存储结构 l 比较两组程序段: for i=0 to 3 for j=0 to 4 aij=i*10+j 和: for j=0 to 4 for i=0 to 3 aij=i*10+j 165 字符数组与字符串处理 l 在C语言中,没有标准的字符 串定义类型,字符串被当作字 符数组来处理。 166 字符数组的定义 形式: char 167 字符数组的定义 说明 l 字符数组中的元素只能存放一 个字符型数据 l 与普通数组一样,字符数组也 可以在定义时赋初值 168 字符数组的定义 char string100,cblock2020; string0=T;cblock25=h char chr5=C,h,i,n,a; line1100=“Shanghai”; line1100=”Shanghai”; 169 字符串的结束标记 l 为了便于识别一个字符串的 结尾,C语言约定,字符串 的末尾以转义字符0作为 结束标记。 170 字符串的输入与输出 使用scanf和printf函数输入与输出 Main() char str80; scnaf(“%s”,str); printf(“%s”,str); 171 字符串的输入与输出 注意: l用%s格式输入输出字符串时,输出 项应该为字符数组名,不能是数组 元素名 l数组名是个不占实际内存的地址常 量,它代表整个字符数组的存储首 地址,本身已经是地址,不能再对 它加地址运算符“ 其中,str_adr为字符数组名或字 符指针名,代表输入字符串的存储 起始地址。 174 字符串的输入与输出 功能: l 接受由键盘输入的字符串(包 括空格符),并将它原样存储 到由str_adr所指向的内存段 中,系统并不保存字符串末尾 的换行符,而是自动将0作为 字符串的内容存放在串尾。 175 字符串的输入与输出 使用gets和puts函数输入与输出: puts函数调用形式: puts(); 其中,str_adr为字符数组名或字 符指针名,代表输出字符串的存储 起始地址。 176 字符串的输入与输出 功能: l 由str_adr所指向的地址开 始,依次输出存储单元中的 字符,直到遇到第一个0 结束输出,并自动输出一个 回车换行。 177 字符串的输入与输出 注意: l gets和puts函数只能有一个输出 项和输入项 l gets函数不识别字符串中的转义 字符,它原样输入,而puts函数 能识别字符串中包含的转义字符 l 可以将二维字符数组看作一维字 符串数组 178 字符数组应用举例 l 由键盘输入长度不超过80的 字符串,再原样输出。 179 常用的字符串处理函数 l C语言没有提供对字符串进行 整体操作的运算符,但提供了 许多有关字符串处理的库函数 ,通过调用相应的库函数来实 现各种功能。 180 常用的字符串处理函数 strlen函数 l 形式:strlen(); l 功能:计算并返回字符串str的长 度(字符串结束标志不计入内) 181 常用的字符串处理函数 strcmp函数 l 形式: strcmp(,); l 功能:比较str1和str2两个字符 串的大小 l 注意:只比较结束标记前内容 182 常用的字符串处理函数 strcpy函数 l 形式:strcpy(,); l 功能:将字符串str2的内容连同结 束符0一起复制到str1中。 l 注意:str1必须有足够的长度以容 纳str2的内容。 l char str120,str2=”China”; l strcpy(str1,str2); 183 常用的字符串处理函数 strcat函数 l 形式:strcat(,); l 功能:将字符串str1与字符串str2尾 首相接,生成的新串存于str1中,函 数返回str1的首地址。 l 注意:str1必须有足够的长度以容纳 新增加的内容。 184 常用的字符串处理函数 strcat函数 main() char str180,str220; strcpy(str1,“Hello“); strcpy(str2,“ Tom“); strcat(str1,str2); printf(“%s“,str1); 185 字符数组应用举例 l 字符串的加密解密 l 编写程序,实现通讯录 查询功能 186 第七章 函数 l 函数的概念 l 函数的定义 l 函数的调用 l 函数的嵌套与递归 l 变量的作用域 l 变量的存储类别 187 函数的概念 l 将具有特定功能,或者被重复 多次使用的语句序列单独设计 成一个模块,这个模块就称为 函数。 l “模块化程序设计”方法。 188 实例分析 l 求组合的值: l 求杨辉三角形: 函数(一)函数(二) 189 实例分析 说明: l 一个C程序可以仅由一个main函数 组成,也可以由一个(只能一个 )main函数和一个或多个其他函 数组成 l 定义函数时出现的参数称为形式 参数,调用函数时出现的参数称 为实在参数 190 实例分析 说明: l 在C程序中,main函数能调用其他 一切函数,反之不行,其他函数 之间允许相互调用 l 函数可以分为两大类:标准函数 、自定义函数 191 函数的定义 l 形式: () 函数体 192 函数的定义 l 形式: () 193 函数的定义 参数: l 函数类型:代表该函数所返回的 值的类型,可以是int,float, char等标准的预定义类型,也可 以是用户自己定义的类型,也可 以是无值型void,若省略,将自 动赋予函数的类型为int 194 函数的定义 参数: l 函数名:用户标识符,命名规则 与变量名相同 195 函数的定义 参数: l 形式参数表:代表函数的自变量 ,可有可无,若无,一对圆括号 不能省略;各形式参数间用逗号 分隔,如果在圆括号中说明形式 参数的数据类型,则必须为每个 形式参数指定类型 196 函数的定义 参数: l 函数体:在一对花括号之间,是 实现函数功能的语句序列 197 函数的定义 说明: l 第一行函数头的句末不能加分号 l 函数要返回值,在函数体必须使 用return 语句实现, 其作用除了将函数值返回给调用 函数,并结束自身函数的运行 198 函数的定义 说明: l 通常要求所返回的函数值类型与 所定义的函数类型相一致,对于 数值型数据,系统将自动进行类 型转换 199 函数的调用 l 形式: () 200 函数的调用 说明: l 在实在参数列表中,参数与参数 之间用逗号分隔 l 若被调用的函数无参数,一对圆 括号不能省略 l 必须保证实在参数与形式参数个 数相同、类型一致、位置对应 201 函数的调用 函数调用方式 l 函数的调用出现在表达式中 l 以独立的函数语句调用 202 函数的调用 参数的传递 l “传值”调用 l “传地址”调用 函数传值调用 函数传地址调用 函数传地址调用 203 函数的调用 函数调用声明 l 自定义函数调用声明 l 库函数调用声明 204 函数调用声明 l 自定义函数调用声明 () l 或 () 函数调用声明 205 函数调用声明 l 库函数调用声明 #include l 或 #include “” 206 函数的嵌套与递归 l “嵌套”调用 l “递归”调用 求阶乘求最大公约数 排序 207 函数的嵌套与递归 注意: l 一个正确的递归函数必须保证递推 过程是有限制的 l 递归函数的主要优点是算法设计容 易,用于迭代、级数、链表等方面 的算法有特殊效果,但递归函数对 存储空间的使用非常大,时间效率 也偏低 208 变量的作用域 l 变量的作用域 l 局部变量 l 全局变量 两数交换 209 变量的存储类别 变量具有三大属性: l 类型:确定变量的存储 长度和运算方式 l 作用域:确定变量存在 的空间 l 存储类别:确定变量存 在的时间 210 变量的存储类别 TC支持四种存储类别: l auto(动态存储) l static(静态存储) l register(寄存器型存储) l extern(外部存储) 211 动态存储 l 动态存储的特点是指变量的 存储单元随函数的调用而取 得,随函数调用的结束而释 放。 212 动态存储 l 动态存储类别的声明形式: auto 数据类型 变量名列表; 213 动态存储 说明: l 在函数内部(包括主函数)定义的没 有经过特殊声明的一切局部变量(包 括形式参数)均为动态变量,它们自 动服从动态存储规则,并存储在称为“ 栈”的动态内存区域中 l 局部变量默认的存储类别为动态存储 l 引用一个从未被赋过值的动态变量, 其初值是不确定的 214 静态存储 l 静态存储的特点是在程序执行的 全过程中,变量始终占据着大小 固定的存储单元直至程序运行结 束才予以释放。 215 静态存储 l 静态存储类别的声明形式: static 数据类型 变量名列表; 216 静态存储 说明: l 函数调用结束后,变量的值需要 保存到下一次调用时使用,可以 使用静态存储类别 l 静态局部变量的生命周期与全局 变量相同,其作用域仍局限于说 明其自身的函数或复合语句内 217 静态存储 说明: l 静态局部变量若在定义时被赋初 值,它仅在程序开始执行时赋值 一次,以后调用时不再重新赋值 l 若定义静态变量时未指定初值, 则系统自动对算术型变量赋0值 ;对字符型变量赋空值;对指针 型变量赋NULL值 218 静态存储 说明: l 若对全局变量加上static说明, 该全局变量只能在自身定义的文 件中使用,其他程序无法引用或 修改它,若希望全局变量不受外 界程序和数据的影响,将其定义 为静态全局变量能直到良好的隐 藏作用 219 寄存器型存储 l 寄存器型存储就是将变量的存储 单元分配在CPU的寄存器中,而 不是常规的内存中。 l 由于数据直接从CPU中存取,因 此访问变量的时间初缩短,程序 运行的速度被加快。 220 寄存器型存储 l 寄存器型存储类别的声明形式: register 数据类型 变量名列表; 221 寄存器型存储 说明: l 一个计算机的寄存器数量是有限 的,而且通用寄存器都是16位的 ,所以寄存器型存储类别仅适用 于int型和char型,而且每个函数 只能定义极少量的寄存器变量 l 寄存器存储只能用于局部动态变 量和函数的形式参数 222 寄存器型存储 说明: l 不同的计算机系统允许使用的寄存 器变量数目不尽相同,通常,TC 允许一个函数中同时定义两个寄存 器变量 l 如果定义的寄存器变量数目超过系 统可以提供的数目,则C会自动将 超限的寄存器变量当作普通的动态 变量处理 223 外部存储 l 如果一个全局变量要被同一个 程序中的位于其前的函数引用 或被另一个源程序文件引用, 就必须在引用之前对该全局变 量作外部存储声明。 224 外部存储 l 外部存储类别的声明形式: extern 数据类型 变量名列表; 225 外部存储 说明: l 外部存储类别主要是为多文件 共享而设置的 226 第八章 编译预处理 l 所谓“编译预处理”是指对源程 序编译之前先调用C的预处理 程序对以“#”开头的命令行进 行解释、替换,产生一个新的 源程序,然后才对源程序进行 通常意义下的编译。 227 第八章 编译预处理 l 宏定义 l 文件包含处理 l 条件编译 l 应用举例 228 宏定义 l 无参数宏定义 l 有参数宏定义 l 宏调用 l 宏调用与函数调用的区别 229 无参数宏定义 l 所谓无参数宏定义是指用一 个指定的标识符来代表一个 字符串,该标识符也称为“宏 名”。预处理时,“宏名”被替 换成字符串,这一过程称为“ 宏展开”。 230 无参数宏定义 l 形式: #define l 例: #define N 50 #define PI 3.1415926 231 无参数宏定义 说明: l 宏名一般用大写字母表示 l 在宏展开时,系统不作任何正确性 检查,仅作原形替换 l #undef命令可用来终止宏定义的 作用范围 l 宏定义可以嵌套 232 无参数宏定义 说明: l 宏定义中的字符串不加引号,结束处不 加分号,若加了,系统将认为引号、分 号也是置换内容 l #define命令一般出现在源文件的开头处 233 有参数宏定义 l 有参数宏定义是指用一个带参数 表的宏名代表一个字符串,预处 理时不仅作字符串替换,还要进 行参数替换。 234 有参数宏定义 l 形式: #define () l 例: #define S(a,b) ab?a:b 235 有参数宏定义 说明: l 宏名与其右边的圆括号之间不能 有空格 l 当参数为表达式时,对参数表达 式加括号可防止二义性 有参数宏 236 有参数宏定义 说明: l 应尽量避免用自增变量作为宏替 换的实参 237 宏调用 求园面积 238 宏调用与函数调用的区别 l 在程序控制上,调用带参数宏 时,宏实参只是简单地对宏形 参进行原形替换;调用函数时 ,则是先求出实参表达式的值 ,再代入形参变量中 杨辉三角形有参数宏 239 宏调用与函数调用的区别 l 与函数的参数不同,宏参数没 有固定的数据类型,因此宏定 义时不涉及类型,宏名和宏参 数均无类型 240 宏调用与函数调用的区别 l 函数调用是在程序运行时发生 的,并动态分配所用的内存单 元;而宏调用是在编译预处理 时进行的,而且不分配内存单 元,不进行值传送,也无返回 值 241 宏调用与函数调用的区别 l 使用函数调用不增加运行程序 的长度,而每使用一次宏调用 ,都会使运行程序篇幅有所增 长,使编译、链接后的执行程 序也增长。 242 宏调用与函数调用的区别 l 宏定义主要用于需要少量参数 的简单表达式中,而且调用时 不作数据类型检查 l 使用函数不会给程序带来意想 不到的副作用,而宏则可能给 程序带来意想不到的副作用 243 文件包含处理 l 文件包含处理是指将另一个源 文件嵌入到当前文件中。 244 文件包含处理 l 形式: #include “文件名” l 或 #include 245 文件包含处理 说明 l 一个#include只能包含一个文件, 除了预定义的标准头文件外,还可 包含用户自己设计的文件 l 文件包含命令中的一对尖括号和一 对双引号是有区别的,编译系统会 使用不同的方法搜索包含文件 246 文件包含处理 说明 l C语言提供了若干标准函数库,每 个标准函数库都与某个预定义的头 文件相对应 l 允许使用嵌套包含 247 文件包含处理 说明 l 当用户文件由多个源程序文件组成 时,为了避免重复的说明和定义, 提高工作效率,提高程序的可靠性 和可维护性,可以把各个源文件共 同使用的函数类型说明以及符号常 量的宏定义等组建为单独的用户包 含文件 248 条件编译 l 条件编译预处理可以使源程序 有选择性地编译。 l 使用条件编译有利于程序的调 试,能增强程序的通用性,可 以将程序方便地定制成不同的 版本。 249 条件编译 l 形式1: #if #else #endif l 功能: 当表达式的值为非0时,编译语句1 ,否则编译语句段2 250 条件编译 l 形式2: #ifdef #else #endif l 功能: 当指定的宏名已经在#define预处 理行中被定义时,编译语句段1, 否则编译语句段2 251 条件编译 l 形式3: #ifndef #else #endif l 功能: 当指定的宏名未在#define预处理 行中被定义时,编译语句段1,否 则编译语句段2 252 条件编译 注意: l #if命令行中的表达式只能是常量 表达式 l #else命令行是任选的,若缺省, 条件不成立时直接跳出#endif命 令行 l 要使用嵌套条件编译,需要使用 #elif命令 253 第八章 指针 l 指针的概念 l 指针与数组 l 指针与函数 l 指针与字符串 l 多级指针 l 命令行参数 254 指针的概念 l 指针变量 l 当变量a存储了变量b的 地址,就称变量a指向了 变量b。 255 指针变量的定义 l 形式: *; 256 指针变量的定义 l 例: int m,n,*p1,*q4; double y,z,*p2= 257 指针变量的运算符 272 通过指针变量引用二维 数组元素 说明: lp是行指针,p+i、p+或p均表示指针移 动的单位为“行” lp只能指向二维数组中的行,而不能指向 一行中的某个元素 l指针名p与二维数组名虽然都代表“行指针” ,但p为变量,所以它可以被赋值,而二 维数组名为常量,不能被赋值 273 指针与函数 l 指针变量可以作为函数的参 数,当函数的参数为指针变 量时,函数就能方便地通过 形式参数将函数值带出函数 体反传给主调函数。 指针作为参数 274 指针与函数 l 指针变量作为函数的参数 l 应用举例: 1. 数据排序 2. 编写函数,在头指针为p的已 知数表的前n个表元中查找值 为key的那个元素 275 指针与函数 l 函数名虽然不是变量,但它与 数组名一样在内存中有确切的 物理地址,是个地址常量,函 数名存储了函数目标码的入口 地址。 276 指针与函数 l 可以定义一个指向函数的指针, 借助于该指针能使函数如同普通 变量一样被复制、存储,使函数 的通用性得以提高。 l 指向函数的指针变量称为“函数 指针”。 277 函数指针 l 形式: (*)(); l 其中,数据类型代表被指向函数 的类型。 278 函数指针 注意: l “*指针名”必须包含在一对圆括 号之中 l 指针名后面的一对空括号不能 漏写 279 函数指针 l 例: double (*f)(); 指针定义 280 通过函数指针调用其他函数 l 形式: (*)(); 函数指针 281 通过函数指针调用其他函数 注意: l 实参表所包含的实参个数、类型 必须与被指向的函数的形式参数 一致 l 调用之前函数指针必须已经指向 某个实际函数 282 指针与函数 l 函数指针应用举例: 求下列分段函数的函数值: 283 指针与函数 l 函数的返回值类型为 指针类型 l 链表 函数指针 284 指针与字符串 l 单个字符串的表示 l 多字符串的表示 字符串操作1 字符串排序 字符串操作2 字符串操作3 285 多级指针 l 多级指针就是“指向指针的 指针” 286 二级指针的定义 形式: * 例:int *p; 或:char x=%,*p= 287 二级指针与指针数组的联系 字符串数组 288 命令行参数 l 在C语言中,main函数与其他 函数一样可以带形式参数。 289 命令行参数 形式: main(int ,char *) 或者: main(int ,char *) 290
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年辅警招聘考试试题库及答案(全国)
- 2025年下半年嘉兴秀洲区文化馆招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年嘉兴平湖市委党校招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年嘉兴市海盐县住房和城乡规划建设局下属事业单位招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年吉林直事业单位招考第二批拟聘用人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年吉林白城师范学院专项招聘高校毕业生13人(2号)易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年合肥市肥东县实验幼儿园御景部教师招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年台州市交通工程试验检测中心招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年厦门海沧区东孚镇政府招考城管协管员(9人)易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年南京化学工业园区58名中小学新教师招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2025年入团考试知识总结试题及答案
- 2025年健康险行业分析报告及未来发展趋势预测
- 2025年合肥文旅博览集团招聘笔试参考题库含答案解析
- 山东省烟台市2024-2025学年高二上学期期中考试政治试题 含解析
- 新媒体技术与应用PPT全套完整教学课件
- 修井工程套管损坏的修复详解
- 基于超深亚微米工艺的E
- 返工返修流程及作业指导书
- GB/T 16857.12-2022产品几何技术规范(GPS)坐标测量系统(CMS)的验收检测和复检检测第12部分:关节臂式坐标测量机
- FZ/T 81013-2016宠物狗服装
- 梁场设计布置与施工全解课件
评论
0/150
提交评论