1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Lý thuyết ngôn ngữ lập trình (Nghề Lập trình máy tính): Phần 1 - Tổng cục dạy nghề

65 15 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giáo Trình Lý Thuyết Ngôn Ngữ Lập Trình
Trường học Tổng cục dạy nghề
Chuyên ngành Lập trình máy tính
Thể loại giáo trình
Năm xuất bản 2012
Thành phố Hà Nội
Định dạng
Số trang 65
Dung lượng 623,28 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Giáo trình Lý thuyết ngôn ngữ lập trình (Nghề Lập trình máy tính): Phần 1 do Tổng cục dạy nghề biên soạn nhằm cung cấp cho bạn những kiến thức về sơ đồ mối liên hệ giữa các mô đun và môn học trong chương trình, giới thiệu tổng quan về ngôn ngữ lập trình, các loại dữ liệu cấu trúc. Mời các bạn tham khỏa!

Trang 2

Tuyên bố bản quyền :

Tài liệu này thuộc loại sách giáo trình

Cho nên các nguồn thông tin có thể được

phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo

Dự án giáo dục kỹ thuật và nghề nghiệp

Tiểu Ban Phát triển Chương trình Học liệu

………

Trang 3

Tài liệu này được thiết kế theo từng mô đun/ môn học thuộc hệ thống mô đun/mônhọc của một chương trình, để đào tạo hoàn chỉnh nghề Lập trình máy tính ở cấp trình độlành nghề và được dùng làm Giáo trình cho học viên trong các khoá đào tạo, cũng có thểđược sử dụng cho đào tạo ngắn hạn hoặc cho các công nhân kỹ thuật, các nhà quản lý vàngười sử dụng nhân lực tham khảo.

Đây là tài liệu thử nghiệm sẽ được hoàn chỉnh để trở thành giáo trình chính thứctrong hệ thống dạy nghề

Trang 4

MỤC LỤC

04 SƠ ĐỒ MỐI LIÊN HỆ GIỮA CÁC MÔ ĐUN VÀ MÔN HỌC TRONG

05: YÊU CẦU ĐÁNH GIÁ HOÀN THÀNH MÔN HỌC 8

10: BÀI 05: ĐẶC TRƯNG LẬP TRÌNH CÂU LỆNH(LẬP TRÌNH THỦ TỤC) 85

Trang 5

GIỚI THIỆU VỀ MÔN HỌC

Vị trí, ý nghĩa, vai trò môn học

Trong lĩnh vực công nghệ thông tin, không thể không nói đến các ngụn ngữ lập trỡnh Bởi

vỡ, chỳng là cụng cụ cần thiết giỳp cho chỳng ta làm việc và giao tiếp với mỏy tớnh điện tử

Vỡ vậy, việc nắm được các khái niệm cơ bản của các ngôn ngữ lập trỡnh là rất cần thiết đốivới những ai làm việc trong lĩnh vực cụng nghệ thụng tin hoặc cỏc lĩnh vực cú ứng dụngcụng nghệ thụng tin

Mục tiêu của môn học

Sau khi học xong môn học này học viên có khả năng:

Nắm được các khái niệm cơ bản của ngôn ngữ lập trỡnh chung, hiểu được các thành phần của một ngôn ngữ lập trỡnh, biết phõn biệt cỏc đặc trưng khác nhau của các ngôn ngữ lập trỡnh, nắm rừ cấu trỳc, quy trỡnh thực hiện của một ngụn ngữ lập trỡnh, nắm được xu hướng phát triển của các ngôn ngữ lập trỡnh hiện đại và biết cách lựa chọn ngôn ngữ thích hợp để viết chương trỡnh ứng dụng cụ thể

Mục tiêu thực hiện của môn học

Học xong môn học này học viên có khả năng:

Phân tích một bài toán thành các thành phần cấu trúc chương trình

 Phân tích chương trình nguồn thành các ứng dụng của kỹ thuật lập trình để giảiquyết các bài toán ứng dụng

 Đánh giá chất lượng của một chương trình

 Lựa chọn ngôn ngữ thích hợp cho lập trình ứng dụng

 Mô tả cấu trúc dữ liệu cho bài toán

 Xây dựng các thủ tục, hàm thực hiện các chức năng trên các ngôn ngữ lập trình

 Hiểu rõ các nguyên nhân sai sót khi biên tập chương trình, dịch và thực hiện chươngtrình

Nội dung chính của môn học

 Lịch sử của ngôn ngữ lập trình

 Giới thiệu tổng quan về Ngôn ngữ lập trình

 Các loại dữ liệu cấu trúc

 Hàm và thủ tục

 Đặc trưng cú pháp chương trình

 Đặc trưng ngữ nghĩa chương trình

 Đặc trưng lập trình câu lệnh

 Đặc trưng lập trình hướng đối tượng

 Ngôn ngữ lập trình hướng đối tượng

 Đặc trưng lập trình logic

 Đặc trưng lập trình Hàm

Trang 6

 Đặc trưng lập trình song song Logic có ký hiệu hàm

 Các phương pháp lập trình khác

 Vấn đề dịch ngôn ngữ

 Dịch ngôn ngữ cấp cao

 Lập trình di động (Mobile Code)

Trang 7

SƠ ĐỒ MỐI LIÊN HỆ GIỮA CÁC MÔ ĐUN VÀ MÔN HỌC TRONG CHƯƠNG TRÌNH

Lập trình căn bản Mạng căn bản

Kỹ năng Giao tiếp

Kỹ năng

Internet & WWW

Phần cứng máy tính

Lập trình nâng cao

Lập trình hướng đối tượng

Lập trình Web

Phân tích thiết

kế hệ thống

Thiết kế hướng đối tượng

Ứng dụng CNTT trong doanh nghiệp

Công nghệ phần mềm

Hướng dẫn đồ

án tốt nghiệp

Công nghệ Đa phương tiện Lập trình Visual Basic

Quản lý dự án phần mềm

Thi tốt nghiệp

Hệ cơ sở dữ liệu Môi trường PT

Phần mềm

Trang 8

YÊU CẦU VỀ ĐÁNH GIÁ HOÀN THÀNH MÔN HỌC

Kỹ năng thực hành:

- Sử dụng thành thạo phần mềm hỗ trợ thiết kế, hiểu được các ngôn ngữ lập trình

- Lập tài liệu phân tích thiết kế

- Hiểu được các kiểu dữ liệu và các loại ngôn ngữ lập trình

Thái độ học viên:

- Cẩn thận lắng nghe ý kiến và thảo luận trong nhóm thiết kế

- Học viên cần tuân thủ các bài tập thực hành theo thứ tự các chương, từ dễ đến khó

Đánh giá thông qua kiểm tra trắc nghiệm:

- Dùng phần mềm thi trắc nghiệm

- Kiểm tra trắc nghiệm có thể trên giấy hoặc trên máy tính

- Xây dựng ngân hàng câu hỏi, học viên sẽ nhận được một bộ để phát sinh ngẫu nhiên vàchất lượng các đề như nhau (trung bình, khá, giỏi, xuất sắc)

- Thời gian làm bài tuỳ theo số lượng các câu trong đề

- Thang điểm 10 chia đều cho các câu

- Kết quả đánh giá dựa vào bài làm theo điểm đạt được

Thực hành: Đánh giá thông qua khả năng giải hoàn thành chương trình (đề kiểm tra) đề ra.Thang điểm: (đánh giá câu hỏi trắc nghiệm)

0-49 : Không đạt

50-69 : Đạt trung bình

70-85 : Đạt khá

86-100 : Đạt Giỏi

Trang 9

Bài 1 TÊN BÀI:GIỚI THIỆU TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH

Mục tiêu thực hiện

- Nắm được các khái niệm cơ bản về ngôn ngữ lập trình

- Hiểu được lịch sử phát triển của ngôn ngữ lập trình

- Đánh giá sơ bộ về một ngôn ngữ lập trình

- Xác định lĩnh vực ứng dụng của ngôn ngữ lập trình

Nội dung chính

Giới thiệu lịch sử phát triến của ngôn ngữ lập trình và các khái niệm của chúng Chỉ ra các yếu tố ảnh hưởng đến sự phát triển của ngôn ngữ lập trình và các lĩnh vực ứng dụng của ngôn ngữ lập trình

