已阅读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.2 C语言程序的结构与书写格式,1.2.1 C语言程序举例 1.2.2 C语言程序的结构 1.2.2.1 函数是语言程序的基本单位。 1.2.2.2 函数的一般结构 任何函数(包括main()函数)都是由函数首部和函数体两部分组成。 1. 函数首部: 函数首部即函数第一行,由函数类型、函数名和函数参数表三部分组成。 2. 函数体: 函数体为函数首部下面的花括号内的部分。 函数体一般由声明部分和执行部分构成:声明部分定义所用到的变量,声明所调用的函数等; 执行部分有若干语句组成。,1-3,1.2.2.3 C语言程序的执行 C语言程序总是从main()函数的第一条执行语句开始执行,执行完main()函数的最后一 条语句,则整个程序执行结束,而其他函数则通过嵌套调用得以执行。,1.2.3 C语言程序书写格式 1. 行的书写格式自由,可从一行的任何位置开始书写。 2. 一行可书写多条语句,一条语句也可分写在几行上。 3. 所有语句都必须以分号“;”结束。 4. 允许使用注释。 C语言的注释格式有两种:/,/* */。 5. 在书写程序时,通常采用缩格形式书写分层结构的程序。,1-4,1.3 C程序上机步骤 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。 十六进制(以数字0x或0X开头),数码为09,AF或af。 在C语言中,整型常量可分为三种类型: 基本整型。 无符号基本整型(在数值后面加U或u)。 长整型(在数值后面加L或l。,2-5,2.3.2 整型变量 根据占用内存字节数的不同,整型变量分为三类: (1) 基本整型,以int表示。 (2) 短整型,以short int或short表示。 (3) 长整型,以long int或long表示。 根据在内存中的存储形式,整型数据又分为有符号和无符号两种。,2-6,整型数据的分类,2.3.3 整型数据的溢出 如果在数据处理时,超出了变量的取值范围,就会发生“溢出”现象。,2.4 实型数据 2.4.1 实型常量 实型常量即实数,在C语言中又称浮点数,其值有两种表达形式。 十进制小数形式,有数字和小数点组成,要求小数点的两边必须有数。 指数形式,格式为 E(e),2-7,2.4.2 实型变量 C语言的实型变量分为三种:单精度型(float)、双精度型(double)、 长双精度型(long double),实型数据在内存中是按指数形式存储的 。,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.1 C语句概述 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.1 putchar()函数(字符输出函数) putchar()函数是字符输出函数,其一般形式为: putchar(c) 功能:向显示器输出一个字符。 3.2.1.2 getchar()函数(字符输入函数) getchar()函数是字符输入函数,其一般形式为: getchar() 功能:从键盘输入一个字符。,3-4,3.2.2 printf()函数(格式输出函数) 3.2.2.1 printf函数()(格式输出函数)的格式 printf()函数是格式输出函数,其一般格式如下: printf(“格式控制字符串“ ,输出表列); 功能:按指定格式向终端(显示器)输出若干任意类型的数据。 3.2.2.2 printf()函数的格式字符 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.3 scanf()函数(格式输入函数) 3.2.3.1 scanf()函数(格式输入函数)的格式 scanf()函数是格式输入函数,其一般格式如下: scanf(“格式控制字符串“,地址列表); 功能:按指定的格式从终端(键盘)上把数据输入到指定的变量之中。 3.2.3.2 scanf()函数的格式字符 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 #include void main() 变量定义; 输入数据 数据运算部分 输出部分 ,顺序结构程序的组成,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 逻辑运算符和逻辑表达式,其中,“!”是单目运算符,只要求有一个运算量;“&”和“|”是双目运算符,要求运算符的两边均有运算量(操作数。 逻辑运算符的结合性自左至右。算术运算符、关系运算符、逻辑运算符、赋值运算符的运算次序为:!算术运算符关系运算符&|赋值运算符。,4.2.2 逻辑表达式 逻辑表达式:用逻辑运算符将关系表达式和逻辑量连接起来的式子,称为逻辑表达式。逻辑表达式的值是一个逻辑值,即“真”或“假”。 逻辑运算符的运算规则: “!”:取运算对象的逻辑值的相反值。 “&”:只有当参加运算的两个逻辑值都为真时,结果才为真(1)。 “|”:只有当参加运算的两个逻辑值都为假时,结果才为假(0)。 注意: 当“&”运算符左边的表达式的值已是0时,右边的表达式不再求解,其表达式的结果为0; 当“|”运算符左边的表达式的值已是1时,右边的表达式不再求解,其表达式的结果为1。,4-5,选择结构包括单分支选择结构、双分支选择结构和多分支选择结构。,4-6,4.3 选择结构的控制语句,4.3.1 单分支选择结构 单分支选择结构是C语言最简单的选择结构,语句格式:if (表达式) 语句块 语句的执行过程是:计算if关键字后面小括号内的表达式的值,如果表达式的值为非 0,则执行表达式后面的语句块;如果表达式的值为0,则不执行表达式后面的语句块,而 直接执行if语句后面的语句。 语句块可以是一条语句,也可以是多条语句。如果是一条语句,则花括号“”可以 省略。,4-7,4.3.2 双分支选择结构 4.3.2.1 if else 语句 双分支选择结构是C语言最典型的选择结构,其语句格式是: if (表达式) 语句块1 else 语句块2 语句的执行过程是:计算if关键字后面小括号内的表达式的值,如果表达式的值为非 0,则执行表达式后面的”语句块1”;如果表达式的值为0,则执行else后面的“语句块2”。 “语句块1”和“语句块2”可以是一条语句,也可以是多条语句。如果是一条语句,则花 括号“”可以省略。,4-8,4.3.2.2 条件运算符 在双分支选择结构if else 中,如果在表达式为“真”或“假”时,“语句块1”和“语句块 2”都只执行一个单一的赋值语句,并且都是给同一个变量赋值,则可以用简单的条件运算 符来处理。条件运算符是一个三目运算符,运算时需要有三个运算对象。由条件运算符和 相应的运算对象构成的表达式,称为条件表达式。条件表达式的一般形式是: 表达式1?表达式2:表达式3 执行过程是:先求解“表达式1”的值,若“表达式1”的值为真(非0),则整个表达式的 值为“表达式2”的值;若“表达式1”的值为假(0),则整个条件表达式的值为“表达式3”的 值。 注意: 条件运算符的优先级高于赋值运算符,但低于关系运算符和逻辑运算符; 条件运算符的结合方向为自右至左; 条件表达式不能取代一般的if else 语句,只有当if else 语句中的两个分支 语句都同时给一个变量赋值时才能替代; 条件表达式中的表达式类型可以不同。,4-9,4-10,4.3.3 多分支选择结构 4.3.3.1 if else 的嵌套语句结构 在if语句中又包含一个或多个if语句,称为if语句的嵌套。一般有以下几种形式: if (表达式1) 语句块1 else if (表达式2) 语句块2 else if (表达式3) 语句块3 else if (表达式n) 语句块n else 语句块n+1 语句的执行过程是:依次判断if后面表达式是否成立,若成立,则执行其后对应的语句, 然后跳到整个结构之外继续执行程序;如果所有的表达式均不成立,则执行“语句块n+1”, 然后继续执行后续程序。下图是语句的执行过程。,4-11, if (表达式1) if (表达式2) 语句块1 else 语句块2 else 语句块3 if (表达式1) if (表达式2) 语句块1 else 语句块2 else if (表达式3) 语句块3 else 语句块4 注意:else总是与它上面最近的尚未与else配对的if配对。,4-12,4.3.3.2 switch语句结构 当分支较多时,使用嵌套的if语句层数多,程序冗长而且可读性降低。此时可以考虑 使用switch语句(称开关语句或多路分支语句)来处理多分支选择。 语句格式:switch(表达式) case 常量表达式1: 语句1 case 常量表达式2: 语句2 case 常量表达式3: 语句3 case 常量表达式n: 语句n default: 语句n+1 语句的执行过程是:先计算表达式的值,然后逐个与case后面常量表达式的值相比 较,当表达式的值与某个常量表达式的值相等时,就以此作为入口,执行switch结构中 该入口后面的所有语句。当表达式的值与所有case后面的常量表达式的值均不相等时, 则执行default后面的语句。,4-13,第5章 循环结构程序设计,循环结构是C语言的三种基本结构之一,也是程序流程控制中一种很重要的结构。在许多 实际问题的处理中都要用到循环控制。几乎所有的应用程序都包含循环,它与顺序结构、选择结构一起实现复杂结构的程序设计。 本章主要介绍三种循环语句的作用及使用方法,循环嵌套的设计方法,continue语句和break语句在循环结构中的作用。,5-1,返回目录,5.1 循环结构概述 在处理实际问题时人们会发现,有些问题的处理过程是采用重复的动作来完成的。如,统计学生某一学期某门课程的平均成绩,对每一位学生成绩的输入和累加就是一个重复的过程。这种重复执行的过程在计算机的程序设计中称为循环。 循环形式根据实际问题的不同,其表现形式也不同,有的是已知重复(循环)次数,如上面提到的统计学生某一学期某门课程的平均成绩,学生人数定了,重复计算(循环)的次数也就确定了;有的则不能预知重复(循环)次数。C语言提供了三种实现循环过程的循环结构:当型循环(while语句)、直到型循环(dowhile语句)和for循环结构。,5-2,5.2 while循环语句 while语句的一般格式: while(循环条件表达式) 循环体语句 语句的执行过程是:在执行while语句时,先对循环条件表达式进行计算,若其值为真(非0),则执行循环体语句,然后重复上述过程,直到条件表达式的值为假(0)时,循环结束,程序控制转至while语句的下一个语句。这种先判断循环条件的循环称为“当型”循环。,5-3,5.3 dowhile循环语句 dowhile语句的一般格式: do 循环体语句 while(循环条件表达式); 语句的执行过程是:先执行循环体语句,然后对循环条件表达式进行计算,若其值为真 (非0),则重复上述过程,直到条件表达式的值为假(0)时,循环结束,程序控制转至 while语句的下一个语句。与while语句相比,dowhile语句至少执行一次循环体。这种先执 行循环体语句的循环称为“直到型”循环。,5-4,5.4 for循环语句 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.1 break语句 在循环体中,break跳出循环体(即结束循环),执行循环体下面的语句。break只能跳 出它所在的那一层循环。语句格式为: break; 5.5.2 continue语句 语句的功能是结束本次循环的执行,但不结束整个循环结构的执行过程。语句格式为: continue; 5.5.3 goto语句 它的作用是使程序流程从所在处转向本函数内的某一处,程序必须指出转向的目的地, 目的地用标号指出。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 一维数组的存储结构 数组在定义之后,其元素在内存中是连续存放的,下图是char name5在内 存中的存放情况。,6-3,6-4,数组名代表这一段内存的起始地址,由于一个字符在内存中占有一个字节,而每一个字符数组元素只能存放一个字符,所以可以根据元素的下标和元素的起始地址计算出某一个元素的内存地址,从而实现数组元素的随机访问,计算公式如下: 数组元素地址=数组起始地址+元素下标*每个数组元素所占字节数 假设name在内存中的起始地址为2000,则name4的地址为:2000+4*1=2004。 6.2.2.2 一维数组的初始化 给所有元素赋初值 如:int a5=0,1,2,3,4; 可以只给一部分数组元素赋初值 如:int a10=0,1,2,3,4; 在对全部数组元素赋初值时,可以不指定数组长度 如:int a =0,1,2,3,4; 省略数组长度,系统将根据所给出的数据个数自动确定数组的长度,即数组长度与数据个数相同。 要想使数组中所有的数组元素值都为0,则采用如下形式: int a10=0,0,0,0,0,0,0,0,0,0; 或int a10=0;,6.2.3 一维数组元素的引用 数组元素的引用是指在程序中使用数组中各元素的过程。其格式如下: 数组名下标 下标是指所要访问的数组元素在数组中的位置,它与定义数组时所指定的数组大小不 同,它可以是整型的常量,也可以是已赋值的整型变量。C语言规定数组的下标从0开始编 号,因此最后一个元素的下标为数组的长度减1。 说明: 数组元素的引用与同类型的一般变量使用方式一样。但需注意:下标不能超出范 围。如定义了“int a10;”,同时又引用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语言中,二维数组的存放形式是按行存放,即存完第一行的数据,依次存放第二 行的数据,第三行的数据等等。如定义了“int scores34;”,则逻辑结构展开为 scores00,scores01,scores02,scores03 scores10,scores11,scores12,scores13 scores20,scores21,scores22,scores23 6.3.2.2 二维数组的初始化 与一维数组一样,二维数组也是在定义数组时给数组各元素赋初值。 按行给二维数组赋初值。 如:int a23=1,2,3,4,5,6; 按数组的排列顺序对各数组元素赋初值(所有数据写在一个花括号内)。 如:int b23=1,2,3,4,5,6; 可以对部分数组元素赋初值。 如:int c34=1,5,9; 在对全部数组元素赋初值时,数组第一维的长度可以不指定。但其它维必须指 定,系统会自动根据所给的初值和其它维的下标值来确定第一维下标的长度。 如:int e 3=1,2,3,4,5,6;,6-7,6.3.3 二维数组元素的引用 二维数组元素引用的一般格式如下: 数组名下标1下标2 ; 如果定义了“int a55;”,则下面是对a数组元素的合法引用。 6.3.4 二维数组的应用 6.4 字符数组 数组中所有的元素都是字符型数据,这样的数组称为字符数组。也就是说,字符数组 是专门用来存放字符的,且数组的每个元素只能存放一个字符。字符数组的定义及初始化 与一般数组相同。 6.4.1 字符数组的定义 定义一维字符数组:char 数组名常量表达式; 如:char c10; 表示定义一个一维字符数组c,其中可以存放10个字符。 定义二维字符数组:char 数组名常量表达式1常量表达式2; 如:char names510; 表示定义一个二维字符数组names,共有5行,一行存放一个 姓名,总共可以存放5个人的姓名,其中每一个人的姓名不能超过10个字符。,6-8,6.4.2 字符数组的初始化 给所有元素赋初值 如:char c5= h, a, p, p, y; 可以只给一部分数组元素赋初值 如:char c10= h, a, p, p, y; 在对全部数组元素赋初值时,可以不指定数组长度。 如:char c=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.1 strcat(字符数组1,字符数组2) 这是一个字符串连接函数。其作用是连接两个字符数组中的字符串,将字符数组2中的字 符串接到字符数组1的字符串的后面,结果放在字符数组1中,函数返回字符数组1的地址。 6.4.6.2 strcpy(字符数组1,字符数组2) 这是一个字符串复制函数。其作用是将字符数组2中的字符串内容复制到字符数组1中。 函数的返回值是字符数组l的起始地址。 6.4.6.3 strlen(字符串) 这是一个求字符串长度的函数。其作用是计算字符串的长度。函数的返回值是字符串的 实际长度,即第一个“0”前的所有字符的个数。字符串的长度不包括字符串中的最后一个结 束符“0”。 6.4.6.4 strcmp(字符串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.1 C语言程序结构 一个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 二维数组作函数的参数 二维数组元素可以作函数的实参,和一维数组元素、普通变量作函数的实参相同。 二维数组名可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《双半桥直流谐振变换器控制策略研究》
- 《外源Ca2+对盐胁迫下珠美海棠幼苗耐盐特性的影响》
- 《一种植物和三种高等真菌的化学成分及其生物活性研究》
- 2024冷却塔用泵采购合同
- 《门德尔松《d小调庄严变奏曲》Op.54的音乐分析与演奏诠释》
- 牛津译林八年级下Unit3知识梳理学案
- 专题08电化学-原卷版
- 2024年海东客运资格证题库
- 2024年山东客运从业资格考试
- 人教部编版六年级语文上册第20课《青山不老》精美课件
- 餐饮行业初期投资预算分析
- 辽宁省重点高中沈阳市郊联体2023-2024学年高三上学期期中生物试题(解析版)
- 退费申请表模板(直接打印)
- 剪映:手机短视频制作-配套课件
- 西气东输二线25标段山岭隧道内管道安装技术
- 防校园欺凌-课件(共28张PPT)
- 第6章 智能网联汽车测评技术
- 单向板结构设计
- 普通高等学校学生转学申请表
- 房租、水、电费(专用)收据Excel模板
- 习近平总书记关于教育的重要论述研究学习通章节答案期末考试题库2023年
评论
0/150
提交评论