第一章C概述.ppt

上传人:本田雅阁 文档编号:2504396 上传时间:2019-04-04 格式:PPT 页数:77 大小:964.51KB
返回 下载 相关 举报
第一章C概述.ppt_第1页
第1页 / 共77页
第一章C概述.ppt_第2页
第2页 / 共77页
第一章C概述.ppt_第3页
第3页 / 共77页
亲,该文档总共77页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第一章C概述.ppt》由会员分享,可在线阅读,更多相关《第一章C概述.ppt(77页珍藏版)》请在三一文库上搜索。

1、C+ 面向对象程序设计,计算机信息工程学院 谭晓华, 教材 谭浩强:C+面向对象程序设计 , 清华大学出版社,2006 上机软件 Visual C+6.0,考试成绩,平时成绩(30) (考勤、书面作业、上机练习、期中考试) 期末考试(70) (闭卷笔试),本课程的学习要点,掌握C+语言的基本概念和语法 了解面向对象程序设计方法 构造算法并用C+编程实现,本课程的学习方法,语言都有一个起主导作用的骨架,掌握这个骨架是根本,而细节可以在实际使用时再逐渐熟悉。 程序设计语言是工具,学习的目的是更好、更恰当地使用它。 不断练习,实践!实践!再实践!,第一章 C+概述,1.1 C+ 的起源和特点 1.1

2、.1 起源 C 语言是1972 年由贝尔实验室的Dennis Richie 创建的结构化、模块化的面向过程的程序设计语言。 C 语言的优点: 功能强、性能好, 高效、灵活, 支持结构化程序设计。 C 语言也存在一些缺点和局限: 几乎没有支持代码重用的的语言机制和结构, 不适合开发大型程序。,随着软件的规模和复杂程度不断增大,软件设计和开发的危机也日益显著。20世纪80年代提出的面向对象的程序设计思想使软件工作者看到了从根本上解决软件设计开发危机的希望;同时也期望设计出能支持面向对象程序设计思想的新语言。,1.1.2 特点 Bjarne Stroustrup 博士和他在贝尔实验室的同事们为了弥补

3、C的不足和增加面向对象的支持机制,在1980年对C语言进行扩充,设计出了与原来的C语言完全兼容,又完全支持面向对象程序设计的新语言(C语言的扩展增强版),并为该语言赋予了非常贴切的命名C+。与C相比,C+具有以下特点: 继承了C 的原有精髓 高效、灵活; 增加了面向对象的机制,支持大型软件开发; 支持代码重用;,1.2 C+ 源程序的构成 C+是C的一个超集,所以它几乎保留了C的所有特性。 例如,输入两个整数,计算并输出它们的和。 实现该功能的C程序如下: #include main() int a, b, sum; scanf(“%i %i”, /* 输出计算结果*/ ,与该程序具有相同功能

4、和输出结果的C+程序如下: #include using namespace std; int main() int a, b, sum; cin a b; / 输入整型数值 sum = a + b; cout “a+b= “ sum endl; / 输出计算结果 return 0; 比较两个程序,比较不难发现,二者在格式、语法结构方面保持着一致性,但也存在着一些不同之处:, C+标准要求main函数必须声明为int类型,并在程序正常执行结束时向系统返回数值0,否则返回数值-1。但目前并非所有的C+编译系统都严格实行了这一标准,因此在大多数C+编译系统中仍可以将main函数声明为void 类型

5、(但不提倡)。注意,如果main函数未加任何类型声明,则缺省为int 类型。 C+标准允许使用/* */ 和/ 两种注释语法。 C+程序一般使用输出流对象cout进行输出,但也允许使用函数printf进行输出。 C+程序一般使用输入流对象cin进行输入,但也允许使用函数scanf 进行输入。,#include using namespace std; void main() int a, b, sum; cin a b; / 输入整型数值 sum = a + b; cout “a+b= “ sum endl; / 输出计算结果 /return 0; , 输出流对象cout 和输入流对象cin

6、的声明在头文件iostream中,因此必须在main 函数之前添加预处理命令#include 。如果要在C+ 程序中使用printf 和scanf 则必须在main 函数之前添加预处理命令#include 。 注意,在标准C+中,由系统提供的头文件不带后缀“.h”,并且标准库中C+ 的类、函数、对象都声明在命名空间“std”中。“iostream”文件是在命名空间std中声明的,因此用到using namespace std;语句。但也可以使用带后缀的头文件,这时就不需要声明命名空间std了。如果不在程序中使用C+ 标准库,则上述C+ 程序应改写如下:,#include /using name

