版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于WinForm医用仪器软件设计MedicalInstrumentSoftwareDesignQuickStartTutorial2022讲师xxx关于这门课Aboutthiscourse.“在学习软件开发方面,很多初学者容易将过多的精力花在一些细节方面,例如纠结选择哪款开发平台,或在简单的程序中打转。本门课主要结合医疗电子技术领域的应用来介绍WinForm应用程序的开发设计,带领同学们一同完成一个软件项目,在实训中真正掌握编程的部分语法和应用,踏出卓越工程师的第一步。One
课程架构Coursearchitecture.“本课程共14个章节,25
个实验。第一章以HelloWorld实例简要介绍WinForm项目开发的流程;第二、三章以12个实验熟悉C#语言语法;第四章重点介绍WinForm的核心知识点,也是本程序开发中的难点;后十章为程序开发实战,逐步完成一个完整的项目。Two
SingleChipMicrocomputer学习指南StudyGuide“实验内容:简要介绍本章内容,明确学习目标。实验原理:详述完成所需的理论基础。读者在阅读实验原理部分后,可尝试独立完成本章实验。实验步骤与代码解析:介绍实验的程序设计思路,详述每一行代码的作用。本节/章任务:每章实验都会有2-5个本章任务,是例程的延伸。考验读者各章节知识的掌握程度,方便读者查漏补缺。本章习题:与本章实验原理有关的简答题,帮助读者巩固理论知识。Three01WINFORM开发环境章节目录TableofcontentsWinForm与VS2019介绍安装VisualStdioCommunity2019
第一个WinForm项目详解HelloWorld
程序调试本章任务010204030506配套资料Supportinginformation百度网盘:/s/1W_pdEpE7eVPSUJkLVQCsAg提取码:mn64WinForm介绍WinFormintroductionWinForm是.NET开发平台中对WindowsForm的一种称谓。WinForm应用程序可以显示信息、从用户请求输入并通过网络与远程计算机通信,通常称为桌面应用程序,例如迅雷、QQ等。在WinForm中,窗体是用于向用户显示信息的可视图画,显示数据或接收数据输入的分立用户界面元素称为控件。通过在窗体上放置控件并开发对用户操作(如单击)的响应来构建WinForm应用程序。WinForm通过事件来驱动。当用户对窗体或窗体中的某个控件执行某项操作时,会生成一个事件。应用程序会通过代码来响应这些事件,并在发生事件时进行处理。VS2019平台介绍VS2019introductionVisualStudio的全称为MicrosoftVisualStudio,它是美国微软公司的开发工具包系列产品,包含了整个软件生命周期中所需要的大部分工具,例如UML工具、代码管控工具、集成开发环境(IDE)等。
本书使用面向对象的编程语言——C#(读作CSharp),该语言主要用于开发运行在.NET平台上的应用程序。MicrosoftVisualStudio2019是目前基于C#开发WinForm的最新工具。微软提供了诸多版本的VisualStudio,本书使用的是VisualStudio2019的Community版本,可以在官网上免费获得,虽然该版本相对于付费版本缺少了某些功能,但并不影响使用Community版本来学习本书内容。安装VS2019InstallVS20191、计算机的配置要求(1)操作系统:Win7及以上版本(推荐使用Win10);(2)CPU:主频不低于2.0GHz;(3)内存:4G或更高,推荐8G;(4)硬盘:80G或更大。2、安装软件(位于配套资料包-02.相关软件)安装步骤:(1)安装.NETFramework4.6框架;(2)安装VisualStudioCommunity2019。(安装时须联网)第一个WinForm项目ThefirstWinFormproject1、新建HelloWorld项目(1)创建新项目:Windows窗体应用(.NETFramework)(2)项目名称:HelloWorld
位置:D:\WinFormTest\
解决方案名称:HelloWorld
取消勾选将解决方案和项目放在同一目录中
框架:.NET
Framework4.7.2(3)单击创建2、完善HelloWorld项目(1)在左上角工具箱中拖拽Button到Form1中(2)在属性标签页中修改button1的Text为“ClickMe”(3)单击属性标签页中的事件按钮,然后双击Click(4)为button1_Click事件响应方法写入代码3、运行程序:单击▶启动
编译运行4、应用程序:项目文件中bin\debug会生成对应exe文件,可在装有.NETFramework的计算机上运行详解HelloWorldDetailedhelloworld解决方案管理器窗口:Program.cs:自动生成的统筹文件Form1.cs:控制窗体及控件行为Form1.Designer.cs:控制布局样式(自动生成)展示窗口:展示解决方案窗口中选中的项目内容属性窗口:显示控件的属性信息错误列表窗口:提示具体错误信息代码介绍(1)命名空间namespace[命名空间名]{ [代码]}(2)类和构造方法class[类名]{ [类中代码]}(3)常用关键字intshortlongfloatbytedoublebooleanabstractpublicprivatestaticprotectedfinallythrowcontinuereturnbreakforforeachnewinterfaceifgotodefaultdocasevoidtryswitchelsecatchthiswhileclassusingnamespace命名空间将其中的代码做成一个封装面对内起到组织程序的作用,对外可以公开组织内容。通过使用using关键字引入外部命名空间:using
命名空间名;类定义了每个对象,也称为类的实例可以包含的数据和功能。即类实际上是创建对象的模板,可以用来描述实际需要解决的问题。代码介绍(4)标识符
①有由任意顺序的字符、下划线和数字组成;②第一个字符不能是数字;③不能使用C#中的关键字。(5)C#语句:可以声明变量、常量、类,可以调用方法、创建对象、执行逻辑操作等,以分号终止。(6)事件响应方法:事件也是类的成员,事件发生时对象会调用时间响应方法来响应该事件。(7)注释:行注释:“//”只对该行有效;块注释:从“/*”开始到“*/”结束,对中间部分有效。程序调试Programdebugging非中断模式下的调试1.使用WriteLine()方法输出调试信息Debug.WriteLine()和Trace.WriteLine()WriteLine方法具有两个参数:WriteLine([消息],[类别])例如:输入:Debug.WriteLine(“Addedaandb”,”AddFunc);输出为:AddFunc:Addedaandb2.使用断点中断模式下的调试1.进入中断模式:①在程序运行中通过暂停进入中断模式(随机)②设置断点自动进入中断模式2.监视变量内容①单击需要查看的变量名,右键选择“添加监视”②“调试”->“窗口”->”监视”3.单步执行代码①逐语句②逐过程③跳出本章习题Practices1.如何理解和使用命名空间?2.Program.cs文件对于整个项目的意义是什么?3.简述Debug.WriteLine()和Trace.WriteLine()语句用法的异同。本章任务Tasks下载并安装VisualStudioCommunity2019。新建一个Introduction项目,在项目中添加一个按钮,单击该按钮弹出个人姓名、性别、学号和兴趣等。基于WinForm医用仪器软件设计MedicalInstrumentSoftwareDesignQuickStartTutorial2022讲师xxx02
C#语言基础章节目录Tableofcontents
简单的秒值-时间值转换实验基于数组的秒值-时间值转换实验
基于方法的秒值-时间值转换实验基于枚举的秒值-时间值转换实验
基于结构体的秒值-时间值转换实验0102040305C#介绍C#语言是一种安全的、稳定的、简单的、面向对象的编程语言,提供了可视化工具,能够高效地编写程序。C#语言具备如下4个特点:(1)C#中已经不再使用指针,不允许直接读取内存等不安全的操作。比C、C++、Java提供了更多的数据类型,每个数据类型都是固定大小的。(2)与其他面向对象语言一样,C#语言也具有面向对象语言的基本特征,即封装、继承、多态。(3)支持跨平台最早的C#语言仅能在Windows平台上开发并使用,目前最新的C#6.0版本已经能在多个操作系统上使用,例如在Mac、Linux等。(4)使用C#语言不仅能开发在控制台下运行的应用程序,也能开发Windows窗体应用程序、网站、手机应用等多种应用程序。简单的秒值-时间值转换实验Simpletimeconversionexperiment实验内容一天有24小时、一小时有60分钟,一分钟有60秒,因此,一天就有24×60×60=86400秒,如果从0开始计算,每天按照秒计数的范围即为0~86399。通过键盘输入一个0~86399之间的值,包括0和86399,将其转换为小时值、分钟值和秒值,并通过控制台应用程序输出。hour=tick/3600;
min=(tick%3600)/60;
sec=(tick%3600)%60; 简单的秒值-时间值转换实验Simpletimeconversionexperiment实验原理1、控制台应用程序控制台应用程序编程是纯应用程序接口下的编程,类似于操作DOS(磁盘操作系统),需要通过输入命令和参数对软件进行操作。控制台应用程序主要用于对界面(UI:UserInterface)设计没有太多需求的情景,不需要过多考虑用户体验,实用、简洁且方便。通常用于开发一些简单的小工具。简单的秒值-时间值转换实验Simpletimeconversionexperiment实验原理2、变量和类型变量的命名需要满足以下规则:①变量名只能由数字、字母和下画线组成;②变量名的第一个字符必须为字母或下画线,不能是数字;③不能使用C#关键字作为变量名。声明变量的C#语法如下:变量类型变量名; //声明一个变量变量类型变量名1,变量名2,…变量名n; //声明多个同类型变量简单的秒值-时间值转换实验Simpletimeconversionexperiment实验原理3、运算符运算符的类型有很多种,这里介绍基本的算术运算符和赋值运算符。运算符说明+正号-负号++增1--减1运算符说明+求和-求差*求积/求商%求余一元运算符二元运算符运算符说明+=加赋值-=减赋值*=乘赋值/=除赋值%=求余赋值<<=左移赋值>>=右移赋值&=按位与赋值|=按位或赋值*A=按位异或赋值赋值运算符算术运算符简单的秒值-时间值转换实验Simpletimeconversionexperiment实验原理3、运算符在计算表达式时,并不一定会从左到右按顺序执行这些运算符,而是按照运算符的优先级顺序进行计算。在计算时,先计算优先级高的运算符,优先级相同的运算符按照从左到右的顺序计算。运算符的优先级如下表所示优先级运算符由高到低++、--(用作前缀)、+、-(一元)*、/、%+、-(二元)=、*=、/=、%=、+=、-=++、--(用作后缀)简单的秒值-时间值转换实验Simpletimeconversionexperiment实验原理4、控制台应用程序的Main入口方法创建控制台应用程序后,会自动生成一个Program.cs文件,在文件中有一个默认的Main方法,与WinForm项目中的Main方法一样,是程序的入口,每个程序中都必须包含一个Main方法。Main方法的默认修饰符为static,默认返回值为void,方法中默认包含了命令行参数string[]args。Main方法的返回值还可以是int类型,参数可以为空,但必须由static修饰,如:
staticintMain(){
[代码]}staticvoid
Main(){
[代码]}简单的秒值-时间值转换实验Simpletimeconversionexperiment实验原理5、Console.WriteLine()、Console.ReadLine()和Console.ReadKey()方法这3种方法都包含在外部命名空间System的Console类中,需要引用该命名空间。WriteLine(),用于打印提示信息,通常是加双引号的字符串。ReadLine(),用于获取键盘输入的内容。ReadKey(),实现的功能是通过任意键退出应用程序。示例用法如下:temp=Convert.ToInt32(Console.ReadLine());//将键盘输入的值赋值给tempConsole.WriteLine(“temp的值为:”+temp);//输出temp的值Console.ReadKey();//等待按任意键后才退出程序Convert类可以进行显式类型转换,主要用于将一种基本数据类型转换为另一种基本数据类型。其中ToInt32()方法用于将指定的值转换为32位有符号整数。简单的秒值-时间值转换实验Simpletimeconversionexperiment代码分析基于数组的秒值-时间值转换实验Array-basedtimeconversionexperiments实验内容通过键盘输入一个0~86399之间的值,包括0和86399,将其转换为小时值、分钟值和秒值,而小时值、分钟值和秒值为数组arrTimeVal的元素,即arrTimeVal【2】为小时值、
arrTimeVal【1】为分钟值,
arrTimeVal【0】为秒值,并输出转换结果。实验原理1、数组数组是相同类型数据的有序集合,数组描述的是相同类型的若干个数据,按照一定的先后次序排列而成。其中,每一个数据称为一个元素,每个元素可以通过数组名和索引(下标)访问。数组有3个基本特点:①长度确定,因为数组一旦被创建,它的元素个数就不可改变;②各元素类型相同,不允许出现混合类型;③数组类型可以是任何数据类型,包括基本类型和引用类型。可根据数组的维数将数组分为一维数组、二维数组、…,本课程只介绍一维数组。基于数组的秒值-时间值转换实验Array-basedtimeconversionexperiments实验原理2、数组的创建第一种方式是先声明,再用new关键字分配内存,如下所示:数组元素类型[]数组名;//声明一维数组数组名=new数组元素类型[数组元素的个数];//分配内存空间例:int[]arr;//声明一个int型数组,数组中的每个元素均为int型数值arr=newint[4];//分配内存空间,可以存放4个int型数据第二种是声明的同时为数组分配内存,如下所示:数组元素类型[]数组名=new数组元素类型[];例:int[]arr=newint[4];基于数组的秒值-时间值转换实验Array-basedtimeconversionexperiments实验原理3、数组的初始化数组的初始化分为两种方式,一种是为单个数组元素赋值,另一种是同时为整个数组赋值。为单个数组元素赋值的示例如下:int[]arr=newint[4]; //定义一个int类型的数组,该数组包含4个元素arr[0]=1; //为数组的第1个元素赋值arr[1]=2; //为数组的第2个元素赋值同时为整个数组赋值的示例如下:int[]arr=newint[4]{1,2,3,4};int[]arr=newint[]{1,2,3,4};int[]arr={1,2,3,4};基于数组的秒值-时间值转换实验Array-basedtimeconversionexperiments注意!数组的第一个下标是0代码分析基于数组的秒值-时间值转换实验Array-basedtimeconversionexperiments基于方法的秒值-时间值转换实验Mothod-basedtimeconversionexperiments实验内容通过键盘输入一个0~86399之间的值,包括0和86399,用calcHour()方法计算小时值,用calcMin()方法计算分钟值,用calcSec()方法计算秒值,在主方法中通过调用上述三个方法实现秒值-时间值转换,并输出转换结果。实验原理1、函数与方法在C#中,方法相当于C语言中的函数,但是它与传统的函数又有着明显的不同:①在结构化的语言中,函数是一等公民,整个程序是由一个个函数组成的;②在面向对象的语言中,类是一等公民,整个程序是由一个个类组成的。因此在C#中,方法不能独立存在,它只能属于类或对象。如果要定义一个方法,就必须在类中定义。注意,如果这个方法添加了修饰符static,这个方法就属于这个类,否则,这个方法属于这个类的实例,必须实例化后才能使用。基于方法的秒值-时间值转换实验Mothod-basedtimeconversionexperiments实验原理2、方法的定义方法的定义格式如下:修饰符返回值类型方法名(参数类型参数名1,参数类型参数名2,...){方法体
(return返回值;)}修饰符:private/public/protected访问权限返回值类型:方法返回值的数据类型。若无返回值使用void,且不需要return语句。方法名:见名知意。命名采用第一个单词首字母小写,后续单词首字母大写,其余字母
小写的格式命名(驼峰命名法)。基于方法的秒值-时间值转换实验Mothod-basedtimeconversionexperiments代码分析基于方法的秒值-时间值转换实验Mothod-basedtimeconversionexperiments基于枚举的秒值-时间值转换实验Enumeration-basedtimeconversionexperiments实验内容通过键盘输入一个0~86399之间的值,包括0和86399,用calcTimeVal()方法计算时间值(包括小时值、分钟值和秒值),通过枚举区分具体是哪一种时间值,返回值为这种时间值对应的转换结果,在Main()方法中通过调用calcTimeVal()实现秒值-时间值转换,并输出转换结果。实验原理1、枚举类型枚举类型是值类型的一种特殊形式,为基础类型的值提供替代名称。基础类型可以是除char类型外的任何整型,也可以说枚举类型是一组常量的集合。publicenumEnumTimeVal{TIME_VAL_HOUR,TIME_VAL_MIN,TIME_VAL_SEC}关键字:enum枚举名:EnumTimeVal使用方式:EnumTimeVal.TIME_VAL_HOUR基于枚举的秒值-时间值转换实验Enumeration-basedtimeconversionexperiments实验原理2、switch…case语句
功能:判断一个变量与一系列值中某个值是否相等switch(表达式){case常量值1:
语句块1 [break;]…case常量值n:
语句块n [break;]default:
语句块n+1 [break;]}当表达式的值与case常量值相等时,则执行case语句后面的语句块,直到遇到break语句为止。当遇到break语句时,switch…case…语句终止,程序跳转到switch…case…语句后面的语句执行。case语句并不一定都要包含break语句,如果没有break语句,程序会继续执行下一条case语句,直到出现break语句为止。switch语句可以包含一个default分支,该分支通常是switch语句的最后一个分支(可以在任何位置,但建议在最后一个),当所有case语句的值都不等于变量值时,default才执行,default分支可以不需要break语句。基于枚举的秒值-时间值转换实验Enumeration-basedtimeconversionexperiments代码分析基于枚举的秒值-时间值转换实验Enumeration-basedtimeconversionexperiments基于结构体的秒值-时间值转换实验Structure-basedtimeconversionexperiments实验内容通过键盘输入一个0~86399之间的值,包括0和86399,用calcTimeVal()方法计算时间值(包括小时值、分钟值和秒值),通过结构体区分具体是哪一种时间值,返回值为这种时间值对应的转换结果,在Main()方法中通过调用calcTimeVal()实现秒值-时间值转换,并输出转换结果。实验原理1、结构体类型结构体类型是另一种复杂的变量类型,与枚举类型不同,这些数据可能是不同的类型。例如定义一个病人结构体,该结构体可以包含病人姓名和病人ID号等,分别是不同的类型,例:publicstructStructPatient{publicstringname;publicintID;};关键字:struct结构体名:StructPatient使用方式:①创建结构体变量:StructPatientsp;②访问结构体成员:;基于结构体的秒值-时间值转换实验Structure-basedtimeconversionexperiments代码分析基于结构体的秒值-时间值转换实验Structure-basedtimeconversionexperiments本章任务Tasks2020年有366天,将2020年1月1日作为计数起点,即计数1,2020年12月31日作为计数终点,即计数366。计数1代表“2020年1月1日-星期三”,计数10代表“2020年1月10日-星期五”。参考本节实验,通过键盘输入一个1~366之间的值,包括1和366,参考各节实验,分别基于数组、枚举、结构体,将其转换为年、月、日、星期,并输出转换结果。本章习题Practices简述变量的命名规则。Short和int类型的数据分别占据多少字节?取值范围是多少?简述数组的基本特点。在方法中,return语句的作用是什么?简述结构体类型与枚举类型最主要的区别。基于WinForm医用仪器软件设计MedicalInstrumentSoftwareDesignQuickStartTutorial2022讲师xxx03基于C#的面向对象程序设计章节目录Tableofcontents
类的封装实验类的继承实验
类的多态实验抽象类实验接口实验0102040305命名空间实验06异常处理实验07先导知识·面向过程和面向对象面向过程面向对象编程思想过程为中心事物为中心函数组织代码按步骤解决问题用类组织代码以分类的方式解决问题特点优点性能高易维护,易使用,易扩展相辅相成,并不对立。整体上用面向对象把控,细节上用面向过程解决。先导知识·类与对象类是抽象的概念集合,表示的是一个共性的产物,类中定义的是属性和行为(方法);对象是一种个性的表示,表示一个独立而具体的个体。类与对象是面向对象中最基本的组成单元。类是对象的模板,对象是类的实例。对象是可以直接使用的。类不能直接使用,只有通过实例化对象才可以使用。举例在C#中,属性是以成员变量的形式定义的,行为是以方法的形式定义的,而类包括对象的属性和方法。举例publicclassHamburgerShop{publicHamburgerShop{//构造方法}publicintmBurgerType;//汉堡种类publicintmBurgerSize;//汉堡尺寸publicintmBurgerLayer;//汉堡层数privateintmBakingTime;//烘烤时间
//选择汉堡
publicvoidselectBurger(){}//支付费用
publicvoidpay(){}//制作汉堡
privatevoidmakeBurger(){}//交付汉堡
publicvoiddeliverBurger(){}}先导知识·类类包含的变量类型(1)成员变量:成员变量是定义在类体中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。(2)局部变量:在方法(包含构造方法)和语句块中定义的变量被称为局部变量。这种变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。(3)类变量:类变量也声明在类体中,方法体之外,但必须声明为static类型。这种变量也称为静态变量。先导知识·类类的成员方法和构造方法(1)成员方法成员方法对应类的行为,例如汉堡店类中的selectBurger()、publicvoidpay()等方法。参数个数:0-N个参数类型:对象或基本数据类型返回值:可有/无void
返回值类型:计算结果或其他数值及对象(2)构造方法构造方法是一个与类同名的方法,例如汉堡店类中的HamburgerShop()方法,对象的创建就是通过构造方法完成的。每个类都有构造方法,类实例化一个对象时,类都会自动调用构造方法。返回值:无
隐式定义:编译器提供一个默认的无参构造方法显式定义:一个类可以定义多个构造方法注:若定义了构造方法,将不再提供默认的构造方法。如果定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法。建议时刻保留无参构造方法的存在。先导知识·访问修饰符C#中常见的访问修饰符包括private、public、protected和internal,这些修饰符控制着对类、类的成员变量及成员方法的访问,修饰符权限如下表所示。访问修饰符说明public公有访问。不受任何限制private私有访问。只限于本类成员访问,子类和实例都不能访问protected保护访问。只限于本类和子类访问,实例不能访问internal内部访问。只限于本项目内访问,其他不能访问先导知识·对象的创建、操作和销毁对象是根据类创建的。创建对象需要以下3步:①声明:声明一个对象,包括对象名称和对象类型;②实例化:使用关键字new来创建一个对象;③初始化:使用new创建对象时,会调用构造方法初始化对象。创建方式如下:Personp=newPerson();对象类型对象名称实例化构造方法(初始化)每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。C#拥有一套完整的回收机制.类的封装实验EncapsulationexperimentforClass实验内容创建ConvertTime类,在类中定义一个CalcTime类,进一步在CalcTime类中依次定义:用于指定小时值、分钟值和秒值的常量TIME_VAL_HOUR、TIME_VAL_MIN和TIM_VAL_SEC;用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法;用于计算三个时间值的calcTimeVal()方法;用于获取三个时间值的getTimeVal()方法。其中,calcTimeVal()和getTimeVal()方法,及三个常量用public修饰,其余的成员变量和成员方法均用private修饰。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、类的封装封装是指一种将抽象性方法接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。实现封装的步骤分为两步:①将属性私有化:利用权限修饰符(一般为private)来控制权限,防止被随意获取②提供对外的公共方法访问:创建一对赋取值方法,用于对私有属性的访问。类的封装实验EncapsulationexperimentforClass封装的优点:①减少耦合②自由修改内部结构③精确控制成员变量④隐藏信息,实现细节。实验剖析类的封装实验EncapsulationexperimentforClass①创建类CalcTime:常量:TIME_VAL_HOUR、TIME_VAL_MIN、TIM_VAL_SEC变量:mHour、mMin、mSec方法:calcHour()、calcMin()、calcSec()、calcTimeVal()、getTimeVal()②在ConvertTime类中,实例化Calc类,定义计算和展示时间的方法③在Main()中实例化ConvertTime类并调用展示方法实验内容创建ConvertTime类,在类中定义一个父类CalcTime,在父类中依次定义用于指定小时值、分钟值的常量TIME_VAL_HOUR和TIME_VAL_MIN;用于保存小时值和分钟值的成员变量mHour和mMin;用于计算小时值和分钟值的calcHour()和calcMin()方法。然后定义一个继承父类的CalcAllTime子类,在子类中定义用于指定秒值类型的常量TIME_VAL_SEC;用于保存秒值的成员变量mSec;用于计算秒值的calcSec()方法。最后,重写用于计算时间值的calcTimeVal()方法和获取时间值的getTimeVal()方法。在ConvertTime类中,通过new操作符创建一个CalcAllTime型对象,该对象名为cat,然后,在ConvertTime类中定义一个用于计算和显示时间的dispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。类的继承实验
InheritanceexperimentforClass实验原理1、类的继承继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类,继承可以使得子类具有父类的属性和方法,还可以在子类中重新定义追加属性和方法。例如,看门犬:性别身长行走奔跑看门牧羊犬:性别身长行走奔跑牧羊抽取出共同的属性和方法—犬类属性:性别身长方法:行走奔跑类的继承实验
InheritanceexperimentforClass实验原理2、继承的优点和缺点类的继承实验
InheritanceexperimentforClass缺点①继承是侵入性的,子类必须拥有父类的所有属性和方法;②子类拥有父类的属性和方法,增加了子类代码的约束,降低了代码的灵活性;③当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来大段代码需要重构的后果,增强了代码的耦合性。优点①代码冗余度低,开发时间短;②代码扩展性高,系统开发灵活性强;③代码重用性高,系统出错概率低。实验原理3、继承的实现protected:只有派生类才能访问protected成员。子类不能继承父类的构造函数。在子类实例化对象的过程中,子类先默认执行父类的无参构造函数,再执行自己的构造函数。当父类是有参构造函数时,子类必须显式调用父类的构造函数,使用到base关键词。子类重新实现父类的方法分为override(重写)和new(覆盖)两种方法,使用override重新实现父类时,父类方法必须用virtual修饰,表示这个方法是虚方法,可以被重写。实例如下:类的继承实验
InheritanceexperimentforClasspublicclassDog//父类{privateintsex;privateintlength;publicDog(intdogSex,intdogLength)
//父类有参构造函数
{//初始化属性值
}publicvoidwalk(){Console.WriteLine("Dogiswalking.");
}//重写对应虚函数
publicvirtualvoidrun(){Console.WriteLine("Dogisrunning.");
}/*覆盖无需虚函数
publicvoidrun(){Console.WriteLine("Dogisrunning.");}*/}publicclassWatchDog:Dog//子类{//调用父类构造方法
publicWatchDog(intdogSex,intdogLength):base(dogSex,dogLength){}//重写
publicoverridevoidrun()
{//重写父类方法Console.WriteLine("WatchDogisrunning.");
}
/*覆盖示例
publicnewvoidrun(){//重写父类方法Console.WriteLine("WatchDogisrunning.");}*/publicvoidwatchDoor(){this.run();//调用子类成员方法
Console.WriteLine("WatchDogiswatchingdoor.");}}实验剖析①创建父类CalcTime:常量:TIME_VAL_HOUR、TIME_VAL_MIN变量:mHour、mMin方法:calcHour()、calcMin()、calcTimeVal()、getTimeVal()②创建子类CalcAllTime:常量:TIME_VAL_SEC变量:mSec方法:calcSec()、calcTimeVal()、getTimeVal()类的继承实验
InheritanceexperimentforClass③在ConvertTime类中,实例化CalcAllTime类,定义计算和展示时间的方法④在Main()中实例化ConvertTime类并调用展示方法类的多态实验
PolymorphismexperimentforClass实验内容创建ConvertTime类,在类中定义一个DispTime类,之后在DispTime类中定义一个虚方法dispTime()。然后创建一个继承DispTime类的CalcTime子类,进一步在CalcTime类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法,并重写dispTime()方法。其中calcHour()、calcMin()、calcSec()和dispTime()方法用public修饰,其余的成员变量和成员方法均用private修饰。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、类的多态性多态性是指在父类中定义的属性和方法被子类继承后,可以具有不同的数据类型或表现出不同的行为。类的多态实验
PolymorphismexperimentforClass类的多态性可以体现为:①重载式多态,也叫编译时多态,这种多态在编译时已经确定好调用哪个方法了;②重写式多态,也叫运行时多态,这种多态只有程序运行时,才知道调用的是哪个子类的方法。③父类引用指向子类对象,当这个对象需要调用的方法在父类和子类中都存在时,默认调用子类中的方法;若只存在于父类或子类中时,则调用对应类中的方法。动物会叫,猫会喵喵叫,狗会汪汪叫猫cat=new猫();cat.call();猫会喵喵叫动物animal=new猫();animal.call();猫是动物,会喵喵叫动物animal=new狗();animal.call();狗是动物,会汪汪叫实验原理2、重载与重写的区别重载要求“两同一不同”:①同一个类中方法名相同;②参数不同。参数不同包括:参数个数不同参数类型不同参数顺序不同(很少使用)
重写需要遵循以下规则:①父类方法与子类重写的方法中参数、返回值类型与方法名必须相同;②子类重写的方法不能拥有比父类方法更低的访问权限,当父类中方法的访问权限修饰符为private时,该方法在子类中是不能被重写的;③如果父类方法抛出异常,那么子类重写的方法也要抛出异常,而且抛出的异常不能多于父类中抛出的异常。类的多态实验
PolymorphismexperimentforClass实验剖析①创建父类DispTime,定义一个虚方法dispTime()②继承父类创建CalcTime子类,重写dispTime()③在Main()中实例化一个父类指向子类的对象,通过这个对象调用dispTime方法实现时间值的转换类的多态实验
PolymorphismexperimentforClass抽象类实验
ExperimentforAbstractClass实验内容创建ConvertTime类,在类中定义一个Time抽象类,在抽象类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec,及用于显示时间的dispTime()方法,该方法为抽象方法。然后定义一个继承抽象类的CalcTime子类,在子类中定义用于计算小时值的calcHour()方法,用于计算分钟值的calcMin()方法,用于计算秒值的calcSec()方法,最后,重写用于显示时间的dispTime()方法。在ConvertTime类中,通过new操作符创建一个CalcTime型对象,该对象名为ct,然后,在ConvertTime类中定义一个用于计算和显示时间的calcDispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、抽象类抽象类也是类,当有一些情况只知道一个类需要哪些属性和方法,不知道这些方法具体是什么,就需要用到抽象类。2、抽象方法一个类中的方法的具体实现由它的子类确定,可以在父类中声明该方法为抽象方法。定义抽象类的语法如下:[权限修饰符]abstractclass类名{//类体}关键字:abstract
定义抽象方法的语法如下:[权限修饰符]abstract
返回值类型方法名(参数列表);抽象类实验
ExperimentforAbstractClass实验原理抽象类有以下规定:(1)抽象类不能被实例化,非抽象子类可以。(2)有抽象方法的类一定是抽象类。(3)抽象类中的抽象方法只是声明,不包含方法体。(4)构造方法和类方法(用static修饰的方法)不能声明为抽象方法。(5)抽象类的子类必须给出抽象类中抽象方法的具体实现,除非该子类也是抽象类。抽象方法有以下规定:(1)抽象方法后面直接跟一个分号,而不是花括号。(2)抽象方法的修饰符必须为public或protected(为private不能被子类继承),默认情况下为public。(3)任何子类必须重写父类的抽象方法,或者声明该子类为抽象类。抽象类实验
ExperimentforAbstractClass实验剖析①创建抽象类Time:变量:mHour、mMin和mSec抽象方法:dispTime()
②创建继承Time抽象类的CalcTime子类③在ConvertTime()中实例化Calc对象,定义calcDispTime方法抽象类实验
ExperimentforAbstractClass接口实验Interfaceexperiment实验内容创建ConvertTime类,在类中定义一个接口ITime,在接口中依次定义小时、分钟、秒值的默认值DEFAULT_HOUR、DEFAULT_MIN和DEFAULT_SEC;用于显示时间的dispTime()方法,该方法为抽象方法。然后定义一个实现接口ITime的CalcTime类,在该类中定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法;最后,重写用于显示时间的dispTime()方法。在ConvertTime类中,通过new操作符创建一个CalcTime型对象,该对象名为ct,然后,在ConvertTime类中分别定义一个用于计算和显示时间的calcDispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、接口接口是抽象类的延伸,通常用interface来声明。接口不是类,接口包含类要实现的方法。接口无法被实例化,但接口可以被实现。例如,鸟都有fly()和eat()两个行为,可以定义一个接口,如下: publicinterfaceBird{
publicabstractvoidfly();
publicabstractvoideat(); }关键字:interface
接口实验Interfaceexperiment实验原理2、抽象类和接口的区别类的继承和接口的实现都用到“:”,抽象类与接口的区别如下:(1)抽象类可以包含构造方法,接口没有构造方法。(2)抽象类既可以有抽象方法也可以有非抽象方法,接口中的方法必须是抽象方法。(3)抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是静态常量。(4)抽象类可以包含静态代码块和静态代码,而接口中不能包含。(5)一个类只能继承一个抽象类,但可以实现多个接口。接口实验Interfaceexperiment抽象类对类抽象,包括属性、行为接口对行为抽象实验原理3、接口的定义与实现接口中的变量会被隐式地指定为publicconst变量,必须给出初始值,绝对不会被修改;接口中的方法会被隐式地指定为publicabstract方法,只能是publicabstract方法;接口中所有的方法不能有具体的实现,即接口中的方法必须都是抽象方法。定义接口时,需要使用interface关键字,语法如下:[权限修饰符]interface接口名{[public][const]常量;[public][abstract]方法;}接口实验Interfaceexperiment实验1剖析①定义接口Itime,接口中定义用与显示时间的dispTime()抽象方法②创建实现Itime接口的CalcTime子类③在ConvertTime类中实例化一个CalcTime对象,然后定义一个calcDispTime()方法用于计算和显示时间接口实验Interfaceexperiment实验2剖析①定义接口ITime,接口中定义用与显示时间的dispTime()抽象方法②在定义接口ICalc,单独定义计算时间值的方法:③创建一个实现ITime接口和ICalc接口的CalcTime子类④在ConvertTime类中实例化一个CalcTime对象,然后定义一个calcDispTime()方法用于计算和显示时间接口实验Interfaceexperiment命名空间实验Namespaceexperiment实验内容创建CalcTime类,该类位于命名空间ConvertT.leyutek.calc中,在CalcTime类中依次定义用于指定小时值、分钟值和秒值的常量TIME_VAL_HOUR、TIME_VAL_MIN和TIM_VAL_SEC;用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法;用于计算三个时间值的calcTimeVal()方法;用于获取三个时间值的getTimeVal()方法。其中,calcTimeVal()和getTimeVal()方法,及三个常量用public修饰,其余的成员变量和成员方法均用private修饰。新建一个ConvertTime类,通过using导入CalcTime类包,并在ConvertTime类中通过new操作符创建一个CalcTime型对象,该对象名为ct,然后,在ConvertTime类中定义用于计算和显示时间的dispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、C#命名空间命名空间可以较好的管理类代码,避免命名冲突带来的问题。学生类学生类工学院商学院解决命名冲突关键字:
using命名空间的导入using
[命名空间名];命名空间的定义namespace
[命名空间名]{[代码]}关键字:namespace命名空间实验Namespaceexperiment实验剖析①
将计算时间的类CalcTime归属于ConvertT.leyutek.calc命名空间②在ConvertTime类中using导入ConvertT.leyutek.calc命名空间中的CalcTime类③在ConvertTime类中实例化一个CalcTime对象,定义一个dispTime()方法用于计算和显示时间命名空间实验Namespaceexperiment异常处理实验Exceptionhandlingexperiment实验内容创建TickException自定义异常类,实现构造方法。然后,创建ConvertTime类,在该类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算和显示时间值的calcTimeVal()方法,如果tick值小于0或大于86399,通过throw实例化TickException自定义异常类。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,在try语句中通过调用ct对象的calcTimeVal()方法计算和显示时间值,在catch语句中输出异常信息,最后,在finally语句中关闭控制台输入对象。实验原理1、C#异常处理即在可能出现错误的地方,编写完善的代码来处理错误和异常,避免程序中断。2、C#异常类型C#中所有的异常类都是System.Exception的直接或间接子类,这些异常类包含了异常的相关信息。常见的异常如下表:异常处理实验Exceptionhandlingexperiment实验原理常见异常类型异常类描述System.ArithmeticException在算术运算期间发生的异常System.ArrayTypeMismatchException存储一个数组时,被存储的元素的实际类型与数组的实际类型不兼容导致存储失败而引发的异常System.DivideByZeroException在试图用零除整数值时引发System.IndexOutOfRangeException在试图使用小于零或超出数组界限的下标索引数组时引发System.InvalidCastException当从基类或派生类的显示转换在运行时失败,就会引发此异常System.NullRefferenceException在需要使用引用对象的场合,如果使用null引用,就会引发此异常System.OutOfMemoryException在分配内存的尝试失败时引发System.OverflowException在选中的上下文中所进行的算术运算、类型转换或转换操作导致溢出时引发的异常System.StackOverflowException挂起的方法调用过多而导致执行堆栈溢出时引发的异常System.TypeInitializationException在静态构造函数引发异常,并且不能捕捉它的catch子句时引发异常处理实验Exceptionhandlingexperiment实验原理3、C#捕获异常在C#中,捕获异常会使用try…catch…finally语句。语法如下:try{//代码块}catch(异常类名异常对象名){//对异常进行处理}…finally{//代码块}try语句块中是可能发生异常的代码,①如果发生异常,则抛出异常对象,catch语句块会捕获异常对象,并做出相应处理;②如果没有异常,catch语句块将被忽略,程序将从catch语句块后的第一条语句开始执行;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码是否产生异常,finally语句块都会被执行。如果没有catch语句块,就一定要有finally语句块。异常处理实验Exceptionhandlingexperiment实验原理4、通过throw关键字抛出异常throw关键字通常在方法体中使用,常用于抛出一个用户自定义的异常对象。当程序执行到throw语句时立即终止,throw后面的语句将不再执行。可以使用try…catch…finally语句捕获throw抛出的异常,将使用了throw关键字的方法放置到try语句块中,通过catch语句块对此异常进行处理。throw异常对象名抛出异常的格式:自定义异常的格式:class异常类名:Exception{
构造方法}异常处理实验Exceptionhandlingexperiment代码分析异常处理实验Exceptionhandlingexperiment本章任务Tasks2020年有366天,将2020年1月1日作为计数起点,即计数1,2020年12月31日作为计数终点,即计数366。计数1代表“2020年1月1日-星期三”,计数10代表“2020年1月10日-星期五”。参考各节实验,通过键盘输入一个值,如果该值在1~366之间(包括1和366),将其转换为年、月、日、星期,并输出转换结果;否则,通过异常处理机制,输出异常信息。本章习题Practices1.面向过程和面向对象有什么区别?2.类与对象是面向对象程序设计中的两个最基本组成单元,简述类与对象的关系。3.什么是成员变量?什么是局部变量?什么是类变量?4.在定义一个类时,是否可以不定义构造方法,为什么?5.类的封装有什么优点?6.什么是类的继承?简述继承的优点和缺点。7.子类如何继承父类?子类通过什么关键字实现接口?8.简述继承和接口的区别。9.简述方法重载和方法重写的区别。10.什么是抽象方法和抽象类?简述两者之间的关系。11.为什么要使用命名空间?如何创建和导入命名空间?12.什么是c#异常处理?基于WinForm医用仪器软件设计MedicalInstrumentSoftwareDesignQuickStartTutorial2022讲师xxx04WinForm程序设计章节目录Tableofcontents多线程实验委托和事件实验画图实验010203多线程实验Multithreadingexperiment实验内容该实验主要对比有无lock死锁对程序结果的影响。首先,新建一个控制台应用程序,在Program类中定义一个ticket()方法,用于显示剩余预约号不小于0时各个线程的调用情况(剩余预约号的初始值设为5)。在Main()方法中实例化Program类,新建4个线程,分别命名为“线程一”“线程二”“线程三”和“线程四”,线程入口都调用ticket()方法,然后打开线程,显示每个线程的调用情况。再新建一个控制台应用程序,代码同上,不同的是在ticket()方法中使用lock,来确保代码块完成运行。实验原理1、线程的定义--线程与进程进程是系统中资源分配和资源调度的基本单位。每个独立执行的程序称为一个进程,例如QQ就是一个进程。线程是进程中的基本执行单元,是操作系统分配CPU时间的基本单元。一个进程可以包含若干个线程,并且可以做到同时运行且互不干扰。Windows操作系统是多任务操作系统,以进程为单位,系统分配每个进程一段有限的使用CPU时间,这段时间内执行此进程,下个时间片段又调到另一个进程中去执行。线程则是进程中的执行流程,在进程得到CPU执行时间的同时,线程也同时得到程序执行的时间,这样一个进程就可以具有多个并发执行的线程。多线程实验Multithreadingexperiment实验原理2、多线程的优缺点优点:(1)多线程使程序的响应更快,在进行后台复杂计算的同时,也能使用户界面处于活跃状态;(2)多线程可以提高CPU的利用率,在处理耗时任务时可以定期将处理器时间让给其他任务;(3)多线程可以分别设置优先级优化性能。缺点:(1)线程也需要占用内存,线程越多,占用的内存就越多;(2)跟踪线程需要占用大量的CPU时间,线程过多,会使得线程的进度缓慢;(3)线程过多会导致控制复杂,造成很多程序缺陷;(4)线程之间对共享资源的访问会互相影响,解决不好会影响执行效果。多线程实验Multithreadingexperiment实验原理3、创建线程线程Thread类类位于System.Threading命名空间中,可用于创建并控制线程、设置线程优先级并控制其状态。使用Thread类创建线程时,只需要提供线程入口,告诉这个线程需要做什么,然后启动线程即可。线程的使用示例如下: Threadthread=newThread(newThreadStart(method));//创建Thread类的对象 thread.Start();//启动线程多线程实验Multithreadingexperiment类型线程名实例化构造函数,其参数是预定了Start方法的委托创建指向method方法的ThreadStart类型委托代码1分析4个线程公用一块代码,争抢共同资源A线程未执行完,B线程调用了,没有依次递
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025北京北师大实验中学高二(上)期中数学试题及答案
- 《工程材料及热加工技术》课件汇 第1-11章 工程材料的性能指标-工程材料的选用
- 安丘就业方案
- 教资就业指导指南
- 脑梗死健康宣教专项考核试题
- 2026 三年级下册《单元重难点突破》课件
- 医院牙科档案管理制度及流程
- 医院资料档案管理制度
- 协会制定财务制度
- 南京小学内部控制制度
- 2026届新疆乌鲁木齐市高三三模英语试题(含答案)
- 2026陕西继续教育专业课+答题(3套)试卷及答案
- 2026年神经内科(正-副高)练习题库及完整答案详解(全优)
- 2024年西藏自治区中考物理试题卷(含答案)
- 《底层逻辑》刘润
- 第五节绿色施工管理体系与措施
- 破伤风急诊预防及诊疗专家共识
- 产教融合实训基地建设
- 2024年大型国有集团公司“两优一先”评选表彰工作方案
- 20G520-1-2钢吊车梁(6m-9m)2020年合订本
- 医疗废物分类及处理
评论
0/150
提交评论