I Lịch sử phát triển của ngôn ngữ lập trình

Những ngôn ngữ lập trình (programming language) đầu tiên trên máy tính điện tử là

ngôn ngữ máy (machine language), tổ hợp của các con số hệ nhị phân, hay các bit (binary digit) 0 và 1 Ngôn ngữ máy phụ thuộc vào hoàn toàn kiến trúc phần cứng của máy tính và

các quy ước khắt khe của nhà chế tạo Để giải các bài toán, những người lậ trình phải sửdụng một tập hợp các lệnh điều khiển rất sơ cấp mà mỗi lệnh là tổ hợp các bit nhị phân nêngặp rất nhiều khó khăn, mệt nhọc, rất dễ gặp phải sai sót, nhưng rất khó sửa lỗi

Từ những năm 1950, để giảm nhẹ việc lập trình, người ta đưa vào kỹ thuật chươngtrình con (sub-program hay sub-routine) và xây dựng các thư viện chương trình (library) đẻkhi cần thì gọi đến hoặc dùng lại các đoạn chương trình đã viết

Như thế, chúng ta nhận thấy ở vào giai đoạn sơ khai ban đầu của máy tính điện tử,việc sử dụng máy tính là rất khó khăn, vì ngôn ngữ lập trình là phương tiện giao tiếp lại quáphức tạp đối với người sử dụng Người sử dụng máy tính vào giai đoạn này chỉ là cácchuyên gia về tin học Như thế, ứng dụng của máy tính điện tử vẫn còn rất hạn chế

II Sự ra đời và thúc đẩy của ngôn ngữ lập trình

Cũng từ những năm 1950, ngôn ngữ hợp dịch, hay hợp ngữ (assembly) ra đời Trong hợp ngữ, các mã lệnh và địa chỉ các toán hạng được thay thế bằng các từ gợi nhớ, như ADD, SUB, JUMP, … tương ứng với các phép toán số học +, -, lệnh chuyển điều khiển, …

Trang 10

Do máy tính chỉ hiểu ngôn ngữ máy, các chương trình viết bằng hợp ngữ không thểchạy ngay được mà phải qua giai đoạn hợp dịch (assembler) thành ngôn ngữ máy Tuynhiên, hợp ngữ vẫn còn phụ thuộc nhiều vào phần cứng và xa lạ với ngôn ngữ tự nhiên,người lập trình vẫn gặp nhiều khó khăn khi giải các bài toán trên máy tính, đặc biệt là các bàitoán tương đối lớn.

Năm 1957, hãng IBM đưa ra ngôn ngữ FORTRAN (FORmula TRANslator) Đây làngôn ngữ lập trình đầu tiên gần gũi với ngôn ngữ tự nhiên với cách diễn đạt toán học.FORTRAN cho phép giải quyết nhiều loại bài toán khoa học, kỹ thuật và sau đó được nhanhchóng ứng dụng rất rộng rãi cho đến ngày nay với kho tàng thư viện thuật toán rất đồ sộ vàtiện dụng

Tiếp theo là sự ra đời của các ngôn ngữ ALGOL 60 (ALGOrithmic Language) vào năm

1960, COBOL (Common Business Oriented Language) vào năm 1964, Simula vào năm

1964, …

Theo sự phát triển của máy tính điện tử, các ngôn ngữ lập trình không ngừng được cảitiến và hoàn thiện đẻ ngày càng đáp ứng nhu cầu của người sử dụng và làm giảm nhẹ côngviệc lập trình Sự phát triển của ngôn ngữ lập trình đã làm xích gần lại “khoảng cách” giữangười sử dụng và máy tính, nghĩa là máy tính không còn chỉ được sử dụng bởi các chuyêngia tin học mà có thể được sử dụng bởi rất nhiều người trong nhiều lĩnh vực khác nhau.Rất nhiều ngôn ngữ lập trình đã được ra đời trên nền tảng lý thuyết tính toán và hình thành nên hai loại ngôn ngữ lập trình: ngôn ngữ bậc thấp và ngôn ngữ bậc cao

Các ngôn ngữ bậc thấp (low-level language) gồm hợp ngữ và ngôn ngữ máy, thườngđược dùng để viết các chương trình điều khiển và kiểm tra thiết bị, …

Các ngôn ngữ bậc cao (high-level language) là phương tiện giúp người làm tin học giảiquyết các vấn đề thực tế đồng thời cũng là nơi mà những thành tựu mới nhất của khoa họcmáy tính được đưa vào

Lĩnh vực nghiên cứu các ngôn ngữ lập trình vừa có tính truyền thống vừa có tính hiệnđại Ngày nay, với các tiến bộ của khoa học công nghệ, người ta đã có thể sử dụng cáccông cụ hình thức cho phép giảm nhẹ công việc xây dựng các hệ thống chương trình từphân tích, thiết kế cho đến sử dụng ngôn ngữ lập trình

Chúng ta có thể có cài nhìn toàn cảnh hơn về lích sử của các ngôn ngữ lập trình qua hình vẽ dưới đây:

Trang 11

Hình 1.Ngôn ngữ lập trình qua hình vẽ

III Phân loại các ngôn ngữ lập trình

Cho đến nay có hàng trăm ngôn ngữ lập trình được đề xuất nhưng trên thực tế chỉ có một số

ít ngôn ngữ được sử dụng rộng rãi Ngoài cách phân loại theo bậc như đã nói ở trên, người

ta còn phân loại ngôn ngữ lập trình theo phương thức (paradgm), theo mức độ quan trọng, theo thế hệ,

Cách phân loại theo mức hay bậc là dựa trên mức độ trừu tượng so với các yếu tố phần cứng, chẳng hạn như lệnh (instruction) và cấp phát bộ nhớ (memory allocation) dưới đây:

Thấp Lệnh máy đơn giản Truy cập và cấp phát trực tiếp Hợp ngữ

Cao Biểu thức và điều

kiện tương minh

Truy cập và cấp phát nhờ các phép gán

C, Pascal, Ada

Rất cao Máy trừu tượng Truy cập ẩn và tự động cấp

phát

Prolog, Miranda

Trang 12

Những năm gần đây, ngôn ngữ lập trình phát triển theo phương thức lập trình (cònđược gọi là phong cách hay kiểu lập trình) Một phương thức lập trình có thể được hiểu làmột tập hợp các tính năng trừu tượng đặc trưng cho một lớp ngôn ngữ mà có nhiều ngườilập trình thường xuyên sử dụng chúng Sau đây là sơ đồ minh họa sự phân cấp các phươngthức lập trình:

Sau đây là một sốngôn ngữ lập trình quen thuộc liệt kê theo phương thức:

 Các ngôn ngữ thủ tục (procedural language) có Fortran (1957), Cobol (1959),Basic (1965), Pascal (1971), C (1969), Ada (1975), …

 Các ngôn ngữ hướng đối tượng (object-oriented language) có Smalltalk (1971),C++ (1985), Eiffel (1990), Java (1995), C# (2000), …

 Các ngôn ngữ hàm (functional language) có Lisp (1958), ML (1973), Scheme(1975), Caml (1987), Miranda (1982), …

 Các ngôn ngữ dựa logic (logic-based language) chủ yếu là ngôn ngữ Prolog(1972)

 Các ngôn ngữ thao tác cơ sở dữ liệu SQL (1980),…

 Các ngôn ngữ xử lý song song như Ada, Occam (1982), C-Linda, …

Ngoài ra còn có một số phương thức lập trình đang được phát triển ứng dụng như:

 Lập trình phân bổ (distributed programming)

 Lập trình ràng buộc (constraint programming)

 Lập trình hướng truy cập (access-oriented programming)

 Lập trình theo luồng dữ liệu (dataflow programming)

Việc phân loại các ngôn ngữ lập trình theo mức độ quan trọng là dựa trên cái gì (what) sẽ thao tác được, hay tính được, so với cách thao tác như thế nào (how) Một ngôn ngữ thể hiện cái gì sẽ thao tác được mà không chỉ ra cách thao tác như thế nào được gọi là ngôn ngữ định nghĩa (definitional) hay ngôn ngữ khai báo (declarative) Một ngôn ngữ thể hiện cách thao tác như thế nào mà không chỉ ra cái gì sẽ thao tác được gọi là ngôn ngữ thao tác (operational) hay không khai báo (non-declarative), đó là các ngôn ngữ mệnh lệnh

