CÁC THÀNH PHẦN CƠ BẢN TRONG NGÔN NGỮ LẬP TRÌNH

NGÔ QUỐC VIỆT-LÊ ĐỨC LONG 2011

1. Tổng quát về lập trình 2. Khái niệm từ khoá 3. Các kiểu dữ liệu cơ bản 4. Đặt tên, khai báo biến, hằng, và các vấn đề

liên quan sử dụng biến/hằng.

5. Nhập xuất dữ liệu 6. Sử dụng toán tử, biểu thức và cách viết một

số lệnh cơ bản trong lập trình

7. Một số quy ước lập trình để viết chương

trình trong sáng.

2

 Sinh viên sẽ nắm vững và vận dụng các kỹ

năng cơ bản sau cần cho lập trình  Từ khoá  Các kiểu dữ liệu  Cách ghi chú  Đặt tên và khai báo biến  Phạm vi sử dụng biến

 Trình bày cách viết một chương trình dễ đọc

và trong sáng.

3

1. Phân tích và xác định nhập-xử lý-xuất (I-P-O) 2. Xác định thuật giải (mã giả hay lưu đồ) 3. Cài đặt với ngôn ngữ lập trình cụ thể 4. Biên dịch (kiển tra cú pháp) và chạy thử 5. Kiểm chứng và hoàn thiện chương trình

 Lập trình phần nào đó là ánh xạ cách giải quyết đã xác định sang một ngôn ngữ lập trình.

4

 Là yếu tố quan trọng nhất của lập trình  Giúp phân biệt ‘viên ngọc lập trình’ với ‘mớ

hỗn độn’.

 Phân biệt giữa ‘nghệ sỹ lập trình’ và ‘tên đồ tể

lập trình’

 Làm sao có ‘phong cách’ ?  Không có cách nào, ngoại trừ một vài nguyên tắc cơ bản:  Hãy đặt tên theo quy ước dễ hiểu  Hãy viết nhiều chú thích khi có thể.

 Nguyên tắc vàng: càng rõ ràng, càng đơn giản

càng tốt.

5

làm thực tế.

 Không có thầy giáo nào dạy tốt hơn kinh nghiệm

cả khi viết cho chính mình.

 Viết chú thích sẽ:

 Giúp tổ chức lại các suy nghĩ.  Giúp nhớ lại những gì đã làm.  Giúp làm việc nhóm hiệu quả.

 Luôn đặt tên cho các thành phần của chương

trình một cách tường minh và dễ hiểu.

 Cần tổ chức và quản lý các tập tin mã nguồn

khoa học.

6

 Luôn viết thật nhiều chú thích khi lập trình. Ngay

Thực tế Bắt đầu

Kết thúc

thúc hàm chính (hàm

Kết main)

Ngôn ngữ lập trình Điểm vào (thường là hàm main)

Các lệnh trong chương trình Hằng (cố định trong cả chương trình)

Đủ loại dữ kiện Giải thích thêm

Biến (thay đổi được). Phải khai báo ba biến để có thể gán giá trị mới. Kiểu dữ liệu Chú thích trong chương trình

7

Xử lý vấn đề Xác định trước và không thay đổi, ví dụ: số (3.1416). Thay đổi, ví dụ hệ số a, b, c của phương trình bậc 2

 Quy trình xử lý cơ bản của máy tính

 Ví dụ: xác định I-P-O của việc nấu cơm.  Bài tập ngắn: xác định I-P-O của giải

phương trình bậc 1.

 Bài tập: xác định I-P-O của giải phương

trình bậc 2. Vẽ lưu đồ thể hiện.

 Xem: Giai Phuong Trinh Bac 2

8

Chuyển từ bài toán thành chương trình

BÀI TOÁN

CHƢƠNG TRÌNH

Dữ liệu của chƣơng trình

Dữ liệu của bài toán

Giá trị đầu vào, đầu ra

Biến, hằng

