Tải bản đầy đủ (.pdf) (81 trang)

Lap trinh huong doi tuong OOP

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.3 MB, 81 trang )

Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Hướng dẫn học môn
Nguyên lý lập trình 2 và Thực hành nguyên lý lập trình 2
Đánh giá:
9
9
9
9

Thi máy giữa kì(30% điểm) cho môn nguyên lý lập trình 2.
Thi viết cuối kì(70% điểm) cho môn nguyên lý lập trình 2.
Thi máy cuối kì(100% điểm) cho môn thực hành nguyên lý lập trình 2.
Có thêm các bài kiểm tra trong quá trình thực hành và cộng điểm vào bài thi giữa kì hoặc
cuối kì.

Tài liệu tham khảo

9 Bài giảng môn nguyên lý lập trình 2.
9 Download eBook “Wrox Press - Professional C#, 3rd Edition.pdf ” tại đường dẫn sau

\\192.168.6.1\cisco\Downloads.
9 MSDN-Microsoft Development Networks
9 Website: .
9 Một số sourcecode mẫu được cung cấp trong quá trình học.

Thực hành
9 Bao gồm 5 bài lab.
9 Download bài lab tại địa chỉ http://192.168.6.1/NLLT2/labX.htm. Trong đó X là thứ tự bài
lab.
9 Ngôn ngữ minh họa cho lập trình hướng đối tượng: C#(C Sharp).



Môi trường thực hành
9 Visual Studio 2003 hoặc 2005.

Trang 1


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

PHẦN 1: NGÔN NGỮ C#
1. C# và .Net
1.1 Nền tảng .Net
Khung .Net là một nền tảng phát triển ứng dụng mới cung cấp bộ giao tiếp lập trình ứng
dụng cho các dịch vụ và các lớp API của hệ điều hành Windows. Chúng hỗ trợ COM+, phát triển
ứng dụng Web, XML, thiết kế hướng đối tượng và hỗ trợ các giao thức dịch vụ Web mới như
SOAP, WSDL, UDDI.
1.2 Khung .Net
.Net không chỉ hỗ trợ độc lập ngôn ngữ mà còn tích hợp nhiều ngữ nghĩa khác nhau. Điều
này cho phép chúng ta có thể thực hiện kế thừa từ lớp, xử lý biệt lệ và tính năng đa hình theo
nhiều ngữ nghĩa khác nhau. .Net một cung một đặc tả gọi là Common System Type(CTS) mà tất
cả các thành phần .Net phải tuân theo. CTS hỗ trợ các khái niệm tổng quát của lớp, giao tiếp, (ủy
nhiệm)delegate, kiểu tham chiếu và kiểu giá trị.
Ngoài ra, .Net còn cung cấp một Common Language Specification (CLS) cung cấp các
luật cơ bản để đáp ứng yêu cầu tích hợp ngôn ngữ giữa các ngôn ngữ lập trình và hệ thống khác
nhau. Hình sau biểu diễn cấu trúc của .Net

Hình 1.1: Kiến trúc khung .Net.
1.3 Biên dịch
Điểm tập trung của nền tảng .Net là môi trường thực hiện việc thực thi ứng dụng gọi là
CLR(Commong Language Runtime-CLR)

Trong .Net chương trình không biên dịch thành tập tin thực thi, chúng được biên dịch theo
hai bước:
Trang 2


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

9 Biên dịch mã nguồn thành IL(Intermediate Language).
9 Dùng CLR để biên dịch IL thành mã máy theo từng nền tảng thích hợp.
Việc thực hiện như trên cung cấp nhiều thuận lợi cho .Net như:
9 Độc lập nền tản và phần cứng
9 Nâng cao hiệu suất
9 Giúp cho các ngôn ngữ phát triển trên các ngôn ngữ lập trình khác nhau có thể tương tác
với nhau.
Một số đặc trưng quan trọng của IL:
9 Hướng đối tượng và sử dụng interface
9 Phân biệt rõ ràng giữa kiểu tham biến và tham trị.
9 Hổ trợ nhiều kiểu dữ liệu khác nhau
9 Quản lý lỗi thông qua xử lý biệt lệ
Các kiểu trong .Net

1.4 Ngôn ngữ C#
Ngôn ngữ C# hỗ trợ cấu trúc, dựa trên thành phần, OOP và các khái niệm trong các ngôn
ngữ lập trình hiện đại. Đặc trưng và khái niệm quan trọng nhất của OOP là hỗ trợ định nghĩa và
làm việc với lớp. Lớp định nghĩa các kiểu mới cho phép chúng ta mở rộng ngôn ngữ theo những
mô hình tốt hơn nhằm giải quyết vấn đề chúng ta đang gặp phải.

