C#第二次实验:面向对象编程
2021/7/5 14:12:23
本文主要是介绍C#第二次实验:面向对象编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
注:本文由我原创,从本人的另一个CSDN账号(已注销)复制而来。由于原始doc文件丢失,所以直接从原推文拷贝,所以图片可能有水印。
实验一
【实验目的】求三角形的面积
【实验要求】
用“方法的参数数组”、“接口”、“构造函数”、“类继承”、至少四种方法实现三角形的面积的方法;
最简单的就是根据长方形的面积=长×宽推断出平行四边形的面积=底×高,因为两个一样的三角形可组成一个平行四边形,可得面积计算公式:
三角形的面积=底×高÷2 [S=ah÷2]
或者是:
三角形任意两边之积×这两边的夹角的正弦值÷2 [S=ab×sin×1/2];
(方法一,[S=ah÷2])
【实验代码】
using System; namespace homework2_1 { //定义接口IPartOne public interface IPartOne { void SetDataOne(string dataOne); //构造函数 } //WritesthClass类派生自接口IPartOne public class WritesthClass : IPartOne { private string DataOne; // public void SetDataOne(string dataOne) { DataOne = dataOne; Console.WriteLine("{0}", DataOne); } } //定义抽象基类:Shape public abstract class Shape { public Shape() {; } } //对Rectangular类的定义。Circle为Shape类的子类; public class Rectangular: Shape { //Length和Width是Rectangualr的属性; protected double Length, Width; public Rectangular () { Length = 0; Width = 0; //变量Length和Width的初始化; } public Rectangular (double Length,double Width) { this.Length = Length; this.Width = Width; } public double MianjiIs() { return Length * Width; } } public class Triangle:Rectangular //三角形类从矩形类中派生 { public Triangle (double Length,double Height) //方法,有参数,其中为形参,主函数中的参数是实参。 { this.Length = Length; this.Width = Height; } public double MianjiIs() { return 0.5* Length * Width; } } class Program { public static void Main(string[] args) { Console.WriteLine("请输入底边和高的长度,以回车键间隔:"); double i = Convert.ToInt32(Console.ReadLine()); double j = Convert.ToInt32(Console.ReadLine()); Triangle Tri = new Triangle(i, j); //实例化,并且设定三角形的三个边 WritesthClass a = new WritesthClass(); a.SetDataOne("Triangle area is:"); Console.WriteLine("{0}", Tri.MianjiIs()); } } }
【运行结果】
将底边和高分别设为3和4,得到的面积为:6;
【心得体会】
刚开始写这个程序的时候,心里是没有底的。因为之前都是读程序,还是第一次自己设计写一个程序。所以在方法的参数数组、类的继承和构造函数的使用上,借鉴了书上的例3.3;在接口上,借鉴了书上的例2.28.
在编程的润色时期,我想要增加一个输入三角形参数的功能,所以还有一些借鉴的地方:
double i = Convert.ToInt32(Console.ReadLine());
在课本上找输入语句时,我找到的只有字符串的输入语句,没有输入数字的语句。所以上网查了一下,得到了这个字符串转数字的语句,并得到了满意的结果。
以书上的程序为“剧本”,进行编程之后,发现有一个错误:
错误 CS0120 对象引用对于非静态的字段、方法或属性“Triangle.GetMianji()”是必需的
这个错误让我百思不得其解,查了好多资料,最终还是没有答案。经过艰难的思索,我终于明白自己的问题在哪里了——在主函数中没有对其中一个构造函数实例化。
解决这个问题之后,一切变得顺利起来。
(方法二):[S=ab×sin×1/2]
【实验代码】
using System; namespace homework2_1 { //定义接口IPartOne public interface IPartOne { void SetDataOne(string dataOne); //构造函数 } //WritesthClass类派生自接口IPartOne public class WritesthClass : IPartOne { private string DataOne; // public void SetDataOne(string dataOne) { DataOne = dataOne; Console.WriteLine("{0}", DataOne); } } //定义抽象基类:Shape public class Shape { protected double Aside, Bside, Cside; public Shape() { Aside= Bside= Cside=0; } public Shape(double Aside, double Bside, double Cside) //方法 { this.Aside = Aside; this.Bside = Bside; this.Cside = Cside; } }; public class Triangle : Shape //三角形类是形状类的子类 { public Triangle(double Aside, double Bside,double Cside) //方法,有三个参数,分别代表三角形的三个边其中为形参,下文主函数中的参数是实参。 { this.Aside = Aside; this.Bside = Bside; this.Cside = Cside; } public double MianjiIs() //构造函数,计算面积 { double CosB=(Aside* Aside+ Cside* Cside- Bside* Bside)/(2* Cside* Aside); double SinB= System.Math.Sqrt(1-CosB* CosB); return 0.5* Aside* Cside*SinB; } } class Program //程序类,在这里实现主程序 { public static void Main(string[] args) { Console.WriteLine("请输入三个边的长度,以回车键间隔:"); double i = Convert.ToInt32(Console.ReadLine()); double j = Convert.ToInt32(Console.ReadLine()); double k = Convert.ToInt32(Console.ReadLine()); Triangle Tri = new Triangle(i, j, k); //实例化,并且设定三角形的三个边 WritesthClass a = new WritesthClass(); a.SetDataOne("Triangle area is:"); Console.WriteLine("{0}", Tri.MianjiIs()); } } }
【运行结果】
输入三角形(选用的是直角三角形)的三个边:5、12、13,输出结果:30
【心得体会】
有了第一个程序,这次编程显得相对来说容易了一些。只出现了一个问题,就是:
框住的部分,原本是只写了一个CosB,结果总是算不对,令我非常疑惑和好奇,心想程序不可能有错啊(这次的程序是由上一个方法进行了一些改动来完成的)。结果偶然的一瞥,发现错误居然是由一个不算问题的问题导致的。
实验二
【实验目的】建立实验耗材管理系统
【实验要求】
设计一个耗材管理类,用来保存和记录实验室耗材分类和记录。这个类的成员包括耗材名、使用者、实验室存量。至少提供两个方法:
store 耗材的入库处理
show 显示耗材信息
程序运行时,可以从控制台上输入需入库耗材总数,根据这个总数创建耗材类对象数组,然后输入数据,最后可按照耗材名、使用者或实验室存量排序。
【实验代码】
using System; using System.ComponentModel.DataAnnotations; using System.Runtime.InteropServices; namespace Homework2_3 { class Program { private string namei; private int total; public Program() //在这个函数里,将名称字符串和总数初始化 { namei = ""; total = 0; } public Program(string namei, int total) //构造函数 { this.namei = namei; this.total = total; } public void Store(ref Program program) { namei = program.namei; total = program.total; } public void Show() //输出函数 { Console.WriteLine("Namei:{0}, Total:{1}", namei, total); } public string Namei //实验器材的名称 { get { return namei; } set { namei = value; } } public int Total { get{ return total; } set{ total = value; } } } class Homework2_3 { static void Main(string[] args) //程序入口的主函数 { Homework2_3 T = new Homework2_3(); //实例化 Program[] qijian; int[] index; int i,k; Program program= new Program(); Console.WriteLine("请输入需要入库的器件的总数:"); string sline = Console.ReadLine(); //输入一个整数 int num = int.Parse(sline); qijian = new Program[num]; for (i = 0; i < num; i++) qijian[i] = new Program(); index = new int[num]; for (i=0;i<num;i++) { Console.WriteLine("请输入器件名:"); //输入字符 program.Namei = Console.ReadLine(); Console.WriteLine("请输入入库总量:"); //输入整数 sline = Console.ReadLine(); program.Total = int.Parse(sline); qijian[i].Store(ref program); index[i] = i; } Console.Write("如果需要排序,请按1"); //结束输入 sline = Console.ReadLine(); int choice = int.Parse(sline); switch(choice) { case 1: T.SortNamei(qijian, index); break; } for(i=0;i<num;i++) { k = index[i]; (qijian[k]).Show(); } Console.Read(); } void SortNamei(Program[] qijian,int[] index) { int i, j, m, n, temp; for(m=0;m<index.Length-1;m++) //冒泡排序法 for(n=0;n<index.Length-m-1;n++) { i = index[n]; j = index[n + 1]; if(string.Compare(qijian[i].Namei,qijian[j].Namei)>0) { temp = index[n]; index[n] = index[n + 1];index[n + 1] = temp; } } } } }
【运行结果】
【心得体会】
编写这个程序的时候,我刚开始构思了一下,但是有很多地方不确定该怎么做,所以借鉴了一下书本上的“学生管理系统”程序。在阅读并弄懂之后,我仿照它写了一个类似的程序。在仿写的过程中,我不可避免地漏掉过一两行,然后整个程序出现了严重的BUG,这也让我更深入理解了这行程序的意义。
漏掉的代码:
index = new int[num];
在程序中的位置:
报错:
实验三
【实验目的】写一个窗口程序
【生成窗口】
点击生成的exe文件,出现一个简单的“登陆界面”:
输入“用户名”和“口令”:
进入系统:
点击“耗材信息显示”:
退出后,点击第二个“耗材信息修改”。由于未能连接数据库,所以暂时“未开放系统”:
【实验代码】
- 登陆界面
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace homework2_2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void Button1_Click(object sender, EventArgs e) { if(textBoxyhm.Text ==string.Empty|| textBoxmm.Text==string.Empty) { MessageBox.Show("请输入完整信息!"); return; } if(!textBoxyhm.Text.Equals ("SDU")||!textBoxmm.Text.Equals("sdu")) { MessageBox.Show("请输入正确信息!","提示"); } else { //进入系统 SystemForm systemfrm = new SystemForm(); systemfrm.ShowDialog(); this.Close(); } } private void Button2_Click(object sender, EventArgs e) { textBoxyhm.Clear(); textBoxmm.Clear(); } private void Label1_Click(object sender, EventArgs e) { } private void TextBoxyhm_TextChanged(object sender, EventArgs e) { } private void TextBoxmm_TextChanged(object sender, EventArgs e) { } } }
效果:
2. 系统界面
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace homework2_2 { public partial class SystemForm : Form { public SystemForm() { InitializeComponent(); } private void label1_Click(object sender, EventArgs e) { } private void SystemForm_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { //创建实验耗材信息查询窗体 SearchForm searchfrm = new SearchForm(); searchfrm.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { //创建实验耗材信息修改窗体 ModifyForm modifyfrm = new ModifyForm(); modifyfrm.ShowDialog(); } private void button3_Click(object sender, EventArgs e) { //创建实验耗材信息录入窗体 NoteForm notefrm = new NoteForm(); notefrm.ShowDialog(); } } }
3. 实验耗材信息查询界面:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace homework2_2 { public partial class SearchForm : Form { public SearchForm() { InitializeComponent(); } private void textBox1_TextChanged(object sender, EventArgs e) { } private void SearchForm_Load(object sender, EventArgs e) { } private void label5_Click(object sender, EventArgs e) { } private void label3_Click(object sender, EventArgs e) { } } }
4. 实验耗材信息修改/录入界面:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace homework2_2 { public partial class NoteForm : Form { public NoteForm() { InitializeComponent(); } private void NoteForm_Load(object sender, EventArgs e) { } }
【实验感想】
看着自己打出的代码可以运行出真正的窗口,并且可以生成“系统”,有一种很喜悦的心情。觉得如果有机会,想要把它学以致用,做一个真正可以应用的项目。
这篇关于C#第二次实验:面向对象编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统