第10章C语言Word下载.docx
《第10章C语言Word下载.docx》由会员分享,可在线阅读,更多相关《第10章C语言Word下载.docx(32页珍藏版)》请在冰豆网上搜索。
%d"
&
i);
/*按格式控制输入数值*/
printf("
%d\n"
i);
}/*按格式控制输出变量i的值并换行*/
运行结果:
5↙
5
再来看一个带基本输入输出功能的简单C++程序:
iostream.h>
cin>
>
i;
//输入数值
cout<
<
"
welcome"
<
i<
endl;
}//输出字符串及变量i的值并换行
welcome5
程序说明
♣以上程序虽然简单,但已经体现出了C程序和C++程序的不同了。
就前面的两段程序而言,不同点主要表现在以下:
1、在C程序中需要包含stdio.h(standardinputoutput标准输入输出)头文件完成基本输入输出;
而在C++程序中则要包含iostream.h(inputoutputstream输入输出流)头文件完成基本输入输出。
2、在C语言中,输入输出是由位于头文件stdio.h中的库函数完成的;
而C++则是由位于iostream.h头文件中的输入输出对象完成的。
那么C++中的输入输出对象又是怎么工作的呢?
原来,C++重载了“<
”和“>
”运算符(“<
”为输出或插入运算符,“>
”为提取运算符),与cout和cin(均为C++系统预定义的对象)一同用于完成基本输出输入操作。
cout(console+out)是一个用于向标准设备(显示器)进行输出的输出流对象;
cin(console+in)是一个用于获取键盘输入的输入流对象。
“<
”运算符的作用是将一个输出对象输出到cout对象中,即cout和“<
”运算符共同完成一次输出;
“>
”运算符则是将一个输入对象提取到cin对象中,然后送到内存,即cin和“>
”运算符共同完成一次从键盘的提取输入。
在C语言中,“<
”与“>
”曾被用于位运算的“左移”、“右移”运算符。
C++中又把它们作为输出输入运算符。
这样在一个编译器中允许一个运算符用于不同的场合,语法又能识别出不同含义的用法称作运算符的“重载”(overloading)。
即重新赋予并解释它们新的含义。
其实就是“一物多用”。
3、换行处理不同。
C语言使用'
\n'
转义字符控制换行,C++语言使用endl(endline)换行。
4、程序源文件的扩展名不相同。
C使用.c作为源文件扩展名;
C++使用.cpp(Cplusplus)作为扩展名。
5、注释方法不完全相同。
C++的注释允许采取两种形式。
一种是C使用的“/*”和“*/”,它们之间的字符都是注释内容,又称段注释;
另一种则是“//”。
“//”至本行结尾都作为注释部分,不能跨行,又称行注释。
注释是对程序功能的说明,方便阅读和维护。
写程序应养成加注释的良好习惯。
尤其是一些全局变量、函数功能、复杂语句都应加入相应注释,以便于日后的维护。
否则,过了一段时间,你可能会发现连自己都看不懂程序到底干了什么。
6、C++简化了基本输入与输出的操作,使编程人员不必再去重复C中繁琐的输入输出格式,C++提供的cin和cout对象可以自动识别所输入和输出的数据类型及格式。
由以上的几个例子可以看出,C++程序同C程序在语法使用上基本是相同的,C++延续了C的变量定义方式、变量初始化、流程控制等。
由此也可以看出,C同C++的密切关系。
♣voidmain()函数,main()为主函数名,void表示函数无返回值。
函数体用一对花括号“{}”封装,函数体由语句组成,每条语句用“;
”分号作为结束符。
不是所有C或C++程序都使用main()函数作为启动函数。
在Windows程序设计方式下,C或C++程序的入口函数为WinMain(),而不是传统的main()函数。
本部分介绍的均是控制台下的C++程序。
因此,程序入口仍然是main()函数。
10.2.1VC++6.0上创建一个C++程序的步骤
一、启动VC++6.0,进入其工作环境,显示出主界面,关闭“Doyouknow”对话框。
二、选择“文件【File】”菜单下的“新建【New】”命令。
弹出“New”对话框。
并选工程“Projects”选项卡。
三、在列表中选择Win32ConsoleApplication项,给工程起个名称如MyProc01,并设置存放路径,点击“OK”确定后弹出如图10.2-1图示界面:
图10.2-1
四、选择“一个空工程”,点击“完成”按钮,在接下来弹出的信息窗口中点击“确定”按钮。
五、再次点击“文件【File】”菜单下的“新建【New】”命令项,在弹出的New对话框中,选择“文件(Files)”选项卡,并选择C++SourceFile,指定源文件名Test01并设置文件的存放路径,点击“OK”确定。
如图10.2-2所示界面。
六、在打开的代码编辑窗口里输入代码。
七、点击编译按钮【Build】
(或按F7)进行编译。
如果没有错误,再点击运行按钮【ExecuteProgram】
(或按Ctrl+F5)并运行查看结果,如图10.2-3所示界面。
图10.2-2
图10.2-3输入代码调试并运行
注意
♣最好先在磁盘上新建一个文件夹,如:
D:
\MyC++,然后将使用的工程和过程文件都保存到这个文件夹中,这样便于以后的管理和使用。
♣每个C++程序均被VC++6.0开发环境看作一个“工程(Project)”,VC++6.0开发环境会为每个工程产生一些相关文件。
因此,编译之后,在程序目录下不但会自动保存.cpp源程序代码文件,还会保存一些其它的过程文件。
♣VC++6.0开发环境会为每个“工程”提供一个“工作空间(Workspace)”,用于管理各种文件,代码编写及调试过程中的文件都位于这个“工作空间”中。
每次VC++6.0开发环境只允许打开一个工程的“工作空间”。
♣要打开不同的“工作空间”,或建立新的工程,需要先关闭当前的“工作空间”(【File】→【CloseWorkspace】)。
♣点击运行按钮【ExecuteProgram】
(或按Ctrl+F5)后,执行过程和结果在MS-DOS字符窗口中进行并显示。
程序执行结束后,自动停在程序的结尾处并提示“Pressanykeytocontinue”,按下任意键后,回到VC++6.0IDE中。
10.3C++对C的扩充
C++语言发展了类(Class)的理论。
类是进行面向对象程序设计的基础。
除了引进类的概念以外,C++对C的许多方面还作了扩充。
C++向下兼容,全面支持C语言。
在C语言中可以用的语法,在C++中几乎都可以用;
用C编写的程序,在C++编译器中基本上都能通过。
如前面各章中例举的例题,都属于这种情况。
本节介绍除了类以外,C++在其它方面对C的扩充和更新。
1、在程序结构上,C程序是面向过程结构化的程序设计方法,而结构化程序设计的缺点很突出,其一数据与处理数据的函数相分离,导致对函数的分析变得困难;
其二代码可重用性差。
任何一个软件生产者,都希望设计的程序代码具有可重用性,使代码具有可移植性和相对独立性,从而形成一些具有特定功能的组件。
这些组件经过使用被证明性能稳定、功能可靠后,下次开发新的应用程序时,这些组件可被重新使用,从而减轻程序开发人员的工作强度,缩短开发周期。
C++中使用类、对象、封装、继承以及多态等即可做到。
C++面向对象程序设计语言的特点有以下几个方面:
数据描述抽象性:
通过从特定的普遍实例中提取共同的特性去定义一个一般化的概念的过程。
如可将“人”的共性(姓名、性别、年龄、职业、籍贯、身高等属性)提取出来,定一个类:
人类。
那么,只要一提到“人类”,就自然会想到与之相关的特征。
数据封装隐蔽性:
也叫数据隐藏。
用户无需知道对象内部是怎样工作的,只需知道对象所提供的接口和可使用的方法即可。
在C++中一般用类来实现对数据的封装,然后通过该类的实例对象,向用户提供相应功能。
继承性:
一种代码重用的思想。
由现有的类型(基类或父类)派生出新的子类,新的子类不但具有了其父类的属性和方法,还可扩展出子类特有的属性或方法。
这样,子类不但可以完成一些父类的功能,还可增加新的功能。
这就好像产品的更新换代一样,新产品总是提供了更多更好的功能,但不论怎样新产品还是延续了上一代产品的某些特性。
多态性:
指在基类中定义的属性或方法,被子类继承之后,在子类中可以具有不同的数据类型或表现出不同的行为。
使用动态联编:
动态联编是多态性的一种实现方式,是程序自身根据当前的运行状态和需求进行定位的过程。
按照联编所处的阶段不同,可分为:
静态联编和动态联编。
2、C++新增了内联函数、引用、重载、继承、虚函数等,实现了面向对象的程序设计功能。
C++既支持传统的结构化程序设计,又支持面向对象的程序设计,而C语言仅支持结构化程序设计方法。
3、C++新增了一些数据类型来完善C语言的不足。
4、C++提供了更灵活的语法格式。
如在C语言中结构体中不允许有函数,而C++中就没有这一限制。
稍后我们将会看到这种不同。
5、C++程序更强调了指针的使用。
很多情况下,都是通过指针变量或函数的指针完成操作(尤其是后续课程MFCWindows程序设计中更是普遍)。
因此,读者一定要加强对指针的学习与理解。
10.3.1C++的输入输出
C++允许两种输入/输出方法:
一种为C原有的输入输出语句(利用输出函数printf()和输入函数scanf()),在C++中仍然适用。
另一种为C++增添的cout<
输出操作和cin>
输入操作。
cout是由c和out两个单词组成,代表C++的输出流;
cin是由c和in两个单词组成,代表C++的输入流。
在C++中把数据的I/O称为数据流,并提供了强大的“流”处理功能,以控制数据从一个位置流向另外一个位置。
相对于内存,当数据从内存流向屏幕、打印机或硬盘时称为输出;
当数据从键盘、硬盘流向内存时称为输入。
C++用两个对象cin和cout实现标准的输入输出。
cin是istream类的对象,用来处理标准输入,即键盘输入;
cout是ostream类的对象,用来处理标准输出,即屏幕输出。
它们是在头文件iostream中定义的。
在C++中用istream类和ostream类的派生类iostream控制输入输出,并提供了<
和>
运算符,分别称为“插入操作符”和“提取操作符”。
是将数据插入到cout流中;
是从cin流中提取数据到变量中。
要使用C++的标准输入与输出功能需要在程序中包含iostream.h头文件。
1.用cin>
获取键盘输入
用cin>
获取键盘输入的一般格式如下
cin>
变量1>
变量2......>
变量n;
从键盘上输入数据时两个值之间一般用Space空格键分隔,也可以用tab键或Enter键。
输入时要按照对应接收数据的变量的数据类型进行输入。
提取操作符可连续使用,后跟接收数据的变量名。
例10.3-1获取键盘输入
charch,str[30];
cin>
i>
ch>
str;
}
程序运行时,从键盘分别输入
20↙
a↙
ThisisaC++program↙
2.用cout<
实现屏幕输出
用cout<
实现屏幕输出的一般格式如下
cout<
表达式1[<
endl]<
表达式2[<
endl]...<
表达式n[<
endl];
例10.3-2完成向屏幕输出操作
{inti=3,j=2;
charch;
ch;
cout<
i<
”+”<
j<
”=”<
i+j<
endl<
ch<
}
3+2=5
a
♣头文件iostream.h包含了输入操作cin>
和输出操作cout<
的定义。
♣voidmain()为主函数。
前面加类型说明符void表示main()没有返回值。
无参数时也可写作voidmain(void)。
♣cout<
表示将右边的内容输出。
插入操作符可连续使用,后跟表达式或变量。
在输出时系统自动计算表达式的值并插入到cout对象流中。
其中endl表示终点换行。
3.控制输出格式
C++的iomanip.h中定义了许多控制符,这些控制符可以直接插入到cout中,控制数据的输出格式。
如要指定某变量输出所占据的字符列数,可以用setw(6)控制函数来设置。
控制符有两种:
控制常量和控制函数。
控制常量定义在iostream.h头文件中;
而控制函数定义在iomanip.h头文件中。
例如,dec、hex和oct用来控制数值数据分别以10进制、16进制和8进制形式输出。
例10.3-3格式化输出
iomanip.h>
{intnumber=1234;
”以十进制输出为:
”<
setw(6)<
dec<
number<
endl
”以十六进制输出为:
setw(4)<
hex<
”以八进制输出为:
oct<
以十进制输出为:
1234
以十六进制输出为:
4d2
以八进制输出为:
2322
♣使用setw(6)控制函数要包含iomanip.h头文件。
♣使用流输出对象cout进行连续插入时,可省略cout。
但要注意其上一行的endl后没有“;
”语句结束符。
♣除了C++为流输入输出提供的格式控制外,还可以控制实数的输出精度。
使用时可查阅有关书籍,在此不再详述。
10.3.2用const定义常变量
C++中符号常量定义的关键字为const,其一般格式为
const类型标识符=字符串(常量)
如constintPOST=510001;
其中标识符POST为符号常量名,一般用大写,小写也合法;
字符串为510001(常量)。
此语句的功能是用标识符POST代替510001这个值。
定义了常变量POST,它具有变量的属性,有数据类型,占用存储单元,有地址,可以用指针指向它,只是在程序运行期间此变量的值是固定的,不能改变。
它方便易用,避免了用#define定义符号常量时常容易出现的错误和缺点。
C语言中使用宏定义#define,如6.11节介绍的。
其一般格式为
#define标识符字符串(常量)
如#definePOST510001
在C++中关键字const还有其他用途,其功能并不惟一。
const可以与指针结合使用,有指向常变量的指针、常指针、指向常变量的常指针等,将在其后介绍。
10.3.3函数原型声明
在C语言程序中,如果函数调用的位置在函数定义之前,则应在函数调用之前对所调用的函数进行声明,但如果所调用的函数是整型的,也可以不进行函数声明。
在C++中,声明时必须使用函数原型。
C++的要求比C更为严格。
不是建议性的,而是强制性的。
编译系统主要针对函数调用的合法性进行严格的检查,尽量保证程序的正确性。
函数原型是指函数标准的表示方法。
它指出了函数类型、函数名、参数表中的参数个数及类型。
函数声明的一般形式:
函数类型函数名(参数表);
参数表中一般包括参数类型和参数名,也可以只包括参数类型而不包括参数名,如下的两种写法是等价的。
intmax(intx,inty);
intmax(int,int);
在编译时只检查参数类型,而不检查参数名。
例10.3-4用VC++6.0编译器编译一个C程序
{floata,b;
floatfu(float);
//函数原型
printf(“Inputa:
”);
scanf(“%f”,&
a);
b=fu(a);
//调用函数
printf(“fu(a)=%8.3f\n”,b);
floatfu(floatx)//被调函数
{flaoty;
y=3*x*x+2*x*x+1;
return(y);
Inputa:
2.5↙
fu(a)=32.250
♣程序中floatfu(float);
为函数声明语句。
在声明语句中采用函数原型,即函数的标准表示方法。
♣之所以用这个例,是说明这个C语言程序如果在C编译器中(如TurboC)该说明语句可以写成简化形式,即floatfu();
。
但C语言程序使用VC++6.0编译器编译,则也要求使用函数原型。
C++程序中被调函数的声明语句则必须使用函数的原型。
10.3.4函数的重载
在前面的程序中用到的插入运算符“<
”和提取运算符“>
”。
这两个运算符本来是C和C++位运算中的“左移”运算符和“右移”运算符,现在C++又把它作为输入输出运算符。
既允许一个运算符用于不同的场合,有不同的含义,这就叫运算符的“重载”(overloading),即重新赋予它新的含义,其实就是“一物多用”。
在C++中,函数也可以重载。
C++的重载包括函数重载与运算符重载。
重载同人类语言中的“一字多意”的用法也很相似。
如“差”这个字,在不同的使用环境中可以有“出差”、“差别”和“参差不齐”等不同用法和含义。
函数重载是指,几个函数名称相同,但它们的形参在数量或类型上不完全相同的情况。
运算符重载是指,用关键字operator加上运算符来表示函数。
1.函数重载的意义
使用函数重载可以通过一个函数名的调用去实现不同的功能。
如定义一个用于求和的函数sum(),当给其传递整型数据作参数时,它可完成整型数据的求和;
当给其传递实型数据作参数时,它可完成实型数据的求和。
C++编译系统会根据传递参数的个数与类型,自动识别出相同函数名的不同函数并调用执行,从而实现同一函数名的多个功能。
在C语言中,若求int、double、float型的几个数据的和,则必须设计以下3个函数(重名函数是不允许的)
intsum1(intm,intn);
floatsum2(floatm,floatn);
doublesum3(dounlem,doublen);
这样必然会使求和的程序变得很冗长。
但如果把它们全部定义成同名函数sum(),则不管哪种类型的数据,都只须调用sum()函数就可完成各类型数据的求和运算,会方便许多。
C++可实现这个功能,而对C语言则非法。
例10.3-5对2个不同类型的数据分别求和
{intsum(intx,inty);
//函数原型的声明
doublesum(doublex,doubley);
//函数原型的声明
inta=9,b=9;
"
sum="
sum(a,b)<
//整型数据求和
doublex=120.24,y=120.24;
sum(x,y)<
//实型数据求和
intsum(intx,inty)
{returnx+y;
doublesum(doublex,doubley)
sum=18
sum=240.48
♣函数intsun(intx,inty)和doublesum(doublex,doubley)同名,但它们的参数类型分别为int和double型。
这种函数同名的情况,在C语言中是非法的。
2.函数重载的条件
给函数sum()定义多个函数实现体,完成不同数据个数、不同数据类型的求和,这种做法实现了对函数sum()的重载。
在调用时,系统会根据传递的形参的不同自动寻找与之匹配的函数并执行。
上面对sum()函