《C语言第一到十四章B.ppt》由会员分享,可在线阅读,更多相关《C语言第一到十四章B.ppt(100页珍藏版)》请在三一办公上搜索。
1、C 程序设计语言 回顾软件工程 07级2007年12月5日,第1章 C语言概述,计算机科学:信息在计算机内使用数据来表示,研究信息表示 和信息处理。,数据:是用以描述客观事物的数值、字符,以及一切可以输入到 计算机中并由计算机程序加以处理的符号的集合。数据的基本单位称为数据元素 数据的最小单位称为数据项,问题 数学模型 算法 程序 测试 计算,计算机解题过程,程序设计语言,高级语言程序调试过程,C语言特点 1、语言简洁、紧凑,使用方便灵活 2、运算符丰富 3、数据结构丰富,具有现代化语言的各总数据结构 4、具有结构化的控制语句 5、语法限制不太严格,程序设计自由度大 6、C语言允许直接访问物理
2、地址,能进行位操作 可实现汇编语言的大部分功能 7、生成目标代码的质量高,程序执行效率高 8、程序可执行性好,C语言程序结构C程序是由函数构成的。一个C源程序至少包含一个主函数(main或主程序)和若干个其它函数(子函数或子程序)一个函数由两部分程序组成:说明部分和函数体一个C程序总是从main函数开始执行,不论main函数放在程序中的什么位置。程序的流程是通过主函数main调用其它子函数,或子函数间的相互调用C程序书写格式自由,一行内可以写多条语句,但每一语句必须用分号(“;”)结束C语言本身没有输入/输出语句,而是用函数完成相应操作可以用/*,*/在程序的任何部分做注释,算法(Algori
3、thm)是对特定问题求解步骤的一种描述,它是指令(规则)的 有限序列,其中每一条指令表示一个或多个操作。,“好”的算法的标准 正确性,算法能满足具体问题的需求 可读性,首先方便阅读与交流,其次才是机器执行 健壮性,输入错误时,能作出反应,避免异常出错 效率与低存储量要求,算法的特征 有穷性、确定性、输入、输出、有效性,第2章 算法 Algorithm,对算法“正确性”的要求 不含语法错误;对于几组输入数据能得到满足要求的结果;对精心选择苛刻并带有刁难的数据能得到满足要求的结果;对于一切合法的输入均得到满足要求的结果;,算法描述 自然语言;程序设计语言;类语言*;流程图,N.Wirth:Prog
4、ramming=Algorithm+Data Structure 程序设计=算法+数据结构,问题总是先于算法,程序设计的四个里程碑 子程序、高级语言、结构程序设计、面向对象(OOP),结构程序设计 限制使用GO TO语句(基于三种基本结构)逐步求精的设计方法 自顶向下的设计、编码与调试 主程序员组的组织形式,三种基本结构,顺序结构,选择结构,循环结构,常量,符号常量,#define PRICE 30#define PI 3.1415926#define MAX 1000,Total=num*PRICE;Area=PI*R*R;Int xMAX;,变量,变量名 变量名命名规则变量是有类型的,数据
5、类型:变量的取值范围和所允许操作的集合,第3章 数据类型、运算符与表达式,变量的存储类型 变量的数据类型 变量名,变量说明:先定义,后引用,标识符命名规则,intfloatcharPointer to arraystruct,autostaticregisterextern,变量的:有效范围作用时间,变量的:取值范围操作,数据类型,注意:每种类型数据的取值范围Int:-2bits-1(2bits-1-1)Unsigned:0(2bits-1)Float:10-38 1038Double:10-308 10308,运算符,0、赋值运算:=1、算术运算符:+*/%2、关系运算符:=-|&5、赋值运
6、算符:=+=*=/=6、条件运算符:?:7、逗号运算符:,8、指针运算符:*&9、求字节数运算符:sizeof10、强制类型转换:(类型)11、分量运算符:.-12、下标运算符:13、其他:(),优先级类型转换,表达式,算术表达式:算术运算符关系表达式:关系运算符逻辑表达式;逻辑运算符赋值表达式:变量=表达式逗号表达式:表达式1,表达式2,表达式n条件表达式:表达式1?表达式2:表达式3,混合运算,第4章 最简单的C程序设计顺序程序设计,C语句,1、控制语句 if()else for()while()dowhile()continue break switch goto return,2、函数
7、调用,3、表达式语句,4、空语句,5、复合语句,赋值语句,输入/输出语句综述,输入:从键盘或文件键入或读入数据,并将数据赋给程序中的变量。,输出:将程序中变量的值显示在显示器上,或写入到文件中,或在打印机上打印。,C语言中的输入/输出,1、字符输入/输出 putchar(chr)chr=getchar(),文件的字符输入/输出 fputc(chr,fp)chr=fgetc(fp),2、字符串输入/输出 puts(str)gets(str),文件的字符串输入/输出 fputs(strr,fp)fgets(str,n,fp),3、格式输入/输出 printf(格式控制,输出表列)scanf(格式控
8、制,地址表列),文件的格式输入/输出 fprintf(文件变量,格式控制,输出表列)fscanf(文件变量,格式控制,地址表列),Printf(“Format”,表达式1,表达式2,),Scanf(“Format”,&变量名1,&变量名2,),格式控制(Format),整 形 int%d%-nd%-m.nd实 型 float%f%-m.nf字符型 char%c%-nc字符串 char c1MAX%s%-ns,4、块数据的输入/输出 fread(buffer,size,count,fp)fwrite(buffer,size,count,fp),Char str20;sprintf(str,格式控
9、制,变量列表);,Turbo C 函数,系统自动打开和关闭三个标准文件,标准输入-键盘 stdin,标准输出-显示器 stdout,标准出错输出-显示器 stderr,fpringtf(stdout,“x=%d,y=%fn”,x,y);,pringtf(“x=%d,y=%fn”,x,y);,第5章 选择结构程序设计,算术运算 关系运算 逻辑运算,逻辑常量,例:,a&b&ca|b|c当a=1,b=2,c=3,d=4时(m=ab)&(n=cd)执行后m、n=?(m=ad)执行后m、n=?,真值表,条件语句:,三种格式:if()if()else else if条件表达式:表达式1?表达式2:表达式3
10、条件运算:变量=表达式1?表达式2:表达式3Switch,第6章 循环控制,循环类型:“当”型“直到”型 计数,while()dowhile()for(表达式1;表达式2;表达式3)Break:结束循环Continue:结束本次循环,进入下一次循环,用流程图表示各种循环结构,第7章 数 组,一维数组二维数组,数组下标变量,维数,数组名 数组类型 元素个数 下标范围,先定义后使用原则数组的内存存储结构,数组长度,初始化,数组与指针,地址常量,相同类型元素组成的集合,概述函数分类函数结构函数的参数和函数的值函数的调用被调用函数的声明和函数原型函数的嵌套调用函数的递归调用函数与数组存储类型函数的指针
11、和指向函数的指针变量简介指针数组与主函数main()的形参,第 8章 函数,C程序是由函数构成的!,函数分类1:定义的角度看,函数可分为 库函数和用户定义函数,函数分类,函数分类2:从调用角度,可分为 有返回值函数和无返回值函数,函数分类3:参数传递角度,可分为 无参函数和有参函数,函数分类4:从功能角度,可分为:,字符串、转换、目录路径、诊断图形I/O函数、接口、内存管理、日期和时间、数学、进程等,存储类型 返值类型 函数名(形式参数表列)声明部分(局部变量说明)语句部分(完成函数的功能)exit(0)return;/return();/return()/return,函数的结构,autos
12、taticregisterextern,Int,float,charPointer to Structvoid,类型变量指针数组结构体函数,存储类型 返值类型 函数名(形式参数表列),标识符命名规则,intfloatcharpointerarrayStructvoid,autostaticregisterextern,变量的:有效范围作用时间,变量的:取值范围操作,类型变量 指针变量 数组 结构体 函数,函数的调用,函数调用的一般形式 函数名(实际参数表);,函数表达式 例如:z=max(x,y)函数语句 例如:printf(%d,a);scanf(%d,常量 表达式 数组元素 类型变量 指针
13、变量 数组 结构体 函数,被调用函数的声明和函数原型,其一般形式为:类型说明符 被调函数名(类型 形参,类型 形参);或为:类型说明符 被调函数名(类型,类型);原则:先声明,后使用,函数的嵌套调用,函数的递归调用,直接递归和间接递归,关于函数的处理结果:,无数据返回单值返回多值返回批量数据返回,调用函数被调用函数,结果,数组作为函数参数,数组元素作为函数实在参数,形参为变量 数组名作为函数参数(指针),形参为指针,但应同 时传送数组的长度,例:float average(float array10,int n)float average(float array,int n)float ave
14、rage(float*array,int n),指针变量作为函数参数,存储类型,变量的数据类型:变量的取值范围和允许的操作,变量的存储类型:变量的有效时间和作用范围,变量的存在时间(1)全局变量(global varible)定义在所有函数体之外的变量。定义位置:在程序中所有函数体之外;有效范围:在定义开始之后的所有函数中;使用要求:不能与局部变量重名;存在时间:从程序开始到程序结束。,(2)局部变量(local varible)定义在所函数体内的变量。定义位置:在某一函数体内定义;有效范围:只在定义变量的函数中有效;存在时间:函数调用时产生,函数结束后消失 使用特点:局部变量的存在时间决定了
15、不同函数中的局部变量 是互不干涉的,即使同名,也完全相互独立。,(3)外部变量(Extern varible),变量的存储类型:auto static register extern,1、自动存储类型(auto)2、寄存器存储类型(register)3、静态存储类型(static)4、外部存储类型(extern),存储变量的特征,从作用于角度,分为局部变量和全局变量。,变量的作用域 存在时间 动态存储 静态存储,关于作用域和生存期的概念:从前面叙述可以知道,对一个变量的性质可以从两个方面分析,一是从变量的作用域,一是从变量值存在时间的长短,即生存期。作用域:空间的角度生存期:时间的角度 如果一
16、个变量在某个文件或函数范围内是有效的,则称该文件或函数为该变量的作用域,在此作用域内可以引用该变量,所以又称变量在此作用域内“可见”,这种性质又称为变量的“可见性”。如果一个变量值i在某一时刻是存在的,则认为这一时刻属于该变量的“生存期”,或称该变量在此时刻“存在”。,内部函数与外部函数,内部函数:一个函数只能被定义它的文件内的其它函数调用。定义函数时加 static static 类型说明 函数名(形参表),外部函数:一个函数可以被其它文件内的函数调用。定义函数时加 extern extern 类型说明 函数名(形参表),函数定义的完整格式:存储类型 返回值数据类型 函数名(形参表),使用内
17、部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。,函数的指针和指向函数的指针变量简介,1、函数指针的概念 一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。2、指向函数的指针变量(1)定义格式 函数返值类型(*指针变量)();注意:“*指针变量”外的括号不能缺,否则成了返回指针值的函数。例如,int(*fp)();/*fp为指向int函数的指针变量*/(2)赋值 函数名代表该函数的入口地址。可用函数名给指向函数的指针变量赋值。指向函数的指针变量 注
18、意:函数名后不能带括号和参数;函数名前的“&”符号是可选的。(3)调用格式(*函数指针变量)(实参表)3、指向函数的指针变量作函数参数 指向函数的指针变量的常用用途之一,就是将函数指针作参数,传递到其它函 数。函数名作实参时,因为要缺省括号和参数,造成编译器无法判断它是一个 变量还是一个函数,函数说明的格式与其他函数一样。注意:对指向函数的指针变量,诸如p+i、p+/p-等运算是没有意义的。,第 9章 指针,指针的概念变量的指针和指向变量的指针变量数组的指针和指向数组的指针变量字符串的指针和指向字符串的指针变量函数的指针和指向函数的指针变量返回指针值的函数指针数组和指向指针的指针指针型数据小结
19、,指针的概念,指针就是地址。有变量的、数组的、函数的、字符串的指针等。1、内存的访问方式 1)直接访问 2)间接访问,2、指针的概念 一个变量的地址称为该变量的“指针”。存放地址的变量叫“指针变量”。换句话说,指针变量存放地址。,变量的指针和指向变量的指针变量,1、指针变量的定义 一般形式:类型标识符*变量名;2、指针变量的引用 1)给指针变量赋值 赋变量的地址 2)用指针变量对变量赋值3、指针运算,重点:指向数组元素的指针变量及其应用 指向多维数组元素的指针变量及其应用 指向一维数组的指针变量及其应用难点:多维数组的指针变量及其应用数组的指针是数组的起始地址,数组元素的指针是元素的地址。引用
20、数组可以用下标法,也可以用指针法,通过指向数组的元素的指针找到数组元素。使用指针法能使目标程序占内存少,运行速度快。,数组的指针和指向数组的指针变量,1.概念 数组的指针数组在内存中的起始地址,数组元素的指针数组 元素在内存中的起始地址。2.指向数组的指针变量的定义 指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。例如,int array10,*pointer=array(或 注意:数组名代表数组在内存中的起始地址,所以可以用数组名给指针变量赋值。3.数组元素的引用 数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而 使用指针法,能使目标程序占用内存少、运行速度
21、快。,1、指向数组元素的指针变量的定义与赋值,2、通过指针引用数组元素,3、数组名作函数参数,指针变量作函数参数(形参),形参和实参均数组 形参用数组而实参用指针形参用指针而实参用数组 形参和实参均用指针传递的均是数组的首地址。,第i行、第j列的元素表示方法:(1)下标法:aij(2)用 ai+j 地址表示:*(ai+j)(3)用*(a+i)+j 地址表示:*(*(a+i)+j)地址表示方法汇总:,变量的指针只能存放变量的地址,而不能存放数组的地址,可定义数组的指针变量来存放数组的地址。定义的一般形式:类型说明符(*指针变量)数组长度;如:int(*p)4 p为一指向具有4个整型元素的一维数组
22、的指针变量(不能写成*p4,此为指针数组),二维数组的指针及其指针变量:,实参是地址或指针;形参有两种形式:(1)用指向变量的指针变量,(2)用指向一维数组的指针变量。,多维数组的指针作为函数参数,数组名作形参时,接收实参数组的起始地址;作实参时,将数组的起始地址传递给形参数组。引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有种等价形式(本质上是一种,即指针数据作函数参数):(1)形参、实参都用数组名(2)形参、实参都用指针变量(3)形参用指针变量、实参用数组名(4)形参用数组名、实参用指针变量,二维数组指针作函数参数 二维数组的指针作函数实参时,有列指针和行指针两种形式。
23、相应的,用来接受实参数组指针的形参,必须使用相应形式的指针变量,如下所示:实参:列指针 行指针 形参:(列)指针变量 行指针变量,字符串的指针和指向字符串的指针变量,重点:(1)字符串指针的定义、引用及作函数参数;(2)字符串指针变量与 字符数组的区别。1、字符串的表示形式 1)用字符数组 char a 10=“CHINA”2)用字符指针 char*string=“I love China!”;,string,string,字符串指针作函数参数:参数是字符串或字符串指针,传递的是地址。在被调函数中改变后,可在主调函数中得到改变后的数据。,用数组名、指针变量作函数参数的几种组合:数组名 数组名
24、数组名 字符指针变量 字符指针变量 数组名 字符指针变量 字符指针变量,虽二者均能实现对字符串的存储和计算,但:字符数组由元素组成,元素中放字符;字符指针变量放地址(如字符串的首地址等);赋初值的方式不同;对字符数组赋初值一般用static,如 static char str=“I love China!”;而字符指针变量赋初值一般不用static,如:char*p=“I love China!”;赋值方式不同;对字符数组要么赋初值(即定义时赋值),要么对元素赋值,下面的赋值方式是错误的:char str14;str14=“I love China!”;字符指针变量赋值一般可赋初值,或先定义后
25、赋值,如 char*a;a=“I love China!”;等价于:char*a=“I love China!”;,字符指针变量与字符数组,1、函数的指针及指向函数的指针变量 1)函数指针的概念 一个函数在编译时被分配一个入口地址,这个入口地址称为函数的指针。2)指向函数的指针变量 定义的一般形式:数据类型标识符(*指针变量名)(),重点:函数指针的概念及指向函数的指针变量 用指向函数的指针变量作函数参数,函数的指针和指向函数的指针变量,2、用指向函数的指针变量作函数的参数 传递的是函数的入口地址,一般的使用形式::sub(f1,f2);/*主调函数/*:sub(x1,x2)int(*x1)(
26、),(*x2)();int a,b,i,j;:/*次主调函数*/a=(*x1)(i);/*x1、x2为被调函数*/b=(*x2)(i,j);:,存储类别 数据类型标识符*函数名(形参表列)形参说明 函数体 如:int*a(x,y)/*存储类别为外部函数*/int x,y;2、指针函数的应用,返回指针值的函数,1、指针函数的定义,指针数组和指向指针的指针,1、指针数组 其元素均为指针型数据的数组,称为指针数组。定义形式:类型标识符*数组名数组长度说明 如:int*p4;不能写成 int(*p)4指针数组主要用于指向多个字符串,使字符串处理方便。,2、指向指针的指针 即指向指针数据的地址。定义形式
27、:类型标识符*变量名 如:char*P;p为一个指向字符指针变量的指针变量。一般指向一数组的首地址。如:char*name4,*p;p=name;,间接访问的“单级间址”和“二级间址”用指针访问便是间接访问。若指针变量中存放的是目标变量的地址,称为“单级间址”,指向指针的指针为“二级间址”。还可以有多级间址。见下图。,1、有关指针的数据类型,指针型数据小结,2、指针运算小结 1)、指针变量加减一个整数 如:p+p-p+i p-i p+=i p-=i 等 实际含义如 p+i 代表地址计算:p+c*i,c为字节数,整型c=2、实型c=4、字符型c=1。2)、指针变量赋值 如:p=&a a为变量,p
28、为指针变量 p=array array为数组名 p=&arrayi p=max max为函数名 p1=p2 p2为指针变量 注意:不能把一个整数或常数赋给p,如p=1000 同样也不能把p赋给整型变量,如i=p,3)指针变量可以赋空值 如:p=NULL;实际NULL是整数0。4)两个指针变量可以相减 如两个指针变量指向同一个数组的元素(如右图),则 p2-p1=4-1=3 但p1+p2无意义。5)两个指针变量比较 若两个指针指向同一个数组的元素,则可以比较,如:p1p23、空类型指针 ANSI新标准增加了一种空类型指针,定义的一般形式为:void*变量名 具体使用时要做类型转换,如:void*
29、p;(int*)p;,动态数组的实现 在程序运行过程中,数组的大小是不能改变的。这种数组称为静态数组。静态数组的缺点是:对于事先无法准确估计数据量的情况,无法做到既满足处理需要,又不浪费内存空间。所谓动态数组是指,在程序运行过程中,根据实际需要指定数组的大小。在C语言中,可利用内存的申请和释放库函数,以及指向数组的指针变量可当数组名使用的特点,来实现动态数组。,动态数组的本质是:一个指向数组的指针变量。,例 动态数组的实现方法实例#include“alloc.h”#include“stdlib.h”main()int*array=NULL,num,i;printf(“Input the num
30、ber of element:”);scanf(“%d”,/*释放由malloc()函数申请的内存块*/,Struct student int num;char name20;char sex;int age;float score;char addr30;,结构体名,成员项定义(列),第10章 结构体与共用体,结构体结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体定义,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,结构体类型的变量(三种方法)先声
31、名结构体类型,再用结构体类型定义结构体变量在声名结构体类型的同时定义结构体变量直接定义结构体类型变量,几点说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期,结构体变量的引用引用规则 结构体变量不能整体引用,只能引用变量成员引用方式:结构体变量名.成员名可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,结构体变量的初始化-形式一,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;
32、,形式二,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,形式三,struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,结构体数组结构体数组的定义,结构体数组初始化,结构体数组引用,引用方式:结构体数组名下标.成员名,结构体和指针指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;例 struct student*p;,使用结构体指针变量引用成员形式,指向结构体数组的指针,用指向结构体的指针作函数参数用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递用结构体变量作参数-多值传递,效率低
33、,共用体构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:,union 共用体名 类型标识符 成员名;类型标识符 成员名;.;,例 union data int i;char ch;float f;,类型定义不分配内存,形式一:union data int i;char ch;float f;a,b;,形式二:union data int i;char ch;float f;union data a,b,c,*p,d3;,形式三:union int i;char ch;float f;a,b,c;,共用体变量的定义,共用体变量定义分配内存,长度=
34、最长成员所占字节数,共用体变量任何时刻只有一个成员存在,共用体变量引用引用方式:,引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,不能在定义共用体变量时初始化,可以用一个共用体变量为另一个变量赋值,结构体与共用体区别:存储方式不同,联系:两者可相互嵌套,typedef定义类型功能:用自定义名字为已有数据类型命名类型定义简单形式:typedef type name;,typedef定义类型步骤按定义变量方法先写出定义体 如 int i;将变量名换成新类型名 如 int INTEGER;最前面加typedef 如 typedef int INTEGER;用
35、新类型名定义变量 如 INTEGER i,j;,类型定义可嵌套,第11章 文件,文件概述 文件类型指针 文件的打开与关闭 I/O及其重定向 文件的读写,Main()FILE*fp;,Source file.c,输入数据原始数据,磁盘/带文件,处理结果输出数据,文件概述,一、文件,存储在外部介质上数据的集合,使用数据文件的目的:,3、长期保存数据,2、数据共享,1、程序与数据分离,普通文件:,设备文件:,存储介质文件(磁盘、磁带等),非存储介质(键盘、显示器、打印机等),2、按存储介质,3、按数据的组织形式,文本文件:,ASCII文件,每个字节存放一个字符的ASCII码,二进制文件:,数据按其在
36、内存中的存储形式原样存放,二、文件分类,1、按文件的逻辑结构,记录文件:,由具有一定结构的记录组成(定长和不定长),流式文件:,由一个个字符(字节)数据顺序组成,三、文件处理,文件变量:指向文件结构体的指针,typedef struct int _fd;/文件号 int _cleft;/缓冲区中剩下的字符数 int _mode;/文件操作方式 char*_next;/文件当前读写位置 char*_buff;/文件缓冲区位置 FILE;,Stdio.h,打开文件(fopen),FILE*fopen(char*name,char*mode),FILE*fp;if(fp=fopen(infile,r
37、)=NULL)printf(Cannot open infile!n);exit(0);,文件关闭(fclose),int fclose(FILE*fp)例:fclose(fp),“r+/rb+”(读写),“a/ab”(追加),“w/wb”(只写),“r/rb”(只读),“w+/wb+”(读写),“a+/ab+”(读写),为输入打开一个文本/二进制文件,为输出打开或建立一个文本/二进制文件,为读/写打开一个文本/二进制文件,为读/写建立一个文本/二进制文件,为读/写打开或建立一个文本/二进制文件,向文本/二进制文件尾追加数据,文件使用方式,含 义,文件打开方式:,标准I/O及其重定向,系统自动
38、打开和关闭三个标准文件,标准输入-键盘 stdin,标准输出-显示器 stdout,标准出错输出-显示器 stderr,重定向,输入、输出重新定向,(输入、输出由文件完成),符号:,、,读函数(磁盘 缓冲区),1、fgetc函数,Char fgetc(fp);/char getch();,文件的读/写,2、fgets函数,fgets(str,fp);/gets(str);,3、fscanf函数,fscanf(fp,格式控制,地址表);/scanf(格式控制,地址表);,4、fread函数,fread(buffer,size,count,fp);,写函数(缓冲区 磁盘),1、fputc函数,fp
39、utc(c,fp);/putch(C);,2、fputs函数,fputs(str,fp);/puts(str);,4、fwrite函数,3、fprintf函数,fwrite(buffer,size,count,fp);,fprintf(文件类型指针,格式控制,地址表);printf(格式控制,变量列表);,char str20;sprintf(str,格式控制,变量列表);,指针数组作main函数的参数:main(int argc,char*argv),命令行 如执行 file1.exe 文件,且文件中有以上参数,则可输入:file1 arg1 arg2.使用一般形式:文件名 参数1 参数2
40、参数n形参的意义(1)argc:int argc(=1+参数个数)(2)argv:char*argv,得到的是命令行各参 数字符串的首地址;argv0 为命令名,argv1 argvn 各参数,第12章 预处理命令,无参宏一般形式为:#define 标识符 字符串如要终止其作用域可使用#undef 命令。,宏定义,带参数的宏的一般形式为:#define 宏名(形参表)字符串带参宏调用的一般形式为:宏名(实参表);例如:#define M(y)y*y+3*y#define M(y)(y)*(y)+3*(y)#define M(y)(y)*(y)+3*(y),文件包含,#includestdio.
41、h“在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;#include 首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。,条件编译,第一种形式#ifdef 标识符 程序段1#else 程序段2#endif#ifdef 标识符 程序段#endif,第二种形式#ifndef 标识符 程序段1#else 程序段2#endif,第三种形式#if 常量表达式 程序段1#else 程序段2#endif,1、按位与:&主要用途:取(或保留)1个数的某(些)位,其余各位置0。2、按位或:|主要用途:将1个数的某(些)位置1,其余各位不变。3、按位异或:主要用途:
42、使1个数的某(些)位翻转(即原来为1的位变为0,为0的 变为1),其余各位不变。4、按位取反:主要用途:间接地构造一个数,以增强程序的可移植性。5、按位左移:补0的称为“逻辑右移”,补1的称为“算术右移”,第13章 位操作,位段简介,存储1个信息不必占用1个字节,只需二进制的1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。1、位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制 位为单位定义长度,并称成员为位段。例如,CPU的状态寄存器,按位段类型定义如下:struct status unsigned sign:1;/*符号
43、标志*/unsigned zero:1;/*零标志*/unsigned carry:1;/*进位标志*/unsigned parity:1;/*奇偶/溢出标志*/unsigned half_carry:1;/*半进位标志*/unsigned negative:1;/*减标志*/flags;,显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比使 用结构类型(需要6个字节)节省了5个字节。2、说明(1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以 及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量 一样。(2)对位段赋值时,要注意取置范围。一般地说,长度为n
44、的位段,其取值 范围是:0(2n-1)。(3)使用长度为0的无名位段,可使其后续位段从下1个字节开始存储。例如,struct status unsigned sign:1;/*符号标志*/unsigned zero:1;/*零标志*/unsigned carry:1;/*进位标志*/unsigned:0;/*长度为0的无名位段*/unsigned parity:1;/*奇偶/溢出标志*/unsigned half_carry:1;/*半进位标志*/unsigned negative:1;/*减标志*/flags;,原本6个标志位是连续存储在1个字节中的。由于加入了1个长度 为0的无名位段,所以其后的3个位段,从下1个字节开始存储,一共占用2个字节。(4)1个位段必须存储在1个存储单元(通常为1字节)中,不能跨2 个。如果本单元不够容纳某位段,则从下1个单元开始存储该位段。(5)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。(6)在数值表达式中引用位段时,系统自动将位段转换为整型数。,关于考试成绩分布:上机实验:40%(每次实验4分)期末考试:60%(卷面100分)基本题型:选择填空:20%程序填空:20%程序改错:20%程序设计:40%,欢迎留下您宝贵意见!感谢合作!祝考试成功!谢谢!,黄虎杰,