Trang 3



Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Assembly là một tập các tập tin cung các thư viện liên kết động cho người dùng.
Trong .Net, assembly là một đơn vị cơ bản cho việc tái sử dụng mã, bảo mật, phát triển và xác
định phiên bản.
Hỗ trợ truy xuất bộ nhớ trực tiếp tương tự như khái niệm con trỏ trong c++.
2. Tạo ứng dụng trong C#
Đầ tiên chúng ta viêt một chương trình ứng dụng “Hello World” đơn giản sử dụng C#:
class HelloWorld
{
static void Main( )
{
System.Console.WriteLine("Chuong Trinh Dau Tien");
System.Console.Readline();
}
}
2.1 Lớp, đối tượng và kiểu
Điều cần thiết trong ngôn ngữ lập trình hướng đối tượng là tạo các kiểu dữ liệu mới. Các
kiểu biểu diễn cho một cái gì đó có thể là trừu tượng(bảng dữ liệu, luồng) hay rõ ràng(cửa sổ, nút
lệnh). Một kiểu định nghĩa các đặc trưng và hành vi cho một cái gì đó. Tương tự các ngôn ngữ
lập trình hướng đối tượng khác, trong C# một kiểu được gọi là một lớp(Class). Trong khi các thể
hiện của các cá thể gọi là đối tượng(object).
Chưong trình trên khai báo một kiểu đơn giản: lớp HelloWorld sử dụng từ khóa class và
tên “HelloWorld” .Sau đó là định nghĩa thuộc tính và hành vi của lớp. Định nghĩa thuộc tính và
hành vi của một lớp trong C# phải được bao bởi {}.
2.1.1 Phương thức
Mỗi lớp có thuộc tính và hành vi. Hành vi được định nghĩa là phương thức thành viên của
lớp. Một phương thức là một hàm sở hữu bởi lớp mà chúng ta định nghĩa. Thỉnh thoảng người ta
gọi phương thức thành viên là hàm thành viên. Hàm thành viên định nghĩa những gì lớp của
chúng ta có thể làm và hành vi của nó như thế nào? Thông thường một phương thức là một tên

của hành động ví dụ WriteLine. Tuy nhiên chúng cũng có thể là các tên đặc biệt như Main().
Khai báo phương thức là một liên lạc giữa người tạo và sử dụng phương thức. Để khai báo
một phương thức chúng ta cần chỉ ra kiểu giá trị trả về theo sau bởi tên. Một phương thức có thể
Trang 4


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

có tham số hay khônng. Ví dụ sau là một hàm với một tham số kiểu nguyên và phương thức trả
về một giá trị kiểu nguyên.
int TinhTong(int n);
Nếu hàm không trả về giá trị nó sẽ trả về kiểu void
void HienThi( );
2.1.2 Chú thích
Chú thích sử dụng trong C# tương tự như trong C++. Dùng // chú thích cho dòng và /* */
cho một đoạn. Ví dụ sau minh họa sử dụng chú thích trong C#.
class Hello
{
static void Main( )
{
/* Chương trình hiển thị một chuỗi ra màn hình */
System.Console.WriteLine("Chuong Trinh Dau Tien");
}
}

2.1.3 Ứng dụng dòng lệnh (Console)
Ứng dụng dòng lệnh là ứng dụng không có giao diện người dùng. Việc xuất nhập thông
qua dòng lệnh chuẩn. Phương thức Main() trong ví dụ “Hello World” viết chuỗi “Chuong Trinh
Dau Tien” lên màn hình. Màn hình được quản lý bởi một đối tượng tên Console. Đối tượng này
có một phương thức WriteLine(), nhận một chuỗi và ghi chúng ra thiết bị xuất chuẩn(màn hình).

2.1.4 Không gian tên
Console là một phần của FCL. Mỗi lớp có một tên và do đó FCL chứa hàng ngàn tên như
ArrayList, HashTable… C# cung cấp một không gian tên cho việc quản lý các tên này. Trong ví
dụ trên đối tượng Console chỉ hạn chế trong không gian tên System được sử dụng theo đoạn mã
sau:
System.Console.WriteLine();

Trang 5


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

2.1.5 Toán tử “.”
Trong ví dụ trên toán tử “.”được sử dụng để truy cập phương thức và dữ liệu trong
lớp(phương thức WriteLine()) và hạn chế tên lớp trong một không gian tên đặc biệt( vị trí
Console trong không gian tên System).
Trong nhiều trường hợp, không gian tên được chia thành các không gian con. Ví dụ không
gian tên System chứa một số các không gian tên con như Configuration, Collections...trong khi
không gian tên Collections lại chứa các không gian tên con khác.
2.1.6 Từ khóa using
Trong ví dụ 2-1 chúng ta sử dụng từ System trước Console chúng ta có thể dùng từ khóa
using để chỉ ta chúng ta sẽ sử dụng các kiểu trong không gian tên System bằng cách ghi:
using System.
Ví dụ sử dụng từ khoá using như sau
using System;
class Hello
{
static void Main( )
{
Console.WriteLine("Chuong Trinh dau Tien");

}
}

