c#实验2 3

上机练习题

(1)构造一个类,可以分别对任意多个整数、小数或字符串进行排序。

答:具体步骤和主要代码如下:

① 创建一个控制台应用程序exerciseSort。

② 在Program.cs文件中定义一个Sort类,并在其中定义三个重载的方法BubbleSort;在Program类的Main函数中测试对任意多个整数、小数或字符串的排序。Program.cs文件的主要代码如下所示:

using System;
namespace exerciseSort
{
   public static  class Sort
    {
         //此处设置double[]、string[]类型数组与int[]相似,代码略 

        public static void BubbleSort(params int[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                int tempindex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (array[tempindex] > array[j])
                    {
                        tempindex = j;
                    }
                }
                if (tempindex != i)
                {
                    int tempValue = array[tempindex];
                    array[tempindex] = array[i];
                    array[i] = tempValue;
                }
            }
        }

        public static void BubbleSort(params double[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                int tempindex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (array[tempindex] > array[j])
                    {
                        tempindex = j;
                    }
                }
                if (tempindex != i)
                {
                    double tempValue = array[tempindex];
                    array[tempindex] = array[i];
                    array[i] = tempValue;
                }
            }
        }

        public static void BubbleSort(params string[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                int tempindex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (String.Compare(array[tempindex], array[j]) != -1)
                    {
                        tempindex = j;
                    }
                }
                if (tempindex != i)
                {
                    string tempValue = array[tempindex];
                    array[tempindex] = array[i];
                    array[i] = tempValue;
                }
            }
        }

    }


    class Program
    {
        static void Main(string[] args)
        {
            int[] a = { 2, 3, 5, 8, 9, 1, 0 };
            double[] b = { 1.2, 3.4, 6.5, 9, 12, 18, 1 };
            string[] s = { "China", "Japan", "Viet", "Abc" };
        
            Sort.BubbleSort(a);
            foreach (int item in a) {
                Console.Write("{0} ", item);
            }
            Console.WriteLine();

            Sort.BubbleSort(b);
            foreach (double item in b)
            {
                Console.Write("{0} ", item);
            }
            Console.WriteLine();

            Sort.BubbleSort(s);
            foreach (string item in s)
            {
                Console.Write("{0} ", item);
            }

Console.ReadKey();
        }
    }
}

 

 

③ 单击“启动调试”按钮运行该程序。

(2)自定义一个时间类,该类包含时、分、秒字段与属性,具有将时间增加1秒、1分和1小时的方法,具有分别显示时、分、秒和同时显示时分秒的方法。

说明:该类定义可用于控制台应用程序,也可用于Windows窗体应用程序。

答:具体步骤如下:

① 创建一个控制台应用程序exerciseClock。

② 在Program.cs文件中定义一个MyClock类,并在其中编写代码,具体代码如下所示:

 

 

 

③ 单击“启动调试”按钮运行程序。

 

 

 

 

(3)创建一个Windows应用程序,输入两个正整数,单击“计算”按钮,求出这两个正整数的最大公约数。

要求:将求最大公约数的算法声明为一个静态方法,由“计算”按钮调用。

答:具体步骤如下:

① 设计界面。新建一个C#的Windows应用程序,项目名称设置为exerciseHcf,向窗体添加3个文本框、3个标签和1个按钮,并按照图7.1所示调整控件位置和窗体尺寸。

 

图7.1  设计界面

② 设置属性。窗体和各个控件的属性设置如表7.1所示。

7.1  对象的属性设置

对象

属性名

属性值

Form1

Text

求最大公约数

label1~ label13

Text

整数1:          整数2:         最大公约数:

textBox1,textBox2

Name

txtNum1          txtNum2

textBox3

Name

txtResult

ReadOnly

True

button1

Name

btnCal

Text

计算

③ 编写代码。在Form1类中定义一个求最大公约数的静态方法CountCommonDivisor,并为按钮btnCal添加Click事件处理程序,具体代码如下所示:

public static int CountCommonDivisor(int x1, int x2)

{

........

略....

........

 

 

}

private void btnCal_Click(object sender, EventArgs e)

{

..........

略.....

.........

 

 

}

④ 运行程序。按照标签提示在文本框中输入2个整数,单击“计算”按钮查看结果。

1.选择题

(1)下面有关虚方法的描述中,正确的是    B    

A.虚方法能在程序运行时,动态确定要调用的方法,因而比非虚方法更灵活。

B.在定义虚方法时,基类和派生类的方法定义语句中都要带上virtual修饰符。

C.重写基类的虚方法时,为消除隐藏基类成员的警告,需要带上new修饰符。

D.在重写虚方法时,需要同时带上override和virtual修饰符。

(2)下列方法中,     C     是抽象方法。

A.static void func( ) { }       B.virtual  void func( ) { }

C.abstract void func( ) { }        D.override  void func( ) { }

(3)下列关于接口的说法中,  B   是错误的。

A.一个类可以有多个基类和多个基接口。

B.抽象类和接口都不能被实例化。

C.抽象类自身可以定义字段成员而接口不可以。

D.类不可以多重继承而接口可以。

(4)已知类Base、Derived 的定义如下:

class Base

public void Hello()

{  System.Console.Write("Hello in Base!");  }

}

class Derived : Base

