Các bước thiết kế thuật toán

Một phần của tài liệu Giáo trình Tin học đại cương - ĐH Sư phạm TP HCM (Trang 347 - 356)

Chương 7 Bài toán và thuật toán

7.4 Các bước thiết kế thuật toán

 Bước 1: Xác định vấn đề bài toán (input, output)

 Bước 2: Hình thành ý tưởng chính để để xây dựng thuật toán (bài toán giải bằng cách nào? Thuật toán sẽ dừng khi nào?)

 Bước 3: Xây dựng thuật toán (ngôn ngữ tự nhiên, lưu đồ, mã giả)

 Bước 4: Mô phỏng để kiểm tra tính đúng đắn của thuật toán (chạy thử bằng tay) Một số ví dụ

Ví dụ 1: Kiểm tra một số nguyên a là số chẵn hay số lẻ

 Xác định bài toán

 Input: số nguyên a

 Output: thông báo a chẵn hay lẻ

 Hình thành ý tưởng

 Một số là số chẵn khi nó chia hết cho 2, vậy thì ta chỉ cần kiểm tra xem nó có chia hết cho 2 hay không.

 Xây dưng thuật toán:

Cách 1: Dùng ngôn ngữ tự nhiên

Giáo trình Tin học đại cương

Bản quyền thuộc Khoa Công nghệ thông tin Trang 343

Trường ĐH Sư phạm Tp. Hồ Chí Minh

Bước 1: Nhập a

Bước 2: Nếu a chia hết cho 2 thì xuất a chẵn Ngược lại thì xuất a lẻ. Qua bước 3

Bước 3: Kết thúc Cách 2: Dùng lưu đồ

Hình 7.2Lưu đồ khối thuật toán kiểm tra số chẵn

 Mô Phỏng thuật toán:

Nhập a: 18  xuất ra: 18 là số chẵn Ví dụ 2: Tìm số lớn nhất trong dãy số

 Xác định vấn đề - bài toán:

 Input: Số nguyên dương N và dãy N số nguyên a1, a2, …, aN (ai với i : 1N).

Giáo trình Tin học đại cương

 Output: Số lớn nhất (Max) của dãy số.

 Lựa chọn phương pháp giải:

 Đặt giá trị Max  a1.

 Cho i chạy từ 2 đến N, so sánh giá trị ai với giá trị Max, nếu ai> Max thì Max nhận giá trị mới là ai.

 Max là giá trị lớn nhất cần tìm

 Hình thành ý tưởng:

Ví dụ dãy số này bị che kín bằng các tấm bìa, ta lật tấm đầu tiên và xem như nó là lớn nhất, ta lần lượt lật các tấm bìa còn lại, mỗi lần lật ta so sánh với tấm bìa đầu tiên, tấm nào lớn hơn giá trị lớn nhất thì ta thay lại giá trị lơn nhất đó. Khi nào hết dãy số thì ta đưa ra số lớn nhất.

 Xây dựng thuật toán:

Cách 1: Dùng ngôn ngữ tự nhiên Bước 1: Nhập N và dãy a1,a2…, aN;

Bước 2: Max  a1; i  2;

Bước 3: Nếu i > N thì đưa ra giá trịMax rồi kết thúc;

Bước 4: Nếu ai > Max thì Max  ai;

Bước 5: i  i+1 rồi quay lại B3.

Cách 2: Dùng sơ đồ khối

Hình 7.3Lưu đồ khối thuật toán tìm số lớn nhất trong dãy số

Giáo trình Tin học đại cương

Bản quyền thuộc Khoa Công nghệ thông tin Trang 345

Trường ĐH Sư phạm Tp. Hồ Chí Minh

 Mô Phỏng thuật toán:

Với dãy số A: 3, 6, 7, 2, 8, 4 (N=6) Max3, i2

i<N, a2=6>Max vậy Max6, ii+1 =3 i<N, a3=7>Max vậy Max7, ii+1 =4 i<N, a4=2<Max vậy Max7, ii+1 =5 i<N, a5=8>Max vậy Max8, ii+1 =6 i=N, a6=4>Max vậy Max8, ii+1 =7 i>N vậy Max = 8, kết thúc

7.5 Chuyển đổi bài toán thành chương trình máy tính

