Tải bản đầy đủ (.pdf) (105 trang)

bài giảng kỹ thuật lập trình ths. trần xuân thanh - khoa cntt, đh thành đô

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.49 MB, 105 trang )

Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
1
Chương 1. NHẬP MÔN VỀ MÁY TÍNH VÀ LẬP TRÌNH
1.1 Phần cứng và phần mềm
1.1.1. Phần cứng (hardware)
Phần cứng, còn gọi là cương liệu (hardware), là các thành phần (vật lý) cụ thể của máy tính
hay hệ thống máy tính như là màn hình, chuột, bàn phím, máy in, máy quét, vỏ máy tính, bộ
nguồn, bộ vi xử lý CPU, bo mạch chủ, các loại dây nối, loa, ổ đĩa mềm, ổ đĩa cứng, ổ CDROM,
ổ DVD,

Dựa trên chức năng và cách thức hoạt động người ta còn phân biệt phần cứng ra thành:
- Nhập hay đầu vào (Input): Các bộ phận thu nhập dữ liệu hay mệnh lệnh như là bàn phím,
chuột
- Xuất hay đầu ra (Output): Các bộ phận trả lời, phát tín hiệu, hay thực thi lệnh ra bên ngoài
như là màn hình, máy in, loa,
Ngoài các bộ phận nêu trên liên quan tới phần cứng của máy tính còn có các khái niệm quan
trọng sau đây:
- Bus: chuyển dữ liệu giữa các thiết bị phần cứng.
- BIOS (Basic Input Output System): còn gọi là hệ thống xuất nhập cơ bản nhằm khởi động,
kiểm tra, và cài đặt các mệnh lệnh cơ bản cho phần cứng và giao quyền điều khiển cho hệ điều
hành
- CPU: bộ phân vi xử lý điều khiển toàn bộ máy tính
- Kho lưu trữ dữ liệu: lưu giữ, cung cấp, thu nhận dữ liệu
- Các loại chíp hỗ trợ: nằm bên trong bo mạch chủ hay nằm trong các thiết bị ngoại vi của
máy tính các con chip quan trọng sẽ giữ vai trò điều khiển thiết bị và liên lạc với hệ điều hành
qua bộ điều vận hay qua phần sụn
- Bộ nhớ: là thiết bị bên trong bo mạch chủ giữ nhiệm vụ trung gian cung cấp các mệnh lệnh
cho CPU và các dữ liệu từ các bộ phận như là BIOS, phần mềm, kho lưu trữ, chuột đồng thời
tải về cho các bộ phận vừa kể kết quả các tính toán, các phép toán hay các dữ liệu đã/đang
được xử lý.


Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
2
- Các cổng vào/ra: USB (Universal Serial Bus), Máy in, màn hình, chuột phím , …
1.1.2. Phần mềm (Sotfware)
Phần mềm hay nhu liệu (software) là một tập hợp những câu lệnh được viết bằng một hoặc
nhiều ngôn ngữ lập trình theo một trật tự xác định nhằm tự động thực hiện một số chức năng
hoặc giải quyết một bài toán nào đó.
- Đặc điểm
Trước đây, để tạo ra chương trình máy tính người ta phải làm việc trực tiếp với các con số 0
hoặc 1, hay còn gọi là ngôn ngữ máy. Công việc này vô cùng khó khăn, chiếm nhiều thời gian,
công sức và đặc biệt dễ gây ra lỗi. Để khắc phục nhược điểm này, người ta đề xuất ra hợp ngữ,
một ngôn ngữ cho phép thay thế dãy 0 hoặc 1 này bởi các từ gợi nhớ tiếng Anh. Tuy nhiên, cải
tiến này vẫn còn chưa thật thích hợp với đa số người dùng máy tính, những người luôn mong
muốn các lệnh chính là ý nghĩa của các thao tác mà nó mô tả. Vì vậy, ngay từ những năm 1950,
người ta đã xây dựng những ngôn ngữ lập trình mà câu lệnh của nó gần với ngôn ngữ tự nhiên.
Các ngôn ngữ này được gọi là ngôn ngữ lập trình bậc cao.
Chương trình máy tính thường được tạo ra bởi con người, những người này được gọi là lập
trình viên, tuy nhiên cũng tồn tại những chương trình được sinh ra bởi các chương trình khác.
- Phân loại
+ Theo phương thức hoạt động
Phần mềm hệ thống: dùng để vận hành máy tính và các phần cứng máy tính, ví dụ như các hệ
điều hành máy tính Windows XP, Linux, Unix, các thư viện động (còn gọi là thư viện liên kết
động: dynamic linked library - DLL) của hệ điều hành, các trình điều khiển (driver), phần sụn
(firmware) và BIOS. Đây là các loại phần mềm mà hệ điều hành liên lạc với chúng để điều
khiển và quản lý các thiết bị phần cứng.
Phần mềm ứng dụng: để người sử dụng có thể hoàn thành một hay nhiều công việc nào đó, ví
dụ như các phần mềm văn phòng (Microsoft Office, Lotus 1-2-3, FoxPro, …), phần mềm
doanh nghiệp, phần mềm quản lý nguồn nhân lực XETA, phần mềm giáo dục, cơ sở dữ liệu,
phần mềm trò chơi, chương trình tiện ích, hay các loại phần mềm ác tính.

Các phần mềm dịch mã: bao gồm trình biên dịch và trình thông dịch: các loại chương trình
này sẽ đọc các câu lệnh từ mã nguồn được viết bởi các lập trình viên theo một ngôn ngữ lập
trình và dịch nó sang dạng ngôn ngữ máy mà máy tính có thể hiểu đưọc, hay dịch nó sang một
dạng khác như là tập tin đối tượng (object file) và các tập tin thư viện (library file) mà các phần
mềm khác (như hệ điều hành chẳng hạn) có thể hiểu để vận hành máy tính thực thi các lệnh.
Theo khả năng ứng dụng: Những phần mềm không phụ thuộc, nó có thể được bán cho bất kỳ
khách hàng nào trên thị trường tự do. Ví dụ: phần mềm về cơ sở dữ liệu như Oracle, đồ họa
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
3
như Photoshop, Corel Draw, soạn thảo và xử lý văn bản, bảng tính Ưu điểm: Thông thường
đây là những phần mềm có khả năng ứng dụng rộng rãi cho nhiều nhóm người sử dụng.
Khuyết điểm: Thiếu tính uyển chuyển, tùy biến.
Những phần mềm được viết theo đơn đặt hàng hay hợp đồng của một khách hàng cụ thể
nào đó (một công ty, bệnh viện, trường học ). Ví dụ: phần mềm điều khiển, phần mềm hỗ trợ
bán hàng
Ưu điểm: Có tính uyển chuyển, tùy biến cao để đáp ứng được nhu cầu của một nhóm người
sử dụng nào đó. Khuyết điểm: Thông thường đây là những phần mềm ứng dụng chuyên ngành
hẹp.
+ Các loại khác: Cũng do con người viết nên để phục vụ mục đích nào đó, nhưng Virus (máy
tính) là virus, trojan được viết để chạy với những mục đích riêng của một một nhóm người
nhằn lừa đảo, quảng cáo, ăn cắp, phá hoại thông tin, phá hoại phần cứng hoặc chỉ là để trêu
chọc người dùng vi tính.
- Quá trình tạo phần mềm
Về mặt thiết kế
Tùy theo mức độ phức tạp của phần mềm làm ra, người thiết kế phần mềm sẽ ít nhiều dùng
đến các phương tiện để tạo ra mẫu thiết kế theo ý muốn (chẳng hạn như là các sơ đồ khối, các
lưu đồ, các thuật toán và các mã giả), sau đó mẫu này được mã hoá bằng các ngôn ngữ lập trình
và được các trình dịch chuyển thành các khối lệnh (module) hay/và các tệp khả thi. Tập hợp
các tệp khả thi và các khối lệnh đó làm thành một phần mềm. Thường khi một phần mềm được

