Mục lục chương I: ĐỐi tưỢng và LỚP



tải về 1.36 Mb.
trang22/28
Chuyển đổi dữ liệu21.12.2018
Kích1.36 Mb.
1   ...   18   19   20   21   22   23   24   25   ...   28

Kiểu Boxing và Unxing


Boxing là tiến trình chuyển đổi một kiểu giá trị thành kiểu Object. Nó là ngầm định khi ta cung cấp một giá trị tham chiếu đến giá trị này và giá trị được chuyển đổi ngầm định.

Ví dụ: Minh hoạ Boxing

using System;

class Boxing

{

public static void Main()



{

int i = 123;

Console.WriteLine("The object value:{0}", i);

Console.ReadLine();

}

}

Unxing : trả kết quả của một đối tượng về kiểu giá trị, ta thực hiện mở tường minh nó. Ta thiết lập theo 2 bước sau:



1. Chắc chắn rằng đối tượng là thể hiện của một giá trị đã được box

2. Sao chép giá trị từ thể hiện này thành giá trị của biến.

Vd: Minh hoạ boxing và Unxing

using System;

public class Unxing

{

public static void Main()

{

int i = 123;

object o=i;

int j = (int)o;

Console.WriteLine("j :{0}", j);

Console.ReadLine();

}

}


    1. Lớp lồng nhau:


Lớp được khai báo trong thân của một lớp được gọi là lớp nội hay lớp lồng, lớp kia là lớp ngoài. Lớp lồng có khả năng truy cập tới các thành viên của lớp ngoài. Một phương thức của lớp lồng có thể truy xuất đến biến thành viên private của lớp ngoài. Hơn nữa lớp nội ẩn trong lớp ngoài so với các lớp khác, nó có thể là thành viên kiểu private của lớp ngoài.Lớp lồng được khai báo với từ khoá internal trước từ khoá class.

Ví dụ


public class A

{

internal class B



}
  1. BÀI TẬP MẪU

    1. Kế thừa

      1. Xây dựng lớp dẫn xuất thừa kế từ lớp cơ sở.

          Bài 1:


Xây dựng lớp có tên là lương để tính lương cho cán bộ với các thông tin sau: Họ tên, lương cơ bản, hệ số lương,với các phương thức :Khởi tạo không tham số dùng để khởi tạo lương cơ bản là 450, hệ số lương là 2,3.Phương thức thiết lập 2 tham số dùng để khởi tạo lương cơ bản,hệ số lương.

Sau đó kế thừa lớp có tên là lương được xây dựng ở trên dùng để tính lương mới cho các cán bộ với việc bổ sung thêm hệ số phụ cấp, lương được tính lại như sau: Lương=lương cơ bản*hệ số lương*hệ số phụ cấp.

a, Hướng dẫn:

Bài toán này được xây dựng gồm có 2 đối tượng:class luongclass luongmoi. Nhìn vào bài toán trên ta thấy cả hai lớp có những thuộc tính và phương thức giống nhau như: lương cơ bản, hệ số lương, các phương thức khởi tạo, tính lương.Theo như lập trình cấu trúc thì bạn phải đi xây dựng tất cả các thuộc tính và phương thức cho cả hai lớp trên. Ngược lại với lập trình hướng đối tượng thì việc giải quyết lại đơn giản hơn. Bạn chỉ cần xây dựng một lớp class luong, còn lớp class luongmoi sẽ kế thừa lại các thuộc tính và phương thức giống lớp class luong chứ không phải xây dựng lại. Nó chỉ xây dựng các thuộc tính và phương thức riêng của nó mà lớp Class luong không có.

class luong //Lớp cơ sở

{

Thuộc tính:



private string hoten;

private double hesoluong;

private static int luongcoban;

Lưu ý: Lương cơ bản là thuộc tính không thay đổi.Vậy ta phải khai báo

với từ khoá Static

Phương thức:

public void nhap ()

public luong() // Phương thức thiết lập không tham số

public luong(double lcb, float hsl) // Phương thức thiết lập 2 tham số

public double tinhluong()

public void hien()

}