7、space std; int main() int a, b, sum; cin a b; / 输入整型数值 sum = a + b; cout “a+b= “ sum endl; / 输出计算结果 return 0; ,1.3 C+对C的扩充 C+对C语言的扩充包括面向过程编程的扩充和面向对象编程的扩充。 在面向过程编程中,提供了C语言的绝大部分功能,并在此基础上从简化编程、提高程序运行效率、降低程序出错率、增强程序灵活性等方面作了不少扩充和改进。 1.3.1注释行 C+ 中不但保留了C 的/* 和*/ 格式,还增加了/ 格式。例如下面两条语句的注释: x = y + 2; /* This

8、is a comment */ 和 x = y + 2; / This is a comment 是等价的。,说明: 以/ 开始的注释内容只在本行起作用,以本行末尾作为结束。显然,当注释内容为多行时使用/ 会不方便,而使用/* 和*/ 更为适宜。 /* */ 格式的注释不能嵌套,但它可以嵌套/ 方式的注释,例如: /*This is a multi-line comment. Inside of which / is nested a single line comment. Here is the end of the multi-line comment. */,1.3.2 面向对象的I/

9、O 操作 在C 程序中进行I/O 操作时容易出现如下的运行错误: int i; float f; scanf(“%f“, 这类错误发生的原因是scanf 和printf 中的格式控制符和所控制的数据类型不一致。,在C+ 程序中,上述同样的操作可以写成: int i; float f; cin i; cout f; 在C+中,使用cin和cout进行输入输出,不必指定格式,简单易用,并降低出错的可能。,1、“cinI”表达式 cin是“标准输入流”类的对象,代表输入设备,如键盘。 “”是输入运算符(提取运算符),其作用是从左操作数cin中提取数据,传送给右操作数指定的变量。 接收输入信息的右操作

10、数,可以是除void以外的任何预定义类型的变量,但不能是常量,如endl。,表达式的值为左操作数cin的新值。 允许用户在表达式中连续使用输入运算符“ ”为多个变量输入数据,例如: cin a b c; “”的结合方向是自左向右,即从键盘提取的数据,按自左向右的顺序依次存入对应的变量中。两数据之间用间隔符(空格、回车或Tab键)分隔,并在输入过程中抛弃间隔符。,2、 “coutf”表达式 cout 是“标准输出流”类的对象,代表输出设备,如显示器屏幕。 “”是输出运算符(插入运算符),其作用是把右操作数指定的变量(或常量)的值,送到输出流对象cout中,即输出到显示器上。 右操作数代表的输出数

11、据可以是除void 以外的任何预定义类型的变量或常量。,表达式的值为左操作数cout的新值。 允许用户在表达式中连续使用标准输出运算符向标准输出流对象输出多个变量中的信息,例如: cout “输出” b endl; “”的结合方向是自左向右,即按自左向右的顺序将所有右操作数的值依次送到输出流对象中。 “endl”代表回车换行,作用与“n”相同。,1.3.3 灵活的局部变量说明 局部变量声明允许出现在程序的任何部分。例如: f() int i; cin i; int j = 25; cout i , j; 甚至可以声明在某些语句表达式中,例如: for(int i = 0; i 5; i+) 一

12、般认为,在大函数(代码长)中,在最靠近使用变量的位置说明变量较为方便合理;而在小函数(代码短)中,把局部变量集中在函数开始说明较好。,1.3.4 用const 定义常变量 变量一旦被const 修饰说明,该变量便成为一个常量,程序的任何地方都不允许更改。这与使用预编译命令#define 定义常量的结果相同。 例如: const float PI=3.14159; 意义:编译时,定义变量PI,其值为3.14159,且不许改变。 相当于 #define PI 3.14159 意义:编译前,将程序中出现PI的地方以3.14159替换。,使用const 修饰符的几点说明: 具有变量的属性,有数据类型,

13、占用存储单元。 常量一旦定义,程序的任何地方都不允许更改,缺省值为零。 用const 定义的常量拥有类型说明,因此具有良好的编译时检测性。 const可以和指针一起使用,增强程序的功能和灵活性。 (5) const 消除了#define 的某些不安全性。(P11) (6) 一般把程序中不允许改变值的变量定义成常变量。,1.3.5 函数原型 由于C和C+的编译器都不具备“向前看”的能力,因此在函数被调用之前应进行声明或定义。但在C程序中,当函数返回值为int型,声明并不是强制的,编译时也不严格。 例如,用于判断两个整数值大小的函数max 就可以如下多种声明方式: int max(int x, i

14、nt y); int max(); max();,在C+ 程序中,函数原型声明是必须的,声明的语法必须遵循如下规则: 函数类型名 函数名(参数表); 但如果被调用函数的定义出现在该函数的调用语句之前,则不必再单独给出该函数的原型声明,因为函数定义的首部就起到了函数原型的声明作用。 使用函数原型的几点说明: 函数原型的参数表中可以不包含形参名,但必须 指定每个形参的类型,例如: int max(int, int); 虽然这样的原型是合法的,但加上参数名的原型将更加清楚,使得程序的可读性好。, 函数首部与原型声明的形式基本相同,但函数首部中的参数必须给出形参名,且不包括结尾的分号“;”。 主函数m