tạo thành, để cho hoàn hảo thì phần mềm đó phải đưọc điều chỉnh hay sửa chữa từ khâu thiết
kế cho đến khâu tạo thành phiên bản phần mềm một số lần. Một phần mềm thông thường sẽ
tương thích với một hay vài hệ điều hành, tùy theo cách thiết kế, cách viết mã nguồn và ngôn
ngữ lập trình được dùng.
Sản xuất và phát triển
Việc phát triển và đưa ra thị trường của một phần mềm là đối tượng nghiên cứu của bộ môn
kỹ nghệ phần mềm hay còn gọi là công nghệ phần mềm (software engineering). Bộ môn này
nghiên cứu các phương pháp tổ chức, cách thức sử dụng nguồn tài nguyên, vòng quy trình sản
xuất, cùng với các mối liên hệ với thị trường, cũng như liên hệ giữa các yếu tố này với nhau.
Tối ưu hoá qui trình sản xuất phần mềm cũng là đối tượng đưọc cứu xét của bộ môn.
1.2 Các ngôn ngữ lập trình
1.2.1. Khái niệm ngôn ngữ lập trình
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
4
Ngôn ngữ lập trình (programming language) là một tập con của ngôn ngữ máy tính. Đây là
một dạng ngôn ngữ được chuẩn hóa. Nó được dùng để miêu tả những quá trình, những ngữ
cảnh một cách rất chi tiết.
Định nghĩa (theo [Loud 94], T.3): Ngôn ngữ lập trình là một hệ thống được ký hiệu hóa để miêu tả
những tính toán (qua máy tính) trong một dạng mà cả con người và máy đều có thể đọc và hiểu được.
Theo định nghĩa ở trên thì một ngôn ngữ lập trình phải thỏa mãn được hai điều kiện cơ bản là:
Nó phải dễ hiểu và dễ sử dụng đối với người lập trình, để con người có thể dùng nó giải quyết các
bài toán khác.
Nó phải miêu tả một cách đầy đủ và rõ ràng các tiến trình (process), để có thể chạy được
trên các máy tính khác.
Một tập hợp các chỉ thị được biểu thị nhờ ngôn ngữ lập trình để thực hiện các thao tác máy
tính nào đó thông qua một chương trình. Các tên khác của khái niệm này nếu không bị lầm lẫn
là chương trình máy tính hay chương trình điện toán.
Lưu ý: Khái niệm chương trình (program) viết cho máy vi tính nhằm giải quyết một vấn đế
nào đó thường được gọi là phần mềm máy tính. (Thí dụ chương trình MS Word là một cách gọi

chung chung, chính xác hơn là phần mềm MS Word thì rõ hơn đó là một chương trình ứng
dụng.)
Chữ lập trình dùng để chỉ thao tác của con người nhằm kiến tạo nên các chương trình máy
tính thông qua các ngôn ngữ lập trình. Người ta còn gọi quá trình lập trình đó là quá trình mã
hoá thông tin tự nhiên thành ngôn ngữ máy. Trong các trường hợp xác định thì chữ lập trình
còn được viết là "viết mã" (cho chương trình máy tính).
Như vậy, theo định nghĩa, mỗi ngôn ngữ lập trình cũng chính là một chương trình, nhưng
có thể được dùng để tạo nên các chương trình khác. Một chương trình máy tính được viết bằng
một ngôn ngữ lập trình thì những chỉ thị (của riêng ngôn ngữ ấy) góp phần tạo nên chương
trình được gọi là mã nguồn của chương trình ấy.
Thao tác chuyển dạng từ mã nguồn sang thành chuỗi các chỉ thị máy tính được thực hiện
hoàn toàn tương tự như là việc chuyển dịch giữa các ngôn ngữ tự nhiên của con người. Các
thao tác này gọi là biên dịch (hay ngắn gọn hơn là dịch). Người ta còn phân việc biên dịch làm
hai loại tùy theo quá trình dịch xảy ra trước quá trình thực thi các tính toán hay nó xảy ra cùng
lúc với quá trình tính toán:
Một phần mềm thông dịch là một phần mềm có khả năng đọc, chuyển dịch mã nguồn của
một ngôn ngữ và ra lệnh cho máy tính tiến hành các tính toán dựa theo cú pháp của ngôn ngữ.
Một phần mềm biên dịch hay ngắn gọn hơn trình dịch là phần mềm có khả năng chuyển
dịch mã nguồn của một ngôn ngữ ban đầu sang dạng mã mới thuộc về ngôn ngữ cấp thấp hơn.
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
5
Ngôn ngữ cấp thấp nhất là một chuỗi các chỉ thị máy tính mà có thể được thực hiện trực
tiếp bởi chính máy tính (thông qua các thao tác trên vùng nhớ). Trước đây, hầu hết các trình
dịch cũ thường phải thông dịch từ mã nguồn sang bộ mã phụ (các tệp có dang *.obj), rồi sau
đó, mới biên dịch tiếp sang các tập tin thi hành. Ngày nay, hầu hết các trình dịch đều có khả
năng biên dịch mã nguồn trực tiếp sang thành các tập tin thi hành hay biên dịch sang các dạng
mã khác thấp hơn tuỳ theo yêu cầu của người lập trình.
Điểm khác nhau giữa thông dịch và biên dịch là: Trình thông dịch sẽ dịch từng câu lệnh một
và chương trình đích sẽ không được lưu lại. Còn trình biên dịch sẽ dịch toàn bộ chương trình,

cho ra chương trình đích được lưu lại trong máy tính rồi mới thực hiện chương trình.
Một chương trình máy tính có thể được thực thi bằng cách tổ hợp của việc biên dịch và
thông dịch.
Vì yêu cầu đòi hỏi độ chính xác chi tiết cao nên việc viết mã thường gây khó khăn cho
người đọc để theo dõi và đôi khi gây khó cho chính lập trình viên đã tạo ra mã nguồn đó. Do đó,
một lời khuyên là nên dùng thêm nhiều chú giải trong lúc lập trình. Các chú giải này thường rất
quan trọng cho người khác đọc và hiểu các mã nguồn
1.2.2. Phân loại ngôn ngữ lập trình
Sau đây là một trong những cách phân loại phổ biến:
Logic Programming (Lập trình logic - LTL): Một phương pháp tiếp cận việc biểu diễn tri thức
và giải các bài toán lôgic từ một cơ sở tri thức cho trước trên máy tính. Một cơ sở tri thức là
một tập các sự kiện và các luật biểu diễn quan hệ lôgic giữa các sự kiện đó. LTL xuất phát từ
một cơ sở tri thức và một câu hỏi, tiến hành các lập luận lôgic để tìm ra lời giải cho câu hỏi đó.
(VD: prolog,…).
Functional Programming (lập trình hàm): sử dụng các hàm hiểu theo nghĩa toán học làm cấu
trúc điều khiển của chương trình. (VD: Lisp,…)
Structural Programming (Lập trình có cấu trúc): Kĩ thuật lập trình dựa trên quan niệm phân
tích một chức năng xử lí thông tin thành các chức năng nhỏ hơn, làm mịn dần quá trình này cho
tới khi xây dựng được các đơn thể. Chương trình chỉ dùng các cấu trúc điều khiển cơ bản: tuần
tự, rẽ nhánh, lặp và ra khỏi lặp. Lập trình có cấu trúc sử dụng cách tiếp cận từ trên xuống, tức
là phân tách từ toàn thể đến bộ phận, rồi lại từ bộ phận đến bộ phận nhỏ hơn. Các đơn thể trong
một chương trình có cấu trúc có tính độc lập tương đối cao, chỉ giao tiếp với nhau thông qua
giao diện đã xác lập trước, do đó Lập trình có cấu trúc có một số ưu điểm: dễ phân công nhiều
người cùng lập một chương trình, dễ thử và hiệu chỉnh chương trình. (VD: C, Pascal,…)
Concurrent Programming (Lập trình song song): Chia một vấn đề làm 2 phần và giải quyết
song song với nhau (VD: Ada, Erlang, Java .v.v.)
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
6
Object-Oriented Programming - OOP (Lập trình hướng đối tượng): được phát minh năm