Input: a, b Output: max (a,b) Nếu a>b thì max  a Ngược lại max  b

Quá trình tính toán của bài toán

Các cấu trúc của chƣơng trình

Các bước tính toán

Các câu lệnh xử lý

9

Dữ liệu của bài toán sẽ đƣợc biểu diễn lại dƣới dạng các biến (variable) của chƣơng trình thông qua các quy tắc xác định của NNLT cụ thể (*)

(*) Hoàng Kiếm (2000), Giải một bài toán trên máy tính như thế nào – Tập 1, NXB Giáo dục

10

 Là tập các từ dành riêng (nghĩ là không dùng chúng làm của riêng) cho từng nnlt cụ thể. Ví dụ, trong ngôn ngữ C/C++.

 Các từ khoá sẽ tham gia như một thành phần của từng câu lệnh. Ngoài ra, mỗi lệnh còn có sự tham gia của biến, hằng và biểu thức.

11

Tập kí tự dùng trong NNLT bậc cao

 Ngôn ngữ C được xây dựng trên bộ ký tự sau:

A B C .. Z

 26 chữ cái hoa  26 chữ cái thường a b c .. z  10 chữ số  Các ký hiệu toán học  Ký tự gạch nối  Các ký tự khác

0 1 2 .. 9 + - * / = ( ) _ . , : ; [ ] {} ! \ & % # $ ...

Dấu cách (space) dùng để tách các từ.

Ví dụ: tiếng VIET NAM có 8 ký tự, còn VIETNAM chỉ có 7 ký tự. Tập kí tự dùng trong NNLT Pascal thì sao ???

12

 Tại sao nên viết: cho dễ hiểu, nhớ là đã làm gì.  Viết ở đâu?

 Đầu mỗi tập tin mã nguồn.  Đầu mỗi hàm  Ở các lệnh quan trọng trong hàm (sẽ nói sau).

 Viết những gi?

 Hàm hay tập tin mã nguồn này làm gì.  In, Output của từng hàm/tập tin mã nguồn.

13

 Heading  Author (tác giả)  Purpose (mục đích)  Usage (cách sử dụng)  References (tham khảo)  File Formats (định dạng tập tin)  Restrictions (một số hạn chế-nếu có)  Revision History (phiên bản)  Error Handling (điều khiển lỗi)  Notes (chú thích thêm)

14

hello -- program to print out "Hello World". Not an especially earth-shattering program. Author: Ngô Quốc Việt Purpose: Demonstration of a simple program Usage: Run the program and the message appears

/* * * * * * * */ #include "stdafx.h" #include int main(int argc, char* argv[]) {

// Tell the world hello printf("Hello World!\n"); getchar();

return 0;

}

15

16

17

 Luôn dóng cột cho lệnh (hoặc khối lệnh) cho

các cấu trúc điều khiển (thảo luận sau).

 Không viết hai (hay nhiều) lệnh trên cùng một

dòng.

 Tránh lồng nhau quá sâu (thảo luận sau).  Tách tập tin mã nguồn lớn (nhiều hơn 1000 dòng lệnh) thành những tập mã nguồn nhỏ  Nguyên tắc vàng: càng rõ ràng, càng đơn

giản càng tốt.

18

 Mọi kiểu dữ liệu (có hay không có cấu trúc) đều dựa trên các kiểu dữ liệu cơ bản. Cụ thể:

char/string, integer, float, double, boolean

 Mỗi ngôn ngữ lập trình có khai báo và sử dụng kiểu dữ liệu khác nhau (tuy không nhiều) cho các biến, tham số, hằng.

 Lựa chọn kiểu dữ liệu là yếu tố quan trọng trong lập trình cần phải nắm vững miền giá trị, độ chính xác, dung lượng nhớ của kiểu.

19

 Các kiểu dữ liệu cơ bản trong C/C++