2.1.7 Quy ước đặt tên
C# phân biệt chữ hoa và chữ thường. Nghĩa là khi chúng ta viết WriteLine() thí khác
writeLine(). Do đó chúng ta cần có quy ước cách đặt tên biến, hằng, hàm..
2.1.8 Từ khóa static
Phương thức Main() chỉ ra trong ví dụ 2-1 có nhiều chức năng khác. Trước từ khóa void
chúng ta thấy từ khóa static.
static void Main()

Từ khóa static chỉ ra rằng chúng ta có thể gọi Main() mà không cần tạo đối tượng kiểu
Hello. Chúng ta sử dụng từ khóa này khi muốn gọi một phương thức trong lớp mà không cần tạo
đối tượng.

Trang 6


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

2.2 Cách chạy chương trình “Hello world”
Để thực hiện được chương trình chúng ta sử dụng Visual Studio .Net Intergated
Development Environment (IDE) trong công cụ Visual Studio.Net. IDE cung cấp những công cụ
rất mạnh cho việc dò lỗi và công cụ hỗ trợ khác.
2.2.1 Soạn thảo chương trình “Hello Wolrd”


Chạy chương trình IDE. Chọn Visual Studio .Net từ thực đơn Start




Chọn FileÆNewÆProject. Chọn kiểu dự án là Visual C# Project và dạng Console
Application như trong hình 2-1. Chúng ta có thể nhập vào tên dự án và đường dẫn để lưu
trữ dự án. Sau khi chọn nút OK, một cửa sổ mới sẽ xuất hiện như hình 2.2
Hình 2-1:Tạo ứng dụng dòng lệnh trong Visual Studio.Net

Hình 2.2: Cửa sổ soạn thảo cho một dự án mới


Sau đó đưa lệnh sau vào trong hàm Main()
System.Console.WriteLine("Chuong Trinh Dau Tien");

Trang 7


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

2.2.2 Biên dịch và chạy chương trình “Hello Wolrd”
Có nhiều cách để biên dịch và chạy chương trình trong Visual Studio .Net


Chọn Ctl+Shift+B hay BuildÆbuild từ thực đơn



Chọn nút Build như trong hình 2-3
Hình 2-3: Nút build

Để chạy chương trình mà không thực hiện dò lỗi:



Nhấn Ctrl + F5 hay DebugÆStart Without Debugging từ thực đơn.



Chọn nút Start Without Debugging như trong hình 2-4
Hình 2-4: Nút Start Without Debugging

2.3 Sử dụng công cụ dò lỗi của Visual Studio .Net
3 kỹ năng quan trọng khi dò lỗi:


Bằng cách nào đặt các điểm dừng(breakpoint) và chạy các điểm dùng như thế nào?



Bằng cách nào chạy từng bước qua các lời gọi phương thức.



Bằng cách nào kiểm tra và thay đổi giá trị của biến, dữ liệu thành viên của lớp..
Trang 8


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Dò lỗi có thể được thực hiện theo nhiều cách. Thông thường qua thực đơn. Đơn giản nhất
là đặt điểm dùng bên thước trái. Ví dụ trong hình 2-5
Hình 2-5: Một điểm dừng


Để chạy Debug chúng ta có thể nhấn F5 và sau đó chương trình sẽ chạy đến điểm dừng như trong
hình 2.6
Hình 2-6: Chọn điểm dừng

Bằng cách đặt con chuột vào vị trí các biến chúng ta có thể thấy được giá trị hiện tại của biến như
trong hình 2-7.
Hình 2-7: Hiển thị một giá trị

Trình dò lỗi của Visual Studio .Net cũng cung cấp một số các cửa sổ hữu dụng khác để dó lỗi
như là cửa sổ Local để dò các biến cục bộ như trong hình 2.8
Hình 2-8: Cửa sổ Local

Chúng ta có thể mở rộng cửa sổ để xem chi tiết thông tin biến như trong hình 2-9
Hình 2-9: Mở rộng cửa sổ Local

Trang 9


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Chúng ta có thể lặp qua các phương thức bằng các nhấn F11. Ví dụ lặp qua phương thức
DrawWindow() của lớp WindowClass như trong hình 2-10
Hình 2-10: Lặp qua một phương thức

3. Cơ sở của ngôn ngữ C#
3.1 Kiểu
C# bắt buộc chúng ta phải khai báo kiểu cho kiểu đối tượng chúng ta tạo như (nguyên,
thực, chuỗi, cửa sổ, nút lệnh). Trong c# có 2 kiểu:



Kiểu xây dựng sẵn



Kiểu người dùng tạo ra

C# cũng chia kiều thành 2 loại:


Kiểu giá trị



Kiểu tham chiếu
Trang 10


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Khác nhau giữa hai kiểu trên chính là các thức giá trị của chúng được lưu trữ trong bộ nhớ.
Kiểu giá trị lưu trữ giá trị thật sự của nó trong bộ nhớ được cấp phát trên stack. Trong khi địa chỉ
của kiểu tham chiếu lưu trữ trên stack thì đối tượng thật sự lại lưu trữ trong heap.
C# cũng hỗ trợ kiểu con trỏ như trong c++.
3.1.1 Làm việc với kiểu xây dựng sẵn
Bảng 3-1: Các kiểu giá trị xây dựng sẵn trong C#
Kiểu

Kích

Kiểu .Net


Mô tả

byte

1

Byte

Không dấu 0-255

char

1

Char

Ký tự unicode

bool

1

Boolean

True hay false

sbyte

1


Sbyte

Có dấu(-128-127)

short

2

Int16

Có dấu -32.768 – 32.767

ushort

2

Uint16

Int

4

Int32

uint

4

Uint32


Có dấu -2,147,483,647 Æ
2,147,483,647.
Không dấu 0 Æ 4,294,967,295.

float

4

Single

+/-1.5 * 10--45 Æ +/-3.4 * 1038

double

8

Double

+/-5.0 * 10-324 Æ +/-1.7 * 10308

Decimal

8

Decimal

Lên đến 28 chũ số.

Long


8

Int64

Ulong

8

Uint64

Không dấu (0-65353)

-9,223,372,036,854,775,808
Æ9,223,372,036,854,775,807
0 đến 0xffffffffffffffff.

3.1.1.1 Chọn kiểu xây dựng sẵn
Kiểu char được biểu diễn trong dạng Unicode. Unicode và ký tự escape phải được gắn với
dấu “”. Ví dụ, A là một ký tự đơn giản trong khi \u00041 là một ký tự unicode.

Trang 11


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Bảng 3-2: Một số ký tự phổ

biến
3.1.1.2 Chuyển kiểu xây dựng sẵn

Đối tượng của một kiểu có thể được chuyển thành một đối tượng khác theo cách tường
minh hay không tường minh. Chuyển kiểu tường minh sẽ thực hiện chuyển tự động và trình biên
dịch sẽ quản lý giùm chúng ta. Ví dụ:
short x = 5;
int y = x;

Nếu chúng ta chuyển theo một các khác chúng ta có thể mất thông tin. Trình biên dịch sẽ
không thực hiện chuyển kiểu rõ ràng từ kiểu short sang int. Ví dụ:
short x;
int y = 500;
x = y;

Chúng ta phải khai báo rõ ràng:
short x;
int y = 500;
x = (short)y;

3.2 Biến và hằng
Một biến là một vị trí lưu trữ với một kiểu. Trong ví dụ trên, cả x và y là biến. Chúng ta
tạo biến bằng cách khai báo kiểu và gán tên cho nó. Chúng ta có thể khởi tạo biến khi chúng ta
khao báo nó. Chúng ta có thể gán giá trị đến biến bất cứ lúc nào. Ví dụ minh họa:
class Values
{
static void Main( )
{
int myInt = 7;
System.Console.WriteLine("Khởi tạo, myInt: {0}",myInt);
myInt = 5;
System.Console.WriteLine("Sau khi gán, myInt: {0}",
myInt);

}

Trang 12


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
}

3.2.1 Định nghĩa gán
C# yêu cầu biến được khởi tạo trước khi chúng được sử dụng. Ví dụ sau sử dụng một biến
không được khởi gán:
class Values
{
static void Main( )
{
int myInt;
System.Console.WriteLine("Không khởi gán, myInt: {0}",myInt);
myInt = 5;
System.Console.WriteLine("Khởi gán, myInt: {0}", myInt);
}
}
Khi chạy chương trình sẽ thông báo lỗi sau:

Thật sự chúng ta không cần khởi tạo một biến nhưng chúng ta cần gán một giá trị trước khi sử
dụng chúng. Ví dụ sau minh họa một chương trình đúng
class Values
{
static void Main( )
{
int myInt;

myInt = 7;
System.Console.WriteLine("Khởi gán, myInt: {0}", myInt);
myInt = 5;
System.Console.WriteLine("Giá trị sau khi gán, myInt: {0}", myInt);
}
}

