收藏 分享(赏)

C语言程序设计19454.doc

上传人:dzzj200808 文档编号:2702649 上传时间:2018-09-25 格式:DOC 页数:18 大小:3.50MB
下载 相关 举报
C语言程序设计19454.doc_第1页
第1页 / 共18页
C语言程序设计19454.doc_第2页
第2页 / 共18页
C语言程序设计19454.doc_第3页
第3页 / 共18页
C语言程序设计19454.doc_第4页
第4页 / 共18页
C语言程序设计19454.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、第 1 章 程序设计基础知识1.1 计算机的工作原理1.1.1 计算机的指令系统:一条指令由操作码和操作数两部分组成1.1.2 计算机的解题过程1.1.3 存储程序原理:把程序和数据输入设备送入内存,其次从第一条指令开始,一条一条地执行指令冯诺依曼(Von Nenmann) 1946 年提出的1.2 程序设计与程序设计1.2.1 计算机程序与程序语言计算机语言按使用方式和功能可分为低级语言和高级语言。低级语言包括机器语言和汇编语言。机器语言就是计算机指令的集合,它与计算机同时诞生,称为第一代计算机语言;汇编语言用符号来表示计算机指令,称为第二代计算机语言。第三代计算机语言高级语言。为了填补人机

2、之间的鸿沟,求助于“翻译”:编译方式和解释方式。编译方式:把源程序整个地翻译成用机器指令表示的目标程序;解释方式:逐句翻译,耗时相对编译方式多,但少占计算机内存。第三代语言要求人们告诉计算机怎么做(面向过程的语言)基础,第四代只要人们告诉计算机做什么(面向对象的语言)1.2.2 程序设计概念:用计算机语言对所要解决的问题中的数据以及处理问题的方法和步骤所做的完整而准确的描述过程。包括 4 个步骤:1 分析问题,建立数学模型 2 确定数据结构和算法 3 编制程序 4 调试程序。1.3 算法和算法的表示1.3.1 什么是算法 算法:解决问题的方法和步骤1.3.2 算法的基本特征(1)算法中执行的步

3、骤总是有限次数的,即有穷性(2)算法中每一步操作的内容和顺序必须含义确切,即确切性(3)算法中的每一步操作都应该能有效地执行,即有效性 (4)要有数据输入(5)要有结果输出1.4 用流程图表示算法 P9处理框(矩形框)有一出口,一个入口。判断框亦称为菱形框,有一个入口,两个出口。框内写上简明的文字或符号表示具体的操作,用带箭头的流程线表示操作的先后顺序。1.5 用结构化流程图表示算法1.5.1 什么是结构化程序:由三种基本结构组成的程序 意大利的 Bora 和 Jacopini1.5.2 三种基本结构: 顺序结构 选择结构 循环结构:当型(While)循环结构 ” 、单双引号“ ” 、双引号“

4、 ”、花括号“ ”和“ ” 、注释号“ /* ”和“ */ ”及空格等。6字面常量:是指在 C 程序运行过程中其值不变的量, 如:3.14159 100 A 张三“为了增加程序的可读性,可以用一个(字符序列)来代表一个常量符号常量(引用该常量的标识符) 字面常量包括:整型常量、浮点(实数)常量、字符型常量、字符串常量整型常量:十进制形式 234 -123 0 +321八进制形式 以数字 0 开头,如 041 -023 十六进制形式 以 0x 或 0X 开头,如 0x56 0XA36浮点型常量:float 单精度 4.653f -34.123F double 双精度 15.89 0.64E5lo

5、ng double 长双精度 6.7L -6.E+2L字符型常量:单引号括起来的 a 6 转义字符: ddd xhh 及表 2.1.1 常用转义字符字符串常量:双引号括起来的 how do you do! 双引号本身作为字符串中的字符时,应写成 “ 系统自动在末尾加一个字符0作为结束标志。 区别于字符型常量 二、数据类型 C 程序处理的任何数据必定属于某确定的类型。数据类型决定了数据的存储方式和运算规则。1C 的数据类型概述(见上表)2基本数据类型1) 整型: 整数以定点方式存储。整型常量的表示方法:十进制表示法:100 -4 八进制表示法:0100 -010 (以 0 开头) 十六进制表示法

