Cấu trúc lặp

Một phần của tài liệu Giáo trình Lập trình trực quan (Nghề: Quản trị mạng máy tính - Cao đẳng) - Trường Cao đẳng Cộng đồng Đồng Tháp (Trang 33)

CHƢƠNG 1– TỔNG QUAN VỀ FRAMEWORK .NET

2.3 Các cấu trúc điều khiển

2.3.3 Cấu trúc lặp

C# cung cấp một bộ mở rộng các câu lệnh lặp, bao gồm các câu lệnh lặp for, while và do... while. Ngồi ra ngơn ngữ C# cịn bổ sung thêm một câu lệnh lặp foreach,

Chƣơng 2 – Ngơn ngữ lập trình c#

34 lệnh này mới đối với ngƣời lập trình C/C++ nhƣng khá thân thiện với ngƣời lập trình VB.

Vịng lặp while

Cú pháp sử dụng vòng lặp while nhƣ sau:

while (Biểu thức)

<Câu lệnh thực hiện>

Biểu thức của vòng lặp while là điều kiện để các lệnh đƣợc thực hiện, biểu thức này bắt buộc phải trả về một giá trị kiểu bool là true/false. Nếu có nhiều câu lệnh cần đƣợc thực hiện trong vịng lặp while thì phải đặt các lệnh này trong khối lệnh.

Ví dụ:

int i = 0;

while (i < 10)

{

Console.WriteLine("So thu {0}", i);

i++;

}

Kết quả:

So thu 0

Chƣơng 2 – Ngơn ngữ lập trình c# 35 So thu 2 So thu 3 So thu 4 So thu 5 So thu 6 So thu 7 So thu 8 So thu 9 Chú ý:

Vòng lặp while sẽ kiểm tra điều kiện trƣớc khi thực hiện các lệnh bên trong, điều này đảm bảo nếu ngay từ đầu điều kiện sai thì vịng lặp sẽ khơng bao giờ thực hiện

Vòng lặp do…while

Cú pháp sử dụng vòng lặp do…while

do

<Câu lệnh thực hiện>

while ( điều kiện ) Chú ý:

Chƣơng 2 – Ngơn ngữ lập trình c#

36 Sự khác biệt quan trọng giữa vòng lặp while và vòng lặp do...while là khi dùng

vịng lặp do...while thì tối thiểu sẽ có một lần các câu lệnh trong do...while đƣợc

thực hiện.

Điều này cũng dễ hiểu vì lần đầu tiên đi vào vịng lặp do...while thì điều kiện chƣa đƣợc kiểm tra.

Ví dụ:

int i = 0;

do

{

Console.WriteLine("So thu {0}", i);

i++; } while (i < 10); Kết quả: So thu 0 So thu 1 So thu 2 So thu 3 So thu 4

Chƣơng 2 – Ngơn ngữ lập trình c# 37 So thu 5 So thu 6 So thu 7 So thu 8 So thu 9 Ví du 2: int i = 11; do {

Console.WriteLine("So thu {0}", i);

i++;

}

while (i < 10);

Kết quả:

So thu 11

Do khởi tạo biến i giá trị là 11, nên điều kiện của while là sai, tuy nhiên vòng lặp do...while vẫn đƣợc thực hiện một lần.

Chƣơng 2 – Ngơn ngữ lập trình c#

38 Vịng lặp for bao gồm ba phần chính:

- Khởi tạo biến đếm vòng lặp

- Kiểm tra điều kiện biến đếm, nếu đúng thì sẽ thực hiện các lệnh bên trong

vòng for

- Thay đổi bước lặp.

Cú pháp sử dụng vòng lặp for:

for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp])

<Câu lệnh thực hiện>

Ví dụ 1:

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

Console.WriteLine("So thu {0}", i);

Kết quả: So thu 0 So thu 1 So thu 2 So thu 3 So thu 4 So thu 5 So thu 6

Chƣơng 2 – Ngơn ngữ lập trình c# 39 So thu 7 So thu 8 So thu 9 Ví dụ 2: int i = 0; for (; i < 10; ) {

Console.WriteLine("So thu {0}", i);

