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文件,出现一个简单的“登陆界面”:

输入“用户名”和“口令”:

进入系统:

点击“耗材信息显示”:

退出后,点击第二个“耗材信息修改”。由于未能连接数据库,所以暂时“未开放系统”:

【实验代码】

  1. 登陆界面
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#第二次实验:面向对象编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程