Bài 1: Những khái niệm cơ bản về ngôn ngữ C

Mục tiêu

Kết thúc bài học kinh nghiệm này, bạn hoàn toàn có thể :

  • Phân biệt sự khác nhau giữa Câu lệnh, Chương trình và Phần mềm
  • Biết được quá trình hình thành C
  • Nên dùng C khi nào và tại sao
  • Nắm được cấu trúc một chương trình C
  • Hiểu rõ khái niệm giải thuật (algorithms)
  • Vẽ lưu đồ (flowchart)
  • Liệt kê các ký hiệu dùng trong lưu đồ

Xem thêm khoá học Lập trình C Online

Giới thiệu

Ngày nay, khoa học máy tính xâm nhập vào mọi nghành. Tự động hóa hiện đang là ngành chủ chốt điều hướng sự tăng trưởng quốc tế. Bất cứ ngành nghề nào cũng cần phải hiểu biết không ít về Công nghệ tin tức và lập trình nói chung. Cụ thể, C là một ngôn từ lập trình cấp cao mà mọi lập trình viên cần phải biết. Vì thế, trong giáo trình này, tất cả chúng ta sẽ nghiên cứu và điều tra chi tiết cụ thể cấu trúc ngôn từ C. Ðầu tiên tất cả chúng ta tìm hiểu và khám phá sự khác nhau của những khái niệm : Lệnh ( Command ), Chương trình ( Program ) và Phần mềm ( Software ) .

1. Hoạt động của máy tính

Khi một máy tính được khởi động, nó sẽ tự động hóa thực thi 1 số ít tiến trình và xuất hiệu quả ra màn hình hiển thị. Ðiều này diễn ra thế nào ? Câu vấn đáp đơn thuần là nhờ vào Hệ quản lý và điều hành thiết lập bên trong máy tính. Hệ quản lý và điều hành ( operating system ) được xem như ứng dụng mạng lưới hệ thống. Phần mềm này khởi động máy tính và thiết lập những thông số kỹ thuật bắt đầu trước khi trao quyền cho người dùng. Để làm được điều này, hệ điều hành quản lý phải được cấu trúc từ một tập hợp những chương trình. Mọi chương trình đều cố gắng nỗ lực đưa ra giải thuật cho một hay nhiều bài toán nào đó. Mọi chương trình cố gắng nỗ lực đưa ra giải pháp cho một hay nhiều yếu tố. Mỗi chương trình là tập hợp những câu lệnh xử lý một bài toán đơn cử. Một nhóm lệnh tạo thành một chương trình và một nhóm những chương trình tạo thành một ứng dụng .
Để rõ hơn, tất cả chúng ta hãy xem xét một thí dụ : Một người bạn đến nhà tất cả chúng ta 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. Chúng ta hướng dẫn cho anh ta làm như sau :

  1. Lấy một ít sữa.
  2. Đổ nước ép dâu vào.
  3. Trộn hỗn hợp này và làm lạnh.

