收藏 分享(赏)

第2章 编程基础.ppt

上传人:hskm5268 文档编号:7255480 上传时间:2019-05-10 格式:PPT 页数:92 大小:414KB
下载 相关 举报
第2章 编程基础.ppt_第1页
第1页 / 共92页
第2章 编程基础.ppt_第2页
第2页 / 共92页
第2章 编程基础.ppt_第3页
第3页 / 共92页
第2章 编程基础.ppt_第4页
第4页 / 共92页
第2章 编程基础.ppt_第5页
第5页 / 共92页
点击查看更多>>
资源描述

1、第2章 C+编程基础,2.1 数据类型与表达式 2.2 程序的控制结构 2.3 函数 2.4 数组 2.5 指针 2.6 构造数据类型 习题,2.1 数据类型与表达式,一个程序要运行,就要先描述算法。描述一个算法应先说明算法要用的数据,数据以变量或常量的形式来描述,每个变量或常量都有数据类型。C+ 中的数据类型分为基本类型和非基本类型,如图2-1所示。,图2-1 C+数据类型,表2-1列出了常用基本数据类型的取值范围。需要说明的是,在不同的系统中,每个变量类型所占的字节数目可能有所不同,这里列出的是在VC+编译环境中的情况。,表2-1 常用基本数据类型描述,2.1.1 常量1整型常量2实型常量

2、3字符常量 表2-2列出了C+预定义的转义序列。,表2-2 C+预定义的转义序列,4字符串常量字符串常量简称字符串,是用一对双引号括起来的字符序列,例如“China“就是一个字符串常量。5布尔常量,2.1.2 变量在程序的执行过程中其值可以变化的量称为变量,变量需要用标识符来命名。变量在使用之前需要首先声明其类型和名称。变量声明的形式如下:变量名1,变量名2,变量名n;在声明一个变量的同时,也可以给它赋以初值。,2.1.3 引用引用是个别名,当建立引用时,程序用另一个变量或对象(目标)的名字初始化它。自此,引用作为目标的别名而使用,对引用的改动实际是对目标的改动。引用的声明形式为&引用名=目标

3、名或& 引用名=目标名,其中:(1) 引用名是为引用型变量所起的名字,它必须遵循变量的命名规则。(2) 前面的数据类型就是它所引用目标的数据类型。例如,引用一个整型变量:int someInt;int声明rInt是对整数的引用,初始化为引用someInt。在这里,要求someInt已经声明或定义。引用不是值,不占存储空间,声明引用时,目标的存储状态是不会改变的。,例2-1 如何建立和使用引用例题。#includevoid main()int someInt;int,程序运行结果为someInt:6rInt:6someInt:7rInt:7在上述程序中,引用rInt用someInt来初始化。以后

4、,无论改变someInt或rInt,实际上都是指someInt,两个值都一样,对引用的理解可参见图2-2。,图2-2 引用与变量的关系,2.1.4 表达式1运算符C+语言中定义了丰富的运算符,如算术运算符、关系运算符、逻辑运算符等,有些运算符需要两个操作数,使用形式为运算符 在表2-3中列出了C+中全部运算符的优先级与结合性。,表2-3 运算符优先级,2表达式表达式在使用时要注意以下几点:(1) 一个常量或标识对象的标识符是一个最简单的表达式,其值是常量或对象的值。(2) 一个表达式的值可以用来参与其他操作,即用作其他运算符的操作数,这就形成了更复杂的表达式。(3) 包含在括号中的表达式仍是一

5、个表达式,其类型和值与未加括号时的表达式相同。, 隐含转换。在混合运算时,对于二元运算符要求两个操作数的类型一致,若参加运算的操作数类型不一致,则系统自动对数据进行转换(即隐含转换),具体的规则如下:l 算术运算和关系运算转换的基本原则是将低类型数据转换为高类型数据。各种类型的高低顺序如下:char short int unsigned long unsigned-long float double低 高l 逻辑运算符要求参与运算的操作数必须是bool型,如果操作数是其他类型,则系统自动将其转换为bool型。转换方法是:非0数据转换为true,0转换为false。,l 位运算的操作数必须是整数

6、,当二元位运算的操作数是不同类型的整数时,编译系统会自动进行类型转换。l 赋值运算要求左值(赋值运算符左边的值)与右值(赋值运算符右边的值)的类型相同。 强制类型转换。强制类型转换又称为显式转换,是通过类型标识符和括号来实现的,其语法形式有两种:(表达式)或(类型标识符),l 位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,编译系统会自动进行类型转换。l 赋值运算要求左值(赋值运算符左边的值)与右值(赋值运算符右边的值)的类型相同。 强制类型转换。强制类型转换又称为显式转换,是通过类型标识符和括号来实现的,其语法形式有两种:(表达式)或(类型标识符),2.2 程序的控制结构,