1965 bởi Ole-Johan Dahl và Kristen Nygaard trong ngôn ngữ Simula. So với phương pháp lập
trình cổ điển, thì triết lý chính bên trong loại ngôn ngữ loại này là để tái dụng các khối mã
nguồn và cung ứng cho các khối này một khả năng mới: chúng có thể có các hàm (gọi là các
phương thức) và các dữ liệu (gọi là thuộc tính) nội tại. Khối mã như vậy được gọi là đối tượng.
Các đối tượng thì độc lập với môi trường và có khả năng trả lời với yêu cầu bên ngoài tùy theo
thiết kế của người lập trình. Với cách xây dựng này, mỗi đối tượng sẽ tương đương với một
chương trình riêng có nhiều đặc tính mới mà quan trọng nhất là tính đa hình, tính đóng, tính
trừu tượng và tính thừa kế. (VD: Java, Ruby, C++ , C#, .v.v.)
Concurrency oriented programs (Lập trình hướng thành phần): Ý tưởng xây dựng các phần
mềm bằng các kết hợp các modul lại với nhau, giống như một nhà máy lắp ráp oto. (VD:
Java, )
Agent oriented programs (Lập trình hướng Agent): Mỗi chương trình khi tạo ra có khả năng
tự chủ, tự thực thi tùy thuộc vào môi trường mà nó tồn tại (VD: Java, C#,…)
Một ngôn ngữ không nhất thiết là chỉ được phép thuộc 1 trong các loại trên, mà có thể hỗ
trợ nhiều kiểu tư duy khác nhau.
1.3 Giải quyết vấn đề và phát triển phần mềm
- Các mô hình phát triển sản phẩm phần mềm
Quá trình phát triển phần mềm là tập hợp các thao tác và các kết quả tương quan để sản
xuất ra một sản phẩm phần mềm. Hầu hết các thao tác này được tiến hành bởi các kỹ sư phần
mềm. Các công cụ hỗ trợ máy tính về kỹ thuật phần mềm có thể được dùng để giúp trong một
số thao tác.
Có 4 thao tác là nền tảng của hầu hết các quá trình phần mềm là:
+ Đặc tả phần mềm: Các chức năng của phần mềm và điều kiện để nó hoạt động phải được
định nghĩa.
+ Sự phát triển phần mềm: Để phần mềm đạt được đặc tả thì phải có quá trình phát triển
này.
+ Đánh giá phần mềm: Phần mềm phải được đánh giá để chắc chắn rằng nó làm những gì
mà khách hàng muốn.
+ Sự tiến hóa của phần mềm: Phần mềm phải tiến hóa để thỏa mãn sự thay đổi các yêu cầu
của khách hàng.

- Mô hình thác nước
Mô hình này làm cho ý nghĩa việc sản xuất phần được thấy rõ hơn.
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
7

+ Phân tích các yêu cầu và định nghĩa: hệ thống dịch vụ, khó khăn và mục tiêu được hình thành bởi
sự trợ ý của hệ thống người tiêu dùng. Sau đó các yếu tố này được định nghĩa sao cho có thể hiểu được
bởi cả người phát triển và người tiêu dùng.
+ Thiết kế phần mềm và hệ thống: Thiết kế hệ thống các quá trình, các bộ phận và các yêu cầu về
cả phần mềm lẫn phần cứng. Hoàn tất hầu như tất cả kiến trúc của các hệ thống này. Thiết kế phần
mềm tham gia vào việc biểu thị các chức năng hệ thống phần mềm mà có thể được chuyển dạng thành
một hay nhiều chương trình khả thi.
+ Thực hiện và thử nghiệm các đơn vị: Trong giai đoạn này, thiết kế phần mềm phải được chứng
thực như là một tập họp nhiều chương trình hay nhiều đơn vị nhỏ. Thử nghiệm các đơn vị bao gồm xác
minh rằng mỗi đơn vị thỏa mãn đặc tả của nó.
+ Tổng hợp và thử nghiệm toàn bộ: Các đơn vị chương trình riêng lẻ hay các chương trình được
tích hợp lại và thử nghiệm như là một hệ thống hoàn tất và chứng tỏ được các yêu cầu của phần mềm
được thỏa mãn. Sau khi thử nghiệm phần mềm được cung ứng cho người tiêu dùng.
+ Sản xuất và bảo trì: Thông thường (nhưng không bắt buộc) đây là pha lâu nhất của chu kỳ sống
(của sản phẩm). Phần mềm được cài đặt và được dùng trong thực tế. Bảo trì bao gồm điều chỉnh các lỗi
mà chưa được phát hiện trong các giai đọan trước của chu kì sống; nâng cấp sự thực hiện của hệ thống
các đơn vị và nâng cao hệ thống dịch vụ cho là các phát hiện vê yêu cầu mới.
Điểm hạn chế của mô hình này là nó không linh hoạt. Các bộ phận của đề án chia ra thành những
phần riêng của các giai đoạn. Hệ thống phân phối đôi khi không dùng được vì không thỏa mãn được
yêu cầu của khách hàng. Mặc dù vậy mô hình này phản ảnh thực tế công nghệ. Như là một hệ quả đây
vẫn là mô hình cơ sở cho đa số các hệ thống phát triển phần mềm - phần cứng.
- Mô hình phát triển tiến hoá của phần mềm
Phân loại sự phát triển tiến hóa
+ Lập trình thăm dò: đối tượng của quá trình bằng cách làm việc với khách hàng để thăm dò các

yêu cầu và phân phối phần mềm dứt diểm. Sự phát triển nên bắt đầu với những phần nào đã được hiểu
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
8
rõ. Phần mềm sẽ được thêm vào các chức năng mới khi mà nó được đề nghị cho khách hàng (và nhận
về các thông tin).
+ Mẫu thăm dò: đối tượng của phát triển tiến hoá này là nhằm hiểu các yêu cầu của khách hàng và
do đó phát triển các định nghĩa yêu cầu tốt hơn cho phần mềm. Các mẫu tập trung trên các thí nghiệm
với những phần đòi hỏi nào của khách hàng mà có thể gây sự khó hiểu hay ngộ nhận.


Phát triển phần mềm theo mô hình tiến hoá
Phân tích mô hình: Mô hình phát triển tiến hóa này hiệu quả hơn mô hình thác nước. Tuy nhiên,
nó vẫn còn các khuyết điểm:
+ Quá trình thì không nhìn thấy rõ được: Các nhà quản lý cần phân phối thường xuyên để đo lường
sự tiến bộ. Nó không kinh tế trong việc làm ra các hồ sơ cho phần mềm.
+ Phần mềm thường dược cấu trúc nghèo nàn: Sự thay đổi liên tục dễ làm đổ vỡ cấu trúc của phần
mềm, tạo ra sự khó khăn và tốn phí.
+ Thường đòi hỏi những kỹ năng đặc biệt: Hầu hết các hệ thống khả dĩ theo cách này được tiến
hành bởi các nhóm nhỏ có kỹ năng cao cũng như các cá nhân phải năng động.
Mô hình này thích hợp với:
+ Phát triển các loại phần mềm tương đối nhỏ
+ Phát triển các loại phần mềm có đời sống tương đối ngắn
+ Tiến hành trong các hệ thống lớn hơn ở những chỗ mà không thể biểu thị được các đặc tả chi tiết
trong lúc tiến hành. Thí dụ của trường hợp này là các hệ thống thông minh nhân tạo (AI) và các giao
diện cho người dùng.
- Mô hình xoắn ốc Boehm
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
9



Phát triển phần mềm theo kiểu Boehm
Đây là mô hình phát triển từ mô hình thác nước cho thấy mức độ tổng quát hơn của các pha sản
xuất của một sản phẩm. Mô hình được đề nghị bởi Boehm vào năm 1988. Mô hình này có thể chỉ ra
các rủi ro có thể hình thành trên căn bản của mô hình quá trình (sản xuất) tổng quát.
Mô hình Boehm có dạng xoắn ốc. Mỗi vòng lặp đại diện cho một pha của quá trình phần mềm. Vòng
trong cùng tập trung về tính khả thi, vòng kế lo về định nghĩa các yêu cầu, kế đến là thiết kế,
Không có một pha nào được xem là cố định trong vòng xoắn. Mỗi vòng có 4 phần tương ứng với một
pha.
+ Cài đặt đối tượng: Chỉ ra các đối tượng của pha trong đề án. Những khó khăn hay cưỡng bức của
quá trình và của sản phẩm được xác định và được lên kế hoạch chi tiết. Xác định các yếu tố rủi ro của
đề án. Các phương án thay thế tùy theo các rủi ro này có thể được dự trù.
+ Lượng định và giảm thiểu rủi ro. Tiến hành phân tích mỗi yếu tố rủi ro đã xác định. Các bước đặt
ra để giảm thiểu rủi ro.
+ Phát triển và đánh giá: Sau khi đánh giá các yếu tố rủi ro, một mô hình phát triển cho hệ thống
được chọn.
+ Lên kế hoạch: Đề án được xem xét và quyết định có nên hay không tiếp tục pha mới trong vòng
lặp.
Các quá trình linh hoạt
Là quá trình mà trong đó cấu trúc khởi động sẽ nhỏ nhưng linh động và lớn dần của các đề án phần
mềm nhằm tìm ra các khó khăn trước khi nó trở thành vấn đề có thể dẫn tới những hủy hoại. Quá trình
này nhấn mạnh sự gọn nhẹ và tập trung hơn là các phương pháp truyền thống. Các quá trình linh hoạt
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
10
dùng các thông tin phản hồi thay vì dùng các kế hoạch, như là một cơ chế diều khiển chính. Các thông
tin phản hồi có được từ các thử nghiệm và các phiên bản phát hành của phần mềm tham gia.
Các quá trình linh hoạt thưòng có hiệu quả hơn các phương pháp cũ, nó dùng ít thời gian lập trình
để sản xuất ra nhiều chức năng hơn, chất lượng cao hơn, nhưng nó không cung cấp một khả năng kế

hoạch lâu dài.
Một cách ngắn gọn các phuơng pháp này cung ứng hiệu quả cao nhất cho vốn đầu tư, nhưng lại
không định rõ hiệu quả gì.
Lập trình cực hạn, gọi tắt là XP, là loại quá trình linh hoạt được biết đến nhiều nhất. Trong XP, các
pha được xúc tiến trong các bước cực nhỏ (hay liên tục) nếu so với các quá trình kiểu cũ, gọi là các
"toán" xử lý. Bước đầu tiên (với chủ định là không hoàn tất) cho đến các bước có thể chỉ tốn một ngày
hay một tuần, thay vì phải tốn nhiều tháng như trong phương pháp thác nước. Đầu tiên, một người viết
các thử nghiệm tự động để cung cấp các mục tiêu cụ thể cho sự phát triển. Kế đến là giai đoạn viết mã
(bởi một cặp lập trình viên); giai đoạn này hoàn tất khi mà các mã viết qua được tất cả các thử nghiệm
và những người lập trình không tìm ra thêm được thử nghiệm cần thiết nào nữa. Thiết kế và kiến trúc
được điều chỉnh và nâng cao ngay sau giai đoạn viết mã này bởi người đã viết mã trong giai đoạn
trước. Hệ thống chưa hoàn tất nhưng hoạt động được này được khai thác hay được đem ra minh họa
cho (một phần) người tiêu dùng mà trong số đó có người trong đội phát triển phần mềm. Thời điểm này
những người thực nghiệm lại bắt đầu viết các thử nghiệm cho những phần quan trọng kế tiếp của hệ
thống.
1.4 . Giải thuật
Thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ thị hay phương cách được
định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng thái ban đầu cho trước; khi các chỉ thị
này được áp dụng triệt để thì sẽ dẫn đến kết quả sau cùng như đã dự đoán.
Nói cách khác, thuật toán là một bộ các qui tắc hay qui trình cụ thể nhằm giải quyết một vấn đề
trong một số bước hữu hạn, hoặc nhằm cung cấp một kết quả từ một tập hợp của các dữ kiện đưa vào.
Ví dụ: thuật toán để giải phương trình bậc nhất P(x): ax + b = c, (a, b, c là các số thực), trong tập
hợp các số thực có thể là một bộ các bước sau đây:
1. Nếu a = 0
o b = c thì P(x) có nghiệm bất kì
o b ≠ c thì P(c) vô nghiệm
2. Nếu a ≠ 0
o P(x) có duy nhất một nghiệm x = (c - b)/a
Lưu ý
Khi một thuật toán đã hình thành thì ta không xét đến việc chứng minh thuật toán đó mà chỉ chú

trọng đến việc áp dụng các bước theo sự hướng dẫn sẽ có kết quả đúng. Việc chứng minh tính đầy đủ
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
11
và tính đúng của các thuật toán phải được tiến hành xong trước khi có thuật toán. Nói rõ hơn, thuật
toán có thể chỉ là việc áp dụng các công thức hay qui tắc, qui trình đã được công nhận là đúng hay đã
được chứng minh về mặt toán học.
"Thuật toán" hiện nay thường được dùng để chỉ thuật toán giải quyết các vấn đề tin học. Hầu hết
các thuật toán tin học đều có thể viết thành các chương trình máy tính mặc dù chúng thường có một vài
hạn chế (vì khả năng của máy tính và khả năng của người lập trình). Trong nhiều trường hợp, một
chương trình khi thiết kế bị thất bại là do lỗi ở các thuật toán mà người lập trình đưa vào là không
chính xác, không đầy đủ, hay không ước định được trọn vẹn lời giải của vấn đề. Tuy nhiên cũng có một
số bài toán mà hiện nay người ta chưa tìm được lời giải triệt để, những bài toán ấy gọi là những bài
toán NP - không đầy đủ.
Tính chất của thuật toán
Một thuật toán có các tính chất sau:
o Tính chính xác: để đảm bảo kết quả tính toán hay các thao tác mà máy tính thực hiện được là
chính xác.
o Tính rõ ràng: Thuật toán phải được thể hiện bằng các câu lệnh minh bạch; các câu lệnh được
sắp xếp theo thứ tự nhất định.
o Tính khách quan: Một thuật toán dù được viết bởi nhiều người trên nhiều máy tính vẫn phải
cho kết quả như nhau.
o Tính phổ dụng: Thuật toán không chỉ áp dụng cho một bài toán nhất định mà có thể áp dụng
cho một lớp các bài toán có đầu vào tương tự nhau.
o Tính kết thúc: Thuật toán phải gồm một số hữu hạn các bước tính toá
Độ phức tạp thuật toán
Đặt vấn đề
Thời gian mà máy tính khi thực hiện một thuật toán không chỉ phụ thuộc vào bản thân thuật toán
đó, ngoài ra còn tùy thuộc từng máy tính. Để đánh giá hiệu quả của một thuật toán, có thể xét số các
phép tính phải thực hiện khi thực hiện thuật toán này. Thông thường số các phép tính được thực hiện

phụ thuộc vào cỡ của bài toán, tức là độ lớn của đầu vào. Vì thế độ phức tạp thuật toán là một hàm
phụ thuộc đầu vào. Tuy nhiên trong những ứng dụng thực tiễn, chúng ta không cần biết chính xác hàm
này mà chỉ cần biết một ước lượng đủ tốt của chúng.
Để ước lượng độ phức tạp của một thuật toán ta thường dùng khái niệm bậc O-lớn và bậc Θ (bậc
Theta).
Bậc O-lớn
Gọi n là độ lớn đầu vào. Tùy thuộc từng bài toán mà n có thể nhận những giá trị khác nhau. Chẳng
hạn, bài toán tính giai thừa thì n chính là số cần tính giai thừa. Nhiều bài toán số trị, chẳng hạn tính sai
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
12
phân thì n là số chữ số có nghĩa cần đạt được. Trong các phép tính đối với ma trận thì n là số hàng hoặc
cột của ma trận.
Độ phức tạp của bài toán phụ thuộc vào n. Ở đây ta không chỉ đặc trưng độ phức tạp bởi số lượng
phép tính, mà dùng một đại lượng tổng quát là tài nguyên cần dùng R(n). Đó có thể là số lượng phép
tính (có thể tính cả số lần truy nhập bộ nhớ, hoặc ghi vào bộ nhớ); nhưng cũng có thể là thời gian thực
hiện chương trình (độ phức tạp về thời gian) hoặc dung lượng bộ nhớ cần phải cấp để chạy chương
trình (độ phức tạp về không gian).
Xét quan hệ giữa tài nguyên và độ lớn đầu vào, nếu như tìm được hằng số C > 0, C không phụ thuộc
vào n, sao cho với n đủ lớn, các hàm R(n),g(n) đều dương và

thì ta nói thuật toán có độ phức tạp cỡ O(g(n)).
Độ phức tạp không phải là độ đo chính xác lượng tài nguyên máy cần dùng, mà đặc trưng cho động
thái của hệ thống khi kích thước đầu vào tăng lên. Chẳng hạn với thuật toán có độ phức tạp tuyến tính
O(n) (xem phần dưới), nếu kích thước đầu vào tăng gấp đôi thì có thể ước tính rằng tài nguyên cần
dùng cũng tăng khoảng gấp đôi. Nhưng với thuật toán có độ phức tạp bình phương O(n
2
) thì tài nguyên
sẽ tăng gấp bốn. Mặt khác, với thuật toán có độ phức tạp hàm mũ O(2
n

) thì chỉ cần công thêm 2 đơn vị
vào độ lớn đầu vào cũng đã làm tài nguyên tăng gấp 4 lần (tức là theo cấp số nhân) rồi.
Các độ phức tạp thường gặp đối với các thuật toán thông thường gồm có:
o Độ phức tạp hằng số, O(1). Số phép tính/thời gian chạy/dung lượng bộ nhớ không phụ thuộc
vào độ lớn đầu vào. Chẳng hạn như các thao tác hệ thống: đóng, mở file.
o Độ phức tạp tuyến tính, O(n). Số phép tính/thời gian chạy/dung lượng bộ nhớ có xu hướng tỉ lệ
thuận với độ lớn đầu vào. Chẳng hạn như tính tổng các phần tử của một mảng một chiều.
o Độ phức tạp đa thức, O(P(n)), với P là đa thức bậc cao (từ 2 trở lên). Chẳng hạn như các thao
tác tính toán với mảng nhiều chiều (tính định thức ma trận).
o Độ phức tạp logarit, O(logn) (chú ý: bậc của nó thấp hơn so với O(n)) . Chẳng hạn thuật toán
Euclid để tìm ước số chung lớn nhất.
o Độ phức tạp hàm mũ, O(2
n
). Trường hợp này bất lợi nhất và sẽ rất phi thực tế nếu thực hiện
thuật toán với độ phức tạp này.
Lưu ý: Định nghĩa trên mang tính "an toàn" theo nghĩa nó chỉ xét sự tiêu tốn tài nguyên
không vượt quá một ngưỡng g(n) nào đó, chứ không nhất thiết đúng bằng g(n) (chú ý dấu
bất đẳng thức). Theo đó, một thuật toán có độ phức tạp cỡ n thì đồng thời sẽ có độ phức tạp
cỡ n
2
; với hàm ý rằng thuật toán này không bao giờ có động thái phức tạp hóa vượt qua
ngưỡng đa thức bậc hai.
Bậc Ω và Θ
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
13
Tương tự như với bậc O-lớn, nếu như tìm được các hằng số C,k
1
,k
2

đều dương và không phụ thuộc vào
n, sao cho với n đủ lớn, các hàm R(n),f(n) và h(n) đều dương và


thì ta nói thuật toán có độ phức tạp cỡ lớn hơn Ω(n), và đúng bằng cỡ Θ(h(n)).
Như vậy nếu xét một cách chặt chẽ, kí hiệu Θ mới biểu thị độ phức tạp của thuật toán một cách chặt
chẽ. Tuy nhiên qua một thời gian dài kí hiệu O(n) cũng đã được dùng phổ biến.
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
14

Chương 2. KIỂU DỮ LIỆU, TOÁN TỬ VÀ PHÁT BIỂU
2.1 Giới thiệu về ngôn ngữ C++
C++ (C-plus-plus) là một loại ngôn ngữ lập trình. Đây là một dạng ngôn ngữ đa mẫu hình tự do có
kiểu tĩnh và hỗ trợ lập trình thủ tục, dữ liệu trừu trượng, lập trình hướng đối tượng, và lập trình đa hình.
Từ thập niên 1990, C++ đã trở thành một trong những ngôn ngữ thương mại phổ biến nhất.
Bjarne Stroustrup của Bell Labs đã phát triển C++ (mà tên nguyên thủy là "C with class" trong suốt
thập niên 1980 như là một bản nâng cao của ngôn ngữ C. Những bổ sung nâng cao bắt đầu với sự thêm
vào của khái niệm lớp, tiếp theo đó là các khái niệm hàm ảo, toán tử quá tải, đa kế thừa, tiêu bản, và xử
lý ngoại lệ. Tiêu chuẩn của ngôn ngữ C++ đã được thông qua trong năm 1998 như là ISO/IEC
14882:1998. Phiên bản hiện đang lưu hành là phiên bản 2003, ISO/IEC 14882:2003. Phiên bản tiêu
chuẩn mới hơn nữa (được biết dưới tên gọi không chính thức là C++0x) đang được xây dựng.
Tổng quan về kĩ thuật
Trong tiêu chuẩn 1998 của C++ có hai phần chính: phần ngôn ngữ cốt lõi và phần Thư viện chuẩn
C++(STL - Standard Template Library) . Phần thư viện này lại bao gồm hầu hết thư viện tiêu bản
chuẩn và phiên bản có điều chỉnh chút ít của thư viện chuẩn C. Nhiều thư viện C++ hiện hữu không
thuộc về tiêu chuẩn như là thư viện Boost. Thêm vào đó, nhiều thư viện không theo tiêu chuẩn được
viết trong C một cách tổng quát đều có thể sử dụng trong các chương trình C++.
Chức năng dẫn nhập trong C++
So với C, C++ tăng cường thêm nhiều tính năng, bao gồm: khai báo như mệnh đề, chuyển kiểu

giống như hàm, new/delete, bool, các kiểu tham chiếu, const, các hàm trong dòng (inline),
các đối số mặc định, quá tải hàm, vùng tên (namespace), các lớp (bao gồm tất cả các chức năng liên
quan tới lớp như kế thừa, hàm thành viên (phương pháp), hàm ảo, lớp trừu tượng, và cấu tử), sự quá tải
toán tử, tiêu bản, toán tử ::, xử lí ngoại lệ, và sự nhận dạng kiểu trong thời gian thi hành.
C++ còn tiến hành nhiều phép kiểm tra kiểu hơn C trong nhiều trường hợp.
Câu lệnh chú giải bắt đầu với // nguyên là một phần của BCPL(Basic Combined Programming
Language) được tái sử dụng trong C++.
Một số thành phần của C++ sau này đã được thêm vào C, bao gồm const, inline, khai báo biến
trong vòng lặp for và chú giải kiểu C++ (sử dụng ký hiệu //). Tuy nhiên, C99 cũng bổ sung thêm
một số tính năng không có trong C++, ví dụ như macro với số đối số động.
Vì được phát triển từ C, trong C++, thuật ngữ đối tượng có nghĩa là vùng nhớ như được dùng trong
C, chứ không phải là một phiên bản của lớp như được hiểu trong phần lớn ngôn ngữ lập trình hướng
đối tượng khác. Ví dụ như: int i;
Dòng trên sẽ định nghĩa một đối tượng kiểu int (số nguyên), tức là một vùng nhớ sẽ được sử dụng
để lưu giữ biến i.
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
15
Thư viện C++
Thư viện chuẩn C++ dùng lại thư viện chuẩn C với một số điều chỉnh nhỏ để giúp nó hoạt động tốt
hơn với ngôn ngữ C++. Một bộ phận lớn khác của thư viện C++ dựa trên Thư viện tiêu bản chuẩn (hay
còn gọi là STL - viết tắt từ chữ Standard Template Library). Thư viện này có nhiều công cụ hữu dụng
như là các thùng chứa (thí dụ như vector, danh sách liên kết và biến lặp (tổng quát hóa từ khái niệm
con trỏ) để cung cấp những thùng chứa này sự truy cập giống như là truy cập mảng. Xa hơn nữa, bảng
(đa) ánh xạ (mảng kết hợp) và (đa) tập, tất cả được cung cấp để có thể xuất ra các giao diện tương
thích. Do đó, có thể dùng tiêu bản để viết các thuật toán tổng quát mà chúng làm việc được với bất kì
thùng chứa nào hay với bất kì dãy nào được định nghĩa bởi biến lặp. Giống như C, các tính năng của
thư viện này thì được truy cập bởi việc sử dụng lệnh dẫn hướng #include để bao gồm một tập tin tiêu
đề chuẩn. C++ cung ứng 69 tiêu đề chuẩn, trong đó có 19 tiêu đề không còn hiệu lực nữa.
Vì thư viện chuẩn được thiết kế bởi những chuyện gia hàng đầu và đã được chứng minh trong toàn

bộ lịch sử kĩ nghệ, các thành phần của thư viện này được khuyến cáo sử dụng thay vì dùng những phần
viết tay bên ngoài hay những phương tiện cấp thấp khác. Thí dụ, dùng std:vector hay std::string
thay vì dùng kiểu mảng đơn thuần sẽ không những là cho "đời sống dễ thở hơn", mà còn là một cách
hữu hiệu để viết phần mềm được an toàn và linh hoạt hơn.
STL nguyên là một thư viện của hãng HP và sau đó là của SGI, trước khi nó được nhận vào thành
chuẩn C++. Tiêu chuẩn thì không tham chiếu nó bằng cái tên "STL", khi đa phần nó chỉ là bộ phận tiêu
chuẩn. Tuy vậy, nhiều người vẩn dùng khái niệm "STL" này để phân biệt nó với phần còn lại của thư
viện C++ như là IOstream, quốc tế hóa (kí tự và ngôn ngữ trình bày), chẩn đoán, thư viện C, v.v
Một đề án mang tên STLPort, dựa cơ sở trên SGI STL, bảo trì các thiết lập mới của STL,
IOStream và string. Các đề án khác cũng có những xây dựng đặc thù riêng của thư viện chuẩn với
các mục tiêu thiết kế khác nhau. Mỗi nơi sản xuất hay phổ biến nhà trình dịch C++ đều bao gồm một
sự thiết lập của thư viện, vì đây là phần quan trọng của tiêu chuẩn và lại là kỳ vọng của người lập trình
2.2 Câu chú thích
Các chú thích được các lập trình viên sử dụng để ghi chú hay mô tả trong các phần của chương
trình. Trong C++ có hai cách để chú thích
// Chú thích theo dòng
/* Chú thích theo khối */
Chú thích theo dòng bắt đầu từ cặp dấu xổ (//) cho đến cuối dòng. Chú thích theo khối bắt đầu bằng
/* và kết thúc bằng */ và có thể bao gồm nhiều dòng. Chúng ta sẽ thêm các chú thích cho chương
trình :


Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
16
/* my second program in C++
with more comments */
#include <iostream.h>
int main ()
{

cout << "Hello World! ";//says Hello World!
cout << "I'm a C++ program";
// says I'm a C++ program
return 0;
}
Hello World! I'm a C++ program
Nếu bạn viết các chú thích trong chương trình mà không sử dụng các dấu //, /* hay */, trình dịch sẽ coi
chúng như là các lệnh C++ và sẽ hiển thị các lỗi.
2.3 Kiểu dữ liệu, toán tử và các phát biểu khai báo
2.3.1. Kiểu dữ liệu
Một hệ thống đặc thù, mà theo đó các dữ liệu được tổ chức sắp xếp trong một chương trình gọi là
hệ thống kiểu của ngôn ngữ lập trình. Việc thiết kế và nghiên cứu các hệ thống kiểu được biết như là lý
thuyết kiểu (kiểu dữ liệu).
Chức năng của máy điện toán là xử lý các thông tin. Các thông tin được nhập và lưu trữ trong bộ
nhớ của máy dưới các dạng khác nhau: có thể là số, là chữ, có thể là hình ảnh, âm thanh,.v.v. mà thuật
ngữ tin học gọi chung là dữ liệu. Tính đa dạng của dữ liệu đòi hỏi phải tổ chức và phân phối bộ nhớ
thích hợp để lưu trữ và xử lý tốt các dữ liệu. Ngôn ngữ lập trình chia các dữ liệu thành từng nhóm riêng
trên đó xây dựng một số phép toán tạo nên các kiểu dữ liệu khác nhau, mỗi kiểu dữ liệu là một tập hợp
các gía trị mà một biến thuộc kiểu đó có thể nhận. Khi một biến được khai báo thuộc kiểu dữ liệu nào
thì máy sẽ dành cho biến đó một dung lượng thích hợp trong bộ nhớ để có thể lưu trữ các gía trị thuộc
kiểu dữ liệu đó
2.3.2. Toán tử
1) Các toán tử số học
Toán tử
Ý nghĩa
+
Cộng
-
Trừ
*

Nhân
/
Chia
%
Chia lấy phần dư

Giảm 1 đơn vị
++
Tăng 1 đơn vị
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
17
Tăng và giảm (++ và )
Toán tử ++ thêm 1 vào toán hạng của nó và – – trừ bớt 1. Nói cách khác:
Ví dụ:
x = x + 1 giống như ++x hay x++
x = x -1 giống như x - - hay x - -
Cả 2 toán tử tăng và giảm đều có thể tiền tố (đặt trước) hay hậu tố (đặt sau) toán hạng.
Tuy nhiên giữa tiền tố và hậu tố có sự khác biệt khi sử dụng trong 1 biểu thức. Khi 1 toán tử tăng
hay giảm đứng trước toán hạng của nó, C++ thực hiện việc tăng hay giảm trước khi lấy giá trị dùng
trong biểu thức. Nếu toán tử đi sau toán hạng, C++ lấy giá trị toán hạng trước khi tăng hay giảm nó.
Ví dụ:
x = 10;
y = ++x ; //y = 11, x=11
Tuy nhiên:
x = 10;
y = x++; //y = 10, x=11
Thứ tự ưu tiên của các toán tử số học: ++, sau đó là *, /, % rồi mới đến +, -
2) Các toán tử quan hệ và các toán tử Logic
Ý tưởng chính của toán tử quan hệ và toán tử Logic là đúng hoặc sai. Trong C++ mọi giá trị khác 0

được gọi là đúng, còn sai là 0. Các biểu thức sử dụng các toán tử quan hệ và Logic trả về 0 nếu sai và
trả về 1 nếu đúng.
Toán tử
ý nghĩa
Các toán tử quan hệ
>
Lớn hơn
>=
Lớn hơn hoặc bằng
<
Nhỏ hơn
<=
Nhỏ hơn hoặc bằng
==
Bằng
!=
Khác
Các toán tử Logic
&&
AND
||
OR
!
NOT

Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
18
Bảng chân trị cho các toán tử Logic:
P

q
p&&q
p||q
!p
0
0
0
0
1
0
1
0
1
1
1
0
0
1
0
1
1
1
1
0

Các toán tử quan hệ và Logic đều có độ ưu tiên thấp hơn các toán tử số học. Do đó một biểu thức như:
10 > 1+ 12 sẽ được xem là 10 > (1 + 12) và kết quả là sai (0).
Ta có thể kết hợp vài toán tử lại với nhau thành biểu thức như sau:
Ví dụ: (10>5)&&!(10<9)||3<=4 Kết quả là đúng
Thứ tự ưu tiên của các toán tử quan hệ là Logic : ! ; > ; >= ; < ; <= ; = = ;!= ; && ; ||

3) Các toán tử Bitwise:
Các toán tử Bitwise ý nói đến kiểm tra, gán hay sự thay đổi các Bit thật sự trong 1 Byte của Word,
mà trong C++ chuẩn là các kiểu dữ liệu và biến char, int. Ta không thể sử dụng các toán tử Bitwise với
dữ liệu thuộc các kiểu float, double, long double, void hay các kiểu phức tạp khác.
Toán tử
ý nghĩa
&
AND
|
OR
^
XOR
~
NOT
>>
Dịch phải
<<
Dịch trái
Bảng chân trị của toán tử ^ (XOR)
p
q
p^q
0
0
0
0
1
1
1
0

1
1
1
0
5) Toán tử con trỏ & và *
Một con trỏ là địa chỉ trong bộ nhớ của một biến. Một biến con trỏ là một biến được khai báo riêng
để chứa một con trỏ đến một đối tượng của kiểu đã chỉ ra nó.
Ta sẽ tìm hiểu kỹ hơn về con trỏ trong chương về con trỏ. Ở đây, chúng ta sẽ đề cập ngắn gọn đến hai
toán tử được sử dụng để thao tác với các con trỏ.
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
19
Toán tử thứ nhất là &, là một toán tử quy ước trả về địa chỉ bộ nhớ của hệ số của nó.
Ví dụ: m = &count;
Đặt vào biến m địa chỉ bộ nhớ của biến count.
Chẳng hạn, biến count ở vị trí bộ nhớ 2000, giả sử count có giá trị là
100. Sau câu lệnh trên m sẽ nhận giá trị 2000.
Toán tử thứ hai là *, là một bổ sung cho &; đây là một toán tử quy ước trả về
giá trị của biến được cấp phát tại địa chỉ theo sau đó.
Ví dụ: q = *m;
Sẽ đặt giá trị của count vào q. Bây giờ q sẽ có giá trị là 100 vì 100 được lưu trữ tại địa chỉ 2000.
6) Toán tử dấu “,” .
Toán tử dấu , được sử dụng để kết hợp các biểu thức lại với nhau. Bên trái của toán tử dấu , luôn
được xem là kiểu void. Điều đó có nghĩa là biểu thức bên phải trở thành giá trị của tổng các biểu thức
được phân cách bởi dấu phẩy.
Ví dụ: x = (y=3,y+1);
Trước hết gán 3 cho y rồi gán 4 cho x. Cặp dấu ngoặc đơn là cần thiết vì toán tử dấu , có độ ưu tiên
thấp hơn toán tử gán.
7) Xem các dấu ngoặc đơn và cặp dấu ngoặc vuông là toán tử
Trong C++, cặp dấu ngoặc đơn là toán tử để tăng độ ưu tiên của các biểu thức bên trong nó.