Ngoài ra, các ngôn ngữ lập trình cũng được phân chia theo thế hệ như sau:

Trang 13

 Thế hệ 4: ngôn ngữ áp dụng hay hàm

 Thế hệ 5: ngôn ngữ suy diễn hay dựa logic

 Thế hệ 6: mạng nơ-ron (neural networks)

IV Vai trò và ảnh hưởng của phần cứng đối với ngôn ngữ lập trình

Ngôn ngữ lập trình liên quan chặt chẽ đến kiến trúc máy tính (phần cứng) mà nó chạytrên đó Chương trình viết bằng một ngôn ngữ, dù là ngôn ngữ đó thế nào đi nữa thì cũngphải chuyển sang mã máy để thực thi Ngôn ngữ máy gắn chặt vào kiến trúc máy tính, vì vậyhiểu quả thực thi của ngôn ngữ cũng phụ thuộc rất nhiều vào kiến trúc máy tính

Một kiến trúc máy tính xử lý tuần tự không thể thực hiện song song thật sự nhiều phátbiểu trong chương trình, dù cho dạng đặc tả trong ngôn ngữ là xử lý song song Một kiếntrúc máy tính chỉ cho phép đọc/ghi mỗi lần một từ nhớ không thể bảo đảm việc xử lý đồngthời cả một đối tượng dữ liệu, dù rằng dạng đặc tả của hầu như tấct cả các ngôn ngữ lậptrình hiện nay là thao tác trên cả một đối tượng dữ liệu

Kiến trúc may tính cũng ràng buộc quá trình thiết kế ngôn ngữ chạy trên máy tính đó.Ngôn ngữ lập trình càng xa ngôn ngữ máy bao nhiêu thì càng khó thực hiện bấy nhiêu.Trong trường hợp đó chương trình dich sẽ phức tạp và đòi hỏi mô phỏng nhiều Quá trìnhdịch cũng sẽ sinh ra những đaọn mã máy thừa, và do đó khó đạt được hiệu quả cao trongviệc sử dụng phần cứng máy tính

Kiến trúc của hầu hết máy tính hiện nay là kiến trúc Von Neumann Kiến trúc VonNeumann có hai đặc điểm đáng chú ý sau:

 Các lệnh được xử lý tuần tựtheo thứ tự sắp xếp trong bộ nhớ Đặc điểm này thểhiện rõ ở các ngôn ngữ lập trình thủ tục, trong đó các phát biểu được thực hiệntheo thứ tự sắp xếp trong chương trình Các quá trình mang bản chất xử lý songsong không thể được thực hiện một cách hiệu quả trên kiến trúc Von Neumann

 Chỉ cho phép đọc/ghi mỗi lần một từ nhớ Kết quả là đối tượng dữ liệu phải bịphân nhỏ ra trước khi đọc/ghi đối tượng dữ liệu đó Quá trình xử lý dữ liệu dovậy bị chậm đi gây nên sự tắc nghẽn trong ”giao thông” các đối tượng dữ liệu.Giả sử s là một biến chuỗi, phép gán s:= ‘abc’ không làm thay đổi tức thời đối tượng

mà thông qua việc cắt từng kí tự của chuỗi ở vế phải vào s

Các đối tượng dữ liệu kiểu bản ghi, như trong ngôn ngữ Pascal, không được xuất hiệnnhư sự xuất hiện của nó với tư cách là một thực thể hoàn chỉnh trong chương trình Chẳnghạn, phép gán x := y, với x và y là hai biến cùng một kiểu bản ghi, được thực hiện bằng cáchđọc từng thành phần của y và chi vào thành phần tương ứng của x Bản thân mỗi thànhphần x và y lại tiếp tục bị phân rã trong quá trình đọc/ghi

Ngay cả việc đọc/ghi đối tượng dữ liệu đơn giản như số nguyên dài hai từ nhớ(longint) cũng phải được thực hiện hai lần

Các phương thức lập trình mới như lập trình hàm, lập trình hướng đối tượng, lập trìnhlogic đang từ bỏ dần dần kiến trúc Von Neumann Lisp là ngôn ngữ điển hình của họ lậptrình hàm, tuy nhiên các đặc tính hàm ban đàu của Lisp cũng đã bị sửa đổi để có thể cài đặthiệu quả trên kiến trúc máy tính cổ điển Prolog đại diện cho họ ngôn ngữ lập trình logic, làmột công cụ đặc tả vấn đề tốt, nhưng hiệu quả của nó chưa được như mong muốn do cách

Trang 14

giải quyêt vấn đề trên đặc tả của ngôn ngữ bị hạn chế bởi cơ chế điều khiển của kiến trúcmáy tính hiện thời.

Tóm lại, vì sự ảnh hưởng đáng kể của phần cứng như vừa trình bày đối với ngôn ngữlập trình, bước nhảy vọt thật sự trong ngôn ngữ lập trình, với một ngôn ngữ mới thay đổi tậngốc, chỉ có khi có một kiến trúc máy tính mới bảo đảm cho sự cài đặt hiệu quả của ngônngữmới trên đó

V Các thuộc tính của ngôn ngữ lập trình tốt

Một ngôn ngữ lập trình tốt cần phải thỏa mãn một số yêu cầu cơ bản sau đây: dễ viết,

kê hay hàm không thể trả về kết quả kiểu dãy hoặc kiểu bản ghi cũng gây trở ngại cho ngườilập trình trong một số trường hợp

Một ví dụ khác là khai niệm đệ quy Đệ quy không chỉ là một kỹ thuật để lập trình màcòn là công cụ để tư duy Có những vấn đề mà người lập trình không nghĩ ra một cách giảiquyết nào khác ngoài cách sử dụng đệ quy Vì vậy, ngôn ngữ cần cho phép gọi đệ quy cácchương trình con Tuy nhiên, các ngôn ngữ bậc cao đầu tiên như Fortran, Cobol không chophép gọi đệ quy Muốn thực hiện lời giải đệ quy trên các ngôn ngữ này phải gỡ đệ quy, tức

là chuyển lời giải đệ quy thành lời giải lặp

Ngôn ngữ phải đơn giản, để dễ học, dễ nhớ và dễ nắm vững Ngôn ngữ không nênđưa ra quá nhiều khái niệm làm cho người sử dụng thấy rối rắm Chẳng hạn, như ngôn ngữ

C có quá nhiều toán tử Nếu như trong Pascal các toán tử Not, And và Ỏ được dùng chungcho kiểu dữ liệu logic và kiểu dữ liệu số học thì trong C lại có sự phân biệt: các toán tử !, &&,

|| dùng cho kiểu logic còn các toán tử ~, & và | dùng cho kiểu dữ liệu số học Số lượng toán

tử nhiều, các kí hiệu lại gần giống nhau và không gợi nhớ đã làm tăng tính phức tạp củangôn ngữ C

Ngôn ngữ phải linh hoạt, không nên quá gò bó vào một nguyên tắc nào đó Chẳng hạnmột trong những nguyên tắc của ngôn ngữ Pascal là: mỗi cấu trúc điều khiển chỉ có một ngõvào và một ngõ ra Nó ngăn cấm sự kết thúc bất thường từ bên trong vòng lặp For và cácvòng lặp có điều kiện như While và Repeat, cũng như không cho nhiều điểm trở về trongchương trình con Nguyên tắc này nhằm đảm bảo tính cấu trúc của chương trình nhưng đôikhi cũng gây trở ngại cho người lập trình Ngôn ngữ C linh hoạt hơn với các phát biểu Break

và Return Ví dụ, trong trường hợp sau, phát biểu Return của C tránh được các phát biểu iflồng nhau:

Bằng C:

p ()

Trang 15

Ngôn ngữ cần đảm bảo cho cấu trúc chương trình phản ánh được cấu trúc của vấn đềcần giải quyết Chương trình cũng như các bộ phận của chương trình cần thể hiện đượcchúng làm những gì, trước khi người đọc cần biết những điều đó được thực hiện như thếnào.