Nguồn: http://www.cplusplus.com/doc/tutorial/variables/  Chú ý đặc biệt: kích thước vùng nhớ và miền giá trị của kiểu dữ liệu không hoàn toàn giống nhau giữa các nnlt. Đọc thêm: cách biểu diễn dữ liệu kiểu số thực

20

Giá trị

Kiểu char

Biểu diễn ‘A’, ‘B’

string short int long int “Hello world” 2, -8, 30 2L,

1.12345, 0.001

boolean float double true, false 1.12345 1.12345, 1E-3

21

long double 1.12345, 1E-3 1.12345, 0.001

 Sử dụng tên dài (nhưng đừng quá dài) và có

nghĩa dễ hiểu. int account

 Chú thích cho biến  Có kèm thêm kiểu của biến trong tên biến

//khai báo biến kiểu integer trong C.

int iAccount; String sAccount; double dbMoney; bool bFaultTransaction;

//số tài khoản //tên tài khoản //số tiền còn //giao dịch thất bại.

 Luôn có chú thích đầu hàm (hay tập tin mã

nguồn)

22

 Có thể dùng chữ hoa hay dấu gạch dưới ở

đầu các từ có nghĩa.

//hoặc

double dbCurrentMoney; double db_current_money;

 Nên dùng chữ hoa để đặt tên hằng (số, chuỗi,

bool, …)

MAX_ITEMS, SCREEN_WIDTH

 Chỉ dùng các ký tự az, AZ, 09, dấu

gạch dưới để đặt tên.

 Ký tự đầu tiên phải là chữ.  Không dùng chữ tiếng Việt có dấu để đặt tên.

23

 Hầu hết nnlt phân biệt chữ hoa / chữ

thường (gọi là case sensitive).  Nghĩa là: nội dung giống nhau, nhưng khác ở chữ hoa, chữ thường ở một vài ký tự cũng được xem là khác nhau

 Ví dụ: name và Name. Chúng được xem là hai tên

khác nhau.

 Hầu hết nnlt: biến, hằng luôn được khai báo và sử dụng sử dụng kèm theo kiểu dữ liệu.

24

Nguyên lý thứ hai !!!

Các cấu trúc của chƣơng trình

Chuyển đổi quá trình tính toán của bài toán

MỌI QUÁ TRÌNH TÍNH TOÁN ĐỀU CÓ THỂ MÔ TẢ VÀ THỰC HIỆN DỰA TRÊN BA CẤU TRÚC CƠ BẢN:

 CẤU TRÚC TUẦN TỰ  CẤU TRÚC RẼ NHÁNH  CẤU TRÚC LẶP

C. Bohm & G. Jacopini (1966), Flow Diagrams, Turing Machines and Languages With Only Two Formation Rules. In Communications of ACM, Vol.9, Number 5, May 1966.

25

Chương trình

Biến

Hàm hay thủ tục

Hằng

Khối lệnh

Lệnh

Gán

Điều kiện

Lặp

Biểu thức

So sánh

26

 Biến là nơi lưu trữ giá trị – số nguyên, số thực, kí tự, ….  Một biến chỉ có thể lưu được một loại giá trị nhất định  kiểu dữ liệu của biến  Giá trị mà biến đang lưu trữ có thể bị thay đổi nhiều lần trong quá trình chương trình thi hành  Một biến bất kì trong máy tính có 3 thuộc tính:

 Tên biến (được đặt tên do người lập trình – gọi là định danh – indentifier)  Kiểu dữ liệu của biến  Giá trị hiện tại mà biến đang lưu trữ

 Biến cần phải được khai báo (định nghĩa) trước khi sử dụng

Ví dụ:

STT 50 DiemTB 7.8 TenSV

“Long”

Biến có tên STT, kiểu số nguyên, đang lưu trữ giá trị là 50 Biến có tên DiemTB, kiểu số thực, đang lưu trữ giá trị là 7.8 Biến có tên TenSV, kiểu chuỗi kí tự, đang lưu trữ một dòng chữ

