C# 实验四 习题以及答案Word文档下载推荐.docx
《C# 实验四 习题以及答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C# 实验四 习题以及答案Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。
格式化输出统计结果
stringstr=string.Format("
{0,-15}{1,3}"
de.Key,de.Value);
txtFile.Text=txtFile.Text+str+"
\r\n"
图2词频统计界面
二.异常处理-简单的除法运算器
鉴于大家上课留实验的时候面色不太正常,故降低实验难度,哈哈,老师我还是很和谐滴!
1.创建项目L4_2。
2.两个加数分别输入2和3,调试并修改程序,得出结果
3.
两个加数分别输入字符a和b,调试并修改程序,在结果文本框中输出相应的异常提示,如图3所示。
图3格式化异常
4.两个加数分别输入123456789876543和1,调试并修改程序,在结果文本框中输出相应的异常提示。
5.两个加数分别输入123和0,调试并修改程序,尝试用finally处理该异常。
6.定义一个自己的异常MyException,并在TxtOp1或者TxtOp2为空的时候,抛出该异常。
利用catch语句将该异常捕捉。
try
{
if(TxtOp1.Text=="
"
||TxtOp2.Text=="
)
thrownewmyexception("
不能为空!
);
}
catch(myexceptionme)
MessageBox.Show(me.Message);
三、委托练习
以委托对象作为方法的参数,对学生类对象分别按照姓名、年龄和年级来比较两个学生对象,实现程序以不同的排序方式来输出学生信息。
(1)创建一个控制台应用程序L4_3。
(2)在Program.cs文件中,首先定义Student类:
●定义三个私有字段,包括字符串类型的姓名、整型的年龄、整型的年级
●分别定义三个共有属性
●定义带参构造函数Student(stringname,intage,intgrade)
●声明委托CompareFunction
publicdelegateintCompareFunction(Students1,Students2);
●定义方法SortPrint
提示:
这里利用委托,可以根据用户的不同选择,调用CompareName、CompareAge或者CompareGrade方法,来实现不同的排序方式,使用的冒泡排序方法。
publicstaticvoidSortPrint(Student[]students,CompareFunctioncompare)
for(inti=students.Length-1;
i>
0;
i--)
for(intj=0;
j<
i;
j++)
if(compare(students[j],students[j+1])>
0)
Students=students[j];
students[j]=students[j+1];
students[j+1]=s;
foreach(Studentsinstudents)
Console.WriteLine(s);
(3)在Program.cs文件中,定义三个与委托具有同相同签名的方法CompareName、CompareAge和CompareGrade
staticintCompareName(Students1,Students2)
returns1.Name.CompareTo(s2.Name);
staticintCompareAge(Students1,Students2)
//todo
staticintCompareGrade(Students1,Students2)
(4)在Main函数中通过选择排序方式(A姓名、B年龄、C年级)确定SortPrint方法调用的第2个参数(CompareFunction委托类型),以实现不同的排序方式。
staticvoidMain(string[]args)
Student[]students=newStudent[5];
students[0]=newStudent("
zhang"
18,2);
Student.CompareFunctioncompare;
Console.WriteLine("
请选择排序方式:
A姓名B年龄C年级"
charch=Console.ReadKey().KeyChar;
if(ch=='
B'
||ch=='
b'
compare=CompareAge;
\n"
Student.SortPrint(students,compare);
Console.ReadLine();
运行界面如图4所示。
图4按年龄排序
四.异常抛出和捕捉
编写一个计算阶乘的程序,当不能存储该数值时,引发异常。
(1)创建一个控制台应用程序L4_4。
(2)在Program类的Main方法中输入相应代码,当输入数据无效或运算结构超出数据范围时,使用throw抛出异常,然后在catch代码块中进行处理。
●数据无效异常FormatException(),输出提示“输入数据错误,应输入一个正整数”
●超出数据范围异常OverFlowexception,输出提示“程序运行结果超出数据范围”
if(x<
0)thrownewFormatException();
五.模拟连锁反应事件(验证型题目)
本题目旨在使同学们对事件的使用有所了解,在事件机制中,事件的提供者(Provider)中定义事件成员(即提供事件),并且具有引发事件的功能(在该类的其他成员中引发事件);
而事件的订阅者(Client)对事件的订阅是通过将事件与事件处理方法相关联完成的(通过+=符号)。
(1)创建C#控制台应用程序L4_5。
(2)新建一个表示太阳的类Sun,在其中定义一个事件OnRise,一个成员方法Rise,并在方法中引发。
参考源代码如下(太阳只有一个,所以将其定义为静态类,静态类中只能定义静态成员):
publicstaticclassSun
{
publicstaticeventEventHandlerOnRise;
//定义了一个事件成员OnRise
publicstaticvoidRise()//引发事件的函数成员
太阳从东方升起..."
if(OnRise!
=null)
OnRise(null,null);
//引发事件OnRise
(3)在程序中新建一个公鸡类Cock,在其中定义:
●私有字段_name;
●针对Sun.OnRise事件的处理方法Sun_OnRise;
●事件OnSing;
●引发事件OnSing的方法Sing。
●构造函数,初始化私有字段_name,并将事件处理方法与事件进行关联。
参考源代码如下:
publicclassCock
privatestring_name;
//私有字段,用于存放Cock实例的名称
publicCock(stringname)//构造函数,初始化字段,并将事件关联至处理方法
_name=name;
Sun.OnRise+=newEventHandler(Sun_OnRise);
//定义Sun.OnRise事件的处理方法
privatevoidSun_OnRise(objectsender,EventArgse)
公鸡{0}:
_name);
雄鸡一声天下白!
this.Sing();
//调用Sing方法以引发自身的事件OnSing
publiceventEventHandlerOnSing;
//Cock类的事件成员
publicvoidSing()//引发OnSing事件的方法
喔喔喔..."
if(OnSing!
OnSing(this,null);
(4)在程序中新建一个主人类Host,在其中同样定义:
●起床事件OnGetup;
●起床方法Getup(引发起床事件的成员);
●养鸡方法Foster,在该方法中将事件OnSing与事件处理方法c1_OnSing相关联;
●Cock.OnSing事件的处理方法c1_OnSing。
(c1_OnSing方法中调用Getup方法,表示公鸡打鸣会使主人起床)
publicclassHost
publicHost(stringname)
publiceventEventHandlerOnGetup;
//Host类的事件成员
publicvoidGetup()
日出而作..."
if(OnGetup!
OnGetup(this,null);
publicvoidFoster(Cockc1)
c1.OnSing+=newEventHandler(c1_OnSing);
privatevoidc1_OnSing(objectsender,EventArgse)
主人{0}:
闻鸡起舞!
this.Getup();
(5)新建狗类Dog和猫类Cat,在其中定义:
●私有字段_owner,记录器主人对象;
●owner_OnGetup方法,处理Host.OnGetup事件(主人起床时,狗和猫的动作);
●公有属性Owner封装字段_owner,并在其set访问函数中关联事件和事件处理方法;
publicclassDog
privateHost_owner;
publicHostOwner
get{returnthis.owner;
set
this._owner=value;
this._owner.OnGetup+=newEventHandler(owner_OnGetup);
publicDog(stringname)
privatevoidowner_OnGetup(objectsender,EventArgse)
{0}:
汪汪...主人起床了,我也该起了"
publicclassCat
get{returnthis._owner;
this._owner.OnGetup+=newEventHandler(owner_OnGetup);
publicCat(stringname)
喵喵...主人起床了,我也该起了"
(6)在程序主方法中依次建立鸡、主人、狗、猫对象,而后调用Sun.OnRise方法,参考源代码如下:
classL4_5
staticvoidMain()
Cockcock1=newCock("
花花"
Hosthost1=newHost("
小明"
host1.Foster(cock1);
Dogdog1=newDog("
阿黄"
dog1.Owner=host1;
Catcat1=newCat("
咪咪"
cat1.Owner=host1;
Sun.Rise();
六.使用泛型类List<
T>
(1)创建C#Windows应用程序L4_6。
(2)向程序主窗体中分别加入4个RadioButton控件、一个RichTextBox控件、一个ListBox控件,以及一个Button控件,控件的内容和布局如图2所示。
(3)为按钮控件添加单击事件处理代码:
当用户选中第一个单选框“字符串”时,创建一个构造类型List<
string>
的对象,将RichTextBox控件中的各行文本依次加入到该列表对象中,而后调用对象的Sort方法对列表排序,最后将内容显示在ListBox控件中,参考源代码如下:
string[]ss=richTextBox1.Text.Trim().Split('
\n'
//String类的split方法的用法
if(radioButton1.Checked)//单选按钮的Checked属性,用于指示该按钮是否被选中
List<
l1=newList<
();
//创建List<
的构造类型对象
for(inti=0;
i<
ss.Length;
i++)
l1.Add(ss[i]);
//调用Add方法将各元素加入到List列表中
l1.Sort();
//调用Sort方法将对各元素进行排序
listBox1.Items.Clear();
l1.Count;
listBox1.Items.Add(l1[i]);
//调用Add方法将各元素加入到ListBox中
说明:
List<
是System.Collections.Generic命名空间中定义的一个泛型类,是ArrayList类的泛型等效类,该类用于维护容量可动态调整的同类元素列表,该类提供了一系列对列表进行输入、删除、查找和排序等操作的方法。
例如Add方法用于将新元素加入到列表尾部,Insert方法和RemoveAt方法分别用于在指定位置插入和删除元素。
Find方法和Sort方法分别用于查找和排序等。
同学们可自行试试这些方法。
(4)继续加入按钮单击事件处理代码:
当用户选中第二个单选框“整数”时,程序将RichTextBox控件中的各行文本都转换成整数(转换失败则跳过该行,并给出提示),依次加入到一个List<
int>
对象中,而后排序输出到ListBox控件中,参考源代码如下:
elseif(radioButton2.Checked)
intx;
if(int.TryParse(ss[i],outx))
l1.Add(x);
MessageBox.Show(string.Format("
文本框中第{0}行不是合法的整数"
i+1,"
错误"
));
listBox1.Items.Add(l1[i]);
(5)类似的,当用户选中单选框“小数”或“时间”时,程序分别将RichTextBox控件中的各行文本转换成List<
double>
或List<
DateTime>
集合,而后排序输出到ListBox控件中。
请同学们自己动脑自行完成这两部分代码的设计吧。
(6)编译运行程序,在RichTextBox控件中输入不同内容,而后通过“排序”按钮来检查List<
的不同构造类型的使用效果。
程序输出如图5所示。
图5程序L4_6的示例输出结果
答案:
1、usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceL4_1
publicpartialclassForm1:
Form
publicForm1()
InitializeComponent();
privatestring[]filestr;
privateDictionary<
string,int>
isEx;
privatevoidForm1_Load(objectsender,EventArgse)
filestr=newstring[3];
isEx=newDictionary<
string,int>
filestr[0]="
filestr[1]="
filestr[2]="
privatevoidbutton1_Click(objectsender,EventArgse)
if(button1.Text=="
文?
件t显?
示º
?
1"
textBox1.Text=filestr[0];
button1.Text="
2"
elseif(button1.Text=="
textBox1.Text=filestr[1];
button1.Text="
3"
elseif(button1.Text