class luongmoi //Lớp dẫn xuất



{

Thuộc tính:

private double hesophucap;

Phương thức:

public new void nhap ()

public luongmoi() // Phương thức thiết lập không tham số public luongmoi(int lcb,double hsl, double hspc)

// Phương thức thiết lập các tham số

public new double tinhluong()

public new void hien()

}

b, Bài giải mẫu:



using System;

class luong

{

private string hoten;



private double hesoluong;

private static int luongcoban;

public void nhap()

{

Console.Write("Nhap ho ten:") ;

hoten=Console.ReadLine();

Console.Write("He so luong:");

hesoluong=double.Parse(Console.ReadLine());

}

public luong ()

{

luongcoban=450;



hesoluong=2.34;

}

public luong (double lcb,float hsl)

{

luongcoban=lcb ;



hesoluong =hsl ;

}

public void hien()

{

Console.WriteLine("Ho ten :{0}",hoten);



Console.WriteLine("He so luong:{0}",hesoluong );

}

public double tinhluong()

{

return luongcoban*hesoluong ;

}

}



class luongmoi:luong

{

private double hesophucap;



public luongmoi():base() // Gọi phương thức thiết lập không tham số

{ của lớp cơ sở

hesophucap=0.4;

}

public luongmoi(int lcb,float hsl,double hspc):base(lcb,hsl)

{ // Gọi phương thức thiết lập 2 tham số

hesophucap = hspc; của lớp cơ sở

}

public new void nhap()

{

base.nhap();

Console.Write("He so phu cap:");

hesophucap =double.Parse(Console.ReadLine());

}

public new void hien()

{

base.hien();

Console.WriteLine("He so phu cap= {0}", hesophucap);

}

public new double tinhluong()

{

return base.tinhluong()*hesophucap ;

}

}



class tester

{

static void Main()

{

luongmoi A = new luongmoi();



A.nhap();

A.hien();

Console.WriteLine("Luong moi:{0}", A.tinhluong());

Console.ReadLine();

}

}



Kết quả sau khi thực hiện chương trình:


Họ tên : Nguyễn Văn A

Hệ số lương : 3.6

Hệ số phụ cấp : 4.3

Lương mới : 6 966





Kết luận: Mục đích xây dựng bài toán trên là giúp bạn biết cách xây dựng lớp dẫn xuất kế thừa từ một lớp cơ sở, cách gọi hàm thiết lập, phương thức của lớp cơ sở thông qua từ khoá Base. Và trả lời một số câu hỏi sau: Khi nào thì xây dựng một lớp kế thừa từ lớp khác ? Và mục đích của việc kế thừa ?

- Một lớp được kế thừa từ lớp khác khi một lớp đó có các thuộc tính và phương thức giống với một lớp nào đó đã được xây dựng.

- Mục đích của việc kế thừa giúp chúng ta không phải đi xây dựng những gì đã có.Do vậy bạn đã tiết kiệm thời gian viết mã cốt và sử dụng tài nguyên có hiệu quả. Hơn nữa điều đó còn giúp cho chương trình sáng sủa, và tránh được các lỗi khi lập trình.

          Bài 2


Xây dựng phương trình bậc hai sau đó kế thừa giải phương trình trùng phương

a, Hướng dẫn:

Ta thấy phương trình trùng phương là trường hợp đặc biệt của phương trình bậc hai. Bài toán giải phương trình bậc hai là một bài toán phổ biến và đều được lập trình rất nhiều trong các ngôn ngữ. Vậy trên cơ sở của phương trình bậc hai chúng ta có thể kế thừa lại để lập trình giải phương trình trùng phương.

Bài toán được chia làm hai đối tượng Ptbachai và pttp

Các phương thức và thuộc tính của phương trình bậc hai

class ptbachai

{

protected double a,b,c;



public void nhap()

public double delta()

public void giai(out double x1,out double x2,out bool kt)

public void hien()

}

class pttp:ptbachai



{

public new void hien()

}

b, Bài giải mẫu:



using System;

class ptb2

{

protected double a,b,c;



public void nhap()

{

Console.Write (" Nhap vao he so a =" );



a =double.Parse(Console.ReadLine());

Console.Write(" Nhap vao he so b =" );

b = double.Parse(Console.ReadLine());

Console.Write(" Nhap vao he so c =" );

c = double.Parse(Console.ReadLine());

}

public double delta()

{

return (b*b-4*a*c);

}

public void giai(out double x1,out double x2,out bool kt)

{

kt = true;



if (delta() < 0) { kt = false; x1 = x2 = 0; }

else

{

if (delta() == 0)

x1 = x2 = -b / (2 * a);

else

{

x1 = (-b + Math.Sqrt(delta())) / (2 * a);



x2 = (-b - Math.Sqrt(delta())) / (2 * a);

}

}



}

public void hien()

{

double x1, x2;



bool kt;

giai(out x1,out x2,out kt);



if (kt == false) Console.WriteLine("Phuong trinh vo nghiem");

else

if (x1 == x2) Console.WriteLine("Phuong trinh co nghiem kepx1=x2={0}", x1);

else

{

Console.WriteLine("Phuong trinh co 2 nghiem phan biet");



Console.WriteLine("x1={0}", x1);

Console.WriteLine("x2={0}", x2);

}

}

}



class pttp:ptb2

{

public new void hien()

{

double x1, x2;

bool kt;

base.giai(out x1,out x2,out kt);

if (kt==false )

Console.Write("Phuong trinh vo nghiem");



else

{

if ((x1 == x2 & x1 < 0))

Console.Write("Phuong trinh vo nghiem");

if((x1 == x2 & x1==0)|| (x1 == 0 & x2 < 0))

Console.Write("Phuong trinh co 1 nghiem y1={0}",x1);



if ((x1 == x2 & x1 > 0))

{

Console.WriteLine("Phuong trinh co 2 nghiem y1,y2");



Console.WriteLine("y1={0}", Math.Sqrt(x1));

Console.WriteLine("y2={0}", -Math.Sqrt(x1));

}

if (x1 == 0 & x2 > 0)

{

Console.WriteLine("Phuong trinh co 3 nghiem ");



Console.WriteLine("y1={0}", x1);

Console.WriteLine("y2={0}", -Math.Sqrt(x2));

Console.WriteLine("y3={0}", Math.Sqrt(x2));

}

if (x1 < 0 & x2 == 0)

Console.WriteLine("Phuong trinh co 1 nghiem y1= {0}",x2);

if (x1 > 0 & x2 == 0)

{

Console.WriteLine("Phuong trinh co 3 nghiem");



Console.WriteLine("y1={0}", x2);

Console.WriteLine("y2={0}", -Math.Sqrt(x1));

Console.WriteLine("y3={0}", Math.Sqrt(x1));

}

if (x1 < 0 & x2 > 0)

Console.WriteLine("Phuong trinh co 2 nghiem");

if (x1 > 0 & x2 < 0)

{

Console.WriteLine("Phuong trinh co 2 nghiem");



Console.WriteLine("y1={0}", -Math.Sqrt(x1));

Console.WriteLine("y2={0}", Math.Sqrt(x1));

}

if (x1 > 0 & x2 > 0 & x1!= x2 )

{

Console.WriteLine("Phuong trinh co 4 nghiem phan biet");



Console.WriteLine("y1={0}", -Math.Sqrt(x1));

Console.WriteLine("y2={0}", Math.Sqrt(x1));

Console.WriteLine("y3={0}", -Math.Sqrt(x2));

Console.WriteLine("y4={0}", Math.Sqrt(x2));

}

}

}



}

class tester

{

static void Main()

{

pttp D = new pttp();

D.nhap();

D.hien();

Console.ReadLine();

}

}



Kết quả sau khi chạy chương trình:




Nhập vào hệ số a =3

Nhập vào hệ số b =2

Nhập vào hệ số c =1

Phương trình vô nghiệm



      1. Mức độ truy cập Protected


Bài 1

Xây dựng lớp hình vuông, tính diện tích cho lớp đó. Dùng kĩ thuật thừa kế để tính thể tích cho một hình lập phương.

a, Hướng dẫn:

Bài toán gồm có 2 đối tượng: Hình vuông và hình lập phương.

Ta thấy hình lập phương là trường hợp đặc biệt của hình vuông, do vậy nó không những kế thừa các phương thức và gọi hàm thiết lập của lớp cơ sở mà nó còn thừa kế cả thuộc tính của lớp cơ sở. Thông thường thuộc tính được khai báo là Private, tức là thuộc tính riêng tư của lớp và không cho phép các lớp khác truy cập. Như vậy lớp hình lập phương muốn kế thừa được thuộc tính của lớp hình vuông thì ta phải khai báo thuộc tính trong lớp hình vuông là thuộc tính Protected.

Các thuộc tính và phương thức của hình vuông

class hinhvuong // Lớp cơ sở

{

protected float a;



public hinhvuong()

public hinhvuong(float x)

public void nhap()

public void hien()

public float dientich()

}

Các thuộc tính và phương thức của hình lập phương.



class hinhlp // Lớp dẫn xuất

{

public hinhlp()



public hinhlp(float x)

public void hien()

public float thetich()

}

a, Bài giải mẫu:




using System;

class hinhvuong

{

protected float a;



public hinhvuong()

{

a = 2;



}

public hinhvuong(float x)

{

a = x;



}

public void nhap()

{

Console.Write("Nhap canh cua hinh vuong:");



a=float.Parse(Console.ReadLine());

}

public float dientich()

{

return a*a;

}

public void hien()

{

Console.WriteLine("Thong tin can hien thi");



Console.WriteLine("Canh hinh vuong = {0}",a);

Console.WriteLine ("Dien tich cua hinh vuong= {0}",dientich());

}

}

class hinhlp :hinhvuong



{

public hinhlp(): base()

{ }


public hinhlp(float x): base(x)

{ }


public float thetich()

{

return base.dientich() * a;

}

public new void hien()

{

base.hien();

Console.WriteLine("The tich cua hinhlp={0}", thetich());

}

}



class tester

{

static void Main()

{

hinhlp B = new hinhlp ();



B.nhap();

B.hien();

Console.ReadKey();

}

}




Kết quả sau khi chạy chương trình:


Nhập cạnh của hình vuông: 5

Thông tin hiển thị

Cạnh hình vuông = 5

Diện tích hình vuông = 25

Thể tích hình lập phương = 125

Lưu ý: Nhiều khi bạn đọc không chú ý đến kiểu dẫn xuất protected. Mặc dù lớp hình lập phương có thuộc tính giống với lớp hình vuông nhưng các bạn lại cho rằng nó là thuộc tính Private không truy xuất được. Do đó lại xây dựng thuộc tính cho lớp hình lập phương điều này là không cần thiết.

Bài tập 2:

Xây dựng lớp Stack với các thuộc tính và phương thức cần thiết. Sau đó kế thừa để chuyển một số nguyên dương bất kì sang hệ đếm cơ số 2,8

a, Hướng dẫn:

Bài toán gồm có 2 đối tượng: Stack và Đổi số

Bài toán này được xây dựng nhằm củng cố thêm cho bạn đọc về cách xây dựng lớp kế thừa, và thuận tiện khi sử dụng tính kế thừa. Ta sử dụng cơ chế pop và push của Stack để chuyển đổi. Mỗi khi ta lấy số cần chuyển chia lần lượt cho hệ cần đổi thì ta lần lượt push số dư của từng phép chia vào Stack. Sau khi thực hiện chia xong thì ta pop các số dư trong Stack ra. Việc push và pop thực hiện theo cơ chế vào trước ra sau.Như vậy ta sẽ được kết quả của việc chuyển đổi.

Các thuộc tính và phương thức của lớp Stack

class Stack //Lớp cơ sở