3.2.2 Hằng
Môt hằng là một biến mà giá trị không bị thay đổi.
Cú pháp: Const kiểu tên_biến giá trị.
Ví dụ: const int Tile = 10;
Ví dụ minh họa sử dụng biến hằng
class Values
{
static void Main( )
{
const int NhietDoDongLanh = 32; // độ Farenheit
const int NhietDoSoi = 212;
System.Console.WriteLine(" Nhiệt độ đông lạnh của nước: {0}",
NhietDoDongLanh );

Trang 13


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
System.Console.WriteLine("Nhiệt độ sôi của nước: {0}",
NhietDoSoi);
}
}


3.2.3 Kiểu liệt kê
Kiểu này bổ sung những tính năng mới thuận tiện hơn kiểu hằng. Kiểu liệt kê là một kiểu
giá trị phân biệt bao gồm một tập các tên hằng. Ví dụ chúng ta tạo 2 hằng liên quan nhau
const int NhietDoDongLanh = 32; // độ Farenheit
const int NhietDoSoi = 212;

Chúng ta có thể bổ sung một số hằng khác vào trong danh sách như:
const int NhietDoCoTheBoi= 72; // độ Farenheit

Quá trình này thực hiện rất cồng kềnh. Do đó, chúng ta có thể dùng danh sách liệt kê để
giải quyết vấn đề:
enum NhietDo
{
NhietDoDongLanh = 32;
NhietDoSoi = 212;
NhietDoCoTheBoi= 72;
}

Mỗi kiểu liệt kê phải có một kiểu bên dưới, chúng có thể là(int, short, long..) ngoại trừ
kiểu char. Cú pháp

Ví dụ sau minh họa dùng kiểu enum để định nghĩa một thực đơn cho chương trinh
enum Menu
{
Thoat=5,
VeTamGiac,
VeTamGiacLatNguoc,
VeTamGiacGiuaManHinh,
VeTamGiacRong
};

