这学期CSharp&.net学习小结

    这学期选修了CSharp&.net这门课,因为学过C++所以做实验时感觉很亲切,开始不是那么生疏。但毕竟它是比C++,Java新的一种面向对象的编程语言,所以新加了许多新的特点。正如课程教材开头所说的,C#Microsoft的核心技术,而C#又是.NET的核心语言。又如学C++时一样我是从写实验程序开始学习C#的,以下是我写的几个引我逐渐深入了解C#编程方法的实验程序及其心得体会。

一、C#课程实验四

实验要求定义12个你认为最能体现重载特性的类,并对其方法或运算符进行重载来验证及了解重载的基本特性,类中要能实现定长参数列表的方法重载和变长参数列表的方法重载,为自定义的类的运算符(,,*,/及++,――)实现重载并重载并应用自定义类型的true/false运算符,显式和隐式运算符。

在程序中我定义了MessageHandlerVector两个类。MessageHandler类用来完成对要显示不同数据类型的消息的处理,而Vector类用来实现基本的向量平面运算。按照实验要求分为以下具体内容:

1.      MessageHandler中定长参数列表的方法重载

算法:

定义并实现三个方法,分别为message(),message(char ch)message(string msg)。后两个为参数分别为char,string定长类型的方法重载,根据不同类型的对象调用不同的重载函数,实现相应功能。

2.      MessageHandler中变长参数列表的方法重载

算法:

通过使用params定义并实现一个方法重载,打印出一个字符串和一系列变长的整型类型的数据。如:

public void message(string msg, params int[] args)

{     

           Console.WriteLine(msg);

           for (int ix = 0; ix < args.Length; ix++)

              Console.Write("{0}", args[ix].ToString());

           Console.WriteLine();

       }

3.      Vector类的运算符实现重载

算法:

根据各向量基本运算定义几种主要运算符的重载,最终返回相应值,这值是个向量或整数值。对于++--定义时先假定为后缀,过后重写该定义返回部分从而区分前后缀。最后通过对v1++v1v1++--v1v1—的计算来实现该运算符重载。对于truefalse运算符的重载,让true表示该向量横纵坐标均为0false表示该向量横纵坐标均不为0,并配合对-号的重载实现来判断两个向量是否相等,相等输出两个向量坐标和相等提示,不相等则输出两个向量相减后的结果。其中区分前后缀开始我知道要新声明一个向量类型的对象,并让它的横纵坐标等于要做运算向量的横纵坐标,后对新向量的横纵坐标做自增自减运算并返回新向量作为结果,即这可以完成前缀自增和自减的运算。而后的主要问题就在于如何实现后缀。用override重写++--ToString,以此实现后缀。

      如:

        public static Vector operator ++(Vector v)

        {

            Vector _v = new Vector(v._x,v._y);

            _v._x++;

            _v._y++;

            return _v;

        }

 

        public static Vector operator --(Vector v)

        {

            Vector _v = new Vector(v._x, v._y);

            _v._x--;

            _v._y--;

            return _v;

        }

     

        public override string ToString()//区分前后缀

        {

            return this.ToString();

        }

4.      MessageHandler 中添加一个结构体Digit,并重载显式隐式运算符

算法:

MessageHandler中单独添加一个结构体Digit,用显式转换Digit d = new Digit(b)重载显式运算符,用隐式转换d.value重载隐式运算符。通过对Digit变量和byte类型变量之间的显式隐式转换实现刚定义的显式隐式运算符。

        最终实验运行结果如下:

     

二、C#课程实验5

实验要求合理设计并实现文本查询系统QTLQuery Text Language)的类层次体系,系统支持对单词的查找,支持对一元和二元逻辑运算符与单词结合的查找,支持由逻辑运算符与单词组成的逻辑表达式的查找。

在程序中我定义了一个总的控制类QTL,来调用其它方法完成查询全过程。其算法如下:

1QTL类中主要方法:

1InputQuery()//用户输入要查询的表达式