i++; } Kết quả: So thu 0 So thu 1 So thu 2 So thu 3 So thu 4 So thu 5

Chƣơng 2 – Ngôn ngữ lập trình c# 40 So thu 6 So thu 7 So thu 8 So thu 9 Ví dụ 3: int i = 0; for (; ; ) {

Console.WriteLine("So thu {0}", i);

i++; if (i >= 10) break; } Kết quả: So thu 0 So thu 1 So thu 2

Chƣơng 2 – Ngơn ngữ lập trình c# 41 So thu 3 So thu 4 So thu 5 So thu 6 So thu 7 So thu 8 So thu 9 Chú ý:

Có một điều lƣu ý nếu biến i do khai báo bên trong vịng lặp for thì chỉ có phạm vi hoạt động bên trong vòng lặp.

Vòng lặp foreach

Vòng lặp foreach cho phép tạo vịng lặp thơng qua một tập hợp hay một mảng.

Đây là một câu lệnh lặp mới khơng có trong ngơn ngữ C/C++. Câu lệnh foreach có cú pháp chung nhƣ sau:

foreach ( <kiểu tập hợp> <tên truy cập thành phần > in < tên

tập hợp>)

<Các câu lệnh thực hiện>

Do lặp dựa trên một mảng hay tập hợp nên tồn bộ vịng lặp sẽ duyệt qua tất cả các thành phần của tập hợp theo thứ tự đƣợc sắp. Khi duyệt đến phần tử cuối cùng trong tập hợp thì chƣơng trình sẽ thốt ra khỏi vịng lặp foreach.

Chƣơng 2 – Ngơn ngữ lập trình c#

42 Ví dụ:

int[] a = {0,1,2,3,4,5,6,7,8,9};

foreach (int item in a)

Console.WriteLine("So thu {0}", item);

Kết quả: So thu 0 So thu 1 So thu 2 So thu 3 So thu 4 So thu 5 So thu 6 So thu 7 So thu 8 So thu 9

Chƣơng 2 – Ngơn ngữ lập trình c#

43 2.3.4 Lệnh nhảy

Khi đang thực hiện các lệnh trong vịng lặp, có u cầu nhƣ sau: khơng thực hiện các lệnh còn lại nữa mà thốt khỏi vịng lặp, hay khơng thực hiện các cơng việc còn lại của vòng lặp hiện tại mà nhảy qua vòng lặp tiếp theo. Để đáp ứng yêu cầu trên C# cung cấp hai lệnh nhảy là break và continue để thốt khỏi vịng lặp.

Lệnh break

Break khi đƣợc sử dụng sẽ đƣa chƣơng trình thốt khỏi vịng lặp và tiếp tục thực

hiện các lệnh tiếp ngay sau vịng lặp.

Ví dụ:

int i, so = 35;

for (i = 2; i < so; i++)

if (so % i == 0)

break;

if (i==so)

Console.WriteLine("{0} la so nguyen to", so);

else

Console.WriteLine("{0} khong la so nguyen to", so);

Chƣơng 2 – Ngơn ngữ lập trình c#

44 35 khong la so nguyen to

Lệnh continue

Continue ngừng thực hiện các cơng việc cịn lại của vòng lặp hiện thời và quay về

đầu vòng lặp để thực hiện bƣớc lặp tiếp theo

Ví dụ:

for (int i = 1; i < 10; i++)

{

if (i % 3 == 0)

continue;

Console.WriteLine("So thu {0}", i);

} Kết quả: So thu 1 So thu 2 So thu 4 So thu 5 So thu 7

Chƣơng 2 – Ngơn ngữ lập trình c#

45 So thu 8

Câu lệnh goto

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 tố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:

Tạo một nhãn

goto đến nhãn

Nhãn là một định danh theo sau bởi dấu hai chấm (:). Thƣờng thƣờng một lệnh

goto gắn với một điều kiện nào đó Ví dụ:

int i = 0;

lap:

Console.WriteLine("So thu {0}",i);

Chƣơng 2 – Ngơn ngữ lập trình c# 46 if (i<10) goto lap; Kết quả: So thu 0 So thu 1 So thu 2 So thu 3 So thu 4 So thu 5 So thu 6 So thu 7 So thu 8 So thu 9 Lệnh return