Các cặp dấu ngoặc vuông thực hiện thao tác truy xuất phần tử trong mảng.
8) Tổng kết về độ ưu tiên
Cao nhất
() []

! ~ ++ (Kiểu) * &

* / %

+ -

<< >>

< <= > >=

&

^
2.3.3. Lệnh đơn và lệnh phức
- Câu lệnh: Trong ngôn ngữ lập trình là sự kết hợp các từ khóa, từ chuẩn, các tên gọi nói chung và
các toán tử theo một quy tắc cú pháp nhất định để tạo thành chỉ thị của chương trình.
- Câu lệnh đơn: Câu lệnh đơn giản gồm: Lệnh gán, lệnh vào / ra và các lệnh gọi hàm
Các câu lệnh ngăn cách nhau bằng dấu “;”
-Câu lệnh phức: Câu lệnh phức có tử hai câu lệnh đơn trở lên chúng đước đặt trong cặp dấu { }
để thể biểu thị cấu trúc điều khiển rẽ nhánh hoặc cấu trúc lặp.
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
20

2.4. Biến và khai báo biến

2.4.1. Biến
Một biến (variable) là một tên biểu thị cho một số lượng, một ký hiệu hay một đối tượng. Thêm
vào đó, một biến sẽ được dành sẵn chỗ (phần của bộ nhớ) để chứa số lượng, ký hiệu hay đối tượng đó.
Trong lúc chương trình được thi hành thì các biến của chương trình sẽ có thể thay đổi giá trị hoặc
không thay đổi gì cả. Hơn nữa, một biến có thể bị thay đổi cả lượng bộ nhớ mà nó đang chiếm hữu (do
người lập trình hay do phần mềm dịch ra lệnh).
Trường hợp biến này không được gán giá trị hay có gán giá trị nhưng không được sử dụng vào các
tính toán thì nó chỉ chiếm chỗ trong bộ nhớ một cách vô ích. Mỗi biến sẽ có tên của nó và có thể có
kiểu xác định. Tùy theo ngôn ngữ, một biến có thể được khai báo ở vị trí nào đó trong mã nguồn và
cũng tùy ngôn ngữ, tùy phần mềm dịch và cách thức lập trình mà một biến có thể được tạo nên (cùng
với chỗ chứa) hay bị xóa bỏ tại một thời điểm nào đó trong lúc thực thi chương trình. Việc các biến bị
xóa bỏ là để tiết kiệm bộ nhớ cũng như làm tốt hơn việc quản lý phần bộ nhớ mà đôi khi một chương
trình chỉ được cấp bởi đăng ký với hệ điều hành.
Quá trình tồn tại của một biến gọi là đời sống của biến. Trong nhiều trường hợp đời sống của một
biến chỉ xảy ra trong nội bộ một hàm, một thủ tục hay trong một khối mã.
2.4.2. Khai báo biến
- Cú pháp: <Kiểu dữ liệu> <danh sách biến>;
Mỗi biến được viết cách nhau bằng dấu “,”.
Ví dụ: int x , y;
float a , b , c;
- Trong C/C++ có thể khai báo biến ở bất cứ vị trí nào miễn là khai báo trước khi sử dụng.
2.5 Các kiểu dữ liệu cơ bản chuẩn
2.5.1. KiÓu ký tù (char)
Một giá trị kiểu char chiếm 1 byte (8bit) và biểu diễn được một ký tự thông qua bảng má
ASCII.
VÝ dô :
Ký tự
Mã ASCII
0
048