Các cấu trúc điều khiển của ngôn ngữ chỉ nên có một ngõ vào và một ngõ ra để ngườiđọc có thể theo dõi dễ dàng từng bộ phận của chương trình từ trên xuống dưới Cũng dovây ngôn ngữ cần có các cấu trúc điều khiển để thay thế phát biểu goto Phát biểu goto làmchương trình trở nên khó đọc, vì người đọc không thể đọc chương trình một mạch từ trênxuống, mà luôn phải dò theo các đích của goto

Việc cho phép dấu gạch ngang dưới trong danh hiệu sẽ làm cho danh hiệu dễ đọchơn

Các từ khóa của ngôn ngữ cũng cần phải gợi nhớ

Trang 16

Ngoài ra, các chú thích trong chương trình là cách thức hữu hiệu để nâng cao tính dễđọc của chương trình.

Với các ngôn ngữ lập trình hiện nay, tính dễ đọc của chương trình còn tùy thuộc vàoviệc người đọc có quen thuộc với ngôn ngữ dùng để viét chương trình hay không, cũng nhưphong cách và phương pháp lập trình của người viết chương trình

C Tính tin cậy (reliability)

Tính tin cậy của ngôn ngữ lập trình được đánh giá trên khả năng mà ngôn ngữ có thểbảo đảm được cho tính tin cậy của chương trình viết bằng ngôn ngữ đó Không có một địnhnghĩa rõ ràng cho tính tin cậy của chương trình Một cách không hình thức, chương trìnhđược xem là tin cậy nếu xác xuất chạy đúng của nó cao trong quá trình sử dụng

Nói chúng để chương trình có độ tin cậy cao, ngôn ngữ cần hạn chế sự xuất hiện củacác lỗi không thể ngờ được Lỗi đó có thể sinh ra do một cấu trúc ngữ pháp nhiều ngữnghĩa Ví dụ phát biểu sau đây trong Fortran:

Sum (i, j) = i + j

Có hai nghĩa: (1) đó là định nghĩa hàm tổng của hai đối số nguyên, (2) hoặc đó là phépgán một biểu thức vào dãy biến Nếu người lập trình quên khai báo biến dãy Sum thì phátbiểu trên sẽ được hiểu theo nghĩa thư nhất, chứ không phải là nghĩa thứ hai như mongmuốn (việc quên khai báo biến trong Fortran là bình thường vì Fortran cho phép sử dụngbiến mà không cần khai báo)

Hiệu ứng lề cũng là nguồn gây ra lỗi Hiệu ứng lề, theo nghĩa rộng là hiệu ứng phụxuất hiện thường ngoài ý muốn, khi sử dụng một cấu trúc ngôn ngữ nào đó của ngôn ngữ

Ví dụ, trong Pascal hiệu ứng lề nảy sinh do sự thay đổi trị của biến không cục bộ trong cácchương trình con mà biến có ý nghĩa

Ngôn ngữ cần kiểm tra chặt chẽ sự tương hợp kiểu của các biến trong biểu thức vàphép gán, sự tương hợp của danh sách thông số của chương trình con ở nơi gọi và nơi địnhnghĩa Lấy ví dụ đơn giản là phép gán một giá trị thực vào biến nguyên Nếu không có sựkiểm tra kiểu và báo lỗi, mà tự động đổi kiểu thì kết quả sau đó sẽ bị sai lệch đi vì giá trị thực

đã bị cắt hoặc làm tròn phần lẽ để thành giá trị nguyên

Các bộ phận của chương trình cần có tính độc lập đối với nhau cao, cho phép kiểm trariêng rẽ tính đúng đắn từng bộ phận của chương trình Tính dễ sửa đổi cũng liên quan vớitính tin cậy, vì trong quá trình sửa đổi tính tin cậy vần phải được duy trì Sự độc lập của các

bộ phận của chương trính sẽ làm cho việc sửa đổi dễ dàng hơn; việc sửa đổi ở một bộ phận

sẽ không ảnh hưởng đến các bộ phận còn lại cảu chương trình

Tính tin cậy đôi khi lại có thể bị ảnh hưởng bởi tính dễ viết của chương trình Bởi vìngôn ngữ quá linh hoạt dễ viết thì có thể khó làm chủ bởi người viết chương trình, có nghĩa

là chương trình dễ xảy ra lỗi hơn

Cuối cùng, tính tin cậy của ngôn ngữ còn phụ thuộc vào sự cài đặt ngôn ngữ ấy, tức làphụ thuộc vào chất lượng của chương trình dịch

Các lĩnh vực ứng dụng của ngôn ngữ lập trình

Vào những năm 1950, khi máy tính điện tử mới ra đời, ngôn ngữ lập trình chỉ là ngônngữ máy hoặc cao hơn là hợp ngữ Cho nên, việc xây dựng các ứng dụng tin học là rất

Trang 17

phức tạp và khó khăn Vì thế, vào giai đoạn này ứng dụng của ngôn ngữ lập trình là rất hạnchế.

Đi đôi với sự phát triển của phần cứng và sự ra đời của rất nhiều ngôn ngữ lập trìnhkhác nhau, khả năng và lĩnh vực ứng dụng của ngôn ngữ lập trình trở nên rất phong phú.Dưới đây là một số ngôn ngữ lập trình và lĩnh vực ứng dụng của chúng:

 Xây dựng các hệ thống thông tin quản lý trong các lĩnh vực sản xuất, xã hội, kinh

tế, : Delphi, Visual Basic, Access, SQL,

 Xây dựng các hệ thống phân tán: Java, Corba, C++,

 Xử lý ảnh và mô hình hóa hình học: C++, Matlab,

 Xây dựng các hệ chuyên gia: Prolog

 Giải quyết các bài toán trong lĩnh vực trí tuệ nhân tạo: Lisp, Scheme, Prolog,

 Xây dựng các hệ thống thời gian thực: C, Ada

 Xây dựng các hệ thống nhúng, điều khiển thiết bị: C, Assembly,

VI Các lĩnh vực ứng dụng của ngôn ngữ lập trình

Hiện nay, số người quen với máy tính, với việc lập trình ngày một nhiều, PC đã trở nênphổ biến Nhu cầu được giao tiếp với thế giới bên trong máy tính không chỉ là một sở thích,hay công việc riêng tư của những người làm tin học nữa Chỉ với vốn tiếng Anh tương đối,một chút trợ giúp là bạn đã có thể trở thành một nhà lập trình rồi, thế nhưng đó chỉ là cácđiều kiện cần mà chưa đủ Số lượng trình biên dịch, chủng loại, tính năng ngày một phongphú, để chọn cho mình một ngôn ngữ lập trình, một trình biên dịch phù hợp với công việcchuyên môn cũng như nhu cầu học tập, nghiên cứu, bạn không thể không khỏi có nhữngđắn đo Những gì sau đây có thể giúp ích cho bạn ?

Để có cho mình một công cụ lập trình phù hợp về cả trình độ lẫn nhu cầu, bạn cần xácđịnh xem bạn sẽ dùng nó để làm gì; tìm hiểu thế giới bên trong máy tính, chỉ để học thêmmột ngôn ngữ lập trình mới nhằm phục vụ cho quá trình học tập, hay đó là một lựa chọn chomột hướng phát triển phần mềm chuyên nghiệp ? Hơn thế nữa bạn còn cần phải địnhhướng rõ ràng; môi trường thực hiện sẽ là môi trường phân tán hay môi trường cục bộ ? Cóthể là hơi rắc rối nhưng những suy tính ban đầu này sẽ có ảnh hưởng rất nhiều tới các bước

đi sau này

Những người có ham muốn tìm hiểu sâu thế giới bên trong máy tính thường lấy hợpngữ (Assembly) làm công cụ, có thể nói đây là thứ ngôn ngữ đầu tiên tương đối độc lập đốivới các quá trình thực xảy ra trong các bộ vi xử lý Qua một tập hữu hạn các lệnh được nhậnbiết nhờ các từ gợi nhớ sơ đẳng, người lập trình có thể trực tiếp can thiệp vào quá trình dichuyển dữ liệu, sửa đổi dữ liệu, điều khiển thiết bị Công việc còn lại của trình dịchAssembler rất ít, phần lớn nhiệm vụ của nó là ánh xạ các lệnh gợi nhớ trong chương trìnhnguồn tới một tập cố định các lệnh của bộ vi xử lý, một số thao tác xử lý macro