Lệnh return dùng để thoát khỏi phương thức của một lớp, trả điều khiển trở về nơi gọi phƣơng thức. Tùy theo kiểu dữ liệu của phƣơng thức là void hoặc có một kiểu dữ liệu cụ thể, lệnh return tƣơng ứng không trả về giá trị hoặc trả về giá trị có kiểu dữ liệu thích hợp.

Chƣơng 2 – Ngơn ngữ lập trình c#

47

2.4 Các kiểu dữ liệu có cấu trúc

2.4.1 Mảng

Mảng là một tập hợp có thứ tự của những đối tƣợng, tất cả các đối tƣợng này cùng một kiểu. Mảng trong ngơn ngữ C# có một vài sự khác biệt so với mảng trong ngôn ngữ C++ và một số ngơn ngữ khác, bởi vì chúng là những đối tƣợng. Điều này sẽ cung cấp cho mảng sử dụng các phƣơng thức và những thuộc tính.

Ngơn ngữ C# cung cấp cú pháp chuẩn cho việc khai báo những đối tƣợng Array. Tuy nhiên, cái thật sự đƣợc tạo ra là đối tƣợng của kiểu System.Array. Mảng trong ngôn ngữ C# kết hợp cú pháp khai báo mảng theo kiểu ngôn ngữ C và kết hợp với định nghĩa lớp do đó thể hiện của mảng có thể truy cập những phƣơng thức và thuộc tính của System.Array.

Một số các thuộc tính và phƣơng thức của lớp System.Array

Thành viên Mô tả

BinarySearch() Tìm kiếm một mảng một chiều đã sắp thứ tự. Clear() Thiết lập các thành phần của mảng về 0 hay null. Copy() Sao chép một vùng của mảng vào mảng khác. CreateInstance() Tạo một thể hiện mới cho mảng

IndexOf() Trả về chỉ mục của thể hiện đầu tiên chứa giá trị trong mảng một chiều

LastIndexOf() Trả về chỉ mục của thể hiện cuối cùng của giá trị trong mảng một chiều

Chƣơng 2 – Ngơn ngữ lập trình c#

48 Reverse() Đảo thứ tự của các thành phần trong mảng một chiều

Sort() Phƣơng thức tĩnh public sắp xếp giá trị trong mảng một chiều.

IsFixedSize Giá trị bool thể hiện mảng có kích thƣớc cố định hay không.

IsReadOnly Giá trị bool thể hiện mảng chỉ đọc hay không

IsSynchronized Giá trị bool thể hiện mảng có hỗ trợ thread-safe Length Chiều dài của mảng

Rank Chứa số chiều của mảng

GetLength() Trả về kích thƣớc của một chiều cố định trong mảng GetLowerBound() Cận dƣới của chiều xác định trong mảng

GetUpperBound() Cận trên của chiều xác định trong mảng

Initialize() Khởi tạo tất cả giá trị trong mảng kiểu giá trị bằng cách gọi bộ khởi dụng mặc định của từng giá trị.

SetValue() Thiết lập giá trị cho một thành phần xác định trong mảng

Khai báo mảng

Cú pháp khai báo mảng

<kiểu dữ liệu>[] <tên mảng>

Chƣơng 2 – Ngôn ngữ lập trình c#

49 int[] m;

- Cặp dấu ngoặc vuông ([]) báo cho trình biên dịch biết rằng chúng ta đang khai báo một mảng.

- Kiểu dữ liệu là kiểu của các thành phần chứa bên trong mảng Chúng ta tạo thể hiện của mảng bằng cách sử dụng từ khóa new nhƣ sau: m = new int[6];

Khai báo này sẽ thiết lập bên trong bộ nhớ một mảng chứa sáu số nguyên.

Chú ý:

- thành phần đầu tiên luôn bắt đầu 0,

- Khơng có cách nào thiết lập cận trên và cận dƣới của mảng, và chúng ta cũng khơng thể thiết lập lại kích thƣớc của mảng.

Gán giá trị mặc định

