1.2实验二C#基本编程方法练习本实验主要是为了让读者练习如何用Windows窗体应用程序实现指定的功能,掌握用C#语言编写应用程序代码的基本方法。建议用4小时完成本实验。1.2.1实验目的用Windows窗体应用程序实现超级存款计算器的功能。读者通过本实验,应达到如下目标:(1)练习C#中变量声明和赋值的方法。(2)练习类型转换的方法。(3)练习分支语句的基本用法。(4)练习循环语句的基本用法。1.2.2实验内容为银行个人存款客户提供一个“超级存款计算器”,以简单直观的操作界面为客户提供一个银行存款本息到期金额结算查询程序,以便客户决定选择哪种存款方式。程序运行效果如图1-3所示。图1-3超级存款计算器运行效果当用户输入存款金额及相应信息后,单击【计算】按钮,程序能自动在【到期结算总额】中显示到期应得的本金和利息合计总金额。如果输入内容不符合要求,弹出对话框显示对应的提示信息。具体要求如下。(1)初始存款金额不能低于100元,否则不进行计算并弹出对话框显示相应的提示信息。(2)用下拉框显示利息计算方式,下拉框提供“按月计息”、“按季度计息”和“按年计息”3种选项。按月计息是指每月计算一次应得的利息,并将应得的利息作为新存款,自动添加到用户的现有存款金额中。例如,存款人第一次存入金额1000元,年利率为2%,则第一个月的利息为1000×(0.02÷12)元,第二个月的利息为(1000+第一个月的利息)×(0.02÷12)元,依次类推。按季度计息是指每季度计算一次应得的利息,并将应得的利息作为新存款添加到用户存款金额中。例如,存款人第一次存入金额1000元,年利率为2%,则第一个季度的利息为1000×(0.02÷4)元,第二个季度的利息为(1000+第一个季度的利息)×(0.02÷4)元,依次类推。按年计息是指每年计算一次应得的利息,并将应得的利息作为新存款添加到用户存款金额中。例如,存款人第一次存入金额100元,年利率为2%,则第一年的利息x1:100×0.02元,第一年结算余额y1:100+x1第二年的利息x2:y1×0.02元,第二年结算余额y2:y1+x2第三年的利息x3:y2×0.02元,第三年结算余额y3:y2+x3……(3)到期结算的总金额四舍五入到小数点后两位。1.2.3实验要求要求程序中至少提供下列方法。①Caculate方法功能:计算到期结算金额。方法原型:privatefloatCaculate(floatstartAmount,floatrate,intcount)其中,startAmount表示存款金额,rate表示利率,count表示叠加次数。返回值为到期金额。②ConvertStringToNumber方法功能:将大于零的字符串转换为32位整数或者64位浮点数,并指明转换是否成功。方法原型(提供两种重载形式):privateboolConvertStringToNumber(strings,boolmustGreatThanZero,outintresult)privateboolConvertStringToNumber(strings,boolmustGreatThanZero,outfloatresult)其中,s为被转换的字符串,mustGreatThanZero为是否要求被转换的内容必须大于零,result为转换后的32位整数或者64位浮点数。1.2.4实验提示(1)创建一个名为SuperCalculator的Windows窗体应用程序项目。(2)通过窗体的Shown事件,让窗体界面显示时光标默认在存款金额文本框中闪烁。privatevoidFormMain_Shown(objectsender,EventArgse){textBoxStartAmount.Focus();}(3)通过GroupBox控件的Enter事件,保证修改输入信息中任何一个内容时,到期结算金额中都不能显示值,而只有单击【计算】按钮才显示结算结果。privatevoidgroupBox1_Enter(objectsender,EventArgse){//保证修改任一输入值时,不显示计算结果LabelResult.Text=string.Empty;}(4)在【计算】按钮的Click事件中,先判断输入信息是否符合要求,然后根据利息计算方式计算到期结算金额。实现代码中可以利用ComboBox控件的【SelectedItem】属性判断用户选择的值,利用【SelectedIndex】属性判断是否选择了提供的选项。例如if(comboBoxCalculateType.SelectedIndex==−1){MessageBox.Show(请选择提供的利息计算方式);return;}即如果没有选择任一个选项,SelectedIndex属性返回−1。(5)如果希望通过代码设置程序开始运行时窗体的起始位置在屏幕中间,可以在构造函数中添加如下代码。publicMainForm(){InitializeComponent();this.StartPosition=FormStartPosition.CenterScreen;}这里有一个输入技巧:输入完this.StartPosition后面的“=”后,直接按空格键,系统会自动出现FormStartPosition,然后直接键入“.”,在选择希望的枚举值后按回车键。凡是以枚举类型出现的都可以采用这种办法提高键入代码的速度。再举一个例子,输入MessageBox.Show(aa,bb,MessageBoxButtons.YesNo,MessageBoxIcon.Asterisk);输入技巧为:输入bb后面的“,”后,按空格键,出现MessageBoxButtons,选择YesNo,按回车键,然后键入逗号,再按空格键,出现MessageBoxIcon,选择Asterisk,按回车键。最后输入其他内容。如果按空格键后没有出现希望的选项,可以先用上下箭头键选择合适的重载方法,然后按空格键。另外,在已有代码的前面增加内容时,如果希望输入时就有智能提示,当输入一个字母后还没有提示,可以先输入一个空格,然后在空格的前面添加内容就有提示了。(6)使用已经声明过的变量、对象名,或者输入类名时,或者键入“.”后,如果应该有对应的智能提示却没有看到智能提示时,说明前面的输入肯定有问题,这时不要再继续输入内容了,因为再输入的内容肯定也是错的,而应该思考一下问题在哪,这样才能有效地提高编写和调试程序的效率。(7)将重复使用的功能,用单独的方法实现,并使用XML注释方式给方法添加注释。使用XML注释方式时,注意一定要先定义好方法及参数,然后再在其上面按“///”添加注释。(8)下面列出MainForm.cs的部分参考代码。publicpartialclassMainForm:Form{publicMainForm(){InitializeComponent();this.StartPosition=FormStartPosition.CenterScreen;string[]caclType={按月计息,按季度计息,按年计息};comboBoxCalculateType.Items.AddRange(caclType);comboBoxCalculateType.SelectedIndex=0;labelResult.Text=string.Empty;}privatevoidMainForm_Shown(objectsender,EventArgse){textBoxStartAmount.Focus();}privatevoidbuttonOK_Click(objectsender,EventArgse){//存款金额intstartAmount;//年利率floatyearRate;//存期intyears;if(!ConvertStringToNumber(textBoxStartAmount.Text,true,outstartAmount)){MessageBox.Show(存款金额输入有错!,提示,MessageBoxButtons.OK,MessageBoxIcon.Warning);return;}if(startAmount100){MessageBox.Show(存款金额不能小于100元,提示,MessageBoxButtons.OK,MessageBoxIcon.Warning);return;}if(ConvertStringToNumber(textBoxYearRate.Text,true,outyearRate)==false){MessageBox.Show(年利率输入有错!,提示,MessageBoxButtons.OK,MessageBoxIcon.Warning);return;}yearRate/=100.0f;if(ConvertStringToNumber(textBoxYears.Text,true,outyears)==false){MessageBox.Show(存期(年)输入有错!,提示,MessageBoxButtons.OK,MessageBoxIcon.Warning);return;}if(comboBoxCalculateType.SelectedIndex==-1){MessageBox.Show(请选择提供的利息计算方式,提示,MessageBoxButtons.OK,MessageBoxIcon.Warning);return;}labelParameter.Text=string.Format(存款金额:{0}元{3}{3}年利率:{1}%{3}{3}存期:{2}年,startAmount,yearRate*100,years,Environment.NewLine);switch(comboBoxCalculateType.SelectedItem.ToString()){case按月计息:labelResult.Text=string.Format({0:F2}元,Caculate(startAmount,yearRate/12,years*12));break;case按季度计息:labelResult.Text=string.Format({0:F2}元,Caculate(startAmount,yearRate/4,years*4));break;case按年计息:labelResult.Text=string.Format({0:F2}元,Caculate(startAmount,yearRate,years));break;}}privatevoidgroupBox1_Enter(objectsender,EventArgse){//保证修改任一输入值时,不显示结果labelParameter.Text=string.Empty;labelResult.Text=string.Empty;}///summary///将字符串转换为32位整数////summary///paramname=s被转换的字符串/param///paramname=mustGreatThanZero是否有必须大于零的要求/param///paramname=result转换后的结果/param///returns/returnsprivateboolConvertStringToNumber(strings,boolmustGreatThanZero,outintresult){if(int.TryParse(s,outresult)==false){returnfalse;}elseif(mustGreatThanZero&&result=0){returnfalse;}returntrue;}///summary///将字符串转换为64位浮点数////summary///paramn