Để có được một chương trình hoàn chỉnh, người lập trình sẽ phải tìm hiểu thấu đáotập lệnh, vì số lệnh, các chi tiết kỹ thuật cho tập lệnh có thể rất khác nhau giữa các bộ vi xửlý; định hình rõ ràng trình tự các thao tác; khả năng mà trình dịch có thể làm được; và nhất làxác định mức độ cần thiết của các thủ thuật lập trình Chẳng hạn, trong khi các bộ vi xử lý

Trang 18

dòng Intel (x86 phổ dụng trong các máy PC) thường có khoảng 8 thanh ghi đa năng, 6 thanhghi đoạn, một thanh ghi con trỏ lệnh, cờ thì các bộ vi xử lý dòng Motorola (MC680x0 phổdụng trong các máy MacIntosh, các máy trạm của Sun, trong các hệ thống máy tính nhiều

bộ vi xử lý, và trong rất nhiều máy PC) thì lại có tới khoảng 8 thanh ghi dữ liệu 80 bit, khoảngngần ấy số thanh ghi địa chỉ cùng hàng tá thanh ghi với rất nhiều công dụng khác nhau, chế

độ làm việc khác nhau

Chính vì tính chỉ định phần cứng cao như vậy mà hiệu quả làm việc của một ngườithông qua hợp ngữ phụ thuộc rất nhiều vào kinh nghiệm làm việc, theo đó các chương trìnhnày rất khó bảo trì, khó kiểm soát khi số thao tác của chương trình tăng, và đôi khi còn khóhiểu đối với chính người viết ra nó nếu không có các văn bản bảo trì được ghi chép cẩnthận Nhưng bù lại, các chương trình thực hiện bằng hợp ngữ nói chung thường có kíchthước rất khiêm tốn, chạy nhanh nhất tính trên cùng một trình tự thao tác cụ thể so với cácngôn ngữ khác

Basic vốn là một ngôn ngữ phi cấu trúc, nó được phát triển để giúp người lập trình đỡphần vất vả khi làm việc trên các bộ vi xử lý khác nhau Với nó, người lập trình không phải lolắng nhiều về sự khác nhau trong chi tiết kỹ thuật của từng bộ vi xử lý cụ thể, họ chỉ cần bậntâm tới việc cấu trúc sao cho chương trình của họ được tối ưu Để có được tính khả chuyểntrên nhiều loại vi xử lý, các chương trình Basic cần có một chương trình thông dịch để kíchhoạt, trình thông dịch này có nhiệm vụ ánh xạ mã đầu ra của trình dịch Basic vào tập lệnh cụthể của bộ vi xử lý khi chạy chương trình Người ta đã từng đưa trình thông dịch này vàotrong phần cứng, lưu trữ lâu dài trong các bộ nhớ chỉ đọc (ROM), và cung cấp các khả năngtương tác tương đối thuận tiện, giúp người lập trình thiết kế và gỡ rối nhanh chóng cácchương trình Basic

Ngày nay, Basic đã được cải tiến nhiều, về cả trình dịch lẫn bản thân ngôn ngữ, cácứng dụng của Microsoft thường dùng Basic như một công cụ để người sử dụng tuỳ biếnchúng theo nhu cầu Vì chạy thông dịch cho nên các ứng dụng viết bằng Basic chạy khôngnhanh, nhưng vì tính phổ cập, rất nhiều nhà phát triển công cụ vẫn hỗ trợ nó Sản phẩm hỗtrợ Basic ở mức cao được nói đến ở đây là Visual Basic của Microsoft Đây là một công cụphát triển được Công ty này rất ưu ái, hiện nó đang được ưu chuộng trong lĩnh vực pháttriển ứng dụng trên Windows Visual Basic được hỗ trợ rất nhiều khả năng về cơ sở dữ liệu,các kỹ thuật phát triển phần mềm mới như OLE, COM, DCOM

Nếu như bạn chưa có ý định trở thành nhà phát triển phần mềm ứng dụng thì cũngnên biết tới Basic, bởi vì hầu hết các ứng dụng lớn ngày này như Notes, bao gồm cả cácphần mềm xử lý bảng tính, văn bản của Mirosoft đều có sử dụng macro lệnh được thiết kếdựa trên Basic, cho phép người sử dụng sửa đổi, bổ sung các tính năng mới theo nhu cầu Ngoài ra còn phải nói tới Pascal, có thể nói đây là thứ ngôn ngữ vỡ lòng cho hầu hếtnhững người bắt đầu tiếp xúc với máy tính Nó được biết tới không chỉ vì là một trong số cácngôn ngữ cấu trúc ra đời đầu tiên trên thế giới, mà còn là vì tính dễ đọc, dễ tiếp cận của nó.Nếu bạn biết tiếng Anh, không nhất thiết phải biết về tin học, khi đọc một chương trình viếttrong ngôn ngữ này bạn sẽ thấy ngay về cơ bản nó đang nói về một quá trình làm việc nào

đó

Trang 19

Với thứ ngôn ngữ này, người lập trình khỏi phải đau đầu vì phải tổ chức lấy chươngtrình, thay vào đó họ sẽ dùng các câu lệnh tiếng Anh rất dễ nhớ, dễ sử dụng Việc xây dựngmột chương trình rất giống với việc mô phỏng một quá trình hoạt động, có đầu ra đầu vào,

mã nguồn của một chương trình như thế rất dễ đọc, dễ sửa đổi Tất nhiên, trình dịch sẽ phảilàm việc vất vả hơn bởi nó phải phân giải cả một dãy lệnh vốn chỉ dễ hiểu đối với con ngườinhưng lại không thể hiểu nổi đối với các bộ vi xử lý Hầu hết các ngôn ngữ lập trình cấutrúc (tất nhiên trong đó có Pascal) đều lấy việc dịch sang hợp ngữ làm một bước trung gian,theo đó các cấu trúc lệnh if then, case of, v.v được chuyển thành các khối mã nguồnAssembly Tóm lại, việc cấu trúc chi tiết cho một chương trình cụ thể được thực hiện tựđộng bởi trình dịch, lúc này các thủ thuật lập trình Assembly của người lập trình không còn

có thể áp dụng vào đây, đôi khi nó còn máy móc làm phình to mã cho dù đã sử dụng tới cảchục thuật toán tối ưu

Hầu hết các công cụ phát triển có hỗ trợ Pascal ngày nay đều đưa ra các khả năng kếtnối mới cho nó, mã trình có thể được viết riêng rẽ trên nhiều tệp rồi kết nối, hoặc được nạp

từ thư viện động nhưng nói chung, đây là ngôn ngữ chỉ phù hợp với các ứng dụng nhỏ vàtrung bình, phổ dụng trong lĩnh vực đào tạo Nếu bạn là người mới tiếp xúc với máy tính,muốn tìm hiểu cách hoạt động của một chương trình thì bạn hãy chọn ngôn ngữ này

Delphi của Borland chỉ là một công cụ phát triển ứng dụng, nó được xây dựng bằng lõiPascal Với công cụ này, sau một vài tiếng đồng hồ đọc help, nhất là có ai đó hướng dẫn đôichút, bạn hoàn toàn có thể tự viết cho mình các ứng dụng đơn giản như trình xem tệp AVI,nghe nhạc, các thao tác tính toán, lưu trữ đơn giản Nó tỏ ra rất thích hợp với những bạnthích khám phá nhưng không muốn tốn quá nhiều thời gian nghiền ngẫm Ngôn ngữ C là ngôn ngữ lập trình cấu trúc như Pascal và là thứ công cụ mạnh đã từngđược sử dụng để thiết kế hầu hết các hệ điều hành trên thế giới Các hệ điều hành nhưUNIX, AMOEBA đều thực thi bằng C, và nói chung đây là thứ ngôn ngữ có tính khảchuyển tương đối cao cho nên các hệ điều hành này có thể chạy trên rất nhiều phần cứngkhác nhau, ngay cả với WINDOWS cũng vậy, rất nhiều module của nó cũng được xây dựngbằng C