Bây giờ nếu bạn của tất cả chúng ta theo những hướng dẫn này, họ cũng hoàn toàn có thể tạo ra món sữa dâu tuyệt vời .
Chúng ta hãy nghiên cứu và phân tích thông tư ( 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 tất cả chúng ta đủ mưu trí để hiểu được công thức pha chế nói trên, mặc dầu còn nhiều điểm chưa rõ ràng. Do vậy nếu tất cả chúng ta muốn phổ biến cách làm, tất cả chúng ta cần bổ trợ những bước như sau :

  1. Rót một ly sữa vào máy trộn.
  2. Đổ thêm vào một ít nước dâu ép.
  3. Ðóng nắp máy trộn
  4. Mở điện và bắt đầu trộn
  5. Dừng máy trộn lại
  6. Nếu đã trộn đều thì tắt máy, ngược lại thì trộn tiếp.
  7. Khi đã trộn xong, rót hỗn hợp vào tô và đặt vào tủ lạnh.
  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 như đinh hoàn hảo, rõ ràng hơn, ai cũng hoàn toàn có thể đọc và hiểu được .
Tương tự, máy tính cũng giải quyết và xử lý tài liệu dựa vào tập lệnh mà nó nhận được. Ðương nhiên những thông tư đưa cho máy vi tính cũng cần phải hoàn hảo và có ý nghĩa rõ ràng. Những thông tư này cần phải tuân thủ những quy tắc :

  1. Tuần tự
  2. Có giới hạn
  3. Chính xác.

Mỗi thông tư trong tập thông tư được gọi là “ câu lệnh ” và tập những câu lệnh được gọi là “ chương trình ” .
Chúng ta hãy 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 hoàn toàn có thể là :

  1. Nhập số thứ nhất và nhớ nó.
  2. Nhập số thứ hai và nhớ nó.
  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.
  4. Hiển thị kết quả.
  5. Kết thúc.

Tập lệnh trên tuân thủ tổng thể những quy tắc đã đề cập. Vì vậy, tập lệnh này là một chương trình và nó sẽ triển khai thành công việc cộng hai số trên máy tính .

Ghi chú: Khả năng nhớ của con người được biết đến như là trí nhớ, khả năng nhớ dữ liệu được đưa vào máy tính được gọi là “bộ nhớ”. Máy tính nhận dữ liệu tại một thời điểm và làm việc với dữ liệu đó vào thời điểm  khác, nghĩa là máy tính ghi dữ liệu vào trong bộ nhớ rồi sau đó đọc ra để truy xuất các giá trị dữ liệu và làm việc với chúng.

Khi khối lượng việc làm giao cho máy tính ngày càng nên nhiều và phức tạp thì toàn bộ những câu lệnh không hề được đưa vào một chương trình, chúng cần được chia ra thành 1 số ít chương trình nhỏ hơn. Tất cả những chương trình này sau cuối được tích hợp lại để chúng hoàn toàn có thể thao tác với nhau. Một tập hợp những chương trình như thế được gọi là ứng dụng .
Mối quan hệ giữa ba khái niệm câu lệnh, chương trình và ứng dụng hoàn toàn có thể được trình diễn bằng sơ đồ trong hình 1.1 :

1.1

Hình 1.1 : Phần mềm, chương trình và câu lệnh

2. Ngôn ngữ C

Vào đầu những năm 70 tại phòng thí nghiệm Bell, Dennis Ritchie đã tăng trưởng ngôn từ C. C được sử dụng lần đầu trên một mạng lưới hệ thống setup hệ điều hành quản lý UNIX. C có nguồn gốc từ ngôn từ BCPL do Martin Richards tăng trưởng. BCPL sau đó đã được Ken Thompson tăng trưởng thành ngôn từ B, đây là người khởi thủy ra C. ( 1972 ), ( 1999 : chuẩn C99, 1983 – 1989 : chuẩn C89 )
Trong khi BCPL và B không tương hỗ kiểu tài liệu thì C đã có nhiều kiểu tài liệu khác nhau. Những kiểu tài liệu chính gồm : kiểu ký tự ( character ), kiểu số nguyên ( interger ) và kiểu số thực ( float ) .
C link ngặt nghèo với mạng lưới hệ thống UNIX nhưng không bị trói buộc vào bất kỳ một máy tính hay hệ quản lý và điều hành nào. C rất hiệu suất cao để viết những chương trình thuộc nhiều những nghành nghề dịch vụ khác nhau .
C cũng được dùng để lập trình mạng lưới hệ thống. Một chương trình mạng lưới hệ thống có ý nghĩa tương quan đến hệ điều hành quản lý của máy tính hay những tiện ích tương hỗ nó. Hệ quản lý ( OS ), trình thông dịch ( Interpreters ), trình soạn thảo ( Editors ), chương trình Hợp Ngữ ( Assembly ) là những chương trình mạng lưới hệ thống. Hệ quản lý UNIX được tăng trưởng dựa vào C. C đang được sử dụng thoáng rộng chính do tính hiệu suất cao và linh động. Trình biên dịch ( compiler ) C có sẵn cho hầu hết những máy tính. Mã lệnh viết bằng C trên máy này hoàn toàn có thể được biên dịch và chạy trên máy khác chỉ cần đổi khác rất ít hoặc không đổi khác gì cả. Trình biên dịch C dịch nhanh và cho ra mã đối tượng người tiêu dùng không lỗi .
C khi thực thi cũng rất nhanh như hợp ngữ ( Assembly ). Lập trình viên hoàn toàn có thể tạo ra và bảo dưỡng thư viện hàm mà chúng sẽ được tái sử dụng cho chương trình khác. Do đó, những dự án Bất Động Sản lớn hoàn toàn có thể được quản trị thuận tiện mà tốn rất ít công sức của con người .

2.1. C – Ngôn ngữ bậc trung

C được hiểu là ngôn từ bậc trung chính do nó phối hợp những yếu tố của những ngôn từ cấp cao và những công dụng của hợp ngữ ( ngôn từ cấp thấp ). C cho phép thao tác trên những thành phần cơ bản của máy tính như bits, bytes, địa chỉ …. Hơn nữa, mã C rất dễ di chuyển nghĩa là ứng dụng viết cho loại máy tính này hoàn toàn có thể chạy trên một loại máy tính khác. Mặc dù C có năm kiểu tài liệu cơ bản, nhưng nó không được xem ngang hàng với ngôn từ hạng sang về mặt kiểu tài liệu. C được cho phép chuyển kiểu tài liệu. Nó cho phép thao tác trực tiếp trên bits, bytes, word và con trỏ ( pointer ). Vì vậy, nó được dùng cho lập trình mức mạng lưới hệ thống .

2.2. C – Ngôn ngữ cấu trúc

Thuật ngữ ngôn ngữ cấu trúc khối ( block-structured language ) không vận dụng với C. Ngôn ngữ cấu trúc khối được cho phép thủ tục ( procedures ) hay hàm ( functions ) được khai báo bên trong những thủ tục và hàm khác. C không được cho phép việc tạo hàm trong hàm nên nó không phải là ngôn từ cấu trúc khối. Tuy nhiên, nó được xem là ngôn từ cấu trúc vì nó có nhiều điểm giống với ngôn từ cấu trúc ALGOL, Pascal và 1 số ít ngôn từ tương tự như khác .

C cho phép có sự tổng hợp của mã lệnh và dữ liệu. Ðiều này là một đặc điểm riêng biệt của ngôn ngữ cấu trúc. Nó liên quan đến khả năng tập hợp cũng như ẩn dấu tất cả thông tin và các lệnh khỏi phần còn lại của chương trình để dùng cho những tác vụ riêng biệt. Ðiều này có thể thực hiện qua việc dùng các hàm hay các khối mã lệnh (Code Block). Các hàm được dùng để định nghĩa hay tách rời những tác vụ được yêu cầu trong chương trình. Ðiều này cho phép những chương trình hoạt động như trong một đơn vị thống nhất. Khối mã lệnh là một nhóm các câu lệnh chương trình được nối kết với nhau theo một trật tự logic nào đó và cũng được xem như một đơn vị thống nhất. Một khối mã lệnh được tạo bởi một tập hợp nhiều câu lệnh tuần tự giữa dấu ngoặc mở và đóng xoắn như dưới đây:


do
{
    i = i + 1;
    .
    .
    .
} while (i < 40);

Ngôn ngữ cấu trúc hỗ trợ nhiều cấu trúc dùng cho vòng lặp (loop) như là while, do-while, for. Những cấu trúc lặp này giúp lập trình viên điều khiển hướng thực thi trong chương trình.

3. Cấu trúc chương trình C

C có 1 số ít từ khóa, đúng mực là 32. Những từ khóa này phối hợp với cú pháp của C hình thành ngôn từ C. Nhưng nhiều trình biên dịch cho C đã thêm vào những từ khóa dùng cho việc tổ chức triển khai bộ nhớ ở những quá trình tiền giải quyết và xử lý nhất định .
Vài quy tắc khi lập trình C như sau :

  •    Tất cả từ khóa là chữ thường (không in hoa)
  •    Ðoạn mã trong chương trình C có phân biệt chữ thường và chữ hoa. Ví dụ : do while thì khác với DO WHILE
  •    Từ khóa không thể dùng cho các mục đích khác như đặt tên biến (variable name) hoặc tên hàm (function name)
  •     Hàm main()  luôn là hàm đầu tiên được gọi đến khi một chương trình bắt đầu chạy (chúng ta sẽ xem xét kỹ hơn ở phần sau)

Xem xét đoạn mã chương trình :


main ()
{
    /* Đây là một chương trình ví dụ */
    int i = 0;
    i = i + 1;
    .
    .
}

Ghi chú: Những khía cạnh khác nhau của chương trình C được xem xét qua đoạn mã trên. Ðoạn mã này xem như là đoạn mã mẫu, nó sẽ được dùng lại trong suốt phần còn lại của giáo trình này.

3.1. Ðịnh nghĩa Hàm

Chương trình C được chia thành từng đơn vị chức năng gọi là hàm. Ðoạn mã mẫu chỉ có duy nhất một hàm main ( ). Hệ điều hành quản lý luôn trao quyền tinh chỉnh và điều khiển cho hàm main ( ) khi một chương trình C được thực thi. Tên hàm luôn được theo sau là cặp dấu ngoặc đơn ( ). Trong dấu ngoặc đơn hoàn toàn có thể có hay không có những tham số ( parameters ) .

3.2. Dấu phân làn ( Delimiters )

Sau định nghĩa hàm sẽ là dấu ngoặc xoắn mở {. Nó thông báo điểm bắt đầu của hàm. Tương tự, dấu ngoặc xoắn đóng } sau câu lệnh cuối trong hàm chỉ ra điểm kết thúc của hàm. Dấu ngoặc xoắn mở đánh dấu điểm bắt đầu của một khối mã lệnh, dấu ngoặc xoắn đóng đánh dấu điểm kết thúc của khối mã lệnh đó. Trong đoạn mã mẫu có 2 câu lệnh giữa 2 dấu ngoặc xoắn.

Hơn nữa, so với hàm, dấu ngoặc xoắn cũng dùng để phân định những đoạn mã trong trường hợp dùng cho cấu trúc vòng lặp và lệnh điều kiện kèm theo ..

3.3. Dấu kết thúc câu lệnh ( Terminator )

Dòng  int i = 0; trong đoạn mã mẫu là một câu lệnh (statement). Một câu lệnh trong C thì được kết thúc bằng dấu chấm phẩy (😉. C không hiểu việc xuống dòng dùng phím Enter, khoảng trắng dùng phím spacebar hay một khoảng cách do dùng phím tab. Có thể có nhiều hơn một câu lệnh trên cùng một hàng nhưng mỗi câu lệnh phải được kết thúc bằng dấu chấm phẩy. Một câu lệnh không được kết thúc bằng dấu chấm phẩy được xem như một câu lệnh sai.

Những chú thích thường được viết để miêu tả việc làm của một lệnh đặc biệt quan trọng, một hàm hay hàng loạt chương trình. Trình biên dịch sẽ không dịch chúng. Trong C, chú thích mở màn bằng ký hiệu / * và kết thúc bằng * /. Trường hợp chú thích có nhiều dòng, ta phải quan tâm ký hiệu kết thúc ( * / ), nếu thiếu ký hiệu này, hàng loạt chương trình sẽ bị coi như là một chú thích. Trong đoạn mã mẫu dòng chữ “ This is a sample program ” là dòng chú thích. Trong trường hợp chú thích chỉ trên một dòng ta hoàn toàn có thể dùng / /. Ví dụ :
int a = 0 ; / / Biến ‘ a ’ đã được khai báo như thể một kiểu số nguyên ( interger )

3.5. Thư viện C ( Library )

Tất cả trình biên dịch C chứa một thư viện hàm chuẩn dùng cho những tác vụ chung. Một vài bộ setup C đặt thư viện trong một tập tin ( file ) lớn trong khi đa phần còn lại chứa nó trong nhiều tập tin nhỏ. Khi lập trình, những hàm được chứa trong thư viện hoàn toàn có thể được dùng cho nhiều loại tác vụ khác nhau. Một hàm ( được viết bởi một lập trình viên ) hoàn toàn có thể được đặt trong thư viện và được dùng bởi nhiều chương trình khi được nhu yếu. Vài trình biên dịch được cho phép hàm được thêm vào thư viện chuẩn trong khi số khác lại nhu yếu tạo một thư viện riêng .

4. Biên dịch và thực thi một chương trình ( Compiling and Running )

Những bước khác nhau của việc dịch một chương trình C từ mã nguồn thành mã thực thi được triển khai như sau :

  • Soạn thảo/Xử lý từ

Ta dùng một trình giải quyết và xử lý từ ( word processor ) hay trình soạn thảo ( editor ) để viết mã nguồn ( source code ). C chỉ đồng ý loại mã nguồn viết dưới dạng tập tin văn bản chuẩn. Vài trình biên dịch ( compiler ) cung ứng thiên nhiên và môi trường lập trình ( xem phụ lục ) gồm trình soạn thảo .

  • Mã nguồn

Ðây là đoạn văn bản của chương trình mà người dùng hoàn toàn có thể đọc. Nó là nguồn vào của trình biên dịch C .

  • Bộ tiền xử lý C

Từ mã nguồn, bước tiên phong là chuyển nó qua bộ tiền giải quyết và xử lý của C. Bộ tiền giải quyết và xử lý này sẽ xem xét những câu lệnh mở màn bằng dấu #. Những câu lệnh này gọi là những thông tư tiền biên dịch ( directives ). Điều này sẽ được lý giải sau. Chỉ thị tiền biên dịch thường được đặt nơi khởi đầu chương trình mặc dầu nó hoàn toàn có thể được đặt bất kỳ nơi nào khác. Chỉ thị tiền biên dịch là những tên ngắn gọn được gán cho một tập mã lệnh .

  • Mã nguồn mở rộng C

Bộ tiền giải quyết và xử lý của C khai triển những thông tư tiền biên dịch và đưa ra tác dụng. Ðây gọi là mã nguồn C lan rộng ra, sau đó nó được chuyển cho trình biên dịch C .

  • Trình biên dịch C (Compiler)

Trình biên dịch C dịch mã nguồn lan rộng ra thành ngôn từ máy để máy tính hiểu được .
Nếu chương trình quá lớn nó hoàn toàn có thể được chia thành những tập tin riêng không liên quan gì đến nhau và mỗi tập tin hoàn toàn có thể được biên dịch riêng rẽ. Ðiều này giúp ích khi mà một tập tin bị biến hóa, toàn chương trình không phải biên dịch lại .

  • Bộ liên kết (Linker)

Mã đối tượng người tiêu dùng cùng với những thủ tục tương hỗ trong thư viện chuẩn và những hàm được dịch riêng không liên quan gì đến nhau khác liên kết lại bởi Bộ link để cho ra mã hoàn toàn có thể thực thi được .

  • Bộ nạp (Loader)

Mã thực thi được thi hành bởi bộ nạp của mạng lưới hệ thống .
Tiến trình trên được miêu tả qua lưu đồ 1.2 sau :

1.2

5. Các bước lập trình xử lý yếu tố

Chúng ta thường gặp phải những bài toán. Để xử lý những bài toán đó, tất cả chúng ta cần hiểu chúng trước rồi sau đó mới hoạch định những bước cần làm .

Giả sử chúng ta muốn đi từ phòng học đến quán ăn tự phục vụ ở tầng hầm. Ðể thực hiện việc này chúng ta cần hiểu nó rồi tìm ra các bước giải quyết trước khi thực thi các bước đó:

  • BƯỚC 1 : Rời phòng
  • BƯỚC 2 : Ðến cầu thang
  • BƯỚC 3 : Xuống tầng hầm
  • BƯỚC 4 : Ði tiếp đến quán ăn tự phục vụ

Thủ tục trên liệt kê tập hợp những bước triển khai được xác lập rõ ràng cho việc xử lý yếu tố. Một tập hợp những bước như vậy gọi là giải thuật ( Algorithm hay gọi vắn tắt là algo ) .
Một giải thuật ( còn gọi là thuật toán ) hoàn toàn có thể được định nghĩa như thể một thủ tục, công thức hay cách xử lý yếu tố. Nó gồm một tập hợp những bước giúp đạt được lời giải .
Qua phần trên, tất cả chúng ta thấy rõ ràng để xử lý được một bài toán, thứ nhất ta phải hiểu bài toán đó, kế đến tất cả chúng ta cần tập hợp tổng thể những thông tin tương quan tới nó. Bước kế sẽ là giải quyết và xử lý những mẩu thông tin đó. Cuối cùng, tất cả chúng ta cho ra giải thuật của bài toán đó .
Giải thuật tất cả chúng ta có là một tập hợp những bước được liệt kê dưới dạng ngôn từ đơn thuần. Rất hoàn toàn có thể rằng những bước trên do hai người khác nhau viết vẫn tựa như nhau nhưng ngôn từ dùng diễn đạt những bước hoàn toàn có thể khác nhau. Do đó, thiết yếu có những chiêu thức chuẩn mực cho việc viết giải thuật để mọi người thuận tiện hiểu nó. Chính vì thế, giải thuật được viết bằng cách dùng hai chiêu thức chuẩn là mã giả ( pseudo code ) và lưu đồ ( flowchart ) .
Cả hai giải pháp này đều dùng để xác lập một tập hợp những bước cần được thi hành để có được lời giải. Liên hệ tới yếu tố đi đến quán ăn tự phục vụ trên, tất cả chúng ta đã vạch ra một kế hoạch ( thuật toán ) để đến đích. Tuy nhiên, để đến nơi, tất cả chúng ta phải cần thi hành những bước này thật sự. Tương tự, mã giả và lưu đồ chỉ đưa ra những bước cần làm. Lập trình viên phải viết mã cho việc thực thi những bước này qua việc dùng một ngôn từ nào đó .
Chi tiết về về mã giả và lưu đồ được trình diễn dưới đây .

5.1. Mã giả ( pseudo code )

Nhớ rằng mã giả không phải là mã thật. Mã giả sử dụng một tập hợp những từ tựa như như mã thật nhưng nó không hề được biên dịch và thực thi như mã thật .

Chúng ta hãy xem xét mã giả qua ví dụ sau. Ví dụ này sẽ hiển thị câu ‘Hello World!’.
Ví dụ 1:

BEGIN
DISPLAY ‘ Hello World ! ’
END
Qua ví dụ trên, mỗi đoạn mã giả phải mở màn với từ BEGIN hoặc START, và kết thúc với từ END hay STOP. Ðể hiển thị giá trị nào đó, từ DISPLAY hoặc WRITE được dùng. Khi giá trị được hiển thị là một giá trị hằng ( không đổi ), trong trường hợp này là ( Hello World ), nó được đặt bên trong dấu nháy. Tương tự, để nhận một giá trị của người dùng, từ INPUT hay READ được dùng .
Ðể hiểu điều này rõ hơn, tất cả chúng ta xem xét ví dụ 2, ở ví dụ này ta sẽ nhập hai số và máy sẽ hiển thị tổng của hai số .

Ví dụ 2:

BEGIN
INPUT A, B
DISPLAY A + B
END
Trong đoạn mã giả này, người dùng nhập vào hai giá trị, hai giá trị này được lưu trong bộ nhớ và hoàn toàn có thể được truy xuất như thể A và B theo thứ tự. Những vị trí được đặt tên như vậy trong bộ nhớ gọi là biến. Chi tiết về biến sẽ được lý giải trong phần sau của chương này. Bước sau đó trong đoạn mã giả sẽ hiển thị tổng của hai giá trị trong biến A và B .
Tuy nhiên, cũng đoạn mã trên, ta hoàn toàn có thể bổ trợ để lưu tổng của hai biến trong một biến thứ ba rồi hiển thị giá trị biến này như trong ví dụ 3 sau đây .

Ví dụ 3:

BEGIN
INPUT A, B
C = A + B
DISPLAY C
END
Một tập hợp những thông tư hay những bước trong mã giả thì được gọi chung là một cấu trúc. Có ba loại cấu trúc : tuần tự, lựa chọn và lặp lại. Trong đoạn mã giả ta viết ở trên, tất cả chúng ta dùng cấu trúc tuần tự. Chúng được gọi như vậy vì những thông tư được thi hành tuần tự, cái này sau cái khác và khởi đầu từ điểm tiên phong. Hai loại cấu trúc còn lại sẽ được đề cập trong những chương sau .

5.2 Lưu đồ ( Flowcharts )

Một lưu đồ là một hình ảnh minh hoạ cho giải thuật. Nó vẽ ra biểu đồ của luồng thông tư hay những hoạt động giải trí trong một tiến trình. Mỗi hoạt động giải trí như vậy được trình diễn qua những ký hiệu .
Ðể hiểu điều này rõ hơn, tất cả chúng ta xem lưu đồ trong hình 1.3 dùng hiển thị thông điệp truyền thống cuội nguồn ‘ Hello World ! ’ .

1.3

Hình 1.3 : Lưu đồ
Lưu đồ giống với đoạn mã giả là cùng khởi đầu với từ BEGIN hoặc START, và kết thúc với từ END hay STOP. Tương tự, từ khóa DISPLAY được dùng để hiển thị giá trị nào đó đến người dùng. Tuy nhiên, ở đây, mọi từ khóa thì nằm trong những ký hiệu. Những ký hiệu khác nhau mang một ý nghĩa tương ứng được trình diễn ở bảng trong Hình 1.4 .

1.4

Hình 1.4 : Ký hiệu trong lưu đồ
Ta hãy xét lưu đồ cho ví dụ 3 như ở Hình 1.5 dưới đây .

1.5

Hình 1.5 : Lưu đồ cộng hai số
Tại bước mà giá trị của hai biến được cộng và gán cho biến thứ ba thì xem như thể một giải quyết và xử lý và được trình diễn bằng một hình chữ nhật .
Lưu đồ mà tất cả chúng ta xét ở đây là đơn thuần. Thông thường, lưu đồ trải rộng trên nhiều trang giấy. Trong trường hợp như vậy, hình tượng bộ nối được dùng để chỉ điểm nối của hai phần trong một chương trình nằm ở hai trang sau đó nhau. Vòng tròn chỉ sự nối kết và phải chứa ký tự hoặc số như ở hình 1.6. Như thế, tất cả chúng ta hoàn toàn có thể tạo link giưa hai lưu đồ chưa hoàn hảo .

1.6

Hình 1.6 : Bộ nối
Vài điểm thiết yếu khác phải quan tâm khi vẽ một lưu đồ :

  • Lúc đầu chỉ tập trung vào khía cạnh logic của bài toán và vẽ các luồng xử lý chính của lưu đồ
  • Một lưu đồ phải có duy nhất một điểm bắt đầu (START) và một điểm kết thúc (STOP).
  • Không cần thiết phải mô tả từng bước của chương trình trong lưu đồ mà chỉ cần các bước chính và có ý nghĩa cần thiết.

Chúng ta tuân theo những cấu trúc tuần tự, mà trong đó luồng thực thi chương trình đi qua tổng thể những thông tư mở màn từ thông tư tiên phong. Chúng ta hoàn toàn có thể phát hiện những điều kiện kèm theo trong chương trình, dựa trên những điều kiện kèm theo này hướng thực thi của chương trình hoàn toàn có thể rẽ nhánh. Những cấu trúc cho việc rẽ nhánh như thể cấu trúc lựa chọn, cấu trúc điều kiện kèm theo hay rẽ nhánh. Những cấu trúc này được đề cập cụ thể sau đây :

  • Cấu trúc IF (Nếu)

Cấu trúc lựa chọn cơ bản là cấu trúc ‘ IF ’. Ðể hiểu cấu trúc này tất cả chúng ta hãy xem xét ví dụ trong đó người mua được giảm giá nếu mua trên 100 đồng. Mỗi lần người mua trả tiền, một đoạn mã chương trình sẽ kiểm tra xem lượng tiền trả có quá 100 đồng không ?. Nếu đúng thế thì sẽ giảm giá 10 % của tổng số tiền trả, ngược lại thì không giảm giá .
Ðiều này được minh họa sơ lược qua mã giả như sau :
IF người mua mua trên 100 thì giảm giá 10 %

Cấu trúc dùng ở đây là câu lệnh IF.
Hình thức chung cho câu lệnh IF (cấu trúc IF) như sau:

IF Điều kiện
Các câu lệnh — — — — — – > Phần thân của cấu trúc IF
END IF
Một cấu trúc ‘ IF ’ khởi đầu là IF theo sau là điều kiện kèm theo. Nếu điều kiện kèm theo là đúng ( thỏa điều kiện kèm theo ) thì quyền điều khiển và tinh chỉnh sẽ được chuyển đến những câu lệnh trong phần thân để thực thi. Nếu điều kiện kèm theo sai ( không thỏa điều kiện kèm theo ), những câu lệnh ở phần thân không được thực thi và chương trình nhảy đến câu lệnh sau END IF ( chấm hết cấu trúc IF ). Cấu trúc IF phải được kết thúc bằng END IF .
Chúng ta xem ví dụ 4 cho cấu trúc IF .

Ví dụ 4:
Yêu cầu: Kiểm xem một số là chẵn hay không và hiển thị thông điệp báo nếu đúng là số chẵn, ta xử lý như sau :

BEGIN
INPUT num
r = num MOD 2

IF r=0

Display “ Number is even ”

END IF

END
Ðoạn mã trên nhập 1 số ít từ người dùng, thực thi toán tử MOD ( lấy phần dư ) và kiểm tra xem phần dư có bằng 0 hay không. Nếu bằng 0 hiển thị thông điệp, ngược lại thoát ra .
Lưu đồ cho đoạn mã giả trên biểu lộ qua hình 1.7 .

1.7

Hình 1.7 : Kiểm tra số chẵn
Cú pháp của lệnh IF trong C như sau :
if ( Điều kiện )
{
Câu lệnh
}

  • Cấu trúc IF…ELSE

Trong ví dụ 4, sẽ hay hơn nếu ta cho ra thông điệp báo rằng số đó không là số chẵn tức là số lẻ thay vì chỉ thoát ra. Ðể làm điều này ta hoàn toàn có thể thêm câu lệnh IF khác để kiểm tra xem trường hợp số đó không chia hết cho 2. Ta xem ví dụ 5 .

Ví dụ 5:

BEGIN
INPUT num
r = num MOD 2

IF r=0

DISPLAY “ Even number ”

END IF

IF r<>0

DISPLAY “ Odd number ”

END IF

END

Ngôn ngữ lập trình cung cấp cho chúng ta cấu trúc IF…ELSE. Dùng cấu trúc này sẽ hiệu quả và tốt hơn để giải quyết vấn đề. Cấu trúc IF …ELSE giúp lập trình viên chỉ làm một phép so sánh và sau đó thực thi các bước tùy theo kết quả của phép so sánh là True (đúng) hay False (sai).

Cấu trúc chung của câu lệnh IF…ELSE như sau:

IF Điều kiện

Câu lệnh 1

 ELSE

         Câu lệnh 2

 END IF

Cú pháp của cấu trúc if … else trong C như sau :
if ( Điều kiện )
{
Câu lệnh 1
}
else
{
Câu lệnh 2
}
Nếu điều kiện kèm theo thỏa ( True ), câu lệnh 1 được thực thi. trái lại, câu lệnh 2 được thực thi. Không khi nào cả hai được thực thi cùng lúc. Vì vậy, đoạn mã tối ưu hơn cho ví dụ tìm số chẵn được viết ra như ví dụ 6 .

Ví dụ 6:

BEGIN
INPUT num
r = num MOD 2

IF r = 0

DISPLAY “ Even Number ”

ELSE

DISPLAY “ Odd Number ”

END IF

END
Lưu đồ cho đoạn mã giả trên bộc lộ qua Hình 1.8 .

1.8

Hình 1.8 : Số chẵn hay số lẻ

  • Ða điều kiện sử dụng AND/OR

Cấu trúc IF … ELSE làm giảm độ phức tạp, ngày càng tăng tính hữu hiệu. Ở một mức độ nào đó, nó cũng nâng cao tính dễ đọc của mã. Các thí dụ IF tất cả chúng ta đã đề cập đến thời gian này thì khá đơn thuần. Chúng chỉ có một điều kiện kèm theo trong IF để nhìn nhận. Thỉnh thoảng tất cả chúng ta phải kiểm tra cho hơn một điều kiện kèm theo, thí dụ : Ðể xem xét nhà cung ứng có đạt MVS ( nhà cung ứng quan trọng nhất ) không ?, một công ty sẽ kiểm tra xem nhà phân phối đó đã có thao tác với công ty tối thiểu 10 năm không ? và đã có tổng doanh thu tối thiểu 5,000,000 không ?. Hai điều kiện kèm theo thỏa mãn nhu cầu thì nhà phân phối được xem như thể một MVS. Do đó toán tử AND hoàn toàn có thể được dùng trong câu lệnh ‘ IF ’ như trong ví dụ 7 sau :

Ví dụ 7:

BEGIN
INPUT yearsWithUs
INPUT bizDone

IF yearsWithUs >= 10 AND bizDone >=5000000

DISPLAY “ Classified as an MVS ”
ELSE
DISPLAY “ A little more effort required ! ”
END IF
END
Ví dụ 7 cũng khá đơn thuần, vì nó chỉ có 2 điều kiện kèm theo. Ở trường hợp thực tiễn, tất cả chúng ta hoàn toàn có thể có nhiều điều kiện kèm theo cần được kiểm tra. Nhưng tất cả chúng ta hoàn toàn có thể thuận tiện dùng toán tử AND để nối những điều kiện kèm theo lại giống như ta đã làm ở trên .
Bây giờ, giả sử công ty trong ví dụ trên đổi pháp luật, họ quyết định hành động đưa ra điều kiện kèm theo thuận tiện hơn. Như là : Hoặc thao tác với công ty trên 10 năm hoặc có doanh thu ( giá trị thương mại, thanh toán giao dịch ) từ 5,000,000 trở lên. Vì vâỵ, ta thay thế sửa chữa toán tử AND bằng toán tử OR. Nhớ rằng toán tử OR cho ra giá trị True ( đúng ) nếu chỉ cần một điều kiện kèm theo là True .

  • Cấu trúc IF lồng nhau

Một cách khác để thực thi ví dụ 7 là sử dụng cấu trúc IF lồng nhau. Cấu trúc IF lồng nhau là câu lệnh IF này nằm trong trong câu lệnh IF khác. Chúng ta viết lại ví dụ 7 sử dụng cấu trúc IF lồng nhau ở ví dụ 8 như sau :

Ví dụ 8:

BEGIN
INPUT yearsWithUs
INPUT bizDone
IF yearsWithUs > = 10
IF bizDone > = 5000000
DISPLAY “ Classified as an MVS ”
ELSE
DISPLAY “ A little more effort required ! ”
END IF
ELSE
DISPLAY “ A little more effort required ! ”
END IF
END
Ðoạn mã trên triển khai cùng trách nhiệm nhưng không có ‘ AND ’. Tuy nhiên, tất cả chúng ta có một lệnh IF ( kiểm tra xem bizDone lớn hơn hoặc bằng 5,000,000 hay không ? ) bên trong lệnh IF khác ( kiểm tra xem yearsWithUs lớn hơn hoặc bằng 10 hay không ? ). Câu lệnh IF tiên phong kiểm tra điều kiện kèm theo thời hạn nhà cung ứng thao tác với công ty có lớn hơn 10 năm hay không. Nếu dưới 10 năm ( tác dụng trả về là False ), nó sẽ không công nhận nhà cung ứng là một MVS ; Nếu thỏa điều kiện kèm theo nó xét câu lệnh IF thứ hai, nó sẽ kiểm tra tới điều kiện kèm theo bizDone lớn hơn hoặc bằng 5,000,000 hay không. Nếu thỏa điều kiện kèm theo ( tác dụng trả về là True ) lúc đó nhà phân phối được xem là một MVS, nếu không thì một thông điệp báo rằng đó không là một MVS .
Lưu đồ cho mã giả của ví dụ 8 được trình diễn qua hình 1.9 .

1.9


Hình 1.9: Câu lệnh IF lồng nhau

Mã giả trong trường hợp này của cấu trúc IF lồng nhau tại ví dụ 8 chưa hiệu suất cao. Câu lệnh thông tin không thỏa điều kiện kèm theo MVS phải viết hai lần. Hơn nữa lập trình viên phải viết thêm mã nên trình biên dịch phải xét hai điều kiện kèm theo của lệnh IF, do đó tiêu tốn lãng phí thời hạn. trái lại, nếu dùng toán tử AND chỉ xét tới điều kiện kèm theo của câu lệnh IF một lần. Ðiều này không có nghĩa là cấu trúc IF lồng nhau nói chung là không hiệu suất cao. Nó tùy theo trường hợp đơn cử mà ta dùng nó. Có khi dùng toán tử AND hiệu suất cao hơn, có khi dùng cấu trúc IF lồng nhau hiệu suất cao hơn. Chúng ta sẽ xét một ví dụ mà dùng cấu trúc IF lồng nhau hiệu suất cao hơn dùng toán tử AND .
Một công ty định phần lương cơ bản cho công nhân dựa trên tiêu chuẩn như trong bảng 1.1 .
Cấp bậc
Kinh nghiệm
Lương

E
2
2000

E
3
3000

M
2
3000

M
3
4000

Bảng 1.1 : Lương cơ bản
Vì vậy, nếu một công nhân được xếp loại là E và có hai năm kinh nghiệm tay nghề thì lương là 2000, nếu ba năm kinh nghiệm tay nghề thì lương là 3000 .
Mã giả dùng toán tử AND cho yếu tố trên như ví dụ 9 :

Ví dụ 9:

BEGIN
INPUT grade
INPUT exp
IF grade = ” E ” AND exp = 2
salary = 2000
ELSE
IF grade = “ E ” AND exp = 3
salary = 3000
END IF
END IF
IF grade = ” M ” AND exp = 2
salary = 3000
ELSE
IF grade = “ M ” AND exp = 3
salary = 4000
END IF
END IF
END
Câu lệnh IF tiên phong kiểm tra xếp loại và kinh nghiệm tay nghề của công nhân. Nếu xếp loại là E và kinh nghiệm tay nghề là 2 năm thì lương là 2000, ngoài những nếu xếp loại E, nhưng có 3 năm kinh nghiệm tay nghề thì lương là 3000 .
Nếu cả 2 điều kiện kèm theo không thỏa thì câu lệnh IF thứ hai cũng tương tự như sẽ kiểm điều kiện kèm theo xếp loại và kinh nghiệm tay nghề cho công nhân để phân định lương .
Giả sử xếp loại của một công nhân là E và có hai năm kinh nghiệm tay nghề. Lương người đó sẽ được tính theo mệnh đề IF tiên phong. Phần còn lại của câu lệnh IF thứ nhất được bỏ lỡ. Tuy nhiên, điều kiện kèm theo tại mệnh đề IF thứ hai sẽ được xét và tất yếu là không thỏa, do đó nó kiểm tra mệnh đề ELSE của câu lệnh IF thứ 2 và hiệu quả cũng là False. Ðây quả là những bước thừa mà chương trình đã xét qua. Trong ví dụ, ta chỉ có hai câu lệnh IF do tại ta chỉ xét có hai loại là E và M. Nếu có khoảng chừng 15 loại thì sẽ tốn thời hạn và tài nguyên máy tính cho việc thống kê giám sát thừa mặc dầu lương đã xác lập tại câu lệnh IF tiên phong. Ðây dứt khoát không phải là mã nguồn hiệu suất cao .
Bây giờ tất cả chúng ta xét mã giả dùng cấu trúc IF lồng nhau đã được sửa đổi trong ví dụ 10 .

Ví dụ 10:

BEGIN
INPUT grade
INPUT exp
IF grade = ” E ”
IF exp = 2
salary = 2000
ELSE
IF exp = 3
salary = 3000
END IF
END IF
ELSE
IF grade = ” M ”
IF exp = 2
Salary = 3000
ELSE
IF exp = 3
Salary = 4000
END IF
END IF
END IF
END IF
END
Ðoạn mã trên nhìn khó đọc. Tuy nhiên, nó đem lại hiệu suất cao hơn. Chúng ta xét cùng ví dụ như trên. Nếu công nhân được xếp loại là E và kinh nghiệm tay nghề là 2 năm thì lương được tính là 2000 ngay trong trong bước đầu của câu lệnh IF. Sau đó, chương trình sẽ thoát ra vì không cần thực thi thêm bất kỳ lệnh ELSE nào. Do đó, không có sự tiêu tốn lãng phí và đoạn mã này mang lại hiệu suất cho chương trình và chương trình chạy nhanh hơn .

  • Vòng lặp

Một chương trình máy tính là một tập các câu lệnh sẽ được thực hiện tuần tự. Nó có thể lặp lại một số bước với số lần lặp xác định theo yêu cầu của bài toán hoặc đến khi một số điều kiện nhất định được thỏa.
Chẳng hạn, ta muốn viết chương trình hiển thị tên của ta 5 lần. Ta xét mã giả dưới đây.

Ví dụ 11:

BEGIN
DISPLAY “ Scooby ”
DISPLAY “ Scooby ”
DISPLAY “ Scooby ”
DISPLAY “ Scooby ”
DISPLAY “ Scooby ”
END
Nếu để hiển thị tên ta 1000 lần, nếu ta viết DISPLAY “ Scooby ” 1000 lần thì rất tốn sức lực lao động. Ta hoàn toàn có thể tinh giản yếu tố bằng cách viết câu lệnh DISPLAY chỉ một lần, sau đó đặt nó trong cấu trúc vòng lặp, và thông tư máy tính thực thi lặp 1000 lần cho câu lệnh trên .
Ta xem mã giả của cấu trúc vòng lặp trong ví dụ 12 như sau :

Ví dụ 12:

Do loop 1000 times
DISPLAY “ Scooby ”
End loop

Những câu lệnh nằm giữa Do loop và End loop (trong ví dụ trên là lệnh DISPLAY) được thực thi 1000 lần. Những câu lệnh này cùng với các lệnh do loopend loop được gọi là cấu trúc vòng lặp. Cấu trúc vòng lặp giúp lập trình viên phát triển thành những chương trình lớn trong đó có thể yêu cầu thực thi hàng ngàn câu lệnh. Do loop…end loop là một dạng thức tổng quát của vòng lặp.
Ví dụ sau là cách viết khác nhưng cũng dùng cấu trúc vòng lặp.

Ví dụ 13:

BEGIN
cnt = 0

WHILE (cnt < 1000)

DO

DISPLAY “ Scooby ”
cnt = cnt + 1

END DO

END
Lưu đồ cho mã giả trong ví dụ 13 được vẽ trong Hình 1.10 .

1.10

  Hình 1.10: Cấu trúc vòng lặp

Chú ý rằng Hình 1.10 không có ký hiệu đặc biệt quan trọng nào để màn biểu diễn cho vòng lặp. Chúng ta dùng ký hiệu phân nhánh để kiểm tra điều kiện kèm theo và quản trị hướng đi của của chương trình bằng những dòng chảy ( flow_lines ) .

Tóm tắt bài học kinh nghiệm

  • Phần mềm là một tập hợp các chương trình.
  • Một chương trình là một tập hợp các chỉ thị (lệnh).
  • Những đoạn mã lệnh là cơ sở cho bất kỳ một chương trình C nào.
  • Ngôn ngữ C có 32 từ khóa.
  • Các bước cần thiết để giải quyết một bài toán là nghiên cứu chi tiết bài toán đó, thu thập thông tin thích hợp, xử lý thông tin và đi đến kết quả.
  • Một giải thuật là một danh sách rút gọn và logic các bước để giải quyết vấn đề. Giải thuật được viết bằng mã giả hoặc lưu đồ.
  • Mã giả là sự trình bày của giải thuật trong ngôn ngữ tương tự như mã thật
  • Một lưu đồ là sự trình bày dưới dạng biểu đồ của một giải thuật.
  • Lưu đồ có thể chia nhỏ thành nhiều phần và đầu nối dùng cho việc nối chúng lại tại nơi chúng bị chia cắt.
  • Một chương trình có thể gặp một điều kiện dựa theo đó việc thực thi có thể được phân theo các nhánh rẽ khác nhau. Cấu trúc lệnh như vậy gọi là cấu trúc chọn lựa, điều kiện hay cấu trúc rẽ nhánh.
  • Cấu trúc chọn cơ bản là cấu trúc “IF”.
  • Cấu trúc IF …ELSE giúp lập trình viên chỉ làm so sánh đơn và sau đó thực thi các bước tùy theo kết quả của phép so sánh là True (đúng) hay False (sai).
  • Cấu trúc IF lồng nhau là câu lệnh IF này nằm trong câu lệnh IF khác.
  • Thông thường ta cần lặp lại một số bước với số lần lặp xác định theo yêu cầu của bài toán hoặc đến khi một số điều kiện nhất định được thỏa. Những cấu trúc giúp làm việc này gọi là cấu trúc vòng lặp.

Kiểm tra tiến trình học tập

  1. C cho phép __ có sự tổng hợp __________ của mã và dữ liệu.
  1. Một flowchart      là một sự trình bày dạng biểu đồ minh họa tính tuần tự của những hoạt động được thực thi nhằm đạt được một lời giải.
  1. Lưu đồ giúp chúng ta xem xét lại và gỡ rối chương trình một cách dễ dàng. (True / False)                                                                                                                                                     
  1. Một lưu đồ có thể có tuỳ ý số điểm bắt đầu và số điểm kết thúc. (True / False)
  1. Một _ vòng lặp ___ cơ bản là việc thực thi tuần tự những câu lệnh đến khi một điều kiện cụ thể nào đó là đúng (True) hay sai (False).

Bài tập tự làm

  1. Viết một đoạn mã giả và vẽ một lưu đồ để nhập một giá trị là độ 0C (Celsius) và chuyển nó sang độ 0F (Fahrenheit). [Hướng dẫn: C/5 = (F-32)/9]
  1. Viết một đoạn mã giả và vẽ một lưu đồ để nhập điểm của một sinh viên cho các môn : Vật lý, Hóa học, và Sinh học. Sau đó hiển thị điểm trung bình và tổng của những điểm này.

Viết một bình luận