Các cấu trúc điều khiển (phần 2)
1
v 1.0 - 10/2012
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
chúng ta đã học...
Tuần tự
Rẽ nhánh Câu lệnh if, switch
2
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
chúng ta sẽ học...
Lặp Câu lệnh for, while, do
3
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Enum • Khai báo enum là thành phần của lớp
class Program { enum Weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
static void Main(string[] args) {
• Nhập liệu kiểu Enum
• Nhập vào số tương ứng giá trị của một thành phần trong kiểu enum
Weekday day;
• Nhập vào chuỗi ký tự của một thành phần trong kiểu enum Console.Write("Nhap vao thu dang chuoi :"); // Nhập vào chuỗi “Sunday” day = (Weekday)Enum.Parse(typeof(Weekday), Console.ReadLine());
4
Console.Write("Nhap vao thu dang so :"); // Nhập vào số 1 day = (Weekday)Convert.ToInt32(Console.ReadLine()); // kết quả là Monday
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Iteration structures Lệnh lặp : for, while, do
5
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
for
for (statement_1; condition; statement_2) ! statement_3
statement_1
• Có thể bỏ qua các thành phần trong vòng
lặp for
false condition
•
statement_2 true
•
statement_3 statement_1 được dùng để khởi tạo và chỉ được thực hiện 1 lần
•
condition là biểu thức kiểm tra điều kiện lặp lại
•
statement_3 là một lệnh đơn hoặc lệnh kép mà ta muốn được thực hiện nhiều lần
6
statement_2 được dùng để cập nhật / thay đổi giá trị của condition
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
for
for (statement_1; condition; statement_2) ! statement_3
statement_1
In ra các số từ 0 đến 9, mỗi số trên một dòng
false condition
statement_2 true
f o r ( i n t i = 0 ; i < 1 0 ; i + + )
statement_3
7
C o n s o l e. W r i t e L i n e ( i ) ;
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ
int i, j;
for (i = 0; i < 10; i++) " Console.WriteLine(i);" " " " " " // in ra tu 0 - 9
for (i = 0; i < 10; i += 2) " Console.WriteLine(i);" " " " " " // in cac so 0, 2, 4, 6, 8
for (i = 0, j = 0; i < 10 && j < 5; i += 2, j++) // toán tử dấu phẩy " Console.WriteLine(“{0}\t{1}”, i, j);
8
for (int i = 0; i < 100; i++) // phạm vi của biến i là trong vòng lặp " Console.WriteLine(i);
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Chú ý • Lỗi. Biến i vượt quá phạm vi
for (int i = 0; i < 10; i++) " Console.WriteLine(i); if (i >= 0) " Console.Write("i is big\n");
• Không có lỗi vì biến i được khai báo bên ngoài
int i; for (i = 0; i < 10; i++) " Console.WriteLine(i); if (i >= 0) " Console.Write("i is big\n");
• Biến i thứ hai là một biến mới
for (int i = 0; i < 10; i++) " Console.WriteLine(i); for (int i = 0; i < 20; i++) " Console.WriteLine(i);
9
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ - tính giai thừa
Viết chương trình tính n! (n giai thừa)
n! =
1 1* 2 * ..* n
n = 0 n ≥ 1
⎧ ⎨ ⎩
10
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
For lồng nhau
float windChillIndex;
Console.WriteLine("TABLE OF WIND-CHILL INDICES");
Console.Write("degrees F:"); for (int j = 5; j >= -6; j--) Console.Write("{0,5}",10*j); // tieu de cot Console.Write("\n\n");
for (int i = 0; i <= 10; i++) { Console.Write("{0} mph:", 5 * i); for (int j = 5; j >= -6; j--) { if (i <= 4) windChillIndex = j; else if (i <= 45) windChillIndex = (float)(91.4f - (10.45f + 6.69
* Math.Sqrt(i) - 0.447 * i) * (91.4f - j) / 22);
else windChillIndex = 1.6f * j - 55; Console.Write("{0,5}", Math.Floor(windChillIndex + 0.5));
} Console.WriteLine();
} Console.ReadKey();
11
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Kết quả
TABLE OF WIND-CHILL INDICES degrees F: 50 40 30 20 10 0 -10 -20 -30 -40 -50 -60
12
0 mph: 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 5 mph: 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 10 mph: 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 15 mph: 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 20 mph: 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 25 mph: 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 30 mph: -3 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -16 35 mph: -7 -8 -9 -10 -11 -13 -14 -15 -16 -17 -18 -19 40 mph: -10 -11 -12 -13 -15 -16 -17 -18 -19 -20 -22 -23 45 mph: -13 -14 -15 -16 -17 -19 -20 -21 -22 -24 -25 -26 50 mph: -15 -16 -18 -19 -20 -21 -23 -24 -25 -26 -28 -29
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ • Viết chương trình in ra bảng tính nhân dạng sau :
13
MULTIPLICATION TABLE 1 2 3 4 ... 12 2 4 6 8 ... 24 3 6 9 12 ... 36 . . . . . . . . . . . . . . . 12 24 36 48 ... 144
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Trong khi điều kiện còn hiệu lực (true) thì tiếp tục làm việc này
while
while (condition) ! statement;
false condition
• Điều kiện được đặt ở đầu vòng lặp
statement có thể không được thực hiện lần nào
true
• •
statement phải chứa câu lệnh làm thay đổi condition
In ra các số từ 0 đến 9, mỗi số trên một dòng
int n = 0; while (n < 10) " Console.WriteLine(n++);
int n = 0; while (n < 10) { " Console.WriteLine(n); n = n + 1; }
14
statement
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ
In ngược các số từ 100 đến 1, mỗi số trên một dòng
int n = 100; while (n > 0) " Console.WriteLine(n--);
Nhận vào ngày tháng năm, nếu ngày tháng nhập vào không hợp lệ thì yêu cầu nhập lại
getDate(m, d, y); while (!isLegalDate(m, d, y)) { " Console.Write("Not a valid date, try again.\n\n"); " getDate(m, d, y); }
15
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Chạy cái gì đó trong khi điều kiện đang còn hiệu lực (true)
do
statement
do { !statement; } while (condition);
true
condition
• Điều kiện được đặt ở cuối vòng lặp statement được thực hiện ít nhất một lần
• •
statement phải chứa câu lệnh làm thay đổi condition
In ra các số từ 0 đến 9, mỗi số trên một dòng
int n = 0; do { Console.WriteLine(n++); }while (n < 10);
16
false
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ
Đếm số chữ số của một số
int numberOfDigits = 0; int rest = number; do { "rest = rest / 10; "numberOfDigits++; } while (rest != 0);
17
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
So sánh
for
while
do
Câu lệnh
Lưu đồ
Số lần lặp
Xác định
Không xác định
Không xác định
0
0
1
Số lần lặp tối thiểu
18
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ngắt vòng lặp • Lệnh break;
•
kết thúc vòng lặp chứa lệnh này (chương trình tiếp tục với các câu lệnh sau vòng lặp này) • Lệnh continue;
bỏ qua các lệnh còn lại trong vòng lặp
tiếp tục với bước lặp tiếp theo
• •
Lệnh for : thực hiện bước cập nhật rồi kiểm tra
• •
• Lệnh Environment.Exit(int);
• Thoát khỏi chương trình
19
Lệnh while và do : thực hiện bước kiểm tra
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ - ngắt vòng lặp
Sắp xếp lại mảng sao cho, giá trị ở phần đầu lớn hơn v, phần sau nhỏ hơn v
In các con số từ 10 đến 1, ngoại trừ số 5
for (;;) { " while (a[++i] < v); " while (a[--j] > v); " " if (j <= i) " " break; " " swap(i, j); //đổi chỗ hai giá trị trong mảng tại i, j }
20
for (int n=10; n>0; n--) { " if (n==5) continue; " Console.Write("{0}, ", n); }
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ 1 - máy tính
Viết chương trình cho phép thực hiện các phép tính cộng, trừ, nhân, chia cho hai số được nhập vào từ bàn phím. Chương trình sẽ lặp lại việc tính toán này cho đến khi người sử dụng bấm ký tự E hoặc e (Exit).
21
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ 2 - in lịch
Viết chương trình in lịch theo tháng, năm và kiểu lịch in theo dạng sau :
22
October, 1948 Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
In tên tháng, năm
In các thứ theo các cột
Hướng dẫn • • •
In các ngày ứng với các cột thứ •
Phải in ngày mồng 1 vào đúng cột của thứ tương ứng. Các ngày tiếp theo được in liên tiếp, khi gặp ngày thứ 7 thì phải in xuống dòng mới
Tính ngày cuối cùng của tháng lastDayOfMonth
Tính ngày tuyệt đối (absoluteDays) cho ngày 1 tháng cần in lịch
• • • firstWeekdayOfMonth = absoluteDays % 7; • firstSaturday = 7 - firstWeekdayOfMonth;
23
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Debugging Gỡ lỗi
Xem thêm tại Chương 3, sách Lập trình Visual C# thế nào ? Tập 1 (Dương Quang Thiện)
24
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Các loại lỗi (bug) • Lỗi cú pháp - syntax error
Lỗi lúc biên dịch - Compile-time error
Lỗi dễ thấy nhất, xảy ra khi viết câu lệnh không đúng qui tắc của ngôn ngữ
• • •
Trình biên dịch sẽ thông báo cho chúng ta thông qua những thông điệp sai lầm / các cảnh báo (Error List)
• Lỗi ngữ nghĩa - semantic error
Lỗi lúc chạy chương trình - runtime error
Ý nghĩa câu lệnh không đúng như mong muốn
• • • Chương trình bị gãy đổ (crash) cùng với thông báo lỗi hoặc không
• Lỗi logic - logic error
Kết quả chương trình không đúng
• Các lỗi ngữ nghĩa mà không làm crash chương trình •
25
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Test • Định nghĩa trước các trường hợp có thể xảy ra lỗi • Kiểm tra (chạy) chương trình với các trường hợp đó để xem
chương trình có bị lỗi dự kiến hay không • Nếu không - chương trình được viết tốt cho trường hợp đó • Nếu có - tìm nguyên nhân gây ra lỗi và sửa chữa chương trình
• Tìm nguyên nhân gây ra lỗi • Các lệnh điều khiển gỡ lỗi • Công cụ debugger
26
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Các lệnh điều khiển gỡ lỗi
for (int i = 0; i < exp; i++) { "cout << "loop " << i << endl; "... }
if (expression) { "cout << "true" << endl; "... } else { "cout << "false" << endl; "... }
27
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Tìm hiểu các bước lặp
double a = 0.0; for (int i = 0; i < f(a); i++) { " int x = ...; " int y = ...; "a = f(x + i * y); }
a
i
x
y
x+i*y
0.0
0
5
14
36.78
36.8
1
19
8
95.03
28
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Chốt ngừng - breakpoint • Là một dấu hiệu báo cho debugger biết tạm ngưng thi hành
chương trình ở điểm nào đó • Chương trình lúc này ở chế độ ngắt (break mode) • Chương trình tạm ngưng thi hành và có thể tiếp tục chạy nếu bạn muốn • Các hoạt động của các biến, hàm, đối tượng bị “đóng băng”
Bạn có thể quan sát tình trạng, giá trị các biến, biểu thức và hàm
• • Có thể thay đổi giá trị các biến • Có thể cho thực thi tiếp từng dòng lệnh trong đoạn mã
• Sử dụng thanh công cụ Debug
• Mỗi breakpoint còn hỗ trợ các Hit Count và Condition
29
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn
Cảm ơn sự chú ý Câu hỏi ?
30
Sunday, October 28, 12
Các cấu trúc điều khiển 2 Lê Viết Mẫn - lvman@hce.edu.vn