o Ý nghĩa của biến chỉ được hiểu bởi con người, kô có nghĩa với PC; o Tên biến cần gợi nhớ và thống nhất; o Tên biến phải hợp lệ – tuân thủ theo quy ước của NNLT.

27

thay đổi được (qua lệnh gán)

 Biến (variable): dùng để lưu trữ giá trị có thể

 Cú pháp khai báo biến trong C/C++

name;

 Datatype  Ví dụ:

int iSonguyento; string sName; char cMychar; float fSoFloat;

 Mỗi chương trình có thể khai báo nhiều biến

theo nhu cầu.

28

riêng

 Biến không được đặt trùng tên với từ khoá dành

 Biến nên được khai báo ở đầu hàm, mặc dù có thể được đặt ở bất cứ đâu (thảo luận sau).

 Biến phải được khai báo trước khi sử dụng.

#include #include { int main() // Height of a rectangle (in inches) // Width of the rectangle (in inches) // Area of the rectangle (in square inches) //lệnh gán giá trị 3 cho biến height //lệnh gán giá trị 5 cho biến width

//biểu thức

/lệnh xem kết quả

int height; int width; int area; height = 3; width = 5 area = height * width; printf("Area is %d sq. inches \n", area); return 0;

}

29

KIỂU DỮ LIỆU (DATA TYPE)

Trong NNLT, loại giá trị mà biến lưu trữ được phân

thành những kiểu dữ liệu khác nhau

Thông thường, trong một NNLT có các kiểu dữ liệu

cơ sở sau:  Kiểu dữ liệu số: gồm có 2 loại

• Kiểu dữ liệu số nguyên • Kiểu dữ liệu số thực  Kiểu luận lý (logic)  Kiểu kí tự  Kiểu chuỗi kí tự

Mỗi kiểu dữ liệu có 1 miền giá trị khác nhau

30

Kiểu số nguyên

Reading(*)

Có nhiều kiểu số nguyên Tuỳ vào độ lớn của miền giá trị, có:

-128

127

0

0

255

• Loại có dấu: - 32,768  32,767 • Loại không dấu: 0  65,535

 Số nguyên 32 bit (4 byte)

• Loại có dấu: -2,147,483,648  2,147,483,647 • Loại không dấu: 0  4,294,967,295

 Một số ngôn ngữ lập trình còn hỗ trợ kiểu số nguyên 64 bit, 128 bit  Kiểu số nguyên k bit sẽ chiếm bộ nhớ k bit dữ liệu

31

 Số nguyên 8 bit ( 1 byte) • Loại có dấu: -128  127 • Loại không dấu: 0  255  Số nguyên 16 bit (2 byte)

Ví dụ một số kiểu dữ liệu số nguyên

Kiểu số nguyên

Pascal

C

8 bit có dấu

shortint

N/A

8 bit không dấu

byte

N/A

16 bit có dấu

integer

short (int*)

16 bit không dấu

word

unsigned short (int*)

32 bit có dấu

longint

long (int)

32 bit không dấu

N/A

unsigned long (int)

32

Kiểu số thực

Có 2 dạng số thực thường gặp

Reading(*)

 Số thực 32 bit (4 byte)

• Miền giá trị: trong khoảng ± 3.4E-38 đến ± 3.4E+38 • Có 8 chữ số có nghĩa sau dấu phẩy

 Số thực 64 bit (8 byte)

• Miền giá trị: trong khoảng ± 1.7E-308 đến ± 1.7E+308 • Có 16 chữ số có nghĩa sau dấu phẩy

 Một số ngôn ngữ lập trình còn hỗ trợ số thực 80 bit (10 byte)

Loại

Pascal

Miền giá trị

C

Miền giá trị

32 bit

real

2.9x10-39…3.4x1039

float

3.4x10-38…3.4x1038

64 bit

double

5.0x10-324…1.7x10308