1
049
2
050
A
065
B
066
a
097
b
098


Bi ging K thut lp trỡnh
Biờn son: ThS. Trn Xuõn Thanh Khoa CNTT H Thnh ụ
21
Cú hai kiu ký t l signed char v unsigned.
Kiểu
Phạm vi biểu diễn
Số ký tự

Kích th-ớc
Char ( Signed char )
-128 đến 127
256
1 byte
Unsigned char
0 đến 255
256

1 byte
Ví dụ sau minh hoạ sự khác nhau giữa hai kiểu dữ liệu trên : Xét đoạn ch-ơng trình sau :
char ch1;
unsigned char ch2;

ch1=200; ch2=200;
Khi đó thực chất :
ch1= - 56;
ch2= 200;
Nh-ng cả ch1 và ch2 đều biểu diễn cùng một ký tự có mã 200.
Phân loại ký tự:
Có thể chia 256 ký tự làm ba nhóm :
Nhóm 1: Nhóm các ký tự điều khiển có mã từ 0 đến 31. Chẳng hạn ký tự mã 13 dùng để chuyển con
trỏ về đầu dòng, ký tự 10 chuyển con trỏ xuống dòng d-ới ( trên cùng một cột ). Các ký tự nhóm này
nói chung không hiển thị ra màn hình.
Nhóm 2 : Nhóm các ký tự văn bản có mã từ 32 đến 126. Các ký tự này có thể đ-ợc đ-a ra màn hình
hoặc máy in.
Nhóm 3 : Nhóm các ký tự đồ hoạ có mã số từ 127 đến 255. Các ký tự này có thể đ-a ra màn hình
nh-ng không in ra đ-ợc (bằng các lệnh DOS).
2.5.2. Kiểu nguyên
Trong C++ cho phép sử dụng số nguyên kiểu int, số nguyên dài kiểu long và số nguyên không dấu
kiểu unsigned. Kích cỡ và phạm vi biểu diễn của chúng đ-ợc chỉ ra trong bảng d-ới đây :
Kiểu
Phạm vi biểu diễn
Kích th-ớc
int
-32768 đến 32767
2 byte
unsigned int
0 đến 65535