{  

public new void Hello()

{  System.Console.Write("Hello in Derived!");   }

则语句段“Derived x = new Derived(); x.Hello();”在控制台中的输出结果为__D_______。

A.Hello in Base!               B.Hello in Base!Hello in Derived!

C.Hello in Derived!             D.Hello in Derived!Hello in Base!

 

2. 思考和阅读

(1)什么是类的继承?怎样定义派生类?

答:继承涉及到一个基类型和一个派生类型,其中基类型表示的是泛例,而派生类型表示的是特例。特例从泛例中派生出来,也就是说特例继承了泛例。被继承的类叫基类,继承后产生的类叫做派生类。

在C#中,派生类隐式地继承基类的所有成员,包括方法、字段、属性和事件(基类的私有成员、构造函数、析构函数除外),同时可以添加自己的成员来进行功能扩展。

(2)简述创建派生类时,构造函数的调用。

答:C#编译器自动在派生类构造函数中首先自顶向下地调用基类构造函数,以初始化从基类中继承的成员,最后调用自身的构造函数。如果某个派生类中没有明确定义任何构造函数,编译器会自动为之生成一个默认构造函数,并在其中调用其基类构造函数。

(3)怎样定义基类虚方法,并在派生类中重写基类虚方法?

答:在基类中,需要使用关键字virtual将某个方法显式声明为虚方法,然后再在派生类中必须使用override显式声明一个方法以重写某个虚拟方法。方法重写时,必须注意派生类中的方法应该与基类中被重写的方法有相同的方法名、返回值类型、参数列表和访问权限。

(4)抽象方法与虚方法有什么异同?

答:① 当方法前使用了virtual关键字时,它就成为虚拟方法;虚拟方法是多态的基础,在派生类中能够改变方法的执行,改变基类中虚方法的过程叫重写或覆盖。

② 当方法前使用了abstract关键字时,它就成为抽象方法;抽象方法是一个不完全的方法,它只有方法头,没有具体的方法体;抽象方法是一种虚拟方法(但不能用关键字virtual显式声明),是隐含的虚拟,而且必须被派生类实现重写。

③ 抽象方法与虚拟方法的差别在于:虚拟方法有实现,抽象方法没有实现。

(5)什么是抽象类?它有什么特点?它和接口有何异同?

答:抽象类是基类的一种特殊类型,必须用关键字abstract修饰。它除了拥有普通的类成员之外,还有抽象类成员。抽象类成员中的方法和属性,只有声明(使用关键字abstract),而没有实现部分。抽象类永远也不能实例化。

接口像一个抽象类,可以定义方法成员、属性成员、索引器和事件等,但接口不提供对成员的实现,而继承接口的类则必须提供接口成员的实现。可以将接口看做是只包含抽象方法的纯抽象类。接口最终还是需要由类或结构来实现,即要求类要实现接口的抽象方法成员,这与派生类保证要实现它的基类的抽象方法一样。

虽然接口和抽象类在句法和语义上紧密相关,但它们仍有一个重要的区别:接口只能包含抽象方法、抽象属性和抽象索引器,而抽象类还可能包含数据成员,以及完全实现的方法、属性和索引器。

(6)简述通过委托来调用对象方法的基本过程。

答:基本过程如下:

① 使用关键字delegate声明委托类型。

② 委托的实例化。委托是一种特殊的数据类型,必须实例化之后才能用来引用方法。

③ 通过委托变量调用方法。在使用委托对象调用所引用的方法时,必须保证参数的类型、个数和顺序与方法声明匹配。

上机实验: 编写一个程序,计算两个指定年份之间的闰年并输出,运行界面如图6.5所示。

要求:利用组合框选择或输入起止年份,起始年份不能大于终止年份;利用列表框输出闰年;窗体左下角显示当前的日期和时间。 

 

图6.5 计算闰年

答:具体步骤如下:

① 设计界面。新建一个C#的Windows应用程序,项目名称设置为exerciseLeapYear,向窗体中添加4个标签、2个组合框、1个列表框和1个按钮,并按图6.5所示调整控件位置和窗体尺寸。

② 设置属性。窗体和各个控件的属性设置如表6.5所示。

表6.5  对象的属性设置

对象

属性名

属性值

Form1

Text

计算指定年份间的闰年

label1~label3

Text

起始年份        终止年份        闰年列表

label4

Name

lblNow

Text

当前日期和时间

comboBox1,

comboBox2

Name

cbo1            cbo2

Text

1949            2010

listBox1

Name

lstYear

button1

Name

btnCal

Text

计算

timer1

Enabled

True

③ 编写代码。首先,双击窗体,打开代码视图,在Form1_Load事件处理程序中添加相应代码,如下所示:

private void Form1_Load(object sender, EventArgs e)

{

 

 

}

然后,双击按钮btnCal,在其Click事件处理程序中添加相应代码,如下所示:

private void btnCal_Click(object sender, EventArgs e)

{

 

 

 

}

最后,双击定时器timer1,在其Tick事件处理程序中添加相应代码,如下所示:

private void timer1_Tick(object sender, EventArgs e)

{

 


}   

  private void Form1_Load(object sender, EventArgs e)
        {
            object[] d = new object[3000];
            int k = 0;
            for (int i = 0; i < 3000; i++)
            {
                d[i] = k.ToString();
                k = k + 1;
            }
            object[] f = new object[3000];
            int m = 0;
            for (int i = 0; i < 3000; i++)
            {
                f[i] = m.ToString();
                m = m + 1;
            }
            comboBox1.DataSource = d;
            comboBox2.DataSource = f;
            timer1.Interval = 1000;
            timer1.Start();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int j = 0;
            label4.Text = System.DateTime.Now.ToString();
            int a = int.Parse(comboBox1.Text.ToString());
            int b = int.Parse(comboBox2.Text.ToString());
            object[] c = new object[3000];
            if (a > b)
            {
                MessageBox.Show("起e始º?年¨º份¤Y不?可¨¦大䨮于®¨²终?止1年¨º份¤Y");
                return;
            }
            for (int i = a; i <= b; i++)
            {
                if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
                {
                    c[j] = i.ToString();
                    j++;
                }
            }
            listBox1.DataSource = c;

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label4.Text = System.DateTime.Now.ToString();
        }
发布了65 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sereasuesue/article/details/103735281
今日推荐