7、2.2.1 选择结构用if语句可以实现简单选择结构。其语法形式为if(表达式) 语句1else 语句2执行顺序是:首先计算表达式的值,若表达式值为true,则执行语句1;否则执行语句2。,if语句中的语句2可以为空,当语句2为空时,else可以省略,成为如下形式:if(表达式) 语句1其中,语句1和语句2不仅可以是一条语句,而且可以是大括号括起来的多条语句,即复合语句。,2.2.2 switch语句在算法中,虽然需要进行多次判断选择,但都是判断同一个表达式的值,这样就没有必要在每一个嵌套的if语句中都计算一次表达式的值,为此C+中有switch语句专门来解决这类问题。switch语句的语法形式

8、如下:switch(表达式) case 常量表达式1:语句1case 常量表达式2:语句2case 常量表达式n:语句ndefault: 语句 n+1,使用switch语句应注意下列问题:(1) switch后面括弧内的括弧“表达式”的值只能是整型、字符型和枚举型。(2) 各常量表达式的值不能相同,且次序不影响执行结果。(3) 每个case分支可以有多条语句,但不必用。(4) 每个case语句只是一个入口标号,通常我们只需执行一个case后的语句,因此,每个case分支的最后应该加break语句,用来结束整个switch结构,否则从入口点开始一直执行到switch结构的结束点。(5) 当若干分

9、支需要执行相同操作时,可以使多个case分支共用一组语句。,2.2.3 循环结构在C+中有三种循环控制语句:1while语句while语句的语法形式为:while(表达式) 语句执行顺序是:判断一个条件表达式(循环控制栏件),以便决定是否应当进入和执行循环体,当条件满足时进入循环,否则不再执行循环。,2do-while语句语法形式:do 语句while(表达式);执行顺序是:当流程执行到do后,立即执行循环体语句,然后再判断循环条件表达式的值。当表达式为true时,继续执行循环体;当表达式为false时,则结束循环,该语句结构使循环至少执行一次。,3for语句for语句的使用最为灵活,既可以用

10、于循环次数确定的情况,也可以用于循环次数未知的情况。for语句的语法形式如下:for(表达式1;表达式2;表达式3)语句,for语句的执行流程为:(1) 首先计算表达式1的值。(2) 再计算表达式2,如果表达式2的值为false,则退出循环。(3) 如果表达式2的值为true,则执行一次循环体,然后计算表达式3的值。(4) 转回(2),表达式2的值决定是否继续执行循环体。,2.2.4 其他控制语句1break语句 break 语句只用于switch语句或循环体中,作用是使程序从switch语句内跳出或结束循环,继续执行逻辑上的下一条语句。2continue语句continue语句仅用于循环体中

11、,其作用是结束本次循环,接着开始判断循环条件,决定是否继续执行下一次循环。,3goto语句goto语句的语法格式为goto 其中,“语句标号”是用来表示语句的标识符,放在语句的最前面,并用冒号“:”与语句分开。,2.3 函 数,2.3.1 函数定义一个完整的函数定义由两部分组成,即函数头与函数体。函数定义的一般语法形式为:(形式参数表)说明性语句序列;实现函数功能的语句系列;,其中,类型标识符规定了函数的返回值类型。函数的返回值是返回给主调函数的处理结果,由函数体部分的return语句带回。无返回值的函数其类型标识符为void,不必有return语句。形式参数表(简称形参表)的内容如下:类型l

12、 形参名1,类型2 形参名2,类型n 形参名n,2.3.2 调用函数调用函数必须遵守先定义后调用的原则,否则,需要在调用函数之前在主调函数中声明函数原型。函数原型声明形式为(含类型说明的形参表);函数的调用形式:(实参1,实参2,实参n),2.3.3 默认参数的函数在函数定义中通过赋值运算就可指定默认参数值。一旦程序在调用该函数时,如果给出实参,则用实参初始化形参;如果没有给出实参,则C+编译系统自动以预先赋值的默认参数值作为传入数值。需要特别注意:默认形参值必须按从右向左的顺序定义。在有默认值的形参右面,不能出现无默认值的形参。因为在调用时,实参初始化形参是按从左向右的顺序。,2.3.4 内

13、联函数内联函数与一般函数不同的是,它不是在调用时发生转移,而是在编译时将函数体嵌入在每一个调用语句处。这样就相对节省了参数传递、系统栈的保护与恢复等的开销。内联函数的定义形式为:(含类型说明的形参表)函数体,例2-2 内联函数例题。#include #include inline int max(int a,int b)if(ab)return a;elsereturn b;,void main()int a,b,c,d;a=210;b=150;c=20;d=max(a,b);d=max(d,c);,/编译时两个调用处均被替换为max函数体语句cout“The biggest of“setw(

14、5)asetw(5)bsetw(5)c“ is “dendl;程序运行结果为The biggest of 210 150 20 is 210,2.3.5 系统函数的使用系统函数的原型声明已经全部由系统提供,并且已分类存于不同的头文件中。程序员需要做的事情,就是用include指令嵌入相应的头文件,然后便可以使用系统函数。,2.4 数组,2.4.1 一维数组数组在使用前必须先声明。声明一个一维数组的形式如下:数组长度注意:数组长度是个常量表达式。数组中的每个元素可以当成普通的变量使用。访问一维数组元素的形式如下:下标注意:下标的值也是从0开始,不能超过该维的长度减1。,形式1:数组长度=第0个元

15、素值,第1个元素值,第n-1个元素值形式2: =第0个元素值,第1个元素值,第n个元素值,2.4.2 多维数组多维数组的声明形式如下:长度1长度2 长度n访问多维数组中的元素:第1维下标第2维下标第n维下标二维数组的初始化形式如下:形式1:第1维长度第2维长度=第0个第2维数据组,第1个第2维数据组,第n-1个第2维数据组 其中,n等于第1维长度。,形式2:第1维长度第2维长度=第0个元素值,第1个元素值,第m个元素值其中,m小于或等于第1维长度第2维长度。2.4.3 数组应用1排序,例2-3 已知一个一维数组中的元素为1、7、3、22、9、5,现要求以递增顺序对这个数组中的元素进行排列,结果

16、为1、3、5、7、9、22。下面给出冒泡排序法的程序代码。#include void main()int a6=1,7,3,22,9,5;int i,j,t,flag;for(i=0;i6;i+),flag=0;for(j=0;jaj+1) t=aj;aj=aj+1;aj+1=t;flag=1;,if(flag=0) break;cout“排序后的数组为:n“;for(i=0;i6;i+)cout“ “ai“n“;,2查找二分查找法查找函数代码:#include void efFind(int DataArray,int nSize,int fValue) int flag=0; /设置fla

17、g为查找标记int nStart=0; /开始元素下标int nEnd=nSize-1; /结尾元素下标int nMid; /二分法中间元素下标while(nStart=nEnd),nMid=(nStart+nEnd)/2; /计算中间元素下标if(DataArraynMid=fValue)flag=1; /标记查找成功break; /退出循环,/*如果待查找的值大于中间元素的值,则取后半边继续查找;否则,取前半边继续查找*/if(fValueDataArraynMid)nStart=nMid+1;elsenEnd=nMid-1;if(flag)cout“元素找到了!是第 “nMid+1“ 个

18、“endl;elsecout“数组中没有要找的元素!“endl;,3统计例2-4 输入若干整数,其值均在14的范围内,使用借用数组下标值进行统计的方法统计每个整数出现次数的程序代码如下:#include void main()int tj4=0,0,0,0; /存放统计结果int tjData;,couttjData;while(tjData0,程序运行结果为:请输入数据(14),输入其他时结束:1 2 3 4 1 2 6统计结果为:1 22 23 1 4 1,2.4.4 数组作为函数的参数要将整个数组作为参数传递给函数,可通过传递不带方括号的数组名来进行,其形式大体上有以下两种:形式1:(类

19、型标识符 数组名,int长度)形式2:(类型标识符 数组名长度),例2-5 某次歌唱比赛有5名选手参加,有6名评委分别为选手打分,得分如表2-4所示。,表2-4 歌唱比赛记分表,程序代码如下:#include double Context(double pArry,int nNum) /评分函数int nInum;double fMark,fMax,fMin; /定义记录成绩、最高分、最低分的变量fMark=fMax=fMin=pArry0;for(nInum=1;nInumnNum;nInum+),if(pArrynInumfMax)fMax=pArrynInum;if(pArrynInum

20、fMin)fMin=pArrynInum;fMark+=pArrynInum; /fMark先记录着所有评委的总分return (fMark-fMax-fMin)/4; /计算出平均分并返回调用函数,void main()double pfSoreData569.31,9.20,9.00,9.40,9.35,9.20,9.71,9.52,9.50,9.66,9.49,9.57,8.89,8.80,9.10,9.25,8.90,9.00,9.38,9.50,9.40,9.20,9.90,8.90,9.30,8.84,9.40,9.45,9.10,8.89;,int nRow;cout.preci

21、sion(3); /设置小数点后的位数for(nRow=0;nRow5;nRow+)coutnRow+1“ 号选手成绩为:“;coutContext(pfSoreDatanRow,6)endl;,程序运行结果为:1号选手成绩为:9.262号选手成绩为:9.563号选手成绩为:8.974号选手成绩为:9.375号选手成绩为:9.17,2.4.5 数组与字符串 1字符数组的初始化字符型数组通常有两种特殊的初始化方法,形式如下:形式1:char =“字符串“形式2:char =“字符串“,这两种形式产生的效果是相同的,它们会产生一个以字符串常量中的每个字符为数组元素且在末尾加个“0”的特殊数组,例如

22、:char pMyStrinq=“This is a computer“;执行后,pMyString数组中的元素依次是:T,h,i,s, ,a, ,c,o,m,p,u,t ,e,r,0。它等同于: char pMyString=T,h,i,s, ,a, ,c,o,m,p,u,t,e,r,0;或char pMyStrinq=“This is a computer“;,2字符串的基本运算1) 求字符串的长度假设字符串保存在数组pString中,求字符串长度的程序代码如下:char pString=“abcd“;int nSize=0;while(pStringnSize!= 0)nSize+;执行

23、完毕后,整型变量nSize中保存的值就是字符串pString的长度。,2) 字符串的复制假设源字符串保存在数组pSource中,目的字符型数组为pDestination,则字符串复制的程序段如下:char pSource=“abcd“;char pDestination=5; /源字符串长度+1int nIndex=0;while(pSourcenSize!=0 )pDestinationnIndex=pSourcenIndex;nIndex+;pDestinationnIdex= 0; /标识字符串结束,3) 字符串的连接假设源字符串保存在字符数组pDest中,要连接进来的字符串保存在字符数

24、组pTocat中,则进行字符串连接的程序代码为:char pTocat=“efg“;char pDest8=“abcd“; /8=现字符串长度+要连接进来的字符串长度+1int nSize=0;int nIndex=0;while (pDestnSize!=0) /找到被要连接的字符串的尾部nSize+;,3) 字符串的连接假设源字符串保存在字符数组pDest中,要连接进来的字符串保存在字符数组pTocat中,则进行字符串连接的程序代码为:char pTocat=“efg“;char pDest8=“abcd“;/8=现字符串长度+要连接进来的字符串长度+1int nSize=0;int nI

25、ndex=0;while (pDestnSize!=0) /找到被要连接的字符串的尾部nSize+;,dopDestnSize+=pTocatnIndex;nIndex+; while(pTocatnIndex!= 0);pDestnSize= 0;,2.5 指 针,2.5.1 指针型变量1指针型变量的声明指针型变量是保存指针数据类型的变量。定义指针变量的一般形式是:*指针变量名,2指针的基本操作与指针有关的基本运算符有以下两个:(1) &变量名,&为取地址运算符,用来获取变量的首地址。(2) *指针变量名,*为指向运算符,用来获取指针变量所指向变量的值。&和*运算符都是单目运算符,其优先级高

26、于所有双目运算符,采用从右到左的结合性。,3指针变量的初始化与引用4指针的算术运算5const修饰符与指针const与指针在一起使用,情况比较复杂,可简单归纳为三种:指向常量的指针、常指针和指向常量的常指针。(1) 指向常量的指针:是指一个指向常量的指针变量。例如:,const char *name =“chen“; /声明一个名为name 的指针变量name3= a; /错误,不容许改变指针所指的常量name =“zhang“; /正确,可以改变指向常量的指针 name的值,(2) 常指针:是指把指针本身,而不是它指向的对象声明为常量。例如:char *const name=“chen“;

27、/声明一个名为name的常指针name3= a /正确,所指的数据可以改变name=“zhang“; /错误,不容许改变指针本身,(3) 指向常量的常指针:是指这个指针本身不能改变,它所指向的数据值也不能改变。例如:const char *const name=“chen“; /声明一个指向字符型常量的常指针name3= a; /错误,不能改变指针所指的值name=“zhang“; /错误,不能改变指针本身,2.5.2 指针与字符串例如,用字符数组的形式:char pString=“I love China!“;如果直接用字符型指针的形式,可以表示为char *cString=“I love

28、China!“;使用char*型指针变量要注意以下两点:(1) char*型指针变量可以在定义时进行初始化,其形式为char *指针变量名=“字符串“;,(2) char*型的指针变量(或函数参数)既可以用于接收字符串常量,也可以接收字符型数组。例如:char pString=“I love China!“;char *myString=“This is a string.“;myString=pString;,例2-6 使用char*型指针变量重写字符串的复制的程序代码。#include void copy_string(char *from,char *to)for(;*from!= 0;

29、from+,to+)*to=*from;*to=0; /赋值字符串结束标识,void main()char pSource=“I am a teacher.“;char pDestination=“you are a student.“; /pDestination字符串长度pSource字符串长度copy_string(pSource,pDestination);coutpSourceendl;coutpDestinationendl;,程序运行结果为:I am a teacher.I am a teacher.C+提供了许多操作字符串数据的标准库函数,如比较字符串、搜索字符串中的字符、确定

30、字符串长度等,只要我们在使用它们前在应用程序的开头添加包含“string.h”头文件的预处理命令#include ,在程序设计时就可直接引用。表2-5总结了这些函数。,表2-5 C+字符串处理库(标准库)中常用的字符串操作函数,2.6 构造数据类型,2.6.1 结构体1结构体类型的定义定义一个结构体类型的一般形式是:struct 成员名l;成员名2;成员名n;,2结构体变量的声明声明结构体变量一般有两种形式,分别是:变量名struct 变量名另外,声明结构体变量也可在定义结构体类型的同时进行,其形式为:struct 结构体类型名成员名l;成员名2;成员名n;变量1,变量2, 变量n;,3结构体

31、变量的初始化所谓结构体变量的初始化,就是在定义结构体变量的同时,对它的每个成员赋初值,形式与数组赋初值非常相似,其形式为变量名=表达式1,表达式2,表达式n,4结构体变量的引用访问一个结构体变量成员的形式是:.如果一个结构体中包含另一个结构体作为成员,则访问该成员中的成员时,要使用如下形式:,2.6.2 共用体定义共用体类型,其方法同定义结构体相似:union 共用体名成员名1;成员名2;成员名n;变量1,变量2,变量k,;,声明共用体变量的形式是:变量名注意:共用体变量不允许给其赋初值。共用体变量中成员的访问形式是:.,2.6.3 枚举类型枚举类型也是一种构造类型,是一种允许用符号代表数据的

32、C+语言的数据类型,它是一系列有标识名的整型常量的集合,其主要功能是增加程序代码的可读性。定义形式如下:enum 枚举变量说明:缺省时,系统为每一个枚举常量都对应一个整数,并从0开始,逐个增1,这些缺省的值也可重新指定。,习 题,2-1 简答题(1) if(x=3)和if(x=3)这两条语句的差别是什么?(2) 画出求解以下问题的流程图: 有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换。 依次将10个数输入,要求将其中最大的数打印出来。 求两个数m和n的最大公约数。,(3) 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗? (4) 比较值调用和引用调用的相同点与不同

33、点。(5) 什么叫内联函数?它有哪些特点?(6) 当实参为一个数组名时,对应的形参必须是什么类型?,2-2 编程题(1) 根据以下函数关系编写程序,对输入的每个x值,计算出相应的y值。 0 x0 x 0x10y= 10 10x20-0.5x+20 20x40-2 x40(2) 编程求1000之内的所有“完数”。所谓“完数”,是指一个数恰好等于它的因子之和。例如,6是完数,因为6=1+2+3。,(3) 编程打印乘法九九表。,(4) 编程实现输入一个成绩,输出相应的五分制成绩。设90分以上为“A”,8089分为“B”,7079分为“C”,6069分为“D”,60分以下为“E”。(5) 用递归的方法

34、编写函数求5!,并观察递归调用的过程。(6) 定义一个求绝对值函数的模板。(7) 编写程序,打印如下的杨辉三角形:11 11 2 11 3 3 11 4 6 4 1,(8) 将一个一维数组中相同的元素删除到只保留一个,然后按由大到小的顺序输出。(9) 编写程序,求出两个44的矩阵A与B的和及差,并按矩阵形式输出。进一步考虑求出矩阵A与B的乘积。(10) 应用指针,编写字符串连接处理函数。(11) 应用指针,编写一个函数strcmp(),实现两字符串s1和s2的比较。如果s1=s2,则返回值为0。如果返回它们两者第一个不同字符的ASCII码差值,并且若s1s2,则输出正值;若s1s2,则输出负值。(12) 输入10个国家名称,用指针数组实现排序输出。,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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