Khi chúng ta tạo một mảng có kiểu dữ liệu giá trị, mỗi thành phần sẽ chứa giá trị mặc định của kiểu dữ liệu

Với khai báo: m = new int[6]; sẽ tạo ra một mảng năm số nguyên, và mỗi thành phần đƣợc thiết lập giá trị mặc định là 0, đây cũng là giá trị mặc định của số nguyên.

Không giống với mảng kiểu dữ liệu giá trị, những kiểu tham chiếu trong một mảng không

Chƣơng 2 – Ngơn ngữ lập trình c#

50 đƣợc khởi tạo giá trị mặc định. Thay vào đó, chúng sẽ đƣợc khởi tạo giá trị null. Nếu chúng ta cố truy cập đến một thành phần trong mảng kiểu dữ liệu tham chiếu trƣớc khi chúng đƣợc khởi tạo giá trị xác định, chúng ta sẽ tạo ra một ngoại lệ.

Truy cập các thành phần trong mảng

Để truy cập vào thành phần trong mảng ta có thể sử dụng toán tử chỉ mục ([]). Mảng dùng cơ sở 0, do đó chỉ mục của thành phần đầu tiên trong mảng ln ln là 0.

Một mảng có thể đƣợc đánh chỉ mục từ 0 đến Length –1. 2.4.2 Chuỗi

Kiểu dữ liệu chuỗi khá thân thiện với ngƣời lập trình trong bất cứ ngôn ngữ lập trình nào, kiểu dữ liệu chuỗi lƣu giữ một mảng những ký tự. Để khai báo một chuỗi chúng ta sử dụng từ khoá string tƣơng tự nhƣ cách tạo một thể hiệncủa bất cứ đối tƣợng nào:

string chuoi;

Một hằng chuỗi đƣợc tạo bằng cách đặt các chuỗi trong dấu nháy đôi: “Xin chao” Đây là cách chung để khởi tạo một chuỗi ký tự với giá trị hằng: string chuoi = “Xin chao”

2.4.3 Kiểu liệt kê

Kiểu liệt kê đơn giản là tập hợp các tên hằng có giá trị không thay đổi (thƣờng đƣợc gọi là danh sách liệt kê).

Chƣơng 2 – Ngôn ngữ lập trình c#

51 [thuộc tính] [bổ sung] enum <tên liệt kê> [:kiểu cơ sở]

{danh sách các thành phần liệt kê};

Chú ý:

- Mỗi kiểu liệt kê có một kiểu dữ liệu cơ sở, kiểu dữ liệu có thể là bất cứ kiểu dữ liệu nguyên nào nhƣ int, short, long... tuy nhiên kiểu dữ lịêu của liệt kê không chấp nhận kiểu ký tự

- Thành phần kiểu cơ sở chính là kiểu khai báo cho các mục trong kiểu liệt kê. Nếu bỏ qua thành phần này thì trình biên dịch sẽ gán giá trị mặc định là kiểu nguyên int, tuy nhiên chúng ta có thể sử dụng bất cứ kiểu nguyên nào nhƣ ushort hay long ,.. ngoại trừ kiểu ký tự

- Khai báo một kiểu liệt kê phải kết thúc bằng một danh sách liệt kê, danh sách liệt kê này phải có các hằng đƣợc gán, và mỗi thành phần phải phân cách nhau dấu phẩy.

