- 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
Trang 1Bài giảng Kỹ thuật lập trình
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ý
Trang 2Bài giảng Kỹ thuật lập trình
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
Trang 3Bài giảng Kỹ thuật lập trình 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
Trang 4Bài giảng Kỹ thuật lập trình
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
Trang 5Bài giảng Kỹ thuật lập trình 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
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
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.)
Trang 6Bài giảng Kỹ thuật lập trình
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ì
Trang 7Bài giảng Kỹ thuật lập trình
+ 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
Trang 8Bài giảng Kỹ thuật lập trình
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
Trang 9Bài giảng Kỹ thuật lập trình
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
Trang 10Bài giảng Kỹ thuật lập trình 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:
Trang 11Bài giảng Kỹ thuật lập trình
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
Trang 12Bài giảng Kỹ thuật lập trình
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(n2
) 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ó:
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
) 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ỡ n2; 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à Θ
Trang 13Bài giảng Kỹ thuật lập trình
Tương tự như với bậc O-lớn, nếu như tìm được các hằng số C,k1,k2 đề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
Trang 14Bài giảng Kỹ thuật lập trình
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
Trang 15Bài giảng Kỹ thuật lập trình
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::stringthay 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
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
trình :
Trang 16Bài giảng Kỹ thuật lập trình
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 đó
Trang 17Bài giảng Kỹ thuật lập trình
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ó
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
Trang 18Bài giảng Kỹ thuật lập trình Bảng chân trị cho các toán tử Logic:
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
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ỏ
Trang 19Bài giảng Kỹ thuật lập trình 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ụ: 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
! ~ ++ (Kiểu) * &
* / % + -
- 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 { }
Trang 20Bài giảng Kỹ thuật lập trình
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
Trang 21Bài giảng Kỹ thuật lập trỡnh
Cú hai kiểu 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 :
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)
Chú ý : Kiểu ký tự cũng có thể xem là một dạng của kiểu nguyên
Trang 22Bài giảng Kỹ thuật lập trỡnh
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ự
Ngoài ra ta cũn cú kiểu dữ liệu void, kiểu này mang ý nghĩa là kiểu rỗng khụng chứa giỏ trị gỡ cả
2.6 Cấu trỳc một chương trỡnh C++
Trước khi núi đến cấu trỳc tổng quỏt của một chương trỡnh nguồn C, chỳng ta hóy xem
một vớ dụ đơn giản sau đõy – chương trỡnh in xõu „Chao cac ban!‟ ra màn hỡnh
Trong chương trỡnh trờn gồm hai phần chớnh đú là :
- Cỏc dũng bao hàm tệp – dũng 1, 2; đăng ký sử dụng cỏc tệp tiờu đề Trong chương trỡnh này chỳng ta cần dựng hai file tiờu đề <stdio.h> và <conio.h>
Trang 23Bài giảng Kỹ thuật lập trình
- 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ề>;
Trang 24Bài giảng Kỹ thuật lập trình
Trang 25Bài giảng Kỹ thuật lập trình
Chương 3 CÁC THÀNH PHẦN CĂN BẢN KHÁC CỦA 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
Trang 26Bài giảng Kỹ thuật lập trỡnh
random(int n): cho số ngẫu nhiờn từ 0 đến n - 1
randomize(): khởi đầu bộ tạo số ngẫu nhiờn, ta nờn chạy hàm này trước khi dựng hàm random cos(double x) và sin(double x) và tan(double x): tớnh cos và sin và tang của x (đơn vị của x là
radian chứ khụng phải là độ, 1 radian bằng khoảng 57 độ, cụ thể là bằng 180/3.14 - chắc cỏc bạn cũn nhớ 3.14 là gỡ chứ?)
exp(double x): tớnh e mũ x
log(double x): tớnh logarit tự nhiờn của x (tức là ln(x) nếu viết theo toỏn học)
pow(double y,double x): tớnh y mũ x
Chỳ ý: là y mũ x cú thể tớnh theo cụng thức: y mũ x = exp(y*log(x))
sqrt(double x): tớnh căn bậc 2 của x
Chỳ ý: là căn bậc n của x cú thể tớnh theo cụng thức pow(x, 1/n)
floor(double x): cho số nguyờn lớn nhất dưới x Vớ dụ: floor(8.6) là 8
ceil(double x): cho số nguyờn bộ nhất trờn x Vớ dụ: ceil(8.6) là 9
3.4 Phỏt biểu nhập với đối tượng cin xuất với đối tượng cout
Các tiện ích vào/ra của th- viện C chuẩn đều có thể sử dụng trong C++ Để sử dụng các hàm này chúng ta chỉ cần khai báo tệp tiêu đề trong đó có chứa khai báo hàm nguyên mẫu của các tiện ích này Bên cạnh đó, C++ còn cài đặt thêm các khả năng vào/ra mới dựa trên hai toán tử “<<”(xuất) và
“>>” (nhập) với các đặc tính sau đây:
Trong tệp tiêu đề <iostream.h> ng-ời ta định nghĩa hai đối t-ợng cout và cin t-ơng ứng với hai thiết bị chuẩn ra/vào được sử dụng cùng với “<<” và “>>” Thông thường ta hiểu cout là màn hình còn cin là bàn phím
Ghi dữ liệu lên thiết bị ra chuẩn (màn hình) cout
Trong phần này ta xem xét một số ví dụ minh hoạ cách sử dụng cout và “<<” để đưa thông tin ra màn
hình
Trang 27Bài giảng Kỹ thuật lập trỡnh
Ví dụ : Ch-ơng trình sau minh hoạ cách sử dụng cout để đ-a ra màn hình một xâu ký tự
#include <iostream.h> /*phải khai báo khi muốn sử dụng cout*/
Ví dụ: Sử dụng cout và “<<” đưa ra các giá trị khác nhau:
#include <iostream.h> /*phải khai báo khi muốn sử dụng cout*/
Đọc dữ liệu từ thiết bị vào chuẩn (bàn phím) cin
cin được dùng để chỉ một thiết bị vào chuẩn Một cách tương tự, toán tử “>>” được dùng kèm với cin để
nhập vào các giá trị; hai câu lệnh
int n;
Trang 28Bài giảng Kỹ thuật lập trỡnh cin >> n;
Yêu cầu đọc các ký tự trên bàn phím và chuyển chúng thành một số nguyên và gán cho biến n
Giống nh- cout và “<<”, có thể nhập nhiều giá trị cùng kiểu hay khác kiểu bằng cách viết liên tiếp tên các biến cần nhập giá trị cùng với “>>” ngay sau cin Chẳng hạn:
cin tuân theo một số qui -ớc dùng trong việc phân tích các ký tự:
Các giá trị số đ-ợc phân cách bởi: SPACE, TAB, CR, LF Khi gặp một ký tự “không hợp lệ” (dấu
“.” đối với số nguyên, chữ cái đối với số, ) sẽ kết thúc việc đọc từ cin; ký tự không hợp lệ này sẽ đ-ợc
xem xét trong lần đọc sau
Đối với giá trị xâu ký tự, dấu phân cách cũng là SPACE, TAB,CR, còn đối với giá trị ký tự, dấu phân cách là ký tự CR Trong hai trường hợp này không có khái niệm “ký tự không hợp lệ” Mã sinh ra
do bấm phím Enter của lần nhập tr-ớc vẫn đ-ợc xét trong lần nhập xâu/ký tự tiếp theo và do vậy sẽ có
“nguy cơ ” không nhập được đúng giá trị mong muốn khi đưa ra lệnh nhập xâu ký tự hoặc ký tự ngay sau các lệnh nhập các giá trị khác Giải pháp khắc phục vấn đề này để đảm bảo công việc diễn ra đúng theo ý là tr-ớc mỗi lần gọi lệnh nhập dữ liệu cho xâu/ký tự ta sử dụng một trong hai chỉ thị sau đây:
fflush(stdin); //khai báo trong stdio.h
cin.clear(); //hàm thành phần của lớp định nghĩa đối t-ợng cin
Ta tham khảo ch-ơng trình sau:
Trang 29Bài giảng Kỹ thuật lập trỡnh cout << "Nhap vao mot so nguyen, mot xau, mot so thuc : ";
Nhap vao mot so nguyen, mot xau, mot so thuc : 5 hung 5.6
Da nhap 5,hung and 5.6
Nhap vao mot so nguyen, mot xau, mot so thuc : 0 4
Ví dụ : #define MAX 1000
Lúc này, tất cả các tên MAX trong ch-ơng trình xuất hiện sau này đều đ-ợc thay bằng 1000 Vì vậy, ta th-ờng gọi MAX là tên hằng, nó biểu diễn số 1000
Trang 30Bài giảng Kỹ thuật lập trỡnh
Chú ý :
Cần phân biệt hai hằng 5056 và 5056.0 : ở đây 5056 là số nguyên còn 5056.0 là hằng thực
+ Hằng long :
Hằng long là số nguyên có giá trị trong khoảng từ -2147483648 đến 2147483647
Hằng long đ-ợc viết theo cách : 1234L hoặc 1234l ( thêm L hoặc l vào đuôi )
Một số nguyên v-ợt ra ngoài miền xác định của int cũng đ-ợc xem là long
Ví dụ :
#define sl 8865056L Định nghiã hằng long sl có giá trị là 8865056
#define sl 8865056 Định nghiã hằng long sl có giá trị là 8865056 + Hằng int hệ 8
Hằng int hệ 8 đ-ợc viết theo cách 0c1c2c3 ở đây ci là một số nguyên d-ơng trong khoảng từ 1
đến 7 Hằng int hệ 8 luôn luôn nhận giá trị d-ơng
Trang 31Bài giảng Kỹ thuật lập trỡnh Cho ta các hắng số h16 trong hệ 16 có giá trị nh- nhau Giá trị của chúng trong hệ 10 là : 10*16+5=165
+ Hằng ký tự:
Hằng ký tự là một ký tự riêng biệt đ-ợc viết trong hai dấu nháy đơn, ví dụ 'a'
Giá trị của 'a' chính là mã ASCII của chữ a Nh- vậy giá trị của 'a' là 97 Hằng ký tự có thể tham gia vào các phép toán nh- mọi số nguyên khác Ví dụ: '9'-'0'=57-48=9
Ví dụ:
Hằng ký tự còn có thể đ-ợc viết theo cách sau : ' \c1c2c3'
trong đó c1c2c3 là một số hệ 8 mà giá trị của nó bằng mã ASCII của ký tự cần biểu diễn
Ví dụ: chữ a có mã hệ 10 là 97, đổi ra hệ 8 là 0141 Vậy hằng ký tự 'a' có thể viết d-ới dạng '\141' Đối
với một vài hằng ký tự đặc biệt ta cần sử dụng cách viết sau (thêm dấu \):
Chú ý : Cần phân biệt hằng ký tự '0' và '\0' Hằng '0' ứng với chữ số 0 có mã ASCII là 48, còn hằng
'\0' ứng với kýtự \0 ( th-ờng gọi là ký tự null ) có mã ASCII là 0
Hằng ký tự thực sự là một số nguyên, vì vậy có thể dùng các số nguyên hệ 10 để biểu diễn các ký
tự, ví dụ lệnh (code C) printf("%c%c",65,66) sẽ in ra AB
+ Hằng xâu ký tự :
Hằng xâu ký tự là một dãy ký tự bất kỳ đặt trong hai dấu nháy kép
Ví dụ : #define xau1 "Ha noi"
#define xau2 "My name is Giang"
Xâu ký tự đ-ợc l-u trữ trong máy d-ới dạng một bảng có các phần tử là các ký tự riêng biệt Trình biên dịch tự động thêm ký tự null \0 vào cuối mỗi xâu ( ký tự \0 đ-ợc xem là dấu hiệu kết thúc của một xâu ký tự )
Trang 32Bài giảng Kỹ thuật lập trình
Chó ý: CÇn ph©n biÖt hai h»ng 'a' vµ "a" 'a' lµ h»ng ký tù ®-îc l-u tr÷ trong 1 byte, cßn "a" lµ h»ng x©u
ký tù ®-îc l-u tr÷ trong 1 m¶ng hai phÇn tö : phÇn tö thø nhÊt chøa ch÷ a cßn phÇn tö thø hai chøa \0
3.6 Các hàm thư viện xử lý chuỗi
Các hàm xử lý ký tự và chuỗi ký tự có trong thư viện <string.h>, <ctype.h>:
Cộng chuỗi - Hàm strcat()
Cú pháp: char *strcat(char *des, const char *source)
Hàm này có tác dụng ghép chuỗi nguồn vào chuỗi đích
Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main(){
char HoLot[30], Ten[12];
printf("Nhap Ho Lot: ");gets(HoLot);
printf("Nhap Ten: ");gets(Ten);
strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/
printf("Ho ten la: ");puts(HoLot);
getch();
return 0;
}
Xác định độ dài chuỗi - Hàm strlen()
Cú pháp: int strlen(const char* s)
Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím
printf("Chuoi vua nhap: ");puts(Chuoi);
printf(“Co do dai %d”,Dodai);
getch();
Trang 33Bài giảng Kỹ thuật lập trình return 0;
}
Đổi một ký tự thường thành ký tự hoa - Hàm toupper()
Hàm toupper() (trong ctype.h) được dùng để chuyển đổi một ký tự thường thành ký tự hoa
Cú pháp: char toupper(char c)
Đổi chuỗi chữ thường thành chuỗi chữ hoa, hàm strupr()
Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi
Cú pháp: char*strupr(char *s)
Ví dụ: Viết chương trình nhập vào một chuỗi ký tự từ bàn phím Sau đó sử dụng hàm strupr() để
chuyển đổi chúng thành chuỗi chữ hoa
Đổi chuỗi chữ hoa thành chuỗi chữ thường, hàm strlwr()
Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr()
Cú pháp: char *strlwr(char *s)
Sao chép chuỗi, hàm strcpy()
Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi nguồn vào chuỗi đích
Cú pháp: char*strcpy(char *Des, const char *Source)
Ví dụ: Viết chương trình cho phép chép toàn bộ chuỗi nguồn vào chuỗi đích
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
Trang 34Bài giảng Kỹ thuật lập trình char Chuoi[255],s[255];
printf("Nhap chuoi: ");gets(Chuoi);
Sao chép một phần chuỗi, hàm strncpy()
Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi đích
Cú pháp: char *strncpy(char *Des, const char *Source, size_t n)
- Nếu ký tự đã chỉ định không có trong chuỗi, kết quả trả về là NULL
- Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c được tìm thấy đầu tiên trong chuỗi str
Tìm kiếm nội dung chuỗi hàm strstr(): Hàm strstr() được sử dụng để tìm kiếm sự xuất hiện đầu tiên
của chuỗi s2 trong chuỗi s1
Cú pháp: char*strstr(const char *s1, const char *s2)
Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiên của chuỗi s1 có chứa chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1
Ví dụ: Viết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi “hoc”
Trang 35Bài giảng Kỹ thuật lập trình }
So sánh chuỗi, hàm strcmp(): Để so sánh hai chuỗi theo từng ký tự trong bảng mã Ascii, ta có thể sử
dụng hàm strcmp()
Cú pháp: int strcmp(const char *s1, const char *s2)
Hai chuỗi s1 và s2 được so sánh với nhau, kết quả trả về là một số nguyên (số này có được bằng cách lấy ký tự của s1 trừ ký tự của s2 tại vị trí đầu tiên xảy ra sự khác nhau)
- Nếu kết quả là số âm, chuỗi s1 nhỏ hơn chuỗi s2
- Nếu kết quả là 0, hai chuỗi bằng nhau
- Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2
So sánh chuỗi, hàm stricmp(): Hàm này thực hiện việc so sánh trong n ký tự đầu tiên của 2 chuỗi s1 và
s2, giữa chữ thường và chữ hoa không phân biệt
Cú pháp: int stricmp(const char *s1, const char *s2)
Kết quả trả về tương tự như kết quả trả về của hàm strcmp()
Khởi tạo chuỗi, hàm memset() :Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi là ký tự c
Cú pháp:memset(char *Des, int c, size_t n)
Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h)
Để chuyển đổi chuỗi ra số, ta sử dụng các hàm trên
Cú pháp : int atoi(const char *s) : chuyển chuỗi thành số nguyên
long atol(const char *s) : chuyển chuỗi thành số nguyên dài float atof(const char *s) : chuyển chuỗi thành số thực Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0
Ngoài ra, thư viện string.h còn hỗ trợ các hàm xử lý chuỗi khác, ta có thể đọc thêm trong phần trợ giúp
Danh sách các thư viện hàm hay dùng:
Xử lý ký tự và chuỗi ký tự :<string.h>, <ctype.h>
Trang 36Bài giảng Kỹ thuật lập trình
Chương 4 CÁC CẤU TRÚC RẼ NHÁNH
4.1 Các điều kiện rẽ nhánh
Một chương trình thường không chỉ bao gồm các lệnh tuần tự nối tiếp nhau Trong quá trình chạy
nó có thể rẽ nhánh hay lặp lại một đoạn mã nào đó Để làm điều này chúng ta sử dụng các cấu trúc điều khiển
Cùng với việc giới thiệu các cấu trúc điều khiển chúng ta cũng sẽ phải biết tới một khái niệm mới:
khối lệnh, đó là một nhóm các lệnh được ngăn cách bởi dấu chấm phẩy (;) nhưng được gộp trong một
khối giới hạn bởi một cặp ngoặc nhọn: { và }
Hầu hết các cấu trúc điều khiển mà chúng ta sẽ xem xét trong chương này cho phép sử dụng một lệnh đơn hay một khối lệnh làm tham số, tuỳ thuộc vào chúng ta có đặt nó trong cặp ngoặc nhọn hay không
4.2 Phát biểu if-else
Cấu trúc này được dùng khi một lệnh hay một khối lệnh chỉ được thực hiện khi một điều kiện nào
đó thoả mãn Dạng của nó như sau:
4.2.1 Cú pháp if đơn: if (condition) statement
Trong đó condition là biểu thức điều kiện sẽ được tính toán Nếu điều kiện đó là true, statement được thực hiện Nếu không statement bị bỏ qua (không thực hiện) và chương trình tiếp tục thực hiện
lệnh tiếp sau cấu trúc điều kiện
Ví dụ, đoạn mã sau đây sẽ viết x is 100 chỉ khi biến x chứa giá trị 100:
Chúng ta cũng có thể chỉ định điều gì sẽ xảy ra nếu điều kiện không được thoả mãn bằng cách sửu
dụng từ khoá else Nó được sử dụng cùng với if như sau:
4.2.2 Cú pháp if - else: if (condition) statement1 else statement2
Ví dụ:
if (x == 100) cout << "x is 100";
Trang 37Bài giảng Kỹ thuật lập trình else cout << "x is not 100";
Cấu trúc if + else có thể được móc nối để kiểm tra nhiều giá trị Ví dụ sau đây sẽ kiểm tra xem giá trị
chứa trong biến x là dương, âm hay bằng không
Ví dụ: 1) Giải phương trình ax+b=0
case constant2:
block of instructions 2 break;
… default:
default block of instruction }
Nó hoạt động theo cách sau: switch tính biểu thức và kiểm tra xem nó có bằng constant1 hay không, nếu đúng thì nó thực hiện block of instructions 1 cho đến khi tìm thấy từ khoá break, sau đó nhảy đến phần cuối của cấu trúc lựa chọn switch
Còn nếu không, switch sẽ kiểm tra xem biểu thức có bằng constant2 hay không Nếu đúng nó sẽ thực hiện block of instructions 2 cho đến khi tìm thấy từ khoá break
Cuối cùng, nếu giá trị biểu thức không bằng bất kì hằng nào được chỉ định ở trên (bạn có thể chỉ
định bao nhiêu câu lệnh case tuỳ thích), chương trình sẽ thực hiện các lệnh trong phần default: nếu nó
tồn tại vì phần này không bắt buộc phải có
Trang 38Bài giảng Kỹ thuật lập trình
Hai đoạn mã sau là tương đương:
} else if (x == 2) { cout << "x is 2";
} else { cout << "value of x unknown";
}
4.5 Biểu thức điều kiện
C++ có một toán tử rất mạnh và thích hợp để thay thế cho các câu lệnh của If- Then-Else Cú pháp
của việc sử dụng toán tử “?” là: E1 ? E2 : E3;
Trong đó E1, E2, E3 là các biểu thức
Ý nghĩa: Trước tiên E1 được ước lượng, nếu đúng E2 được ước lượng và nó trở thành giá trị của biểu
thức; nếu E1 sai, E2 được ước lượng và trở thành giá trị của biểu thức
Thì y được gán giá trị 100, nếu x nhỏ hơn 9 thì y sẽ nhận giá trị là 200
Ví dụ: Đoạn mã này tương đương cấu trúc if như sau:
4.6 Khai báo enum
Kiểu enum là một kiểu dữ liệu đặc biệt được dùng để định nghĩa một quan hệ thứ tự cho một tập họp hữu hạn các tên (Trong thực tế thì enum có kiểu là int):
Ví dụ: enum Wiki {Arisa, Bluesman, VietBio, Trung, Quang, Minh};
Để khai báo biến wiki có kiểu enum dùng câu lệnh:
Trang 39Bài giảng Kỹ thuật lập trình
if (member == VietBio) { do_some_commands }
for (member=Arisa; member <= Trung; member++) { do_some_commands } Như vậy, theo mặc định, các tên của một enum được xem là các hằng số từ 0 tăng dần cho đến tên cuối cùng
Tuy nhiên, C++ không loại trừ khả năng xếp lại giá trị của một kiểu enum theo cách riêng:
Ví dụ: enum reordert={duck,cat=10, mouse =50, elephant =1000, lion,
Trang 40Bài giảng Kỹ thuật lập trình
Chương 5 CÁC CẤU TRÚC LẶP
5.1 Vòng lặp while
Cú pháp: while (expression) statement
và chức năng của nó đơn giản chỉ là lặp lại statement khi điều kiện expression còn thoả mãn
Ví dụ, chúng ta sẽ viết một chương trình đếm ngược sử dụng vào lặp while:
// custom countdown using while
Khi chương trình chạy người sử dụng được yêu cầu nhập vào một số để đếm ngược Sau đó, khi
vòng lặp while bắt đầu nếu số mà người dùng nhập vào thoả mãn điều kiện điều kiện n>0 khối lệnh
sẽ được thực hiện một số lần không xác định chừng nào điều kiện (n>0) còn được thoả mãn
Chúng ta cần phải nhớ rằng vòng lặp phải kết thúc ở một điểm nào đó, vì vậy bên trong vòng lặp
chúng ta phải cung cấp một phương thức nào đó để buộc condition trở thành sai nếu không thì nó sẽ
lặp lại mãi mãi Trong ví dụ trên vòng lặp phải có lệnh - - n; để làm cho condition trở thành sai sau một số lần lặp
5.2 Vòng lặp for
Cú pháp: for (initialization; condition; increase) statement;
Chức năng chính của nó là lặp lại statement chừng nào condition còn mang giá trị đúng, như trong vòng lặp while Nhưng thêm vào đó, for cung cấp chỗ dành cho lệnh khởi tạo và lệnh tăng Vì
vậy vòng lặp này được thiết kế đặc biệt lặp lại một hành động với một số lần xác định
Cách thức hoạt động của nó như sau:
Initialization (biểu thức 1) được thực hiện Nói chung nó đặt một giá khí ban đầu cho biến điều khiển
Lệnh này được thực hiện chỉ một lần
condition (biểu thức 2) được kiểm tra, nếu nó là đúng vòng lặp tiếp tục còn nếu không vòng lặp kết
thúc và statement được bỏ qua
statement được thực hiện Nó có thể là một lệnh đơn hoặc là một khối lệnh được bao trong một cặp
ngoặc nhọn