K  THU T L P TRÌNH

TRẦN MINH THÁI – minhthai@huflit.edu.vn

www.minhthai.edu.vn

PHẠM ĐỨC THÀNH – phamducthanh@huflit.edu.vn

www.phamthao.com

1 9/17/16 Trần Minh Thái - Phạm Đức Thành

Mục tiêu – Kiến thức

v PP lập trình có cấu trúc, kỹ thuật phân tích và

thiết kế CT có cấu trúc.

v Kỹ thuật xử lý, tổ chức cấu trúc dữ liệu theo nhu cầu của từng bài toán, theo vấn đề cần giải quyết. Đồng thời trình bày minh hoạ một số bài toán ứng dụng tiêu biểu của các cấu trúc dữ liệu này.

v Kỹ thuật đệ quy và bài toán quy hoạch động cơ

bản.

v PP tổ chức dữ liệu, kỹ thuật lập trình tối ưu và

kiểm thử tính đúng đắn của CT.

2 9/17/16 Trần Minh Thái - Phạm Đức Thành

Mục tiêu – Kỹ năng

v Phân tích giải thuật và thể hiện giải thuật trên

ngôn ngữ lập trình C#.

v Module hóa CT, áp dụng các kỹ thuật lập trình đệ quy, quy hoạch động để giải quyết một số bài toán cụ thể.

v Cài đặt được các CT bằng ngôn ngữ C# để giải quyết các bài toán dựa trên các cấu trúc dữ liệu hướng giải quyết vấn đề.

v Thực hiện được việc phân tích và kiểm thử CT.

3 9/17/16 Trần Minh Thái - Phạm Đức Thành

Thái độ của sinh viên

v Chuẩn bị bài trước khi đến lớp. v Tích cực tham gia lớp học đầy đủ. v Yêu thích các học phần lập trình.

4 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nhiệm vụ sinh viên v Chuẩn bị đọc tài liệu/bài học trước khi lên lớp. v Làm trước các bài tập thực hành quy định,

trước khi lên lớp giờ thực hành.

v Tham dự tối thiểu 80% số tiết học lý thuyết. v Tham gia đầy đủ 100% giờ thực hành. v Thực hiện đầy đủ các bài tập nhóm. v Tham dự kiểm tra giữa học kỳ, kết thúc học

phần.

v Chủ động tổ chức thực hiện giờ tự học.

5 9/17/16 Trần Minh Thái - Phạm Đức Thành

Đánh giá

ể ể

ố ế t ậ ượ

ầ Đi m thành ph n ầ Đi m chuyên c n ậ Đi m bài t p

c

ọ Tr ng s 10% 10%

ế

Đi m bài t p nhóm

5%

ượ

ậ ỹ ả

10%

ự ể Đi m th c hành  (bài t p)ậ

ố ờ

tra

ể ki m

Quy đ nhị ự ọ ổ ố ế S  ti t tham d  h c/t ng s  ti ố S  bài t p đã làm/s  bài t p đ giao. ­ Báo cáo/thuy t minh/... ­ Đ c nhóm xác nh n có tham gia. ­ Báo cáo/k  năng, k  x o th c  hành/.... ­ Tham gia 100% s  gi ấ ­ Thi th c hành/v n đáp (45 phút)

15%

ế

ế

50%

ế

ế

t lý thuy t và

ể Đi m  gi a kữ ỳ ể Đi m  thi  k t  thúc  ầ ọ h c ph n 9/17/16

­ Thi vi t (90 phút) ự ủ ­ Tham d  đ  80% ti ờ ự  th c hành 100% gi Trần Minh Thái - Phạm Đức Thành

6

Tài liệu tham khảo

ậ ậ

Giáo trình chính [1] T p Slide bài gi ng môn K  thu t l p trình

ư

ươ

ế

ươ

ệ Tài li u tham  kh o thêm

t và Đ ng Bình  Ph

ế ậ ậ

ư

ư ệ ủ

Các lo i tài li u  khác

[2] Tr n Đan Th , Nguy n Thanh Ph ng, Đinh Bá  ỹ ng, K   Ti n, Tr n Minh Tri thu t  l p  trình  ,    ĐHKHTN  TPHCM,  NXB  KH  và  ườ KT, 2014 (th  vi n c a tr ng, th  quán ĐHKHTN  TPHCM). [3]  Thomas  H.  Cormen  et  al,  Introduction  to  Algorithms,  The  MIT  Press,  McGraw­Hill  Book  Company, 2010 (website/google). [4] Website MSDN: http://msdn.microsoft.com [5] Tr n Minh Thái, Giáo trình K   thu t l p trình,  2012 (website tác gi