string query保存表达式,若接收字符串为q则退出程序。否则通过queryProcess方法处理表达式。

2Precede(string optr, string c) //各表达式中逻辑符号的优先级处理

根据EvaluateExpression_reduced算法,列出各运算符的优先级比较表,并根据表用if—else语句返回两运算符进行比较后的结果。

3queryProcess(string _query) //将用户的要查询的表达式入栈进行相应操作,利用EvaluateExpression_reduced算法

用两个栈(运算符栈,操作符栈),根据接收的表达式字符数组的各字符串的内容和运算符的比较,如果不是运算符则进操作符栈,是运算符栈则根据该运算符和栈顶运算符的优先级比较,入栈,出栈运算等操作。

4add_file()//读取文本

从一指定文本中读取文本的所有内容并保存到Arraylist类型的对象里,记录文本行数和字符数等基本信息。

5printResult()//打印结果

从最终的结果的行号集中提取行号,并打印相应行的具体内容。

2、具体完成查询部分类的级别表示如下:

QueryàNameQueryàNotQuery

       àBinaryQueryàAndQuery

                      àOrQuery

Query类中定义和初始化保存文本数据,行号集的对象,属性Solution用于读写受保护的行号集对象Solution_set

NameQuery类派生于Query,将文本数据转换为小写字符然后和要查询的表达式字符串进行比较,若存在将相应行号加入结果行号集。

NotQuery类派生于NameQuery,将所有行号集加入NotQuery的结果行号集,在通过NameQuery找到含有表达式字符串的结果行号,把这些行号从NotQuery的结果行号集中除去,即得最终结果。

BinaryQuery类派生于Query类,定义两个属性,分别完成对两个操作符的读和写。

AndQuery类派生于BinaryQuery类,若两个操作符的结果集中都有的行号则加入最终的结果集中

OrQuery类派生于BinaryQuery类,若左操作数的结果集中和右操作符结果集中不相同的加入最终结果集中,再加入所有的右操作符结果集中的行号到最终结果集中。

   3、程序实现难点

其中程序的难点在于将用户的要查询的表达式入栈进行相应操作,利用EvaluateExpression_reduced算法。这是学习数据结构时学过的用栈实现表达式求值使用的算法。首先要确定算符间的优先关系。在这个实验中它的优先关系如下:

   op2      op1

&&

||

!

(

)

#

&&

>  

>  

<  

<  

>  

>  

||

>  

>  

<  

<  

>  

>  

!

>  

>  

>  

<  

>  

>  

(

<  

<  

<  

<  

=

 

)

>  

>  

>  

<  

>  

>  