15、ain 不必进行原型说明。 函数原型或首部中无函数类型(包括main),C+默认该函数的类型为int。 如果函数确实无返回值,则必须在函数原型或首部中声明该函数的类型为void。 对函数原型进行强制声明,使系统对函数调用的合法性进行严格检查,尽量保证程序的正确性。,*1.3.6 内置(联)函数 编译时将所调用的函数代码嵌入到主函数中,这种嵌入到主函数中的函数称为内置函数。 在函数首行的左端增加前缀“inline”,此函数就被声明为内置函数。 内置函数的作用是能减少调用开销,加快执行速度,但可能会增加内存开销。 P24例1.13,#include using namespace std; inl

16、ine int max(int a,int b,int c) if(ba) a=b; if(ca) a=c; return a; ,int main() int i=7,j=10,k=25,m; m=max(i,j,k); couta) a=b; if(ca) a=c; m=a; */,使用内置函数的几点说明: 内置函数在调用之前必须进行完整的定义,否则编译器将不知道用什么代码来置换调用表达式。因此,一般情况下应该将内置函数的完整定义放置在头文件(.h 或.hpp)中或放置在源文件(.cpp)中所有对该函数调用之前的位置。 (2) 使用内置函数的原则是兼顾时空矛盾:当函数代码短,提高执行速度是

17、主要矛盾,并且内存和磁盘资源充足时,可使用内置函数。若函数代码长,并且调用频繁,则不要将函数定义为内置函数,否则程序会变得很长。 (3)内置函数与用#define 命令实现的带参宏定义类似,但不完全相同。P24 例1.14、 例1.15,1.3.7 函数重载(Overload) 使用C语言编程时,在同一作用域中,如果要编写施加于不同类型数据的操作函数时,必须使用不同的函数名。例如: int max1(int a, int, b, int c); double max2(double a, double b, double c); long max3(long a, long b, long c

18、); 在C+ 中,允许两个或两个以上的函数,只要它们的参数类型和参数个数不同,就可以采用相同的函数名,这些具有相同名称的函数称为重载函数。例如: int max(int a, int, b, int c); double max(double a, double b, double c); long max(long a, long b, long c);,定义重载函数的几点说明: 重载函数不同版本的依据是参数的类型和个数必须有所不同。如果同名函数的参数类型和个数相同,而函数类型不同,将会引起编译时的二义性错误。 例如: int mul(int x, int y); double mul(in

19、t x, int y); 函数的重载机制用于定义同类功能的不同操作。应避免因函数的随意重载引起功能调用的混乱。 (3) 函数重载只是简化了编程,并不能提高程序的效率。,调用重载函数的匹配过程是按如下步骤完成的: 从重载函数集合中找出准确匹配(形参类型、个数、顺序与实参完全一致)。如果准确匹配存在且唯一,则匹配成功。 如果准确匹配失败,则进行参数类型的合法转换。如果转换匹配存在且唯一,则匹配成功。 如果准确匹配和转换匹配均不存在,或虽然存在但不唯一,则匹配失败。,#include using namespace std; int max(int a,int b,int c) if(ba) a=b