ậ ậ : ả www.minhthai.edu.vn)

7 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nội dung

8 9/17/16 Trần Minh Thái - Phạm Đức Thành

Ch

ng 1

ng pháp l p

ươ ề ươ T ng quan v  ph trình có c u trúc

ấ t)ế

(3 ti

9 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nội dung

v 1.1. Đặt vấn đề v 1.2. Giới thiệu kỹ thuật lập trình có cấu trúc v 1.3. Cấu trúc lệnh và cấu trúc dữ liệu v 1.4. Các nguyên lý lập trình v 1.5. Phương pháp phân tích và thiết kế

chương trình có cấu trúc

v 1.6. Tóm tắt chương

10 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.1] Đặt vấn đề

11 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.1] Đặt vấn đề

12 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.2] Giới thiệu LT có cấu trúc

13 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.3] Cấu trúc lệnh vs Cấu trúc DL v Thuật toán là tập hữu hạn các lệnh, thao tác cơ bản trên tập các đối tượng đầu vào, thực hiện một chức năng, công việc cụ thể, nhằm thu được kết quả đầu ra mong muốn.

14 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.3] Cấu trúc lệnh vs Cấu trúc DL

15 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc lệnh – rẽ nhánh

ệ Đi u ki n

Đúng

L nhệ

static void Main(string[] args) { Console.Write("Nhap n="); int n = int.Parse(Console.ReadLine()); if (n < 0) n = -n; Console.WriteLine("n={0}",n); }

16 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc lệnh – rẽ nhánh

Sai

ệ Đi u ki n

Đúng

ườ

ng

L nh cho tr ợ

h p đúng

ệ L nh cho  ợ ườ ng h p sai

tr

17 9/17/16

if (n % 2 == 0) Console.WriteLine("{0} chan",n); else Console.WriteLine("{0} le", n); Trần Minh Thái - Phạm Đức Thành

Cấu trúc lệnh – lựa chọn

switch (n) { case 1: Console.WriteLine(“One"); break; case 2: Console.WriteLine(“Two"); break; ......... case 9: Console.WriteLine(“Nine"); break; default: Console.WriteLine(“Else”); break;

}

18 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc lệnh – lặp

Khởi gán

Đúng

Kiểm tra biểu thức điều kiện

Thực hiện các câu lệnh

Dừng

Tăng/giảm chỉ số

19 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc lệnh - lặp

static void Main(string[] args) { Console.Write("Nhap n="); int n = int.Parse(Console.ReadLine()); for(int i=1; i<=n; i++) Console.Write("{0,4}", i); }

20 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc lệnh – lặp

static void Main(string[] args) { Console.Write("Nhap n="); int n = int.Parse(Console.ReadLine()); int i=1; while (i <= n) { Console.Write("{0,4}", i); i++; } }

21 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc lệnh – lặp

static void Main(string[] args) { Console.Write("Nhap n="); int n = int.Parse(Console.ReadLine()); int i=1; do { Console.Write("{0,4}", i); i++; }while (i <= n) ; }

22 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc dữ liệu

23 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc dữ liệu

24 9/17/16 Trần Minh Thái - Phạm Đức Thành

Cấu trúc dữ liệu

25 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.4] Các nguyên lý lập trình

v Nguyên lý tối thiểu v Nguyên lý địa phương v Nguyên lý an toàn v Nguyên lý nhất quán

26 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nguyên lý tối thiểu

v Tập nguyên tắc v Tối thiểu

Ø Cấu trúc lệnh Ø Kiểu dữ liệu + phép toán

v Hệ thống thư viện

27 9/17/16 Trần Minh Thái - Phạm Đức Thành

Công cụ tối thiểu

v Tập các phép toán v Tập các lệnh vào ra cơ bản v Thao tác trên các kiểu dữ liệu có cấu trúc cơ

bản

28 9/17/16 Trần Minh Thái - Phạm Đức Thành

Tập các phép toán

v Phép toán số học cơ bản: +, - , *, %, / v Phép toán số học mở rộng: ++, --, +=, ... v Phép toán so sánh: >, <, <=, >=, ==, != v Phép toán logic: &&, ||, ! v Các toán tử thao tác trên bit: &, |, ^, >>, <<