{

private int top;



int [] s;

public stack()

public Stack(int n)

public bool full() // Kiểm tra Stack đầy

public bool empty() // Kiểm tra Stack trống

public void push(int x)

public void pop()

}

class Doiso:Stack //Lớp dẫn xuất



{

private int a,n; //a là hệ cần đổi, n là số cần đổi

public void nhap()

public void doi()

public void hien()

}

b, Bài giải mẫu:



using System;

namespace stack

{

class Stack

{

private int top;

private int []s;

public bool empty()

{

return (top == -1);

}

public bool full()

{

return (top >= s.Length);

}

public Stack ()

{

s = new int[20];



top=-1;

}

public void push(int x)

{

if(!full())

{

top=top+1;



s[top]=x;

}

else

Console.Write("Stack tran");

}

public int pop()

{

if(empty())

{

Console.Write("Stack can");



return 0;

}

else



return s[top--];

}

}



class doiso : Stack

{

private int a, n;



public void nhap()

{

Console.Write("Nhap vao so can doi:");



n = Convert.ToInt32 (Console.ReadLine());

Console.Write("Nhap vao he can doi:");

a = Convert.ToInt32(Console.ReadLine());

}

public void doi()

{

int du;

while (n != 0)

{

du = n % a;



push(dư);

n = n / a;

}

}

public void hien()



{

while (!empty())

{

Console.Write("{0}", pop());



}

}

}



class tester

{

static void Main()

{

doiso d = new doiso();



d.nhap();

d.doi();


d.hien();

Console.ReadKey();

}

}

}



Kết quả sau khi chạy chương trình:




Nhập vào số cần đổi: 8

Nhập vào hệ cần đổi: 2

Kết quả chuyển đổi: 1000



      1. Cách truy nhập của từ khóa internal và public


Ở chương lớp và đối tượng chúng ta thường truy xuất các thuộc tính và phương thức với hai từ khóa là private và public. Từ khóa internal cũng nhắc đến nhưng nó ít được sử dụng, vậy từ khóa này được dùng đế làm gì và khi nào thì cần dùng đến nó. Để làm sáng tỏ từ khóa này chúng ta đi xây dựng chương trình cài đặt dưới đây.

Trong ngôn ngữ C#, chúng ta thấy có các thư viện sẵn có như: using System, using System.text….Các thư viện này được xây dựng sẵn và chúng ta chỉ việc khai báo để sử dụng.Trên thực tế chúng ta có thể xây dựng các lớp sau đó đóng gói như các thư viện có sẵn trên. Điều này được thể hiện rõ trong phần kế thừa.



Ví dụ: Bạn có lớp cở sở A, Lớp B kế thừa các phương thức của A, Lớp C cũng có nhu cầu kế thừa và sử dụng các phương thức của A. Như vậy ở hai chương trình khác nhau, cùng là lớp A nhưng chúng ta đều phải xây dựng nó ở cả hai chương trình. Vấn đề đặt ra ở đây là bạn xây dựng một lớp cơ sở A và có thể gọi nó ra sử dụng ở bất cứ chương trình nào đó kế thừa nó mà không phải xây dựng lại lớp cơ sở đó.

Cách xây dựng một lớp và đóng gói thành thư viện

Bước 1. Vào Microsoft visual studio 2005 vào File chọn New chọn Project chọn Class Library như hình vẽ nhấn OK


Bước 2. Xây dựng lớp cơ sở A, lưu ý là lớp này không xây dựng hàm main. Lớp này có tên Class Library1.

Bước 3. Sau khi xây dựng xong bước 2, ta tiến hành đóng gói tạo thư viện.Cách đóng gói thực hiện như sau:Vào Build chọn Build Class Library1. Như vậy là bạn đã tạo ra một tệp Class Library1.dll trong debug của thư mục bin của Class Library1.

Bước 4: Đăng kí tệp Class Library1.dll như một tệp của Windown bằng cách:

- Tạo một chương trình mới vào project chọn Add Reference.... xuất hiện hộp thoại như hình sau:



Chọn đường dẫn đến tệp ClassLibrary1.dll vừa tạo sau đó nhấn OK.



Bước 5: Khai báo thư viện vừa tạo trong project chứa lớp dẫn xuất.

Ví dụ: Khai báo thư viện ClassLibrary1

using system ClassLibrary1

Sau khi khai báo xong bạn chỉ việc kế thừa lại lớp cơ sở đó bình thường.



Bài 1: Ví dụ minh họa sử dụng với từ khóa public

Xây dựng lớp Cơ sở A



using System;

public class ClassA

{

internal int x;



public ClassA()

{

x = 2;



}

public ClassA(int x)

{

this.x = x; }



public void nhap()

{

Console.Write("Nhap vao gia tri cua x=");



x = int.Parse(Console.ReadLine());

}

public void hien()

{

Console.WriteLine("Thong tin can hien thi");



Console.WriteLine("Gia tri cua x={0}", x);

}

}




Xây dựng lớp B kế thừa từ lớp cơ sở A

using System;

using ClassLibrary1;

class ClassB:ClassA

{

internal int y;



public ClassB(): base()

{

y = 5;



}

public ClassB(int x, int y): base(x)

{

this.y= y;

}

public new void nhap()

{

base.nhap();

Console.Write("Nhap gia tri cua y=");

y = int.Parse(Console.ReadLine());

}

public new void hien()

{

base.hien();

Console.WriteLine("Gia tri cua y={0}", y);

Console.WriteLine("Tong x + y = {0}", tong());

}

public int tong()

{

return x + y ; }

}

}

class tester



{

static void Main(string[] args)

{

ClassB D = new ClassB();



D.nhap();

D.hien();

Console.ReadLine();

}

}




Lưu ý: Lớp B muốn truy xuất hay kế thừa các thành viên của lớp A thì Lớp A phải xây dựng là lớp có từ khóa truy cập là public. Vì ta xây dựng chương trình trên nó là hai khối Asembly khác nhau. Bạn cũng có thể sử dụng thư viện lớp A cho bất cứ lớp dẫn xuất nào cần kế thừa nó. Nếu ta thay đổi từ khóa public của ClassA là internal thì chương trinh sẽ báo lỗi vì từ khóa internal chỉ cho phép truy xuất trong khối Assembly.

        Bài 2: Ví dụ về cách truy cập của từ khóa internal


using System;

namespace BTle

{

internal class ClassA

{

internal int x;

public ClassA()

{

x = 3;



}

public ClassA(int x)

{

this.x = x;

}

}

}



class ClassB:ClassA

{

int y;



public ClassC(): base()

{

y = 6;



}

public ClassC(int x, int y): base(x)

{

this.y = y;

}

public new void nhap()

{

base.nhap();

Console.Write("Nhap gia tri cua y=");

y = int.Parse(Console.ReadLine());

}

public new void hien()

{

base.hien();

Console.WriteLine("Gia tri cua y={0}", y);

Console.WriteLine("Tong x + y = {0}", tong());

}

public int tong()

{

return x + y ;

}

}

class tester



{

static void Main(string[] args)

{

ClassBD = new ClassB();



D.nhap();

D.hien();

Console.ReadLine();

}

}



Kết quả chương trình




Nhập vào giá trị của x=5

Nhập vào giá trị của y=4

Thông tin cần hiển thị

Giá trị của x=5

Giá trị của y=4

Tổng x+y=9





Lưu ý: Trong lập trình các bạn chỉ cần quan tâm đến cách truy nhập và đặc điểm của 3 từ khóa truy cập sau: private, public, protected. Còn lại các từ khóa khác chỉ cần tham khảo để biết về cách thức truy cập của nó.
      1. Lớp cơ sở và đối tượng thành phần


Lớp cơ sở A thường được xử lí giống như một thành phần kiểu đối tượng của lớp dẫn xuất B. Nhưng ta có thể thay việc dùng A là lớp cơ sở của B bằng cách khai báo một thành phần kiểu A trong lớp B.

Bài 1:

Xây dựng lớp Stack với các thuộc tính và phương thức cần thiết. Sau đó dùng lớp Stack đó để kiểm tra một xâu kí tự nhập vào từ bàn phím gồm các kí tự “(” và “)”.Kết quả kiểm tra: Xâu hợp lệ “((( )))”

Xâu không hợp lệ “((( ))”.

a, Hướng dẫn:

Bài toán có 2 đối tượng class stack, class KTchuoi. Bài toán này chúng ta không xây dựng kế thừa lớp Stack như bài trên mà chúng ta sẽ xây dựng trong lớp KTchuoi có một thành phần kiểu Stack. Việc xây dựng đối tượng kiểu thành phần của một lớp cũng giống như kế thừa ta có thể truy nhập được các thuộc tính và phương thức của lớp là đối tượng thành phần đó.Và để làm rõ điều này chúng ta tham khảo chương trình mẫu ở dưới.

Các phương thức và thuộc tính của lớp Stack xây dựng tương tự như bài 3

Các phương thức và thuộc tính của lớp KTchuoi

Class KTchuoi

{

Stack a=new Stack();



public bool kiemtra(string s)

}

b, Bài giải mẫu:



using System;

class stack

{

int top;



int[] p;

public stack(int n)

{

p=new int[n];



top = -1;

}

public stack()

{

p=new int[20];



top = -1;

}

public bool isempty()

{

if (top == -1)

return true;

else

return false;

}

public bool full()

{

if (top == p.Length)

return true;

else

return false;

}

public void push(int a)

{

if (full() == true)

Console.Write("stack day !");



else

p[++top] = a;

}

public int pop()

{

if (isempty()) return 0;



else return p[top--];

}

public void hien()

{

while (!isempty())

{

Console.Write("{0}",pop());



}

}

}



class KTchuoi

{

stack a = new stack();



public bool kiemtra(string s)

{

int t;



for (int i = 0; i < s.Length; i++)

{

if (s[i] == '(')

a.push(Convert.ToInt32(s[i]));

if (s[i] == ')')

if (a.isempty()) return false;

else t=a.pop();

}

if (a.isempty())



return true;

else return false;

}

}



class Tester

{

static void Main()

{

string f;



Console.Write("Ban nhap vao mot chuoi :");

f = Console.ReadLine();

KTchuoi a = new KTchuoi();

if (a.kiemtra(f) == true)

Console.Write("Chuoi hop le !");



else Console.Write("Chuoi khong hop le !");

Console.ReadKey();

}

}



Kết quả sau khi chạy chương trình:


Ban nhap vao mot chuoi: (((())

Chuoi khong hop le !


Lưu ý: Hai cách sử dụng kế thừa và khai báo là đối tượng thành phần của lớp đều giống nhau là có thể kế thừa các thuộc tính và phương thức của lớp đã có. Nhưng không phải bài toán nào cũng có thể sử dụng được cả hai cách trên, mà tuỳ theo yêu cầu mà ta có thể chọn phương pháp phù hợp.

Bài 2:

a) Cho lớp ‘HocVien’ được khai báo như sau:

class HocVien{ //lớp mô tả một học viên

private String mahv; //mã hiệu của học viên

private String hoTen; //họ tên của học viên

private int namSinh; //năm sinh của học viên

Hãy xây dựng cho lớp HocVien trên các phương thức sau:

- Phương thức tạo dựng với 2 tham số xâu và 1 tham số thực, phương thức này lần lượt lấy các giá trị truyền vào của tham số để gán cho các thuộc tính mahv, hoTen, namSinh.

- Phương thức ‘print’ để in ra màn hình thông tin của học viên theo định dạng: ‘mahv, hoTen, namSinh’.

- Phương thức ‘compare’ thực hiện so sánh hai học viên, kết quả trả về một trong các giá trị {-1, 0, 1} lần lượt tương ứng với các trường hợp: học viên thứ nhất có tuổi nhỏ, bằng, lớn hơn học viên thứ hai.

b) Cho lớp ‘DanhSach’ được khai báo như sau:

class DanhSach{ //lớp biểu diễn cho một danh sách các học viên

private HocVien ds[]; //mảng để lưu danh sách học viên

public DanhSach(int n){

//phương thức tạo dựng để khởi tạo một mảng gồm n phần tử

ds=new HocVien[n];

Hãy xây dựng cho lớp ‘DanhSach’ trên các phương thức sau:

+ Phương thức ‘printList’ để in danh sách học viên ra màn hình, mỗi học viên trên một dòng.

+ Phương thức ‘sortList’ để sắp xếp danh sách học viên theo thứ tự tăng dần của năm sinh.

a.Hướng dẫn giải

Bài toán bao gồm có 2 đối tượng là Học viên và Danh sách. Lớp Danh sách thực chất là một mảng các đối tượng học viên. Như vậy ở bài toán này chúng ta sử dụng kế thừa thì rất khó giải quyết, vì vậy ta nên xây dựng lớp Danh sách có một đối tượng thành phần là Học viên. Các thuộc tính và phương thức của hai lớp này các bạn đã thấy rất rõ ở đề bài.

b.Chương trình mẫu



using System;

class Hocvien

{

private string mshv;



private string hoten;

private int namsinh;

public Hocvien()

{

}



public void nhap()

{

Console.Write("masv:"); mshv = Console.ReadLine();



Console.Write("hoten:"); hoten = Console.ReadLine();

Console.Write("namsinh:");

namsinh = int.Parse(Console.ReadLine());

}

public void print()

{

Console.WriteLine("\t{0}\t{1}\t{2}",mshv,hoten,namsinh);



}

public int compare(Hocvien a,Hocvien b)

{

int k;



if (a.namsinh < b.namsinh)

k =-1;


else {

if (a.namsinh == b.namsinh)

k= 0;


else k = 1;

}

return k;

}

}

class Danhsach



{

private int n;

private Hocvien[] ds;

public Danhsach(int n)

{

ds = new Hocvien[n];



}

public void nhapds()

{

Console.Write("nhap so hoc vien:");



n = int.Parse(Console.ReadLine());

ds = new Hocvien[n];



for (int i = 0; i < ds.Length; i++)

ds[i] = new Hocvien();



for (int i = 0; i < n; i++)

{

Console.WriteLine(" Hoc vien thu{0}", i + 1);



ds[i].nhap();

}

}



public void printlist()

{

Console.WriteLine("Danh sach cac hoc vien la");



Console.WriteLine("\tstt\tmshv\thoten\t\tnamsinh");

(int i = 0; i < ds.Length; i++)

{

Console.Write("\t{0}", i + 1);



ds[i].print();

}

}



public void sortList()

{

for (int i = 0; i < ds.Length-1; ++i)

{

Hocvien min = ds[i];



for (int j = i+1; j < ds.Length; ++j)

{

if (min.compare(ds[i], ds[j]) == 1)

{

min = ds[i];



ds[i] = ds[j];

ds[j] = min;

}

else

{

min = ds[i];



}

}

}



for (int i = 0; i < n; i++)

ds[i].print();

}

}

class tester



{

static void Main(string[] args)

{

Danhsach d = new Danhsach(3);



d.nhapds();

d.printlist();

Console.WriteLine("Danh sach sau khi sap sep theo nam sinhla:\n");

d.sortList();

Console.ReadLine();

}

}



Kết quả sau khi chạy chương trình:




Danh sách các học viên

STT Mahv Họ tên Nămsinh

1 sv01 Nguyễn Hương Chanh 1987

2 sv02 Nguyễn Thị Lan 1984

3 sv03 Trần Thị Lương 1987

4 sv04 Phương Mai 1985

Danh sách sau khi sắp xếp

Nguyễn Thị Lan 1984

Phương Mai 1985

Nguyễn Hương Chanh 1987

Trần Thị Lương 1987






    1. Поделитесь с Вашими друзьями:
1   ...   18   19   20   21   22   23   24   25   ...   28


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©tieuluan.info 2019
được sử dụng cho việc quản lý

    Quê hương