#

 

 

 

 

 

 

   说明:任意两个相继出现的算符op1op2之间的优先关系表示为三种关系,op1<op2 op1的优先权低于op2op1=op2 op1的优先权等于op2op1>op2 op1的优先权高于op2

      由这个算法写实现程序如下:

        public char Precede(string optr, string c)

        {//各表达式中逻辑符号的优先级处理

            if ((optr.Equals("&&") && (c.Equals("&&") ||        c.Equals("||") || c.Equals(")")||c.Equals("#")))

                || (optr.Equals("||") && (c.Equals("&&") || c.Equals("||") || c.Equals(")")||c.Equals("#")))

                || (optr.Equals("!") && (!c.Equals("(")))

                || (optr.Equals(")") && (!c.Equals("("))))

                return '>';

            else if((optr.Equals("(") && c.Equals(")")))

                return '=';

            else

                return '<'; 

        }

 

        public void queryProcess(string _query)

        {//将用户的要查询的表达式入栈进行相应操作,利用    EvaluateExpression_reduced算法

            char [] separators = {' ','/t'};

            string [] stringsplit =  (_query.ToLower()).Split(separators);

            string [] operators={"!","||","&&","(",")","#"};

            Stack<Query> opnd = new Stack<Query>();//查询结果

            Stack<string> optr = new Stack<string>();//操作符

            Query b , a, c;//储存要计算的操作符

            string theta;//储存计算时用的运算符

            optr.Push("#");

            int ix = 0;

            string ch;

            do

            {

                if (ix == stringsplit.Length)

                    ch = "#";

                else

                    ch = stringsplit[ix];

                if (!In(ch, operators))

                {

                    opnd.Push(new NameQuery(ch));

                    ix++;

                }

                else

                    switch (Precede(optr.Peek(), ch))

                    {

                        case '<':

                            optr.Push(ch);//将优先级高的符    号进符号栈

                            ix++;

                            break;

                        case '='://脱括号"(",并接收下一个字符

                            optr.Pop();

                            ix++;

                            break;

                        case '>'://退栈并将运算结果入栈

                            theta = optr.Pop();

                            if (theta.Equals("!"))

                            {

                                c = opnd.Pop();//储存要做非运算的query

                                opnd.Push(new NotQuery(c));

                            }

                            else if (theta.Equals("||"))

                            {

                                b = opnd.Pop();

                                a = opnd.Pop();

                                opnd.Push(new OrQuery(a, b));

                            }

                            else if (theta.Equals("&&"))

                            {

                                b = opnd.Pop();

                                a = opnd.Pop();

                                opnd.Push(new AndQuery(a, b));

                            }

                            break;

                        }

            }while(ix <= stringsplit.Length);//判断表达式有没有接收完

            for (int i = 0; i < (opnd.Peek()).Solution.Count; i++)

            {

                queryResult.Add((int)(opnd.Peek()).Solution[i]);//存储行号集到queryResult

            }

        }

   4、实验结论

最终成功实现了文本查询系统。开始进栈出栈处理从用户接收的表达式时没有想到算符优先法,按照自己的想法做总有考虑不周全的地方以至于一直没能调出程序。但一旦使用了该算法并根据实际情况实现并修改了算法的部分细节,原来的难点便一攻就破。一想到这儿,才觉得数据结构中包含了多少经典的算法,往往与我们将要解决的某一实际问题相似或相同。如果我们只是凭自己的脑袋解决可能需要很复杂的判断等才能完成,造成了程序代码的冗长难读。而联系了数据结构中的算法后,往往能是问题解决起来感觉简单明了,代码也短小易读。这次实验是一次C#程序编写方法和数据结构结合使用的宝贵体验。呵呵,这也使得我写完这个实验比其它实验更有成就感了。

   总之,这学期的C#&.net学下来很有收获,不仅学会了C#语言的基本编程方法,尤其是C++没有的委托,接口,而且在完成实验中可以用C#又一次实现了数据结构中的算法。接下来的大作业做学生成绩管理系统,现在完成了数据库的连接,还有十多个界面和模块要完成,如果能完成好,能用C#真正完成一个小型项目的开发对C#的学习会有更大的进步。到那时也必将有更多的收获与体会吧。但我知道要真正熟练掌握CSharp&.NET,还需要今后更多的学习。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很好的C#培训教程,适合初学者使用 目 录 1 .NET体系结构 7 1.1 什么是.NET Framwork? 7 1.2 .NET Framework的内容 7 1.3 如何用.NET Framework编写应用程序 8 1.4 MSIL和JIT 8 1.5 程序集 9 1.6 托管代码 9 1.7 垃圾回收 9 1.8 链接 10 1.9 实例分析 11 1.10 内容总结 13 1.11 独立实践 14 2 C#基础 15 2.1 面向对象基本概念 15 2.2 变量 18 2.3 常量 22 2.4 预定义数据类型 22 2.5 流控制 28 2.6 数组 37 2.7 命名空间 38 2.8 C#预处理器指令 44 2.9 C#编程规则 46 2.10 内容总结 50 2.11 独立实践 50 3 对象和结构 52 3.1 类和结构 52 3.2 类和成员 53 3.3 构造函数 60 3.4 结构 65 3.5 部分类 68 3.6 内容总结 72 3.7 独立实践 72 4 继承 73 4.1 继承的类型 73 4.2 结构和类 75 4.3 调用函数的基类版本 76 4.4 抽象类和抽象函数 77 4.5 密封类和密封方法 79 4.6 修饰符 80 4.7 接口 81 4.8 内容总结 86 4.9 独立实践 86 5 委托与事件 88 5.1 事件的原理 88 5.2 简单的自定义事件 89 5.3 预定义事件处理机制 92 5.4 内容总结 100 5.5 独立实践 100 6 运算符和类型强制转换 101 6.1 运算符 101 6.2 运算符的简化操作 102 6.3 类型的安全性 107 6.4 类型转换 108 6.5 装箱和拆箱 111 6.6 对象的相等比较 112 6.7 引用类型的相等比较 112 6.8 运算符重载 114 6.9 运算符的工作方式 114 6.10 用户定义的数据类型转换 118 6.11 执行用户定义的类型转换 119 6.12 多重数据类型转换 126 6.13 内容总结 130 6.14 独立实践 131 7 字符串与正则表达式 132 7.1 System.String类 132 7.2 StringBuilder成员 135 7.3 字符串的格式化 138 7.4 正则表达式概述 142 7.5 内容总结 149 7.6 独立实践 150 8 集合 151 8.1 集合 151 8.2 索引器 152 8.3 集合接口 155 8.4 字典 157 8.4.1 现实生活中的字典 158 8.4.2 .NET中的字典 158 8.4.3 字典的工作情况 160 8.5 内容总结 167 8.6 独立实践 167 9 错误与异常 168 9.1 错误和异常 168 9.2 捕获异常 170 9.3 System.Exception属性 177 9.4 嵌套的 try块 178 9.5 用户定义的异常类 180 9.6 内容总结 189 9.7 独立实践 189 10 内存管理与指针 190 10.1 后台内存管理 190 10.2 值数据类型 190 10.3 引用数据类型 192 10.4 垃圾收集 194 10.5 释放未托管的资源 195 10.6 析构函数 195 10.7 IDisposable接口 196 10.8 实现IDisposable接口和析构函数 198 10.9 不安全的代码 199 10.10 指针 200 10.11 使用指针优化性能 213 10.12 内容总结 217 11 泛型 218 11.1 泛型的概念 218 11.2 使用泛型 219 11.3 可空类型 219 11.4 运算符和可空类型 220 11.5 System.Collections.Generic命名空间 227 11.6 定义泛型类 237 11.7 default关键字 239 11.8 约束类型 240 11.9 从泛型类中继承 247 11.10 泛型运算符 248 11.11 泛型结构 250 11.12 定义泛型接口 250 11.13 定义泛型方法 251 11.14 定义泛型委托 253 11.15 独立实践 253 12 反射 254 12.1 定制特性 254 12.2 编写定制特性 255 12.3 指定特性参数 258 12.4 VectorClass程序集 261 12.5 反射 263 12.6 查找定制特性 269 12.7 内容总结 273 13 线程 274 13.1 线程 274 13.2 多线程应用程序 275 13.3 线程的处理 276 13.4 线程的优先级 282 13.5 同步 283 13.6 同步问题 285 13.7 内容总结 288 14 Winform基本概念 289 14.1 .NET Windows应用程序开发 289 14.2 .NET框架类库简介 289 14.3 事件和事件处理程序 290 14.4 事件参数 290 14.5 Windows 应用程序 290 14.6 窗体属性、方法和事件 291 14.7 this 关键字 292 14.8 控件概念 292 14.9 各种类型控件 292 14.10 控件的一些通用属性 294 14.11 标签、文本框、按钮控件简介 295 14.12 列表框控件简介 296 14.13 复选列表框 296 14.14 组合框 296 14.15 内容总结 302 15 Winform控件 303 15.1 控件分类 303 15.2 在窗体之间建立链接 307 15.3 应用程序的启动和关闭 308 15.4 内容总结 308 16 高级用户界面 309 16.1 打印控件的使用 309 16.2 PrintDocument组件 309 16.3 PrintPreviewControl组件 310 16.4 PrintDialog 组件 310 16.5 PrintPreviewDialog组件 311 16.6 PageSetUpDialog控件 311 16.7 对话框 311 16.8 通用对话框 312 16.9 OpenFileDialog控件 312 16.10 SaveFileDialog控件 312 16.11 FontDialog控件 312 16.12 ColorDialog控件 312 16.13 MessageBox消息框 313 16.14 WinForms 中的可视效果 314 16.15 内容总结 315 17 MDI应用程序 316 17.1 SDI程序 316 17.2 MDI程序 316 17.3 MenuStrip和ToolStripMenuItem 317 17.4 toolStrip控件简介 318 17.5 StatusStrip控件 320 17.6 创建对话框 320 17.7 内容总结 321 18 ADO.NET编程 322 18.1 简介 322 18.2 ADO.NET 的优点 322 18.3 ADO.NET 结构 324 18.4 ADO.NET 的基本组件 325 18.5 DataReader 328 18.6 获取单个值 328 18.7 修改数据库中的数据 329 18.8 从SQL Server获取XML数据 329 18.9 DataAdapter 330 18.10 数据集:DataSet 330 18.11 DataTable 330 18.12 DataView 332 18.13 关系 332 18.14 数据绑定 333 18.15 DataRow 简介 335 18.16 操纵数据源中的值 336 18.17 内容总结 336 19 GDI+ 编程 337 19.1 理解绘图规则 337 19.2 测量坐标和区域 341 19.3 绘制可滚动的窗口 343 19.4 颜色 348 19.5 画笔和钢笔 351 19.6 绘制图形和线条 352 19.7 显示图像 355 19.8 绘制文本 357 19.9 字体和字体系列 359 19.10 内容总结 363 20 自定义控件 364 20.1 添加事件处理程序 368 20.2 添加更多的属性 370 20.3 内容总结 372 21 部署与安装 373 21.1 部署的设计 373 21.2 无干涉部署 387 21.3 内容总结 394 22 ASP.NET与Web窗口简介 395 22.1 应用程序方案 395 22.2 Web 应用程序开发周期 399 五个对象实现了服务器端的请求 403 22.3 ASP.NET 的演变 404 22.4 Global.asax 文件 405 22.5 发布网站 408 22.6 内容总结 408 23 ASP.NET中的内置对象 409 23.1 ASP.NET页面 409 23.2 虚拟目录 421 23.3 内容总结 423 24 Web服务器控件 424 24.1 Web 控件 424 24.2 复杂控件 429 24.3 内容总结 431 25 HTML控件 432 25.1 服务器控件 432 25.2 HTMLForm控件 432 25.3 Web服务器控件优缺点 433 25.4 HTML服务器控件优缺点 433 25.5 使用服务器控件设计页面建议 433 25.6 内容总结 439 26 深入服务器对象 440 26.1 Global.asax文件简介 441 26.2 Application 对象 446 26.3 HttpServerUtility类和Server对象 446 26.4 HttpSessionState类和Session对象 448 26.5 内容总结 449 27 ADO.NET WEB应用 450 27.1 回顾ADO.NET 450 27.2 模板概念 464 27.3 ASP.NET 中的数据处理 465 27.4 内容总结 466 28 WEB服务器基础 467 28.1 ASP.NET Web 服务 467 28.2 编写简单的 Web 服务 468 28.3 内容总结 470 28.4 独立实践 470 29 用户控件 471 29.1 用户控件开发 471 29.2 内容总结 479 29.3 独立实践 480 30 Web部署 481 30.1 使用XCOPY部署 481 30.2 使用Visual studio的Copy Web Site功能部署 482 30.3 使用Visual Studio的Precompilation预编译部署 482 30.4 内容总结 483 30.5 独立实践 484

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值