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


BÀI TẬP MẪU BÀI TẬP TRẮC NGHIỆM, LÝ THUYẾT



tải về 1.36 Mb.
trang16/28
Chuyển đổi dữ liệu21.12.2018
Kích1.36 Mb.
1   ...   12   13   14   15   16   17   18   19   ...   28

BÀI TẬP MẪU

    1. BÀI TẬP TRẮC NGHIỆM, LÝ THUYẾT


Câu 1: Phương thức thay thế:

Nếu ta không xây dựng phương thức thay thế cho các toán tử được nạp chồng thì chương trình có biên dịch hay không.



Trả lời:

Nếu ta không xây dựng phương thức cho toán tử được nạp chồng thì

- Chương trình sẽ biên dịch nếu trong ngôn ngữ C# và các ngôn ngữ cho phép chồng toán tử.

- Chương trình sẽ không biên dịch nếu nó sử dụng trong ngôn ngữ lập trình khác không cho phép sử dụng chồng toán tử.

Bởi vì: Các phương thức có chức năng tương tự như toán tử đã chồng có tác dụng thay thế hàm toán tử khi sử dụng tất cả các ngôn ngữ không nên trong ngôn ngữ không cho phép sử dụng hàm toán tử thì vẫn sử dụng được với các toán tử thông qua các phương thức.

Câu 2: Hạn chế khi sử dụng toán tử:

Xây dựng một lớp Employee với các thông tin cán bộ: Họ tên, giới tính, tiền lương, quê quán. Vậy để gọi một phương thức gia tăng mức lương của nhân viên ta có thể sử dụng toán tử gia tăng (++) trong lớp Employee hay không.



Trả lời:

Ta không thể sử dụng toán tử gia tăng (++) để gia tăng mức lương của cán bộ. Bởi vì bên trong của lớp Employee còn có nhiều thuộc tính khác như họ tên, giới tính…Nên ta không sử dụng toán tử gia tăng duy nhất một thuộc tính lương được .



Câu 3: Chuyển đổi kiểu

Cho các dòng lệnh sau:

Int a = 3;

Uint b = 5;

Double c= 9;

Long x = a + b;

Double y =c + a;

Hãy giải thích khi trình biên dịch gặp một toán hạng.



Trả lời:

- Xét dòng lệnh : x = a + b;

Có nghĩa là cộng hai số có kiểu integer (a và b). Bình thường kết quả trả ra sẽ là kiểu Integer nhưng chương trình sẽ ép cho nó trả ra kết quả là kiểu long và điều này trong ngôn ngữ C# cho phép.

- Xét dòng lệnh : y = c + a;

Ta thấy trong nạp chồng này có kiểu double và kiểu Integer, cộng chúng lại và trả ra kiểu double. Vậy chúng ta phải đổi a(có giá trị kiểu int) sang kiểu double sau đó mới cộng với c(double)

Như vậy việc nạp chồng toán tử ở đây như một phiên bản của toán tử nhận hai số double như hai tham số và trình biên dịch phải chắc chắn rằng nó có thể ép kiểu kết quả về một kiểu thích hợp nếu cần.



Câu 4: Cho đọan chương trình sau:

Int myInt = 12;

Long myLong;

mylong = myInt; (1) //Ngầm định

myInt = (Int)myLong; (2) // Tường minh

Bạn hãy chọn ra một phương án đúng nhất trong các phương án sau:

a, Cách chuyển đổi (1) đúng.

b, Cách cuyển đổi (2) đúng.

c, Cả hai cách đều đúng.

d,Cả hai cách đều đúng nhưng ta phải xây dựng thêm các hàm chuyển đổi.

e, Chỉ có phương án (1) là sai vì nó gây mất thông tin.

Trả lời: Phương án (d) là đúng nhất.

Giải thích :

- Giả sử khi ta chuyển đổi một số nguyên sang một phân số thì có thể chuyển đổi số nguyên đó có mẫu là 1.

Ví dụ: a = 12 được chuyển thành 12/1

- Ngược lại khi chuyển đổi một phân số sang một số nguyên thì sẽ làm mất thông tin (vd: 9/4 = 2). Vì vậy ta phải xây dựng một hàm chuyển đổi có sử dụng từ ngữ ngầm định (implicit) để đảm bảo không bị mất thông tin.

Trường hợp tường minh (explicit) không đảm bảo an toàn dữ liệu sau khi chuyển đổi do đó việc này sẽ được thực hiện một cách công khai.

Câu 5: Toán tử ()

Cho đoạn chương trình sau:

Using System

{

Struct point



{

Public int x,y;

}

Class main class



{

Unsafe static void main

Point pt =new point()

Point *pp = &pt;

pp  x =123;

pp y=456;

Console.WriteLine(“{0} {1}”,pt.x, pt.y);

}

}



Output 12345 (1)

123 456 (2)

123 (3)

Hãy chọn một kết qủa đúng nhất



Trả lời:

