Kĩ thuật lập trình - Các cấu trúc điều khiển (phần 2)
In tên tháng, năm
• In các thứ theo các cột
• 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;
31 trang |
Chia sẻ: huyhoang44 | Lượt xem: 1001 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Các cấu trúc điều khiển (phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
v 1.0 - 10/2012
Các cấu trúc điều khiển
(phần 2)
1
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
chúng ta đã học...
2
Tuần tự Rẽ nhánh
Câu lệnh if, switch
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
chúng ta sẽ học...
3
Lặp
Câu lệnh for, while, do
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
Iteration structures
Lệnh lặp : for, while, do
4
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 25
for
for (statement_1; condition; statement_2)
! statement_3
statement_1
condition
true
false
statement_2
statement_3
• Có thể bỏ qua các thành phần trong vòng
lặp for
• 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
• statement_2 được dùng để cập nhật /
thay đổi giá trị của condition
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 26
for
for (statement_1; condition; statement_2)
! statement_3
statement_1
condition
true
false
statement_2
statement_3
for (int i = 0; i < 10; i++)
Console.WriteLine(i);
In ra các số từ 0 đến 9, mỗi số trên một dòng
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 27
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);
for (int i = 0; i < 100; i++) // phạm vi của biến i là trong vòng lặp
! Console.WriteLine(i);
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 28
Chú ý
• Lỗi. Biến i vượt quá phạm vi
• Không có lỗi vì biến i được khai báo bên ngoài
• Biến i thứ hai là một biến mới
for (int i = 0; i < 10; i++)
! Console.WriteLine(i);
if (i >= 0)
! Console.Write("i is big\n");
int i;
for (i = 0; i < 10; i++)
! Console.WriteLine(i);
if (i >= 0)
! Console.Write("i is big\n");
for (int i = 0; i < 10; i++)
! Console.WriteLine(i);
for (int i = 0; i < 20; i++)
! Console.WriteLine(i);
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 29
Ví dụ - tính giai thừa
Viết chương trình tính n! (n giai thừa)
n!= 1 n = 01*2 *..*n n ≥ 1
⎧
⎨
⎩
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
using System;
namespace Factorial
{
class Program
{
static void Main(string[] args)
{
int product = 1;
int n;
!
Console.Write("CALCULATE FACTORIAL OF A NUMBER\n\n");
!
Console.Write("Enter a number : ");
n = int.Parse(Console.ReadLine());
!
for (int i = 2; i <= n; i++)
// Tai thoi diem nay product = 1 * 2 * .. * (i-1) = (i-1)!
product = product * i;
!
Console.WriteLine("Factorial of {0} is {1}", n, product);
Console.ReadKey();
}
}
}
Các cấu trúc điều khiển 210
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
For lồng nhau
Các cấu trúc điều khiển 2
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
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
Kết quả
Các cấu trúc điều khiển 2
TABLE OF WIND-CHILL INDICES
degrees F: 50 40 30 20 10 0 -10 -20 -30 -40 -50 -60
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
12
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
Ví dụ
13
• Viết chương trình in ra bảng tính nhân dạng sau :
MULTIPLICATION TABLE
1 2 3 4 ... 12
2 4 6 8 ... 24
3 6 9 12 ... 36
. . . . .
. . . . .
. . . . .
12 24 36 48 ... 144
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 214
while
while (condition)
! statement;
condition
true
false
statement
• Đ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
• statement phải chứa câu lệnh làm thay đổi
condition
Trong khi điều kiện còn hiệu lực (true) thì tiếp tục làm việc này
int n = 0;
while (n < 10)
! Console.WriteLine(n++);
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);
n = n + 1;
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 215
Ví dụ
int n = 100;
while (n > 0)
! Console.WriteLine(n--);
getDate(m, d, y);
while (!isLegalDate(m, d, y))
{
! Console.Write("Not a valid date, try again.\n\n");
! getDate(m, d, y);
}
In ngược các số từ 100 đến 1, mỗi số trên một dòng
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
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 216
do
do
{
! statement;
} while (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
condition
true
false
statement
Chạy cái gì đó trong khi điều kiện đang còn hiệu lực (true)
int n = 0;
do
{
Console.WriteLine(n++);
}while (n < 10);
In ra các số từ 0 đến 9, mỗi số trên một dòng
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 217
Ví dụ
int numberOfDigits = 0;
int rest = number;
do
{
! rest = rest / 10;
! numberOfDigits++;
} while (rest != 0);
Đếm số chữ số của một số
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
So sánh
18
Câu lệnh for while do
Lưu đồ
Số lần lặp Xác định Không xác định Không xác định
Số lần lặp
tối thiểu 0 0 1
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
• 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 while và do : thực hiện bước kiểm tra
• Lệnh Environment.Exit(int);
• Thoát khỏi chương trình
19
Ngắt vòng lặp
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
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
}
for (int n=10; n>0; n--) {
! if (n==5) continue;
! Console.Write("{0}, ", n);
}
20
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
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 221
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).
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
double! left;
double! right;
char! op;
while (true)
{
Console.Write("A\tadd\n");
Console.Write("S\tsubtract\n");
! Console.Write("M\tmultiply\n");
! Console.Write("D\tdivide\n");
! Console.Write("E\texit\n");
Console.Write("Operation?: ");
op = char.Parse(Console.ReadLine());
! if (op == 'E' || op == 'e')
! ! Environment.Exit(0);
! Console.Write("Enter the left hand operand: ");
left = double.Parse(Console.ReadLine());
! Console.Write("Enter the right hand operand: ");
! right = double.Parse(Console.ReadLine());
! switch (op)
! {
! ! case 'A' :
! ! case 'a' :
Console.WriteLine(left + right);
! ! ! break;
! ! case 'S' :
! ! case 's' :
Console.WriteLine(left - right);
! ! ! break;
! ! case 'M' :
! ! case 'm' :
Console.WriteLine(left * right);
! ! ! break;
! ! case 'D' :
! ! case 'd' :
Console.WriteLine(left / right);
! ! ! break;
! }
Console.WriteLine();
}
Các cấu trúc điều khiển 222
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 223
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 :
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
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
Hướng dẫn
• In tên tháng, năm
• In các thứ theo các cột
• 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;
24
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
Debugging
Gỡ lỗi
25
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)
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
Các loại lỗi (bug)
26
• 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
• Các lỗi ngữ nghĩa mà không làm crash chương trình
• Kết quả chương trình không đúng
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
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
27
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 228
Các lệnh điều khiển gỡ lỗi
if (expression)
{
! Console.Write("true");
! ...
}
else
{
! Console.Write("false");
! ...
}
for (int i = 0; i < exp; i++)
{
! Console.Write("loop {0}", i);
! ...
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 229
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
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Các cấu trúc điều khiển 2
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
30
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
Cảm ơn sự chú ý
Câu hỏi ?
Các cấu trúc điều khiển 231
Monday, September 9, 13
Các file đính kèm theo tài liệu này:
- 05_cac_cau_truc_dieu_khien_2_1849.pdf