6、:0xabc (以 0x 开头)整型变量的定义:int a,b; 保留字符 int 为整数类型说明符,上述语句定义了 a 和 b 是整型变量。在 VC 系统中整型变量占用 4 字节(在 Turbo C 中占用 2 字节) 。所以变量 a 的取值范围是-2 31231-1 可以在定义整型变量时加上关键字 short、long、unsigned 如:short int s; (可简写为 short s;) 变量 s 占用 2 字节 long int l; (可简写为 long l;) 变量 l 占用 4 字节 unsigned int u; 变量 u 不能取负数,其取值范围是:0232各种无符号整

7、型数据所占的内存大小与相应的有符号整型相同。整数类型数据在计算机内部通常用补码来表示。正整数的补码是二进制表示,负整数的补码是把相应正整数的二进制表示中个各个二进制取反后得到的整数加 1.整型数据所占位数与表示范围数据类型 所占位数 字节数 范围int 16 2 -215 215-1(-3276832767)short(int) 16 2 -215 215-1(-3276832767)long(int) 32 4 -231 231 - 1(-21474836482147483467)unsigned(int) 16 2 0 216-1(065535)unsigned short 16 2 0

8、216-1(065535)unsigned long 32 4 0 232 - 1(04294967295 )2) 实型(浮点型): 实数以浮点方式存储实型常量的表示方法:一般表示法 :3.14159 -28.0 指数表示法:2.3e5(相当于 230000.0) -1e-3(相当于-0.003)其中 2.3 称为尾数(有效位),e 或 E 为专用符号,5 称为指数,指数表示小数点位置,必须是整数。如:1.2e1.2 e2 都是错误的。实型变量的定义:float f1, f2; double d1, d2; long double ld1, ld2;变量 f1 占用 4 字节,其中 1 个字节

9、存储指数,3 个字节存储尾数。取值范围是 10-381038(2 -1272127) ,有效位数位 7 位(2 -23223) 。变量 d1 占用 8 字节,变量 ld1 占用 16 字节。3) 字符型字符数据存储的是字符的 ASCII 码,用一个字节存储。 字符常量的表示方法:一般字符:A 2 a, 其中单引号称为定界符 转义字符:n 101 ,为引导符字符型变量的定义:char c1, c2; 也可以将字符看作整数。signed char 值域为128127 unsigned char 值域为 02554)字符串:在 C 语言中,把字符串定义成字符数组。字符串常量:如ABC123 其中双引

10、号为字符串的定界符。A 为字符常量 10+A 正确 A为字符串常量 10+A 错误三、常量与变量 1. 常量包括了字面常量(无名常量) 符号常量(有名常量) 常量名用标识符表示由 const 或#define 定义 格式 1: const 类型名 常量名=值; 格式 2: #define 常量名 值使用符号常量的好处是:1 增强程序的可读性 2 方便程序的修改 3 提高程序对常量使用的一致性2. 变量 定义变量:明确指定变量的类型和名字(用标识符表示) 。语法格式: 数据类型 变量名 1,变量名 2,变量名 n;或 数据类型 变量名 1初值 1,变量名 2初值 2,变量名 n初值 n;变量定义

11、属于一种声明称为定义性声明。变量声明(仅限于全局变量)的另一种形式为extern 数据类型名 变量名;非定义性声明变量定义与声明的区别是:变量定义要给变量分配内存空间,变量声明则否;变量定义可以给变量赋初值(对变量进行初始化) ,变量声明则否变量赋初值:变量如果没有初始化,则变量置随机值。变量赋初值,也称变量初始化。变量命名方式:1 对于变量全部采用小写字母,若需要多个多个英文单词,常用下划线连接或第一个单词小写,以后的单词都以大写字母开头 2 对于符号常量,全部采用大写字母, 3 对于自定义的类型名(结构体类型或共用体类型)采用单词的第一个字母大写4、表达式 1. 表达式概念:数据的运算用表