7.5.1 Khái niệm về ngôn ngữ lập trình & chương trình máy tính

Con người liên lạc với nhau thông qua ngôn ngữ, tạo ra các mẫu từ ngữ và âm thanh. Ngôn ngữ lập trình cũng tương tự như vậy, đó là một tập từ ngữ và ký hiệu cho phép lập trình viên hoặc người dùng có thể nói chuyện với máy tính. Cũng giống như tiếng Anh, tiếng Tây Ban Nha hoặc tiếng Trung Quốc và những ngôn ngữ tiếng nói khác, ngôn ngữ lập trình cũng có các luật được gọi là cú pháp (syntax) để đảm bảo ngôn ngữ đó được vận dụng một cách chính xác.

Ðó là một tập các chỉ thị (instruction) được sắp xếp theo một trật tự định trước nhằm hướng dẫn máy tính thực hiện các thao tác, hành động cần thiết để đáp ứng một mục tiêu đã định trước của con người như truy xuất dữ liệu, tìm kiếm, giải bài toán, ...Các chỉ thị này có thể được viết bằng nhiều ngôn ngữ lập trình khác nhau.

7.5.2 Các loại ngôn ngữ lập trình thông dụng

Có hàng trăm loại ngôn ngữ lập trình khác nhau, mỗi loại ngôn ngữ đều có cú phápriêng của nó.

Một số ngôn ngữ thì được phát triển để dùng trên các loại máy tính chuyên biệt, một số ngôn ngữ khác thì - do sự thành công của nó - đã trở thành chuẩn và được áp dụng trên đa số các máy tính.

Ngôn ngữ lập trình có thể được phân chia thành 3 loại chính : ngôn ngữ máy, hợp ngữ và ngôn ngữ cấp cao.

7.5.2.1 Ngôn ngữ máy

Ngôn ngữ máy (mã máy) là ngôn ngữ nền tảng của bộ vi xử lý. Các chương trình được viết trong tất cả các loại ngôn ngữ khác cuối cùng đều được chuyển thành ngôn ngữ máy trước khi chương trình đó được thi hành. Vì tập lệnh của ngôn ngữ máy phụ thuộc vào loại vi xử lý nên ngôn ngữ

Giáo trình Tin học đại cương

máy sẽ khác nhau trên những máy tính có sử dụng bộ vi xử lý khác nhau. Lợi điểm của viết chương trình bằng ngôn ngữ máy là lập trình viên có thể điều khiển máy tính trực tiếp và đạt được chính xác điều mình muốn làm. Do đó, các chương trình ngôn ngữ máy được viết tốt là những chương trình rất hiệu quả (tốc độ thi hành nhanh, kích thước nhỏ). Bất lợi của chương trình ngôn ngữ máy là thông thường sẽ mất rất nhiều thời gian để viết, rất khó đọc, theo dõi để tìm lỗi. Thêm vào đó, bởi vì chương trình được viết bằng tập lệnh phụ thuộc vào bộ vi xử lý nên chương trình chỉ chạy được trên những máy tính có cùng bộ vi xử lý mà thôi. Ngôn ngữ máy cũng được gọi là ngôn ngữ cấp thấp (low-level language).

7.5.2.2 Hợp ngữ

Hợp ngữ được phát triển nhằm giúp các lập trình viên dễ nhớ các chỉ thị của chương trình hơn.

Hợp ngữ tương tự như ngôn ngữ máy nhưng lại sử dụng các ký hiệu gợi nhớ (mnemonics hay mã lệnh hình thức - symbolic operation code) để biểu diễn cho các mã lệnh của máy. Một đặc điểm khác nữa là hợp ngữ thông thường cho phép định địa chỉ hình thức (symbolic addressing), nghĩa là một vị trí bộ nhớ trong máy tính có thể được tham chiếu tới thông qua một cái tên hoặc ký hiệu, chẳng hạn như TOTAL thay vì phải sử dụng địa chỉ thực sự của nó (bằng con số nhị phân) trong ngôn ngữ máy. Các chương trình hợp ngữ còn bao gồm các chỉ thị vĩ mô (macro instruction) có thể tạo ra nhiều lệnh mã máy. Các chương trình hợp ngữ được chuyển sang mã máy thông qua một chương trình đặc biệt gọi là trình hợp dịch (assembler). Mặc dù hợp ngữ tương đối dễ dùng hơn mã máy nhưng hợp ngữ vẫn được xem là ngôn ngữ cấp thấp bởi vì nó vẫn còn rất gần với từng thiết kế của máy tính.

7.5.2.3 Ngôn ngữ cấp cao

Cuộc cách mạng của ngôn ngữ máy tính bắt đầu với sự phát triển của ngôn ngữ cấp cao vào cuối thập kỷ 1950 và 1960. Ngôn ngữ cấp cao gần gũi hơn với ý niệm ngôn ngữ mà hầu hết mọi người đều biết, nó bao gồm các danh từ, động từ, ký hiệu toán học, liên hệ và các thao tác luận lý. Các yếu tố này có thể được phối hợp, liên kết với nhau tạo thành một hình thức của câu. Các "câu"

này được gọi là các mệnh đề của chương trình (program statement). Chính vì những đặc điểm này, các lập trình viên dễ dàng đọc và dễ học ngôn ngữ cấp cao hơn so với ngôn ngữ máy hoặc hợp ngữ. Một lợi điểm quan trọng là ngôn ngữ cấp cao thông thường không phụ thuộc vào máy tính, nghĩa là các chương trình viết bằng ngôn ngữ cấp cao có thể chạy trên các loại máy tính khác nhau (sử dụng các bộ vi xử lý khác nhau).

7.5.3 Trình thông dịch và biên dịch

Giáo trình Tin học đại cương

Bản quyền thuộc Khoa Công nghệ thông tin Trang 347

Trường ĐH Sư phạm Tp. Hồ Chí Minh

Mọi chương trình được viết bằng các ngôn ngữ không phải là ngôn ngữ máy cuối cùng đều phải được chuyển đổi sang ngôn ngữ máy trước khi được thi hành. Chương trình ngôn ngữ cấp cao được dịch sang ngôn ngữ máy bằng một trong hai cách : bằng trình biên dịch (compiler) hoặc trình thông dịch (interpreter).

7.5.3.1 Trình biên dịch :

Sẽ chuyển đổi toàn bộ chương trình sang mã máy, rồi chứa kết quả vào đĩa để có thể thi hành về sau. Chương trình ngôn ngữ cấp cao được chuyển đổi được gọi là chương trình nguồn (source program) và chương trình ngôn ngữ máy được tạo ra được gọi là chương trình đối tượng (object program) hoặc mã đối tượng (object code). Khi người dùng muốn chạy chương trình, chương trình đối tượng sẽ được nạp lên bộ nhớ chính của CPU và các chỉ thị của chương trình sẽ được thi hành. Khi được hướng dẫn bởi các chỉ thị của chương trình, CPU sẽ truy xuất dữ liệu và tạo ra các kết quả. Trình biên dịch sẽ kiểm tra cú pháp chương trình, thực hiện các phép kiểm tra logic và đảm bảo các dữ liệu sắp được sử dụng trong các phép so sánh, tính toán đã được định nghĩa một cách hợp lý ở một nơi nào đó trong chương trình. Một chức năng quan trọng của trình biên dịch là nó sẽ tạo ra một danh sách lỗi của tất cả mệnh đề trong chương trình vi phạm cú pháp của ngôn ngữ. Danh sách này giúp lập trình viên dễ dàng sửa đổi chương trình.

Do ngôn ngữ máy phụ thuộc vào bộ vi xử lý nên các máy tính khác nhau sẽ cần có các trình biên dịch khác nhau đối với cùng một ngôn ngữ cấp cao. Ví dụ, một máy mainframe, máy mini và máy tính cá nhân cần có các trình biên dịch khác nhau để biên dịch cùng một chương trình nguồn sang mã máy của từng loại máy này.

7.5.3.2 Trình thông dịch

Thay vì chuyển đổi toàn bộ chương trình nguồn như trình biên dịch, trình thông dịch chỉ chuyển đổi một mệnh đề của chương trình và thực hiện đoạn mã kết quả ngay, sau đó nó tiếp tục chuyển đổi mệnh đề thứ 2 rồi thi hành đoạn mã kết quả thứ 2 và cứ thế. Khi sử dụng trình thông dịch, mỗi lần chạy chương trình là mỗi lần chương trình nguồn được thông dịch sang ngôn ngữ máy.

Không có chương trình đối tượng nào được tạo ra.

Các trình thông dịch thường được dùng trên các máy tính cá nhân không có đủ bộ nhớ hoặc sức mạnh tính toán cần thiết để dùng trình biên dịch. Lợi điểm của trình thông dịch là lập trình viên vẫn có thể chạy một chương trình vẫn còn lỗi cú pháp. Chỉ đến lúc thông dịch đến câu lệnh có lỗi cú pháp, quá trình thi hành chương trình mới bị ngừng lại và trình thông dịch sẽ thông báo lỗi.

Ðiểm bất lợi là các chương trình thông dịch chạy không nhanh bằng các chương trình được biên

Giáo trình Tin học đại cương

dịch vì quá trình chuyển đổi sang ngôn ngữ máy được thực hiện cùng với quá trình thi hành chương trình. Vì lý do này, ngày nay, đa số các ngôn ngữ cấp cao đều dùng trình biên dịch.

7.5.4 Các ngôn ngữ lập trình thông dụng

Mặc dù đã có hàng trăm ngôn ngữ lập trình được sinh ra, chỉ có một số ít là được sử dụng rộng rãi và được xem là một chuẩn công nghiệp. Các ngôn ngữ này đều có thể được sử dụng trên nhiều loại máy tính khác nhau.

BASIC: viết tắt của cụm từ Beginner's All-Purpose Symbolic Instruction Code, được phát triển bởi John Kermeny và Thomas Kurtz vào năm 1964 tại trường đại học Dartmouth. Ban đầu, họ thiết kế BASIC là một ngôn ngữ lập trình đơn giản, có tính tương tác để các sinh viên học tập và sử dụng. BASIC đã trở thành một trong những ngôn ngữ lập trình thông dụng nhất được sử dụng trên các máy vi tính và máy tính mini ngày nay.

COBOL: viết tắt của COmmon Business Oriented Language, được giới thiệu vào năm 1960. Ðược hỗ trợ bởi bộ quốc phòng Hoa Kỳ, COBOL được phát triển bởi một hội đồng bao gồm các đại diện từ phía chính phủ và công nghiệp. Grace M.Hopper là người chính yếu trong hội đồng và được xem là nhà phát triển chính của ngôn ngữ COBOL. COBOL đã từng là một trong những ngôn ngữ được dùng rộng rãi nhất cho các ứng dụng thương mại. Bằng cách dùng một hình thức tựa tiếng Anh, các câu lệnh của COBOL được sắp xếp vào trong các câu và nhóm lại thành từng đoạn (paragraph). Hình thức tiếng Anh giúp COBOL dễ viết và đọc nhưng cũng làm cho chương trình nguồn dài hơn. COBOL rất tốt trong việc xử lý các tập tin lớn và thực hiện nhưng phép tính thương mại tương đối đơn giản.

C: được phát triển bởi tác giả Dennis Ritchie tại phòng thí nghiệm Bell vào năm 1972.

Ban đầu, C được thiết kế như là một ngôn ngữ để viết các phần mềm hệ thống, nhưng ngày nay, nó được xem là một ngôn ngữ công dụng chung. C là một ngôn ngữ lập trình mạnh mẽ đòi hỏi kỹ năng lập trình chuyên nghiệp mới có thể sử dụng hiệu quả được. Nhu cầu dùng C để phát triển nhiều loại phần mềm kể cả các ứng thương mại đang gia tăng.

Các chương trình C thường được dùng với hệ điều hành Unix (phần lớn hệ điều hành Unix được viết bằng C).

FORTRAN: viết tắt của FORmula TRANslator được phát triển bởi một nhóm lập trình viên của công ty IBM dưới sự lãnh đạo của John Backus. Công bố vào năm 1957, FORTRAN được thiết kế như là một ngôn ngữ lập trình dành cho các nhà khoa học, kỹ sư và toán học. FORTRAN được xem như là ngôn ngữ lập trình cấp cao đầu tiên và được chú ý bởi khả năng của nó cho phép dễ dàng diễn đạt và tính toán các phương trình toán học.

Giáo trình Tin học đại cương

Bản quyền thuộc Khoa Công nghệ thông tin Trang 349

Trường ĐH Sư phạm Tp. Hồ Chí Minh