double

1.7x10-308…1.7x10308

33

HẰNG (CONSTANT)

 Hằng trong chương trình là một giá trị không đổi trong suốt quá trình thi hành  Mục đích của hằng là giúp cho chương trình dễ hiểu hơn, hoặc điều chỉnh

chương trình dễ dàng hơn

 Hằng phải được khai báo trước khi sử dụng  Hằng gồm 2 thành phần: tên hằng và giá trị gán cho hằng

Có các loại hằng sau:

o Hằng số: hằng nguyên, hằng thực – Vd: 2, -8, 30, 2.5, -2.0, 1E-3, … o Hằng bool: có 2 giá trị là true và false o Hằng kí tự: có 2 dạng biểu diễn sau  Đặt kí tự trong dấu nháy đơn  Dùng mã ASCII o Pascal: o C:

(d là mã ASCII ở dạng thập phân) (FF là mã ASCII ở dạng hexa)

#d \xFF

o Hằng chuỗi kí tự

 Pascal, đặt chuỗi kí tự trong dấu nháy đơn – Vd: „Hello‟  C, đặt chuỗi kí tự trong dấu nháy kép – Vd: “Hello”

34

 Hằng (thuộc kiểu dữ liệu bất kỳ): dùng làm

sáng tỏ chương trình.

 Ví dụ: xem hai đoạn lệnh sau (bằng C/C++)

và ----------------------------------------

//khai báo hằng

double myMagicNumber, yourNumber; myMagicNumber = 3.1416; /// ….. yourNumber = 3.141601

//biến

const float PI = 3.1416; double myMagicNumber, yourNumber; myMagicNumber = PI; yourNumber = PI;

//lệnh gán //lệnh gán

35

 Hằng (thuộc kiểu dữ liệu bất kỳ): dễ thay đổi

và bảo trì.

 Hằng thường được khai báo ở đầu các tập tin

mã nguồn.

 Không nên sử dụng trực tiếp giá trị trong

chương trình.

36

 Thường (trong hầu hết nnlt) kết thúc bằng

dấu chấm phẩy ‘;’. Ví dụ:  Khai báo biến: char cMyChar;  Lệnh: cMyChar = ‘V’;

 Mỗi lệnh nên được viết trên một hàng.

37

LỆNH GÁN (ASSIGNMENT)

 Lệnh gán dùng để thay đổi giá trị hiện thời của biến  Lệnh gán không phải là phép so sánh giữa hai biểu thức, mà là thao tác tính kết quả biểu thức phía bên phải lệnh gán, sau đó đặt kết quả này vào biến ở phía bên trái lệnh gán.  Lệnh gán làm thay đổi giá trị hiện thời của biến và không thể nào lấy lại được giá trị này.

Biểu diễn bằng lưu đồ: Ý nghĩa: đưa giá trị của biểu thức vế phải (B) gán vào cho biến ở vế trái (A)

Cú pháp lệnh gán

= ;

A = 5;

A  5

A = B;

A  B

A = B +5;

A  B + 5

A = A +1;

A  A + 1

A = (A + B) * C + D;

A  (A + B) * C + D

38

Cú pháp trong C: = < expression>

 Biểu thức toán học kết hợp các biến/hằng và

các toán tử sau

 Ví dụ:

39

 Các phép tăng/giảm 1 đơn vị

 Phép tăng: ++ hoặc ++  Phép giảm: -- hoặc --

 Lưu ý:

 Phép toán ++ (hay --) đứng trước tên biến sẽ thực

hiện trước

 Phép toán ++ (hay --) đứng sau tên biến sẽ thực

hiện sau

 Ví dụ

40

int iCount = 0; iCount ++; //tăng iCount một đơn vị

 Ví dụ (tt)

int iCount = 3; int t1 = i++; int t2 = ++i;

//gán t1 bằng i trước rồi mới tăng i //tăng i rồi mới gán cho t2

 Có thể kết hợp các phép toán số học với phép