12、达式表示。表达式:用运算符号及圆括号把运算对象连接起来的有意义的式子。运算对象:常量、变量、函数运算符号有:算术运算符、关系运算符、逻辑运算符等。运算符的使用注意以下几方面:1)不同的运算符要求的运算对象个数不同,运算对象的数据类型不同。 2)运算符号的优先顺序。3 运算符号的结合性。 具体见 P45 优先性:!逻辑非算术运算符 (* ? % + )关系运算符( = = = !=) 逻辑与 则表达式 (int)a*b 的值为 4, 而(int)(a*b) 的值为 5。注意点:1.运算符的优先级和结合性(! 逻辑非算术运算符(* ? % + )关系运算符( = = = !=) 逻辑与while(

13、循环语句); break(循环语句); continue(循环语句);(3)其他控制语句: goto(跳转语句); return(函数返回语句) 。2.函数调用语句:由函数调用加一个分号(语句结束标志)构成3.表达式语句:表达式 加一个分号构成 。区别 赋值表达式 和 赋值语句 4.空语句:仅由一分号构成。例如在循环语句中循环体可以使用空语句来充当,什么操作也不执行5.复合语句:由括起来的一组(1 条也可以)语句组成输入和输出函数1 格式控制的输入和输出函数1.格式输出函数 printf() 调用格式: printf(“格式控制字符串” ,表达式 1,表达式 2,表达式 n) ; 格式控制符由

14、:格式字符【 % 0 m.n l/h 】 ,转义字符,普通字符组成1整型格式控制符:十进制 八进制%o 或 %mo% lo 或 %mlo用于基本整型用于长整型十六进制% d 或 % md 用于基本整型%ld 或 %mld 长整型%u 或 %mu 无符号基本整型%lu 或 %mlu 无符号长整型 % x 或 % mx% lx 或 % mlx用于基本整型用于长整型说明:m 表示输出的整型数据所占总宽度(即列数) ,如果数据的位数小于 m,则左端补空格,如果数据的位数大于 m,则按实际位数输出。 若没有用 m 来说明数据所占的宽度,则以输出数据的实际位数为准。2浮点型格式控制符:小数形式 %m.nf

15、 或 %f 指数 %m.ne 或% e 普通形式 % g1 m 表示输出数据所占的总宽度,包括小数点占 1 列,n 表示小数点后面所占的位数。2 若在小数点后取 n 位后,所规定的数据宽度 m 不够输出数据前面的整数(包括小数点)则按实际位数输出。3 输出浮点型数据,若不指定输出数据总宽度 m 和小数位 n,则默认输出数据的全部整数部分和 6 位小数1 m.n 规定同左边2 默认的标准化形式:小数点前有且仅有一位非 0 数字加上小数位数 6 位,指数部分(包括 e 和+或)5 位1 系统根据数值的大小自动选用%f 或%e 格式中较短的一个显示。适用于不确定输出浮点数多大的情况。double 型

16、数据用 %lf 或%f 无差别2 用于输出单精度浮点型数据与双精度浮点型数据格式控制符一样。3 单精度浮点型变量存放数据时,能保证 67 位有效数字,而双精度浮点型变量能保证 1516 位有效数字。3字符型格式控制符: 格式: %c 或%mc m 表示输出的宽度4字符串格式控制符: 格式 1) %s 按紧凑格式输出字符串 2)%ms 输出的字符串占 m 列,若字符串突破 m 列,则按实际列数输出;若字符串列数小于 m,则右对齐左边补空格 3)-%ms 左对齐4)%m.ns 从字符串中左端开始截取 n 个字符,按 m 列输出。若 mn,则按则右对齐,左边补 0。 %-m.ns 相同,只是左对齐。

