c程序的结构典型案例_第1页
c程序的结构典型案例_第2页
c程序的结构典型案例_第3页
c程序的结构典型案例_第4页
c程序的结构典型案例_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

第五章C++程序的结构典型案例

【案例5-1】局部作用域的效果

#include<iostream>

usingnamespacestd;

voidfun()〃变量num将在每次进入函数fun()时进行初始化

(

intnum=10;

cout«num«"\n";

num++;//这个语句没有持续效果

}

intmain()

(

for(inti=0;i<3;i++)

fun();

return0;

【案例5-2】屏蔽效应——作用域效果导致的名称隐藏

#include<iostream>

usingnamespacestd;

intmain()

(

inti=10,j=30;

if(j>0)

(

inti;〃内部的i将隐藏或屏蔽外层的i

i=j/2;

cout«"innervariablei:"«i«'\n';

)

cout«"outervariablei:"«i«'\n';

return0;

)

【案例5-31筛选偶数——文件作用域变量

#include<iostream>

usingnamespacestd;

intcount;//这是一个全局变量

voidfunc1()

voidfunc2();

cout«"count:"«count«'\n';〃可以访问全局变量count

func2();

voidfunc2()

(

intcount;//这是一个局部变量

for(count=0;count<2;count++)

cout«

)

intmain()

(

voidfunc1();

voidfunc2();

inti;//这是一个局部变量

for(i=0;i<10;i++)

(

count=i++;

func1();

)

return0;

【案例5-4]求数据序列的平均值——static局部变量的持续效果

#include<iostream>

usingnamespacestd;

intAverage(inti)

{

staticintsum=0,count=0;〃声明静态局部变量,具有全局寿命,局

部可见

sum=sum+i;count++;

returnsum/count;

}

intmain()

(

intnum;〃局部变量,具有动态生存期

do

(

cout«"Enternumbers(-1toquit):cin»num;

if(num!=-1)

cout«"Runningaverageis:"«Average(num);

cout«endl;

}while(num>-1);

return0;

【案例5-5]求数据序列的平均值——static全局变量的应用

#include<iostream>

usingnamespacestd;

intAverage(inti);

voidreset();

intmain()

(

intnum;〃局部变量,具有动态生存期

do

(

cout«"Enternumbers(-1toquit,-2toreset):

cin»num;

if(nurr)==-2)

(

reset();

continue;

)

if(nurr)!=-1)

cout«"Runningaverageis:"«Average(num);

cout«endl;

}while(num!=-1);

return0;

)

staticintsum=0,count=0;//静态全局变量,具有静态生存期,全

局可见

intAverage(inti)

|

sum=sum+i;count++;returnsum/count;

)

voidreset()

(

sum=0;count=0;

【案例5-6]时钟类——具有静态生存期的全局变量和全局对象

#include<iostream>

usingnamespacestd;

inth=O,m=O,s=O;〃声明全局变量,具有静态生存期

classClock

|

public:

Clock();

voidSetTime(intNewH,intNewM,intNewS);//三个形参均具有函数

原型作用域

voidShowTime();

-Clock(){}

private:

intHour,Minute,Second;

};

Clock::Clock()

(

Hour=h;Minute=m;Second=s;//使用全局变量初始化

}

voidClock::SetTime(intNewH,intNewM,intNewS)

(

Hour=NewH;Minute=NewM;Second=NewS;

)

voidClock::ShowTime()

(

cout«Hour«":"«Minute«":"«Second«endl;

)

ClockglobClock;〃声明对象globClock,具有静态生存期,

文件作用域

intmain()

(

cout«"lnitialtimeoutput:"«endl;

//引用具有文件作用域的对象globClock:

globClock.ShowTime();〃对象的成员函数具有类作用域

globClock.SetTime(10,20,30);〃将时间设置为10:20:30

〃调用拷贝构造函数,以globClock为初始值

ClockmyClock(globClock);//声明具有块作用域的对象

myClock

cout«"Settedtimeoutput:"«endl;

myClock.ShowTime();//引用具有块作用域的对象myClock

return0;

}

【案例5-7】实现数据共享——公有静态数据成员

#include<iostream>

usingnamespacestd;

classPubClass

(

public:

staticintnum;〃公有静态数据成员的声明

voidshownum(){cout«"Thenumis:"«num«endl;}

);

