《第5章基础类及常用算法》由会员分享,可在线阅读,更多相关《第5章基础类及常用算法(42页珍藏版)》请在金锄头文库上搜索。
1、 第5章 基础类及常用算法唐大仕http:/本章内容n1 DotNet基本类库n2 类型转换n3 数学、文字、日期n4 数组、集合、泛型n5 常用算法n6 程序的调试5.1 DotNet基本类库统一的编程API:NET Framework 类库System System System.DataSystem.DataSystem.XmlSystem.XmlSystem.WebSystem.WebGlobalizationGlobalizationDiagnosticsDiagnosticsConfigurationConfigurationCollectionsCollectionsResour
2、cesResourcesReflectionReflectionNetNetIOIOThreadingThreadingTextTextServiceProcessServiceProcessSecuritySecurityCommonCommonOleDbOleDbSQLTypesSQLTypesSqlClientSqlClientXPathXPathXSLTXSLTRuntimeRuntimeInteropServicesInteropServicesRemotingRemotingSerializationSerializationSerializationSerializationCo
3、nfigurationConfigurationSessionStateSessionStateCachingCachingSecuritySecurityServicesServicesDescriptionDescriptionDiscoveryDiscoveryProtocolsProtocolsUIUIHtmlControlsHtmlControlsWebControlsWebControlsSystem.DrawingSystem.DrawingImagingImagingDrawing2DDrawing2DTextTextPrintingPrintingSystem.Windows
4、.FormsSystem.Windows.FormsDesignDesignComponentModelComponentModel统一的编程API:NET Framework 类库5.2 基本类型及类型转换任何事物都是对象n任何事物都是object类的子类n一个函数如果需要object参数,则可以代入任意参数n任何对象都有以下方法nToString() Equals() GetType()nMemberwiseClone()等n常量也是对象n3.ToString()n“Hello”.Length表达式中的类型转换n当有不同种类的混合运算时:nintlongfloatdoublen(所有的by
5、te, short, char 等转为int )强制类型转换n在表达式前面用(类型)来表示ndouble d=3.14;nint a = (int) d;nfloat b = (float)(d+1.5);n注意圆括号类型转换函数nSystem.Convert类有以下static方法nToDouble()nToInt32()nToDateTime()基本类型n关键字含有等价的类nint 即 System.Int32n含有一些特殊的属性或方法nint.MaxValuendouble.NaNnDouble.PositiveInfinitynDouble.IsNaN()数与字符串的转换nint.Pa
6、rse(string)ndouble.ToString();nToString(#0.00)5.3 几个常用类Math类n提供了相关的数学方法nAbs()nSin() Cos() Tan()nRound()nExp() Log()nPow() 乘方Random类n.Next(100) 0到100之间(不含100)n.NextDouble() 0到1之间nRandom得到的是伪随机数n如果要用更强的随机数,可以使用nSystem.Security.Cryptographyn.RNGCryptoServiceProviderDateTime及TimeSpannDateTime 是值类型nnew D
7、ateTime(y,m,d,h,m,s)n.Nown.ToString( yyyy-MM-dd HH:mm:ss“)n.AddMinutes(5)n.Year, .Month, .Day, .DatenTimeSpann两个日期相减,可以得到一个TimeSpanString类n= + n.Length .IndexOf .LastIndexOfn.StartsWith, .EndsWithn.Substring(idx, len ) 注意第二个参数n.Trim, .TrimEnd, .PadLeft, .Insert, .Removen.Split(;), string.JoinString
8、及 StringBuildernString内容不可变 (immutable)nStringBuilder内容可变n.Append, .Remove, .Replacen.Length, .ToStringn在循环体中用 s+=.可能会带来效率问题5.4 数组与集合数组n声明nint a;nint , b;n分配空间na = new int5;nb = new int4,5;集合类nArrayList n相当于动态数组,实现IListnHashtable n相当于键/值的集合, 实现 IDictionaryn用进行访问,表示获取、增加、删除、修改n提示:用于查询时,比线性搜索的效率要高,可用于
9、程序的优化nSortedList Stack Queue使用foreach访问数组及集合nforeach(类型 变量 in xxxx)n其中xxxx必须是实现了实现 IEnumerable 接口或含有 GetEnumerator 方法的类型nIEnumerator GetEnumerator();nIEnumeratornCurrent属性nMoveNext 及 Reset 方法泛型 Genericn泛型具有更好的类型检查及性能nSystem.Collections.Generic名称空间nList 列表nDictionary, SortedDictionary 字典nStack, Queue
10、 栈,队列5.5 常用算法算法n指令的有限序列 n特点:n有穷性 n确定性 n可行性 n输入、输出遍试n逻辑上:针对所有可能的情况进行判断n形式上: For 中用 Ifn示例:1.韩信点兵,百鸡问题,鸡兔同笼问题n 2.水仙花数 13+53+33=153n 3. 完全数 28=1+2+4+7+14n 4.百分币n 5. 佩尔方程 n 6.验证猜想:哥德巴赫猜想迭代n逻辑上:多次使用同一算法n形式上:a = f( a )n示例:1.求平方根n 2. Mandelbrot集,Julia集n 3. 倍边法求Pin 4. 数字平方和递归n逻辑上:一个问题化为同样的问题n形式上:自己调用自己n示例:1.
11、求阶乘n 2.菲波那契数列n 3. Celay树, Koch分形集小结n遍试: for中用ifn迭代: for中n=f(n)n递归: f(n)中用f(n-1)6 程序的调试错误的种类n代码的错误通常可以分成三大类n语法错误n运行错误n逻辑错误n其中语法错误比较容易排除,也是一种低级的错误。运行错误和逻辑错误需要靠经验、调试工具以及不断的深入代码来排除。语法错误n此类型的错误通常发生在程序员对语言本身的熟悉度不足n如if之后忘了加上大括号、For语句少了分号。还有比如定义一个变量是Student,但是在引用的时候不小心就变成studnet了。还有一种情况是调用函数错误的语法。n例如调用SubSt
12、ring函数少传了一个参数。使用Visual Studio.NET开发工具,多数的错误会在编辑程序的时候发现。逻辑错误n逻辑错误(Logic Error)是指程序算法的错误,这种错误程序不会发生任何程序中断或跳出程序,而是一直执行到最后,可能有结果。但是执行结果是不对的。n如计算1到10的总数,结果应该为55,利用下面的算法。运行时错误n运行时错误(Runtime Error)多数发生在不可预期的异常。n比如打开硬盘上的某个文件时,该文件不存在。向硬盘上写某个文件的时候,硬盘的空间不足。n由于网络阻塞得不到预期的数据等等。也有可能是用户不按正确的操作步骤而造成的错误,n如在做除法的时候除数为零
13、,访问数组的时候,超出了可访问下标的范围,这些都是发生错误的原因。比如下面的代码。程序调试的基本手段n断点n跟踪n监视断点n断点n用鼠标单击左边 Ctrl+Bn调试|窗口|断点 Ctrl+Alt+F9n断点的属性n条件断点(先设置断点,右击,可编辑条件)n命中次数n清除或禁用断点n清除所有断点 Ctrl+Shift+F9跟踪n单步执行n逐语句 F11n逐过程 F10n点右键,运行到光标处n跳出函数 Shift+F11n拖动到下一句(跳过中间一些语句)监视n即时监视n快速监视 Ctrl+Alt+Qn自动窗口n调用堆栈n指令n调试|窗口|反汇编练习n练习基本类的用法n练习常用算法n练习调试n参见forDebug下的示例nwhile循环的跟踪n数组的跟踪(筛法求素数)n构造方法执行过程的跟踪n一个dotNET BUG的跟踪一个奇异的bug int a = 0x79de61c0; /2044617152; a += 0x12345678; /a 应为 0x8c12b838; /-1944930248 if( a 0 ) a = -a; / 注意,如果加上以下语句,则程序出错 /string str1 = a.ToString(); System.Console.WriteLine( a );/ 一个我发现的在.net fx1.1中的 bug,见http:/