gán. Ví dụ: x += 3 ; x -= 3; x = x * 3; x /= 3;

41

// tương đương x = x + 3 // tương đương x = x – 3 // tương đương x = x *3; // tương đương x = x / 3

 Biểu thức luận lý được kết hợp với các toán

tử sau

AND, OR, XOR, NOT.

 Kết quả biểu thức logic là: TRUE hoặc FALSE.

//khai báo biến bool trong C/C++

bool bFlag; bFlag = true;//gán true cho biến bFlag

 TRUE (true) hay FALSE (false) chỉ là macro

hay hằng logic trong ngôn ngữ.

 Kiểu bool có khi được dùng là boolean.

 Cần phân biệt với biểu thức trên BIT.

42

Nhỏ hơn

<

<

Lớn hơn

>

>

Phép toán Ký hiệu trong Pascal Ký hiệu trong C

So sánh bằng = ==

Khác nhau <> !=

<= <= Nhỏ hơn hoặc bằng

Lớn hơn hoặc bằng >= >=

Phép not not !

Phép or

or

||

43

Phép and and &&

Các phép toán trên BIT

Phép toán

Kí hiệu

Phép AND

 Ví dụ: int x = 5; int y = 4;

&

Phép OR

// x = 101b // y = 100b

Phép XOR

^

Bù bit

~

Dịch trái

|

Dịch phải

<<

44

>> int r1 = x & y; // r1 = 100b int r2 = x | y; // r2 = 101b int r3 = ~x; int r4 = x << 3; int r5 = x >> 1; // r3 = 010b // r4 = 101000b // r5 = 10b

 Số nguyên có thể gán cho biến thực  Số thực cũng có thể gán cho biến nguyên,

nhưng phần sau dấu chấm sẽ bị mất.

Biểu thức

Kết quả

Kiểu kết quả

19/10 19.0/10 19/10.0 1 1.9 1.9 Số nguyên Số chấm động Số chấm động

45

19.0/10.0 1.9 Số chấm động

 Nhập từ bàn phím và xuất ra màn hình

Trong C Trong C++ Trong Pascal

Nhập Xuất printf scanf

Nhập Dùng cin

Xuất Dùng cout

Nhập Xuất readln writeln

trong B. S. Gottfried (1996), Programming with C, 2nd Ed.,

Xem thêm C.4. SCHAUM’S Outline Series - McGRALL-HILL

46

Mô tả

Kiểu tham số

Kiểu trả về

Hàm

abs(x)

Tính trị tuyệt đối

Số

Cùng kiểu tham số

exp(x)

Tính hàm ex

Số

Số thực

log(x)

Tính ln

Số

Số thực

ceil(x)

Số

Số nguyên

Lấy trần số nguyên

Floor

Lấy sàn số nguyên

Số

Số nguyên

sqrt(x)

Số

Căn bậc 2

Số thực

Pow(x,y)

Tính xy

Số, Số

Số thực

47

 Các thành phần của một chương trình

 Kiểu chương trình  Kiểu chú thích  Quy tắc đặt tên

 Một số kiểu dữ liệu cơ bản  Cách khai báo và sử dụng biến, hằng  Một số hàm cơ bản

48

1. Thực hiện các bài tập trong Ex_Chapter_2.docx. https://sites.google.com/site/ngoquviet/documents 2. Viết chương trình đổi một số nguyên hệ 10 sang hệ 2,

hệ 16.

3. Viết chương trình nhập vào số giây từ 0 đến 86399, đổi số giây nhập vào thành dạng "gio:phut:giay", mỗi thành phần là một số nguyên có 2 chữ số .

4. Viết chương trình đọc từ bàn phím 3 số nguyên biểu diễn ngày, tháng, năm và xuất ra màn hình dưới dạng "ngay/thang/nam" (chỉ lấy 2 số cuối của năm).

49