static void ThucDon()
{
while(true)
{
int menu=0;
Console.WriteLine("Nhap {0} de ve tam giac",(int)Menu.VeTamGiac);
Console.WriteLine("Nhap {0} de ve tam giac giua man
hinh",(int)Menu.VeTamGiacGiuaManHinh);
Console.WriteLine("Nhap {0} de ve tam giac lat nguoc ",(int)Menu.VeTamGiacLatNguoc);
Console.WriteLine("Nhap {0} de ve tam giac rong ",(int)Menu.VeTamGiacRong);
Console.WriteLine("Nhap {0} de thoat ",(int)Menu.Thoat);
menu = int.Parse(Console.ReadLine());

Trang 14


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
switch (menu)
{
case (int)Menu.VeTamGiac:
VeTamGiac();
break;
case (int)Menu.VeTamGiacGiuaManHinh:
VeTamGiacGiuaManHinh();
break;
case (int)Menu.VeTamGiacLatNguoc:
VeTamGiacLatNguoc();
break;
case (int)Menu.VeTamGiacRong:
VeTamGiacRong();

break;
default:
return;
}
}
}

3.2.4 Kiểu chuỗi
Đối tượng string lưu trữ một chuỗi các ký tự. Khi chúng ta khai báo một biến chuỗi sử
dụng từ khóa string chúng ta phải tạo một thể hiện của chuỗi:
string myString;

sau đó gán giá trị cho biến myString.
hay dùng khai báo sau:
string myString = “Chuong trinh dau tien”;

3.3 Lệnh rẽ nhánh
3.3.1 lệnh if … else
Cú pháp :
if ( biểu thức)
lệnh 1
else
lệnh 2
Ví dụ minh họa lệnh rẽ nhánh
using System;
class Values
{
static void Main( )
{
int valueOne = 10;

int valueTwo = 20;
if ( valueOne > valueTwo )
{

Trang 15


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
Console.WriteLine(
"Giá trị một: {0} lớn hơn giá trị hai: {1}",
valueOne, valueTwo);
}
else
{
Console.WriteLine(
"Giá trị hai: {0} lớn hơn giá trị một: {1}",
valueTwo,valueOne);
}
valueOne = 30; //gán lại giá trị mới
if ( valueOne > valueTwo )
{
valueTwo = valueOne++;
Console.WriteLine("\nGán giá trị một cho giá trị hai, ");
Console.WriteLine("và tăng giá trị một lên hai.\n");
Console.WriteLine("Giá trị một: {0} , Giá trị hai: {1}",
valueOne, valueTwo);
}
else
{
valueOne = valueTwo;

Console.WriteLine("Gán hai giá trị bằng nhau và bằng giá trị hai. ");
Console.WriteLine("Giá trị một: {0} giá trị hai: {1}",
valueOne, valueTwo);
}
}
}

3.3.2 Lệnh switch (một thay đổi của lệnh if lồng nhau)
Cú pháp:
switch (expression)
{
case constant-expression:
statement
jump-statement
[default: statement]
}
Ví dụ:
class Values
{
static void Main( )
{
int chonThucDon;
chonThucDon = 2;
switch (chonThucDon)
{
case 1:
System.Console.WriteLine(" Chọn món 1");
break;
case 2:


Trang 16


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
System.Console.WriteLine(" Chọn món 1");
break;
default:
System.Console.WriteLine(" Phải chọn món có trong thực đơn 1");
break;
}
}
}

3.4 Lệnh lặp
3.4.1 Lệnh goto
Để sử dụng lệnh goto chúng ta cần:


Tạo nhãn



Goto trên nhãn

Ví dụ minh họa sử dụng lệnh goto
using System;
public class Tester
{
public static int Main( )
{

int i = 0;
repeat: // gán nhãn cho lệnh goto
Console.WriteLine("i: {0}",i);
i++;
if (i < 10)
goto repeat;
return 0;
}
}

3.4.2 Lệnh lặp while
Cú pháp: while (biểu thức) lệnh;
Ví dụ dùng lệnh while
using System;
public class Tester
{
public static int Main( )
{
int i = 0;
while (i < 10)
{
Console.WriteLine("i: {0}",i);
i++;
}
return 0;
}
}

3.4.3 Lệnh do…while
Trang 17



Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Cú pháp: do biểu_thức while lệnh.
using System;
public class Tester
{
public static int Main( )
{
int i = 11;
do
{
Console.WriteLine("i: {0}",i);
i++;
} while (i < 10);
return 0;
}
}

3.4.4 Lệnh for
Cú pháp: for (khởi tạo; biểu_thức; lặp) lệnh;
Ví dụ:
using System;
public class Tester
{
public static int Main( )
{
for (int i=0;i<100;i++)
{

Console.Ghi("{0} ", i);
if (i%10 == 0)
{
Console.WriteLine("\t{0}", i);
}
}
return 0;
}
}

3.4.5 Lệnh continue và break
Thỉnh thoảng chúng ta muốm quay lại vòng lặp mà không cần thực hiện các lệnh còn lại
trong vòng lặp, chúng ta có thể dùng lệnh continue.
Ngược lại, nếu chúng ta muốn thoát ra khỏi vòng lặp ngay lập tức chúng ta có thể dùng
lệnh break;
Ví dụ:
using System;
public class Tester
{
public static int Main( )
{
string signal = "0";

Trang 18


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
while (signal != "X")
{
Console.Ghi("Nhập vào tín hiệu: ");

signal = Console.ReadLine( );
Console.WriteLine("Tính hiệu vừa nhập: {0}", signal);
if (signal == "A")
{
Console.WriteLine("Lỗi, bỏ qua\n");
break;
}
if (signal == "0")
{
Console.WriteLine("Bình thường.\n");
continue;
}
Console.WriteLine("{0}Tạo tín hiệu tiếp tục !\n",signal);
}
return 0;
}
}

3.5 Toán tử
Một toán tử là một ký hiệu mà nguyên nhân làm C# thực hiện một hành động. Các kiểu cơ bản
trong C# hỗ trợ các toán tử như gán, cộng, trừ, tăng, giảm. Các toán tử này tương tự như c++;
3.6 Không gian tên
Để khai báo không gian tên chúng ta sử dụng từ khóa namespace. Ví dụ:
namespace Programming_C_Sharp
{
using System;
public class Tester
{
public static int Main( )
{

for (int i=0;i<10;i++)
{
Console.WriteLine("i: {0}",i);
}
return 0;
}
}
}

Ví dụ sau khai báo không gian tên lồng nhau:
namespace LapTrinh_C_Sharp
{
namespace LapTrinh _C_Sharp_Test
{
using System;
public class Tester
{
public static int Main( )

Trang 19


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
{
for (int i=0;i<10;i++)
{
Console.WriteLine("i: {0}",i);
}
return 0;
}

}
}
}

Trang 20


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Phần 2: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
1. Lớp và đối tượng
Khả năng tạo các kiểu dữ liệu mới là đặc trưng của ngôn ngữ lập trình hướng đối tượng.
Chúng ta có thể tạo ra kiểu mới bằng cách khai báo và định nghĩa lớp. Thể hiện của một lớp gọi
là một đối tượng. Đối tượng được tạo trong bộ nhớ khi chương thực thi.
Một thuận lợi lớn nhất của các lớp trong ngôn ngữ lập trình hướng đối tượng là chúng có
khả năng đóng gói các đặc trưng và khả năng của một thực thể trong một đơn vị mã chương trình.
1.1 Định nghĩa lớp (class)
Để định nghĩa một kiểu mới hay một lớp chúng ta đầu tiên khai báo nó và sau đó định
nghĩa các phương thức và trường của nó. Chúng ta khai báo lớp sử dụng từ khóa class.
Cú pháp:
[attributes] [access-modifiers] class identifier [:base-class ]
{
class-body
}
Thông thường một lớp sẽ dùng từ khóa public là một access-modifiers. Indentifier là tên của lớp.
Nội dung của lớp được định nghĩa trong {}.
Trong C# mọi thứ xảy ra trong một lớp. Ví dụ sau định nghĩa một lớp Tester:
public class Tester
{
public static int Main( )

{
/...
}
}

Lúc khai báo một lớp mới, chúng ta định nghĩa thuộc tính của tất cả đối tượng cũng như
những hành vi của lớp đó. Ví dụ: một Listbox trong Window có các đặc trưng sau: độ cao, rộng,
vị trí, màu… và những người lập trình mong muốn các hành vi trong Listbox như chúng có thể
mở, đóng hay sắp xếp.
Ngôn ngữ lập trình hướng đối tượng phép chúng ta tạo một kiểu mới ListBox, đồng thời
đóng gói những đặc trưng và khả năng của chúng. Lúc đó, lớp Listbox có thể có các biến thành
viên như độ rộng, cao và các hàm thành viên Sort(), Add()…
Chúng ta không thể gán dữ liệu đến kiểu Listbox, đầu tiên chúng ta phải tạo một đối tượng kiểu
Listbox theo đoạn mã sau.
ListBox myListBox.

Trang 21


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

Một khi chúng ta tạo một thể hiện của ListBox chúng ta có thể gán dữ liệu đến các trường
của nó.
Xem xét một lớp theo dõi và hiển thị thời gian của ngày. Trạng thái bên trong của lớp phải
có khả năng biểu diễn năm, tháng, ngày, giờ, phút và giây hiện tại. Chúng ta muốn thời gian hiển
thị ở nhiều dạng khác nhau. Chúng ta có thể thực hiện được yêu cầu của lớp trên bằng cách khai
báo một lớp định nghĩa một phương thức và sáu biến như sau:
using System;
public class Time
{

// public methods
public void DisplayCurrentTime( )
{
Console.WriteLine("Hiển thị thời gian hiện tại");
}
// private variables
int Year;
int Month;
int Date;
int Hour;
int Minute;
int Second;
}
public class Tester
{
static void Main( )
{
Time t = new Time( );
t.DisplayCurrentTime( );
}
}

Phương thức DisplayCurrentTime() được định nghĩa trả về kiểu void. Nó không trả về giá
trị cho phương thức gọi nó. Trong hàm Main() thể hiện của lớp Time được tạo và địa chỉ của nó
được gán đến đối tượng t. Bởi vì t là thể hiện của đối tượng Time nên nó có thể sử dụng phương
thức DisplayCurrentTime()để gọi phương thức hiển thị thời gian:
t.DisplayCurrentTime( );
1.1.2 Kiểu truy xuất
Kiểu truy xuất xác định phương thức của lớp(bao gồm phương thức của những lớp khác)
có thể nhìn và sử dụng biến thành viên hay phương thức bên trong lớp. Bảng sau liệt kê các kiểu

truy xuất
Kiểu truy

Hạn chế

xuất
Public

Không hạn chế. Thành viên được đánh dấu public được nhìn thấy
Trang 22


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

bởi bất kỳ phương thức của bất kỳ lớp
private

Các thành viên trong lớp A được đánh dấu private được truy xuất
chỉ trong các phương thức của lớp A

protected

Các thành viên trong lớp A được đánh dấu protected được truy
xuất trong các phương thức của lớp A và các lớp dẫn cuất từ A

internal

Các thành viên trong lớp A được đánh dấu internal được truy xuất
trong các phương thức của bất kỳ lớp trong assembly của A


protected

Tương đương với protected or internal

internal
Biến thành viên của lớp nên được khai báo như sau:
private
private
private
private
private
private

int
int
int
int
int
int

Year;
Month;
Date;
Hour;
Minute;
Second;

1.1.3 Tham số của phương thức
Phương thức có thể có số tham số bất kỳ. Danh sách tham số theo sau bởi tên phương thức,
mỗi tham số phải được gán một kiểu dữ liệu. Ví dụ sau định nghĩa một tên phương thức

MyMethod và trả về giá trị void, nó nhận hai tham số int và button
void MyMethod (int firstParam, button secondParam)
{
// ...
}

Bên trong phần thân của phương thức, tham số hoạt động như là một biến cục bộ. Ví dụ
sau minh họa bằng cách nào đưa giá trị trong một phương thức, trong trường hợp này giá trị có
kiểu int và float
using System;
public class MyClass
{
public void SomeMethod(int firstParam, float secondParam)
{
Console.WriteLine("Các tham số nhận được: {0}, {1}",firstParam, secondParam);
}
}
public class Tester
{
static void Main( )
{
int howManyPeople = 5;
float pi = 3.14f;

Trang 23


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006
MyClass mc = new MyClass( );
mc.SomeMethod(howManyPeople, pi);

}
}

1.2 Tạo đối tượng
Trong chương trước chúng ta phân biệt giữa kiểu giá trị và kiểu tham chiếu. Các kiểu cơ
bản trong C# là kiểu giá trị và chúng được tạo trên stack. Đối tượng, tuy nhiên nó là một kiểu
tham chiếu, được tạo trên heap sử dụng từ khóa new. Ví dụ:
Time t = new Time();
t không thật sự chứa đối tượng Time, nó chỉ chứa địa chỉ của Time được tạo trên Heap. t chỉ thật
sự là một tham chiếu của đối tượng đó.
1.2.1 Phương thức tạo lập
Trong lệnh sau:
Time t = new Time();

Một phương thức được gọi bất cứ lúc nào chúng ta tạo một thể hiện cho một đối tượng gọi
là phương thức tạo lập. Nếu chúng ta không định nghĩa nó trong phần khai báo lớp, CLR sẽ cung
cấp một phương thức mặc định đại diện cho nó. Nhiệm vụ của phương thức tạo lập là tạo đối
tượng chỉ bởi lớp và đặt đối tượng vào trong trạng thái sẵn sàng. Trước khi phương thức tạo lập
chạy, đối tượng chưa tồn tại trong bộ nhớ, sau khi tạo lập hoàn thành, bộ nhớ lưu trữ một thể hiện
hợp lệ của một kiểu lớp.
Trong ví dụ lớp Time không định nghĩa một phương thức tạo lập, trình biên dịch sẽ tự động tạo
một phương thức tạo lập cho nó. Khi sử dụng phương thức tạo lập mặc định các biến được khởi
tạo giá trị mặc định như sau:
Kiếu

Giá trị mặc định

Kiểu số (int, long..)

0


Bool

False

Char

‘\0’

Enum

0

Reference

null

Thông thường chúng ta định nghĩa riêng một phương thức tạo lập và cung cấp tham số cho
phương thức tạo lập để khởi tạo các biến cho đối tượng của chúng ta.
Để định nghĩa một phương thức tạo lập, chúng ta khai báo một phương thức có tên trùng
với tên lớp mà chúng ta khai báo. Phương thức này không trả về bất cứ giá trị nào và thông
Trang 24


Lập trình hướng đối tượng – Tran Thong - Khoa CNTT-DHDL 2006

thường được khai báo public. Tham số sử dụng trong phương thức tạo lập cũng như những tham
số trong phương thức khác.
Ví dụ sau khai báo một phương thức tạo lập cho lớp Time và chấp nhận một tham số có kiểu là
DateTime

using System;
namespace QuanLySinhVien
{
public class SinhVien
{
private float _diem;
public string maso;
public string ten;
public bool gioitinh;
public float diem;
public SinhVien(string maso, string ten, bool gioitinh, float diem)
{
this.maso = maso;
this.ten = ten;
this.gioitinh = gioitinh;
this.diem = diem;
}
private string GT(bool gt)
{
return gt?"Male":"Female";
}
public override string ToString()
{
return maso + "\t" + ten + "\t" + GT(this.gioitinh)
diem.ToString();
}

+ "\t" +

}


{

static void Main(string[] args)

//Khởi tạo một biến s thuộc kiểu sinh viên
SinhVien s = new SinhVien(“001”,”Thanh”,false,8);
//Xuất thộng tin sinh viên ra màn hình
Console.WriteLine(s);
}

}

1.2.2 Khởi tạo
Thay vì khởi tạo giá trị các biến thành viên thông qua phương thức tạo lập chúng ta có thể
thực hiện gán giá trị khởi tạo trực tiếp cho biến. Phương thức tạo lập của chương trình trên có thể
được viết như sau:
public void SinhVien()
{
Console.Ghi("Nhap maso ");
maso = Console.ReadLine();
Console.Ghi("Nhap ten ");
ten = Console.ReadLine();
Console.Ghi("Nhap gioi tinh 1 cho Nam, 0 cho Nu ");

Trang 25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×