广工C#与NET课程实验Word文档格式.docx
《广工C#与NET课程实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《广工C#与NET课程实验Word文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
部分核心代码:
ArrayLista1=newArrayList();
Randomran=newRandom();
intm=ran.Next();
//设置随机种子
for(inti=0;
i<
10;
++i)
{
Randomr=newRandom(m*i+m);
//设置随机数
al.Add(r.Next(0,200));
//将数据存入顺序表
Console.Write("
{0}"
al[i]);
//打印输出该随机数顺序表
}
2.利用上述数据,生成完全二叉树
首先需要考虑树的结构,要设计其数据结构,也就是设计它的类体结构和相关构造器。
然后进行创建完全二叉树:
先定义一个根节点,再一个一个取出顺序表中的随机数,并插入到生成树中。
/*树的节点类*/
classNode
privateintdata;
//数据
privateNodelChild;
//左孩子
privateNoderChild;
//右孩子
publicboolhasData=false;
//该节点数据是否初始化
/*构造函数*/
publicNode()
{
data=0;
lChild=null;
rChild=null;
}
publicNode(intval)
data=val;
Nodehead1=newNode((int)al[0]);
BiTreetree1=newBiTree(head1);
tree1.createTree(al);
//生成完全二叉树
定义完全二叉树类体,,继而生成一个完全二叉树。
/*二叉树*/
classBiTree
privateNodehead;
//头节点
privateArrayListinOrderDatas;
//安中序遍历读取的数据
privateArrayListal;
//原始顺序表
/*二叉树构造函数*/
publicBiTree(NodeheadNode)
head=headNode;
head.hasData=true;
/*创建二叉树,参数为一个顺序表*/
publicvoidcreateTree(ArrayListal)
this.al=al;
//初始化对象的顺序表
intnow=1;
//第一个结点编号为1
insertTree(now,this.Head);
//插入结点
/*对树插入结点,第一个参数为结点编号,编号从1开始,第二个参数为需要插入的结点*/
publicvoidinsertTree(intnow,Noderoot)
/*对需要插入的结点编号对应的顺序表数据下标进行判断,
若在数据数目范围之内,则插入数据于结点(相当于插入结点于树),否则返回*/
if(now-1<
al.Count)//now-1为数据的顺序表下标,应小于数据的数目
intitem=(int)al[now-1];
root.Data=item;
//将数据插入到结点
root.hasData=true;
else
root.hasData=false;
return;
root.LChild=newNode();
//为结点的左孩子结点分配内存
root.RChild=newNode();
//为节点的右孩子节点分配内存
insertTree(2*now,root.LChild);
//为左孩子插入数据
insertTree(2*now+1,root.RChild);
//为右孩子插入数据
/*左孩子数据有无判断,若无数据则置左孩子为null*/
if(root.LChild.hasData==false)
root.LChild=null;
/*右孩子数据有无判断,若无数据则置右孩子为null*/
if(root.RChild.hasData==false)
root.RChild=null;
3.生成二叉排序树
运用递归思想,将顺序表中的随机数不断插入到树种。
/*生成BSTree*/
publicvoidcreateBSTree(ArrayListal)
for(inti=1;
this.al.Count;
insertBSTree(i,this.Head);
publicvoidinsertBSTree(intnow,Noderoot)
/*为插入的结点输入数据*/
if(root.hasData==false)
root.Data=(int)al[now];
root.hasData=true;
root.RChild=null;
if((int)al[now]<
root.Data)
if(root.LChild==null)
insertBSTree(now,root.LChild);
//插入左孩子
if(root.RChild==null)
insertBSTree(now,root.RChild);
//插入右孩子
4.判断二叉树是否为二叉排序树
/*判断当前BiTree对象是否为二叉排序树*/
publicboolisBSTree()
/*获得树的中序遍历数据*/
ArrayListdatas=this.getInOrderDatas(this.Head);
boolisBST=true;
/*按二叉排序树定义,当中序遍历所得数据中,后面的数据小于前面的数据,则并非二叉排序树*/
for(inti=1;
datas.Count;
if((int)datas[i]<
(int)datas[i-1])
isBST=false;
break;
returnisBST;
5.输出中序遍历序列的结果
/*获得中序遍历的数据*/
publicArrayListgetInOrderDatas(Noderoot)
this.inOrderDatas=newArrayList();
this.inOrder(root);
returninOrderDatas;
privatevoidinOrder(Noderoot)
//根结点为空
if(root==null)
//中序遍历左子树
inOrder(root.LChild);
//处理根结点
this.inOrderDatas.Add(root.Data);
//中序遍历右子树
inOrder(root.RChild);
6.计算叶子结点数
/*获得叶子节点数目*/
publicintgetLeafNodeCounts()
returncountLeafNode(this.Head);
}
/*对叶子结点计数*/
privateintcountLeafNode(Noderoot)
/*当前节点为空时,返回0个*/
return0;
/*左孩子与右孩子同时为空时,返回叶子结点数目1*/
if(root.LChild==null&
&
root.RChild==null)
return1;
/*递归计数左孩子与右孩子叶子结点数目*/
returncountLeafNode(root.LChild)+countLeafNode(root.RChild);
7.计算二叉树深度
/*获得树的深度*/
publicintgetHeight()
returncountHeight(this.Head);
/*对树的深度计数*/
privateintcountHeight(Noderoot)
intlh;
intrh;
{
lh=countHeight(root.RChild);
rh=countHeight(root.RChild);
return(lh>
rh?
lh:
rh)+1;
给出程序运行截图:
效果示意图如下所示:
心得小结:
C#的控制台程序的开发体会,在比对了C和JAVA相关的开发经历之后。
个人感觉C#的开发工具的体验很好,毕竟是有微软官方提供的开发工具,功能很强大。
另外就是C#是基于面向对象的语言,所以采用面向对象的思想比较多,整体来说跟java开发的感觉差不多。
实验二:
窗体应用程序设计
1.5实验目的
1.学习视窗用户界面程序的基本开发方法和思路。
2.掌握VS的可视化UI设计
1.6实验内容
1)基于窗体用户界面,创建一个简单的通讯录应用程序:
2)可记录个人的姓名、性别、居住地址、生日、工作单位、电话、评价;
3)其中“评价”,指对某人可以给以简短的评语,字数在300字以内;
4)可以对某人写评语,每次评语按时间记录,时间:
yyyyMMddHH。
一个小时内可以写一次。
5)支持按时间查看对某个人的历次评语。
6)支持查、增、删、改,等四大基本功能。
7)要求使用XML或数据库存贮。
自选一种方式
8)要求按用户分配权限,包括:
全权用户;
可写用户-----可以编写评语但不能更改其它信息;
只读用户-----只能看不能修改任何信息;
非法用户-----除了上述三类用户以外的其它用户
1.7实验报告
简述上述7大功能的算法思想,和主要设计流程。
给出程序运行截图。
1.首先,考虑数据的存储,采用了与SQLSever数据库结合的方式。
所以是基于MicrosoftVisualStudio2013的C#窗体程序设计加上MicrosoftSQLSever2005数据库管理系统的开发环境。
根据需求建立了list数据库,该database包含了两个table,分别是用于存储登陆信息的数据表user_table和用于存储联系人相关信息的数据表Personal_info。
如图所示,数据库list相关信息:
2.相关数据表设计:
数据表Personal_info的设计,包含7个属性列,以name为主键。
数据表Personal_info在数据库中实际数据存储的效果
数据表user_table的设计,包含3个属性列,以UserIS为主键。
数据表user_table在数据库中实际数据存储的效果
3.登录和注册界面的设计
登录界面设计:
注册账号界面:
连接系统安装的数据相关语句:
privatestringConnecttionString="
DataSource=SHIXIAN-PC;
"
+"
InitialCatalog=list;
PersistSecurityInfo=true;
+
Trusted_Connection=SSPI;
;
privateSqlConnectionconn=null;
privateSqlDataAdapterDateAdapter=null;
privateDataSetdateset=null;
conn=newSqlConnection(ConnecttionString);
command=newSqlCommand();
command.Connection=conn;
command.CommandText=strSql;
conn.Open();
command.ExecuteNonQuery();
登录检查联系人登陆信息功能的实现代码:
privatestringcheckedId()
stringresult=null;
stringstrSql="
SELECTCASEWHENU.uPassword=?
THEN1ELSE0END"
strSql+="
FROMuser_tableUWHEREU.UserId="
+textBox1.Text;
SqlCommandcommand=null;
try
command=newSqlCommand();
command.Connection=conn;
command.CommandText=strSql;
catch(Exceptionex)
MessageBox.Show(ex.Message);
result="
0"
finally
if(conn!
=null)conn.Close();
command.Dispose();
returnresult;
程序主界面:
/*主界面连个按钮的点击响应,分别跳转新的From*/
privatevoidbutton2_Click(objectsender,EventArgse)
{Form1form1=newForm1();
form1.Show();
privatevoidbutton3_Click(objectsender,EventArgse)
{Form3form3=newForm3();
form3.Show();
添加联系人界面:
保存按钮的点击相应事件,主要是获取填入的信息,并对此先进行预处理,判断是否有信息缺失。
继而进行数据库连接操作,最终将信息保存到数据库list的Personal_info的表格中。
其中也进行的异常处理机制的完善。
privatevoidbutton1_Click(objectsender,EventArgse)
stringstrSql=null;
strSql="
INSERTINTOPersonal_InfoVALUES("
'
'
+comboBox1.SelectedItem.ToString();
+textBox2.Text;
+dateTimePicker1.Value.ToString("
yyyy-MM-dd"
);
+textBox4.Text;
+textBox15.Text;
+richTextBox1.Text+"
)"
MessageBox.Show("
请输入完整的个人信息。
{command=newSqlCommand();
intn=command.ExecuteNonQuery();
if(n>
0)MessageBox.Show("
成功保存!
"
提示:
catch(Exceptionex)
发生异常:
+ex.Message);
this.Close();
点击查询联系人按钮的时候:
跳转到新的Form,进行联系人查询相关。
联系人查询相关Form,具有直接显示原始数据库中数据的datagridview。
并且可以根据相关检索条件进行相关检索查询。
还有根据选的指定联系人,进行删除操作或进行查看联系人详细信息操作,继而可以进行修改联系人信息和更新操作。
查询数据库中存在的联系人纪录,并且将查询的全部数据显示到datagridview中的方法:
publicvoidshowData(stringstr){
stringstrSql=str;
{conn.Open();
DateAdapter=newSqlDataAdapter();
dateset=newDataSet();
DateAdapter.SelectCommand=command;
DateAdapter.Fill(dateset,"
t1"
dataGridView1.DataSource=dateset;
dataGridView1.DataMember="
数据加载成功!
{MessageBox.Show(ex.Message);
{if(conn!
根据选的指定联系人,进行查看联系人详细信息操作,继而可以进行修改联系人信息和更新操作。
这里需要把当前用户选中的联系人的姓名作为传递参数,因为需要在查看联系人界面作为数据查询相关具体信息的条件码。
而且姓名也是该数据表的主键,所以具有唯一标识性。
privatevoidbutton1_Click(objectsender,EventArgse)
intindex=dataGridView1.SelectedRows[0].Index;
//获取选中行的行号
DataGridViewRows=dataGridView1.Rows[index];
Form1form1=newForm1(s);
将被选中的DataGridViewRow作为传递参数。
跳转到查看联系人界面,此时打开的新的Form,并且根据从上一个form传递过来的参数中获取DataGridViewRow,再加载到相应的数据框中。
值得一提的是因为姓名是主键,因此不提供修改。
获取DataGridViewRow各列的数据并填充到相应的数据框中。
publicForm1(DataGridViewRowstr)
InitializeComponent();
//Cells[0]为要选的第几列
sname=str.Cells[0].Value.ToString();