17、2.格式输入函数 scanf() 格式:scanf(“ 格式控制符字符串“,输入项地址表列) 表 scanf 格 式 字 符类型 格式字符 说明d 用来输入十进制整数o 用来输入八进制整数,输入数据时前面可不加数字 0x,X 用来输入十六进制整数,输入数据时前面可不加十六进制标识整型u 用来输入无符号十进制整数f 小数形式输入浮点数浮点型E, e 指数形式输入浮点数字符型 c 输入单个字符型, “%c%c%c”输入数据间无分隔符字符串 s 输入字符串,以非空格字符开始,以空格,回车结束表 scanf 的 附 加 格 式 字 符附加字符 说明lh 域宽 m*用于长整型数据(%ld %lo %lx

18、 %lu)以及 double 型数据(用%lf 或%le )用于短整型数据(%hd %ho %hx)指定输入数据所占宽度(列数)域宽为正整数表示本输入项在读入后不赋给相应的变量注意点:1)格式说明符 m 可以指定数据宽度,但不允许使用 .n 对于整型和字符型数据,当指定输入数据宽度(所占列数) ,系统将自动按宽度截取所需数据。2)输入 long int 型数据必须使用“%ld ”;输入 double 型数据必须用“%lf”或“%le ”3)附加格式符*使对应的输入数据不赋给相应变量4)在格式控制字符串中应谨慎使用普通字符,如果在格式字符串中使用普通字符,输入数据时应按原字符输入2.2 字符的输

19、入与输出函数1.字符输入函数:putchar()函数格式: putchar(ch); ch 可以是字符常量,变量或表达式,也可以是一个转义字符,也可以是整型变量,但不可以是字符串。给函数只能用于单个字符输出,且一次只能输出一个字符 2.字符输入函数:getchar()函数格式: getchar(ch); 用法类似 putchar,常用于 if 和 while 语句通常把 getchar( )放在赋值运算符= 右边,而=左边是个字符型变量顺序结构:按语句排列的顺序执行程序的选择结构 :通过给定条件(关系表达式或逻辑表达式)的判断来决定所要执行的程序1 关系表达式和关系运算符1.1 关系运算符:

20、= max) max=ai;if (aiaj+1) t=aj; aj=aj+1; aj+1=t; printf(“The sorted numbers:n“);for (i=0; i# include # include void main( ) int i, j, a55, temp;srand(time(NULL);for (i=0; i第 2 项,函数值为正整数;第 1 项void main( )char a6;scanf(“%s“,a);printf(“%s“,a);1 用%s 格式符时,要求 scanf 函数中的输入项和 printf 函数中的输出项是数组名,不能是其他形式。例如:s

21、canf(“%s“, scanf(“%s“, printf(“%s“,a0)都是错误的2 %s 格式符有两个特点:第一,接收字符串时,遇到空格或回车就认为输入结束,后面的数据不在接收;第二在接收进来的字符串最后自动填加一个0。所以应避免用这种方式来接收含空格的字符串第 6 章 函数函数是程序的基本单元。程序由主函数(main)和若干个其它函数构成。程序从主函数开始执行( 主函数被系统调用), 通过主函数调用其它函数。1.函数的概念:函数就是组合在一起的一系列语句,可以通过一个名字调用它。函数包括:标准库函数(系统已经定义了函数的名字、参数、返回值类型及函数功能,用户可直接调用)和用户自定义函数

22、(由用户自己定义。通过函数定义,确定函数的名字、参数和功能)1.1 标准库函数与头文件:ANSIC 系统将所有库函数的函数原型分成多组,通常每组放在一个头文件(*.h)stdio.h: 输入/输出库函数 math.h: 数学库函数 string.h: 字符串处理函数 time.h: 时间及日期操作函数stdlib.h: 随机函数、内存分配、数值与文本之间转换及其它实用函数 ctype.h: 测试字符某种属性1.2 rand( )标准库函数 rand( )能产生 0RAND_MAX 之间伪随机整数PC: RAND_MAX=32767 UNIX 工作站:RAND_MAX=2147483647产 生

23、 m 到 m+n-1 的 随 机 数 rand( )可产生0, 32767 之间的伪随机整数。 rand( )%n 可产生0, n-1之间的伪随机整数, rand( )%n+m 可产生m, m+n-1之间的伪随机整数 0rand( )327670rand( )/32767.010rand( )/32767.0*(n-1)n-1mrand( )/32767.0*(n-1)+m m+n-12. 函数定义、声明、调用2.1 函数定义 函数必须先定义才可以调用,所谓定义函数就是编写用于实现该函数功能的程序块。函数定义的一般形式为:函数类型 函数名( 类型名 形参 1,类型名 形参2) /函数首部 (注

24、意没有分号)声明部分语句部分 /函数体(1)函数定义的第一行称为函数首部或函数头,它为编译器指定了该函数的函数类型,函数的名字和它的参数列表。方括号内的部分是可选项(2)小括号内的形参相当于在函数中定义的变量,若有多个它们之间必须用逗号隔开,没有形参,( )也不能省略。形参类型可以是基本类型,指针类型和构造类型。(3)函数类型是指函数返回值的数据类型,返回值通过函数体的 return 语句带回,其形式:return 表达式;若定义的函数没有返回值,则应选用 void 作为函数名前的函数类型,并且函数体中最后语句的return;一般省略例 编写屏幕上显示 8 行:*“(无返回值示例)void p

25、rintstar( ) / /函数名为 printstar,无返回值,无参数 int i; for(i=1;i0;n-) f*=n;return f; 以 f 中的值作为返回值 P140的源文件的开始处利用文件包含命令#include 将相应的头文件(*.h)包括进来,通常调用标准库函数均采用这一种方法。2.3 函数调用 调用函数的形式:p143表达式调用 c=2*sqrt(29.31);作为函数参数 m=min(a, min(b, c)通过调用语句 printf(“Programming is fun“); scanf(“%dn“, 3. 函数间参数传递和返回值3.1 函数参数形式参数:函数

26、定义时的参数表,形式参数只是一个符号,并没有表示具体的数据,函数被调用时才为形式参数安排存储空间。实际参数:函数调用时的参数表,可以是常量、变量或表达式。实际参数如果是变量,可以和形式参数同名。即使实际参数和形式参数同名,它们仍是不同的变量,具有各自的存储空间。函数参数值传递:调用函数时,系统把实际参数的值赋给对应位置上的形式参数。在函数中对形式参数的修改,并不影响实际参数的内容。如果实际参数为表达式,先计算表达式的值,然后赋给相应形式参数。在 C 语言中数据是“按值”单向传递的,即数据只能从实参单向传递给形参,形参值的改变不会反向影响对应实参的值。3.2 函数的返回值函数的调用结果可以获得一

27、个值,该值由 return 语句返回。 return 语句带回函数值并结束函数调用, 返回到主调程序。返回值的类型最好以函数类型为准。P148有时调用函数并不需要返回值(函数只是完成了某操作), 可以把函数定义为无类型函数(类型为:void)。无类型函数的 return 语句不能带表达式, 该语句可省略。函数定义时缺省“类型标识符” ,则默认为 int 。例 1 打印输出 50 个随机数,每个占 8 列宽,每行输出 6个# include # include void main( ) for (int i=1; i# include void main( )unsigned seed;prin

28、tf(“input seed: “); scanf(“%u“, srand(seed);for (int i=1; i# include # include void main( )srand(time(NULL);for (int i=1; ivoid main( )例 5 P145例 6 P149 寻找 119999 之间的正整数m, 它满足 m、m2、m3 均为回文数。int symm(int n) int i, g, i=n;例 7 通过函数嵌套调用, 求两个正整数 m,n 的最小公倍数。int sct(int a, int b);int gcd(int a, int b);void

29、main( ) int i,n; long sum=0;long fac(int n);printf(“enter n:“);scanf(“%d,for(i=1;i0;n-) f*=n;return f; new_num=0; while (i!=0) g=i%10; new_num=new_num*10+g; i/=10; return (new_num=n);void main( ) for (int m=11; m float PI=3.1415926;void main( )float area(float r); float volume(float r);float r;print

30、f(“请输入球的半径 r:“);scanf(“%f“, printf(“球体的表面积 s= %ft“, area(r);printf(“球体体积 v= %fn“, volume(r); /file2.cppextern float PI; float area(float r) return 4.0*PI*r*r;float volume(float r) return 4.0/3*PI*r*r*r; 对于多文件程序的运行,方法是:新建一个工程,在该工程内分别建立两个或多个文件,编译时,由于编译器是以文件为单位工作的,所有,须对每个文件分别进行编译,编译后单击工具栏中的!按钮运行该文件即可。3

31、.用 static 限定全局变量的作用范围,使它只能被本文件中的函数引用static 数据类型名 变量名表;6.6 外部函数和内部函数C 程序由多个函数构成,多个函数可放在一个文件中,也可放在多个文件中。如果没有特别说明,一个函数可以被程序的其他函数调用。调用其它文件的函数必须进行函数声明。如果某函数不允许被其他文件的函数调用,可把该函数定义为内部函数,即只允许本文件内部其他函数调用的函数。内部函数的定义格式为:static 类型说明符 函数名 (参数列表 )函数体外部函数的定义格式为:extern 类型说明符 函数名 ( 参数列表)函数体第 7 章 编译预处理以“#”号开头的命令,如文件包含

32、命令# include、宏定义命令# define 等,称为预处理命令。预处理命令不是 C 语言本身的组成部分,不能被编译程序所识别,必须在编译之前先由专门的预处理程序进行转换。预处理命令一律以“#”号打头,以“回车”而不是分号结束。提供的预处理功能主要有以下三种:宏定义 文件包含 条件编译 这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般语句相区别,这些命令以符号“”开头。7.1 宏 定 义:宏提供了一种文本替换机制,用预处理命令#define 定义宏,宏定义具有不带参数和带参数两类,不带参数的宏定义实现简单文本替换,带参数的宏定义具有类似函数的功能。1不带参数的宏(常

33、量定义) # define 标识符 字符序列“标识符“为宏名, “字符序列 ”为宏内容。预处理时,用宏内容替代宏名,这一过程为宏扩展或宏替换注意:(1)宏定义只能以“回车”结束,预处理程序将宏定义中从宏名之后的第一个非空白字符开始到换行符之前的所有字符作为替换文本。 (2)如果宏定义超过一行,可以在该行行末加一个反斜杆“来续行。 (3)如果在字符常量,字符串和注释中出现宏名,则不做扩展。 (4)允许嵌套使用宏(5)宏不是变量,不分配内存空间,因此不能当作一个变量使用。不带参数的宏也被称为符号常量。为了便于与变量名及其他标识符相区分,习惯上将宏名写成大写(6)宏定义中可以没有替换文本2带参数的宏

34、(类似于函数) # define 标识符(参数表) 字符序列其中,参数表是一系列由逗号分隔的标识符,标识符和括号之间不能有空格,否则括号及参数表都将作为替换文本的一部分。函数和带参数的宏(类函数宏)的异同点(1)为了保证宏展开后表达式运算的正确性,有时需要对形式参数加括号或对整个替换文本加括号(2)函数调用时候,要求实参和形参的数据类型一致,如果不一致,系统自动把实参转换为形参的类型,而宏扩展则不存在类型问题。(3)函数调用是在程序运行处理时,为局部变量分配储存单元,而带参数宏的扩展是在编译前进行的,只作纯文本替换,不需要分配内存单元,不进行数据传递。使用函数调用会增加程序运行的时间开销,而使

35、用宏扩展不会,使用宏扩展会增加程序目标代码的长度,而使用函数调用不会。宏调用存在危险,因为宏调用不进行类型检测,可能由于形参和实参类型不匹配而产生难以预料的后果。例:比较下面的 MAX 宏和 max( )函数。# define MAX(x,y) (x)(y)?(x):(y) /宏定义int max(int x, int y) return xy?x:y; /函数定义void main( ) int a=10, b=6; double x=3.14, y=31.5;printf(“%dn“, MAX(a, b);printf(“%fn“, MAX(x, y);printf(“%dn“, max(

36、a, b);printf(“%dn“, max(x, y); 运行结果:10 31.500000 10 31比较下面的宏扩展和函数调用 P179#include #define CUBE(x)(x)*(x)*(x)int cube(int x)return x*x*x;void main() int a=2,b;b=CUBE(a+); printf(“%dn“,b);b=CUBE(a); printf(“%dn“,b);a=2; b=cube(a+); printf(“%dn“,b);b=cube(a); printf(“%dn“,b);运行结果 8 125 8 27 3 # undef 预处

37、理命令使用# undef 命令来取消原有的宏定义。# undef 命令的一般形式为: # undef 宏名例:#define p for(i=1;i 或 # include “文件名“其中文件名必须是一个完整的文件名(扩展名不可省略), 可以包含路径,例如: # include “c:mydirprog.cpp“文件名用“ “和用的区别:如果被包含文件没有指定路径,使用“文件名”时,系统首先到工程所在目录(用户文件夹)查找被包含文件,如果没有找到,接着到 C:Program FilesMicrosoft Visual StudioVC98Include 目录查找;而使用 时, 系统直接到 C:

38、Program FilesMicrosoft Visual StudioVC98Include 目录查找被包含文件。编译时候,源文件和被包含文件并不是作为独立的文件编译后再连接起来的,而是作为一个文件整体进行编译的,得到一个目标文件(.obj)。因此被包含的文件应当是源文件而不能是编译过目标文件。文件包含可以嵌套,标准 c 要求编译器至少能支持 8 层嵌套包含,不过为程序可读性,应避免使用。7.4 多文件组织 对于一个大的程序,通常分成多个源文件存储。每个源文件包含一个或多个函数。某源文件中定义的变量或函数能否被其它源文件中的函数访问,取决于连接属性。两种连接属性:内部连接 外部连接1 内部连

39、接:也称为静态连接,如果一个标识符(全局变量或函数)具有内部连接属性,那么它只能被文本中的函数调用。这样的标识符称为文件级标识符。定义一个标识符的内部连接属性的方法是在标识符前面用关键字 static 修饰,即 static 标识符 使用内部连接属性的函数或全局变量,可以限定它们的作用域,同时使得相同的名字可以在不同的文件中重新定义,互不干扰。2 外部连接 具有外部连接属性的标识符可以在其他方法中经过其他文件中经过声明后被访问。外部连接属性定义: extern 标识符外部连接属性是 C 语言默认的属性,具有外部连接性的标识符是程序级的,即在程序的任何文件中都可调用它。调用另一个文件的具有外部连

40、接属性的全局变量或函数,需要在调用之前进行声明,通常将具有外部性连接属性的全局标识符的声明合并写在一个头文件中,需要调用这些标识符的文件利用#include 命令包含该头文件,第九章 结构体、共同体、枚举类型9.1 结构体 有时需要将不同类型的数据组合成一个有机的整体,以便于引用。1. 结构体定义:把互相联系的但数据类型不相同的数据作为一个整体来处理,这种数据类型就是结构体(structure)类型,简称结构体。显然结构体类型属构造类型。结构体类型定义格式:struct 结构体名 数据类型 1 成员项 1;数据类型 2 成员项 2; 数据类型 n 成员项 n; ; 2. 结构体变量定义(1)先

41、定义结构体类型再定义变量 在 C+中,类型名前的 struct 可省略。在一个语句中可以同时定义几个相同结构的变量,结构体变量名以逗号分隔开。在定义了结构体变量后,系统会为之分配内存单元。结构体变量所占用的存储空间为各成员存储空间的总和。(2)在定义结构类型的同时定义变量 struct 结构体名 成员表列 变量名表列; 例 struct studentint num; char name20;char sex; int age; float score;char addr30; student1, student2;(3) 直接定义结构体类型变量 其一般形式为: struct 成员表列 变量名

42、表列; 即不出现结构体名3. 结构体变量的引用 引用结构体变量中成员的方式为: 结构体变量名.成员名例如 student1.num 表示 student1 变量中的 num 成员, 即 student1 的 num(学号)项可以对变量的成员赋值: 例如: student1.num=10010;(初始化)“.”是成员(分量)运算符, 它在所有的运算符中优先级最高4. 结构体的初始化 在定义结构变量的同时,可以给它的成员项赋初值struct 结构体类型 结构体变量= 初始化数据 ;5. 结构体数组具有相同数据类型的一组数据可以构成数组, 如果有 n 个相同结构的结构体变量, 也可以组成数组, 这就

43、是结构体数组。结构体数组的每个元素都是结构体类型的数据。(1) 结构体数组的定义格式 struct 结构体名 结构体数组名 整常量表达式;结构体数组的数组名表示该结构体数组的首地址, 其各个元素在内存中连续存放。(2) 结构体数组的初始化格式 struct 结构体类型 结构体数组名 整常量表达式初始化数据表;9.2 共同体1. 共用体的概念 使几个不同的变量共占同一段内存的结构称为 “共用体”类型的结构。共用体类型的定义、共用体变量的定义、共用体成员的引用形式和结构体对应相同。共用体与结构体的区别:共用体变量中所有成员共用一个存储单元,应用共用体的主要目的是节省存储空间 2. 共同体类型定义u

44、nion 共同体名数据类型 1 成员项 1; 数据类型 2 成员项 2;数据类型 n 成员项 n;3. 共用体变量的初始化 union 共同体类型名 共同体变量=初始值;9.3 枚举类型 将变量的值一一列举出来,变量的值只限于列举出来的值的范围内枚举类型定义: enum 枚举类型名 枚举元素表;例如 enum weekday sun,mon,tue,wed,thu,fri,sat ; 定义枚举变量 enum 枚举类型名 枚举变量列表;例如,enum weekday workday, week-day; enum sun, mon, tue, wed, thu, fri, sat workday

45、;枚举变量初始化 可以用枚举元素或整数对枚举变量初始化。 9.4 typedef 语句 用 typedef 声明新的类型名来代替已有的类型名。声明 INTEGER 为整型 typedef int INTEGER;声明结构类型 typedef struct int month;int day;int year; DATE;typedef 与#define 有相似之处。 例如 typedef int COUNT;和 #define COUNT int作用都是用 COUNT 代表 int。但事实上,它们二者是不同的。#define 是在预编译时处理的, 它只能作简单的字符串替换, 而 typedef

46、 是在编译时处理的。实际上它 并不是作简单的字符串替换,而是采用如同定义变量的方法那样来声明一个类型。(1)用 typedef 可以声明各种类型名,但不能用来定义变量。(2) 用 typedef 只是对已经存在的类型增加一个类型, 而没有创造新的类型。 (3) 当不同源文件中用到同一类型数据时,常用 typedef 声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include 命令把它们包含进来。(4) 使用 typedef 有利于程序的通用与移植。声明 NUM 为整型数组类型 :typedef int NUM100;声明 string 为字符指针类型: typed

47、ef char *string;声明 POINTER 为指向函数的指针类型 , 该函数返回整型值 : typedef int (*POINTER)( )第十章 指针 10.1 地址与指针变量一、相关概念存储单元的地址:微机以字节为存储单元 ,每个字节有唯一地址变量地址:一个变量占用若干个存储单元(int 4 字节,char 1 字节), 变量地址为变量占用空间的首字节地址变量的值:变量对应存储空间所存储的数据。直接访问:通过变量名访问变量中的数据 间接访问:二、指针变量的定义、引用和初始化指针:变量地址的别称。 指针变量:存储指针(其他变量的地址) 的变量。1 指针变量的定义形式为: 基类型 * 指针变量名;例 int var=10; int * pointer=变量的地址是在程序编译时由系统分配的,变量地址一经分配就不能改变,因此变量地址是一个常量。变量地址可由运算符“当定义了一个指针变量而没有初始化,指针变量的值没有确定,即该指针不指向特定的变量。可以把指针变量初始化为 0,即不指向任何变量。例 int*pointer=0; 或 int *pointer=NULL;标识符 NULL 是系统定义的宏,在头文件 stdio.h 中定义,即宏定义为#define NULL

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报