C++ là một bước phát triển tiếp theo của C trong xu thế 'đối tượng hoá' ngôn ngữ, nóinhư vậy là bởi hầu hết các trình dịch C++ đều lấy C làm nền cho tất cả các định hướngnhằm tận dụng các ưu thế mà mô hình thiết kế hướng đối tượng mang lại Vốn dĩ C vẫnchưa được chuẩn hoá mặc cho rất nhiều cố gắng đã được đưa ra, các trình dịch C++ lạicàng khó tìm được tiếng nói chung Các nhà cung cấp trình dịch C đều muốn rằng sản phẩmcủa họ được các nhà phát triển công cụ ưa dùng, thế nhưng các nhà cung cấp công cụ pháttriển lại muốn các trình dịch hướng theo mô hình thiết kế vốn muôn hình muôn vẻ mà họđưa ra Cứ như thế, C++ phát triển trong sự thiếu nhất quán, hệ thống từ khoá không được

hỗ trợ đầy đủ, đôi khi không thống nhất, cách cấu trúc chương trình cũng không giống nhaumặc dù chúng giống nhau về mô hình

Ngày nay, hầu hết các công cụ phát triển hệ thống mạnh như Visual C++, C++Builder,Visual Age đều hỗ trợ song song cả C lẫn C++ Nói chung đây là các công cụ mạnh, thểhiện được ưu thế của chúng trong từng môi trường phát triển cụ thể; ví dụ Visual C++ thích

Trang 20

hợp với những người muốn phát triển các ứng dụng nhất là các ứng dụng gắn với Windows,C++Builder thân thiện ngay cả với những người không nhiều kinh nghiệm trong lĩnh vực lậptrình, Để tìm cho mình một trình dịch C++ phù hợp hãy lựa chọn; chẳng hạn, nếu bạn cầnhướng theo việc xây dựng các ứng dụng phục vụ, có liên quan tới các dịch vụ chuẩn củaWindows, không nhất thiết phải có màn hình giao tiếp phức tạp, hoặc cần có các ứng dụngcan thiệp sâu vào hệ thống bạn hãy lựa chọn Visual C++ Công cụ này đưa ra khá nhiềumẫu (wizard), theo khung định sẵn đó bạn chỉ cần thực thi các chi tiết là đã có một ứng dụnghoàn chỉnh rồi Còn nếu bạn không đủ thời gian cần thiết để nghiền ngẫm cả đống các vănbản công bố từ Microsoft, mà lại muốn có các ứng dụng mang tính bề mặt, nhanh, đầy tínhtương tác, bạn hãy sử dụng C++Builder hay một số sản phẩm tương tự từ IBM, Symantec Java là ngôn ngữ thế hệ mới, thế hệ năm, nó kế thừa hầu hết những 'tư chất' tốt đẹpcủa các bậc tiền bối, hướng đối tượng từ mô hình thiết kế tới mô hình thực thi, hỗ trợ đaluồng một cách rất tinh tế, độ tin cậy cao, tính khả chuyển tuyệt vời Java nay không còn làmột cơn sốt bình thường, nó là một xu thế song song tồn tại với các mô hình lập trình hiện

có, ngày càng nhiều lĩnh vực mà nó có mặt Ban đầu, mục tiêu của các nhà thiết kế củangôn ngữ này là "Web đi tới đâu, Java đi tới đó", nay thì sao, nó đang len lỏi vào cả các hệthống đầy tính thương mại như các hệ quản trị dữ liệu của ORACLE, rồi cả các hệ thốngphục vụ cực lớn Với phiên bản 2, từ tên ấn bản JDK được đổi thành SDK, Sun dần lộ rõnhững ham muốn rất lớn lao trong việc đưa Java vào đời sống tin học của mọi người trênthế giới

Java là ngôn ngữ mạnh, về cả mô hình thiết kế lẫn tính năng Nếu bạn muốn thiết kếcác trang Web sống động, bạn hãy chọn nó, một khối mã CLASS vài KB có thể làm đượcnhiều điều hơn cả 100KB ảnh, nó là giải pháp cho một đường truyền tốc độ thấp Nếu bạnmuốn thiết kế các chương trình phân tán, Java là một lựa chọn tốt, nó có một lượng thư việnmạng được tổ chức hợp lý, thân thiện với người lập trình Với nó bạn có thể tự thiết kế lấycác giao thức (ngay cả các giao thức lạ lẫm chưa từng được nhắc tới trong RFC), các ứngdụng phục vụ, và các ứng dụng sử dụng dịch vụ mà không đòi hỏi mất quá nhiều thời giantìm hiểu hệ thống, tìm kiếm các công bố kỹ thuật Nếu bạn cần viết các ứng dụng mà mã củachúng có thể được sử dụng lại một cách linh hoạt, trên nhiều loại phần cứng, tốn ít thời gianbảo trì và hợp 'thời' nhất, bạn cũng nên chọn Java Với các ngôn ngữ khác, việc sử dụnglại mã rất khó, ví dụ bạn đã có một tệp dll, cùng với hàng tá chi tiết kỹ thuật kèm theo bạncũng rất khó sử dụng lượng thư viện có trong đó, đấy là chưa tính tới việc mã thư viện độngnày chỉ có thể sử dụng được trên các hệ thống Windows Với Java thì lại khác, mô hình thiết

kế của nó cho phép mã của mỗi lớp được gói trong một tệp CLASS riêng, được kiểm soáttrong không gian tên bởi hệ thống chạy Java, và được nạp một cách tường minh mỗi khichương trình cần tới các hành vi của chúng Có thể xem môi trường chạy Java lúc này làmột cái giỏ táo, mỗi quả táo là một đối tượng, vết kích hoạt của một chương trình Java rấtgiống như lối của các con sâu, đục xuyên từ quả này sang quả khác ứng với một con sâu,chương trình có một luồng kích hoạt, nhiều con sâu ứng với một chương trình Java đa luồng(multithread)

Trang 21

Môi trường kích hoạt Java có xu hướng phân tán, các đối tượng kích hoạt có thểkhông cùng nằm trên một máy duy nhất, theo đó nó có thể nằm rảI rác đâu đó trên mạng,chúng 'liên kết' với nhau để hình thành một chương trình thông qua mạng Thế nhưng, khicác ưu thế trên không có trong định hướng của bạn về một công cụ lập trình, bạn đừng nên

sử dụng nó Thứ nhất, Java chạy thông dịch, tốc độ chậm dù đã được cải thiện nhờ cơ chếdịch JIT (một cơ chế nhận biết để ánh xạ một cách thông minh khối mã đầu vào cần thôngdịch và khối mã đầu ra cần kích hoạt nhằm tiết kiệm thời gian dịch), và dù có mong đợi thếnào thì Java vẫn sẽ chạy thông dịch Thứ hai, bản thân ngôn ngữ này đang trong thời gianhoàn thiện; hoàn thiện về hệ thống từ khoá, hoàn thiện về cách tổ chức máy ảo, hoàn thiện

về thư viện

Có rất nhiều loại ngôn ngữ lập trình :Java,C#,VB.Net,PHP,ASP

Java thì lập trình cho các thiết bị di động nhiều hơn

Lập trình web thì có thể dùng Java hoặc PHP

Bạn có thể thiết kế web bằng ASP.NET, viết bằng ngôn ngữ C#, hoặc VB.NET

Ngoài ra còn có công nghệ NET của Microsoft, hỗ trợ rất nhiều ngôn ngữ

Về lập trình phần mềm thì có rất nhiều ngôn ngữ thông dụng tùy theo loại phần mềm nào :

- Phần mềm quản lý chạy trên windows : Visual Basic 6.0, Visual Basic.NET , Visual C#

- Web : ASP, ASP.NET, PHP, JSP, CGI, Perl

- Phần mềm mạng : Java, Visual C++

- Lập trình hệ thống : C/C++

- Trí tuệ nhân tạo : Prolog

ngoài ra còn nhiều ngôn ngữ khác nữa phục vụ cho nhiều mục đích khác nhau

VII Chuẩn hoá ngôn ngữ lập trình

Là việc chọn lọc một ngôn ngữ theo một chuẩn ngôn ngữ nhất định nào đó phù hợp

để có thể phát triển và ứng dụng rộng rãi trong các công việc

Khi việc chuẩn hoá ngôn ngữ hoàn thành thì nó sẽ trở thành một ngôn ngữ tiêu chuẩn trêntoàn thế giới với các mức khác nhau của tiêu chuẩn

VIII Các vấn đề nảy sinh từ sử dụng ngôn ngữ lập trình