intPubClass::num;〃在类外定义num

intmain()

(

PubClassa,b;

PubClass::num=1000;〃通过类名访问静态成员num

a.shownum();

b.shownum();

a.num=2000;〃通过对象访问静态成员num

a.shownum();

b.shownum();

return0;

【案例5-8】实现数据共享——私有型静态数据成员

#include<iostream>

usingnamespacestd;

classPriClass

{

staticintnum;〃私有型静态成员

public:

voidsetnum(inti){num=i;};

voidshownum(){cout«"Thenumis:"«num«"\n";}

);

intPriClass::num;〃在类外定义num

intmain()

(

PriClassa,b;

a.shownum();b.shownum();

a.setnum(IOOO);//设置静态成员num为1000

a.shownum();b.shownum();

return0;

)

【案例5-9】实现函数共享——静态函数成员

#include<iostream>

usingnamespacestd;

classFunClass

|

staticintcount;//静态数据成员声明

public:

FunClass(){count++;cout«"Constructingobject"«count«

endl;}

~FunClass(){cout«"Destroyingobject"«count«

endl;count-;}

staticintGetCount(){returncount;}〃静态函数成员

};

intFunClass::count;〃静态数据成员定义

intmain()

(

FunClassa,b,c;

cout«"FromClass,therearenow"«FunClass::GetCount()«"in

existenceAn";

cout«"FromObject,therearenow"«a.GetCount()«"in

existenceAn";

return0;

【案例5-10]求最小公因子——友元函数的访问类的私有成员

include<iostream>

usingnamespacestd;

classFriFunClass

(

inta,b;

public:

FriFunClass(inti,intj){a=i;b=j;}

friendintFriFun(FriFunClassx);〃友元成员函数

);

intFriFun(FriFunClassx)〃注意:FriFun()不是任何类的成员函数

(

〃由于函数FriFun()是类FriFunClass的友元函数,所以它不能直接访问a

和b

intmax=x.a<x.b?x.a:x.b;

for(inti=2;i<=max;i++)

if((x.a%i)==0&&(x.b%i)==0)

returni;

return0;

intmain()

FriFunClassn(10,20);〃声明类对象

if(FriFun(n))

cout«"Commondenominatoris"«FriFun(n)«"\n";

elsecout«"NocommondenominatorAn";

return0;

}

【案例5-11]判断圆柱体和立方体的颜色是否相同—多个类共享友元函数

#include<iostream>

usingnamespacestd;

classCylinder;〃前向引用声明

enumColors{red,green,yellow};//定义颜色枚举类型

classCube

(

Colorscolor;

public:

Cube(Colorsc){color=c;}

friendboolTestSame(Cubex,Cylindery);〃声明为Cube的友元函数

);

classCylinder

{

Colorscolor;

public:

Cylinder(Colorsc){color=c;}

friendboolTestSame(Cubex,Cylindery);〃声明为Cylinder的友元函

);

boolTestSame(Cubex,Cylindery)

(

if(x.color==y.color)

returntrue;

elsereturnfalse;

}

intmain()

(

Cubecubel(red),cube2(yellow);

Cylindercyl(yellow);//声明对象并初始化

if(TestSame(cube1,cyl))

cout«"ThecolorofcubelandcylarethesameAn";

else

cout«"ThecolorofcubelandcylaredifferentAn";

if(TestSame(cube2,cyl))

cout«"Thecolorofcube2andcylarethesameAn";

else

cout«"Thecolorofcube2andcylaredifferentAn";

return0;

【案例5-12】计算2个三角形之和——友元函数的应用

include<iostream>

#include<cmath>

usingnamespacestd;

classTrig

(

doublex,y,z;

doublearea(){doubled=(x+y+z)/2;returnsqrt(d*(d-x)*(d-y)*(d-z));}

public:

Trig(inti,intj,intk){x=i;y=j;z=k;}

intisTriangle()//判而是否构成三角形

(

if(x+y>z&&x+z>y&&y+z>x)

return1;

else

return0;

}

frienddoubletwoarea(Trigtl,Trigt2)〃声明友元函数

(

returntl.area()+t2.area();

)

);

intmain()

|

Trigtl(3,5,7),t2(8,7,12);

if(tl.isTriangle()&&t2.isTriangle())

cout«"TotalareaoftwoTriangles:"«twoarea(tl,t2)«endl;

else

cout«"CannotformaTriangle"«endl;

return0;

}

