Đăng ký Đăng nhập
Trang chủ Công nghệ thông tin Kỹ thuật lập trình Bài giảng -ktlt v2010 academia.edu...

Tài liệu Bài giảng -ktlt v2010 academia.edu

.PDF
105
241
106

Mô tả:

bài giảng -KTLT_V2010_academia.edu
Bài giảng Kỹ thuật lập trình Chương 1. 1.1 NHẬP MÔN VỀ MÁY TÍNH VÀ LẬP TRÌNH 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ý. Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 1 Bài giảng Kỹ thuật lập trình - 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 Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 2 Bà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 Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 3 Bà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. Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 4 Bà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. Đ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.) Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 5 Bà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ì 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. Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 6 Bà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 Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 7 Bà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 Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 8 Bà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 Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 9 Bà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: 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 đủ Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 10 Bà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 Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 11 Bà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(2n) 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(2n). 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à Θ Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 12 Bà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. Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 13 Bài giảng Kỹ thuật lập trình Chương 2. 2.1 KIỂU DỮ LIỆU, TOÁN TỬ VÀ PHÁT BIỂU 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. Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 14 Bà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::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 : Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 15 Bài giảng Kỹ thuật lập trình Hello World! I'm a C++ program /* my second program in C++ with more comments */ #include int main () { cout << "Hello World! ";//says Hello World! cout << "I'm a C++ program"; // says I'm a C++ program return 0; } 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ị Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 16 Bà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ó. 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 Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 17 Bài giảng Kỹ thuật lập trình 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ỏ. Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 18 Bà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ụ: 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. Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 19 Bà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: ; 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ự 0 1 2 A B a b ... Mã ASCII 048 049 050 065 066 097 098 .... Biên soạn: ThS. Trần Xuân Thanh – Khoa CNTT – ĐH Thành Đô 20
- Xem thêm -

Tài liệu liên quan