PASCAL: ngôn ngữ sẽ được sử dụng để giảng dạy trong giáo trình này, được phát triển vào năm 1968 bởi Niklaus Wirth, một nhà khoa học máy tính tại Zurich, Thụy Sĩ. Pascal được phát triển để giảng dạy lập trình. Tên Pascal không phải là từ viết tắt, đó là tên của một nhà toán học, Blaise Pascal (1623 - 1662) người đầu tiên tạo ra máy tính. Pascal, dùng trong cả máy tính cá nhân và máy tính lớn là một trong những ngôn ngữ lập trình đầu tiên được phát triển trong đó khuyến khích phương pháp lập trình cấu trúc.

ALGOL (ALGOrithmetic Language): ngôn ngữ lập trình cấu trúc dùng cho các ứng dụng khoa học và toán học.

APL(AProgramming Language). Một ngôn ngữ mạnh mẽ, dễ dùng, rất tốt trong việc xử lý dữ liệu được lưu dưới dạng bảng (ma trận)

FORTH: tương tự như C, tạo ra các mã chương trình nhanh và hiệu quả. Ban đầu được phát triển để điều khiển kính viễn vọng không gian.

LISP - LISt Processing: ngôn ngữ trí tuệ nhân tạo thông dụng.

LOGO: chủ yếu được biết đến như là một công cụ để dạy khả năng giải quyết vấn đề.

MODULA-3: tương tự như PASCAL, dùng chủ yếu để phát triển các phần mềm hệ thống.

PILOT -Programmed Inquiry Learning Or Teaching: dùng bởi các nhà giáo dục để viết các chương trình hướng dẫn CAD.

PL/I - Programming Language/ One: ngôn ngữ thương mại và khoa học phối hợp nhiều chức năng của FORTRAN và COBOL.

PROLOG - PROgramming Logic: dùng trong trí tuệ nhân tạo.

RPG - Report Program Generator: dùng các mẫu đặc biệt để giúp người dùng xác định dữ liệu vào, dữ liệu ra và các yêu cầu tính toán của một chương trình.

ADA: lấy tên của Augusta Ada Bryon, người được xem là đã viết chương trình đầu tiên, được thiết kế để phục vụ cho việc viết, bảo trì các chương trình lớn trong một khoảng thời gian dài.

Giáo trình Tin học đại cương

Bài tập chương 7

Hãy xây dựng thuật toán (dùng cả 3 loại: ngôn ngữ tự nhiên, lưu đồ, mã giả) cho các bài toán sau:

1. Thiết kế thuật toán theo phương pháp dùng ngôn ngữ tự nhiên cho các bài toán sau:

a) Kiểm tra 2 số a, b giống nhau hay khác nhau.

b) Kiểm tra 1 số a chẵn hay lẻ

c) Giải phương trình bậc 2: ax2 + bx + c = 0

2. Thiết kế thuật toán theo phương pháp dùng phương pháp lưu đồ cho các bài toán sau:

a) Nhập vào 4 số xuất ra phần tử lớn nhất và nhỏ nhất?

b) Kiểm tra xem 1 số n có phải là số nguyên tố?

c) Kiểm tra xem 1 số n có phải là số hoàn thiện?

Thiết kế thuật toán theo phương pháp dùng phương pháp mã giả cho các bài toán sau:

3. Có n hộp có khối lượng khác nhau và một cái cân dĩa. Tìm cách cân để tìm được hộp có trọng lượng nặng nhất.

4. Tìm ước số chung lớn nhất của a và b.

5. Nhập vào 3 số nguyên dương, kiểm tra xem 3 số đã cho có tạo thành tam giác không?

Nếu có là tam giác gì? (Đều, cân, vuông, vuông cân, thường).

6. Mô phỏng thuật toán (Chạy tay) 7. Kiểm tra số nguyên tố (19, 20, 27, 29) 8. Tìm UCLN của (12,15), (19, 27), (24,45) 9. Tìm max trong dãy số: 1, 6 , 3, 15, 7, 9, 4 10. Sắp xếp dãy số tăng dần: 1, 6 , 3, 15, 7, 9, 4

Một phần của tài liệu Giáo trình Tin học đại cương - ĐH Sư phạm TP HCM (Trang 347 - 356)

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

(359 trang)