Đăng ký Đăng nhập
Trang chủ Công nghệ thông tin Kỹ thuật lập trình Giáo trình c va c++ (version 1)...

Tài liệu Giáo trình c va c++ (version 1)

.PDF
78
289
102

Mô tả:

BÀI 1: THUẬT TOÁN 1. VÍ DỤ Giải phương trình bậc nhất ax + b = 0 Giải: B1: Cho biết 2 số a, b. B2: Nếu a = 0, chuyển qua B3, ngược lại qua B4 B3: Nếu b = 0, phương trình có vô số nghiệm; Ngược lại phương trình vô nghiệm. Qua B5. B4: Phương trình có nghiệm x = -a/b. B5: Kết thúc. 2. KHÁI NIỆM Thuật toán là một tập hợp các thao tác, các bước nhằm giải quyết một công việc nào đó. Hay nói một cách khác, thuật toán là những hướng dẫn cụ thể để giải quyết một bài toán. Việc nghiên cứu thuật toán rất quan trọng trong khoa học máy tính vì máy tính không thể giải quyết được bài toán nếu không có những hướng dẫn giải rõ ràng. Từ thuật toán (Algorithm) xuất phát từ tên một nhà toán học người Trung Á là Abu Abd - Allah ibn Musa al’Khwarizmi, thường gọi là al’Khwarizmi. Ông là tác giả một cuốn sách về số học, trong đó ông đã dùng phương pháp mô tả rất rõ ràng, mạch lạc cách giải những bài toán. Sau này, phương pháp mô tả cách giải toán của ông đã được xem là một chuẩn mực và được nhiều nhà toán học khác tuân theo. Từ algorithm ra đời dựa theo cách phiên âm tên của ông. 3. CÁC ĐẶC TRƯNG a) Ðầu vào và đầu ra (input/output): Mọi thuật toán, dù có đơn giản đến mấy cũng phải nhận dữ liệu đầu vào, xử lý nó và cho ra kết quả cuối cùng. b) Tính xác định: Các thao tác trong thuật toán phải xác định, không được mập mờ và kết quả phải chính xác. Hai thuật toán cùng giải quyết một bài toán thì cho cùng kết quả như nhau. c) Tính dừng: Thuật toán phải được thực hiện sau một thời gian hữu hạn thì phải dừng. Nghĩa là không thể lặp vô tận. d) Tính hữu hạn: Thuật toán phải có một số bước hữu hạn. e) Tính hiệu quả: Thuật toán phải hiệu quả về mặt thời gian và bộ nhớ tiêu tốn. f) Tính tổng quát: Thuật toán phải mang tính tổng quát. Nghĩa là thuật toán phải áp dụng được cho lớp bài toán cần giải quyết trong trường hợp tổng quát. 4. PHƯƠNG PHÁP BIỂU DIỄN Khi chứng minh hoặc giải một bài toán trong toán học, ta thường dùng những ngôn từ toán học như : "ta có", "điều phải chứng minh", "giả thuyết", ... và sử dụng những phép suy luận toán học như phép suy ra, tương đương, ...Thuật toán là một phương pháp thể hiện lời giải bài toán nên cũng phải tuân theo một số quy tắc nhất định. Ðể có thể truyền đạt thuật toán cho người khác hay chuyển thuật toán thành chương trình máy tính, ta phải có phương pháp biểu diễn thuật toán. Có 3 phương pháp biểu diễn thuật toán : a) Ngôn ngữ tự nhiên Trong cách biểu diễn thuật toán theo ngôn ngữ tự nhiên, người ta sử dụng ngôn ngữ thường ngày để liệt kê các bước của thuật toán. b) Lưu đồ - sơ đồ khối Lưu đồ hay sơ đồ khối là một công cụ trực quan để diễn đạt các thuật toán. Biểu diễn thuật toán bằng lưu đồ sẽ giúp người đọc theo dõi được sự phân cấp các trường hợp và quá trình xử lý của thuật toán. Để biểu diễn theo kiểu này người ta dùng các khối biểu thị thao tác. Thao tác chọn lựa (decision) Thao tác chọn lựa được biểu diễn bằng một hình thoi, bên trong chứa biểu thức điều kiện. Thao tác xử lý (process) Thao tác xử lý được biểu diễn bằng một hình chữ nhật, bên trong chứa nội dung xử lý. Ðường đi (route) Khi dùng ngôn ngữ tự nhiên, ta mặc định hiểu rằng quá trình thực hiện sẽ lần lượt đi từ bước trước đến bước sau (trừ khi có yêu cầu nhảy sang bước khác). Trong ngôn ngữ lưu đồ, do thể hiện các bước bằng hình vẽ và có thể đặt các hình vẽ này ở vị trí bất kỳ nên ta phải có phương pháp để thể hiện trình tự thực hiện các thao tác. Hai bước kế tiếp nhau được nối bằng một cung, trên cung có mũi tên để chỉ hướng thực hiện. Chẳng hạn trong hình dưới, trình tự thực hiện sẽ là B1, B2, B3. Từ thao tác chọn lựa có thể có đến hai hướng đi, một hướng ứng với điều kiện thỏa và một hướng ứng với điều kiện không thỏa. Do vậy, ta dùng hai cung xuất phát từ các đỉnh hình thoi, trên mỗi cung có ký hiệu Ð/Ðúng/Y/Yes để chỉ hướng đi ứng với điều kiện thỏa và ký hiệu S/Sai/N/No để chỉ hướng đi ứng với điều kiện không thỏa. Ðiểm cuối (terminator) Ðiểm cuối là điểm khởi đầu và kết thúc của thuật toán, được biểu diễn bằng hình ovan, bên trong có ghi chữ bắt đầu/start/begin hoặc kết thúc/end. Ðiểm cuối chỉ có cung đi ra (điểm khởi đầu) hoặc cung đi vào (điểm kết thúc). Ðiểm nối (connector) Ðiểm nối được dùng để nối các phần khác nhau của một lưu đồ lại với nhau. Bên trong điểm nối, ta đặt một ký hiệu để biết sự liên hệ giữa các điểm nối. Ðiểm nối sang trang (off-page connector) Tương tự như điểm nối, nhưng điểm nối sang trang được dùng khi lưu đồ quá lớn, phải vẽ trên nhiều trang. Bên trong điểm nối sang trang ta cũng đặt một ký hiệu để biết được sự liên hệ giữa điểm nối của các trang. Ở trên chỉ là các ký hiệu cơ bản và thường được dùng nhất. Trong thực tế, lưu đồ còn có nhiều ký hiệu khác nhưng thường chỉ dùng trong những lưu đồ lớn và phức tạp. Ðối với các thuật toán trong cuốn sách này, ta chỉ cần sử dụng các ký hiệu trên là đủ. c) Giả mã Tuy sơ đồ khối thể hiện rõ quá trình xử lý và sự phân cấp các trường hợp của thuật toán nhưng lại cồng kềnh. Ðể mô tả một thuật toán nhỏ ta phải dùng một không gian rất lớn. Hơn nữa, lưu đồ chỉ phân biệt hai thao tác là rẽ nhánh (chọn lựa có điều kiện) và xử lý mà trong thực tế, các thuật toán còn có thêm các thao tác lặp (Chúng ta sẽ tìm hiểu về thao tác lặp trong các bài sau). Khi thể hiện thuật toán bằng giả mã, ta sẽ vay mượn các cú pháp của một ngôn ngữ lập trình nào đó để thể hiện thuật toán. Tất nhiên, mọi ngôn ngữ lập trình đều có những thao tác cơ bản là xử lý, rẽ nhánh và lặp. Dùng mã giả vừa tận dụng được các khái niệm trong ngôn ngữ lập trình, vừa giúp người cài đặt dễ dàng nắm bắt nội dung thuật toán. Tất nhiên là trong giả mã ta vẫn dùng một phần ngôn ngữ tự nhiên. Một khi đã vay mượn cú pháp và khái niệm của ngôn ngữ lập trình thì chắc chắn mã giả sẽ bị phụ thuộc vào ngôn ngữ lập trình đó. Một đoạn mã giả của thuật toán giải phương trình bậc hai if (Delta > 0) { x1=(-b-sqrt(delta))/(2*a) ; x2=(-b+sqrt(delta))/(2*a); xuất kết quả : phương trình có hai nghiệm là x1 và x2; { else if delta = 0 xuất kết quả : phương trình có nghiệm kép là -b/(2*a) else // trường hợp delta < 0 xuất kết quả : phương trình vô nghiệm BÀI TẬP Hãy trình bày thuật toán giải phương trình ax2 + bx + c = 0 bằng thuật ngữ tự nhiên và sơ đồ khối. BÀI 2: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C++ 1. LỊCH SỬ HÌNH THÀNH Năm 1969, UNIX được phát triển và được cài đặt vào máy DEC PDP-7 đã tỏ ra những ưu điểm như: Thân thiện người dùng, cung cấp những công cụ giúp đỡ đặc biệt và hữu hiệu đặc biệt là môi trường “mở” để người sử dụng có thể cài đặt và lập trình trên nó một cách dễ dàng. Sau khi UNIX được phát triển, Ken Thompson đưa ra bộ dịch ngôn ngữ lập trình B,ngôn ngữ chịu sự ảnh hưởng sâu sắc theo hướng lập trình thiết kế hệ thống. Khi máy DEC PDP-11 ra đời, việc sử dụng UNIX trên máy này có nhiều trục trặc, do đó nhu cầu thiết kế lại UNIX được đặt ra và ngôn ngữ B được chọn để làm công cụ thiết kế lại UNIX. Tuy nhiên B không phù hợp với DEC PDP-11, do đó nhu cầu cải tiến lại ngôn ngữ B vào năm 1971và ngôn ngữ C ra đời tứ đó để rồi sau đó C được sử dụng để viết lại hệ điều hành UNIX. Năm 1983, C đã được tiêu chuẩn hoá nhờ tổ chức ANSI. Vào những năm cuối thập niên 80 đầu thập niên 90, khi xu hướng lập trình hướng đối tượng phát triển thì C được phát triển thành C++ (đọc là C plus plus). 2. ĐẶC ĐIỂM C++ là một ngôn ngữ không “nhạy kiểu”, rất thoáng trong việc chuyển đổi dữ liệu. Cung cấp nhiều kiểu dữ liệu dựng sẵn, đồng thời cho phép người lập trình có thể thiết kế lại các kiểu dữ liệu phù hợp với yêu cầu của mình. C++ cung cấp các phép toán đặc biệt giúp lập trình viên thực hiện thao tác lệnh hiệu quả nhất. Sự hiệu quả đó được mang lại do C++ có nhiều toán tử giống với ngôn ngữ máy. Đồng thời cung cấp cho người lập trình các phép toán có thể xử lý đến từng bit, byte, đến cả địa chỉ trong bộ nhớ. C++ có lệnh điều khiển và vòng lặp vô cùng thoáng và khá logic, phù hợp với phương pháp lập trình cấu trúc và hướng đối tượng. C++ cung cấp khả năng lập trình trên tất cả các phương pháp lập trình như: Lập trình không cấu trúc, lập trình thủ tục, lập trình môđun, lập trình hướng đối tượng. Các phương pháp lập trình Phương pháp lập trình không cấu trúc: Chương trình chỉ gồm có một chương trình chính và các lệnh được viết tuần tự để thực hiện trên dữ liệu để đạt được kết quả. Phương pháp lập trình thủ tục: Các công việc thường xuyên lặp đi, lặp lại được đưa vào một thủ tục. Chương trình chính chỉ việc các chương trình con này và gọi đến các chương trình con này để thực hiện công việc yêu cầu. Phương pháp lập trình Module: Các công việc cụ thể được chia vào những thủ tục và những thủ tục này được ngăn cách với nhau bằng Module. Mỗi Module có thể chứa rất nhiều kiểu dữ liệu và thủ tục. Chương trình chính quản lý các Module này và gọi các chương trình con từ Module này. Phương pháp lập trình hướng đối tượng: Phân chia bài toán thành những đối tượng cụ thể và cung cấp cho các đối tượng này những khả năng của nó. Chương trình chính chỉ việc thao tác trên những đối tượng này để đạt được kết quả mong muốn. 3. Cấu trúc một chương trình C++ #include #include ……. void main () { Các lệnh khai báo biến; //chú thích Các lệnh xử lý; //chú thích /* chú thích theo khối */ } 4. Một số ví dụ mẫu Ví dụ 1: Chương trình thực hiện việc in ra màn hình dòng: Xin chào lớp LTTHK3 #include void main() { printf(“Xin chào lớp LTTHK3 \n”); } Ví dụ 2: Chương trình thực hiện việc nhập một số từ bàn phím và in kết quả là bình phương số đó. #include #include void main() { float n; printf("Nhap so n: "); scanf("%f",&n); printf("Binh phuong la:%f",n*n); getch(); } 5. Cài đặt chương trình Trong Windows Explorer ta thực hiện việc Double Click chuột lên biểu tượng tập tin Install.bat trong thư mục chứa bộ chương trình cài đặt Turbo C++ 3.0 để thực hiện việc cài đặt. Nếu trong DOS, 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 6. Khởi động chương trình Nếu đang ở Windows thì vào Start/ShutDown/Restart MS-DOS mode để quay về DOS Thực hiện các bước sau để vào chương trình Turbo C++ 3.0 - Lệnh chuyển ổ đĩa về ổ đĩa chứa TC. - Lệnh chuyển thư mục hiện hành. - Gõ lệnh BC hoặc TC để vào Borland C++ hoặc Turbo C++. Ví dụ: Một ví dụ khởi động chương trình TC đang nằm trong thư mục C:\TC\BIN như sau: C:  CD TC\BIN  TC  7. Soạn thảo chương trình Cửa sổ soạn thảo của TC như trên: *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 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. - Mở tập tin đã lưu trữ: Nhấn phím F3 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: + Dùng phím mũi tên và shift để chọn khối cần Copy. + Di chuyển con trỏ nhập đến vị trí cần Copy. Nhấn Ctrl+K+C. - Di chuyển nội dung: + Dùng phím mũi tên và shift để chọn khối cần Copy. + Di chuyển con trỏ nhập đến vị trí cần Copy. Nhấn Ctrl+K+V. * Các tài liệu sẵn có: - Để 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. 8. Thoát khỏi chương trình - 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. BÀI 3: CÁC THÀNH PHẦN VÀ CÁC KIỂU DỮ LIỆU CƠ BẢN I- CÁC THÀNH PHẨN 1. Bộ ký hiệu C++ sử dụng các ký hiệu: - Nhóm các ký hiệu bình thường: a, b, c, d, … - Nhóm ký hiệu toán tử đơn: +, -, *, /, %, = , > - Nhóm ký hiệu toán tử ghép: ==, /*, */, >=, ++, && 2. Từ khoá Từ khoá là những từ được C++ dành riêng để lập trình viên thực hiện việc tạo nên chương trình. Mỗi từ khoá mang một ý nghĩa nhất định và chỉ dùng trong những trường hợp nhất định. Cụ thể như: for, while: Dùng để điều khiển vòng lặp. if: Dùng để điều khiển khối lựa chọn. 3. Danh hiệu Danh hiệu là các từ do C++ quy định hoặc do người sử dụng đặt ra. Có 2 loại danh hiệu: - Danh hiệu chuẩn: Là các hằng, biến, tên hàm, … do C++ đặt ra. - Danh hiệu không chuẩn: Là danh hiệu do người lập trình đặt trong quá trình lập trình. 4. Biến Biến được lập trình viên đặt ra và có chiều dài không quá 32 ký tự, không có khoảng cách, không có các ký tự đặc biệt, có thể chứa ký tự _ ,chỉ có thể bắt đầu bằng ký tự chữ cái hoặc dấu _. Không được đặt tên biến trùng với từ khoá, không nên đặt tên biến trùng với các biến và hàm do C++ dựng sẵn. Cách khai báo biến như sau: tênkiểu tênbiến1, tênbiến2, …; Chú ý: - C++ là ngôn ngữ lập trình phân biệt chữ hoa và chữ thường. Do đó, for được C++ hiểu là từ khoá nhưng For không được C++ hiểu là từ khoá. Trong khi lập trình chúng ta phải chú ý việc sử dụng các biến, từ khoá cho chính xác. - Các từ khoá trong C++ đều là chữ thường. 5. Khởi tạo các biến Khi khai báo một biến, giá trị của nó mặc nhiên là không xác định. Nhưng có thể bạn sẽ muốn nó mang một giá trị xác định khi được khai báo. Để làm điều đó, bạn chỉ cần viết dấu bằng và giá trị bạn muốn biến đó sẽ mang: tênkiểu tênbiến = giátrị; Ví dụ, nếu chúng ta muốn khai báo một biến a có kiểu, chứa giá trị 0 ngay từ khi khởi tạo, chúng ta sẽ khai báo: int a = 0; Bổ sung vào cách khởi tạo kiểu C này, C++ còn có thêm một cách mới để khởi tạo biến bằng cách bọc một cặp ngoặc đơn sau giá trị khởi tạo. Ví dụ : int a (0); Cả hai cách đều hợp lệ trong C++. 6. Phạm vi hoạt động của các biến Tất cả các biến mà chúng ta sẽ sử dụng đều phải được khai báo trước. Một điểm khác biệt giữa Cvà C++ là trong C++ chúng ta có thể khai báo biến ở bất kì nơi nào trong chương trình, thậm chí là ngay ở giữa các lệnh thực hiện chứ không chỉ là ở đầu khối lệnh như ở trong C. Mặc dù vậy chúng ta vẫn nên theo cách của ngôn ngữ C khi khai báo các biến bởi vì nó sẽ rất hữu dụng khi cần sửa chữa một chương trình có tất cả các phần khai báo được gộp lại với nhau. Bởi vậy, cách thông dụng nhất để khai báo biến là đặt nó trong phần bắt đầu của mỗi hàm (biến cục bộ) hay trực tiếp trong thân chương trình, ngoài tất cả các hàm (biến toàn cục). Global variables (biến toàn cục) có thể được sử dụng ở bất kì đâu trong chương trình, ngay sau khi nó được khai báo. Tầm hoạt động của local variables (biến cục bộ) bị giới hạn trong phần mã mà nó được khai báo. Nếu chúng được khai báo ở đầu một hàm (như hàm main), tầm hoạt động sẽ là toàn bộ hàm main. Nghĩa là biến được khai báo trong hàm main sẽ chỉ được dùng trong hàm main và không được dùng ở bất cứ hàm nào khác. Thêm vào các biến toàn cục và cục bộ, còn có các biến ngoài (external). Các biến này không những được dùng trong một file mã nguồn mà còn trong tất cả các file được liên kết trong chương trình. Trong C++ tầm hoạt động của một biến chính là khối lệnh mà nó được khai báo (một khối lệnh là một tập hợp các lệnh được gộp lại trong một bằng các ngoặc nhọn { } ). Nếu nó được khai báo trong một hàm tầm hoạt động sẽ là hàm đó, còn nếu được khai báo trong vòng lặp thì tầm hoạt động sẽ chỉ là vòng lặp đó.... 7. Biểu thức Biểu thức là một sự kết hợp giữa các toán hạng, phép toán, hàm nhằm tạo ra một giá trị. Giá trị này có thể được sử dụng hoặc không. 8. Lời chú thích Trong lúc lập trình, chúng ta có thể dùng những lời chú thích để thuyết minh cho chương trình chúng ta hoặc những đoạn mã lệnh khó hiểu để người khác có thể đọc và hiểu dễ dàng hơn. Hoặc ngay chính bản thân người lập trình khi đọc lại chương trình của mình cũng thấy dễ hiểu !? Trong C++ có 2 kiểu chú thích: - Chú thích theo dòng: Ta dùng cặp dấu // bắt đầu chú thích trên dòng. - Chú thích theo khối: Dùng dấu /* để bắt đầu khối chú thích, dùng */ để kết thúc khối kết thúc. Một khối chú thích có thể chứa nhiều dòng chú thích. II- CÁC KIỂU DỮ LIỆU CĂN BẢN Khi lập trình, chúng ta lưu trữ các giá trị trong bộ nhớ của máy tính nhờ vào các biến nhưng máy tính phải biết chúng ta muốn lưu trữ gì trong chúng vì các kiểu dữ liệu khác nhau sẽ cần lượng bộ nhớ khác nhau. Bộ nhớ của máy tính được tổ chức thành các byte. Một byte là lượng bộ nhớ nhỏ nhất mà chúng ta có thể quản lí. Một byte có thể dùng để lưu trữ một loại dữ liệu nhỏ như là kiểu số nguyên từ 0 đến 255 hay một kí tự. Nhưng máy tính có thể xử lý các kiểu dữ liệu phức tạp hơn bằng cách gộp nhiều byte lại với nhau, như số nguyên dài hay số thập phân. Sau đây là các kiểu dữ liệu cơ bản của C++ và miền giá trị có thể chứa được. Tên kiểu char int float double Kích thước 1 byte 2 byte 4 byte 8 byte Miền giá trị -128..127 -32768..32767 3.410-38 .. 3.41038 1.710-308..1.710308 Ngoài các kiểu dữ liệu cơ bản nói trên còn tồn tại các con trỏ và các tham số không kiểu (void) mà chúng ta sẽ xem xét sau. 1. Kiểu char Kiểu Char là kiểu dữ liệu chiếm 1 byte trong bộ nhớ, kiểu này được sử dụng để lưu trữ một ký tự hoặc một số nguyên 1 byte. Biến kiểu này có thể chứa giá trị từ -128..127. Tuỳ cách sử dụng của lập trình viên mà biến kiểu char có thể được dùng làm lưu trữ ký tự hoặc lưu trữ một số nguyên. Dù sử dụng ở cách nào đi nữa thì biến này sử dụng một byte bộ nhớ để lưu trữ và có thể được sử dụng để tính toán như số nguyên bình thường. Để xuất giá trị theo kiểu ký tự ta dùng chuỗi định dạng “%c” (không có dấu nháy kép). Ví dụ 1: Biến kiểu char lưu trữ giá trị là một ký tự. #include #include void main() { char c; c = ‘a’; printf(“ Ky tu la: %c”,c); getch(); } Ví dụ 2: Biến kiểu char dùng để lưu trữ một số. #include #include void main() { char c; c = 68; printf(“ So la: %d”,c); getch(); } 2. Kiểu nguyên Kiểu nguyên có từ khoá khai báo là int, biến kiểu này được chứa trong 2 byte bộ nhớ, biến có kiểu này có thể lưu trữ giá trị từ -32768 ..32767 (-215 ..215-1). Ta có thể dùng chuỗi định dạng xuất nhập “%d” hoặc “%ld” để xuất hay nhập trị cho hằng, biến hoặc biểu thức có kiểu nguyên. Ví dụ: #include #include void main() { int i; i = 1234; i = i + 123; printf("Tri trong bien i la: %d",i); getch(); } 3. Kiểu thực C++ có 2 từ khoá để khai báo dữ liệu là kiểu số thực là float, double. Kiểu float là kiểu số thực có độ chính xác đơn, chính xác 7 chữ số sau dấu chấm thập phân. Kiểu double là kiểu số thực có độ chính xác kép, chính xác 15 chữ số sau dấu chấm thập phân. Ta có thể dùng chuỗi định dạng xuất nhập “%f”, “%lf” tương ứng để xuất hay nhập giá trị biến, hằng, biểu thức kiểu float, double. Ví dụ: Nhập một giá trị vào biến x có kiểu float, sau đó xuất ra giá trị x3 với định dạng xuất 4 số thập phân. #include #include void main() { float x,xmu3; printf("Nhap gia tri x = "); scanf("%f",&x); xmu3 = x*x*x; printf("x mu 3 = %0.4f",xmu3); getch(); } Ngoài các kiểu dữ liệu chuẩn ở trên, C++ còn cung cấp bốn từ khoá short, long, signed, unsinged để kết hợp với các kiểu dữ liệu chuẩn ở trên tạo ra thêm các kiểu dữ liệu mở rộng. - signed: Xác định kiễu dữ liệu là kiểu có dấu. - unsinged: Xác định kiểu dữ liệu là kiểu không dấu. - long: Xác định kiểu dữ liệu là kiểu lớn hơn kiểu dữ liệu cơ bản. - short: Xác định kiểu dữ liệu là kiểu nhỏ hơn kiểu dữ liệu cơ bản. Tuy nhiên, các từ khoá này chỉ chỉ có thể kết hợp với một số kiểu dữ liệu. Bảng sau sẽ liệt kê khả năng kết hợp cũng như dạng tương đương và miền giá trị. Tương đương Kích thước Miền giá trị 1 byte 0..255 1 byte -128..127 char 2 byte 0..65535 unsigned 2 byte -32768..32767 int int hoặc short 2 byte -32768..32767 4 byte 0..4294967295 unsigned long long hoặc long int 4 byte -2147483648..2147483647 4 byte -2147483648..2147483647 long int 4 byte 3.410-38..3.41038 8 byte double 1.710-308..1.710308 8 byte 1.710-308..1.710308 10 byte 3.410-4932..1.1104932 Kiểu/Kết hợp unsigned char signed char unsigned int signed int short int unsigned long int signed long int long float long float double long double 4. Kiểu liệt kê (enum) Chúng ta có thể dùng từ khoá enum để tạo ra một kiểu liệt kê. Trong Turbo C++ 3.0 từ khoá enum có cú pháp như sau: enum tênkiểuliệtkê {danh sách tên liệt kê}[danh sách biến]; hoặc enum tênkiểuliệtkê {tên1 [=giá trị 1],tên2 = [giá trị 2], …}[danh sách biến]; Trong đó: “danh sách tên liệt kê” được phân cách với nhau bằng dấu “,”. “danh sách biến” là danh sách các biến được khai báo có kiểu tênkiểuliệtkê. Ví dụ 1: Chương trình sau sẽ tạo ra kiểu liệt kê có tên là SO chứa các giá trị tương ứng từ 0..9 cho các tên MOT, HAI, BA, …, CHIN. Chương trình #include #include void main() { enum SO {MOT, HAI, BA, BON, NAM, SAU, BAY, TAM, CHIN}; SO chuso; chuso=MOT; clrscr(); //xoa man hinh printf("Gia tri cua chuso la: %d\n",chuso); chuso=SAU+1; printf("Gia tri cua chuso la: %d\n",chuso); chuso=NAM-1; printf("Gia tri cua chuso la: %d\n",chuso); getch(); } Kết quả Gia tri cua chuso la: 0 Gia tri cua chuso la: 6 Gia tri cua chuso la: 3 Ví dụ 2: Chương trình #include #include void main() { enum GIA {CAM = 2000, QUIT = 2500, XOAI=1500}; GIA traicay; clrscr(); traicay=CAM; printf("Gia cua CAM la: %d\n",traicay); traicay=QUIT+1; printf("Gia cua QUIT la: %d\n",traicay); getch(); } Kết quả Gia cua CAM la: 2000 Gia cua QUIT la: 2501 III- HẰNG 1. Khai báo hằng Hằng là giá trị cố định, có giá trị hoàn toàn xác định và không thể thay đổi được trong suốt quá trình thực thi chương trình. Để khai báo một hằng chúng ta dùng từ khoá const có cấu trúc như sau: const tênkiểu tênhằng = giá trị Với kiểu khai báo hằng này thì hằng mang một kiểu xác định như là biến. Thường thường, trong khi lập trình người ta thường dùng “tên hằng” bằng chữ hoa. Và chú ý rằng “tên hằng” phải tuân theo quy tắc đặt tên trong C++. 2. Hằng số -Hằng số nguyên Ví dụ 1: const int i = -4; Khai báo một hằng có kiểu số nguyên có dấu, giá trị -4 const usigned int i = 4; Khai báo một hằng có kiểu số nguyên không dấu, giá trị 4. const long i = -5; Khai báo hằng có kiểu số nguyên dài, có dấu, giá trị -5. const unsinged long i = 5 Khai báo hằng có kiểu số nguyên dài, không dấu, giá trị 5. Trong quá trình khai báo hằng chúng ta phải chú ý đến giá trị của hằng có nằm trong miền giá trị của kiểu dữ liệu khai báo hằng hay không? Ngoài ra, khi viết biểu thức hằng, nếu chúng ta muốn quy định giá trị của biểu thức hằng thuộc kiểu số nguyên nào thì ta cũng có thể thêm vào các ký tự: l hay L, u hay U vào sau biểu thức hằng. Ví dụ 2: -45L hay -45l Biểu thức hằng có giá trị -45 có kiểu là long. 45UL hay 45ul Biểu thức hằng có giá trị 45, có kiểu là unsigned long. -45 Biểu thức hằng có giá trị -45, có kiểu là int. 45U hay 45u Biểu thức hằng có giá trị 45, có kiểu unsigned int. Trong C++ còn cho phép chúng ta viết những biểu thức hằng ở dạng cơ số 8 và 16 bằng cách thêm số 0 vào trước và 0x vào trước biểu thức hằng. Ví dụ 3: 034L Biểu thức hằng cơ số 8 có kiểu long, có giá trị 34(8). 0xAD Biểu thức hằng cơ số 16 có kiểu int, có giá trị AD(16). - Hằng số thực Ví dụ 4: const float pi = 3.14; const double pi = 3.1415926; Trong ngôn ngữ C++, các biểu thức hằng số thực có thể được viết hoặc biểu diễn dưới dạng dấu phẩy tĩnh hoặc dấu phẩy động. + Ở dạng phẩy tĩnh: Ví dụ 5: 10.457 -20.457 -40.545 + Ở dạng phẩy động: Chúng biểu diễn các số với phần nguyên, dấu chấm thập phân (bắt buộc phải có) và ký tự E hoặc e, sau đó đến số mũ. Ví dụ 6: 6.02e23 // 6.02 x 1023 1.6e-19 // 1.6 x 10-19 3. Hằng ký tự Hằng ký tự chứa một ký tự đơn, ký tự này phải được viết giữa cặp dấu nháy đơn (‘’), mỗi ký tự có một mã ASCII tương ứng. (Xem ở phần phụ lục). Mỗi một ký tự có thể được in ra màn hình dưới nhiều dạng khác nhau, tuỳ theo định dạng in của chúng ta. Ví dụ 7: Chưong trình sau sẽ in ra màn hình một ký tự dưới bốn dạng khác nhau: Ký tự, số thập phân của mã ASCII, số hệ cơ số 8 của mã ASCII, số hệ cơ số 16 của mã ASCII Chương trình #include #include void main() { char kytu; kytu='A'; clrscr(); //ham xoa man hinh printf("Ky tu la: %c\n",kytu); printf("Ma ASCII o dang thap phan: %d\n",kytu); printf("Ma ASCII o dang co so 8 :%o\n",kytu); printf("Ma AScII o dang co so 16:%x\n",kytu); getch(); } Kết quả Ky Ma 65 Ma Ma tu la: A ASCII o dang thap phan: ASCII o dang co so 8 :101 AScII o dang co so 16:41 Đối với một số ký tự đặc biệt không in được lên màn hình như các ký tự điều khiển (chẳng hạn ký tự điều khiển việc xuống dòng) hoặc ký tự mà ta chỉ biết mã ASCII, thì C++ cho phép ta viết các ký tự này sau dấu “\” gọi là chuỗi thoát (Escape Sequences). Ý nghĩa Chuỗi \a \b \f \n \r \t \v \\ \? \’ \” \0 \dd \x HH Kêu bíp Xoá ký tự bên trái Sang trang Xuống dòng Về đầu dòng Ký tự Tab theo chiều ngang Ký tự Tab theo chiều dọc Ký tự \ Ký tự ? Ký tự ‘ Ký tự “ Ký tự rỗng (Null char) Ký tự có mã ASCII theo cơ số 8 là dd Ký tự mã ASCII theo cơ số 16 là HH Ví dụ 8: \65 = Ký tự có mã ASCII 53. (6*8 + 5) \x 31 = Ký tự có mã ASCII 49. (3*16 + 1) Chú ý: Khi dùng chuỗi thoát để đưa ra ký tự dựa theo mã ASCII dạng cơ số 16 ta bắt buộc phải dùng chuỗi thoát “\x HH” chứ không được dùng “\X HH”. 4. Hằng chuỗi ký tự Trong ngôn ngữ C++, hằng chuỗi ký tự là một dãy các ký tự nằm trong cặp dấu nháy kép (“ ”). Các ký tự này có thể là chuỗi thoát. Ví dụ 9: “Lop lap trinh K4B” “I can\’t go to school \n\a” Một hằng chuỗi ký tự được lưu trữ trong bộ nhớ theo các byte liền nhau, cuối cùng là một ký tự rỗng. (NUL char) Ví dụ 10: Chuỗi “Lop lap trinh K4B” được lưu trữ trong bộ nhớ như sau: L o p l a p t r i n h K 4 B \0 Chúng ta không được lầm lẫn giữa hằng ký tự và hằng chuỗi ký tự. Chẳng hạn như trong trường hợp sau: - Hằng chuỗi ký tự “A” được lưu trữ trong bộ nhớ: A \0 Nghĩa là chuỗi “A” được lưu trữ 2 byte trong bộ nhớ. - Hằng ký tự ‘A’ được lưu trữ trong bộ nhớ: A Nghĩa là hằng ký tự ‘A’ được lưu trữ 1 byte trong bộ nhớ. Một chuỗi ký tự có thể là chuỗi rỗng (“”) và được lưu trữ trong bộ nhớ chỉ gồm 1 ký tự ‘\0’. Một chuỗi ký tự có thể được viết trên nhiều hàng, khi đó ở cuối mỗi hàng của chuỗi chúng ta có dấu \. Ví dụ 11: “Day la mot chuoi ky tu \ nhieu dong nhung khi \ in ra man hinh se chi in mot dong thoi” IV- CÁC PHÉP TOÁN CỦA C++ Dữ liệu được lưu trữ trong bộ nhớ sẽ không mang lại ý nghĩa nếu chúng ta không thể thực hiện được việc tính toán với dữ liệu đã lưu trữ trong bộ nhớ. Ngôn ngữ C++ cung cấp cho chúng ta những phép toán và được xem như thành phần của C++. 1. Phép toán gán (=). Phép toán gán dùng để lưu trữ giá trị vào một biến, kết quả trả về của hàm. Theo dạng tổng quát tênbiến = biểuthức; Ví dụ 12: a = 5; gán giá trị nguyên 5 cho biến a. Vế trái bắt buộc phải là một biến còn vế phải có thể là bất kì hằng, biến hay kết quả của một biểu thức. Cần phải chú ý rằng, vế trái của biểu thức gán luôn luôn là tênbiến, còn giá trị gán là biểu thức bên phải. Trật tự này luôn luôn không được thay đổi trong bất cứ tình huống nào. Một thuộc tính của toán tử gán trong C++ góp phần giúp nó vượt lên các ngôn ngữ lập trình khác là việc cho phép vế phải có thể chứa các phép gán khác. Ví dụ 13: a = 2 + (b = 5); tương đương với hai lệnh: 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 2. Phép toán số học Để thực hiện việc tính toán với các giá trị số học, C++ cung cấp cho chúng ta một lớp các phép toán số học bao gồm: +, -, *, /, % Phép toán + * / % Ý nghĩa Phép cộng Phép trừ Phép nhân Phép chia Lấy phần dư của phép chia Ví dụ 4 + 5 kết quả 9 5 – 4 kết quả 1 4*5 kết quả 20 8/4 kết quả 2 5%3 kết quả 2 Thứ tự thực hiện các toán tử này cũng giống như chúng được thực hiện trong toán học. Điều duy nhất có vẻ hơi lạ đối với bạn là phép lấy phần dư, ký hiệu bằng dấu phần trăm (%). Đây chính là phép toán lấy phần dư trong phép chia hai số nguyên với nhau. Chẳng hạn, nếu a = 11 % 3;, biến a sẽ mang giá trị. Trong khi lập trình chúng ta phải chú ý kết quả trả về biểu thức tính toán. Nếu thực hiện phép gán cho một biểu thức tính toán thì phải chú ý kiểu dữ liệu của biến có đủ để chứa giá trị của biểu thức hay không. Chẳng hạn, biểu thức 4 * 5 sẽ trả về kiểu giá trị thuộc kiểu int, do đó có thể gán cho biến có kiểu int, long, float, … Một vấn đề gặp phải trong khi lập trình, nếu những toán hạng trong biểu thức có kiểu dữ liệu khác nhau thì kết quả trả về của biểu thức thuộc kiểu nào? Ngôn ngữ C++ sẽ tự động chuyển kiểu dữ liệu của toán hạng có kiểu dữ liệu bé hơn thành kiểu dữ liệu của toán hạng lớn hơn để tính và kiểu dữ kết quả trả về của biểu thức sẽ là kiểu dữ liệu của toán hạng có kiểu dữ liệu lớn nhất. Ví dụ 14: 4.5*2 thì chương trình sẽ chuyển giá trị 2 (kiểu số int) thành kiểu số thực và nhân với giá trị 4.5. Sau đó trả về giá trị là 9.00 theo kiểu dữ liệu số thực. 3. Phép toán tăng và giảm. C++ cung cấp những phép toán mạnh mẽ để lập trình viên tạo ra chương trình một cách ngắn gọn nhất mà vẫn đảm bảo logic. C++ cung cấp hai toán tử đặc biệt và rất hiệu quả gọi là toán tử tăng (++) và toán tử giảm (--) để tăng hoặc giảm giá trị của một biến nào 1 đơn vị. Chẳng hạn: a++; sẽ tương đương với phép toán a = a + 1 hoặc a +=1 Hai phép toán này rất mạnh bởi ngoài khả năng tạo nên chương trình với đoạn mã ngắn nhất thì hai phép toán này có tốc độ thực hiện vô cùng nhanh. Một tính chất nữa của toán tử này là nó có thể là tiền tố hoặc hậu tố, có nghĩa là có thể viết trước tên biến (++a; --a) hoặc sau tên biến (a++; a--) và mặc dù hai cách dùng này đều mang lại kết quả là tăng hay giảm giá trị của biến đi 1 đơn vị. Tuy nhiên, việc sử dụng phép toán này ở dạng tiến tố hay hậu tố sẽ mang lại những kết quả khác nhau. Hãy chú ý sự khác biệt : Ví dụ 15 b = 3; a = ++b; Sẽ có kết quả: a = 4; b = 4 Nghĩa là tương đương với đoạn mã lệnh sau: Ví dụ 16 b = 3; a = b++; Sẽ có kết quả: a = 3; b = 4 Nghĩa là tương đương với đoạn mã lệnh sau: b = 3; b = b+1; a = b; b = 3; a = b; b = b+1; 4. Phép toán quan hệ C++ cung cấp các toán tử quan hệ để chỉ ra mối quan hệ giữa hai toán hạng là lớn, nhỏ, bằng hay không? Còn gọi là các toán tử so sánh, bao gồm: ==, !=, >, <, >=, <= - Toán tử bằng (= =) : Chỉ ra mối quan hệ bằng giữa hai toán hạng. - Toán tử khác (!=): Chỉ ra mối quan hệ khác nhau giữa hai toán hạng. - Toán tử lớn hơn (>): Chỉ ra mối quan hệ lớn hơn giữa toán hạng bên trái dấu “>” so với toán hạng bên phải dấu “>”. - Toán tử bé hơn (<): Chỉ ra mối quan hệ bé hơn giữa toán hạng bên trái dấu “<” so với toán hạng bên phải dấu “<”. - Toán tử lớn hơn hoặc bằng (>=): Chỉ ra mối quan hệ lớn hơn hoặc bằng giữa toán hạng bên trái dấu “>=” so với toán hạng bên phải dấu “>=”. - Toán tử bé hơn hoặc bằng (<=): Chỉ ra mối quan hệ bé hơn hoặc bằng giữa toán hạng bên trái dấu “<=” so với toán hạng bên phải dấu “<=”. Khi sự so sánh giữa hai toán hạng là đúng thì kết quả trả về của biểu thức so sánh là số 1; Ngược lại sẽ trả về giá trị là số 0. Đây là một điểm khá “lập dị” của ngôn ngữ C++ so với các ngôn ngữ khác, tuy nhiên, sự “lập dị” này là một điểm mạnh của C++. Ví dụ 18: 4>5 Trả về giá trị 1. 4 >=5 Trả về giá trị 0 5 >=4 Trả về giá trị 1 Trong nhiều trình dịch C++, các biểu thức quan hệ không trả về giá trị logic 1 hoặc 0 mà trả về giá true hoặc false. 5. Phép toán logic Trong khi lập trình, chúng ta có thể phải sử dụng các biểu thức so sánh phức tạp. C++ cung cấp các toán tử logic để liên kết các biểu thức so sánh đơn lại với nhau, bao gồm: phép NOT (!), phép and (&&), phép OR (||) . Bảng chân trị sau sẽ cho thấy kết quả của các phép toán trên Toán hạng 1 A 0 0 Khác 0 Khác 0 Toán hạng 2 B 0 Khác 0 0 Khác 0 !A 1 1 0 0 Kết quả A&&B 0 0 0 1 A||B 0 1 1 1 - Toán tử NOT, đặc trưng bằng dấu “!”: Chuyển giá trị từ đúng thành sai và từ sai thành đúng.
- Xem thêm -

Tài liệu liên quan