高级C开发技术习题解答1.docx
《高级C开发技术习题解答1.docx》由会员分享,可在线阅读,更多相关《高级C开发技术习题解答1.docx(64页珍藏版)》请在冰点文库上搜索。
高级C开发技术习题解答1
高级C#开发技术习题
1.用enum定义字节类型的方位常量,打印出某一方位并将此方位值转化为字节类型,字符串类型值。
分析输出结果的原因。
回答以下问题:
Enum的缺省类型是什么?
回答:
Enum在C#中是一种值类型(ValueType),其基类型必须是整数类型(如Int16)
直接输出myDirection和(byte)myDirection有何区别。
回答:
这是符号名和常数值的互相转换,当枚举变量转换为常数值时,必须使用强制转换。
classVariables
{
enumorientation:
byte
{
north=1,
south=2,
east=3,
west=4
}
staticvoidMain(string[]args)
{
bytedirectionByte;
stringdirectionString;
orientationmyDirection=orientation.north;
Console.WriteLine("myDirection={0}",myDirection);
directionByte=(byte)myDirection;
directionString=Convert.ToString(myDirection);
Console.WriteLine("byteequivalent={0}",directionByte);
Console.WriteLine("stringequivalent={0}",directionString);
Console.ReadLine();
}
}
2.建立使用关系运算符和逻辑运算符的程序文件。
Main方法中实例代码如下
staticvoidMain(string[]args)
{
Console.WriteLine("Enteraninteger:
");
intmyInt=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Integerlessthan10?
{0}",myInt<10);
Console.WriteLine("Integerbetween0and5?
{0}",
(0<=myInt)&&(myInt<=5));
Console.WriteLine("BitwiseANDofIntegerand10={0}",myInt&10);
Console.ReadLine();
}
编译运行该程序。
并尝试myInt输入不同范围整数,非10和10时的输出差异。
3.定义一个TimeSpan类,用TimeSpan.Add方法实现类中对象的加法,程序具体功能要求如下:
TimeSpan类含一个总耗费秒数变量,每小时秒数3600常量,每分钟秒数60常量;
构造方法实现无参数时总耗秒为初设为0,具有小时、分钟和秒参数时总耗秒为小时和分钟及秒总含秒数;
打印出总共消耗小时数、分钟数和秒数;
定义TimeSpanAdd方法,实现两个TimeSpan对象的加和;
参考代码如下:
usingSystem;
classTimeSpan
{
privateuinttotalSeconds;
privateconstuintSecondsInHour=3600;
privateconstuintSecondsInMinute=60;
publicTimeSpan()
{
totalSeconds=0;
}
publicTimeSpan(uintinitialHours,uintinitialMinutes,
uintinitialSeconds)
{
totalSeconds=initialHours*SecondsInHour+
initialMinutes*SecondsInMinute+initialSeconds;
}
publicuintSeconds
{
get
{
returntotalSeconds;
}
set
{
totalSeconds=value;
}
}
publicvoidPrintHourMinSec()
{
uinthours;
uintminutes;
uintseconds;
hours=totalSeconds/SecondsInHour;
minutes=(totalSeconds%SecondsInHour)/SecondsInMinute;
seconds=(totalSeconds%SecondsInHour)%SecondsInMinute;
Console.WriteLine("{0}Hours{1}Minutes{2}Seconds",
hours,minutes,seconds);
}
publicstaticTimeSpanAdd(TimeSpantimeSpan1,TimeSpantimeSpan2)
{
TimeSpansumTimeSpan=newTimeSpan();
sumTimeSpan.Seconds=timeSpan1.Seconds+timeSpan2.Seconds;
returnsumTimeSpan;
}
}
classTimeSpanTest
{
publicstaticvoidMain()
{
TimeSpantotalTime;
TimeSpanmyTime=newTimeSpan(1,20,30);
TimeSpanyourTime=newTimeSpan(2,40,45);
totalTime=TimeSpan.Add(myTime,yourTime);
Console.Write("Mytime:
");myTime.PrintHourMinSec();
Console.Write("Yourtime:
");yourTime.PrintHourMinSec();
Console.Write("Totaltime:
");totalTime.PrintHourMinSec();
}
}
将以上程序的TimeSpanAdd方法改为加号操作符重载的实现,并回答有何异同。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceTest
{
classTimeSpan
{
privateuinttotalSeconds;
privateconstuintSecondsInHour=3600;
privateconstuintSecondsInMinute=60;
publicTimeSpan()
{
totalSeconds=0;
}
publicTimeSpan(uintinitialHours,uintinitialMinutes,
uintinitialSeconds)
{
totalSeconds=initialHours*SecondsInHour+
initialMinutes*SecondsInMinute+initialSeconds;
}
publicuintSeconds
{
get
{
returntotalSeconds;
}
set
{
totalSeconds=value;
}
}
publicvoidPrintHourMinSec()
{
uinthours;
uintminutes;
uintseconds;
hours=totalSeconds/SecondsInHour;
minutes=(totalSeconds%SecondsInHour)/SecondsInMinute;
seconds=(totalSeconds%SecondsInHour)%SecondsInMinute;
Console.WriteLine("{0}Hours{1}Minutes{2}Seconds",
hours,minutes,seconds);
}
publicstaticTimeSpanoperator+(TimeSpantimeSpan1,TimeSpantimeSpan2)
{
TimeSpansumTimeSpan=newTimeSpan();
sumTimeSpan.Seconds=timeSpan1.Seconds+timeSpan2.Seconds;
returnsumTimeSpan;
}
}
classProgram
{
staticvoidMain(string[]args)
{
TimeSpantotalTime;
TimeSpanmyTime=newTimeSpan(1,20,30);
TimeSpanyourTime=newTimeSpan(2,40,45);
totalTime=myTime+yourTime;
Console.Write("Mytime:
");myTime.PrintHourMinSec();
Console.Write("Yourtime:
");yourTime.PrintHourMinSec();
Console.Write("Totaltime:
");totalTime.PrintHourMinSec();
Console.ReadLine();
}
}
}
4.多态程序练习:
基类shape类是一个表示形状的抽象类,area()为求图形面积的函数。
请从shape类派生三角形类(triangle)、圆类(circles)、并给出具体的求面积函数,并在主函数中多态地实现调用。
usingSystem;
namespaceVariables
{
//publicabstractclassshape
//{
//publicabstractvoidMyArea();
//}
publicclassshape
{
publicvirtualvoidMyArea()
{
Console.WriteLine("nouse");
}
}
publicclasscircle:
shape
{
doubler,carea;
publiccircle(doubler)
{
this.r=r;
}
publicoverridevoidMyArea()
{
carea=Math.PI*r*r;
Console.WriteLine("该图形的面积为{0}",carea);
}
}
publicclasstriangle:
shape
{
doubletarea,hemiline,h;
publictriangle(doublehemiline,doubleh)
{
this.hemiline=hemiline;
this.h=h;
}
publicoverridevoidMyArea()
{
tarea=hemiline*h/2;
Console.WriteLine("hemiline={0},h={1}",hemiline,h);
Console.WriteLine("该图形的面积为{0}",tarea);
}
}
publicclassTester
{
publicstaticvoidMain()
{
shapeMyShape;
doubler=Convert.ToDouble(Console.ReadLine());
MyShape=newcircle(r);
MyShape.MyArea();
doubleh=Convert.ToDouble(Console.ReadLine());
doublehemiline=Convert.ToDouble(Console.ReadLine());
MyShape=newtriangle(hemiline,h);
MyShape.MyArea();
Console.ReadLine();
}
}
}
运行结果:
思考:
(1)将类shape定义为抽象类含有MyArea抽象方法再调试程序,查看效果。
(2)并回答抽象方法是否可以含{}主体?
(3)如果将基类中虚方法关键字virtual去掉程序会怎样?
5.覆盖虚接口程序:
以下程序组合了多种功能,请参考如下代码解释并回答问题。
●该程序包含的类的个数和关系?
●类对接口的实现有何区别?
“interface”(接口)关键字使抽象的概念更深入了一层。
我们可将其想象为一个“纯”抽象类。
它允许创建者规定一个类的基本形式:
方法名、自变量列表以及返回类型,但不规定方法主体。
接口也包含了基本数据类型的数据成员,但它们都默认为static和final。
接口只提供一种形式,并不提供实施的细节。
接口这样描述自己:
“对于实现我的所有类,看起来都应该象我现在这个样子”。
因此,采用了一个特定接口的所有代码都知道对于那个接口可能会调用什么方法。
这便是接口的全部含义。
所以我们常把接口用于建立类和类之间的一个“协议”。
有些面向对象的程序设计语言采用了一个名为“protocol”(协议)的关键字,它做的便是与接口相同的事情。
为创建一个接口,请使用interface关键字,而不要用class。
与类相似,我们可在interface关键字的前面增加一个public关键字(但只有接口定义于同名的一个文件内);或者将其省略,营造一种“友好的”状态。
为了生成与一个特定的接口(或一组接口)相符的类,要使用implements(实现)关键字。
我们要表达的意思是“接口看起来就象那个样子,这儿是它具体的工作细节”。
除这些之外,我们其他的工作都与继承极为相似。
●第一个类中无参数构造函数是否起作用,是否可以删除不用?
初始化totalSeconds,不能删除。
●类中的属性在哪里被应用到?
需要输出的时候用到。
Console.WriteLine(time.Seconds);
●第一个类中哪些成员被继承,列出所有?
totalSeconds
●第二个类中构造方法成员如何实现,有何意义?
可以去掉么?
调用基类的构造函数。
起到代码重用的作用。
publicTimeSpanAdvanced(uintinitialSeconds):
base(initialSeconds)
●第二个类覆盖第一个类中接口虚方法,程序体现了什么功能区别?
●Sorter类有何作用?
你能否根据Sorter类写一个十个数比较大小的冒泡法程序?
●Sorter类中for(inti=0;swapped;i++)和//for(inti=0;i●你知道Console.WriteLine("runoutter");和Console.WriteLine("runinner");在程序运行过程中可以起到什么作用?
●将Main方法中的TimeSpan对象语句(注释掉的5行)和TimeSpanAdvanced对象语句选择轮流注释,体验排序结果的异同。
●语句Sorter.BubbleSortAscending(raceTimes);前后的foreach语句功能区别。
usingSystem;
publicinterfaceIComparable
{
intCompareTo(IComparablecomp);
}
publicclassTimeSpan:
IComparable
{
privateuinttotalSeconds;
publicTimeSpan()
{
totalSeconds=0;
}
publicTimeSpan(uintinitialSeconds)
{
totalSeconds=initialSeconds;
}
publicuintSeconds
{
get
{
returntotalSeconds;
}
set
{
totalSeconds=value;
}
}
publicvirtualintCompareTo(IComparablecomp)
{
TimeSpancompareTime=(TimeSpan)comp;
if(totalSeconds>compareTime.Seconds)
return1;
elseif(compareTime.Seconds==totalSeconds)
return0;
else
return-1;
}
}
publicclassTimeSpanAdvanced:
TimeSpan
{
publicTimeSpanAdvanced(uintinitialSeconds):
base(initialSeconds)
{
//
}
publicoverrideintCompareTo(IComparablecomp)
{
TimeSpancompareTime=(TimeSpan)comp;
if(base.Seconds>compareTime.Seconds)
{
if(base.Seconds>(compareTime.Seconds+50))
return2;
else
return1;
}
elseif(base.Seconds{
if(base.Seconds<(compareTime.Seconds-50))
return-2;
else
return-1;
}
else
return0;
}
}
classSorter
{
//Sortthecomparableelementsofanarrayinascendingorder
publicstaticvoidBubbleSortAscending(IComparable[]bubbles)
{
boolswapped=true;
for(inti=0;swapped;i++)
//for(inti=0;i{
Console.WriteLine("runoutter");
swapped=false;
for(intj=0;j<(bubbles.Length-(i+1));j++)
{
if(bubbles[j].CompareTo(bubbles[j+1])>0)
{
Console.WriteLine("runinner");
Swap(j,j+1,bubbles);
swapped=true;
}
}
}
}
//Swaptwoelementsofanarray
publicstaticvoidSwap(intfirst,intsecond,IComparable[]arr)
{
IComparabletemp;
temp=arr[first];
arr[first]=arr[second];
arr[second]=temp;
}
}
classTester
{
publicstaticvoidMain()
{
//TimeSpan[]raceTimes=newTimeSpan[4];
//raceTimes[0]=newTimeSpan(153);
//raceTimes[1]=newTimeSpan(165);
//raceTimes[2]=newTimeSpan(142);
//raceTimes[3]=newTimeSpan(108);
TimeSpanAdvanced[]raceTimes=newTimeSpanAdvanced[4];
raceTimes[0]=newTimeSpanAdvanced(153);
raceTimes[1]=newTimeSpanAdvanced(165);
raceTimes[2]=newTimeSpanAdvanced(142);
raceTimes[3]=newTimeSpanAdvanced(108);
foreach(TimeSpantimeinraceTimes)
{
Console.WriteLine(time.Seconds);
}
Sorter.BubbleSortAscending(raceTimes);
Console.WriteLine("Listofsortedtimespans:
");
foreach(TimeSpantimeinraceTimes)
{
Console.WriteLine(time.Seconds);
}
Console.ReadLine();
}
}
运行结果:
6.一个强大而复杂的银行模拟程序:
模拟一个持有若干银行账号的银行,银行帐户可以通过控制台窗口提供的一个简单用户界面来访问和操作。
用户通过发出简单命令必须能:
开始指定由银行管理的账户数;
在指定帐户上存款;
从指定帐户上提款;
设置指定帐户的利率;
将利息加到所有帐户上;
打印帐户结算;
打印支付给每个帐户的利息;
打印每个帐户的利率;
结束模拟。
软件分析:
确定两个明显的类:
Account和Bank及将二者功能对应的包含Mai