Ví dụ: enum Thu:int { ChuNhat=0, ThuHai=1, ThuBa=2, ThuTu=3, ThuNam=4,

Chƣơng 2 – Ngơn ngữ lập trình c# 52 ThuSau=5, ThuBay=6, } Ví dụ: enum Thu { ChuNhat, ThuHai, ThuBa, ThuTu, ThuNam, ThuSau, ThuBay, }

ChuNhat=0, ThuHai=1, ThuBa=2, ThuTu=3, ThuNam=4, ThuSau=5, ThuBay=6

Chƣơng 2 – Ngơn ngữ lập trình c# 53 enum Thu { ChuNhat=0, ThuHai=10, ThuBa, ThuTu, ThuNam=20, ThuSau, ThuBay, }

ChuNhat=0, ThuHai=10, ThuBa=11, ThuTu=12, ThuNam=20,

ThuSau=21, ThuBay=22

Kiểu liệt kê là một kiểu hình thức do đó bắt buộc phải thực hiện phép chuyển đổi tƣờng minh với các kiểu giá trị nguyên:

Chƣơng 2 – Ngơn ngữ lập trình c#

54 2.4.4 Khơng gian tên

Nhƣ chúng ta đã biết .NET cung cấp một thƣ viện các lớp đồ sộ và thƣ viện này có tên là FCL (Framework Class Library). Trong đó Console chỉ là một lớp nhỏ trong hàng ngàn lớp trong thƣ viện. Mỗi lớp có một tên riêng, vì vậy FCL có hàng ngàn tên nhƣ ArrayList, Dictionary, FileSelector,… Điều này làm nảy sinh vấn đề, ngƣời lập trình khơng thể nào nhớ hết đƣợc tên của các lớp trong .NET Framework. Tệ hơn nữa là sau này có thể ta tạo lại một lớp trùng với lớp đã có chẳng hạn. Ví dụ trong q trình phát triển một ứng dụng ta cần xây dựng một lớp từ điển và lấy tên là Dictionary, và điều này dẫn đến sự tranh chấp khi biên dịch vì C# chỉ cho phép một tên duy nhất.

Chắc chắn rằng khi đó chúng ta phải đổi tên của lớp từ điển mà ta vừa tạo thành một cái tên khác chẳng hạn nhƣ myDictionary. Khi đó sẽ làm cho việc phát triển các ứng dụng trở nên phức tạp, cồng kềnh. Đến một sự phát triển nhất định nào đó thì chính là cơn ác mộng cho nhà phát triển.

Giải pháp để giải quyết vấn đề này là việc tạo ra một namespace, namsespace sẽ hạn chế phạm vi của một tên, làm cho tên này chỉ có ý nghĩa trong vùng đã định nghĩa.

Tƣơng tự nhƣ vậy ta cứ tạo các namespace để phân thành các vùng cho các lớp trùng tên không tranh chấp với nhau.

Tƣơng tự nhƣ vậy, .NET Framework có xây dựng một lớp Dictionary bên trong namespace System.Collections, và tƣơng ứng ta có thể tạo một lớp Dictionary khác nằm trong namespace ProgramCSharp.DataStructures, điều này hoàn tồn khơng dẫn đến sự tranh chấp với nhau.

Chƣơng 2 – Ngơn ngữ lập trình c#

55 Để làm cho chƣơng trình gọn hơn, và khơng cần phải viết từng namespace cho từng đối tƣợng, C# cung cấp từ khóa là using, sau từ khóa này là một namespace hay

subnamespace với mô tả đầy đủ trong cấu trúc phân cấp của nó.

Ta có thể dùng dòng lệnh: using System; ở đầu chƣơng trình và khi đó trong

chƣơng trình nếu chúng ta có dùng đối tƣợng Console thì khơng cần phải viết đầy đủ: System.Console. mà chỉ cần viết Console. thôi.

using < Tên namespace >

Để tạo một namespace dùng cú pháp sau:

namespace <Tên namespace>

{ < Định nghĩa lớp A> < Định nghĩa lớp B > ..... } 2.5 Hàm

Khi 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

Chƣơng 2 – Ngơn ngữ lập trình c#

56 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.5.1 Khai báo 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: là một tên duy nhất đƣợc sử dụng để gọi hàm.

 Kiểu trả về: đƣợc sử dụng để chỉ rõ kiểu dữ liệu của hàm đƣợc trả về.

 Thân hàm: là khối lệnh sẽ đƣợc thực thi khi hàm đƣợc gọi.

 Quyền truy cập: đƣợc sử dụng để xác định khả năng truy cập hàm trong ứng dụng.

 Tham số: là một danh sách các tham số mà chúng ta truyền vào khi gọi hàm

Ví dụ:

Một phần của tài liệu Giáo trình Lập trình trực quan (Nghề: Quản trị mạng máy tính - Cao đẳng) - Trường Cao đẳng Cộng đồng Đồng Tháp (Trang 33)

Tải bản đầy đủ (PDF)

(105 trang)