高级C开发技术习题.docx
《高级C开发技术习题.docx》由会员分享,可在线阅读,更多相关《高级C开发技术习题.docx(26页珍藏版)》请在冰豆网上搜索。
高级C开发技术习题
高级C#开发技术习题
1.用enum定义字节类型的方位常量,打印出某一方位并将此方位值转化为字节类型,字符串类型值。
分析输出结果的原因。
回答以下问题:
Enum的缺省类型是什么?
直接输出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方法改为加号操作符重载的实现,并回答有何异同。
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抽象方法再调试程序,查看效果,并回答抽象方法是否可以含{}主体?
;如果将基类中虚方法关键字virtual去掉程序会怎样?
5.覆盖虚接口程序:
以下程序组合了多种功能,请参考如下代码解释并回答问题。
●该程序包含的类的个数和关系?
●类对接口的实现有何区别?
●第一个类中无参数构造函数是否起作用,是否可以删除不用?
●类中的属性在哪里被应用到?
●第一个类中哪些成员被继承,列出所有?
●第二个类中构造方法成员如何实现,有何意义?
可以去掉么?
●第二个类覆盖第一个类中接口虚方法,程序体现了什么功能区别?
●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及将二者功能对应的包含Main方法的BankSimulation;
Account帐户类包含实例变量:
结算总额,当前利率,总支付利息;另外帐户类应含有对帐户结算增减、利率计算等的方法;所有实例变量在构造函数中被初始化。
Bank类的实例变量:
一个帐户数组,先要求输入帐户数组元素个数;通过构造方法初始化帐户数组。
其它涉及信息都可以在帐户类生成的对象里获得;
因为Account对象内一般实例变量为private,无法被外部访问,所以Bank类要想访问,可以用属性或存取器、变异器方法。
如currentInterestRate用setInterestRate和GetInterestRate来对当前利率赋值和读取,从而实现通过存取器对私有变量的外部访问。
Balance和totalInterestPaid也分别通过响应的存取方法返回值。
注意:
设第一个帐户accountnumber为1,其对应的数组索引为0,所以,Bank类中有accounts[accountNumber-1]的应用。
BankSimulation仅需要一个实例变量,一个Bank对象,其它对应到前两个类中;
示例代码如下,阅读后回答问题:
usingSystem;
classAccount
{
privatedecimalbalance;
privatedecimalcurrentInterestRate;
privatedecimaltotalInterestPaid;
publicAccount()
{
balance=0;
currentInterestRate=0;
totalInterestPaid=0;
}
publicvoidSetInterestRate(decimalnewInterestRate)
{
currentInterestRate=newInterestRate;
}
publicdecimalGetInterestRate()
{
returncurrentInterestRate;
}
publicvoidUpdateInterest()
{
totalInterestPaid+=balance*currentInterestRate;
balance+=balance*currentInterestRate;
}
publicvoidWithdraw(decimalamount)
{
balance-=amount;
}
publicvoidDeposit(decimalamount)
{
balance+=amount;
}
publicdecimalGetBalance()
{
returnbalance;
}
publicdecimalGetTotalInterestPaid()
{
returntotalInterestPaid;
}
}
classBank
{
privateAccount[]accounts;
publicBank()
{
Console.WriteLine("Congratulations!
Youhavecreatedanewbank");
Console.Write("Pleaseenternumberofaccountsinbank:
");
accounts=newAccount[Convert.ToInt32(Console.ReadLine())];
for(inti=0;i{
accounts[i]=newAccount();
}
}
publicvoidDeposit()
{
intaccountNumber;
decimalamount;
Console.Write("Deposit.Pleaseenteraccountnumber:
");
accountNumber=Convert.ToInt32(Console.ReadLine());
Console.Write("Enteramounttodeposit:
");
amount=Convert.ToDecimal(Console.ReadLine());
accounts[accountNumber-1].Deposit(amount);
Console.WriteLine("Newbalanceofaccount{0}:
{1:
C}",
accountNumber,accounts[accountNumber-1].GetBalance());
}
publicvoidWithdraw()
{
intaccountNumber;
decimalamount;
Console.Write("Withdraw.Pleaseenteraccountnumber:
");
accountNumber=Convert.ToInt32(Console.ReadLine());
Console.Write("Enteramounttowithdraw:
");
amount=Convert.