Các cấu trúc điều khiển (phần 1)

1

v 1.0 - 10/2012

Monday, October 22, 12

Các cấu trúc điều khiển 1 Lê Viết Mẫn - lvman@hce.edu.vn

chúng ta đã học...

1. Lập trình là gì ?

2. C# và .NET

3. Thiết kế thuật toán

4. Những thành phần cơ bản của C#

2

Monday, October 22, 12

Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn

Giải bài toán trên máy tính

1. Xác định bài toán

2. Thiết kế thuật toán

3. Phân tích thuật toán

4. Cài đặt thuật toán (Lập trình)

5. Kiểm tra / Bắt lỗi

6.

[ Sửa lỗi ]

3

Monday, October 22, 12

Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn

Nội dung

1. Ôn tập Chủ đề Cơ bản Ngôn ngữ lập trình C#

2. Biểu thức

3. Câu lệnh điều kiện if

4. Câu lệnh lựa chọn switch

5. Kiểu dữ liệu Enum

4

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Cơ bản ngôn ngữ lập trình C#

5

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Lớp & đối tượng trong C#

Định nghĩa lớp

Sử dụng từ khoá class

Định nghĩa một kiểu dữ liệu mới

Tạo một đối tượng của một lớp

Khai báo một biến có kiểu dữ liệu nào đó và ghi dữ liệu vào biến đó

Bitmap bm = new Bitmap(20, 20);

Sử dụng từ khoá new

Đặc tính

Các biến thành phần (gọi tắt là biến)

Thao tác

Phương thức / hàm

Có hai loại hàm với hai cách triệu gọi khác nhau :

• Hàm không tĩnh - Gọi từ đối tượng Bitmap bm = new Bitmap(20, 20); bm.Save("bitmap.png");

• Hàm tĩnh (từ khoá static) - Gọi từ lớp Console.Write("Please enter a number :");

6

Monday, October 22, 12

Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn

Sử dụng Object Browser

.NET Base Class Library • Để nghiên cứu về các lớp trong Base Class Library cung cấp cái gì, lớp nó nằm ở assembly (tập tin .dll nào) nào, cách sử dụng... • • MSDN - http://msdn.microsoft.com/en-us/library/gg145045%28v=vs.100%29.aspx

7

Monday, October 22, 12

Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn

Các thành phần của c.t. C#

using System;