【案例5-13]数据的单向传递——常引用作函数形参

#include<iostream>

usingnamespacestd;

〃常引用作形参,在函数中不能更新Z所引用的对象,因此对应的实参不会被破

坏。

voidfun(intx,int&y,constint&z)

(

X+=z;

y+=z;

cout«"x="«x«",y="«y«",z="«z«endl;

}

intmain()

(

inta=20,b=30,c=40;

cout«"a="«a«",b="«b«",c="«c«endl;

fun(a,b,c);

cout«"a="«a«",b="«b«",c="«c«endl;

fun(2*a-3,b,c);

cout«"a="«a«",b="«b«",c="«c«endl;

return0;

【案例5-141成员函数的选择调用——常成员函数

#include<iostream>

usingnamespacestd;

classZRF

{

public:

ZRF(intZ1,intZ2){ZRF1=Z1;ZRF2=Z2;}

voiddisp();

voiddisp()const;〃常成员函数声明

private:

intZRF1,ZRF2;

};

voidZRF::disp()

(

cout«ZRF1<<":"«ZRF2«endl;

}

voidZRF::disp()const〃常成员函数定义

(

cout«ZRF1«":"«ZRF2«endl;

)

intmain()

ZRFa(2,3);

a.disp();〃调用voiddisp()

constZRFb(10,20);

b.disp();〃调用voiddisp()const

return0;

【案例5-15】计算圆周长——不带参数的宏定义

#include<iostream>

usingnamespacestd;

#definePI3.14159//宏名PI为符号常量

#definena//宏名n将用a来替换

#defineLENGTH2*PI*n//宏名LENGTH将用2*PI*n来替换

intmain()

intn=1;//intn=1潜换为inta=1;

cout«"LENGTH="«LENGTH«endl;〃替换为

cout«"LENGTH="«2*3.14159*a«endl;

return0;

)

【案例5-16】求三角形面积——带参数的宏函数

#include<iostream>

#include<cmath>

usingnamespacestd;

#defines(a,b,c)(a+b+c)/2〃带参数的宏

#definearea(a,b,c)sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))〃带参

数的宏

intmain()

(

floatx=4,y=5,z=6;

cout«"Theareais:"«area(x,y,z)«endl;〃编译时发

生宏替换

cout«"Theareais:"«area(5,4,3)«endl;〃编译时发生

宏替换

return0;

【案例5-17】求最小值——带参数的宏函数和内联函数

#include<iostream>

usingnamespacestd;

inlinemin(intx,inty,intz)〃内联函数

intmin=x;

if(y<min)min=y;

if(z<min)min=z;

returnmin;

}

#defineMIN(a,b)((a)<(b)?(a):(b))〃宏函数

#definemin(a,b,c)MIN(a,MIN(c,b))〃宏函数

intmain()

(

cout«"Theminvalueis:"«(min)(4,5,3.0)«endl;〃调用内联函数

cout«"Theminvalueis:"«min(5.0,4,3.0)«endl;〃调用宏函数

return0;

)

【案例5-18]程序调试阶段的条件编译#ifndef-#else-#endif

#include<iostream>

usingnamespacestd;

#defineRUN〃语句1:在调试程序时使之成为注释行

intmain()

(

intx=1,y=2,z=3;

#ifndefRUN〃语句2:本行为条件编译命令

cout<<"x="«x<<",y="«y«",z="«z;〃语句3:在调试程序时需要

输出信息

#endif//语句4:本行为条件编译命令

cout«"x*y*z="«x*y*z«endl;

return0;

【案例5-19】综合案例——统计银行存款问题

#include<iostream>

usingnamespacestd;

classBBank;〃前向引用声明

classGBank;〃前向引用声明

classCBank//声明中国银行类

{

intbalance;

public:

CBank(){balance=O;}//默认构造函数

CBank(intb){balance=b;}〃构造函数

voidgetbalance(){cout«"InputthesavingsinChinaBank:";cin»

balance;}

voiddisp(){cout«"ThesavingsinChina

温馨提示

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

评论

0/150

提交评论