(không sử dụng cho số thực)

(kiểu)

v Toán tử chuyển đổi kiểu: v Thứ tự ưu tiên các phép toán

29 9/17/16 Trần Minh Thái - Phạm Đức Thành

Tập các lệnh vào/ ra cơ bản

v string Chuoi=Console.ReadLine(); v char kytu =char.Parse( Console.ReadLine());

v StreamReader

=

new

sr StreamReader("data.txt");

v string S=sr.ReadLine(); v char kyTu = char.Parse( sr.ReadLine());

30 9/17/16 Trần Minh Thái - Phạm Đức Thành

Tập các lệnh vào/ ra cơ bản

v Console.WriteLine("{0}", Chuoi); v Console.WriteLine("{0}", kytu);

v StreamWriter

=

new

sw StreamWriter("data.txt");

v sw.WriteLine("{0}", S); v sw.WriteLine("{0}", kyTu);

31 9/17/16 Trần Minh Thái - Phạm Đức Thành

Thao tác trên KDL có cấu trúc

v Thao tác trên chuỗi v Thao tác trên file v Thao tác trên cấu trúc

32 9/17/16 Trần Minh Thái - Phạm Đức Thành

Thao tác trên chuỗi

v int index=S.IndexOf(kyTu); v int index=S.IndexOf(Chuoi); v int kq= S1.CompareTo (S); v S1 = S; v S1 = S1 +" "+S; v S1= S1.ToLower(); v S1 = S1.ToUpper(); v int len = S1.Length;

33 9/17/16 Trần Minh Thái - Phạm Đức Thành

Thao tác trên file

v StreamReader sr; v StreamWriter sw; v sr = new StreamReader("data_input.txt"); v sw = new StreamWriter("data_out.txt"); v sr.Close(); v sw.Close(); v string S = sr.ReadLine(); v sw.WriteLine(S); v if(sr == null) { } v if (sw == null) { }

34 9/17/16 Trần Minh Thái - Phạm Đức Thành

Thao tác trên KDL cấu trúc

public double

public char

Struct_Name strN; strN.thuocTinh_1 = 5; strN.thuocTinh_2 = 6; strN.thuocTinh_3 = 'a';

struct Struct_Name { public int thuocTinh_1; thuocTinh_2; thuocTinh_3; } Struct_Name strN1 = strN;

35 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nguyên lý địa phương

v Các biến cục bộ trong hàm dù có trùng tên với biến toàn cục không làm thay thay đổi giá trị biến toàn cục

v Tên các biến trong danh sách đối số của hàm

đều là hình thức

v Các biến khai báo bên trong hàm đều là các

biến cục bộ

v Khi phải sử dụng biến phụ nên dùng biến cục bộ. Hạn chế tối đa sử dụng biến toàn cục, tránh xảy ra các hiệu ứng phụ

36 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nguyên lý an toàn

v Lỗi cú pháp: (design time) v Lỗi cảnh báo (warning) v Lỗi khi chạy chương trình (run time error)

37 9/17/16 Trần Minh Thái - Phạm Đức Thành

Lỗi cú pháp: (design time)

v Khi viết chương trình v Ví dụ:

Ø Sai từ khóa Ø Sai cú pháp về cấu trúc lệnh, biểu thức Ø Thiếu các dấu ngoặc, dấu chấm phẩy khi

kết thúc lệnh

Ø Chưa khai báo nguyên mẫu hàm

(prototype)

38 9/17/16 Trần Minh Thái - Phạm Đức Thành

Lỗi cảnh báo (warning)

v Khi viết chương trình v Thường là khi ta khai báo biến mà không sử

dụng

v Khai báo biến mà không khởi gán giá trị v Lỗi do thứ tự ưu tiên phép toán

39 9/17/16 Trần Minh Thái - Phạm Đức Thành

Lỗi khi chạy chương trình

v Compiler không thể phát hiện lỗi này v Người lập trình gây ra khi thiết kế CT, xử lý

dữ liệu

v Phải testing mới phát hiện được v Phải chứng minh được tính đúng đắn của CT v Không lường trước được thông tin nhập vào

khi thiết kế CT: Ø Vòng lặp không có điểm dừng xác định Ø Công thức tính toán khi cài đặt chương

(lỗi logic)

40 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nguyên lý nhất quán