Đáp án (2) là đúng.



Câu 6: Hãy chỉ ra cách khai báo đúng một hàm chồng toán tử của lớp phân số trong các cách khai báo sau đây:

public static ps operator -(real ps1) (1)

public static ps operator =(real ps1) (2)

public static ps operator = =(ps ps1, ps ps2) (3)

public static ps operator - -(ps ps1,ps ps2) (4)

Trả lời:

Ta biết rằng các toán tử được định nghĩa chồng phải bảo toàn số ngôi của chính toán tử đó theo cách hiểu thông thường.

Cụ thể:

+ Nếu ta chồng toán tử một ngôi “-(real ps1) “tương ứng với việc đảo dấu của ps1

+ Nếu ta chồng toán tử hai ngôi“-(ps ps1, ps ps2) tương ứng với việc ta thực hiên chông toán tử trừ đối với ps1 và ps.

Nhưng không thể định nghĩa toán tử gán như (+=, = =,- =,=…) bằng cách chồng toán tử một ngôi. Điều đó chứng tỏ cách khai báo (2) là sai.

Vậy trong các dòng khai báo ở bài tập này có dòng (1), (2), (3) là đúng

    1. CÂU HỎI LÝ THUYẾT VÀ BÀI TẬP MẪU

    1. Chồng toán tử (+) đối với hai vector

      a, Hướng dẫn:


- Xây dựng một vector có ba đối là x, y, z (kiểu double).

- Để sử dụng trong lớp vector nên ta khai báo bằng thuộc tính public. Vì sử dụng thuộc tính public có phạm vi hoạt động trong toàn bộ chương trình.

Public x,y,z;

- Sử dụng từ khoá this được dùng để tham chiếu đến thể hiện hiện hành của một đối tượng xem là con trỏ dùng để tham chiếu đến tất cả các phương thức không có thuộc tính tĩnh trong lớp vector. Các phương thức khác trong lớp có thể tham chiếu đến những phương thức khác và các biến thành viên thông qua từ khóa this.

- Sử dụng chồng toán tử (+) để cộng hai vector

Vậy chương trình được tóm tắt như sau:

Struct vector

{

public double x,y,z; // biến thành viên truy cập public



public vector(double x,double y, double z )

{

// Dùng từ khóa this để tạo đối tượng cho một vector



}

public vector(vector rhs)

{

}

public override string ToString()



{

// Dùng hàm ToString để chuyển sang xâu

}

public static vector operator + (vector lhs, vector rhs)



{

// Dùng chồng toán tử cộng để cộng hai vector

// lhs là vector bên trái.

// rhs là vector bên phải.

}

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



using System;

namespace vt

{

struct Vector

{

public double x, y, z;

public Vector(double x, double y, double z)

{

this.x = x;



this.y = y;

this.z = z;

}

public Vector(Vector rhs)

{

x = rhs.x;



y = rhs.y;

z = rhs.z;

}

public override string ToString()

{

return "( " + x + " , " + y + " , " + z + " )";

}

public static Vector operator * (Vector lhs,Vector rhs)

{

Vector result = new Vector(lhs);

result.x *= rhs.x;

result.y *= rhs.y;

result.z *= rhs.z;

return result;

}

public static Vector operator +(Vector lhs, Vector rhs)

{

Vector result = new Vector(lhs);

result.x += rhs.x;

result.y += rhs.y;

result.z += rhs.z;



return result;

}

}



public class tester

{

static void Main()

{

Vector vect1, vect2, vect3, vect4;

vect1 = new Vector(3.0, 3.0, 1.0);

vect2 = new Vector(2.0, -4.0, -4.0);

vect3 = vect1 + vect2;

vect4 = vect1 + vect2;

Console.WriteLine("vect1 = " + vect1.ToString());

Console.WriteLine("vect2 = " + vect2.ToString());

Console.WriteLine("Tong cua vector1 và vector2 la:");

Console.WriteLine("vect3 = " + vect3.ToString());

Console.WriteLine("Tich cua vector1 và vector2 la:");

Console.WriteLine("vect4 = " + vect3.ToString());

Console.ReadLine();

}

}



}

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




vect1 = ( 5, 10, 4)

vect2 = ( 3, 6, 9)

Tong cua vector1 và vector2 la:

vect3 = ( 8, 16, 13)

Tich cua vector1 và vector2 la:

Vect4 = ( 15, 16, 36)




Nhận xét:

Từ chương trình trên ta cần chú ý đến việc xây dựng một biến rhs có kiểu là một vector bởi vì để cộng 2 hay nhiều vector thì ta phải cộng hai vector trước sau đó lại cộng tiếp với một vector sau (đóng vai trò là rhs), cứ như thế đến khi nào hết.

Từ bài toán cộng hai vector này, tương tự ta có thể xây dựng một chương trình cộng nhiều vector với nhau.




    1. Поделитесь с Вашими друзьями:
1   ...   12   13   14   15   16   17   18   19   ...   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