2 byte
long
-2147483648 đến 2147483647
4 byte
unsigned long
0 đến 4294967295
4 byte
Chú ý : Kiểu ký tự cũng có thể xem là một dạng của kiểu nguyên.
Bi ging K thut lp trỡnh
Biờn son: ThS. Trn Xuõn Thanh Khoa CNTT H Thnh ụ
22

2.5.3. Kiu s thc.
Trong C++ cho phép sử dụng ba loại dữ liệu dấu phảy động, đó là float, double và long double.
Kích cỡ và phạm vi biểu diễn của chúng đ-ợc chỉ ra trong bảng d-ới đây :
Kiểu
Phạm vi biểu diễn
Số chữ số
có nghĩa
Kích th-ớc
Float
3.4E-38 đến 3.4E+38
7 đến 8
4 byte
Double
1.7E-308 đến 1.7E+308
15 đến 16
8 byte
long double
3.4E-4932 đến 1.1E4932

17 đến 18
10 byte
Giải thích: Máy tính có thể l-u trữ đ-ợc các số kiểu float có giá trị tuyệt đối từ 3.4E-38 đến 3.4E+38.
Các số có giá trị tuyệt đối nhỏ hơn3.4E-38 đ-ợc xem bằng 0. Phạm vi biểu diễn của số double đ-ợc
hiểu theo nghĩa t-ơng tự.
Ngoi ra ta cũn cú kiu d liu void, kiu ny mang ý ngha l kiu rng khụng cha giỏ tr gỡ c.
2.6 . Cu trỳc mt chng trỡnh C++
Trc khi núi n cu trỳc tng quỏt ca mt chng trỡnh ngun C, chỳng ta hóy xem
mt vớ d n gin sau õy chng trỡnh in xõu Chao cac ban! ra mn hỡnh
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
void main()
{
clrscr();
cout<<\n Chao cac ban !;
getch();
}
(trong on mó ngun trờn chỳng ta thờm cỏc s dũng v du: tin cho vic gii thớch, cũn trong
chng trỡnh thỡ khụng c cú chỳng).
Trong chng trỡnh trờn gm hai phn chớnh ú l :
- Cỏc dũng bao hm tp dũng 1, 2; ng ký s dng cỏc tp tiờu . Trong chng trỡnh ny
chỳng ta cn dựng hai file tiờu <stdio.h> v <conio.h>.
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
23
- Hàm main từ dòng 3 tới dòng 8. Đây là hàm chính của chương trình , dòng 3 là tiêu đề hàm cho
biết tên: main, kiểu hàm: void, và đối của hàm (trong ví dụ này không có đối). Thân của hàm main bắt
đầu ngay sau dấu { (dòng 4), và kết thúc tại dấu } (dòng 8).
Cấu trúc tổng quát:

Một chương trình C++ bao gồm các phần như: Các chỉ thị tiền xử lý, khai báo biến ngoài, các hàm tự
tạo, chương trình chính (hàm main).
Cấu trúc có thể như sau:

Các chỉ thị tiền xử lý (Preprocessor directives)
#include <Tên tập tin thư viện>
#define ….// các định nghĩa, định danh

Định nghĩa kiểu dữ liệu (phần này không bắt buộc): dùng để đặt tên lại cho một kiểu dữ liệu nào đó
để gợi nhớ hay đặt 1 kiểu dữ liệu cho riêng mình dựa trên các kiểu dữ liệu đã có.
Cú pháp: typedef <Tên kiểu cũ> <Tên kiểu mới>
Ví dụ: typedef int SoNguyen; // Kiểu SoNguyen là kiểu int
Khai báo các prototype (tên hàm, các tham số, kiểu kết quả trả về,… của các hàm sẽ cài đặt trong
phần sau, phần này không bắt buộc): phần này chỉ là các khai báo đầu hàm, không phải là phần
định nghĩa hàm.
Khai báo các biến ngoài (các biến toàn cục) phần này không bắt buộc: phần này khai
báo các biến
toàn cục được sử dụng trong cả chương trình.

Chương trình chính (main) phần này bắt buộc phải có
<Kiểu dữ liệu trả về>
main()

