CHƯƠNG I: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C Giới thiệu Mục tiêu - Trình bày sự ra đời và phát triển, vị trí và ứng dụng của ngôn ngữ lập trình C hiện nay; - Trình bày những thư viện thường dùng và các khái niệm về ngôn ngữ lập trình, khái niệm về giải thuật, khái niệm về kỹ thuật lập trình tuyến tính và nguyên lý hoạt động của ngôn ngữ lập trình C; - Trình bày và sử dụng được hệ thống trợ giúp công cụ (Tools) hỗ trợ lập trình C; - Tìm kiếm, download, lựa chọn và cài đặt môi trường làm việc của ngôn ngữ lập trình C trên máy tính cá nhân; - Chủ động tìm hiểu các tính năng của ngôn ngữ C; - Rèn luyện tính cẩn thận, tỉ mỉ, chính xác, sáng tạo, linh hoạt trong công việc. Giới thiệu ngôn ngữ C 1. Lịch sử phát triển Ngôn ngữ C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển các ứng dụng. Vào những năm cuối thập kỷ 60 đầu thập kỷ 70 của thế kỷ XX, Dennish Ritchie (làm việc tại phòng thí nghiệm Bell) đã phát triển ngôn ngữ lập trình C dựa trên ngôn ngữ BCPL (do Martin Richards đưa ra vào năm 1967) và ngôn ngữ B (do Ken Thompson phát triển từ ngôn ngữ BCPL vào năm 1970 khi viết hệ điều hành UNIX đầu tiên trên máy PDP-7) và được cài đặt lần đầu tiên trên hệ điều hành UNIX của máy DEC PDP-11.
Năm 1978, Dennish Ritchie và B.W Kernighan đã cho xuất bản quyển “Ngôn ngữ lập trình C” và được phổ biến rộng rãi đến nay. Lúc ban đầu, C được thiết kế nhằm lập trình trong môi trường của hệ điều hành Unix nhằm mục đích hỗ trợ cho các công việc lập trình phức tạp. Nhưng về sau, với những nhu cầu phát triển ngày một tăng của công việc lập trình, C đã vượt qua khuôn khổ của phòng thí nghiệm Bell và nhanh chóng hội nhập vào thế giới lập trình để rồi các công ty lập trình sử dụng một cách rộng rãi. Sau đó, các công ty sản xuất phần mềm lần lượt đưa ra các phiên bản hỗ trợ cho việc lập trình bằng ngôn ngữ C và chuẩn ANSI C cũng được khai sinh từ đó.
Ngôn ngữ lập trình C là một ngôn ngữ lập trình hệ thống rất mạnh và rất “mềm dẻo”, có một thư viện gồm rất nhiều các hàm (function) đã được tạo sẵn. Người lập trình có thể tận dụng các hàm này để giải quyết các bài toán mà không cần phải tạo mới. Hơn thế nữa, ngôn ngữ C hỗ trợ rất nhiều phép toán nên phù hợp cho việc giải quyết các bài toán kỹ thuật có nhiều công thức phức tạp. Ngoài ra, C cũng cho phép người lập trình tự định nghĩa thêm các kiểu dữ liệu trừu tượng khác.
Tuy nhiên, điều mà người mới vừa học lập trình C thường gặp “rắc rối” là “hơi khó hiểu” do sự “mềm dẻo” của C. Dù vậy, C được phổ biến khá rộng rãi và đã trở thành một công cụ lập trình khá mạnh, được sử dụng như là một ngôn ngữ lập trình chủ yếu trong việc xây dựng những phần mềm hiện nay. Sự cần thiết a) Thuật ngữ căn bản Khi một máy tính được khởi động, tự động thực thi một số tiến trình và xuất kết quả ra màn hình. Điều này diễn ra thế nào? Câu trả lời đơn giản là nhờ vào Hệ điều hành cài đặt bên trong máy tính.
Hệ điều hành (operating system) được xem như phần mềm hệ thống. Phần mềm này khởi động máy tính và thiết lập các thông số ban đầu trước khi trao quyền cho người dùng. Để làm được điều này, hệ điều hành phải được cấu tạo từ một tập hợp các chương trình. Mọi chương trình đều cố gắng đưa ra lời giải cho một hay nhiều bài toán nào đó Mọi chương trình cố gắng đưa ra giải pháp cho một hay nhiều vấn đề.
Mỗi chương trình là tập hợp các câu lệnh giải quyết một bài toán cụ thể. Một nhóm lệnh tạo thành một chương trình và một nhóm các chương trình tạo thành một phần mềm. Phần này chúng ta sẽ tìm hiểu một số khái niệm căn bản về lệnh (Command), thuật toán, chương trình, ngôn ngữ lập trình. Thuật ngữ thuật giải, thuật toán và Phần mềm (Software).
Ví dụ 1: Một người bạn đến nhà chơi và được mời món sữa dâu. Anh ta thấy ngon miệng và muốn xin công thức làm. Ta hướng dẫn cho anh ta các bước làm như sau: Bước 1: Lấy một ít sữa. Bước 2: Đổ nước ép dâu vào.
Bước 3: Trộn hỗn hợp này và làm lạnh. Bây giờ nếu người bạn theo những chỉ dẫn này, họ cũng có thể tạo ra món sữa dâu tuyệt vời. Hãy phân tích chỉ thị (lệnh) ở trên. ■ Lệnh đầu tiên: Lệnh này hoàn chỉnh chưa? Nó có trả lời được câu hỏi lấy sữa ‘ở đâu’?.
■ Lệnh thứ hai: Một lần nữa, lệnh này không nói rõ nước ép dâu để ‘ở đâu’. May mắn là bạn của chúng ta đủ thông minh để hiểu được công thức pha chế nói trên, dù rằng còn nhiều điểm chưa rõ ràng. Do vậy nếu chúng ta muốn phổ biến cách làm, chúng ta cần bổ sung các bước như sau: Bước 1: Rót một ly sữa vào máy trộn. Bước 2: Đổ thêm vào một ít nước dâu ép.
Bước 3: Đóng nắp máy trộn Bước 4: Mở điện và bắt đầu trộn Bước 5: Dừng máy trộn lại Bước 6: Nếu đã trộn đều thì tắt máy, ngược lại thì trộn tiếp. Bước 7: Khi đã trộn xong, rót hỗn hợp vào tô và đặt vào tủ lạnh. Bước 8: Để lạnh một lúc rồi lấy ra dùng. So sánh hai cách hướng dẫn nêu trên, hướng dẫn thứ hai chắc chắn hoàn chỉnh, rõ ràng hơn, ai cũng có thể đọc và hiểu được.
Tương tự, máy tính cũng xử lý dữ liệu dựa vào tập lệnh mà nó nhận được. Đương nhiên các chỉ thị đưa cho máy vi tính cũng cần phải hoàn chỉnh và có ý nghĩa rõ ràng. Những chỉ thị này cần phải tuân thủ các quy tắc: 4 ■ Tuần tự ■ Có giới hạn ■ Chính xác. Mỗi chỉ thị trong tập chỉ thị được gọi là “ câu lệnh” và tập các câu lệnh được gọi là “chương trình’”.
Ví dụ 2: Xét trường hợp chương trình hướng dẫn máy tính cộng hai số. Các lệnh trong chương trình có thể là: Bước 1: Nhập số thứ nhất và nhớ nó. Bước 2: Nhập số thứ hai và nhớ nó. Bước 3: Thực hiện phép cộng giữa số thứ nhất và số thứ hai, nhớ kết quả phép cộng.
Bước 4: Hiển thị kết quả. Bước 5: Kết thúc. Tập lệnh trên tuân thủ tất cả các quy tắc đã đề cập. Vì vậy, tập lệnh này là một chương trình và nó sẽ thực hiện thành công việc cộng hai số trên máy tính.
❖ Thuật giải (Algorithm): Là một dãy các thao tác xác định trên một đối tượng, sao cho sau khi thực hiện một số hữu hạn các bước thì đạt được mục tiêu.Kowalski thì bản chất của thuật giải: Thuật giải = Logic + Điều khiển Trong đó: ■ Logic: Đây là phần khá quan trọng, nó trả lời câu hỏi "Thuật giải làm gì, giải quyết vấn đề gì?", những yếu tố trong bài toán có quan hệ với nhau như thế nào v.Ở đây bao gồm những kiến thức chuyên môn mà bạn phải biết để có thể tiến hành giải bài toán. ■ Điều khiển: Thành phần này trả lời câu hỏi: giải thuật phải làm như thế nào?. Chính là cách thức tiến hành áp dụng thành phần logic để giải quyết vấn đề. ❖ Chương trình (Program): Là một tập hợp các mô tả, các phát biểu, nằm trong một hệ thống qui ước về ý nghĩa và thứ tự thực hiện, nhằm điều khiển máy tính làm việc.
Theo Niklaus Wirth thì: Chương trình = Thuật toán + Cấu trúc dữ liệu Các thuật toán và chương trình đều có cấu trúc dựa trên 3 cấu trúc điều khiển cơ bản: Tuần tự (Sequential): Các bước thực hiện tuần tự một cách chính xác từ trên ■ xuống, mỗi bước chỉ thực hiện đúng một lần. ■ Chọn lọc (Selection): Chọn 1 trong 2 hay nhiều thao tác để thực hiện. ■ Lặp lại (Repetition): Một hay nhiều bước được thực hiện lặp lại một số lần. Muốn trở thành lập trình viên chuyên nghiệp hãy làm đúng trình tự để có thói quen 5 tốt và thuận lợi sau này trên nhiều mặt của một người làm máy tính.
Hãy làm theo các bước sau: Bước 1: Tìm, xây dựng thuật giải (trên giấy) Bước 2: Viết chương trình trên máy Bước 3: Dịch chương trình Bước 4: Chạy và thử chương trình ❖ Ngôn ngữ lập trình (Programming language): Ngôn ngữ lập trình là hệ thống các ký hiệu tuân theo các qui ước về ngữ pháp và ngữ nghĩa, dùng để xây dựng thành các chương trình cho máy tính. Một chương trình được viết bằng một ngôn ngữ lập trình cụ thể (ví dụ Pascal, C.) gọi là chương trình nguồn, chương trình dịch làm nhiệm vụ dịch chương trình nguồn thành chương trình thực thi được trên máy tính. ❖ Các bước lập trình: Bước 1: Phân tích vấn đề và xác định các đặc điểm. (xác định I-P-O) Bước 2: Lập ra giải pháp.
(đưa ra thuật giải) Bước 3: Cài đặt. (viết chương trình) Bước 4: Chạy thử chương trình. (dịch chương trình) Bước 5: Kiểm chứng và hoàn thiện chương trình. (thử nghiệm bằng nhiều số liệu và đánh giá) b) Kỹ thuật lập trình ❖ Quy trình nhập - xử lý - xuất (I-P-O): I-P-O Cycle (Input-Pprocess-Output Cycle) là quy trình xử lý cơ bản của máy tính như mô hình sau: Hình 1.2: Quy trình nhập - xử lý - xuất cơ bản của máy tính Ví dụ 3: Xác định Input, Process, Output của việc làm 1 ly nước chanh nóng Input: ly, đường, chanh, nước nóng, muỗng.
Process: - cho hỗn hợp đường, chanh, nước nóng vào ly. - dùng muỗng khuấy đều. Output: ly chanh nóng đã sẵn sàng để dùng. Ví dụ 4: Xác định Input, Process, Output của chương trình tính tiền lương công nhân tháng 10/2002 biết rằng lương = lương căn bản * ngày công Input: Lương căn bản, ngày công Process: Nhân lương căn bản với ngày công 6 Output: Lương Ví dụ 3: Xác định Input, Process, Output của chương trình giải phương trình bậc nhất một ẩn số ax + b = 0 Input: Hệ số a, b Process: Chia - b cho a Output: Nghiệm x Ví dụ 4: Xác định Input, Process, Output của chương trình tìm số lớn nhất của 2 số a và b.
Input: a, b Process: Nếu a > b thì Output: = a lớn nhất. Ngược lại Output: = b lớn nhất Sử dụng lưu đồ (Flowchart) Để dễ hơn về quy trình xử lý, các nhà lập trình đưa ra dạng lưu đồ để minh họa từng bước quá trình xử lý một vấn đề (bài toán).