Mỗi ngôn ngữ, do hạn chế của môi trường và bản thân ngôn ngữ cũng như do mụctiêu sử dụng, có thể có một số luật cấm mà người lập trình không thể vi phạm Những luậtcấm này có thể có những cách xử lý khác nhau như là:

Nhiều ngôn ngữ cho phép dùng các câu lệnh đặc biệt để lập trình viên có toàn quyền xử lýlỗi và thường được gọi là ngoại lệ (hay exception) Những ngoại lệ này nếu không xử lýđúng mức sẽ có thể gây ra những sai sót trong thời gian thi hành hay ngay cả trong thời giandịch Dĩ nhiên, người viết mã có thể tùy theo tình huống mà viết các câu lệnh rẽ nhánh tránhkhông để cho mã vi phạm các lỗi Hay là dùng các câu lệnh xử lý các ngoại lệ này

Một số ngôn ngữ không cung cấp khả năng xử lý ngoại lệ thì người viết mã buộcphải tự mình phán đoán hết các tình huống có thể vi phạm lỗi và dùng câu lệnh điều kiện đểloại trừ

Trang 22

Các loại lỗi về ngôn ngữ khi lập trình thường xảy ra là :

Lỗi cú pháp

Vi phạm khi đặt hay gọi tên biến và hàm: Lỗi loại này thường rất dễ tìm ra trong lúc pháttriển mã Thường người ta có thể đọc lại các bảng tham chiếu về ngôn ngữ để tránh sai cúpháp mẫu (prototype) của hàm hay tránh dùng các ký tự đặc biệt bị cấm không cho dùngtrong khi đặt tên Trong không ít trường hợp người lập trình có thể đã định nghĩa cùng mộttên cho nhiều hơn một đối tượng khác nhau và lại có giá trị toàn cục Trong nhiều trườnghợp chúng tạo thành lỗi ý nghĩa

Lỗi chính tả: người viết mã có thể viết hay gọi sai tên hàm, tên biến Trong nhiều ngônngữ có kiểu tĩnh thì các lỗi này sẽ rất dễ bị phát hiện Còn đối với ngôn ngữ có kiểu độnghay có kiểu yếu thì nó có thể dẫn đến sai sót nghiêm trọng vì bản thân phần mềm dịchkhông hề phát hiện ra

Vượt quá khả năng tính toán: Bản thân máy tính và hệ điều hành cũng có rất nhiều giớihạn về phần cứng, phần mềm và các đặc diểm chuyên biệt Khi người lập trình yêu cầu máylàm quá khả năng sẽ gây ra các lỗi mà đôi khi không xác định được như

Lỗi thời gian (timing error) thường thấy trong các hệ thống đa luồng hay đa nhiệm Lỗi chia cho 0: Bản thân phần cứng máy tính sẽ ở trạng thái bất định khi thực hiện phépchia cho 0; trong nhiều trường hợp, mã sau khi dịch mới phát hiện ra trong lúc thi hành vàđược đặt tên là lỗi division by 0

Dùng hay gọi tới các địa chỉ hay các thiết bị mà bản thân máy hay hệ điều hành đangthực thi lại không có hay không thể đạt tới Đây là trường hợp rất khó lường Bởi vì thườngngưòi lập trình có thể viết mã trên một máy nhưng lại cho thi hành trong các máy khác vàcác máy này lại không thỏa mãn các yêu cầu Để giảm trừ các lỗi loại này thường người lậptrình nên xác định trước các điều kiện mà phần mềm làm ra sẽ hỗ trợ

Thí dụ: trong nhiều phần mềm ngày nay ở trong vỏ hộp đều được ghi rõ các yêu cầu vềvận tốc, bộ nhớ tối thiểu, và quan trọng là hệ điều hành nào mà phần mềm đó hỗ trợ

Gán sai dữ liệu: Tức là dùng một dữ liệu có kiểu khác với kiểu của biến để gán cho biến

đó một cách không chủ ý Đối với các ngôn ngữ tĩnh hay có kiểu mạnh thì lỗi này dể tìm thấyhơn Còn những ngôn ngữ động hay ngôn ngữ có kiểu yếu thì lỗi tạo ra sẽ có thể khó pháthiện và thường xảy ra lúc thi hành

Các lỗi biên: Lỗi biên thường xảy ra khi người viết mã không chú ý đến các giá trị ở biêncủa các biến, các hàm Những lỗi để thấy có thể là:

Gán giá trị của một số (hay một chuỗi) lên một biến mà nó vượt ngoài sự cho phép của định nghĩa

Thí dụ: Gán một giá trị lớn hơn 255 cho một biến có kiểu là short trong ngôn ngữ C

Tạo nên các lỗi khi biến chạy trong vòng lặp đạt giá trị ở biên

Thí dụ: đoạn mã C/C++ sau đây sẽ gây ra lỗi biên Chia cho 0

for (m=10; m >= 0, m ) {

x= 8+ 2/m; }

Trang 23

Lỗi ý nghĩa

Lỗi về quản lý bộ nhớ Trong nhiều loại ngôn ngữ người lập trình có thể xin đăng kýmột lượng nào đó của bộ nhớ để dùng làm chỗ chứa giá trị cho một biến (một hàm hay mộtđối tượng) Thường thì sau khi dùng xong người viết mã phải có phần lệnh trả về các phần

bộ nhớ mà nó đã đăng ký dùng Nếu không, sự trả về này chỉ xảy ra ở giai đoạn kết thúcviệc thi hành Trong nhiều trường hợp, số lượng bộ nhớ xin đăng ký quá nhiều và khôngđược dùng đúng chỗ có thể làm cho máy kiệt quệ về mặt tài nguyên bộ nhớ và gây ra treomáy Điển hình nhất là việc xin đăng ký các phần của bộ nhớ trong các vòng lặp lớn để gáncho các đối tượng bên trong vòng lặp nhưng không trả về sau khi xử dụng Người ta thườnggọi lỗi kiểu này là lỗi rò rỉ bộ nhớ (memory leaking)

Sai sót trong thuật toán: Trước khi viết một chương trình, để giảm thiểu sai sót vềmặt lập luận thì người ta có nhiều biện pháp để làm giảm lỗi trong đó có các phương pháp

vẽ lưu đồ, vẽ sơ đồ khối, hay viết mã giả Những biện pháp này nhằm tạo nên các thuật toán

để giải quyết vấn đề Tuy nhiên, một thuật toán không chặt chẽ, xử lý không rốt ráo mọitrường hợp có thể xảy ra, không dự đoán được sự thay đổi trong lúc thi hành thì có thể tạonên các lỗi và các lỗi này thường khó thấy bởi vì nó chỉ xảy ra ở những chỗ, những thờiđiểm mà người lập trình không ngờ trước Một trong những phương pháp đơn giản làmgiảm thiểu lỗi thuật toán là phải chú ý xử lý mọi tình huống khi dùng câu lệnh điều kiện (haychẻ nhánh) mặc dù có thể có các trường hợp tưởng như hiển nhiên

Lỗi về lập luận: Đây có thể xem là trường hợp đặc biệt của sai sót trong thuật toán.Trong các biểu thức tính giá trị, đôi khi không quen dùng đại số Bool (nhất là khi dùng luật

De Morgan để phủ định một biểu thức phức tạp) nên người lập trình có thể tính toán sai, hayđịnh nghĩa sai các phép toán Do đó, giá trị trả về của các biểu thức logic hay biểu thức nhịphân sẽ bị sai trong một vài trường hợp hay toàn bộ biểu thức Trong những tình huống nhưvậy phần mềm dịch sẽ không thể nào phát hiện ra cho đến khi chương trình được thi hành

và lọt vào tình huống tính sai của người lập trình

Trang 24

Bài 2 TÊN BÀI:CÁC LOẠI DỮ LIỆU CẤU TRÚC

ta cần phải hiểu ngôn ngữ lập trình C/C++ đồng thời cần phải nghiên cứu lại các bài học đãhọc trong chương trình Lập trình căn bản

Mục tiêu thực hiện:

Học xong bài này học viên sẽ có khả năng:

- Hiểu và nắm được các kiểu dữ liệu cơ bản: kiểu số nguyên, số thực, ký tự, chuỗi, mảng

- Nắm được cách thức tổ chức bộ nhớ để lưu trữ các kiểu dữ liệu cơ bản

- Áp dụng giải một số bài toán

Nội dung chính:

2.1 Các kiểu dữ liệu cơ sở

Các kiểu dữ liệu cơ sở là các kiểu dữ liệu do ngôn ngữ lập trình dựng sẵn, ở đây chúng ta xét ngôn ngữ lập trình C++ với công cụ lập trình Borland C++ 3.0

unsign long 04 byte 0 đến 232-1

Các phép toán được trang bị để hỗ trợ cho số nguyên:

Phép cộng, trừ: Cộng, trừ hai số nguyên cho kết quả một số nguyên

Phép chia: Chia hai số nguyên cho kết quả một số nguyên là phần nguyên của phép chia.Phép lấy dư (%): Phép toán này lấy phần dư của phép chia hai số nguyên

Kiểu thực

C/C++ có hai từ khoá để khai báo số thực: float , double; được mô tả trong bảng sau:

Tên kiểu Kích thước Giá trị Độ chính xác

float 4 byte 3.410-38 3.41038 7 chữ số sau dấu thập phândouble 8 byte 1.710-308 1.710308 15 chữ số sau dấu thập phân

Trang 25

long double 10 byte 3.4E-4932… 1.1E4932

Số thực được hỗ trợ các phép toán: cộng, trừ, nhân, chia nhưng không tồn tại phéptoán lấy dư (%)

Kiểu ký tự

Kiểu ký tự được hỗ trợ từ khoá char dùng để lưu 256 ký tự trong bảng mã ASCII mở rộng.Một biến dùng kiểu ký tự để lưu trữ thực chất chỉ lưu trữ được một số nguyên theo mã sốtrong bảng mã ASCII, do đó các phép toán của số nguyên đều dùng được với cùng một quycách với ký tự

Để gán giá trị cho một biến ký tự người dùng có thể gán giá trị số nguyên (mã ASCII)của ký tự đó hoặc gán tên ký tự được đóng bởi cặp dấu nháy đơn (Ví dụ: a=’B’)

Trong quá trình lập trình, chúng ta cần phải chú ý đến các tình huống sau:

- Người lập trình có thể kết hợp các từ khoá: unsigned, long để chỉ định kiểu dữ liệu códấu hoặc để tăng giá trị có thể lưu trữ được cho một biến Ví dụ: Biến a có kiểu long int hoặclong có thể lưu trữ được giá trị số nguyên có dấu giá trị khoảng 2 tỷ; biến b có kiểu unsignedint có thể lưu trữ được giá trị số nguyên có độ lớn từ 0 65535; biến c có kiểu unsigned longint có thể lưu trữ được số nguyên không dấu giá trị khoảng 4,2 tỷ

Kiểu logic

Borland C++ 3.0 trở lên có cung cấp một kiểu dữ liệu logic mang tên kiểu bool Kiểu dữliệu này chứa một trong hai giá trị TRUE (đúng), FALSE (sai) Tuy nhiên, trong C/C++, khi sửdụng giá trị bằng 0 được hiểu là FALSE, sử dụng giá trị khác 0 được hiểu là FALSE

- Từ khoá long không dùng được với kiểu char

- Ngoài các các phép toán chuẩn, người sử dụng phải còn có thể sử dụng các hàmdựng sẵn được cung cấp bởi các thư viện trong C/C++ để xử lý đối với từng kiểu dữ liệuđược yêu cầu của từng hàm

- Kiểu trả về của một biểu thức số có kiểu dữ liệu là kiểu dữ liệu cao nhất trong cácphần tử trong biểu thức

Ví dụ: Biểu thức 1/n với n là số nguyên sẽ trả về một giá trị nguyên Chẳng hạn, 1/5 sẽtrả về giá trị 0

- Trong trường hợp muốn biểu thức cho ra một kết quả theo kiểu dữ liệu nào đó,chúng ta phải thực hiện phép toán ép kiểu

Ví dụ 1: Viết chương trình thực hiện nhập vào một số nguyên dương n, sau đó in kết quả

Trang 26

printf("Giai thua cua %d la %ld\n", n, giaithua(n));

printf("\nTiep tuc khong? (c/k): ");

Ví dụ 3: Tính n! sử dụng biến lưu trữ là số thực long double.

Trang 27

cout<<"Giai thua cua "<<n<<" la " << giaithua(n);

printf("\nTiep tuc khong? (c/k): ");

Mảng một chiều được khai báo như sau:

<tên kiểu dữ liệu> tênbiến[<kích thước>]

Ví dụ 4: Để khai báo một biến a là một mảng nguyên một chiều có 100 phần tử, chúng ta

phải khai báo như sau:

int a[100];

Để truy xuất đến các phần tử,chúng ta phải chỉ định tên và chỉ số phần tử cần truyxuất Chẳng hạn:

a[0] - Truy xuất đến phần tử đầu tiên

a[11] – Truy xuất đến phần tử thứ 12 (có chỉ số 11)

a[99] – Truy xuất đến phần tử thứ 100 (có chỉ số 99), là phần tử cuối cùng ở mảng trên.Chúng ta cũng có thể vừa khai báo vừa gán giá trị cho một mảng như sau:

int a [5] = { 16, 2, 77, 40, 12071 };

Tương tự, chúng ta có thể khai báo một mảng 2 hay nhiều chiều theo cú pháp sau:

<tên kiểu dữ liệu> tênbiến[<kích thước1>][<kích thước 2>][…];

Chẳng hạn, chúng ta khai báo khai báo mảng nguyên 2 chiều như sau:

Trang 28

cout<<"Tong cac phan tu khong chia het cho 2:"<<tongle<<endl;

cout<<"Tong cac phan tu chia chet cho 2:"<<tongchan;

Trang 29

Ví dụ 6: Bài toán tám quân hậu: Tìm cách đặt các quân hậu lên bàn cờ vua sao cho không

quân nào có thể ăn được quân nào Quy luật khống chế ô cờ của quân hậu được thể hiệntheo hướng mũi tên sau:

Hình 2.1 Quy luật khống chế ô cờ của quân Hậu

Hậu

Trang 30

Thuật toán xây dựng dựa trên việc đặt quân hậu lần lượt trên từng dòng Chúng ta phải tìmcột thích hợp để đặt quân hậu lên dòng thứ i, tại cột j nào?

- Giá trị cột đã bị quân hậu khống chế rất dễ dàng xác định bằng cách xem có quân hậu nàonằm trên cột đó hay không?

- Các đường chéo xuôi được xác định dễ dàng vì lấy chỉ số cột trừ chỉ số dòng trên mộtđường chéo luôn luôn là một hằng số

- Cac đường chéo ngược được xác định dễ dàng vì lấy chỉ số dòng cộng chỉ số cột trên mộtđường chéo luôn luôn là một hằng số

Bảng chỉ số i+j của đường chéo xuôi

Hinh 2.2 Bảng chỉ số i+j của đường chéo xuôi.

Bài toán này chúng ta xử lý bằng cách dùng một mảng để lưu lời giải (mảng loigiai) Haimảng dùng để lưu đường chéo của bàn cờ (cheoxuoitrong, cheonguoctrong), một mảng lưutrữ các cột trống

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <iostream.h>

#define KICHTHUOC 8 // Kich thuoc cua ban co

#define SODUONGCHEO (2*KICHTHUOC-1) // So duong cheo cua ban co

I+j01234567891011121314

Trang 31

#define SOGIA (KICHTHUOC-1) // so gia

// mang cac cot co the dat hoang hau

int cheoxuoitrong[SODUONGCHEO]; // mang cac duong cheo xuoi co the dat hhau

int cheonguoctrong[SODUONGCHEO]; // mang cac duong cheo nguoc co the dat hhauint loigiai[KICHTHUOC];

/* mang loigiai cho biet cot dat cac hoang hau tren ban co Vi du cac phan tu cua mang la: 7 3 0 2 5 1 6 4 cho biet hoanghau0 dat o cot 7, hoanghau1 dat o cot 3, , hoanghau7 o cot 4 */

Trang 32

Ví dụ 7: Bài toán mã đi tuần: Đặt 1 quân mã vào bàn cờ vua, hãy tìm đường đi để quân mã

đi hết bàn cờ mà không đi lại bất cứ ô nào

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#define KICHTHUOC 5 // Kich thuoc cua ban co

void nuocdi(int, int, int);

Ngày đăng: 17/01/2022, 11:30

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm