C语言完整课件资料_第1页
C语言完整课件资料_第2页
C语言完整课件资料_第3页
C语言完整课件资料_第4页
C语言完整课件资料_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计,第1章概论第2章数据类型、运算符与表达式第3章顺序结构程序设计第4章选择结构程序设计第5章循环结构程序设计第6章数组第7章函数第8章指针第9章结构体与共用体第10章文件第11章综合应用实例,第1章概论,C语言是美国贝尔实验室于20世纪70年代初研制出来的,早期主要用于UNIX操作系统,到了20世纪80年代,C语言开始用于其它操作系统,并很快在各类大、中、小和微型计算机上广泛使用,成为国际上广为流行的计算机程序设计高级语言。本章主要介绍C语言的特点,C语言程序的结构与书写规则,C程序上机步骤,编译预处理,算法的概念及表示。,1-1,返回目录,1.1语言的特点1语言简洁、紧凑,使用方便、灵活2运算符丰富3数据类型丰富4程序设计结构化、模块化5语法限制不太严格,程序设计自由度大6C语言允许直接访问物理地址,能进行位(bit)操作7生成的目标代码质量高,程序执行效率高8可移植性好,1-2,1.2C语言程序的结构与书写格式,1.2.1C语言程序举例1.2.2C语言程序的结构1.2.2.1函数是语言程序的基本单位。1.2.2.2函数的一般结构任何函数(包括main()函数)都是由函数首部和函数体两部分组成。1.函数首部:函数首部即函数第一行,由函数类型、函数名和函数参数表三部分组成。2.函数体:函数体为函数首部下面的花括号内的部分。函数体一般由声明部分和执行部分构成:声明部分定义所用到的变量,声明所调用的函数等;执行部分有若干语句组成。,1-3,1.2.2.3C语言程序的执行C语言程序总是从main()函数的第一条执行语句开始执行,执行完main()函数的最后一条语句,则整个程序执行结束,而其他函数则通过嵌套调用得以执行。,1.2.3C语言程序书写格式1.行的书写格式自由,可从一行的任何位置开始书写。2.一行可书写多条语句,一条语句也可分写在几行上。3.所有语句都必须以分号“;”结束。4.允许使用注释。C语言的注释格式有两种:/,/*/。5.在书写程序时,通常采用缩格形式书写分层结构的程序。,1-4,1.3C程序上机步骤C源程序编好后,要经过编辑、编译、连接,生成可执行文件后,才可运行。,1-5,1.4编译预处理编译预处理是指,在C编译程序对C源程序进行编译之前,由编译预处理程序对源程序中的预处理命令进行处理的过程。1.4.1宏定义用一个标识符来表示一个字符串,称为“宏”,标识符称为“宏名”。在程序中用宏名替代字符串称为“宏调用”。在编译预处理时,将对程序中所有出现的“宏名”,都用宏定义中的字符串代换,这个过程称为“宏展开”。1.4.1.1不带参数的宏定义格式为:#define标识符字符串1.4.1.2带参数的宏定义格式为:define宏名(参数表)字符串1.4.2文件包含文件包含是指在一个文件中,去包含另一个文件的全部内容。格式为:#include或#include文件名,1-6,1.5算法的概念及表示1.5.1算法的概念为解决一个问题而采取的方法和步骤,称为算法。计算机能够执行的算法,称为计算机算法,它有以下特性:有穷性。确定性。输入。输出。有效性。1.5.2算法的表示1.5.2.1用自然语言表示算法自然语言就是人们日常使用的语言。1.5.2.2用流程图表示算法流程图是用一些图框表示各种操作,用图形表示算法。,1-7,第2章数据类型、运算符与表达式,数据是程序处理的基本对象,由数据和运算符一起组成的表达式是计算机语言中最基本的计算成分。本章主要介绍基本数据类型:整型,实型,字符型;常用运算符:算术运算符,赋值运算符,逗号运算符,以及相应的表达式。,2-1,返回目录,2.1数据类型C语言的数据类型非常丰富,可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。,2-2,数据类型,2.2常量与变量2.2.1标识符标识符是用来标识符号常量名、变量名、函数名、数组名、类型名、文件名的有效字符序列,由字母、数字、下划线组成,且第一个字符必须为字母或下划线。2.2.2常量2.2.2.1字面常量(直接常量)字面常量是直接表示的常量。2.2.2.2符号常量符号常量是用一个标识符代表一个常量,使用编译预处理命令#define定义,定义格式为:#define常量名字面常量,2-3,2.2.3变量在程序运行过程中,其值可以改变的量称为变量。C语言规定,变量要先定义后使用。变量的定义一般在函数的声明部分,格式为:数据类型变量名1,变量名2,;变量的三个要素:变量名。变量值。变量的地址.2.2.4变量的初始化在定义变量的同时给变量赋以初值,称为变量初始化,出现在函数体的声明部分,格式为:数据类型变量1=值1,变量2=值2,;,2-4,2.3整型数据2.3.1整型常量在C语言中,整型常量有三种表示形式:十进制,数码为09。八进制(以数字0开头),数码为07。十六进制(以数字0 x或0X开头),数码为09,AF或af。在C语言中,整型常量可分为三种类型:基本整型。无符号基本整型(在数值后面加U或u)。长整型(在数值后面加L或l。,2-5,2.3.2整型变量根据占用内存字节数的不同,整型变量分为三类:(1)基本整型,以int表示。(2)短整型,以shortint或short表示。(3)长整型,以longint或long表示。根据在内存中的存储形式,整型数据又分为有符号和无符号两种。,2-6,整型数据的分类,2.3.3整型数据的溢出如果在数据处理时,超出了变量的取值范围,就会发生“溢出”现象。,2.4实型数据2.4.1实型常量实型常量即实数,在C语言中又称浮点数,其值有两种表达形式。十进制小数形式,有数字和小数点组成,要求小数点的两边必须有数。指数形式,格式为E(e),2-7,2.4.2实型变量C语言的实型变量分为三种:单精度型(float)、双精度型(double)、长双精度型(longdouble),实型数据在内存中是按指数形式存储的。,2-8,实型数据的分类,2.5字符型数据2.5.1字符常量用一对单引号括起来的单个字符,称为字符常量。C语言中有一种称为“转义字符”的特殊形式的字符常量,转义字符以反斜杠“”开头,将“”后面的字符转换为另外的含义。,2-9,转义符,2.5.2字符变量字符变量用来存放字符常量,关键字为char,只能存放一个字符,占用1个字节内存单元。字符数据在内存中存储的是字符的ASCII码(一个无符号整数),其形式与整数的存储形式一样,表示范围是:0255。在C语言中允许字符型数据与整型数据之间通用。,2-10,2.6算术运算符和算术表达式2.6.1运算符及表达式简介2.6.1.1运算符C语言中的运算符具有2个特点:运算符的优先级C语言中,运算符的优先级共分为15级,1级最高,15级最低。运算符的结合性C语言中各运算符的结合性分为左结合性(从左到右)和右结合性(从右到左)。2.6.1.2表达式表达式是由常量、变量、函数和运算符组成的式子。表达式求值是按运算符的优先级和结合性规定的顺序进行的。,2-11,2.6.2算术运算符和算术表达式2.6.2.1基本的算术运算符基本算术运算符均为双目运算,有5种:加法运算符“+”、减法运算符“-”、乘法运算符“*”、除法运算符“/”、求余运算符或模运算符“%”。用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子称为算术表达式,运算对象包括常量,变量、函数等。如果一个运算符两侧的运算对象数据类型不同,要先利用自动类型转换或强制类型转换,使运算对象具有同一种数据类型,然后才能进行运算。,2-12,2.6.2.2类型转换数据的类型是可以转换的。1.自动转换如果一个运算符两侧运算对象的数据类型不同,则系统按“先转换、后运算”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。2.强制类型转换强制类型转换是通过类型转换运算符来实现的,一般形式为(类型名)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。,2-13,自动转换规则,2.6.2.3自增(+)、自减(-)运算符自增运算符(+)使单个变量的值增1,自减运算符(-)使单个变量的值减1,格式为前置:+i,-i在使用i之前,使i的值加(减)1后置:i+,i-在使用i之后,使i的值加(减)1,2-14,2.7赋值运算符和赋值表达式2.7.1赋值运算符赋值运算符是“=”,它的作用是将一个数据或一个表达式的值赋给一个变量,赋值运算符的一般形式如下:变量=表达式2.7.2复合的赋值运算符复合赋值运算符是由赋值运算符之前再加一个双目运算符构成的,一般格式如下:变量双目运算符=表达式它等价于:变量=变量双目运算符(表达式)。5个复合算术运算符:和赋值“+=”,差赋值“-=”,积赋值“*=”,商赋值“/=”,模赋值“%=”。由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式,它的一般形式为赋值表达式的值为被赋变量的值。,2-15,2.8逗号运算符和逗号表达式在C语言中,逗号“,”也是一种运算符,称为逗号运算符,它把若干个表达式连接起来组成一个表达式,称为逗号表达式,一般形式为表达式1,表达式2,表达式n逗号表达式的求解过程是:从左到右,依次计算各表达式的值,最后一个表达式的值即为整个逗号表达式的值。,2-16,在第一章介绍了C语言程序的结构,在第二章介绍了构成程序的基本成份:常量、变量、基本数据类型、常用运算符及表达式,本章将介绍C语句概述,数据的输入与输出,顺序结构程序设计。,3-1,第3章顺序结构程序设计,返回目录,3.1C语句概述C语句用“;”做为结束,其作用是向计算机系统发出操作指令。3.1.1控制语句C语言有9种控制语句。if()else(条件语句)switch(开关语句)for()(循环语句)while()(循环语句)dowhile()(循环语句)continue(结束循环语句)break(中止执行switch语句或结束本次循环语句)goto(无条件转向语句)return(从函数返回语句),3-2,3.1.2函数调用语句函数调用语句由一次函数调用加一个分号“;”组成。3.1.3表达式语句表达式语句由表达式加一个分号“;”组成,其一般形式如下:表达式;3.1.4复合语句复合语句由花括号把多条语句括起来组成。3.1.5空语句只有一个分号“;”组成的语句,称为空语句,它什么也不执行,用作被转向点或循环语句中的循环体。,3-3,3.2数据的输入输出3.2.1字符数据的输入输出3.2.1.1putchar()函数(字符输出函数)putchar()函数是字符输出函数,其一般形式为:putchar(c)功能:向显示器输出一个字符。3.2.1.2getchar()函数(字符输入函数)getchar()函数是字符输入函数,其一般形式为:getchar()功能:从键盘输入一个字符。,3-4,3.2.2printf()函数(格式输出函数)3.2.2.1printf函数()(格式输出函数)的格式printf()函数是格式输出函数,其一般格式如下:printf(格式控制字符串,输出表列);功能:按指定格式向终端(显示器)输出若干任意类型的数据。3.2.2.2printf()函数的格式字符1.d,i格式字符,按带符号的十进制形式输出整数,正数不输出符号,常用d。%d,按整型数据的实际长度输出。%md,m代表一个正整数,m为指定输出数据的宽度。若数据位数小于m,则左端补以空格;若数据位数大于m,则按实际位数输出。%-md,m代表一个正整数,m为指定输出数据的宽度。若数据位数小于m,则右端补以空格;若数据位数大于m,则按实际位数输出。%ld,输出长整型数据。对长整型数据,可再使用m指定输出数据的宽度。,3-5,2.o格式字符,按八进制形式输出整数,用法同d格式字符。3.x(或X)格式字符,按十六进制形式输出整数,用法同d格式字符。4.u格式字符,按无符号十进制形式输出整数,用法同d格式字符。5.c格式字符,输出一个字符。%c,输出一个字符。%mc,m代表一个正整数,m为指定输出数据的宽度,左端补以空格。%-mc,m代表一个正整数,m为指定输出数据的宽度,右端补以空格。6.s格式字符,输出一个字符串。%s,输出一个字符串%ms,m代表一个正整数,输出的字符串占m列,如果字符串本身长度大于m,则将字符串全部输出;如果串长小于m,则左补空格。%-ms,m代表一个正整数,输出的字符串占m列,如果字符串本身长度大于m,则将字符串全部输出;如果串长小于m,则右补空格。%m.ns,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右侧,左补空格。如果nm,则m自动取n值即保证n个字符正常输出。%-m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。%.ns,只指定了n,没指定m,自动使mn。,3-6,7.f格式字符,按小数形式输出实数。%f,整数部分全部如数输出,并输出6位小数。但并非全部数字都是有效数字,单精度实数的有效位数一般为7位,双精度实数的有效位数一般为16位。%m.nf,指定输出的数据共占m列,其中有n位小数,自动四舍五入。如果数值长度小于m,则左端补空格。%-m.nf,指定输出的数据共占m列,其中有n位小数,自动四舍五入。如果数值长度小于m,则右端补空格。%.nf,只指定了n,没指定m,自动使m等于数据应占的长度。8.e(或E)格式字符,以指数形式输出实数。%e,系统自动给出6位小数,共13位。%m.ne,用法同f格式字符。%-m.ne,用法同f格式字符。%.ne,用法同f格式字符。9.g(或G)格式字符,根据数值大小,自动选f或e。,3-7,3.2.3scanf()函数(格式输入函数)3.2.3.1scanf()函数(格式输入函数)的格式scanf()函数是格式输入函数,其一般格式如下:scanf(格式控制字符串,地址列表);功能:按指定的格式从终端(键盘)上把数据输入到指定的变量之中。3.2.3.2scanf()函数的格式字符scanf()函数的格式字符与printf()函数类似,有d,o,x,u,c,s,f,e,使用方式亦与printf()函数类似,这里介绍常用的格式字符d、c、f的使用。1.d格式字符,用来输入有符号的十进制整数。%d,输入有符号的十进制整数。%md,m代表一个正整数,指定输入数据占m列。%*d或%*md,表示跳过指定的输入项或指定的m列。%ld,输入长整型数据。,3-8,2.c格式字符,用来输入单个字符。%c,输入一个字符。%*c,表示跳过指定的输入项。3.f格式字符,用来输入实数,可以用小数形式或指数形式输入。%f,用小数形式或指数形式输入实数。%lf,用于输入double型数据。%*f,表示跳过指定的输入项。,3-9,3.3顺序结构程序设计3.3.1顺序结构程序设计概述在顺序结构程序中,各语句是按照位置的先后次序,顺序执行的,且每条语句都会被执行到。,3-10,#include#includevoidmain()变量定义;输入数据数据运算部分输出部分,顺序结构程序的组成,3.3.2顺序结构程序设计示例,第4章选择结构程序设计,选择结构是C语言的三种基本结构之一。在数据处理过程中,经常需要根据不同的条件,完成不同的处理。例如,输出a和b两个数中的较大数。要求当a大于b时,输出a;否则,输出b。对于这种根据一定的条件选择执行路径的问题,要用选择结构来解决。本章主要介绍条件语句中“条件”的产生与表达,两种条件语句(if语句和switch语句)的使用。,4-1,返回目录,4-2,4.1关系运算符和关系表达式4.1.1关系运算符C语言的关系运算符一共有6种,关系运算符的结合性是自左至右。算术运算符、关系运算符、赋值运算符的运算次序为:算术运算符关系运算符赋值运算符。,高低,4.1.2关系表达式关系表达式:用关系运算符将两个表达式连接起来的式子,称为关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”,当关系表达式成立时,其值为“真”,不成立时,其值为“假”。C语言中没有逻辑型数据,而是用“1”表示“真”,用“0”表示“假”。在判断一个值是否为真时,只有“0”被认为是假,所有非“0”值均被认为是“真”。,4-3,4.2.1逻辑运算符C语言的逻辑运算符一共有3种。,4-4,4.2逻辑运算符和逻辑表达式,其中,“!”是单目运算符,只要求有一个运算量;“语句的执行过程是:先执行循环体语句,然后对循环条件表达式进行计算,若其值为真(非0),则重复上述过程,直到条件表达式的值为假(0)时,循环结束,程序控制转至while语句的下一个语句。与while语句相比,dowhile语句至少执行一次循环体。这种先执行循环体语句的循环称为“直到型”循环。,5-4,5.4for循环语句for语句是C语言提供的结构紧凑、使用广泛的一种循环语句,for语句的一般格式:for(表达式1;表达式2;表达式3)循环体语句表达式1:通常用来给循环变量赋初值,一般是赋值表达式,通常称为“初始化表达式”。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。表达式2:通常是循环条件,一般为关系表达式或逻辑表达式,通常称为“条件表达式”。表达式3:通常可用来修改循环变量的值,一般是赋值表达式。for语句的执行过程是:计算表达式1的值;计算表达式2的值,若其值为真,则执行循环体语句一次,然后执行第步;若为假,则结束循环,转到第(4)步;计算表达式3的值,然后转回第步重复执行;循环结束,执行for语句下面的一个语句。下图是for语句的执行过程。,5-5,5-6,5.5流程转向语句这一类语句不形成控制结构,只是简单地使程序执行流程从所在处转向另一处。5.5.1break语句在循环体中,break跳出循环体(即结束循环),执行循环体下面的语句。break只能跳出它所在的那一层循环。语句格式为:break;5.5.2continue语句语句的功能是结束本次循环的执行,但不结束整个循环结构的执行过程。语句格式为:continue;5.5.3goto语句它的作用是使程序流程从所在处转向本函数内的某一处,程序必须指出转向的目的地,目的地用标号指出。goto语句的格式为:goto语句标号;其中,标号必须是一个合法的标识符,它写在某一语句的前面,后跟一个冒号“:”,表示程序的流程将转向此语句。,5-7,1.三种循环语句在处理循环问题时,一般可以相互替代。2.对于循环次数确定的问题,用for语句实现比较简单。3.对于循环次数不确定的问题,可用while语句或dowhile语句实现。4.while语句,先判断,后执行;dowhile语句,先执行,后判断。,5-8,5.6几种循环的比较,在一个循环结构中又套着另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环结构内的循环结构称为内循环,外面的循环结构称为外循环。如果内循环体内又有嵌套的循环结构,则称为多重循环。while语句、dowhile语句和for语句都可以互相嵌套。在嵌套的循环结构中,要求内循环必须包含在外循环的循环体中,不允许出现内外层循环体交叉的情况。嵌套的循环结构的执行过程是:外层循环的循环变量每变化一次,内层循环的循环变量要从初值变到终值,其间也可以用break语句终止内、外层循环。,5.7循环结构的嵌套,在前面章节中介绍的数据类型都是简单类型,每个变量只能取一个值,但在处理实际问题时,经常需要处理成批的具有相同数据类型的数据,对于这些具有相同类型且相关的数据可以用数组表示和处理。本章主要介绍一维数组的定义及使用,二维数组的定义及使用,字符数组的定义及使用。,6-1,第6章数组,返回目录,一个数组就是一组变量,其中每一个变量称为一个数组元素,数组元素应该满足下列条件:具有相同的名字;具有相同的数据类型;在存储器中连续存放。数组元素可以是基本数据类型或者构造类型。根据数组元素类型的不同,数组可分为数值数组、字符数组、指针数组、结构体数组等多种类型。在C语言中,数组的使用和普通变量的使用类似,必须“先声明,后使用”。6.2一维数组6.2.1一维数组的定义数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。定义格式如下:类型说明符数组名常量表达式;,6-2,6.1数组的概念,对一维数组的定义注意以下几点:1.类型说明符说明数组的类型,实际上是指数组元素的类型,同一个数组中,所有元素的数据类型是一致的;2.数组名的命名规则应遵循标识符的命名规则;3.数组名后是方括号,而非圆括号();4.常量表达式表示元素的个数,即数组长度。常量表达式应是整型表达式。5.常量表达式中可以使用常量和符号常量,但不能包含变量,即C不允许对数组的大小作动态定义。6.2.2一维数组的初始化6.2.2.1一维数组的存储结构数组在定义之后,其元素在内存中是连续存放的,下图是charname5在内存中的存放情况。,6-3,6-4,数组名代表这一段内存的起始地址,由于一个字符在内存中占有一个字节,而每一个字符数组元素只能存放一个字符,所以可以根据元素的下标和元素的起始地址计算出某一个元素的内存地址,从而实现数组元素的随机访问,计算公式如下:数组元素地址=数组起始地址+元素下标*每个数组元素所占字节数假设name在内存中的起始地址为2000,则name4的地址为:2000+4*1=2004。6.2.2.2一维数组的初始化给所有元素赋初值如:inta5=0,1,2,3,4;可以只给一部分数组元素赋初值如:inta10=0,1,2,3,4;在对全部数组元素赋初值时,可以不指定数组长度如:inta=0,1,2,3,4;省略数组长度,系统将根据所给出的数据个数自动确定数组的长度,即数组长度与数据个数相同。要想使数组中所有的数组元素值都为0,则采用如下形式:inta10=0,0,0,0,0,0,0,0,0,0;或inta10=0;,6.2.3一维数组元素的引用数组元素的引用是指在程序中使用数组中各元素的过程。其格式如下:数组名下标下标是指所要访问的数组元素在数组中的位置,它与定义数组时所指定的数组大小不同,它可以是整型的常量,也可以是已赋值的整型变量。C语言规定数组的下标从0开始编号,因此最后一个元素的下标为数组的长度减1。说明:数组元素的引用与同类型的一般变量使用方式一样。但需注意:下标不能超出范围。如定义了“inta10;”,同时又引用a10,就出界了。而系统对下标的越界不做检查和处理,所以处理元素时要做好对其下标的控制,以免产生意想不到的结果。数组的每一个元素相当于一个普通变量,因此,数组元素只能逐个引用(字符数组除外),而不能一次引用整个数组。如果要引用数组中的全部元素,通常借助for循环语句,逐个引用数组中的每一个元素。6.2.4一维数组的应用程序设计中,利用一维数组进行批量数据处理的问题十分普遍,其中在数组中查找数据、从数组中删除数据、对数组的元素进行排序、向数组中插入一个数据等操作是最基本的数据处理算法。,6-5,一维数组中的每一个数组元素的下标只有一个,所以一维数组只可以对一组相关数据做处理。当要处理多组相关的数据时,如数学上的矩阵、9*9乘法表等,都需要用二维格式的形式存储。当每一个数组元素有两个或两个以上下标时,该数组称为多维数组。数组元素有两个下标时称为二维数组。C语言中涉及到的最多的多维数组是二维数组。6.3.1二维数组的定义二维数组定义的一般形式如下:类型说明符数组名常量表达式1常量表达式2;“常量表达式1”表示第1维下标的长度,也就是二维格式的行数;“常量表达式2”表示第2维下标的长度,也就是二维格式的列数。6.3.2二维数组的初始化6.3.2.1二维数组的存储结构二维数组的逻辑结构是由若干行和若干列组成的,不象一维数组只是线性的。但二维数组在计算机中却是连续存储的,即存储单元是线性排列的。与一维数组一样,数组元素的各维下标也是从0开始,最大下标为“该维的常量表达式值减1”。,6-6,6.3二维数组,在C语言中,二维数组的存放形式是按行存放,即存完第一行的数据,依次存放第二行的数据,第三行的数据等等。如定义了“intscores34;”,则逻辑结构展开为scores00,scores01,scores02,scores03scores10,scores11,scores12,scores13scores20,scores21,scores22,scores236.3.2.2二维数组的初始化与一维数组一样,二维数组也是在定义数组时给数组各元素赋初值。按行给二维数组赋初值。如:inta23=1,2,3,4,5,6;按数组的排列顺序对各数组元素赋初值(所有数据写在一个花括号内)。如:intb23=1,2,3,4,5,6;可以对部分数组元素赋初值。如:intc34=1,5,9;在对全部数组元素赋初值时,数组第一维的长度可以不指定。但其它维必须指定,系统会自动根据所给的初值和其它维的下标值来确定第一维下标的长度。如:inte3=1,2,3,4,5,6;,6-7,6.3.3二维数组元素的引用二维数组元素引用的一般格式如下:数组名下标1下标2;如果定义了“inta55;”,则下面是对a数组元素的合法引用。6.3.4二维数组的应用6.4字符数组数组中所有的元素都是字符型数据,这样的数组称为字符数组。也就是说,字符数组是专门用来存放字符的,且数组的每个元素只能存放一个字符。字符数组的定义及初始化与一般数组相同。6.4.1字符数组的定义定义一维字符数组:char数组名常量表达式;如:charc10;表示定义一个一维字符数组c,其中可以存放10个字符。定义二维字符数组:char数组名常量表达式1常量表达式2;如:charnames510;表示定义一个二维字符数组names,共有5行,一行存放一个姓名,总共可以存放5个人的姓名,其中每一个人的姓名不能超过10个字符。,6-8,6.4.2字符数组的初始化给所有元素赋初值如:charc5=h,a,p,p,y;可以只给一部分数组元素赋初值如:charc10=h,a,p,p,y;在对全部数组元素赋初值时,可以不指定数组长度。如:charc=h,a,p,p,y;6.4.3字符串与字符数组用一对双引号(“)括起来的若干字符序列称为字符串。字符串中字符的个数称为字符串长度。C语言规定,在存储字符串常量时,由系统在字符串的末尾自动加一个“0”作为字符串的结束标志。6.4.4字符数组的输入与输出6.4.4.1每一个数组元素逐个进行输入与输出在scanf()函数和printf()函数中使用格式符“%c”利用putchar()和getchar()库函数6.4.4.2所有字符作为一个字符串进行输入与输出在scanf()函数和printf()函数中使用格式符“%s”利用字符串输入gets()和输出puts()函数,6-9,6.4.5字符数组的应用6.4.6常用的字符串处理函数使用字符串处理函数,需要在程序中包含头文件“string.h”。6.4.6.1strcat(字符数组1,字符数组2)这是一个字符串连接函数。其作用是连接两个字符数组中的字符串,将字符数组2中的字符串接到字符数组1的字符串的后面,结果放在字符数组1中,函数返回字符数组1的地址。6.4.6.2strcpy(字符数组1,字符数组2)这是一个字符串复制函数。其作用是将字符数组2中的字符串内容复制到字符数组1中。函数的返回值是字符数组l的起始地址。6.4.6.3strlen(字符串)这是一个求字符串长度的函数。其作用是计算字符串的长度。函数的返回值是字符串的实际长度,即第一个“0”前的所有字符的个数。字符串的长度不包括字符串中的最后一个结束符“0”。6.4.6.4strcmp(字符串1,字符串2)这是一个字符串比较函数。其作用是比较两个字符串的大小。字符串比较的依据是字符所对应的ASCII码。strcmp函数的返回值:若字符串1字符串2,则strcmp()函数的返回值大于0;若字符串1=字符串2,则strcmp()函数的返回值等于0;若字符串1字符串2,则strcmp()函数的返回值小于0。,6-10,第7章函数,一个C程序往往由多个函数组成,每个函数具有一定的功能,通过函数之间的调用来完成整个程序的任务。本章主要介绍函数的概述、函数的定义、函数参数和函数值、函数的调用、函数的嵌套调用和递归调用、数组作函数的参数、局部变量和全局变量、动态存储变量和静态存储变量。,7-1,返回目录,7.1概述,7.1.1C语言程序结构一个C程序由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成;每个源程序以一个文件形式存储,并以文件为单位进行编译。在C语言中,所有函数定义,包括main()函数在内,都是平行的,独立的。函数之间可以相互调用,也可以嵌套调用,函数还可以自己调用自己。习惯上把调用者称为主调函数,把被调用者称为被调函数。main()函数是主函数,是系统定义的,它可以调用其他函数,但不允许被其他函数调用。C程序的执行总是从main()函数开始,调用其他的函数后返回main()函数,并在main()函数中结束整个程序的执行。,7.1.2函数的分类库函数和用户定义函数有返回值函数和无返回值函数无参函数和有参函数,7-2,7.2函数的定义,7.2.1无参函数的定义定义格式如下:类型标识符函数名()函数首部声明部分函数体语句,7.2.2有参函数的定义定义格式如下:类型标识符函数名(形式参数列表)声明部分语句,7-3,7.3函数参数和函数的值,7.3.1函数参数形参必须是具有某种类型的变量,而实参可以是常量、变量或表达式,但当程序执行到函数调用语句时实参一定要有确定的值。形参在未出现函数调用时,并不占内存的存储单元,只有在函数调用时,才给形参分配存储单元,在函数调用结束时,形参所占的存储单元也随之被释放。实参与形参的个数应相等,类型应一致或赋值兼容。实参与形参按顺序对应,一一传递数据,实参对形参变量的数据传递是单向的“值传递”。,7.3.2函数的返回值C通过return语句返回函数的值,return语句的一般格式如下:return(表达式);或return表达式;其功能是将表达式的值作为函数的返回值带回主调函数,并结束被调函数的执行,返回到主调函数。如果函数值的类型和return语句中表达式的值的类型不一致,则以函数类型为准。,7-4,7.4函数的调用,7.4.1函数调用的一般形式1.无参函数调用的一般形式:函数名()2.有参函数调用的一般形式:函数名(实参列表),7.4.2函数调用的方式按函数调用出现在语句中的位置,将函数调用方式分为三种。1函数语句:把函数调用作为一条语句。2函数表达式:函数调用出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算,最常见的是赋值表达式,如:c=sum(a,b)。3函数参数:把函数的返回值作为另一个函数或下一次函数调用的实参。,7-5,调用自定义函数时,自定义函数必须存在,一般还应在主函数中对被调函数作声明,声明方式如下:类型标识符被调函数名(类型说明变量名);当被调用函数的定义出现在主函数之前,函数声明可省略。调用库函数时,一定要将包含该函数的头文件包含到程序中。例如:调用printf()函数,则应在程序中包含stdio.h头文件;调用数学函数sqrt(),则应在程序中包含math.h头文件。,7-6,7.5函数设计示例,设计函数的原则:一个函数不应处理太多的功能,要保持函数的小型化,功能单一化。一个函数要保持自己的独立性,如同一个黑匣子一样,有进有出,进指函数的入口,通过函数名和实际参数进入函数;出指函数的出口,通过return或“”结束函数的执行返回主调函数。在函数中应多使用复合语句,使函数具有结构化,并可提高执行效率和节省存储单元。一般在主调函数中定义变量,输入和输出数据,而把对数据的处理用函数来完成。,7-7,7.6函数的嵌套调用和递归调用,7.6.1函数的嵌套调用在C语言中函数的定义都是相互平行、相互独立的。在定义函数时,函数不能嵌套定义,但可以嵌套调用函数,即调用一个函数的过程中,又调用另一个函数。,7.6.2函数的递归调用函数的递归调用是指一个函数在它的函数体内,直接或间接的调用它自身。在递归调用中,函数反复调用自身,每调用一次进入新的一层。为了防止递归调用无终止地进行,必须在函数体内有终止递归调用的手段,常用的手段是加入条件判断,满足条件后就不再递归调用,然后逐层返回。,7-8,7.7数组作函数的参数,7.7.1数组元素作函数的参数数组元素就是下标变量,在使用上与普通变量并无区别。在函数调用时,数组元素只能做函数的实参,把数组元素的值传送给形参,实现单向值传送。7.7.2数组名作函数的参数数组名作函数参数时,既可以作形参,也可以作实参。要求形参和相对应的实参都必须是类型相同的数组,并在主调函数和被调函数中分别定义。用数组名作函数的参数,实参和形参传递的是“地址”,即将实参数组的首地址赋值给形参数组名,那么实参数组和形参数组在内存中就占用同一存储单元。因此形参数组的值发生变化时实参数组的值也跟着变化。,7.7.3二维数组作函数的参数二维数组元素可以作函数的实参,和一维数组元素、普通变量作函数的实参相同。二维数组名可以作函数的实参和形参,在调用函数时和一维数组名作函数的参数相同。注意:在被调用函数中对形参数组定义时可以指定每一维的大小,可以也只可以省略第一维的大小说明。实参数组和形参数组的第二维的大小必须相同。,7-9,7.8局部变量和全局变量,7.8.1局部变量在一个函数内部定义的变量称为局部变量,它只在该函数范围内有效。7.8.2全局变量在函数外部定义的变量称为全局变量,其作用域是:从变量定义位置开始,到本文件结束为止。,7-10,7.9动态存储变量与静态存储变量,7.9.1局部变量的存储方式局部变量一般是动态分配存储单元,也称为自动变量,用auto说明,调用时分配,结束时释放,不保留结果。如果希望保留局部变量的值,可以将其定义为静态局部变量,用static说明,定义格式为:static数据类型局部变量表;在定义静态局部变量时,如果不初始化,则自动赋以0(整型和实型)或0(字符型);且每次调用它们所在的函数时,变量不再重新赋初值,而是保留上次调用结束时的值。,7.9.2全局变量的存储方式全局变量,生存期从程序开始到结束,在程序运行期间始终占有内存单元,属于静态存储。全局变量如果允许其它文件使用,应在引用它的文件中用extern说明;如果只限本文件使用,在定义时加static。,7-11,第8章指针,指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确灵活地运用指针可以有效的表示复杂的数据结构,能动态分配内存,能方便地使用字符串,有效而方便地使用数组,在调用函数时能得到多于一个的值,能直接处理内存地址等。本章主要介绍地址和指针的概念、指针变量的定义与应用、数组的指针和指向数组的指针变量、字符串的指针和指向字符串的指针变量、函数的指针和指向函数的指针变量、返回指针值的函数。,8-1,返回目录,8.1地址和指针的概念,8.1.1地址8.1.1.1内存地址内存中存储单元的编号。8.1.1.2变量地址系统分配给变量的存储单元的起始地址称为变量地址。,8.1.2数据的存取方式8.1.2.1直接访问方式直接利用变量的地址进行存取8.1.2.2间接访问方式通过一个变量访问另一个变量的值。8.1.2.3两种访问方式的比较直接访问:甲知道乙在何处,直接去找。间接访问:甲通过丙(指针变量)找乙。,8.1.3指针与指针变量变量的指针:变量的地址称为变量的指针。通过变量的指针能够找到变量。指针变量:专门用于存储其它变量地址的变量称为指针变量。,8-2,8.2指针变量的定义与应用,8.2.1指针变量的定义和相关运算8.2.1.1指针变量的定义定义格式:基类型*指针变量名;说明:星号“*”称为指针变量的定义标识符,表示后面的变量为指针变量;“基类型”表示指针变量所指向的变量的类型。,8.2.1.2指针变量的相关运算1.取地址运算符:”,则p是数组的首地址,也是数组元素a0的地址;*p和a0等价。p+1指向数组的下一个元素,而不是简单地使指针变量p的值加1。p+i和a+i都是数组元素ai的地址;而*(p+i)和*(a+i)就是数组元素ai。指向数组的指针变量,也可以看作是数组名,可按下标法来使用。pi等价于*(p+i)等价于ai。,8-4,8.3.3数组作函数参数数组名作形参时,接收实参数组首元素的地址;作实参时,将数组首元素的地址传递给形参数组。引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有种等价形式:形参、实参都用数组名;形参、实参都用指针变量;形参用指针变量、实参用数组名;形参用数组名、实参用指针变量;,8-5,8.4字符串的指针和指向字符串的指针变量,8.4.1使用字符指针表示和引用字符串字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串。定义字符指针变量的形式如下:char*指针变量名;8.4.2字符串指针做函数参数用字符串指针做函数的参数传递的是地址。,8-6,8.5返回指针值的函数,一个函数可以返回一个int型、float型、char型的数据,也可以返回一个指针类型的数据。返回指针值的函数(简称指针函数)的定义格式如下:函数类型*函数名(形参表),8.6函数的指针和指向函数的指针变量,8.6.1函数指针的概念一个函数在编译时,也被分配一块内存单元,这个内存单元的起始地址称为该函数的指针。8.6.2指向函数的指针变量定义格式:函数类型(*指针变量)();注意:“*指针变量”外的括号不能缺,否则就变成返回指针值的函数了。赋值格式:指向函数的指针变量注意:函数名后不能带括号和参数;函数名前的“其中,成员表列是对结构体数据中每一项数据项的声明,其格式与声明普通变量相同。,9.2结构体变量的定义,9.2.1先定义结构体类型、再定义结构体变量9.2.2在定义结构体类型的同时,定义结构体变量,9-2,9.3结构体变量的引用和初始化,9.3.1结构体变量的引用结构体作为若干成员的集合是一个整体。在引用结构体变量时,不仅要对结构体变量整体进行操作,而且更多的是要访问结构体变量中的每个成员。引用结构体变量成员的方法是:结构体变量名.成员名“.”为成员运算符,其优先级最高,结合性为从左到右。对结构体变量进行输入输出时,只能以成员引用的方式进行,不能对结构体变量进行整体的输入输出。,9.3.2结构体变量的初始化在初始化时,按照所定义的结构体类型的数据结构,依次写出各成员的初始值,在编译时,就将它们赋给此结构体变量中各成员。格式与一维数组相似。,9-3,9.4结构体数组,数组元素是结构体类型的数组,称为结构体数组。定义结构体数组的方法与定义结构体变量的方法类似,只是要多用一个方括号以说明它是一个数组。结构体数组的初始化和普通数组的初始化相同,规则也相同。,9-4,9.5共用体,9.5.1共用体类型定义共用体数据类型,是指将不同的数据项存放于同一段内存单元的一种构造数据类型。定义形式如下:union共用体名成员表列;,9.5.2共用体变量的定义定义共用体变量的方法与结构体变量很相似,形式如下:union共用体名成员列表;union共用体名变量列表;或者union共用体名成员列表变量列表;9.5.3共用体变量的引用引用一个共用体变量中的某一个成员项,引用方式与引用结构体变量中的成员很相似。,9-5,第10章文件,在程序设计中,文件是一个重要的概念,对文件的操作是高级语言必须具备的功能。本章主要介绍介绍C语言文件概述、文件的打开和关闭、文件的读写操作。,10-1,返回目录,10.1C语言文件概述,10.1.1文件的概念文件是指存放在外部存储介质上的数据集合。10.1.2文件的分类10.1.2.1从用户的角度看,文件可分为普通文件和设备文件。10.1.2.2从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件。,10.1.3C语言处理文件的机制C语言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论