v Dữ liệu thao tác thế ấy v Cấu trúc dữ liệu  thao tác trên đó v Kiểu dữ liệu là một tên thể hiện: tập đối

tượng, miền xác định, thao tác

v Một biến thuộc: Kiểu dữ liệu xác định

Ø Kiểu cơ bản Ø Kiểu do người dùng tự định nghĩa

41 9/17/16 Trần Minh Thái - Phạm Đức Thành

Nguyên lý nhất quán

v Thao tác trên biến này phụ thuộc vào thao

tác được phép trên kiểu dữ liệu đó

v Hai kiểu dữ liệu khác nhau: tên khác nhau,

miền xác định và thao tác là khác nhau

v Kiểu ký tự: về nguyên tắc không được thực

hiện phép toán số học trên nó.

!!! Ngôn ngữ C# (họ hàng) xem kiểu ký tự là số nguyên (mã ASCII) => các phép toán số học vẫn được sử dụng

42 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.5] Phương pháp phân tích & thiết kế

v Phương pháp TOP-DOWN v Phương pháp BOTTOM-UP

43 9/17/16 Trần Minh Thái - Phạm Đức Thành

Phương pháp TOP-DOWN

v Quá trình phân tích bài toán được thực hiện

từ trên xuống.

v Từ vấn đề chung nhất đến cụ thể nhất. v Từ trừu tượng tổng quan đến đơn giản nhất là đơn vị chương trình (module – đơn thể)

44 9/17/16 Trần Minh Thái - Phạm Đức Thành

Phương pháp TOP-DOWN

45 9/17/16 Trần Minh Thái - Phạm Đức Thành

Phương pháp BOTTOM-UP

v Đi từ chi tiết cụ thể riêng biệt đến phần

chung nhất cao hơn.

v Từ các modul tới tổng thể chương trình. v Top-Down: ppháp phân rã vấn đề từ trên xuống, chủ yếu trong quá trình phân tích và thiết kế hệ thống chương trình.

v Bottom-up thường được sử dụng trong quá

trình cài đặt, viết chương trình.

46 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.6] Tóm tắt

v Ngôn ngữ LT bất kỳ đều dựa trên tập các cấu trúc lệnh điều khiển, các cấu trúc DL + phép toán được định nghĩa trên nó

v Người học nên lập trình từ các kiến thức cơ bản về câu lệnh, cú pháp, cấu trúc lệnh, dữ liệu và phép toán tương ứng trên nó (nguyên lý tối thiểu)

v Phân biệt hai loại biến toàn cục và địa phương. Giúp ta biết cách truyền tham biến (ref, out) hay truyền tham trị cho đối số của hàm

47 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.6] Tóm tắt

v Nguyên lý nhất quán: dữ liệu nào, thì phép

toán đó.

v Khi cài đặt nên lường trước và kiểm tra chặt

chẽ các lỗi có thể xảy ra.

v Phân rã từ vấn đề lớn thành các module nhỏ

gọi là top-down.

v Cài đặt chương trình từ các module đến lắp

ghép thành cả hệ thống gọi là bottom-up.

48 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.7] Bài tập

v Bài 1: VCT nhập vào số tự nhiên n. Tìm tất cả bộ 3 các số tự nhiên a, b, c sao cho a2 + b2 = c2, với a<=b<=c<=n;

v Bài 2: VCT nhập vào số tự nhiên n. In ra dãy

số Fibonaci nhỏ hơn n.

v Trong đó:

Ø

Ø

F0 = F1 = 1; Fn = Fn-1 + Fn-2

49 9/17/16 Trần Minh Thái - Phạm Đức Thành

[1.7] Bài tập

v Bài 3: VCT nhập vào số tự nhiên n. Liệt kê tất

cả các số nguyên tố nhỏ hơn n.

v Bài 4: VCT nhập vào số tự nhiên n. Liệt kê tất cả các số nguyên tố nhỏ hơn n dùng sàng Estheven.

v Bài 5: VCT nhập vào số tự nhiên n. Liệt kê tất cả các số nguyên tố nhỏ hơn n nằm trong cùng bậc hàng chục dùng sàng Estheven (Ví dụ: 11, 13, 15, 17).

50 9/17/16 Trần Minh Thái - Phạm Đức Thành

v Bài 6: Cho số nguyên dương n. VCT phân tích n ra thành các thừa số nguyên tố. Ví dụ: n=12=2*2*3.