MỞ ĐẦU Tin học cơ sở 2 là môn học quan trọng trong chương trình giáo dục đại cương ở bậc đại học, đây là môn bắt buộc đối với tất cả các sinh viên trong Học Viện CNBCVT. Tài liệu này nhằm cung cấp cho sinh viên các kiến thức tổng quan và cơ bản về ngôn ngữ lập trình C. Qua đó sinh viên có thể nắm được các khái niệm cơ bản về lập trình và thiết lập được một số chương trình đơn giản phục vụ cho khoa học kĩ thuật và đặc biệt là làm công cụ để phục vụ cho các môn học về tin học và viễn thông mà các em sắp học. Chúng tôi đã biên soạn bài giảng này cho tất cả các sinh viên các ngành kỹ thuật ở bậc đại học với mục đích giúp cho các sinh viên có một tài liệu học cần thiết cho môn học này và cũng để đáp ứng nhu cầu càng ngày càng cao về tư liệu dạy và học tin học.
5 BÀI GIẢNG TIN HỌC CƠ SỞ 2 – KHOA CNTT1 GIỚI THIỆU CHUNG 1. Ngôn ngữ lập trình Trong phần “Tin học cơ sở 1” chúng ta đã tìm hiểu Winword và Excel, là các phần mềm ứng dụng trong công việc soạn thảo văn bản và làm các bảng tính toán được. Đặc điểm của các phần mềm ứng dụng là luôn định rõ phạm vi ứng dụng và cung cấp càng nhiều càng tốt các công cụ để hoàn thành chức năng đó. Tuy nhiên người sử dụng cũng hầu như bị bó buộc trong phạm vi quy định của phần mềm.
Chẳng hạn ta khó có thể dùng Excel để giải một bài toán gồm nhiều bước tính toán như tính nghiệm gần đúng một phương trình vi phân hay giải một hệ phương trình tuyến tính. Mặc dầu các phần mềm ứng dụng ngày càng nhiều và thuộc đủ các lĩnh vực như xây dựng, thiết kế, hội họa, âm nhạc.nhưng không thể bao trùm hết các vấn đề nẩy sinh trong thực tế vô cùng phong phú. Rõ ràng không chỉ những chuyên gia tin học mà ngay cả những người sử dụng, nhất là các cán bộ kỹ thuật, rất cần đến những phần mềm uyển chuyển và mềm dẻo hơn, có khả năng thực hiện được nhiều hơn các chỉ thị của người sử dụng để giúp họ giải quyết những công việc đa dạng bằng máy tính. Phần mềm có tính chất như thế được gọi là ngôn ngữ lập trình.
Chính xác hơn ngôn ngữ lập trình là một ngôn ngữ nhân tạo bao gồm một tập các từ vựng (mà ta sẽ gọi là từ khóa để phân biệt với ngôn ngữ thông thường) và một tập các quy tắc (gọi là Syntax - cú pháp) mà ta có thể sử dụng để biên soạn các lệnh cho máy tính thực hiện. Như ta đã biết, các ô nhớ của máy tính chỉ có thể biểu diễn các số 0 và 1. Vì vậy ngôn ngữ mà máy có thể hiểu trực tiếp là ngôn ngữ trong đó các lệnh là các dãy số nhị phân và do đó được gọi là ngôn ngữ máy (machine language). Mọi ngôn ngữ khác đều phải thông dịch hoặc biên dịch sang ngôn ngữ máy (Interpreter - thông dịch và cho chạy từng lệnh.
Compiler - biên dịch thành 1 chương trình ngôn ngữ máy hoàn chỉnh, do vậy chạy nhanh hơn thông dịch). Có nhiều loại ngôn ngữ lập trình, và hầu hết các nhà khoa học về máy tính đều cho rằng không có một ngôn ngữ độc nhất nào có đủ khả năng phục vụ cho các yêu cầu của tất cả các lập trình viên. Theo truyền thống, các ngôn ngữ lập trình được phân làm 2 loại: các ngôn ngữ bậc thấp và ngôn ngữ bậc cao. Ngôn ngữ lập trình bậc thấp (low-level programming language): Ngôn ngữ máy, hợp ngữ (assembler: chương trình dịch hợp ngữ, assembly language: ngôn ngữ hợp ngữ).
Hợp ngữ là ngôn ngữ lập trình bậc thấp từ ngôn ngữ 6 BÀI GIẢNG TIN HỌC CƠ SỞ 2 – KHOA CNTT1 máy. Nó chỉ khác với ngôn ngữ máy trong việc sử dụng các mã biểu thị các chức năng chính mà máy thực hiện. Lập trình bằng hợp ngữ rất phiền toái: có đến vài tá dòng mã cần thiết chỉ để thực hiện phép cộng 2 con số. Các chương trình hợp ngữ rất khó viết; chúng không có cấu trúc hoặc modun hóa rõ ràng.
Chương trình hợp ngữ cũng không dễ chuyển từ loại máy tính này sang loại máy tính khác. Các chương trình này được viết theo các tập lệnh đặc thù của loại bộ vi xử lý nhất định. Lập trình bằng hợp ngữ thì mã gọn và chạy nhanh. Do đó hầu hết các chương trình điều hành hệ thống đều được viết bằng hợp ngữ.
Tuy nhiên do sự phức tạp của công việc lập trình nên các hãng sản xuất phần mềm chuyên dụng thích viết chương trình bằng ngôn ngữ C (do Bell Laboratories của hãng AT&T xây dựng) là loại ngôn ngữ kết hợp được cấu trúc của ngôn ngữ bậc cao hiện đại với tốc độ và tính hiệu quả của hợp ngữ bằng cách cho phép nhúng các lệnh hợp ngữ vào chương trình. Ngôn ngữ lập trình bậc cao: Các ngôn ngữ lập trình bậc cao như Basic, Pascal, C, C++. cho phép các lập trình viên có thể diễn đạt chương trình bằng các từ khóa và các câu lệnh gần giống với ngôn ngữ tự nhiên. Các ngôn ngữ này dược gọi là “bậc cao” vì chúng giải phóng các lập trình viên khỏi những quan tâm về từng lệnh sẽ được máy tính tiến hành như thế nào, bộ phận thông dịch hoặc biên dịch của chương trình sẽ giải quyết các chi tiết này khi mã nguồn được biến đổi thành ngôn ngữ máy.
Một câu lệnh trong ngôn ngữ bậc cao tương ứng với một số lệnh ngôn ngữ máy, cho nên bạn có thể thảo chương theo ngôn ngữ bậc cao nhanh hơn so với bậc thấp. Tuy nhiên bạn cũng phải trả giá cho việc này. Chương trình ngôn ngữ máy được dịch ra từ mã nguồn được viết bằng ngôn ngữ bậc cao chứa rất nhiều chi tiết thừa, do đó tốc độ chạy sẽ chậm hơn nhiều so với chương trình viết bằng hợp ngữ. Thông thường một trình biên dịch đặc trưng thường sinh ra số lệnh mã máy gấp 2 lần hay nhiều hơn số lệnh cần thiết nếu viết bằng mã máy.
Một cách phân loại khác của các ngôn ngữ lập trình: Ngôn ngữ thủ tục (Procedural Language) và ngôn ngữ khai báo (Declarative Language) Ngôn ngữ thủ tục: Lập trình viên phải xác định một thủ tục mà máy tính sẽ tuân theo để hoàn thành một công việc định trước. Thí dụ: Basic, C, Fortran,. Ngôn ngữ khai báo: Ngôn ngữ sẽ định nghĩa một loạt các yếu tố và các quan hệ, đồng thời cho phép bạn có thể tiến hành xếp hàng đối với những kết quả xác định. Thí dụ: Prolog, SQL (Structured Query Language) 7 BÀI GIẢNG TIN HỌC CƠ SỞ 2 – KHOA CNTT1 Điều then chốt trong việc lập trình chuyên dụng là môdun hóa ngôn ngữ - đó là sự phát triển sao cho nhiệm vụ lập trình có thể phân phối được cho các thành viên của một nhóm lập trình, và kết quả đạt được là các bộ phận khác nhau sẽ hoạt động phù hợp với nhau khi nhiệm vụ của từng người hoàn thành.
Ngôn ngữ lập trình môdun, như Module-2 hoặc ngôn ngữ hướng đối tượng như C++, sẽ cho phép từng lập trình viên có thể tập trung vào việc lập mã, biên dịch và gỡ rối các module chương trình riêng biệt, đồng thời có thể cho chạy (kiểm tra thử) riêng từng module của mình. Khi từng module riêng đã chạy tốt chúng sẽ được liên kết với nhau mà không gây trục trặc nào. Thuật toán (Algorithm) Thuật ngữ Algorithm được dịch ra tiếng Việt là thuật toán, thuật giải hoặc giải thuật. Ở đây dùng từ thuật toán là cách gọi quen thuộc với nhiều người.
Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính xác các phép toán hoặc hành động cần thực hiện, để giải quyết một vấn đề. Để hiểu đầy đủ ý nghĩa của khái niệm thuật toán, chúng ta nêu ra 6 đặc trưng sau đây của thuật toán: Input Mỗi thuật toán thường có một số dữ liệu vào. Output Mỗi thuật toán thường có một số dữ liệu ra. Tính xác định (Definiteness) Mỗi bước được mô tả chính xác, chỉ có một cách hiểu duy nhất và đủ đơn giản để có thể thực hiện được.
Tính dừng (Finiteness) Thuật toán phải dừng sau một số hữu hạn bước thực hiện Tính hiệu quả (Effectiveness) Các phép toán trong các bước phải đủ đơn giản để có thể thực hiện được. Tính tổng quát (Generalness) Thuật toán phải có tính tổng quát, có thể áp dụng cho một lớp đối tượng. Ví dụ: Thuật toán Euclid: Tìm ước số chung lớn nhất của hai số tự nhiên m,n. Input: m,n nguyên dương Output: g là ước số chung lớn nhất của m và n Phương pháp: 1.
r:= m mod n 8 BÀI GIẢNG TIN HỌC CƠ SỞ 2 – KHOA CNTT1 2. Nếu r=0 thì g:=n Ngược lại (r>0) m:=n; n:=r và quay lại bước 1. Sự ra đời và phát triển của ngôn ngữ C Năm 1970 Ken Thompson sáng tạo ra ngôn ngữ B dùng trong môi trường hệ điều hành UNIX trên máy điện toán DEC PD-7. B cũng là chữ tắt của BCPL (Basic Combined Progamming Language) do Martin Richards viết.
Năm 1972 Dennis Ritchie của hãng Bell Laboratories (và Ken Thompson) sáng tạo nên ngôn ngữ C nhằm tăng hiệu quả cho ngôn ngữ B. Lúc đầu ngôn ngữ C không được mọi người ưa dùng. Nhưng sau khi D.Ritchie cho xuất bản cuốn "The C Programming Language" (“Ngôn ngữ lập trình C”) thì ngôn ngữ C được chú ý và được sử dụng rộng rãi. Người ta đã dùng C để viết hệ điều hành đa nhiệm UNIX, O/S 2 và ngôn ngữ Dbase.
C đã được cải tiến qua nhiều phiên bản: trình biên dịch Turbo C từ phiên bản 1 đến phiên bản 5, Microsoft C từ phiên bản 1 đến phiên bản 6. Hiện nay, C lại được phát triển để thành C++ với 3 trình biên dịch: Borland C++, Visual C++ và Turbo C++. Mặc dù hiện nay có khá nhiều ngôn ngữ lập trình mới, nhưng C vẫn là một ngôn ngữ lập trình được ưa chuộng. C được ứng dụng để viết các phần mềm trong nhiều lĩnh vực, đặc biệt là trong khoa học kỹ thuật.
9 BÀI GIẢNG TIN HỌC CƠ SỞ 2 – KHOA CNTT1 2. MỘT SỐ KIẾN THỨC CƠ SỞ 2. Bộ kí tự, từ khóa,tên 2.1 Bộ kí tự trong C Mọi ngôn ngữ đều được xây dựng trên một bộ kí tự (các chữ, các kí hiệu). Đối với ngôn ngữ C sử dụng bộ kí tự sau: Tập các chữ cái in hoa: A, B, C, D, ., Z Tập các chữ cái in thường: a, b, c, d,.
, z Tập các chữ số: 0, 1, 2, 3,. , 9 Các dấu chấm câu: ,. ; : / ? [ ] { } !