20、; if(ca) a=c; return a; double max(double a,double b,double c) if(ba) a=b; if(ca) a=c; return a; ,int max(int a,int b) if(ba) return a; else return b; int main() int i=7,j=10,k=25,m2,m3; m2=max(i,j); cout“max_i_2=“m2endl; m3=max(i,j,k); cout“max_i_3=“m3endl; double fi=7.1,fj=10.3,fk=25.6,fm; fm=max(

21、fi,fj,fk); cout“max_f=“fmendl; return 0; ,1.3.8 带有默认参数的函数 如果函数的某些参数在大多数调用时总是传递相同的实参值,则C+提供简单的处理办法,允许在函数原型或无原型声明的函数首部中为这些参数指定默认(实参)值,这样形参就不必一定从实参取值了。例如: int special (int x = 5, float y = 5.3); 具有默认参数值的函数被调用时,如果没有为具有默认值的形参传递实参值,则默认值就被使用;否则调用者传递的实参值替代默认值。,使用默认参数的几点说明: 在函数原型或函数首部中,所有有默认值形参都必须出现在无默认值形参的右

22、边。例如: int fun(int i, int j = 5, int k); / 错误 int fun(int i, int k, int j = 5); / 正确 在具有默认参数的函数被调用时,若某个默认值被使用,则其后的实参值皆必须采用默认值。例如,对函数int special(int x = 5, float y = 5.3) 的调用: special(,21.5); / 是错误的, 一个函数不能既作为重载函数,又作为有默认参数的函数,以避免调用时的二义性错误。 例如,如果对于重载函数max: int max(int a, int b, int c = 100); int max(in

23、t a, int d); 进行如下调用: max(5, 23); 编译系统就会因为无法判别调用哪一个max 版本,而显示二义性出错信息。 (4)在函数声明中指定默认值,则在函数定义首部中不必再指定。 (5)使用默认值可以简化编程,提高效率。,*1.3.9 命名空间和作用域运算符 所谓命名空间就是一个为解决命名冲突,由编程者命名的内存区域。编程者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。 在一个命名空间中封装成员代码的基本语法是: namespace ModuleName 其中,namespace 是定义命名空间的关键字,紧随其后的是编

24、程者为命名空间的命名,例如, ModuleName,而花括弧 和 表示该命名空间管辖的作用域。例如:,namespace Module1 void foo() cout “Module foo() invoked” endl; int bar(int x) return x; typedef string* T; 表示函数foo 和bar,以及类型T 均属于命名空间Module1 。 为了在命名空间的外部访问命名空间的内部成员,必须使用命名空间限定表达式。例如: Module1:foo(); 其中“:”是作用域运算符,该运算符是一个双目运算符,其语法和语义如下:,命名空间名:标识符 该表达式表

25、示要访问的是指定命名空间名中的标识符所指示的函数、变量等。 表达式的左操作数允许为空,即:标识符,表示访问全局标识符所指示的函数、变量等。 表达式的右操作数不允许为空,即,命名空间名:是错误的。 使用命名空间限定表达式可以使在同一程序作用域范围内访问处于不同命名空间的相同标识符所指示的函数、变量变得轻而易举。 不难看出,命名空间和作用域运算符为函数、变量等的命名和访问控制提供了极大的方便,从而简化了编程,为开发大型软件带来了便利。,如果在程序的一段代码作用域范围内访问属于同一命名空间中的成员,又想避免使用命名空间限定表达式所引起的麻烦,则可使用using 指令,例如: int main() u

26、sing namespace Module1; foo(); 注意,只有当命名空间所管辖成员的标识符和全局定义的标识符不存在冲突的情况下,才可以通过指令using 使用命名空间中的所有成员,否则将可能出现二义性错误。例如:,void foo() cout “Global-level foo() invoked” endl; void main() using namespace Module1; foo(); / 产生二义性错误 使用作用域运算符就可以解决这一矛盾。例如: void foo() cout “Global-level foo() invoked” endl; void main(

27、) void foo() cout “Local-level foo() invokedn”; Module1:foo(); / 访问Module 封装的foo() :foo(); / 访问全局的foo() foo(); / 访问局部的foo() ,1.3.10 动态内存管理运算符new 和delete C 语言中用于动态内存管理的函数malloc和free在C+中可以继续使用,但提倡使用另外两组动态内存管理运算符:, 用于单个对象的内存分配运算符new 和撤消运算符delete。 用于多个对象(数组)的内存分配运算符new 和撤消运算符delete 。,1、 使用new 和new 动态分配内

28、存 使用new 和new 是为那些必须动态确定占用内存的数据(对象)分配存储空间。调用实例: double *p; p = new double; / 内存大小= sizeof(double) 该表达式表示,按照指定的数据类型,分配相应大小的内存空间,并返回该内存空间的首地址。 对于那些可以预先确定占用内存的数据(对象),最好还是使用局部变量或全局变量分配存储空间。,内存动态分配运算符new 的调用实例: int *p; p = new int1000; / 内存大小= sizeof(int) * 1000,2、使用delete 和delete 撤消动态内存 运算符delete 和delete

29、 用于回收由new 和new 分配的内存空间。 delete调用实例: double *p; p = new double; / 内存大小= sizeof(double) delete p; / 回收由指针p 指向的内存空间 delete 的调用实例: int *p; p = new int1000; / 内存大小= sizeof(int) * 1000 delete p; / 回收由指针p 指向的内存(数组)空间,注意: delete 或delete 所撤消的必须是一个指针,并且保存着由new 或new 所分配内存的首地址。也就是说,必须是有效指针,否则将导致运行错误。 如果用delete

30、撤消由new 分配的对象数组,则只能撤消由指针指向的对象数组中第一个元素的内存空间。 P30 例1.18,#include #include using namespace std; struct Student char name10; int num; char sex; ;,int main() Student *p; p=new Student; strcpy(p-name,“Wang“); p-num=10123; p-sex=M; coutnamenumsexendl; delete p; return 0; ,使用new、new 和delete、delete的几点说明: (1)

31、new 可以对分配的对象进行初始化。例如: p = new int(99); / 为指针p 分配内存并设置初值99 (2)使用new 和new动态分配内存时,如果没有足够的内存满足分配要求,new 和new 将返回空指针。如果使用空指针,则会导致运行错误。因此,通常要对内存的分配是否成功进行检查。,练习 P36 17 void sort(int,int n) /int为存放数据的数组, /n为数据个数,即数组长度 void sort(float,int n) void sort(double,int n) 在main()函数中动态确定n的值。,1.3.11 引用(Reference) 在C语言

32、中,间接访问变量的方法是利用指针。例如:,int a, *p;,a,p,10,p=,&a,&是变量的地址,在C+中,引入一种新的间接访问变量的方法引用。引用是变量的别名。例如:,int a; int ,a,m,10,&是引用声明符,引用不是独立的变量,不单独占有内存。因此,建立引用时只是声明它与已有的某一变量的关联,而不另外分配内存。,m=10;,给m赋值就是给a赋值,指针与引用的区别: 1、指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量。 2、引用必须初始化,而一旦被初始化后不得再作为其它变量的别名,而指针不具此特征。 3、指针是独立变量,要占内存,而引用不是独立变量,不占

33、内存。 P18例1.9,#include using namespace std; int main() int a=10; int ,使用引用的几点说明: 定义引用时,必须初始化。引用的初始值可以是一变量或另一引用。例如: int i = 5; int / j2 引用j1,也就是引用变量I 使用被引用的变量时,直接使用引用名。 引用不允许重新赋值。例如:,int i, k; int / 不能建立引用的引用,(5) 引用同变量一样有地址,可以对其地址进行操作,即将其地址赋给一指针。,int a, *p; int ,a,p,m,10,p=,&m,&是变量的引用,&是变量的地址,引用参数 C+ 使

34、用引用的主要用途之一就是为函数调用传递参数,扩充函数传递数据的功能。这对于大型对象参数的传递尤为重要。函数的参数传递方式有三种,下面分别用三种方式实现: “输入a, b两个整数,按大小输出这两个数。” 数值传递:实参值被复制后传递给被调函数的形参。因此函数不会改变实参的原始值。,int main() int a,b; cinab; if (ab) swap (a, b); cout“a=“a“,b=”bn; return 0; ,swap(int x, int y) int t; t=x; x=y; y=t; ,10,100,10,x=100,y=10,输出:a=10,b=100,值传递, 地

35、址传递:实参地址值被复制后传递给被调函数的形参,因此函数可以改变实参的原始值,但不能修改实参的地址。,int main( ) int *point1, *point2, a,b; cinab; point1= ,swap(int *p1, int *p2) int t; t=*p1; *p1=*p2; *p2=t; ,10,100,10,a=100,b=10,输出:a=100,b=10 100,10,void swap(int ,a,3,b,5,x,y,t,3,5,3,输出: 5 3, 引用传递:实参被直接传递给被调函数,因此函数可以改变实参的原始值。,void dd(int ,void ma

36、in(void) int a=3,b=4,c=5; for(int i=0;i2;i+) dd(a,b,c); cout“(1)”atbtcendl; ,(2) 8 -4 10,(2) 13 -17 10,(1) 13 -17 5,x=8,y=-4,z=10,x=13,y=-17,z=10,void f1( int *px) *px+=10; void f2(int ,x=0 x=10 x=20,显然,采用地址传递和引用传递的结果是一样的,但引用传递的语法更清楚、简单,表现在: (1)函数的形参不需要声明为指针类型,而指针变量要另外开辟内存单元,引用不是一个独立变量,调用该函数时,不需要分配内

37、存单元; (2)调用该函数时,传递的实参不必在变量名前加运算符&以表示地址,且不需要为参数传递值(效率高)。 (3)使用引用访问变量时,引用就代表该变量,所以不必使用指针运算符*。 所以C+ 主张在满足功能要求的前提下,用引用取代地址指针传递实参。,另外,如果在引用形参前加上修饰符const,例如: void swap(const int 表明被引用的变量的值在被调函数中不能被改变。这一效果与数值传递相同,但引用并不需要通过堆栈复制实参值,所以效率高。 相比C语言中的两种参数传递方式,引用传递同时具备两种传递的优点,且效率高,空间利用率高,又可以简化编程,建议在编程中多多使用。 练习:P36

38、13,1.3.12字符串类型 在C+ 标准库中声明、定义了一种新类型string,为字符串变量的创建和操作提供了方便。 注意,使用string 类型必须在程序中添加: #include using namespace std; 1 定义字符串变量 定义字符串变量的方法与定义其他类型变量相同。 例如: string str1; string str2 = “China”; / 定义字符串变量str2,并用字串“China”赋值。,2 字符串变量的赋值操作 字符串变量的赋值操作与其他数据类型变量相似。 例如: string str1; string str2 = “China“; str1 = “

39、Canada”; / 用字串“Canada”为str1 赋值。 str2 = str1; / 用str1 的值为str2 赋值。 str22=c;/修改序号为2的字符 3 字符串变量的输入输出 可以使用标准输入输出运算符进行输入输出操作。 例如: cin str1; / 从键盘输入一个字串给str1 赋值。 cout str2; / 将str2 保存的字串输出到显示器屏幕。,4 字符串变量的运算 用赋值运算符实现字符串复制 str1 = str2; 用加法运算符实现字符串连接 string str1 = “C+”; string str2 = “Language”; str1 = str1 +

40、 “ ”+ str2; / str1 = “C+ Language” 用关系运算符实现字符串比较 可以直接用于字符串比较的关系运算符包括: =、=、=等。,5 字符串数组 定义字符串数组的方法与定义其他类型数组相似。 例如: string name5; name5 = “Zhang”, “Li”, “Fun”, “Wang”, “Tan”; 也可以如下定义: string name = “Zhang”, “Li”, “Fun”, “Wang”, “Tan”string Tan”; 分析: 一个字符串数组可以包含若干个string 变量。 数组每个元素中存放的字符串长度不必相等。 字符串以“0”

41、结尾,数组元素中不包括“0”字符。,P29例1.17 #include #include using namespace std; int main() string string1,string2,string3,temp; coutstring1string2string3; /输入3个字符串 if(string2string3) temp=string2;string2=string3;string3=temp; /使串2串3 if(string1=string2) coutstring1“ “string2“ “string3endl; /如果串1串2,则串1串2串3 else if(string1=string3) coutstring2“ “string1“ “string3endl; /如果串1串2,且串1串3,则串2串1串3 else coutstring2“ “string3“ “string1endl; /如果串1串2,且串1串3,则串2串3串3 return 0; ,练习 P36 14、16(若为n个字符串呢?),

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1