namespace Square { class Program { static void Main(string[] args) { double n;

• Các khai báo using • Các khai báo namespace • Các khai báo class • Các khai báo hàm và hàm

// nhap mot so vao tu ban phim

Main

Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());

• Khai báo biến, sử dụng biến • Lời gọi hàm

// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); Console.ReadKey(); } } }

8

Program.cs

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Các thành phần của c.t. C#

using System;

namespace Square { class Program { static void Main(string[] args) { double n;

• Các khai báo using • Các khai báo namespace • Các khai báo class • Các khai báo hàm và hàm

// nhap mot so vao tu ban phim

Main

Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());

• Khai báo biến, sử dụng biến • Lời gọi hàm

// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); Console.ReadKey(); } } }

9

Program.cs

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Các thành phần của c.t. C#

using System;

namespace Square { class Program { static void Main(string[] args) { double n;

• Các khai báo using • Các khai báo namespace • Các khai báo class • Các khai báo hàm và hàm

// nhap mot so vao tu ban phim

• Cần báo cho chương trình

Main

Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());

• Khai báo biến, sử dụng biến • Lời gọi hàm

Visual C# Express (hoặc trình biên dịch) biết mình cần dùng // in ra binh phuong cua so do Console.WriteLine("The square of {0} is assembly nào {1}", n, Square.square(n)); Console.ReadKey(); • } } }

Trong Visual Studio, trên ngăn Solution Explorer, nháy phải chuột lên thư mục References, nháy mục Add References

10

Program.cs

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Các thành phần của c.t. C#

using System;

namespace Square { class Program { static void Main(string[] args) { double n;

• Các khai báo using • Các khai báo namespace • Các khai báo class • Các khai báo hàm và hàm

// nhap mot so vao tu ban phim

Main

Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());

Trong môn CSLT, toàn bộ những • Khai báo biến, sử dụng biến gì chúng ta code đều nằm trong • Lời gọi hàm phần thân của lớp Program

// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); Console.ReadKey(); } } }

Không cần quan tâm đến việc tạo lớp mới

11

Program.cs

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Các thành phần của c.t. C#

using System;

namespace Square { class Program { static void Main(string[] args) { double n;

• Các khai báo using • Các khai báo namespace • Các khai báo class • Các khai báo hàm và hàm

// nhap mot so vao tu ban phim

Main

Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());

• Khai báo biến, sử dụng biến • Lời gọi hàm

// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); Console.ReadKey(); } } }

12

Program.cs

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Các thành phần của c.t. C#

using System;

namespace Square { class Program { static void Main(string[] args) { double n;

• Các khai báo using • Các khai báo namespace • Các khai báo class • Các khai báo hàm và hàm

// nhap mot so vao tu ban phim

Main

Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());

• Khai báo biến, sử dụng biến • Lời gọi hàm

// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); Console.ReadKey(); } } }

13

Program.cs

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Biến và kiểu dữ liệu • Phải được khai báo trước khi sử dụng

int dollars; int money = 217; double x, pi = 3.14159; char begin = ‘A’, end = ‘Z’;

• Tên của biến phải tuân theo quy tắc đặt tên • Khi khai báo mà không gán dữ liệu thì biến sẽ nhận giá trị mặc

0, .0, false, ‘\0’, null

định của kiểu dữ liệu đó • Kiểu dữ liệu được phân ra Kiểu trị

Kiểu tham chiếu

i 17

s

0x0a10

Hello

j 17

s1 0x0a10

14

stack stack heap

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Biến và kiểu dữ liệu • Kiểu dữ liệu cơ bản và kiểu dữ liệu người dùng định nghĩa • Lựa chọn kiểu dữ liệu cho biến phụ thuộc vào phạm vi dữ liệu

mà biến đó sẽ nhận • một biến dùng để lưu điểm thi thì cần dùng kiểu float • một biến dùng để lưu tuổi của một người thì chỉ cần dùng kiểu byte

• Cách xác định kiểu số

15

float C, F = 68; C = (5 / 9) * (F - 32); C = (F - 32) * (5 / 9); C = (F - 32) * 5 / 9; C = (F - 32) * (5f / 9);

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Biến và kiểu dữ liệu • Tính tương thích giữa các kiểu dữ liệu

dùng khi gán dữ liệu kiểu này cho một biến có kiểu dữ liệu khác

(Chuyển đổi ngầm định - implicitly) theo chiều mũi tên thì gán được

• •

short x = 5; int y = x;

(Chuyển đổi tường minh) ngược chiều thì phải thực hiện ép kiểu và có thể xảy ra mất dữ liệu hoặc giá trị không mong muốn

long i = 3000000000; int j = (int)i; // -1294967296

int i = (int)3.14159; int i = (int)(3.14159 + 2.7); uint i = (uint)75; double x = (double)1f/3;

• Chú ý • Không thể khai báo nhiều biến cùng tên trong cùng một phạm vi • Có thể khai báo nhiều biến cùng tên trong các phạm vi khác nhau

16

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Phạm vi của biến • Phạm vi mà biến vẫn còn có thể được sử dụng • Thông thường, sẽ nằm trong một cặp dấu ngoặc nhọn • Hết phạm vi này, biến và vùng dữ liệu của biến đó sẽ bị huỷ

Đối với biến có kiểu dữ liệu tham chiếu, vùng dữ liệu trong heap sẽ bị huỷ sau một khoảng thời gian không được sử dụng bởi Garbage Collector

17

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Hằng • Khai báo hằng trong phạm vi một lớp và bên ngoài các hàm • Hằng phải được gán giá trị khi khởi tạo

Không thể khởi gán hằng từ giá trị của một biến

Trong khai báo hằng không thể dùng từ khoá static

• Chú ý • •

18

const float PI = 3.14159; const char NewLine = '\n'; const int PathWidth = 100; const int SquarePi = Pi * Pi;

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Các thành phần của c.t. C#

using System;

namespace Square { class Program { static void Main(string[] args) { double n;

• Các khai báo using • Các khai báo namespace • Các khai báo class • Các khai báo hàm và hàm

// nhap mot so vao tu ban phim

Main

Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());

• Khai báo biến, sử dụng biến • Lời gọi hàm

// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); Console.ReadKey(); } } }

19

Program.cs

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

System.String • Cho đến hiện tại, chúng ta dùng các chuỗi ký tự với hai hàm :

• Console.Write() • Console.WriteLine()

Console.Write(“Nhiet do C la ” + c); Console.Write(“Nhiet do C la ” + c.ToString());

20

Console.Write(“Nhiet do C cua do {1} do F la {0}”, c, f);

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Xuất dữ liệu ra màn hình • Có thể xuất dữ liệu cho mọi kiểu dữ liệu sử dụng hàm Write

hoặc WriteLine của lớp Console

Console.Write(intVal); Console.Write(intVal.ToString());

Console.Write(“Nhiet do C la ” + c); Console.Write(“Nhiet do C la {0}”, c);

• Cú pháp của token giữ chỗ

{n[,width][:format[precision]]}

n - số thứ tự của token giữ chỗ, bắt đầu từ 0

width - độ rộng của vùng được dùng để in giá trị.

• •

Giá trị này là dương - canh lề bên phải, là âm - canh lề bên trái

format - ký tự định dạng cho kiểu số

{0,10:f2} {1,-5} {2:d} {3:x}

precision - số chữ số phần thập phân hoặc số chữ số của số

• •

21

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Ký tự định dạng cho số

Định dạng số thập phân (số nguyên với các số 0 được điền ở đầu). precision = số chữ số

d, D -xxxxx

Định dạng số dấu chấm động cố định (số thực) precision = số chữ số phần thập phân (mặc định = 2)

f, F -xxxxx.xx

Định dạng số cơ bản (dấu phẩy để phân cách phần ngàn). precision = số chữ số phần thập phân (mặc định = 2)

n, N -xx,xxx.xx

Định dạng số mũ khoa học precision = số chữ số phần thập phân

e, E -x.xxxE+xxx

Định dạng tiền tệ precision = số chữ số phần thập phân

c, C $xx,xxx.xx

Định dạng số thập lục phân precision = số chữ số

x, X xxx

22

Xem thêm trang 2-79, sách Lập trình Visual C# thế nào ? (Dương Quang Thiện)

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Biểu thức

23

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Biểu thức • Các câu lệnh trả ra một giá trị

myVariable = 57; // trả ra giá trị là 57

• Biểu thức số

• Các toán hạng là có kiểu số hoặc ký tự

Riêng với toán tử ++ và -- thì toán hạng phải là kiểu số hoặc kiểu liệt kê

Kiểu của giá trị trả về là kiểu số lớn nhất trong các kiểu của các toán hạng, nhưng ít nhất phải là int

a = b = c = d = e = 20;

24

int + long => long short + int => int short + short => int

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Biểu thức điều kiện (1/2)

Các toán tử quan hệ và logic

E1

E2

E1 && E2

==

so sánh bằng

FALSE

FALSE

FALSE

counter == 0

FALSE

TRUE

FALSE

so sánh khác

!=

TRUE

FALSE

FALSE

counter != 0

lớn hơn

>

TRUE

TRUE

TRUE

counter > 0

nhỏ hơn

<

counter < 0

lớn hơn hoặc bằng

>=

E1

E2

E1 || E2

counter >= 0

nhỏ hơn hoặc bằng

<=

FALSE

FALSE

FALSE

counter <= 0

FALSE

TRUE

TRUE

&& phép AND

TRUE

FALSE

TRUE

(0 < i) && (i < 10)

||

phép OR

TRUE

TRUE

TRUE

(i <= 0) || (i >= 10)

!

phép NOT

E

!E

FALSE TRUE

Kết quả trả về có kiểu bool

TRUE FALSE

25

!done

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Biểu thức điều kiện (2/2) • Sự kết hợp của toán tử quan hệ và toán tử logic

(minimumWage <= wages <= maximumWage)

• Các toán tử quan hệ == và != không làm việc tốt với kiểu số

thực

• Dấu = là phép gán, dấu == là toán tử quan hệ • Dấu && là phép AND logic, dấu & là toán tử AND trên bit • Dấu || là phép OR logic, dấu | là toán tử OR trên bit • Với các biểu thức phức tạp, nên sử dụng các phép kết hợp, giao hoán, phân phối, De Morgan để biến đổi thành đơn giản hơn

26

(minimumWage <= wages) && (wages <= maximumWage)

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Conditional structure Lệnh điều kiện : if và ?

27

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

if - dạng 1

true

expression statement

if (expression) ! statement;

l

e s a f

if (age >= 18) " Console.Write("You are eligible to vote.\n");

if (income >= 1400 || interest > 750) { " mustFile++; " deductions = 1; " adjustedIncome += 100; }

28

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

if - dạng 2

entry

true false expression

statement_1 statement_2

if (expression) ! statement_1; else ! statement_2;

if (wages <= maximumWage) " tax = 0.124 * wages; else " tax = 0.124 * maximumWage;

29

exit

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

if - câu đ.k. lồng nhau

entry

true false

exp_1

true true false false exp_3 exp_2

stat_3 stat_4 stat_1 stat_2

if (expression_1) ! if (expression_2) ! ! statement_1; ! else ! ! statement_2; else ! if (expression_3) ! ! statement_3; ! else ! ! statement_4;

30

exit

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Dangling else

mỗi else được ghép đôi với một if gấn nhất trước nó

true true exp_1 exp_2 stat_1

false false

stat_2

if (expression_1) ! if (expression_2) ! ! statement_1; else

statement_2;

true true exp_1 exp_2 stat_1

false false

if (expression_1) { ! if (expression_2) ! ! statement_1; } else ! statement_2;

31

stat_2

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

if - dạng 4

expression_1

statement_1

true

false

expression_2

statement_2

true

false

if (expression_1) ! statement_1; else if (expression_2) ! statement_2; else if (expression_3) ! statement_3;

expression_3

statement_3

true

. . .

false

expression_m

statement_m

true

else if (expression_m) ! statement_m; else ! statement_n;

statement_n

32

false

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Lượng giá toán tử logic

• E1 và E2 là các biểu thức logic • if (E1 && E2)

nếu E1 là false thì cả biểu thức là false và E2 sẽ không được tính

• if (E1 || E2)

nếu E1 là true thì cả biểu thức là true và E2 sẽ không được tính

if (n != 0 && 100 / n > min)

if (n != 0) if (100 / n > min)

33

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Toán tử điều kiện

(exp_1) ? (exp_2) : (exp_3)

true false

• Nếu exp_1 là true, giá trị trả về sẽ là kết

quả của exp_2

exp_1

• Nếu exp_1 là false, giá trị trả về sẽ là kết

quả của exp_3

• Dấu mở / đóng ngoặc là không cần thiết về

mặt cú pháp

• Được sử dụng vì toán tử ? có độ ưu tiên cao

hơn

max = (x > y) ? x : y;

min = (x < y) ? x : y;

index = (index+1 == size) ? 0 : ++index;

34

return exp_2 return exp_3

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Ví dụ 1 - chỉ số độ lạnh của gió Tính chỉ số độ lạnh của gió (wind-chill index) thông qua nhiệt độ (temperature) của không khí theo đơn vị 0F và tốc độ gió (wind speed) theo đơn vị mph (dặm/giờ). Sử dụng công thức sau :

temperature

wind ≤ 4mph,

91.4 − (10.45 + 6.69 wind

windChillIndex =

4mph < wind ≤ 45mph,

−0.447wind) *

91.4 − temperature 22.0

1.6 * temperature − 55.0

wind > 45mph.

⎧ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎩

35

Monday, October 22, 12

Các cấu trúc điều khiển Lê Viết Mẫn - lvman@hce.edu.vn

Ví dụ 2 - tính số ngày Tính số ngày từ đầu năm (dayNumber) theo giá trị đưa vào của month (1..12), ngày trong tháng day và năm year.

36

Monday, October 22, 12

Các cấu trúc điều khiển Lê Viết Mẫn - lvman@hce.edu.vn

Selective structure Lệnh lựa chọn : switch

37

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

yes

switch

exp==const_1

statements

break

lựa chọn dựa trên giá trị nguyên, chuỗi, ký tự hoặc bool của một biến hay một biểu thức

no

exp==const_2

statements

yes

break

no

exp==const_3

yes

statements

exp==const_4

no

yes

break

no

default ?

statements

yes

break

no

switch (expression) { ! case const_1: statement_1; ! ! ! ! break; ! case const_2: statement_2; ! case const_3: ! case const_4: statement_3; ! ! break; ! ! ! case const_5: break; !... ! default:! statement_m; ! ! break; ! ! }

38

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Ví dụ

39

switch (age) { " case 1: " case 2: " case 3: Console.Write("Get a babysiter !\n"); break; " case 4: " case 5: " case 6: " case 7: " case 8: " case 9: Console.Write("Movies rated G would be okay.\n"); break; " case 10: " case 11: " case 12: " case 13: " case 14: " case 15: Console.Write("Movies rated G or PG would okay.\n"); break; " case 16: " case 17: Console.Write("Movies rated R might be okay.\n"); break; " default: Console.Write("Movies rated R would be okay.\n"); break; }

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Kiểu liệt kê • Kiểu liệt kê là một tập những hằng số nguyên được đặt tên

• Một biến được khai báo kiểu liệt kê có thể nhận một giá trị bất kỳ trong tập

các giá trị của kiểu đó

• enum identifier[:base-type] {enumeration_list}; base-type là kiểu dữ liệu của mỗi thành phần (mặc định int)

định danh đầu tiên được gán giá trị 0, sau đó tăng lên một cho những định danh sau

có thể xác định giá trị cho các định danh này

• •

enum Weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} enum Month {January = 1, February = 2, March = 3, April = 4, May = 5, June = 6, July = 7, August = 8, September = 9, October = 10, November = 11, December = 12} enum Temperatures:byte {WickedCold = 0, FreezingPoint = 32, LightJacketWeather = 60, SwimmingWeather = 72, BoilingPoint = 100}

Weekday d; Month m;

d = Month.Tuesday; if (Weekday.February < m)

40

enumeration_list sử dụng dấu phẩy để phân cách các định danh

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Ví dụ

enum Month {January, February, March, April, May, June, July,

August, September, October, November, December};

Month m = Month.February;

if ((((year % 4) == 0) && ((year % 100) != 0)) " || ((year % 400) == 0)) " numberOfDays = 29; else " numberOfDays = 28; break;

switch (m) { " case February: " " " " " " " " " " " " " case April: " case June: " case September: " case November: numberOfDays = 30; break; " default: numberOfDays = 31; break; }

41

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Ví dụ - kích cỡ áo tắm

Viết chương trình tính kích cỡ áo tắm phụ nữ dựa trên chiều cao (hieght) và cân nặng (weight) sử dụng công thức sau :

x = floor(

height −

weight − 2.4)

y = floor(

height −

weight − 20.5)

1 10 1 4

1 50 1 20

y = 0 y = 1 y = 2 y = 3

x = 1 A

B

C

D

x = 0

E

F

42

Monday, October 22, 12

Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn

Cảm ơn sự chú ý Câu hỏi ?

43

Monday, October 22, 12

Các cấu trúc điều khiển 1 Lê Viết Mẫn - lvman@hce.edu.vn