您好,欢迎访问三七文档
目录目录——————————————————————02一、简介————————————————————03二、题目要求——————————————————041、代码介绍———————————————042、主要结构———————————————053、其他要求———————————————06三、需求分析及解决方法—————————————061、从面相过程到面相对象———————————062、宏定义问题———————————————073、数据存储———————————————084、文件读取———————————————085、多线程———————————————09四、总结————————————————————10附件————————————————————102一、引言C#是微软发布的一种面向对象的于NETFramework之上的高级程序设计语言。C#是一种安全的、稳定的、简单的、优雅的由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。C#在某种程度上可以看作是.NET面向Windows环境的一种编程语言。在过去的十几年里,Microsoft给Windows和WindowsAPI添加了许多功能,VB和C++也经历了许多变化。虽然VB和C++最终已成为非常强大的语言,但这两种语言也存在问题,因为它们保留了原来的一些内容。对于VisualBasic来说,它的主要优点是很容易理解,许多编程工作都很容易完成,基本上隐藏了WindowsAPI和COM组件结构的内涵。其缺点是VisualBasic从来没有实现真正意义上的面向对象,所以大型应用程序很难分解和维护。另外,因为VB的语法继承于BASIC的早期版本(BASIC主要是为了让初学者更容易理解,而不是为了编写大型商业应用程序),所以不能真正成为结构化或面向对象的编程语言。另一方面,C++在ANSIC++语言定义中有其自己的根。它与ANSI不完全兼容,因为Microsoft是在ANSI定义标准化之前编写C++编译器的,但已经相当接近了。遗憾的是,这导致了两个问题。其一,ANSIC++是在十几年前的技术条件下开发的,因此不支持现在的概念(例如Unicode字符串和生成XML文档),某些古老的语法结构是为以前的编译器设计的(例如成员函数的声明和定义是分开的)。其二,Microsoft同时还试图把C++演变为一种用于在Windows上执行高性能任务的语言——在语言中避免添加大量Microsoft专用的关键字和各种库,其结果是在Windows中,该语言成为了一种非常杂乱的语言。让一个C++开发人员说说字符串有多少个定义方式就可以说明这一点:char*、LPTSTR、string、CString(MFC版本)、CString(WTL版本)、wchar_t*和OLECHAR*等。现在进入.NET时代—一种全新的环境,它对这两种语言都进行了新的扩展。Microsoft给C++添加了许多Microsoft专用的关键字,并把VB演变为VB.NET,保留了一些基本的VB语法,但在设计上完全不同,从实际应用的角度来看,VB.NET是一种新语言。在这里,Microsoft决定给开发人员另一个选择—专门用于.NET、具有新起点的语言,即VisualC#.NET。Microsoft在正式场合把C#描述为一种简单、现代、面向对象、类型非常安全、派生于C和C++的编程语言。大多数独立的评论员对其说法是“派生于C、C++和Java”。这种描述在技术上是非常准确的,但没有涉及到该语言的真正优点。从语法上看,C#非常类似于C++和Java,许多关键字都是相同的,C#也使用类似于3C++和Java的块结构,并用括号({})来标记代码块,用分号分隔各行语句。对C#代码的第一印象是它非常类似于C++或Java代码。但在这些表面上的类似性后面,C#学习起来要比C++容易得多,但比Java难一些。其设计与现代开发工具的适应性要比其他语言更高,它同时具有VisualBasic的易用性、高性能以及C++的低级内存访问性。C#包括以下一些特性:完全支持类和面向对象编程,包括接口和继承、虚函数和运算符重载的处理;定义完整、一致的基本类型集;对自动生成XML文档说明的内置支持;自动清理动态分配的内存;可以用用户定义的特性来标记类或方法。这可以用于文档说明,对编译有一定的影响(例如,把方法标记为只在调试时编译);对.NET基类库的完全访问权,并易于访问WindowsAPI;可以使用指针和直接内存访问,C#语言可以在没有它们的条件下访问内存;以VB的风格支持属性和事件;改变编译器选项,可以把程序编译为可执行文件或.NET组件库,该组件库可以用与ActiveX控件(COM组件)相同的方式由其他代码调用;C#可以用于编写ASP.NET动态Web页面和XMLWeb服务。应该指出,对于上述大多数特性,VB.NET和ManagedC++也具备。但C#从一开始就使用.NET,对.NET特性的支持不仅是完整的,而且提供了比其他语言更合适的语法。C#语言本身非常类似于Java,但其中有一些改进,因为Java并不是为应用于.NET环境而设计的。最后还要指出C#的两个局限性。其一是该语言不适用于编写时间急迫或性能非常高的代码例如一个要运行1000或1050次的循环,并在不需要这些循环时,立即清理它们所占用的资源。在这方面,C++可能仍是所有低级语言中的佼佼者。其二是C#缺乏性能极高的应用程序所需要的关键功能,包括保证在代码的特定地方运行的内联函数和析构函数。但这类应用程序非常少。二、题目介绍1.题目要求修改一份C语言代码为C#代码。2.代码介绍一个非常简单的遗传算法源代码,是由DenisCormier(NorthCarolinaStateUniversity)开发的,SitaS.Raghavan(UniversityofNorthCarolinaatCharlotte)修正。代码保证尽可能少,实际上也不必查错。对一特定的应用修正此代码,用户只需改变常数的定义并且定义“评价函数”即可。注意代码的设计是求最大值,其中的目标函数只能取正值;且函数值和个体的适应值之间没有区别。该系统使用比率选择、精华模型、单点杂交和均匀变异。如果用Gaussian变异替换均匀变异,可能得到更好的效果。代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。读者可以从ftp.uncc.edu,目录4coe/evol中的文件prog.c中获得。要求输入的文件应该命名为‘gadata.txt’;系统产生的输出文件为‘galog.txt’。输入的文件由几行组成:数目对应于变量数。且每一行提供次序——对应于变量的上下界。如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等3.代码主要结构I.数据定义#definePOPSIZE50/*populationsize*/#defineMAXGENS1000/*max.numberofgenerations*/#defineNVARS3/*no.ofproblemvariables*/#definePXOVER0.8/*probabilityofcrossover*/#definePMUTATION0.15/*probabilityofmutation*/#defineTRUE1#defineFALSE0intgeneration;/*currentgenerationno.*/intcur_best;/*bestindividual*/II.存储结构structgenotype/*genotype(GT),amemberofthepopulation*/{doublegene[NVARS];/*astringofvariables*/doublefitness;/*GT'sfitness*/doubleupper[NVARS];/*GT'svariablesupperbound*/doublelower[NVARS];/*GT'svariableslowerbound*/doublerfitness;/*relativefitness*/doublecfitness;/*cumulativefitness*/};structgenotypepopulation[POPSIZE+1];/*population*/structgenotypenewpopulation[POPSIZE+1];/*newpopulation;*/III.基本函数voidinitialize(void);doublerandval(double,double);voidevaluate(void);voidkeep_the_best(void);voidelitist(void);voidselect(void);voidcrossover(void);voidXover(int,int);voidswap(double*,double*);voidmutate(void);voidreport(void);54.其他要求1.实现多线程操作2.在多线程间实现信息的交互三、需求解析及解决办法1.从面向过程到面向对象I.问题分析及整改方案因为在C#中为全面的面对对象的编程,所以对用面向过程的C语言程序必须全面的修改成面向对象的方式。基于面对对象和面向过程的思想的实现方式的不同以及类具有的封装继承与多态,我们主要要做的就是把原先C语言的面向过程的函数修改成类的方法。同时可以把整个过程封装成一个类也可以把功能封装成一个类实现。经过权衡本着代码精炼的原则我们决定封装成一个类。II.主要实现代码namespacetest_li{classProgram{publicstaticvoidinitialize();publicstaticdoublerandval(double,double);publicstaticvoidevaluate();publicstaticvoidkeep_the_best();publicstaticvoidelitist();publicstaticvoidselect();publicstaticvoidcrossover();publicstaticvoidXover(int,int);publicstaticvoidswap(double,double);publicstaticvoidmutate();publicstaticvoidreport();publicstaticvoidstart();staticvoidMain(string[]args)}}2.宏定义问题I.问题的分析及整改方案在面向对象的语言中,一般不会出现宏定义。因为宏定义在面向过程中生存时间长,可以随时调用,使用起来方便。但是对于面向对象来说,所有的属性变量都是随着类的实例化而生成随着类的消亡而消亡,共一定意义上说在面向对象的语言中没有宏定义的存在意义。或6许说只有一直存在的类没有一直存在的宏。介于我们这次用的是一个类,所以解决宏定义的方法就是把宏定义转化成静态的私有属性即可。II.主要代码实现privateconstintPOPSIZE=50;/*populationsize*/privateconstintMAXGENS=1000;/*max.numberofgenerations*/privateconstintNVARS=3;/*no.ofproblemvariables*/privateconstdoublePMUTATION=0.15;/*probabilityofmutation*/privateconstintTRUE=1;privateconstintFALSE=0;
本文标题:C#作业报告
链接地址:https://www.777doc.com/doc-4707410 .html