{

Các khai báo cục bộ trong hàm main: Các khai báo này chỉ tồn tại trong hàm mà thôi, có
thể là khai báo biến hay khai báo kiểu.
Các câu lệnh dùng để định nghĩa hàm main
return <kết quả trả về>; // Hàm phải trả về kết quả


}

Cài đặt các hàm
<Kiểu dữ liệu trả về> function1( các tham số)
{
Các khai báo cục bộ trong hàm.
Các câu lệnh dùng để định nghĩa hàm return
<kết quả trả về>;
}
Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
24

Một chương trình C++ bắt đầu thực thi từ hàm main (thông thường là từ câu lệnh đầu tiên đến câu lệnh
cuối cùng).
Lưu ý: Những giải thích trong chương trình đặt sau dấu // lời giải thích hoặc trong dấu /* lời giải
thích */
Ví dụ 1: In ra màn hình dòng chữ “Hello world”
// my first program in C++

#include <iostream.h>

int main ()
{
cout << "Hello World!";
return 0;
}
Hello World!
Ví dụ 2: In ra màn hình dãy số giảm dần
// custom countdown using while

#include <iostream.h>
int main ()
{
int n;
cout << "Enter the starting number > ";
cin >> n;
while (n>0) {
cout << n << ", ";
n;
}
cout << "FIRE!";
return 0;
}
Enter the starting number > 8
8, 7, 6, 5, 4, 3, 2, 1, FIRE!

Bài giảng Kỹ thuật lập trình
Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô
25
Chương 3. CÁC THÀNH PHẦN CĂN BẢN KHÁC CỦA C++
3.1 Các toán tử gán
Toán tử gán dùng để gán một giá trị nào đó cho một biến
Ví dụ: a = 5;
Gán giá trị nguyên 5 cho biến a. Vế trái bắt buộc phải là một biến còn vế phải có thể là bất kỳ hằng,
biến hay kết quả của một biểu thức.
Cần phải nhấn mạnh rằng toán tử gán luôn được thực hiện từ trái sang phải và không bao giờ đảo
ngược.
Ví dụ: a = b;
gán giá trị của biến a bằng giá trị đang chứa trong biến b. Chú ý rằng chúng ta chỉ gán giá trị của b
cho a và sự thay đổi của b sau đó sẽ không ảnh hưởng đến giá trị của a.

Một thuộc tính của toán tử gán trong C++ góp phần giúp nó vượt lên các ngôn ngữ lập trình khác là
việc cho phép vế phải có thể chứa các phép gán khác.
Ví dụ: a = 2 + (b = 5); tương đương với: b = 5; a = 2 + b;
Vì vậy biểu thức sau cũng hợp lệ trong C++: a = b = c = 5;
gán giá trị 5 cho cả ba biến a, b và .
Các toán tử gán phức hợp (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)
Một đặc tính của ngôn ngữ C++ làm cho nó nổi tiếng là một ngôn ngữ súc tích chính là các toán tử
gán phức hợp cho phép chỉnh sửa giá trị của một biến với một trong những toán tử cơ bản sau:
value += increase; tương đương với value = value + increase;
a -= 5; t tương đương với a = a - 5;
a /= b; tương đương với a = a / b;
price *= units + 1; tương đương với price = price * (units + 1);
và tương tự cho tất cả các toán tử khác.
3.2 Định dạng số liệu để xuất ra
Trước khi dữ liệu được in ra màn hình cần định dạng dữ liệu. Sử dụng các công cụ định dạng có
sẵn như: xuống dòng ( \n ), dấu tab ( \t ), về đầu dòng ( \r ), … và một số định dạng số.
3.3 Cách dùng các hàm thư viện toán học
Các hàm toán học có trong thư viên <math.h>, <float.h>:
abs(int x): tính trị tuyệt đối của số nguyên x
fabs(double x): tính trị tuyệt đối của số thực x

×