Lệnh nhảy goto là một lệnh nhảy đơn giản, cho phép chương trình nhảy vô điều kiện tới một vị trí trong chương trình thông qua tên nhãn. Tuy nhiên việc sử dụng lệnh goto thường làm mất đi tính cấu trúc thuật toán, việc lạm dụng sẽ dẫn đến một chương trình nguồn mà giới lập trình gọi là “mì ăn liền” rối như mớ bòng bong vậy. Hầu hết các người lập trình có kinh nghiệm đều tránh dùng lệnh
goto. Sau đây là cách sử dụng lệnh nhảy goto:
Cú pháp:
goto <label>;
Trong đó label là một nhãn đích đến trong code. Nơi mà code sẽ tiếp tục được thực thi từ đó. Cấu trúc của một label: <Tên label>:
goto là từ khóa thông báo cho trình biên dịch biết sẽ đi đến nhãn ngay sau để tiếp tục thực thi code.
Ví dụ
Kết quả chương trình
Hình 6.3. Kết quả thực hiện lệnh goto
Kết quả chương trình
Hình 6.4. Kết quả thực hiện vòng lặp vô tận
Câu hỏi ôn tập và bài tập
1. Sử dụng câu lệnh break cho bài tập 5.1
2. Viết chương trình đặt một nhãn bất kỳ và thực hiện in ra câu lệnh “Chúc các bạn học tốt môn học”.
3. Từ bài tập 2 cho phép người dùng nhập vào tên học sinh và nhảy tới vị trí câu lệnh Chúc các bạn học tốt môn học”.
BÀI 7: HÀM
Mã bài: 20.7 Giới thiệu:
Hàm là chương trình con được sử dụng thường xuyên trong toàn bộ quá trình lập trình. Việc viết và sử dụng hàm một cách hiệu quả giúp cho quá trình thực hiện các công việc lập trình nhanh chóng, tái sử dụng, kế thừa tốt hơn.
Mục tiêu:
- Hiểu được khái niệm và công dụng của hàm trong xây dựng chương trình.
- Quy tắc xây dựng hàm, sử dụng hàm trong xây dựng chương trình. - Hiểu và sử dụng tham số, tham trị của hàm.
- Vận dụng hàm, thủ tục để xây dụng chương trình đồ án khoa học và hiệu quả.
- Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm.
Nội dung chính:
5. Khái niệm
Khi mình muốn thực thi một đoạn code nào nó nhiều lần, thay vì phải copy đi copy lại đoạn code đó nhiều lần, dẫn đến chương trình chúng ta bị trùng lặp code rất nhiều, trong c# có function cho phép chúng ta thực thi đoạn code nào đó nhiều lần mà không cần phải copy lại code, mà chỉ cần gọi tên hàm.
2. Quy tắc xây dựng hàm
Cú pháp:
<Quyền truy cập> <Kiểu trả về> Tên hàm (<Tham số>) { // Thân hàm // Giá trị trả về; } Trong đó: Tên hàm:
o Tên có thể đặt tùy ý nhưng nên đặt tên theo quy tắc đặt tên để có sự đồng bộ ngầm định giữa các lập trình viên và dễ tìm, dễ nhớ (. o Hãy xem cách khởi tạo hàm giống khởi tạo một biến ở chỗ. Đều
cần kiểu dữ liệu và tên. Có thể có các từ khóa. Tên để tái sử dụng hàm ở nơi mong muốn.
Kiểu trả về: từ khóa void, hay mọi kiểu dữ liệu như int, long, bool, SinhVien… Thân hàm: Nó là khối lệnh sẽ được thực thi khi hàm được gọi.
Quyền truy cập: Nó được sử dụng để xác định khả năng truy cập hàm trong ứng dụng bao gồm các quyền sau: public, private, protected
Tham số: Nó là một danh sách các tham số mà chúng ta truyền vào khi gọi hàm
Lưu ý:
o Mọi hàm đều phải có cặp ngoặc nhọn { } biểu thị là một khối lệnh. Mọi dòng code xử lý của hàm đều được viết bên trong cặp ngoặc nhọn { } này.
o Không thể khai báo một hàm trong một hàm khác theo cách thông thường.
Một hàm cơ bản hay thấy với cấu trúc bắt buộc phải có trong lập trình C# console hàm Main
3. Nguyên tắc hoạt động của hàm
Hàm void là hàm có kiểu trả về là void. Chúng ta cùng xem qua khai báo hàm sau: void Demo() { // some code return; }
Vì hàm void (hàm có kiểu trả về là void) thì không cần viết return; nên chúng ta có thể bỏ return; đi.
Void Demo() {
}
Một lưu ý về sau: do đang viết code trên nền console C#. Bắt buộc phải có hàm Main. Nhưng hàm Main lại có từ khóa static. Nên để trong hàm Main có thể sử dụng các hàm mà ta viết ra thì các hàm đó cũng phải có từ khóa static.
Static void Main(string[] args) {
// Gọi lại hàm đêỉ sưỉ dụng
Console.OutputEncoding = Encoding.UTF8; Demo();
Console.ReadKey(); }
static void Demo() {
Console.WriteLine(“Chào mừng đêấn với môn Lập trình Windows Forms”);
}
Kết quả vẫn xuất ra dòng chữ “Chào mừng đến với môn Lập trình Windows Forms” như được viết bên trong hàm Main. Nhưng thật sự nó đã được gọi từ hàm Demo.
Khi sử dụng hàm ta sẽ gọi lại tên hàm kèm theo dấu () biểu thị đó là một hàm. Sau này nếu có parameter thì sẽ thêm giá trị vào bên trong dấu ().
Chúng ta có thể gọi lại nhiều lần và có thể thấy code chúng ta viết rất rõ ràng và rất dễ tái sử dụng.
static void Main(string[] args) {
// Gọi lại hàm nhiêều lấền
// dòng chữ Called from Demo! HowKteam.com cũng được in ra nhiêều lấền Console.OutputEncoding = Encoding.UTF8; Demo(); Demo(); Demo(); Demo(); Console.ReadKey(); }
static void Demo() {
Console.WriteLine(“Chào mừng đêấn với môn Lập trình Windows Forms”);
}
Nhiều dòng chữ “Chào mừng đến với môn Lập trình Windows Forms” được in ra màn hình.
Hàm có kiểu trả về khác void
Với hàm có kiểu trả về khác void. Trong thân hàm bắt buộc phải có dòng return <Giá trị trả về>;
Giá trị trả về phải có kiểu dữ liệu tương ứng với Kiểu dữ liệu trả về khi khai báo hàm.
/// <summary>
/// Hàm traỉ vêề giá trị sôấ nguyên 5 thông qua tên hàm
/// Lưu ý giá trị traỉ vêề phaỉi cùng kiêỉu dữ liệu với kiêỉu traỉ vêề cuỉa hàm
/// Ởỉ đấy là kiêỉu int
/// </summary>
/// <returns></returns>
static int ReturnANumber() {
// bắất buộc phaỉi có cấấu trúc return trong thấn hàm
return 5; }
Có thể sử dụng hàm này bình thường, và có thêm một lợi thế là có thể lấy giá trị trả về của hàm thông qua lời gọi tên hàm.
Static void Main(string[] args) {
Console.WriteLine(ReturnANumber()); Console.ReadKey();
} /// <summary>
/// Hàm traỉ vêề giá trị sôấ nguyên 5 thông qua tên hàm
/// Lưu ý giá trị traỉ vêề phaỉi cùng kiêỉu dữ liệu với kiêỉu traỉ vêề cuỉa hàm
/// Ởỉ đấy là kiêỉu int
/// </summary>
/// <returns></returns>
static int ReturnANumber() {
// bắất buộc phaỉi có cấấu trúc return trong thấn hàm
return 5; }
Kết quả số 5 xuất hiện trên màn hình
4. Cách truyền tham số
Kết quả chương trình
Hình 7.1. Kết quả hàm không trả về giá trị
Hàm có tham số và có kiểu trả về
Kết quả chương trình
Hình 7.2. Kết quả hàm trả về giá trị
5. Sử dụng hàm
Trong c# có 3 cách gọi hàm đó là gọi bằng giá trị (call by value), gọi bằng tham chiếu (call by Reference) và dùng tham số out.
6. Gọi bằng giá trị (call by value)
Trong C#, gọi bằng giá trị tức là tham số truyền vào là bản sao của giá trị gốc, vì vậy dù cho bên trong thân hàm có thay đổi giá trị của tham số truyền vào thì sau khi kết thúc gọi hàm thì giá trị gốc vẫn không thay đổi.
Kết quả chương trình
Hình 7.3. Kết quả gọi hàm bằng giá trị
b. Gọi bằng tham chiếu (call by Reference)
C # cung cấp một từ khóa ref để truyền đối số dưới dạng tham chiếu. Tức là tham số truyền vào bằng địa chỉ ô nhớ của biến gốc vì vậy bên trong thân hàm thay đổi giá trị tham số truyền vào thì giá trị gốc cũng thay đổi theo..
Hình 7.4. Kết quả gọi hàm bằng tham chiếu
c.Tham số out
Tham số out giống như kiểu tham chiếu, ngoại trừ việc nó không yêu cầu biến khởi tạo trước khi truyền.
Ví dụ:
Kết quả chương trình
Hình 7.5. Kết quả gọi hàm bằng tham số out
Bảng 7.1. Phân biệt giữ ref và out
ref out
Giá trị phải được khởi tạo trước Giá trị không được khởi tạo trước và bên trong thân hàm không đọc được nó cho đến khi nó được gán giá trị Bên trong thân hàm có thể đọc vào
thay đổi giá trị nó
Hàm phải gán giá trị cho biến out trước khi trả giá trị về
Câu hỏi ôn tập và bài tập
BÀI 8: THIẾT KẾ LỚP ĐỐI TƯỢNG
Mã bài: 20.8 Giới thiệu:
Lớp đối tượng được dùng để lưu trữ danh sách những thuộc tính và phương thức của đối tượng phân biệt trong một dự án lập trình.
Mục tiêu:
- Lập danh sách các lớp đối tượng ứng với từng chương trình cụ thể. - Thiết kế các lớp đối tượng cho bài tập của nhóm.
- Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm.
Nội dung chính:
7. Định nghĩa lớp đối tượng
Lập trình hướng đối tượng (Object-oriented programming – OOP), là kỹ thuật lập trình mà điều cốt yếu cần trừu tượng hóa các vấn đề thành các đối tượng (đối tượng có dữ liệu và các ứng xử). Kỹ thuật OOP có 4 tính chất
Tính trừu tượng (abstraction) mô tả một cách tổng quát hóa mà không
chi tiết thông tin (triển khai với interface, abstract)
Tính đóng gói (encapsulation) dữ liệu đối tượng cố gắng như nằm trong
một hộp đen, các thành phần khác bên ngoài đối tượng không trực tiếp tác động đến dữ liệu
Tính đa hình (polymorphism) đối tượng ứng xử khác nhau tùy trường
hợp cụ thể
Tính kế thừa (inheritance) đặc tính của lớp được kế thừa từ một lớp khác
Trong lập trình hướng đối tượng, lớp (class) là một kiểu dữ liệu nó định nghĩa một tập hợp các biến (thuộc tính) và phương thức (gọi chúng là các member – thành viên lớp). Từ lớp đó sinh ra các đối tượng (object), các đối tượng này còn gọi là instance of a class (bản triển khai của class), mỗi đối tượng có giá trị dữ liệu cụ thể (lưu trong thành viên biến). Các phương thức (method) – định nghĩa các ứng xử của đối tượng – dựa theo dữ liệu của chúng.
Một lớp là một nhóm đối tượng có các thuộc tính chung. Nó là một mẫu hoặc thiết kế từ đó các đối tượng được tạo ra.
Một thực thể có trạng thái và hành vi được gọi là đối tượng. Ví dụ như máy pha cà phê, xe đạp, xe máy, cái quạt...
Một đối tượng có ba đặc điểm:
Trạng thái: Đại diện cho dữ liệu (giá trị) của một đối tượng.
Hành vi: Đại diện cho hành vi (chức năng) của một đối tượng như gửi tiền, rút tiền, ...
Danh tính: Danh tính của một đối tượng thường được cài đặt thông qua một ID duy nhất. ID này được ẩn đối với user bên ngoài. Tuy nhiên nó được sử dụng trong nội bộ máy ảo JVM để định danh từng đối tượng. Ví dụ: Bút chì là một đối tượng. Tên của nó là A, màu trắng, ... được gọi là trạng thái. Nó được sử dụng để viết, viết được gọi là hành vi.
Đối tượng(Object) là một thể hiện của một lớp(Class). Lớp là một mẫu hoặc
thiết kế từ đó các đối tượng được tạo ra. Vì vậy, đối tượng là các thể hiện (kết quả) của một lớp.
Ví dụ: Một lớp mô tả chung về nhân viên, đặt tên là nhanvien, thì bên trong nó
có thể định nghĩa các thành viên dữ liệu (biến) như: manv, tennv, ngaysinh, gioitinh ... Cũng có thể định nghĩa các thành viên hàm (phương thức) để mô tả ứng xử của nó như: khoitao(), them() ...
Khi có định nghĩa lớp nhanvien, bạn có thể tạo ra đối tượng cụ thể của nó mà mỗi đối tượng có những dữ liệu khác nhau như Nhân viên A, Nhân viên B ...
2. Khai báo lớp đối tượng
Để tạo được lớp đối tượng trong ngôn ngữ lập trình C# trên phần mềm ứng dụng lập trình Visual Studio chúng ta cần thực hiện các việc sau:
Hình 8.1. Màn hình để chọn thêm một lớp mới vào Project
Hình 8.2. Màn hình đặt tên cho lớp đối tượng
Cú pháp, ví dụ khai báo lớp
Khi giải quyết các vấn đề thực tiễn, các vấn đề cần giải quyết bạn cần tìm cách trừu tượng hóa nó thành vấn đề tổng quát, như nó có các đặc tính gì, ứng xử của nó ra sao ... Từ đó mới có thể định nghĩa ra lớp để hiện thực hóa vấn đề trừu tượng được.
Cú pháp cơ bản như sau:
<Access Modifiers> class Class_Name
{
// khai báo các thành viên dữ liệu (thuộc tính – biêấn)
// khai báo các thành viên hàm (phưởng thức)
}
Trong đó Access Modifiers có thể là các từ khóa sau:
Bảng 8.1. Bảng mô tả các từ khóa định nghĩa lớp
Từ khóa Giải thích
Public Truy xuất mọi nơi
Protected Truy xuất trong nội bộ lớp hoặc trong các lớp con
Internal Truy xuất trong nội bộ chương trình (Assembly)
protected internal Truy xuất nội trong chương trình (assembly) và
trong các lớp con
private (mặc định) Chỉ được truy xuất trong nội bộ lớp
Ví dụ: Khai báo một lớp có tên là Box gồm các thuộc tính: chiều dài, chiều rộng, chiều cao.
Khai báo và khởi tạo thành viên thuộc tính (biến) tương tự cách khai báo biến thông thường nhưng có sử dụng thêm Access Modifiers để quy định cấp độ truy cập.
Câu hỏi ôn tập và bài tập
1. Tạo lớp đối tượng sinh viên bao gồm các thông tin: masv (mã sinh viên), tennv (tên sinh viên), ngaysinh (ngày sinh), diachi (địa chỉ)
2. Tạo lớp đối tượng đồng hồ bao gồm các thông tin: thoigian, gio, phut, giay. 3. Tạo lớp đối tượng sản phẩm bao gồm các thông tin: masp (mã sản phẩm), tensp (tên sản phẩm), gia (giá), ngaynhap (ngày nhập), ngayxuat (ngày xuất).
BÀI 9 : ĐỊNH NGHĨA CÁC THUỘC TÍNH, PHƯƠNG THỨC HÀNH ĐỘNG CHO LỚP ĐỐI TƯỢNG
Mã bài: 20.9 Giới thiệu:
Việc xác định thuộc tính của lớp đối tượng cũng như chuẩn bị sẵn các phương thức hoạt động cho lớp đối tượng giúp cho việc sử dụng và lập trình dễ dàng hơn rất nhiều.
Mục tiêu:
- Định nghĩa được các thuộc tính cho lớp đối tượng.
- Định nghĩa được các phương thức hành động cho lớp đối tượng - Vận dụng các thuộc tính, phương thức của lớp đối tượng trong đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm.
Nội dung chính:
8. Định nghĩa các thuộc tính cho lớp đối tượng
Ví dụ:
- Định nghĩa lớp đối tượng Box gồm các thuộc tính chieudai, chieurong, chieucao.
- Kiểu dữ liệu cho mỗi thuộc tính tùy theo mục đích sử dụng mà chọn kiểu dữ liệu.
Trong màn hình lập trình trên để khai báo và sử dụng lớp đối tượng Box trong chương trình Main ta sử dụng câu lệnh sau:
Từ khóa this
Từ khóa this dùng trong các phương thức của lớp, nó tham chiếu đến đối tượng hiện tại sinh ra từ lớp. Sử dụng this để tường minh, tránh sự không rõ ràng khi truy cập thuộc tính, phương thức hoặc để lấy đối tượng lớp làm tham số cho các thành phần khác ...
Ví dụ, hàm setchieucao, có thể viết: public void setchieucao(int chieucao) {
this.chieucao = chieucao ;
}
Nếu viết thiếu this thì là chieucao = chieucao , làm cho khó hiểu không biết là gán chieucao từ tham số hàm cho chieucao là dữ liệu của lớp.
2. Định nghĩa các phương thức hành động cho lớp đối tượng
Phương thức khởi tạo – Constructor
Phương thức khởi tạo là phương thức của lớp, nó được thi hành ngay khi đối tượng được tạo (bởi toán tử new), phương thức khởi tạo có tên trùng với tên của lớp, không có kiểu trả về.
Nếu khai báo vào khởi tạo giống như ở trên chương trình sẽ báo lỗi vì khi tạo đối tượng Box mới cần gán các giá trị ban đầu cho đối tượng: chiều dài, chiều rộng, chiều cao.
Lúc này có thể sử như sau:
Kết quả tương tự như ví dụ trên, việc sử dụng hàm khởi tạo đảm bảo dữ liệu của