Giáo trình Lập trình cơ bản - Nghề: Thiết kế trang web - Trình độ: Cao đẳng - Trường Cao đẳng nghề Đà Lạt

pdf 42 trang Gia Huy 17/05/2022 2520
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình cơ bản - Nghề: Thiết kế trang web - Trình độ: Cao đẳng - Trường Cao đẳng nghề Đà Lạt", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_co_ban_nghe_thiet_ke_trang_web_trinh_do.pdf

Nội dung text: Giáo trình Lập trình cơ bản - Nghề: Thiết kế trang web - Trình độ: Cao đẳng - Trường Cao đẳng nghề Đà Lạt

  1. ỦY BAN NHÂN DÂN TỈNH LÂM ĐỒNG TRƢỜNG CAO ĐẲNG NGHỀ ĐÀ LẠT GIÁO TRÌNH MÔN HỌC/ MÔ ĐUN: LẬP TRÌNH CƠ BẢN NGÀNH/ NGHỀ: THIẾT KẾ TRANG WEB TRÌNH ĐỘ: CAO ĐẲNG Ban hành kèm theo Quyết định số: 1157/QĐ-CĐNĐL ngày 11 tháng 12 năm 2019 của Hiệu trưởng Trường Cao đẳng Nghề Đà Lạt (LƢU HÀNH NỘI BỘ) Lâm Đồng, năm 2019
  2. TUYÊN BỐ BẢN QUYỀN Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể đƣợc phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo. Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm. Giáo trình đƣợc lƣu hành nội bộ Trƣờng Cao đẳng Nghề Đà Lạt. Trang 1
  3. LỜI GIỚI THIỆU Vài nét về xuất xứ giáo trình: Giáo trình này đƣợc viết theo căn cứ Thông tƣ số 03/2017/TT-BLĐTBXH ngày 01 tháng 03 năm 2017 của Bộ Lao động – Thƣơng binh và Xã hội về việc Quy định về quy trình xây dựng, thẩm định và ban hành chƣơng trình; tổ chức biên soạn, lựa chọn, thẩm định giáo trình đào tạo trình độ trung cấp, trình độ cao đẳng. Quá trình biên soạn: Giáo trình này đƣợc biên soạn có sự tham gia tích cực của các giáo viên có kinh nghiệm, cùng với những ý kiến đóng góp quý báu của các chuyên gia về lĩnh vực công nghệ thông tin. Mối quan hệ của tài liệu với chương trình, mô đun/môn học: Căn cứ vào chƣơng trình đào tạo nghề Thiết kế trang web, giáo trình giúp cung cấp cho ngƣời học những kiến thức cơ bản về ngôn ngữ lập trình C++ cũng nhƣ kỹ năng lập trình hƣớng đối tƣợng. Để học đƣợc mô đun này ngƣời học cần có kiến thức cơ bản về tin học và toán học. Cấu trúc chung của giáo trình này bao gồm 5 bài: BÀI 1. GIỚI THIỆU VỀ NGÔN NGỮ C BÀI 2. CÁC THÀNH PHẦN TRONG NGÔN NGỮ C++ BÀI 3. CÁC CẤU TRÚC LỆNH BÀI 4. CÁC CẤU TRÚC LẶP BÀI 5. MẢNG VÀ CHUỖI Lời cảm ơn Giáo trình đƣợc biên soạn trên cơ sở các văn bản quy định của Nhà nƣớc và tham khảo nhiều tài liệu liên quan có giá trị. Song chắc hẳn quá trình biên soạn không tránh khỏi những thiếu sót nhất định. Ban biên soạn mong muốn và thực sự cảm ơn những ý kiến nhận xét, đánh giá của các chuyên gia, các thầy cô đóng góp cho việc chỉnh sửa để giáo trình ngày một hoàn thiện hơn. Lâm Đồng, ngày 10 tháng 12 năm 2019 Tham gia biên soạn 1. Phạm Đình Nam 2. Ngô Thiên Hoàng 3. Nguyễn Quỳnh Nguyên 4. Phan Ngọc Bảo Trang 2
  4. MỤC LỤC BÀI 1 GIỚI THIỆU VỀ NGÔN NGỮ C 6 1.1 Giới thiệu 6 1.2 Thuật toán 7 1.2.1 Định nghĩa trực quan thuật toán 7 1.2.2 Các đặc trƣng của thuật toán 7 1.2.3 Đặc tả thuật toán 7 1.2.4 Độ phức tạp của Thuật toán 7 1.3 Diễn đạt thuật toán 8 1.3.1. Ngôn ngữ tự nhiên 8 1.3.2. Lƣu đồ 8 1.3.3. Mã giả 8 1.3.4. Ngôn ngữ lập trình 9 1.4 Chƣơng trình 9 1.4.1. Khái quát về chƣơng trình. 9 1.4.2. Mã và dữ liệu 9 1.5 Giới thiệu C/C++ 9 1.6 Khởi động và thoát khỏi C++ 10 Bài tập 13 BÀI 2 CÁC THÀNH PHẦN TRONG NGÔN NGỮ C++ 14 2.1 Hệ thống ký hiệu và từ khóa 14 2.1.1 Ký hiệu cơ sở 14 2.1.2 Các từ 14 2.2 Các Kiểu Dữ Liệu Cơ Bản Trong C++ 15 2.2.1 Ký tự 15 2.2.2 Kiểu nguyên 16 2.2.3 Kiểu số thực 16 2.3 Biến, hằng, biểu thức 17 2.3.1. Định nghĩa 17 2.3.2 Các loại hằng 17 2.3.3 Hằng ký tự 18 2.3.4 Hằng xâu ký tự ( Chuỗi ) 19 2.3.5 Biểu thức hằng 19 2.3.6 Định nghĩa một hằng 19 2.4 Các phép toán 20 2.5 Lệnh, khối lệnh 22 2.6 Câu lệnh gán, lệnh xuất nhập 24 2.7 Cách chạy chƣơng trình 24 Trang 3
  5. Bài tập 25 BÀI 3 CÁC LỆNH CẤU TRÚC 26 3.1 Câu lệnh if 27 3.1.1 Cú pháp 27 3.1.2 Hoạt động 27 3.1.3 Lƣu đồ: 27 3.2 Câu lệnh switch 28 3.2.1 Cú pháp 28 3.2.2 Hoạt động của câu lệnh switch 28 3.2.3 Lƣu đồ: (Có thành phần default) 28 Bài 4: CẤU TRÚC VÒNG LẶP 31 1 Câu lệnh for 31 1.1 Cú pháp 31 1.2 Hoạt động của câu lệnh for 31 2. Câu lệnh while ( Lặp với điều kiện đƣợc kiểm tra trƣớc ) 32 2.1 Cú pháp 32 2.2 Lƣu đồ 32 2.3 Hoạt động của câu lệnh while 32 3. Câu lệnh do while ( Lặp với điều kiện đƣợc kiểm tra sau ) 32 3.1 Cú pháp 32 3.2 Lƣu đồ 33 3.3 Hoạt động của câu lệnh do 33 4. Câu lệnh goto và nhãn 33 4.1 Nhãn 33 4.2 Câu lệnh goto 33 5. Các câu lệnh break, continue 34 5.1 break 34 5.2 continue 34 6. Câu lệnh rổng 34 7. Vòng lặp vô hạn 34 Bài tập 35 BÀI 5: MẢNG VÀ CHUỖI 36 5.1 Mảng 36 5.1.1 Khái niệm 36 5.1.2 Mảng 1 chiều 36 5.1.3 Mảng 2 chiều 37 5.1.4 Kiểu mảng 38 5.1.5 Khởi đầu cho các mảng 38 Trang 4
  6. 5.1.6 Các kỹ thuật xử lý cơ bản trên mảng 38 5.2 Chuỗi 39 5.2.1 Định nghĩa 39 5.2.2 Khai báo 39 5.2.3 Kiểu xâu ký tự 39 5.2.4 Các thao tác nhập xuất xâu ký tự 39 5.2.5 Khởi đầu cho xâu ký tự 40 5.2.6 Hàm và xâu ký tự 40 5.2.7 Mảng các xâu ký tự 40 Trang 5
  7. BÀI 1 GIỚI THIỆU VỀ NGÔN NGỮ C Mục tiêu của bài: - Trình bày đƣợc lịch sử phát triển của ngôn ngữ C; - Mô tả đƣợc ngôn ngữ này có những ứng dụng thực tế nhƣ thế nào; - Sử dụng đƣợc hệ thống trợ giúp từ help file. - Thực hiện các thao tác an toàn với máy tính. 1.1 Giới thiệu Lập trình thực chất là điều khiển - bằng một ngôn ngữ lập trình cụ thể - các xử lý thông tin trên máy tính điện tử theo yêu cầu của bài toán đặt ra. Kết quả của lập trình là chƣơng trình đƣợc hợp thức hóa. Thông tin gửi đến CT, CT xử lý, kết quả sẽ đƣợc gửi đi. Chƣơng Trình Nhập Xuất Để lập trình phải biết cách tổ chức dữ liệu (cấu trúc dữ liệu) và cách thức xử lý dữ liệu( thuật toán ) để tạo ra chƣơng trình mong muốn. K. Wirth đã đƣa ra công thức : CHƢƠNG TRÌNH = CẤU TRÚC DỮ LIỆU + THUẬT TOÁN Có nhiều cách tổ chức dữ liệu cũng nhƣ có nhiều thuật toán để giải một bài toán . Đƣa ra cách tổ chức dữ liệu tốt nhất và chỉ ra thuật toán tốt nhất là công việc của ngƣời lập trình. Các phƣơng pháp lập trình thƣờng đƣợc sử dụng là lập trình có cấu trúc và lập trình theo hƣớng đối tƣợng. Các phƣơng pháp lập trình này phản ánh quan niệm lập trình là một hoạt động khoa học và có phƣơng pháp chứ không phải là một công việc ngẫu hứng. Đặc trƣng của lập trình có cấu trúc là chƣơng trình phải có cấu trúc. Tính cấu trúc của chƣơng trình thể hiện trên các mặt sau : Cấu trúc về mặt dữ liệu : Từ những dữ liệu đã có , có thể xây dựng những dữ liệu có cấu trúc phức tạp hơn. Cấu trúc về mặt lệnh : Từ những lệnh đơn giản đã có, có thể xây dựng đƣợc những lệnh có cấu trúc phức tạp hơn. Cấu trúc về mặt chƣơng trình : Trang 6
  8. Một chƣơng trình lớn có thể phân rã thành nhiều modul (hay các chƣơng trình con ) độc lập, mỗi chƣơng trình con lại có thể chia ra thành các chƣơng trình con khác nên chƣơng trình đƣợc tổ chức thành một hệ phân cấp. Nhờ vậy mà một chƣơng trình lớn, phức tạp đƣợc phân thành những modul chƣơng trình đơn giản, dễ viết, dễ đọc, dễ sửa 1.2 Thuật toán 1.2.1 Định nghĩa trực quan thuật toán Thuật toán là dãy hữu hạn các thao tác, sắp xếp theo trình tự xác định, đƣợc đề ra nhằm giải quyết một lớp bài toán nhất định. Các thao tác sẽ biến đổi trạng thái bài toán trƣớc khi thực hiện tháo tác thành trạng thái kết quả. Dãy tuần tự các thao tác trong thuật toán biến đổi trạng thái ban đầu của thuật toán thành trạng thái cuối cùng của bài toán. 1.2.2 Các đặc trƣng của thuật toán Tính xác định. Tính dừng ( hữu hạn ). Tính đúng đắn. 1.2.3 Đặc tả thuật toán Đặc tả thuật toán ( hay đặc tả bài toán ) là định rõ lớp bài toán mà một thuật toán giải quyết, do đó nó cần chỉ ra các đặc điểm sau : 1. Các đối tƣợng và phƣơng tiện của Thuật toán cần sử dụng (nhập). 2. Điều kiện ràng buộc (nếu có) trên các đối tƣợng và phƣơng tiện đó. 3. Các sản phẩm, kết quả (xuất). 4. Các yêu cầu trên sản phẩm kết quả. Thƣờng xuất hiện dƣới dạng quan hệ giữa sản phẩm kết quả và các đối tƣọng,phƣơng tiện sử dụng. Ta viết : INPUT : (1) và (2); OUTPUT : (3) và (4); 1.2.4 Độ phức tạp của Thuật toán Mỗi Thuật toán đều cần thời gian và các nguồn lực khác để giải quyết một bài toán cụ thể. Các tiêu hao đó đặc trƣng độ phức tạp của thuật toán. Có nhiều thuật toán cùng giải một lớp bài toán, ta mong muốn có đƣợc thuật toán hiệu quả hơn, tức tiêu hao ít hơn một trong các loại nguồn lực. Đối với máy tính, ta quan tâm đến thời gian và kích thƣớc bộ nhớ mà thuật toán sử dụng. Trang 7
  9. 1.3 Diễn đạt thuật toán 1.3.1. Ngôn ngữ tự nhiên Mô tả các bƣớc thực hiện của thuật toán dƣới dạng văn bản bằng ngôn ngữ tự nhiên nhƣ tiếng Việt, Anh,. . . 1.3.2. Lƣu đồ Sơ đồ toàn cảnh có cấu trúc biểu diễn các bƣớc thực hiện của thuật toán, trong đó sử dụng các hình vẽ có quy ƣớc sau: Mũi tên chỉ luồng lƣu chuyển của dữ liệu. Bắt đầu, kết thúc Điểm bắt đầu, kết thúc Xử lý Hình chữ nhật biểu diễn các bƣớc xử lý Nhập, Xuất Hình bình hành biểu thị nhập xuất Điều Hình thoi biểu thị thời điểm ra quyết định kiện Hình tròn biểu thị điểm ghép nối 1.3.3. Mã giả Dựa vào cú pháp và ngữ nghĩa của một ngôn ngữ lập trình nào đó (chẳng hạn C, Pascal, ). Cho nên mã giả cũng dựa trên các cơ sở sau đây: Ký tự Các từ Các xâu ký tự (Chuỗi) Hằng Biến Kiểu dữ liệu Lệnh gán Khối lệnh Các cấu trúc điểu khiên Câu lệnh trả về . . . Trang 8
  10. 1.3.4. Ngôn ngữ lập trình 1.4 Chƣơng trình 1.4.1. Khái quát về chƣơng trình. Thuật toán phải đƣợc diễn đạt sao cho máy tính có thể hiểu và thi hành đƣợc. Ngôn ngữ lập trình ( programming language ) đƣợc sử dụng vào mục đích này. Ngôn ngữ lập trình là tập hợp các qui tắc chặt chẻ về cú pháp (syntax), về ngữ nghĩa (semantic) cho phép tạo ra các văn bản để diễn đạt thuật toán . Một văn bản nhƣ vậy gọi là chƣơng trình ( program ). Chƣơng trình viết bằng ngôn ngữ lập trình cấp cao gọi là chƣơng trình nguồn (Source program ) Chƣơng trình viết bằng ngôn ngữ máy gọi là chƣơng trình đích (Target program ). Máy chỉ có thể thi hành chƣơng trình dƣới dạng ngôn ngữ máy, vì vậy chƣơng trình nguồn muốn đƣợc khai thác phải đƣợc chuyển đổi thành chƣơng trình đích tƣơng đƣơng. Chƣơng trình có nhiệm vụ chuyển đổi chƣơng trình nguồn thành chƣơng trình đích tƣơng đƣơng đƣợc gọi là chƣơng trình dịch. Có 2 loại dịch khác nhau : biên dịch ( Complier ) và thông dịch ( Interpreter). 1.4.2. Mã và dữ liệu Một chƣơng trình bất kỳ bao gồm hai phần : mã và dữ liệu. Khi nạp một chƣơng trình đã đƣợc dịch sang mã máy vào RAM, phần RAM chứa đọan mã máy là các lệnh thể hiện thao tác đƣợc gọi là code segment. Trong code segment chứa phần mã của chƣơng trình. Phần RAM chứa các dữ liệu là đối tựơng của các thao tác đƣợc gọi là data segment. Trong data segment chứa phần dữ liệu của chƣơng trình. Trong các lần chạy khác nhau, chỉ có phần dữ liệu của chƣơng trình là thay đổi, còn phần mã là không đổi. Data Biến toàn cục, Segment dữ liệu chƣơng trình Code Mã chƣơng trình Segment 1.5 Giới thiệu C/C++ Ý tƣởng quan trọng nhất của C xuất phát từ ngôn ngữ BCPL do Martin Richards thiết kế. Anh hƣởng của BCPL lên C gián tiếp thông qua ngôn ngữ B do Ken Thompson viết năm 1970 cho hệ thống UNIX đầu tiên trên máy PDP-7. Từ ngôn ngữ B, Dennish Ritchie và Brian Kernighan phát triển thành ngôn ngữ C vào những năm 1970 tại phòng thí nghiệm của hãng AT & T để phát triển cốt lõi của hệ điều hành UNIX. Trang 9
  11. Trong nhiều năm, chuẩn cho C trên thực tế là một phiên bản đƣợc cung cấp cùng với hệ điều hành Unix version 5. Nó đƣợc mô tả lần đầu tiên trong cuốn : ” The C programming language “ của Dennish Ritchie và Brian Kernighan. Năm 1983 một hội đồng đƣợc thành lập để tạo ra một chuẩn cho C, gọi là chuẩn ANSI (American National Standards Institute : Viện định chuẩn Quốc gia Mỹ). Sau 6 năm, chuẩn cuối cùng ANSI C đƣợc đề nghị vào tháng 12/1989, và bản đầu tiên đƣợc dùng vào năm 1990. Ngày nay các trình biên dịch C chính đều giữ đúng theo ANSI chuẩn. C là một ngôn ngữ có khả năng tổ hợp những thành phần tốt nhất của ngôn ngữ bậc cao và sự điều khiển linh hoạt của ngôn ngữ assembly . Năm 1987 hãng Borland đã đƣa ngôn ngữ C vào thị trƣờng của IBM-PC thông qua Turbo C. Vào những năm 1980, Bjarne Stroustrup đã cho ra đời ngôn ngữ C++ bằng cách cài vào ngôn ngữ C khái niệm lập trình hƣớng đối tƣợng. Năm 1988, hãng Zortech giới thiệu một trình biên dịch C++ cho các máy tính MS-DOS. Cho tới nay đã xuất hiện nhiều phiên bản C++ trong môi trƣờng Microsoft Windows: Borland C++, Turbo C++ của hãng Borland; Visual C++ của Microsoft. Hiện nay có nhiều chƣơng trình lớn đƣợc viết hay đƣợc viết lại bằng C/C++: Hệ điều hành UNIX. Hệ điều hành Windows. Hệ quản trị cơ sở dữ liệu Dbase. Các chƣơng trình soạn thảo văn bản. Các bảng tính điện tử. . . . 1.6 Khởi động và thoát khỏi C++ Sử dụng Turbo C++ 3.0 để thực hiện việc cài đặt. Ta thực hiện việc chuyển thƣ mục đến thƣ mục chứa tập tin cài đặt. Chẳng hạn E:\SOFT\TC30. Và gõ lệnh Install Ví dụ: CD E:\SOFT\TC30 Install Sau khi cài đặt TC xong sẽ nằm trong thƣ mục C:\TC Cửa sổ soạn thảo của TC nhƣ hình sau Trang 10
  12. Hình 1: Cửa sổ soạn thảo của TC *Menu - Thanh đầu tiên là thanh Menu. Để mở thanh menu ta nhấn phím F10 sau đó dùng phím mũi tên qua lại để đƣa đến mục chọn thích hợp nhấn phím Enter; - Dùng phím mũi tên lên xuống để chọn mục chọn thích hợp, xong nhấn Enter. * Cửa sổ soạn thảo Cửa sổ soạn thảo là chứa tiêu đề là tên tập tin nhƣ ở hình vẽ là VIDU.CPP. Chúng ta sẽ soạn thảo chƣơng trình vào trong cửa sổ này và nhớ rằng mỗi một chƣơng trình hay mođun chứa trong một tập tin, nghĩa là tập tin không đƣợc chứa 2 chƣơng trình mà chỉ đƣợc chứa một chƣơng trình. Để phóng to cửa sổ , ta nhấn phím F5. Để chuyển qua lại các cửa sổ, ta gõ F6. Để đóng cửa sổ, ta gõ Alt+F3. * Làm việc với tập tin - Lƣu tập tin đang soạn thảo: Khi lƣu trữ tập tin lần đầu thì hộp thoại nhƣ trên sẽ hiện ra. Gõ vào tên tập tin cần lƣu trữ. Mặc định TC C++ 3.0 sẽ tự động thêm vào phần mở rộng .CPP. Sau khi lƣu trữ tên tập tin sẽ đƣợc đƣa và tiêu đề cửa sổ soạn thảo của chƣơng trình. Hãy chú ý đƣờng dẫn cuối hộp thoại, chúng ta có thể chọn lại đƣờng dẫn bằng cách nhấn phím Tab cho thanh sáng ở trong danh sách, dùng mũi tên lên xuống để di chuyển đến thƣ mục cần chọn. Thƣ mục có tên \ là thƣ mục cha, ta có thể di chuyển ra ngoài thƣ mục cha bằng cách chọn mục này và nhấn phím Enter. Trang 11
  13. Hình 2: Hộp thoại khi lƣu trữ tập tin lần đầu Mở tập tin đã lƣu trữ: Nhấn phím F3 Hình 3: Mở tập tin đã lƣu trữ Nhấn phím Tab để điểm sáng nằm bên danh sách và dùng phím mũi tên để chọn tập tin chƣơng trình cần mở. Nhấn Enter. Trong quá trình mở tập tin, chúng ta chú ý đƣờng dẫn ở dƣới cùng của hộp thoại. - Có thể tạo thƣ mục cần lƣu trữ tập tin vào thƣ mục do chúng ta tạo ra. Bằng những thao tác sau: Trong Turbo C++, chọn Menu File/DOS Shell, màn hình DOS sẽ hiện ra, ta tiến hành tạo thƣ mục. Tạo thƣ mục xong gõ lệnh Exit để vào lại Turbo C++. Vào Menu File/Change Dir để thay đổi mặc định lƣu trữ tập tin và thƣ mục. Và hộp thoại nhƣ sau hiện ra. Nhấn phím Tab để di chuyển điểm sáng sang cây thƣ mục. Chọn thƣ mục cần chuyển, nhấn Enter. Nhấn phím Tab để di chuyển điểm sáng đến nút OK và nhấn phím Enter. Công việc này nên đƣợc làm lần đầu tiên vào trong Turbo C++ để việc lƣu tập tin và mở tập tin cho chính xác. * Các thao tác soạn thảo Copy nội dung: Di chuyển nội dung: * Các tài liệu sẵn có: Trang 12
  14. - Để tra cứu hƣớng dẫn, nhấn F1. - Để tra cứu hƣớng dẫn dành cho từ con trỏ đang đứng, ta gõ Ctrl+F1. * Các thao tác biên dịch và chạy chƣơng trình - Biên dịch chƣơng trình ta nhấn: F9. Để chạy chƣơng trình ta nhấn: Ctrl + F9. - Để xem kết quả chƣơng trình ta nhấn Alt + F5. - Nhấn Alt+X hoặc File/Exit để thoát khỏi chƣơng trình. Những tập tin nào chƣa đƣợc lƣu trong quá trình soạn thảo,chƣơng trình sẽ hỏi có lƣu tập tin đó không? Nếu muốn lƣu trƣớc khi thoát thì chọn Yes, Không thì chọn No. Muốn huỷ việc thoát khỏi TC thì chọn Cancel. Thao tác chọn đƣợc thực hiện bằng phím Tab. Hình 4: Hộp thoại hỏi có lƣu tập tin hay không? Bài tập 1. Sử dụng sơ đồ khối để thiết kế thuật toán cho bài toán giải phƣơng trình bậc 2: ax2 + bx + c = 0. 2. Sử dụng Turbo C++ 3.0 để thực hiện việc cài đặt và cấu hình Trang 13
  15. BÀI 2 CÁC THÀNH PHẦN TRONG NGÔN NGỮ C++ Mục tiêu của bài: - Hiểu và sử dụng đƣợc hệ thống kí hiệu và từ khóa - Hiểu đƣợc các kiểu dữ liệu - Hiểu đƣợc và vận dụng đƣợc các loại biến, hằng biểu thức cho từng chƣơng trình cụ thể. - Biết, hiểu và so sánh đƣợc các lệnh, khối lệnh - Thực hiện đƣợc việc chạy chƣơng trình 2.1 Hệ thống ký hiệu và từ khóa 2.1.1 Ký hiệu cơ sở Ngôn ngữ C++ đƣợc xây dựng từ bộ ký hiệu cơ sở sau: Bộ 26 chữ cái La-Tinh viết thƣờng (nhỏ): a,b, ,z. Bộ 26 chữ cái La-Tinh viết hoa (lớn): A,B, ,Z. Bộ 10 chữ số hệ thập phân : 0,1, ,9. Bộ dấu các toán tử số học : + - * / Bộ dấu các toán tử so sánh: = Ký tự gạch nối: _ ( Khác dấu trừ - ). Các ký hiệu khác: ' " ; ,.: [ ] # $ & { } % ! . . . Đặc biệt có khoảng trắng dùng để ngăn cách các từ (phím Space). Các ký hiệu cơ sở đều có trên bàn phím. 2.1.2 Các từ Từ trong C++ đƣợc xây dựng bởi các ký hiệu cơ sở trên. Có 2 loại từ:Từ khóa và tên. a. Từ khóa (Key Word) Là những từ có ý nghĩa hoàn toàn xác định, chúng thƣờng đƣợc dùng để khai báo các kiểu dữ liệu, để viết các toán tử, và các câu lệnh. Sau đây là các từ khóa trong Borland C++ (Turbo C++): Asm auto break Case catch char class const continue Default delete do double else enum Extern float for friend goto if Inline int long new operator private Protected public register return short signed Sizeof static struct switch template this Throw try typedef union unsigned virtual Void volatile while Trang 14
  16. cdecl _cs _ds _es _export far huge interrupt _loadds Near pascal _regparam _saveregs _seg _ss b. Tên hoặc danh hiệu (identifier): Là từ do ngƣời sử dụng tự đặt để giải quyết bài toán của mình. Từ tự đặt dùng để đặt tên cho hằng, biến, hàm, tên kiểu dữ liệu mới, Tên đƣợc đặt theo quy tắc: phải bắt đầu bằng một chữ cái hoặc dấu gạch nối,sau đó là các chữ cái, chữ số hoặc dấu gạch nối, và không đƣợc trùng với từ khóa. Tên có thể viết bằng chữ thƣờng hoặc chữ hoa. Trong C++ có phân biệt chữ thƣờng và chữ hoa. 2.2 Các Kiểu Dữ Liệu Cơ Bản Trong C++ Trong C++ có 5 kiểu dữ liệu cơ bản là: Các kiểu Ký tự. Các kiểu nguyên. Kiểu Số thực dấu chấm động độ chính xác đơn Kiểu Số thực dấu chấm động độ chính xác kép Kiểu void. Các kiểu dữ liệu khác đều dựa vào các kiểu dữ liệu trên. 2.2.1 Ký tự a. Ký tự 8 bit Một giá trị ký tự có kiểu dữ liệu khai báo bằng từ khóa char, đƣợc lƣu trử trong 8 bit và biểu diễn thông qua bảng mã ASCII . Chẳng hạn : Ký tự Mã ASCII (hệ 10) 0 48 1 49 A 65 a 97 . . . . Có các kiểu ký tự 8 bit tƣơng ứng với các từ khóa : signed char ( nhƣ char, có dấu) unsigned char (Không dấu). Sau đây là bảng kích thƣớc, phạm vi biểu diễn của các kiểu ký tự : KIỂU Phạm vi biểu diễn Kích thƣớc Số ký tự Char -128 127 1 byte 256 Trang 15
  17. signed char -128 127 1 byte 256 unsigned char 0 255 1 byte 256 b. Ký tự UNICODE Các ký tự Unicode trong C/C++ đƣợc định nghĩa bởi : wchar_t Mỗi ký tự Unicode rộng 16 bit. c. Kiểu TCHAR Dùng chung cho char và wchar_t ( cho ký tự 8 bit hay unicode 16 bit). 2.2.2 Kiểu nguyên Trong C++ cho phép sử dụng các kiểu số nguyên đƣợc khai báo bởi từ khóa int, hoặc đi kèm theo int với các từ khóa long, short, unsigned. Số lƣợng bit đƣợc dùng để lƣu trử một giá trị int phụ thuộc vào kích thƣớc từ (word) của máy. Thƣờng thì máy 16-bit sẽ dùng 16 bit để lƣu trử một giá trị int , trong khi đó máy 32-bit sẽ dùng 32 bit . Kích thƣớc và phạm vi biểu diễn của chúng đƣợc cho trong bảng sau : Kiểu Phạm vi biểu diễn Kích thƣớc Int Chiếm 1 từ của máy short int , short -32768 32767 (-215 215 -1) 16 bit unsigned short int 0 65535 (0 216 -1) 16 bit long int , long -2147483648 2147483647 32 bit (-231 231 -1 ) unsigned long int 0 4294967295 ( 0 232 -1) 32 bit unsigned int Số nguyên không âm , chiếm 1 từ của máy. 2.2.3 Kiểu số thực C++ cho phép sử dụng 3 kích thƣớc giá trị thực, tƣơng ứng với 3 từ khóa : float double long double Kích thƣớc và phạm vi biểu diễn của chúng đƣợc cho trong bảng sau : Kiểu Ý nghĩa Phạm vi biểu diễn Kích Độ chính thƣớc xác float Số thực chính -3.4E+38 3.4E+38 32 bit 6 số thập xác đơn phân double Số thực chính -1.7E+308 1.7E+308,0 64 bit 10 số thập xác kép phân long Kích thƣớc 96 bit hoặc 128 bit double Trang 16
  18. 2.3 Biến, hằng, biểu thức 2.3.1. Định nghĩa Hằng là các đại lƣợng mà giá trị của nó không thay đổi trong quá trình tính toán. Ta thƣờng dùng các ký tự hoa để biểu diễn các hằng ký hiệu. 2.3.2 Các loại hằng Trong C++ có các loại hằng sau đây: 1. Hằng số thực Giá trị đƣợc lấy là float và double. Viết theo 2 cách : a. Dạng thập phân (dấu chấm cố định) : Bao gồm : Phần nguyên, dấu chấm thập phân, phẩn phân. Phần nguyên Phần phân b. Dạng khoa học hay dạng mũ ( dấu chấm động ) Có 3 thành phần : Phần định trị , ký hiệu E hoặc e , và phần bậc. Phần định trị là một số nguyên hoặc số thực dạng thập phân. Phần bậc là một số nguyên. Hai phần này cách nhau bởi ký tự E hoặc e. Phần định trị E hoặc e Phần bậc Ví dụ : 12.234E-3 // biểu diễn giá trị 0.012234 0.35E4 // biểu diễn giá trị 3500.0 -12.22e-3 // biểu diễn giá trị -0.01222 1e6 // biểu diễn giá trị 1 000 000 2. Hằng nguyên a. Hằng int Là số nguyên có kiểu int . b. Hằng long Biểu diễn : thêm L hoặc l vào sau hằng int. c. Hằng unsigned Biểu diễn : thêm u vào sau hằng int. Có giá trị từ 0 đến 65535. d. Hằng int hệ 8 Hằng int hệ 8 luôn nhận giá trị dƣơng. Dạng biểu diễn : 0c1c2c3 Với : ci là một số nguyên trong khoảng từ 0 đến 7. Ví dụ : Trang 17
  19. Hằng int hệ 8 : 0345 Giá trị của nó trong hệ 10 : 3*8*8 + 4*8 + 5 = 229. e. Hằng int hệ 16 : Trong hệ này sử dụng 16 ký tự : 0,1,2,3,4,5,6,7,8,9, a hoặc A b hoặc B c hoặc C d hoặc D e hoặc E f hoặc F Dạng biểu diễn : 0x c1c2c3 hoặc 0X c1c2c3 Trong đó ci là một chữ số hệ 16. Ví dụ : Các hằng nguyên hệ 16 : 0xa3 ; 0Xa3 ; 0xA3 ; 0XA3 là nhƣ nhau. Giá trị của nó trong hệ 10 là : 10*16 + 3 = 163. 2.3.3 Hằng ký tự Là một ký tự đƣợc viết trong 2 dấu nháy đơn. Chẳng hạn „a‟ , „A‟, „3‟, „+‟ . . . Trình biên dịch của C++ sẽ lƣu trử các hằng này bằng cách dùng các mã số ASCII (hệ 10) của nó, tƣơng ứng là 97,65, 43, 51 . . . Ký tự có thể biểu diễn bởi hệ 8: Cách viết : „\c1c2c3‟ , trong đó ci là các ký hiệu trong hệ 8. Ký tự có thể biểu diễn bởi hệ 16: Cách viết : „\xc1c2c3‟ hoặc „\Xc1c2c3‟ trong đó ci là các ký hiệu trong hệ 16. Ký tự Hệ 8 Hệ 16 Mã ASCII Mã ASCII Biểu diễn Mã ASCII Biểu diễn hệ 10 ‘a’ 141 ‘\141’ 61 ‘\x61’ 97 ‘A’ 101 ‘\101’ 41 ‘\x41’ 65 Đối với một số hằng ký tự đặc biệt, ta sử dụng cách viết sau (thêm dấu \) : Cách viết Ký tự „\‟ ‟ „ Trang 18
  20. „\” „ “ „\\‟ \ „\n‟ \n (chuyển dòng) „\0‟ \0 (NULL) „\t‟ Tab „\b‟ Backspace „\r‟ CR (Về đầu „\f‟ LFdòng) (sang trang) Ghi chú : Hằng ký tự có thể tham gia vào các biểu thức nhƣ mọi số nguyên khác. Ví dụ : „9‟ -‟0‟ = 57 -48 = 9 Cần phân biệt : „0‟ : là ký số 0 có mã ASCII hệ 10 là 48. „\0‟ : là ký tự NULL có mã ASCII hệ 10 là 0. 2.3.4 Hằng xâu ký tự ( Chuỗi ) Là một dãy ký tự đƣợc bao trong 2 dấu nháy kép. Ví dụ : “Da Lat” “” // Xâu rổng Ghi chú : Xâu ký tự đƣợc lƣu trử trong máy dƣới dạng một mảng các ký tự. Trình biên dịch tự động thêm ký tự NULL „\0‟ ( đƣợc xem là dấu hiệu kết thúc xâu ) vào cuối mỗi xâu. 2.3.5 Biểu thức hằng Biểu thức hằng chỉ bao gồm các hằng. Các biểu thức nhƣ vậy đƣợc xác định vào lúc biên dịch. 2.3.6 Định nghĩa một hằng Dùng chỉ thị #define ( Có thể định nghĩa lại giá trị hằng ) : Cách viết : #define TÊN-HẰNG GIÁ_TRỊ_HẰNG Tác dụng : TÊN-HẰNG sẽ đƣợc thay thế bởi GIÁ_TRỊ_HẰNG cho phần còn lại của văn bản chƣơng trình. Ví dụ : #define MAX 100 // Thay thế MAX bằng 100 Dùng từ khóa const ( Không định nghĩa lại đƣợc giá trị hằng ) o Cú pháp : Const kiểu TÊN-HẰNG = GIÁ_TRỊ_HẰNG; Trang 19
  21. o Tác dụng : Cho phép định nghĩa một hằng ký hiệu có tên là TÊN-HẰNG biểu thị một gia trị là GIÁ_TRỊ_HẰNG và sau này không thể sửa đổi GIÁ_TRỊ_HẰNG của TÊN-HẰNG đƣợc . Ví dụ : Const double PI = 3.1416; 2.3.7 Biến 2.3.7.1 Định nghĩa Biến là một phần bộ nhớ đƣợc đặt tên, đƣợc dùng, để giữ một giá trị mà có thể thay đổi trong chƣơng trình. Vậy biến gắn với tên và kiểu dữ liệu, có giá trị thay đổi trong quá trình tính toán. 2.3.7.2 Khai báo biến Mỗi biến phải đƣợc khai báo trƣớc khi sử dụng. Cú pháp khai báo nhƣ sau: Khai báo một biến: Kdl Bien; Khai báo nhiều biến cùng một kiểu: Kdl Bien1, Bien2, Bien3; Trong đó: - Kdl là kiểu dữ liệu nào đó nhƣ char, int, double, - Bien, Bien1, là tên chỉ tên của biến. Giữa Kdl và Tên biến phải cách nhau ít nhất 1 khoảng trắng. Trong phần tên biến, nếu có nhiều biến thì giữa 2 biến phải tách ra bởi dấu phảy (,). 2.3.7.3 Khởi đầu cho các biến Nếu trong khai báo, ngay sau tên biến ta đặt dấu = (phép gán ) và một giá trị dữ liệu tƣơng ứng thì đó chính là cách vừa khai báo vừa khởi đầu cho 1 biến. 2.3.7.4 Lấy địa chỉ cho biến: Mỗi biến đƣợc cấp phát một vùng nhớ gồm một số byte liên tiếp. Số hiệu của byte đầu chính là địa chỉ của biến. Để nhận địa chỉ biến ta dùng toán tử & với cú pháp: &Bien. 2.4 Các phép toán Trong C++ có các loại toán tử: phép gán, các toán tử số học, các toán tử quan hệ và logic, các toán tử thao tác trên Bit 2.4.1 Các toán tử số học: C++ có 8 toán tử số học: Toán tử Ý nghĩa Ví dụ Ghi chú - Lấy đối -a ; -(a+b) Toán tử 1 ngôi Tự giảm dần x Toán tử 1 ngôi ++ Tự tăng dần ++x Toán tử 1 ngôi Trang 20
  22. + Cộng a + b Toán tử 2 ngôi - Trừ a –b Toán tử 2 ngôi * Nhân a * b Toán tử 2 ngôi / Chia a /b Toán tử 2 ngôi % Chia lấy phần dƣ a%b Toán tử 2 ngôi Thứ tự ƣu tiên các toán tử số học: Ƣu tiên của các toán tử số học đƣợc cho trong bảng sau đây theo thứ tự từ trên xuống dƣới. Các toán tử cùng độ ƣu tiên sẽ đƣợc thực hiện từ trên trái sang phải. Ƣu tiên Toán tử 1 ++ - 2 * / % 3 + - 2.4.2 Toán tử quan hệ và logic Các toán tử quan hệ và logic thƣờng đƣợc sử dụng chung với nhau, đƣợc dùng để tạo ra các kết quả đúng, sai. Trong C++, mọi số khác 0 đều đƣợc coi là giá trị đúng (true), giá trị duy nhất sai (false) mang hình thức số 0. 2.4.2.1 Các toán tử quan hệ Các toán tử quan hệ đƣợc dùng để so sánh 2 giá trị với nhau. Sau đây là bảng các toán tử quan hệ và ý nghĩa của chúng: Toán tử Ý nghĩa Ví dụ > Lớn hơn a > b 3>7 có giá trị 0 >= Lớn hơn hay bằng a >= b 3 >= 7 có gía trị 0 < Nhỏ hơn a < b 3<7 có giá trị 1 <= Nhỏ hơn hay bằng a <= b 3 <= 7 có gía trị 1 == Bằng nhau a == b 3 == 7 có giá trị 0 != Khác nhau a != b 3 != 7 có giá trị 1 2.4.2.2 Các toán tử logic Các toán tử logic đƣợc dùng để nối kết hai giá trị, hoặc trong trƣờng hợp phủ định sẽ tạo một giá trị đảo ngƣợc. Các giá trị có thể nguyên hay thực. Trong C++ có 3 toán tử logic: Phép phủ định 1 ngôi: ! Phép và (AND): && - Phép hoặc (OR): || Ý nghĩa của các toán tử đƣợc cho trong bảng sau: A B !a a&&b a||b Khác không (1) Khác không (1) 0 1 1 Khác không (1) Bằng không 0 0 1 Bằng không Khác không (1) 1 0 1 Trang 21
  23. Bằng không Bằng không 1 0 0 2.4.2.2.3 Thứ tự ƣu tiên của các toán tử quan hệ và logic Ƣu tiên Toán tử 1 ! 2 > >= > Dịch phải (Shift right) a>>4 ~ Lấy phần bù theo bit (Not ) ~a 2.4.4 Các toán tử khác 2.4.4.1 Toán tử sizeof Toán tử sizeof cho ta kích thƣớc ( tính theo byte) của 1 kiểu dữ liệu cũng nhƣ một đối tƣợng dữ liệu. Cách viết toán tử nhƣ sau: sizeof (kiểu dữ liệu) sizeof (đối tƣợng dữ liệu) Kiểu dữ liệu có thể là các kiểu chuẩn nhƣ int, float hoặc kiểu dữ liệu đƣợc định nghĩa bằng từ khóa typedef. Đối tƣợng dữ liệu có thể là biến, mảng, cấu trúc, (tên của vùng nhớ dữ liệu). 2.4.4.2 Toán tử ( ) Dùng để xác định trình tự ƣu tiên các thành phần trong biểu thức. Nếu có nhiều toán tử () lồng nhau thì thực hiện ƣu tiên từ trong ra ngoài. Nếu có nhiều toán tử () rời nhau thì thực hiện từ trái sang phải. 2.4.4.3 Toán tử dấu phảy ‘ , ‘ (Comma operator) Đƣợc dùng để tạo sự thi hành tuần tự cho các thao tác, thƣờng dùng trong câu lệnh for hay biểu thức vế phải của câu lệnh gán. Trong vế phải câu lệnh gán, thì giá trị toàn thể biểu thức là giá trị của biểu thức cuối cùng trong danh sách các biểu thức đƣợc tách biệt bởi dấu phảy. 2.5 Lệnh, khối lệnh Trang 22
  24. Một chƣơng trình C++ có thể gồm nhiều tập tin chƣơng trình nguồn, mỗi tập tin chƣơng trình là một văn bản chứa một dãy các chỉ thị và các chỉ thị điều khiển biên dịch. Các chỉ thị đƣợc phân thành 2 loại: Chỉ thị kiểu: Gồm định nghĩa các kiểu dữ liệu mới, biến, hằng và hàm. Chỉ thị thực hiện (câu lệnh): Đƣợc định nghĩa bằng những phép toán hay việc xử lý thực hiện trên các biến của chƣơng trình. Tất cả các chỉ thị đều phải kết thúc bằng dấu ; ( chấm phảy). Cả 2 loại chỉ thị này có thể hợp với nhau bằng một cú pháp qui định để hình thành một chỉ thị duy nhất đƣợc gọi là khối lệnh. Một khối lệnh đƣợc đặt trong cặp dấu ngoặc nhọn: { các chỉ thị } Sơ đồ tổng quát của chƣơng trình C++ Dạng thức tổng quát: // Các chỉ thị điều khiển biên dịch // Các định nghĩa toàn cục // Khai báo nguyên mẫu các hàm // Hàm main int main() // void main() { // dãy tuần tự các lệnh } //Phần định nghĩa hàm. KDL Ham(Danh_Sach_Cac_Doi) { // dãy tuần tự các lệnh } . . . . . Một số quy tắc cần nhớ khi viết chƣơng trình Quy tắc 1: Mỗi dòng có thể viết 1 hay nhiều chỉ thị. Quy tắc 2: Mỗi chỉ thị phải kết thúc bằng dấu chấm phảy (;). Quy tắc 3: Quy tắc viết lời giải thích. Các lời giải thích viết: - Trên nhiều dòng, một dòng hoặc trên 1 phần của dòng phải đặt vào giữa các dấu /* và */. - Trên một dòng hoặc trên phần còn lại của một dòng phải đặt sau // Các lời giải thích đƣợc trình biên dịch bỏ qua. Quy tắc 4: Quy tắc sử dụng các hàm chuẩn: Trƣớc khi sử dụng một hàm chuẩn nào cần phải biết nó nằm trong tập tin thƣ viện nào của C++ để khai báo, và khai báo bằng chỉ thị biên dịch #include: #include // không có dấu chấm phảy nhƣ câu lệnh Trang 23
  25. Chẳng hạn, khi sử dụng hàm cout, cin. Vì các hàm này nằm trong thƣ viện vào ra chuẩn iostream.h, nên ta cần khai báo: #include 2.6 Câu lệnh gán, lệnh xuất nhập Lệnh gán : Có dạng: b = bt; Trong đó b là biến. bt là một biểu thức ( một công thức toán học nào đó). Trƣớc tiên tính biểu thức bt và sau đó gán giá trị tính đƣợc cho biến b. Lệnh xuất nhập : 1. Nhập dữ liệu từ bàn phím : Lệnh nhập có thể mô tả nhƣ sau: cin >> Bien; //Nhập giá trị 1 biến cin >> Bien1 >> Bien2 >> >> Bienn;//Nhập giá trị n biến. Trong đó: cin là đối tƣợng đƣợc khai báo trong . >> là toán tử nhập. Biến-i là biến mà đối với loại của nó >> đƣợc định nghĩa. 2. Xuất dữ liệu ra màn hình : Lệnh xuất có thể mô tả nhƣ sau: cout . int main() Trang 24
  26. { cout<<"Chuong trinh C++ dau tien trong moi truong Windows!\n"; return 0; } Chƣơng trình sẽ xuất ra màn hình chuỗi sau: Chuong trinh C++ dau tien trong moi truong Windows! Bài tập Bài 1: Viết chƣơng trình khai báo 3 biến : x kiểu số thực, c kiểu ký tự, i kiểu số nguyên.Nhập, xuất giá trị cho các biến đó. Bài 2: Viết chƣơng trình nhập vào 2 biến số nguyên x, y. Tính giá trị của x+y, xuất kết quả ra màn hình Hướng dẫn: - Khai báo 3 biến kiểu số nguyên: x,y và z (z: là biến lƣu kết quả). - Nhập giá trị cho x,y. - Thực hiện phép gán: z = x+y. - Xuất giá z ra màn hình. Bài 3: Viết chƣơng trình tính chu vi, diện tích của hình chữ nhật với chiều dài, rộng nhập từ bàn phím. Bài 4: Khai báo hằng PI có giá trị 3.14 sử dụng hằng PI để tính diện tích hình tròn với bán kính đƣợc nhập từ bàn phím. Bài 5: Khai báo hằng MAX có giá trị 60. Nhập số giây, quy đổi thời gian giây thành giờ, phút, giây. Xuất kết quả ra màn hình dƣới dạng: gio:phut:giay Ví dụ: số giây nhập = 3770 - số giờ =(số_giây_nhập)/3600 = 1 - số phút = (số_giây_nhập%3600)/MAX=2 - số giây =( số_giây_nhập %3600)%MAX=50 Xuất ra màn hình dưới dạng: 1:2:50 Hƣớng dẫn: - Khai báo 4 biến kiểu số nguyên. - Nhập vào số giây. Trang 25
  27. - Thực hiện phép toán quy đổi. - Xuất kết quả ra màn hình. Bài 6: Khai báo biến x, y kiểu số nguyên. Khởi gán x =20, y=6. Thực hiện các câu lệnh sau và xuất kết quả của x, y trƣớc và sau khi thực hiện từng câu lệnh này. x++ x ++x x x=x/y y= x%y x=x*y Bài tập 7: Viết chƣơng trình nhập vào một số nguyên và xuất ra màn hình (Chú ý: bạn hãy nhập số lớn và giải thích kết quả). Bài 8: Viết chƣơng trình tính và xuất ra diện tích tam giác: (Sử dụng hàm tính căn bậc 2: sqrt trong thƣ viện math.h) Bài 9: Viết chƣơng trình tính x2 + y5 , với x và y là 2 số thực đƣợc nhập từ bàn phím. (Sử dụng hàm tính tính mũ: pow trong thƣ viện math.h) Bài 10: Viết chƣơng trình tính xn , với x là số thực và n là số nguyên đƣợc nhập từ bàn phím. (Sử dụng hàm tính tính mũ: pow trong thƣ viện math.h) BÀI 3 CÁC LỆNH CẤU TRÚC Mục tiêu của bài: - Trình bày ý nghĩa của lệnh và khối lệnh ; - Trình bày cú pháp, công dụng của lệnh if, lệnh switch ; - Giải một số bài toán sử dụng lệnh if, lệnh switch ; - Sử dụng đƣợc các cấu trúc lồng nhau. - Thực hiện các thao tác an toàn với máy tính. Trang 26
  28. 3.1 Câu lệnh if 3.1.1 Cú pháp Dạng 1: if (Bt) Nếu biểu thức Bt đúng Kl thực hiện Kl Dạng 2: if (Bt) Nếu biểu thức Bt đúng Kl1 thực hiện Kl1 else Ngƣợc lại Kl2 thực hiện Kl2 Bt: là biểu thức có giá trị Đ ( khác 0), hay sai (bằng 0). Kl: Khối lệnh. 3.1.2 Hoạt động Trƣớc tiên biểu thức Bt đƣợc xác định giá trị. Dạng 1: Nếu Bt đúng (có giá trị khác 0) thì thực hiện Kl. Nếu sai (giá trị bằng 0) thì khối lệnh đƣợc bỏ qua. Dạng 2: Nếu Bt đúng (có giá trị khác 0) thì thực hiện Kl1. Nếu sai (giá trị bằng 0) thì thực hiện Kl2. 3.1.3 Lƣu đồ: 1 1 0 BT BT Kl1 Kl2 Kl 0 Ghi chú: Nếu có nhiều cấu trúc if - else lồng nhau, để xác định một "else" là của "if" nào ta theo qui tắc: "else" là của một "if" gần với nó nhất mà không có "else". Trang 27
  29. Tức là: Tƣơng đƣơng với: if (Bt1) if (Bt1) if (Bt2) { if (Bt2) Kl2 Kl2 else else Kl3 Kl3 else } Kl1 else Kl1 3.2 Câu lệnh switch Câu lệnh cho phép chọn một trong nhiều nhánh rẽ. 3.2.1 Cú pháp switch (Bt) { case H1: NL1 [ break;] case H2: NL2 [ break;] case Hn: NLn [ break;] [default: NLn+1] } Trong đó Bt là nguyên, các Hk có thể là hằng nguyên, hằng ký tự, hoặc biểu thức hằng. 3.2.2 Hoạt động của câu lệnh switch Trƣớc tiên biểu thức nguyên đƣợc tính trị. Nếu trị biểu thức bằng Hk thì máy sẽ thực hiện NLk. Sau đó: - Nếu không có câu lệnh break thì thực hiện tiếp NL k+1 của nhãn case Hk+1 cho tới khi gặp lệnh break hoặc gặp dấu } cuối cùng thì ra khỏi switch. - Nếu có câu lệnh break thì ra khỏi switch. Khi giá trị biểu thức khác tất cả các Hk thì: - Khi có default thì máy nhảy tới thực hiện NLn+1 trong default. - Khi không có default thì ra khỏi câu lệnh switch. 3.2.3 Lƣu đồ: (Có thành phần default) a) Không có câu lệnh break cuối mỗi nhóm lệnh Trang 28
  30. Bt NL1 Bt == Bt == H2 Hn NL2 Bt == H1 b) Có câu lệnh break cuối mỗi nhóm lệnh: Trang 29
  31. NLn 1 1 0 0 1 0 NLn+1 Trang 30
  32. Bài 4: CẤU TRÚC VÒNG LẶP Mục tiêu: - Trình bày ý nghĩa của vòng lặp ; - Trình bày cú pháp, công dụng của lệnh for, while, do while; - Trình bày ý nghĩa và cách sử dụng lệnh break, continue; - Giải một số bài toán sử dụng lệnh for, while, do while ; - Sử dụng đƣợc các vòng lặp lồng nhau. - Thực hiện các thao tác an toàn với máy tính. 1 Câu lệnh for 1.1 Cú pháp Câu lệnh for cho ta một cách xây dựng vòng lặp, có dạng sau: for(bt1 ; bt2 ; bt3) Khối lệnh // Câu lệnh Trong đó: Mỗi thành phần bt là một biểu thức hay là một dãy các biểu thức đƣợc phân tách bởi dấu phảy. Bất kỳ một thành phần nào trong 3 thành phần bt cũng có thể vắng mặt, nhƣng các dấu chấm phảy (;) luôn luôn có. Chức năng của các thành phần bt thƣờng là: bt1 là một phép gán để tạo ra giá trị ban đầu cho biến điều khiển. bt2 là một một quan hệ logic biểu thị điều kiện để tiếp tục vòng lặp. bt3 là một phép gán dùng để thay đổi giá trị của biến điều khiển. 1.2 Hoạt động của câu lệnh for Hoạt động theo các bƣớc: 1. Xác định biểu thức 1. bt1 2. Xác định biểu thức 2. 3. Căn cứ vào giá trị đúng ( khác 0), sai ( bằng 0), sẽ lựa chọn một trong 2 0 bt2 nhánh: - Nếu biểu thức 2 sai , sẽ ra khỏi câu 1 KL lệnh for và chuyển đến câu lệnh sau thân for. bt3 - Nếu biểu thức 2 đúng, sẽ thực hiện các câu lệnh trong thân for.Khi gặp dấu ngoặc nhọn đóng } cuối cùngcủa thân for,hoặc gặp câu lệnh continue máy sẽ chuyển sang bƣớc 4 (khởi đầu lại ). 4. Tính biểu thức 3, sau đó quay trở lại Trang 31
  33. bƣớc 2 để bắt đầu một vòng mới của vòng lặp. 2. Câu lệnh while ( Lặp với điều kiện đƣợc kiểm tra trƣớc ) 2.1 Cú pháp while (Bt) Kl // Thân vòng lặp Trong đó: Bt có thể là 1 biểu thức hay là một dãy các biểu thức đƣợc phân tách nhau bởi dấu phảy. Giá trị của Bt là Đúng (khác 0) hoặc sai ( bằng 0). 2.2 Lƣu đồ Ngữ nghĩa: Trong khi Bt còn đúng Thực hiện Kl 1 Bt 0 Kl 2.3 Hoạt động của câu lệnh while Theo trình tự: 1. Xác định giá trị của bt. 2. Tùy thuộc vào tính đúng sai của bt, máy sẽ lựa chọn 1 trong 2 nhánh: a. Nếu bt có giá trị 0 ( sai ) máy sẽ ra khỏi vòng lặp và chuyển tới câu lệnh sau thân while. b. Nếu bt có giá trị khác 0 ( đúng ) máy sẽ thực hiện các câu lệnh trong thân while. Khi gặp dấu ngoặc nhọn } đóng cuối cùng của thân while máy sẽ trở lại bƣớc 1; hoặc gặp câu lệnh continue máy sẽ chuyển đến đầu một vòng lặp mới của vòng lặp, tức là máy sẽ bỏ qua các câu lệnh còn lại trong thân vòng lặp để trở về bƣớc tính và kiểm tra bt. 3. Câu lệnh do while ( Lặp với điều kiện đƣợc kiểm tra sau ) 3.1 Cú pháp do Kl // thân vòng lặp while(bt); Trong đó: Trang 32
  34. Bt có thể là 1 biểu thức hay là một dãy các biểu thức đƣợc phân tách bởi dấu phảy. Giá trị của Bt là Đúng (khác 0) hoặc sai ( bằng 0). 3.2 Lƣu đồ Ngữ nghĩa: Kl Thực hiện 1 0 Kl trong khi Bt còn đúng Bt 3.3 Hoạt động của câu lệnh do Theo trình tự: 1. Thực hiện khối lệnh trong thân do. 2. Khi gặp dấu ngoặc nhọn } đóng cuối cùng của thân do máy sẽ tính và xác định giá trị của Bt sau từ khóa while. 3. Tùy thuộc vào tính đúng sai của bt, máy sẽ lựa chọn 1 trong 2 nhánh: a. Nếu Bt có giá trị bằng 0 ( sai ) máy sẽ ra khỏi vòng lặp và chuyển tới câu lệnh sau thân do. b. Nếu Bt có giá trị khác 0 ( đúng ) máy sẽ trở về bƣớc 1 để tiếp tục thực hiện vòng mới của vòng lặp. 4. Câu lệnh goto và nhãn 4.1 Nhãn Nhãn là một tên và có dấu hai chấm (:) đứng sau. Nhãn có thể đƣợc gán cho bất kỳ câu lệnh nào trong chƣơng trình. Chẳng hạn: tiep_tuc: s + = x; nghĩa là: tiep_tuc là nhãn câu lệnh gán s += x. 4.2 Câu lệnh goto 1. Cú pháp: goto nhãn; 2. Tác dụng: chƣơng trình sẽ nhảy tới thực hiện câu lệnh có nhãn viết sau từ khóa goto; Ghi chú: 1. Câu lệnh goto và nhãn chỉ nằm trong 1 hàm. goto chỉ cho phép nhảy từ vị trí này đến vị trí khác trong thân 1 hàm. Nó không thể nhảy từ hàm này sang hàm khác. 2. Không cho phép dùng câu lệnh goto nhảy từ ngòai khối lệnh vào trong khối lệnh. Nhƣng ngƣợc lại, tức là nhảy từ trong ra ngoài khối lệnh là hợp lệ. 3. Câu lệnh goto thƣờng đƣợc dùng để thóat khỏi các câu lệnh switch, và các vòng lặp hoặc kết hợp với if tạo ra vòng lặp. Trang 33
  35. Ví dụ: nhan: clrscr(); . . . goto nhan; 5. Các câu lệnh break, continue 5.1 break Break cho phép ra khỏi switch , và các vòng lặp for, while, do mà không cần kiểm tra điều kiện kết thúc của vòng lặp. Lệnh break cho phép thoát ra ngay khỏi vòng lặp bên trong nhất chứa lệnh break; Mọi câu lệnh break có thể thay bằng câu lệnh goto và nhãn thích hợp. 5.2 continue Lệnh continue tạo ra việc bắt đầu lặp lại của vòng lặp chứa nó. Trong while và do, lệnh continue chuyển điều khiển về thực hiện ngay phần kiểm tra. Đối với for, điều khiển đƣợc chuyển về bƣớc khởi đầu lại. Continue chỉ áp dụng cho vòng lặp, không cho switch. 6. Câu lệnh rổng Lệnh rổng là lệnh chỉ có dấu chấm phảy (;) (Lệnh này thƣờng đƣợc sử dụng trong thân các vòng lặp mà ở đó không muốn có 1 lệnh nào.) 7. Vòng lặp vô hạn Thƣờng có các dạng sau: a) Dạng for: for (; ;) khối lệnh Mệnh đề trong phần thân vòng lặp thƣờng là mệnh đề kép chứa: Những mệnh đề mà nó thực hiện lặp lại để giải quyết bài toán. Một mệnh đề mà nó sẽ kết thúc sự thực hiện vòng lặp khi một điều kiện nào đó đƣợc thỏa. Mệnh đề này thƣờng là if kết hợp với break. b) Dạng while: while(1) khối lệnh c) Dạng do while: do khối lệnh while(1); Trang 34
  36. Khi sử dụng vòng lặp ta cần lƣu ý đến điều kiện lặp có thể dừng vòng lặp đƣợc không. Các vòng lặp dạng trên muốn dừng, cần phải có sự can thiệp của các câu lệnh break, goto, return Bài tập Bài 1: Tính tổng n số nguyên dƣơng đầu tiên S=1+2+3 n Bài 2: viết chƣơng trình tính n . n =1*2*3* *n. Bài 3: Tính tổng n số nguyên dƣơng lẽ: S=1+3+5 +n. n lẽ. Bài 4: Tính tổng n số nguyên dƣơng chẳn: S=2+4+6 +n. n chẳn. Bài 5: Sử dụng cấu trúc while và do while để viết chƣơng trình tính: Tính tổng n số nguyên dƣơng đầu tiên S=1+2+3 n Tính tổng n! với n là số nguyên n!=1*2*3* *n. Trang 35
  37. BÀI 5: MẢNG VÀ CHUỖI Mục tiêu: - Trình bày đƣợc ý nghĩa, cách khai báo mảng, chuỗi; - Nhập xuất mảng, chuỗi; - Khởi tạo mảng chuỗi; - Trình bày một số kỹ thuật thao tác trên mảng, chuỗi; - Vận dụng đƣợc mảng làm tham số cho hàm; - Giải một số bài toán sử dụng kiểu mảng, chuỗi. - Thực hiện các thao tác an toàn với máy tính. 5.1 Mảng 5.1.1 Khái niệm Mảng là một tập các biến cùng kiểu đƣợc gọi chung bằng một tên. Các phần tử của mảng đƣợc đƣợc truy cập đến bởi chỉ số (index) của mảng. Mảng có thể có 1 chiều hay nhiều chiều. Dữ liệu của mảng đƣợc chứa trong một vùng nhớ liên tục. 5.1.2 Mảng 1 chiều I) Khai báo: KDL Ten_Mang[KT]; Trong đó: KDL là kiểu dữ liệu của mảng, có thể là char, int, float, Ten_Mang là một tên, chỉ tên của mảng. KT: Là một số nguyên dƣơng chỉ kích thƣớc khai báo của mảng: xác định số các phần tử của mảng. II) Chỉ số của mảng: Mỗi phần tử của mảng đƣợc xác định bởi chỉ số của mảng. Chỉ số của mảng phải có giá trị int không vƣợt quá kích thƣớc của mảng. Chỉ số đầu tiên của mảng luôn là 0. Ký pháp a[i] để chỉ phần tử thứ i của mảng a. Các phần tử của a đƣợc đánh số (mặc định) bởi: a[0], a[1], III) Lấy địa chỉ của mảng: Các phần tử của mảng 1 chiều có địa chỉ liên tiếp nhau trong bộ nhớ. Lấy địa chỉ của phần tử mảng 1 chiều bằng phép toán &, với cú pháp: &a[i] // a[i] là phần tử thứ i của mảng a Ghi chú: Địa chỉ đầu của mảng là tên mảng, vậy ta có: a == &a[0] IV) Kích thƣớc bộ nhớ (số bytes) đƣợc sử dụng để lƣu trử mảng 1 chiều là: Trang 36
  38. Tong (Bytes) = sizeof(KDL)* KT V) Một số thao tác thƣờng gặp trên mảng một chiều: 1. Nhập và xuất dữ liệu cho mảng 1 chiều: Thƣờng liên kết với vòng lặp for. 2. Sắp xếp một mảng theo thứ tự tăng hay giảm. 3. Gán mảng: Hai mảng a, b cùng kiểu, cũng không thể thực hiện trực tiếp việc gán a cho b bằng câu lệnh gán: b = a; Ta chỉ thực hiện đƣợc việc gán a cho b bằng cách gán giá trị từng phần tử của a tƣơng ứng cho từng phần tử của b. VI) Hàm và mảng 1 chiều Hàm không thể trả về một trị là mảng 1 chiều. Đối của hàm là tên của mảng 1 chiều: Khi đó tham số thực truyền cho đối tƣơng ứng cũng là tên của mảng 1 chiều, cùng kiểu và cùng kích thƣớc với đối. Tên của tham số thực và tên của đối có thể trùng nhau hoặc khác nhau. Đối Tham số thực Tên mảng 1 chiều Tên mảng 1 chiều ( cùng kiểu, kích thƣớc với đối) 5.1.3 Mảng 2 chiều Trong các mảng nhiều chiều, hình thức đơn giản nhất là mảng 2 chiều. I) Cách tiếp cận và khai báo: Mảng 2 chiều là mảng 1 chiều của mảng 1 chiều. Có thể khai báo nhƣ sau: KDL Ten_Mang[KT1][ KT2]; II) Công thức tính số bytes cần thiết trong bộ nhớ lƣu trƣ mảng 2 chiều: Tong (Bytes) = sizeof(KDL)* KT1* KT2. III) Nhập, xuất mảng 2 chiều (ma trận): Thƣờng liên kết với 2 vòng for duyệt theo chỉ số để nhập dữ liệu cho từng phần tử, hoặc xuất dữ liệu của từng phần tử ra màn hình. IV) Hàm và mảng 2 chiều: Hàm không thể trả về giá trị là một mảng 2 chiều. Đối của hàm là tên của mảng 2 chiều: Khi đó tham số thực truyền cho đối tƣơng ứng cũng là tên của mảng 2 chiều, cùng kiểu và cùng kích thƣớc với đối. Tên của tham số thực và tên của đối có thể trùng nhau hoặc khác nhau. Đối Tham số thực Tên mảng 2 chiều Tên mảng 2 chiều ( cùng kiểu, kích thƣớc với đối) Trang 37
  39. 5.1.4 Kiểu mảng Dùng từ khoá typedef để định nghĩa, bằng cách trƣớc định nghĩa mảng thông thƣờng, ta đặt từ khoá typedef. Ví dụ: a) typedef float Day10[10];// Day10 là kiểu dữ liệu mảng 1 chiều kích thƣớc 10 Day10 a,b; // a,b là 2 biến kiểu mảng 1 chiều có kích thƣớc 10. b) typedef float Mat10_20 [10][20]; // Mat10_20 là kiểu dữ liệu mảng 2 chiều kích thƣớc 10x20 Mat10_20 c,d; // c,d là 2 biến kiểu mảng 2 chiều có kích thƣớc 10x20 5.1.5 Khởi đầu cho các mảng 1. Sử dụng các hằng 2. Khi khởi đầu có thể không cần chỉ ra kích thƣớc của mảng. Khi đó máy sẽ dành cho mảng 1 vùng nhớ đủ để thu nhận danh sách giá trị khởi đầu. Trong trƣờng hợp là mảng 2 chiều thì kích thƣớc chiều 2 phải chỉ ra: 3. Đối với mảng 2 chiều có thể khởi đầu theo cách số giá trị của mỗi hàng có thể khác nhau với điều kiện là: Kích thƣớc chiều 2 phải đƣợc chỉ ra. Kích thƣớc chiều 1 hoặc là không đƣợc chỉ ra, hoặc có chỉ ra thì giá trị phải lớn hơn kích thƣớc thực sự của mảng Ví dụ: int a[6][3] = { {1,2}, {3}, {4,5,6}, {0,3,1} }; // Thực sự đây là mảng a[3][3] 5.1.6 Các kỹ thuật xử lý cơ bản trên mảng 1. Kỹ thuật thử và sai Cần xác định Kq khi biết Kq {a1, ,an }: Giả sử Kq = a1; Duyệt các phần tử còn lại để chính xác giá trị Kq. 2. Kỹ thuật duyệt Toàn cục: duyệt tất cả các phần tử của tập hợp. Cục bộ: Chỉ trên một miền con của tập hợp có thể xét. Miền con này xác định từ các giá trị của hàm, hay là lập bảng. Trang 38
  40. 3. Kỹ thuật kiểm tra tính đúng, sai: Dạng 1: Đúng: nếu i, ai phải thỏa mãn. Sai: nếu i, ai không thỏa mãn. Cách thực hiện nhƣ sau: Kq = 1; // Đúng Duyệt để tìm điều kiện gán Kq = 0; // Sai Dạng 2: Đúng: nếu i, ai thỏa mãn. Sai: nếu i, ai không thỏa mãn. Cách thực hiện nhƣ sau: Kq = 0; //Sai Duyệt để tìm điều kiện gán Kq = 1; // Đúng 5.2 Chuỗi 5.2.1 Định nghĩa Chuỗi (xâu ký tự) là mảng một chiều các ký tự đƣợc kết thúc bởi ký tự NULL (\0). Số lƣợng các ký tự khác NULL trong xâu gọi là chiều dài của xâu. 5.2.2 Khai báo char a[KT]; a là tên, chỉ tên của xâu ký tự. KT là số nguyên dƣơng, chỉ kích thƣớc của xâu ký tự. a[i] là ký tự thứ i của a. Chỉ số đầu tiên luôn là 0. Trong khi khai báo, ta phải khai báo xâu ký tự có chiều dài lớn hơn mảng đƣợc sử dụng 1 ký tự để đủ chỗ chứa ký tự NULL. 5.2.3 Kiểu xâu ký tự Cách tạo là đặt từ khoá typedef trƣớc khai báo xâu thông thƣờng. 5.2.4 Các thao tác nhập xuất xâu ký tự 1. Xuất: cout > a ; Trang 39
  41. Với a là một xâu ký tự không chứa ký tự tách ( khoảng trắng, tab ), vì iostream xem các ký tự đó là ký tự tách chứ không phải dữ liệu. Để nhập một xâu ký tự có chứa ký tự tách thì có thể dùng các cách sau: a) Dùng hàm gets trong tệp tiêu đề hoặc trong : gets(a); b) Dùng hàm thành phần của iostream: cin.getline(a, so_ky_tu); Hàm này đọc vào tối đa so_ky_tu – 1 ký tự, kể cả ký tự trắng. Các xử lý thƣờng gặp trên xâu ký tự nhƣ xác định chiều dài xâu, chép xâu s vào xâu t, nối 2 xâu, 5.2.5 Khởi đầu cho xâu ký tự Cũng theo quy tắc chung của mảng (1 chiều) đã giới thiệu ở trên.Bộ khởi đầu của mảng 1 chiều ký tự có thể là: Danh sách các hằng ký tự, cuối cùng là ký tự „\0‟. Hoặc là một hằng xâu ký tự. 5.2.6 Hàm và xâu ký tự Hàm không thể trả về một giá trị là xâu ký tự. Đối của hàm có thể là tên xâu ký tự, khi đó tham số thực phải là tên xâu ký tự Đối Tham số thực Xâu ký tự Tên xâu ký tự 5.2.7 Mảng các xâu ký tự Cách tiếp cận nhƣ là mảng 2 chiều các ký tự. Khai báo: char a[KT1][KT2]; Nhập hoặc xuất mảng các xâu ký tự là nhập hoặc xuất từng xâu ký tự của mảng. Khởi đầu: Khởi đầu từng xâu ký tự bằng các hằng xâu ký tự. Trang 40