1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Lập trình cơ bản với C++

146 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giáo Trình Lập Trình Cơ Bản Với C++
Tác giả Hồ Sĩ Đàm, Trần Thị Minh Châu, Lê Sỹ Vinh
Trường học Đại học Quốc gia
Chuyên ngành Lập trình cơ bản
Thể loại giáo trình
Định dạng
Số trang 146
Dung lượng 1 MB

Cấu trúc

  • 1.1. Ch ơng trình là gì? (9)
  • 1.2. L p trình là gì? (9)
    • 1.2.1. M c cao c l p v i máy tính (9)
    • 1.2.2. M c th p ph thu c vào máy tính (11)
  • 1.3. Ngôn ng l p trình và ch ơng trình d ch (11)
  • 1.4. Môi tr ng l p trình b c cao (12)
  • 1.5. L i và tìm l i (14)
  • 1.6. L ch s C và C++ (15)
  • 1.7. Ch ơng trình C++ u tiên (16)
  • 2.1. Ki u d li u (23)
    • 2.1.1. Ki u d li u cơ b n (23)
    • 2.1.2. Ki u d li u d n xu t (25)
  • 2.2. Khai báo và s d ng bi n (25)
    • 2.2.1. nh danh và cách t tên bi n (25)
    • 2.2.2. Khai báo bi n (26)
  • 2.3. H ng (26)
    • 2.4.4. Các phép toán lô-gic (29)
    • 2.4.5. u tiên c a các phép toán (29)
    • 2.4.6. T ơng thích gi a các ki u (30)
  • 3.1. Lu ng i u khi n (32)
  • 3.2. Các c u trúc r nhánh (0)
    • 3.2.1. L nh if-else (33)
    • 3.2.2. L nh switch (39)
  • 3.3. Các c u trúc l p (43)
    • 3.3.1. Vòng while (43)
    • 3.3.2. Vòng do-while (46)
    • 3.3.3. Vòng for (49)
  • 3.4. Thu t toán và các c u trúc i u khi n l ng nhau (54)
  • 3.5. Các l nh break và continue (0)
  • 3.6. Bi u th c i u ki n trong các c u trúc i u khi n (57)
  • 4.1. C u trúc chung c a hàm (0)
  • 4.2. Cách s d ng hàm (0)
  • 4.3. Các hàm có s n (0)
  • 4.4. Bi n toàn c c và bi n a ph ơng (64)
    • 4.4.1. Ph m vi c a bi n (64)
    • 4.4.2. Th i gian s ng c a bi n (66)
    • 4.5.1. Truy n giá tr (67)
    • 4.5.2. Truy n tham chi u (0)
    • 4.5.3. Tham s m c nh (71)
  • 4.6. Hàm trùng tên (73)
  • 4.7. Hàm quy (75)
  • 5.1. M ng m t chi u (78)
    • 5.1.1. Kh i t o m ng (79)
    • 5.1.2. Trách nhi m ki m soát tính h"p l c a ch# s m ng (0)
    • 5.1.3. M ng làm tham s cho hàm (80)
  • 5.2. M ng nhi u chi u (82)
  • 5.3. Xâu kí t! (83)
    • 5.3.1. Kh i t o giá tr cho xâu kí t! (0)
    • 5.3.2. Th vi n x lý xâu kí t! (85)
  • 5.4. Tìm ki m và s$p x p d li u trong m ng (0)
    • 5.4.1. Tìm ki m tuy n tính (85)
    • 5.4.2. Tìm ki m nh phân (87)
    • 5.4.3. S$p x p ch n (0)
  • 6.5. B nh ng (96)
    • 6.5.1. C p phát b nh ng (97)
    • 6.5.2. Gi i phóng b nh ng (97)
  • 6.6. M ng ng và con tr% (98)
  • 6.7. Truy n tham s là con tr% (100)
  • 7.1. nh ngh'a ki u d li u tr&u t "ng b ng c u trúc struct (0)
  • 7.2. nh ngh'a ki u d li u tr&u t "ng b ng c u trúc class (0)
    • 7.2.1. Quy n truy nh p (114)
    • 7.2.2. Toán t ph m vi và nh ngh'a các hàm thành viên (115)
    • 7.2.3. Hàm kh i t o và hàm h y (116)
  • 7.3. L"i ích c a l p trình h ng i t "ng (0)
  • 7.4. Biên d ch riêng r (120)
  • 8.1. Khái ni m dòng d li u (126)
  • 8.2. T p v(n b n và t p nh phân (127)
  • 8.3. Vào ra t p (127)
    • 8.3.1. M t p (128)
    • 8.3.2. óng t p (129)
    • 8.3.3. X lý t p v(n b n (130)
    • 8.3.4. X lý t p nh phân (133)

Nội dung

Ch ơng trình là gì?

Bản chất của chương trình máy tính là thực hiện các lệnh mà người dùng đưa ra Ví dụ, trong Microsoft Word, người dùng tương tác với phần mềm để thực hiện các thao tác soạn thảo văn bản Khi bạn khởi động một chương trình, máy tính sẽ thực hiện các lệnh của chương trình đó, cho phép bạn thực hiện các tác vụ cụ thể.

L p trình là gì?

M c cao c l p v i máy tính

M c cao c l p v i máy tính th ng "c chia thành ba b c chính là: xác nh v n , thi t k thu t toán và l p trình

Xác định vấn đề là bước đầu tiên trong quá trình giải quyết bài toán, bao gồm việc xác định dữ liệu đầu vào, các ràng buộc và yêu cầu cần giải quyết Bước này thường sử dụng bút/giấy và ngôn ngữ tự nhiên, như tiếng Anh hoặc tiếng Việt, để mô tả và xác định vấn đề cần giải quyết.

Thuật toán là một chuỗi các chỉ dẫn nhằm giải quyết một bài toán Các chỉ dẫn này cần được trình bày một cách hoàn chỉnh và chính xác để mọi người có thể hiểu và thực hiện theo Thuật toán thường được mô tả dưới dạng mã giả (pseudocode), cho phép sử dụng bút giấy và không phụ thuộc vào ngôn ngữ lập trình cụ thể Ví dụ, thuật toán “tìm ước số chung lớn nhất (UCLN) của hai số x và y” có thể được viết bằng ngôn ngữ tự nhiên.

• B c 1: N u x>y thì thay x b ng ph n d c a phép chia x/y

• B c 2: N u không, thay y b ng ph n d c a phép chia y/x

• B c 3: N u trong hai s x và y có m t s b ng 0 thì k t lu n UCLN là s còn l i

• B c 4: N u không, quay l i B c 1 ho c b ng mã gi : repeat if x > y then x := x mod y else y := y mod x until x = 0 or y = 0 if x = 0 then UCLN := y else UCLN := x

Lập trình là quá trình chuyển đổi thuật toán sang một ngôn ngữ lập trình, thường sử dụng các ngôn ngữ lập trình bậc cao như C++ và Java Trong quá trình này, lập trình viên sẽ sử dụng một chương trình soạn thảo để viết chương trình.

M c th p ph thu c vào máy tính

Các ngôn ngữ lập trình bậc cao như C, C++, Java, Visual Basic, và C# cho phép lập trình viên thiết kế các ứng dụng phức tạp Tuy nhiên, máy tính không hiểu trực tiếp các ngôn ngữ này Do đó, trước khi một chương trình được viết bằng ngôn ngữ bậc cao có thể chạy, nó phải được dịch sang ngôn ngữ máy, hay còn gọi là mã máy, mà máy tính có thể hiểu và thực thi Quá trình này được thực hiện bởi một chương trình dịch.

Ngôn ng l p trình và ch ơng trình d ch

Quá trình giải quyết một bài toán thường diễn ra qua nhiều bước khác nhau, chuyển đổi từ ngôn ngữ tự nhiên sang ngôn ngữ mà máy tính có thể hiểu và thực hiện Ngôn ngữ lập trình đóng vai trò quan trọng trong việc này, giúp máy tính thực hiện các lệnh một cách chính xác.

"c chia ra thành hai lo i: ngôn ng l p trình b c th p và ngôn ng l p trình b c cao

Ngôn ngữ lập trình bậc thấp như hợp ng (assembly language) và mã máy là ngôn ngữ gần gũi nhất với ngôn ngữ máy mà máy tính có thể hiểu được Điểm chính của các ngôn ngữ này là chúng liên quan chặt chẽ đến cấu trúc bên trong của máy tính Các hệ máy tính khác nhau sẽ sử dụng các ngôn ngữ khác nhau Chương trình viết bằng các ngôn ngữ này có thể chạy mà không cần qua chương trình dịch Ngôn ngữ bậc thấp có thể được sử dụng để viết những chương trình cần tối ưu hóa về tài nguyên Tuy nhiên, chúng thường khó hiểu đối với con người và không thuận tiện cho việc lập trình.

Ngôn ng l p trình b c cao nh Pascal, Ada, C, C++, Java, Visual Basic,

Python và các ngôn ngữ lập trình bậc cao khác có tính trừu tượng cao, giúp lập trình viên dễ dàng hơn trong việc phát triển phần mềm Việc sử dụng những ngôn ngữ này cho phép lập trình nhanh chóng và hiệu quả hơn so với các ngôn ngữ lập trình bậc thấp Ngoài ra, các chương trình viết bằng ngôn ngữ bậc cao thường có khả năng chạy trên nhiều loại máy tính khác nhau.

Các ch ơng trình vi t b ng m t ngôn ng b c cao mu n ch y "c thì ph i

Chuyển đổi ngôn ngữ bằng máy có thể thực hiện thông qua các chương trình dịch Các chương trình dịch này được chia thành hai loại: trình biên dịch và trình thông dịch.

Các ngôn ngữ lập trình cao cấp như C và C++ yêu cầu sử dụng trình biên dịch (compiler) để chuyển đổi mã nguồn thành mã máy Một trong những trình biên dịch phổ biến là gcc/g++ trong bộ GNU Compiler Collection (GCC), thường được sử dụng trong các môi trường Unix/Linux và Windows Microsoft Visual C++ cũng là một trình biên dịch C++ phổ biến trong môi trường Windows Ngược lại, một số ngôn ngữ lập trình cao cấp khác như Perl và Python yêu cầu sử dụng trình thông dịch (interpreter) Khác với trình biên dịch, trình thông dịch thực thi từng dòng mã lệnh mà không cần biên dịch toàn bộ chương trình một lần.

C++ là một trong những ngôn ngữ lập trình chuyên nghiệp phổ biến nhất trên thế giới Trong bài viết này, chúng ta sẽ khám phá những kiến thức cơ bản và các tính năng nổi bật của C++ Mặc dù có nhiều ngôn ngữ lập trình khác, C++ vẫn giữ vị trí quan trọng trong lĩnh vực phát triển phần mềm.

"c gi i thi u sơ qua Ng i h c nên ti p t c tìm hi u v ngôn ng C++, v "t ra ngoài gi i h n c a cu n sách này.

Môi tr ng l p trình b c cao

Để giải quyết một bài toán bằng ngôn ngữ lập trình bậc cao, bạn cần sử dụng những công cụ chính như: chương trình soạn thảo, chương trình dịch dành cho ngôn ngữ sử dụng, các thư viện chuẩn của ngôn ngữ đó, và chương trình tìm lỗi (debugger).

Các b c cơ b n xây d!ng và th!c hi n m t ch ơng trình:

Mã nguồn chương trình C++ thường được lưu trữ trong các tệp có đuôi cpp, cxx, cc hoặc C (viết hoa) Người dùng có thể sử dụng các phần mềm soạn thảo như Notepad trong môi trường Windows hoặc vi trong môi trường Unix/Linux để viết và chỉnh sửa mã nguồn Ngoài ra, còn có nhiều công cụ soạn thảo tích hợp hỗ trợ lập trình C++.

Trình biên dịch D chuyển đổi mã nguồn chương trình thành mã máy riêng lẻ, được gọi là "object code" Các trình biên dịch phổ biến cho C++ bao gồm vc.exe trong Microsoft Visual Studio và gcc trong GNU Compiler, với các tham số thích hợp để tạo ra tệp thực thi.

Liên kết là một bước quan trọng trong quá trình phát triển phần mềm, giúp kết nối mã nguồn với nhau để tạo ra chương trình hoàn chỉnh Trình liên kết (linker) thực hiện việc kết nối các đoạn mã máy riêng lẻ với nhau và với các thư viện đã được tạo ra, từ đó tạo ra một chương trình mã máy hoàn chỉnh có thể thực thi.

4 N p: Trình n p (loader) s n p ch ơng trình d i d ng mã máy vào b nh Các thành ph n b, sung t& th vi n c)ng "c n p vào b nh

5 Ch y: CPU nh n và th!c hi n l n l "t các l nh c a ch ơng trình, d li u và k t qu th ng "c ghi ra màn hình ho c , 'a

Trong quá trình phát triển phần mềm, không có chương trình nào chạy hoàn hảo ngay từ lần đầu Các chương trình có thể gặp lỗi cú pháp hoặc xảy ra sự cố trong khi thực thi Trong những trường hợp này, lập trình viên cần quay lại bước trước đó để sửa lỗi và thực hiện lại các bước sau đó.

Hình 1.2 trình bày các bước cơ bản trong việc xây dựng một chương trình Để lập trình hiệu quả, các công cụ như soạn thảo, dịch, liên kết và chạy cần được sử dụng trong môi trường lập trình tích hợp (IDE - integrated development environment) Trong IDE, tất cả các công cụ đều hỗ trợ người dùng thực hiện các tính năng trong một phần mềm duy nhất IDE rất hữu ích cho các lập trình viên, đặc biệt là đối với những người mới học.

"c b n ch t các b c c a quá trình xây d!ng ch ơng trình, hi u "c b n ch t và c i m chung c a các IDE, tránh tình tr ng b ph thu c vào m t IDE c th

Microsoft Visual Studio là một IDE phổ biến cho lập trình trên môi trường Windows, trong khi Eclipse là phần mềm miễn phí hỗ trợ nhiều ngôn ngữ lập trình và có phiên bản cho cả Windows và Unix/Linux.

C++ là một ngôn ngữ lập trình phổ biến, và có nhiều môi trường phát triển tích hợp (IDE) hỗ trợ, bao gồm Microsoft Visual Studio, Dev-C++, Code::Blocks và KDevelop Mỗi IDE đều có thể hỗ trợ nhiều trình biên dịch khác nhau, với Code::Blocks hỗ trợ cả GCC và MSVC, điều này giúp lập trình viên có thể làm việc với các phiên bản khác nhau của C++.

C++ có nhiều phiên bản khác nhau, trong đó phiên bản đầu tiên là C++ 1998 (ISO/IEC 14882) không hỗ trợ hoàn toàn các tính năng trong chuẩn ANSI/ISO 1998 Phiên bản C++ do Microsoft phát triển khác với phiên bản C++ của GNU Tuy nhiên, các trình biên dịch hiện đại đều hỗ trợ chuẩn C++, vì vậy nên sử dụng các phần mềm này Ngôn ngữ C++ được sử dụng trong cuốn sách này tuân theo chuẩn ISO/IEC 14882, còn được gọi là "C++ thuần túy" (pure C++).

L i và tìm l i

Trong và sau quá trình l p trình, chúng ta ph i ti n hành ki m th và s a l i ch ơng trình Có ba lo i l i th ng g p: l i cú pháp, l i run-time và l i lô-gic

Lỗi cú pháp xảy ra khi lập trình viên viết sai các quy tắc cú pháp của ngôn ngữ lập trình, dẫn đến việc chương trình không thể biên dịch đúng Chương trình biên dịch sẽ phát hiện các lỗi cú pháp và cung cấp thông báo về vị trí mà nó cho là có lỗi.

Trình biên dịch chỉ ra rằng nếu chương trình có lỗi cú pháp, thì chắc chắn sẽ có lỗi cú pháp trong chương trình Tuy nhiên, việc xác định lỗi cụ thể là điều mà trình biên dịch chưa thể làm một cách chính xác, và đôi khi nó có thể báo cáo sai lỗi.

Lỗi run-time là lỗi xảy ra trong quá trình chương trình đang chạy, gây ra thông báo lỗi và ngừng chương trình Ví dụ, khi chương trình thực hiện hoạt động không như mong đợi, lỗi này sẽ xuất hiện Lỗi logic thường là loại lỗi khó phát hiện nhất.

Chương trình cáp bậc n và chạy không phát sinh thông báo lỗi, thậm chí chương trình cho ra kết quả có ứng với một vài bộ dữ liệu test Điều đó không có nghĩa chương trình cáp bậc hoàn toàn không có lỗi Có thể cần chạy thử chương trình với nhiều bộ dữ liệu khác nhau và so sánh kết quả mà chương trình tạo ra với kết quả mong đợi.

L ch s C và C++

Ngôn ng l p trình C "c t o ra b i Dennis Ritchie (phòng thí nghi m Bell) và

C là ngôn ngữ lập trình được phát triển vào năm 1983, nổi bật với tính di động (portable) cho phép chương trình chạy trên nhiều loại máy tính và hệ điều hành khác nhau Sự phát triển của C đã góp phần quan trọng vào việc cải tiến hệ điều hành UNIX.

"c chu-n hóa và "c g i là ANSI C b i Vi n chu-n hóa qu c gia Hoa K/

(American National Standards Institute) Hi n nay ANSI C v n là ngôn ng l p trình chuyên nghi p và "c s d ng r ng rãi phát tri n các h th ng tính toán hi u n(ng cao

Ngôn ngữ lập trình C++ được phát triển bởi Bjarne Stroustrup tại phòng thí nghiệm Bell, kế thừa từ ngôn ngữ C và có sự ảnh hưởng mạnh mẽ từ Simula67 So với C, C++ an toàn hơn, có khả năng mở rộng tốt hơn và giảm thiểu lỗi trong quá trình lập trình Ngoài các tính năng kế thừa từ C, C++ hỗ trợ lập trình hướng đối tượng và lập trình tổng quát, giúp xây dựng các hệ thống phức tạp một cách dễ dàng hơn.

Ngôn ngữ lập trình C++ ra đời vào năm 1979 dưới tên gọi "C with Classes" và đã trải qua nhiều giai đoạn phát triển Đến năm 1983, tên gọi "C++" chính thức được sử dụng, cùng với các tính năng như hàm ảo, hàm trùng tên và toán tử quá tải Năm 1989, C++ được bổ sung lớp trừu tượng, hàm thành viên tĩnh, hàm ảo và thành viên kiểu protected Trong thập kỷ tiếp theo, ngôn ngữ này đã được cải tiến với các tính năng như khuôn mẫu, không gian tên, xử lý ngoại lệ, các toán tử, kiểu dữ liệu mới và kiểu dữ liệu Boolean Năm 1998, C++ chính thức được chuẩn hóa bởi ISO với tiêu chuẩn ISO/IEC 14882 Bên cạnh việc tích hợp với chuẩn C, C++ còn bổ sung thư viện chuẩn STL (Standard Template Library), cung cấp các cấu trúc dữ liệu hữu ích như vector, danh sách và các thuật toán sắp xếp và tìm kiếm.

Hi n nay, C++ là m t trong các ngôn ng l p trình chuyên nghi p "c s d ng r ng rãi nh t.

Ch ơng trình C++ u tiên

Chương trình đơn giản trong Hình 1.3 hiển thị dòng chữ "Hello world!" Trong chương trình này có những khái niệm quan trọng của C++ Chúng ta sẽ xem xét từng dòng mã.

Hình 1.3: Ch ơ ng trình C++ u tiên

Hai dòng chú thích trong lập trình, bao gồm dòng chú thích đơn và dòng chú thích đa dòng, là những phần không ảnh hưởng đến hoạt động của chương trình khi chạy Dòng chú thích đơn thường được sử dụng với ký hiệu "//", trong khi dòng chú thích đa dòng sử dụng ký hiệu "/*" để bắt đầu và "*/" để kết thúc Các lập trình viên thường dùng chú thích để giải thích và giới thiệu nội dung của chương trình, giúp tăng cường khả năng đọc hiểu mã nguồn.

Dòng lệnh #include là một chỉ thị tiền xử lý, cho phép trình biên dịch biết rằng nó cần sử dụng một thư viện cụ thể trước khi thực hiện biên dịch chương trình Cụ thể, #include được sử dụng để khai báo và tích hợp thư viện đầu vào và đầu ra iostream trong ngôn ngữ lập trình C++.

Ti p theo là hàm main, ph n không th thi u c a m i ch ơng trình C++ Nó b$t u t& dòng khai báo header c a hàm: int main()

Chương trình C++ thường bao gồm nhiều hàm, trong đó có một hàm tên là main, là nơi chương trình bắt đầu thực hiện và kết thúc Bên trái từ khóa main là từ khóa int, có nghĩa là hàm main sẽ trả về một giá trị nguyên Chương 4 sẽ cung cấp thông tin chi tiết về khái niệm hàm và việc hàm trả về giá trị.

Hàm main là điểm bắt đầu và kết thúc của chương trình, bên trong chứa chuỗi các lệnh được thực hiện tuần tự từ lệnh đầu tiên đến lệnh cuối cùng Trong ví dụ đang xét, hàm main có hai lệnh Mỗi lệnh kết thúc bằng một dấu chấm phẩy, trong khi các nhánh điều kiện thì không cần thiết.

Trong C++, để in ra chuỗi ký tự "Hello world!", chúng ta sử dụng đối tượng cout, kết hợp với toán tử b: hi n ra màn hình dòng ch “ " b”

• a < b: hi n ra màn hình dòng ch “ b”

• a = b: hi n ra màn hình dòng ch “ q b”

Kiểm tra xem ba điểm a, b, c có tạo thành một tam giác hợp lệ hay không bằng cách xác định độ dài các cạnh Nếu ba điểm này thỏa mãn điều kiện của tam giác, màn hình sẽ hiển thị thông báo và diện tích của tam giác Ngược lại, nếu không, sẽ có thông báo cho biết ba điểm này không phải là ba đỉnh của một tam giác.

4 Nh p t& bàn phím hai s nguyên Tính th ơng c a s l n chia cho s bé

5 Nh p t& bàn phím ba s nguyên Tính t,ng c a s nh% nh t và s l n nh t

Nhập vào tên và bán phím danh sách các sinh viên trong lớp học Quá trình nhập dữ liệu được thực hiện khi nhấn vào một số âm Hãy cho biết số lượng sinh viên trong lớp và tính điểm trung bình của lớp học đó.

7 Nh p vào t& bàn phím m t s nguyên d ơng, hãy tính t,ng t t c các s nguyên d ơng l* nh% hơn s nh p t& bàn phím

8 Nh p t& bàn phím m t s nguyên d ơng Hãy ki m tra xem s nguyên d ơng ó có ph i là s nguyên t hay không

Các chương trình thường gặp phải vấn đề với việc quản lý mã nguồn khi có một hàm chính – hàm chính Khi cần giải quyết bài toán phức tạp hơn, hàm trở nên dài và khó hiểu, khiến lập trình viên gặp khó khăn trong việc duy trì và sửa đổi Để giải quyết các bài toán lớn và phức tạp, người ta thường sử dụng chiến lược "chia để trị", tức là chia bài toán thành một chuỗi các bài toán nhỏ hơn, dễ dàng hơn, và có thể giải quyết một cách độc lập, sau đó kết hợp lại để tạo ra giải pháp hoàn chỉnh cho bài toán ban đầu Trong lập trình, chia để trị có thể được thực hiện bằng cách chia chương trình thành các chương trình con Mã chứa trong thân của một chương trình con sẽ được thực thi khi chương trình con đó được gọi (hay kích hoạt) Chương trình con chính là một trong những cơ chế cho phép mô-đun hóa chương trình.

Chương trình con là một phần quan trọng trong lập trình, giúp lập trình viên tái sử dụng mã và xây dựng các chương trình mới một cách hiệu quả Việc sử dụng chương trình con không chỉ giúp giảm thiểu mã lặp lại trong một chương trình mà còn tăng cường tính tổ chức và dễ bảo trì cho mã nguồn.

Ng i ta khuyên r ng dài m i ch ơng trình con không nên v "t quá m t trang màn hình l p trình viên có th ki m soát t t ho t ng c a ch ơng trình con ó

Trong C++, t t c các ch ơng trình con u "c th hi n b i c u trúc hàm

Chương trình chính có thể được coi là một hàm Hàm này "được kích hoạt" khi nó được gọi từ bên trong một hàm khác, như thể hiện trong Hình 3.12 Khi hàm được gọi thực hiện xong công việc của mình, nó trả kết quả về cho nơi gọi nó hoặc đơn giản là trả quyền điều khiển về cho nơi gọi nó Có thể so sánh hàm được gọi như một người thực hiện nhiệm vụ, còn hàm gọi nó như một người chỉ huy.

A, ng i th" A th!c hi n công vi c và khi làm xong thì báo cáo k t qu l i cho

Ch ơng này s nói v cách nh ngh'a các ch ơng trình con (ho c các hàm) và các v n liên quan nh bi n a ph ơng, cách truy n d li u vào trong hàm

Các ngôn ngữ lập trình bậc cao thường cung cấp nhiều hàm sẵn có cho người dùng Những hàm này được chia thành các nhóm hoặc thư viện khác nhau Để sử dụng một hàm, người lập trình chỉ cần khai báo thư viện tương ứng và sau đó có thể sử dụng hàm đó một cách bình thường Ví dụ, trong chương trình ở Hình 3.12, chúng ta đã sử dụng hàm w và khai báo thư viện cmath chứa nó.

• iostream: cung c p các hàm liên quan n nh p và xu t d li u

• cmath: cung c p các hàm liên quan n toán h c

• cstdlib: cung c p các hàm cho các m c ích chung nh : qu n lý b nh ng, sinh s ng u nhiên, tìm ki m-s$p x p…

• cstring: cung c p các hàm x lý chu i kí t! nh : tính dài, sao chép chu i…

Có th tra c u chi ti t v các th vi n này t i [4]

Ví d , B ng 4.1 li t kê danh sách m t s hàm toán h c thông d ng

B ng 4.1: Các hàm toán h c trong th vi n cmath

Hàm Miêu t ceil(x) trả về số nguyên nhỏ nhất không nhỏ hơn x, trong khi hàm cos(x) là hàm lượng giác cosin của x (x được đo bằng radian) Hàm exp(x) tính giá trị e mũ x, và hàm fabs(x) trả về giá trị tuyệt đối của x Hàm floor(x) trả về số nguyên lớn nhất không lớn hơn x Hàm log(x) tính logarit cơ số e của x (ln x), còn hàm log10(x) tính logarit cơ số 10 của x Hàm pow(x, y) tính x mũ y, trong khi hàm sin(x) là hàm lượng giác sin của x (x được đo bằng radian) Hàm sqrt(x) tính căn bậc hai của x (x phải là giá trị không âm), và hàm tan(x) là hàm lượng giác tang của x (x được đo bằng radian).

Ngoài việc sử dụng các hàm có sẵn trong thư viện, lập trình viên còn có thể xây dựng các hàm của riêng mình Sau khi được "công nhận", một hàm có thể được sử dụng nhiều lần Hàm được định nghĩa theo công thức: kiểu_trả_về tên_hàm(tham_s_1, tham_s_2,…), trong đó thân_hàm chứa logic thực hiện của hàm.

Kiểu trả về trong C++ là kiểu dữ liệu mà hàm trả về Đây là một trong những kiểu dữ liệu cơ bản có sẵn trong C++ hoặc có thể là kiểu dữ liệu do người dùng định nghĩa Trong C++, nếu hàm không trả về giá trị nào, thì kiểu trả về sẽ được thay thế bằng từ khóa `void`.

• tên_hàm là nh danh c a hàm, cách t tên hàm tuân th theo cách t nh danh và gi ng cách t tên bi n

• tham_s _1, tham_s _2,…là danh sách các tham s u vào c a hàm Tên y c a chúng là các tham s hình th c (formal parameter) 4 ây là

Hình 4.1 mô tả cách khai báo, cài đặt và sử dụng một hàm tính diện tích hình chữ nhật (A) trong C++ Hàm A nhận hai tham số đầu vào là "L" và "B", nó sẽ tính diện tích hình chữ nhật (lưu ý biến) và trả lại kết quả (lành).

Hình 4.1: Ví d v khai báo và s d ng hàm

Vi c khai báo và nh ngh'a (thân hàm) hàm có th tách ra thành hai ph n khác nhau Ta s g p nh ng ví d các ch ơng sau

Biến cục bộ trong một hàm là biến được khai báo trong thân hàm đó, có phạm vi sử dụng chỉ trong hàm Trong chương trình của chúng ta có hai hàm, mỗi hàm khai báo một biến có tên giống nhau Điều này dẫn đến việc có hai biến khác nhau với tên giống nhau, và vì vậy, biến trong hàm này sẽ không ảnh hưởng đến biến trong hàm kia Tức là, đối với máy tính, hai biến này hoàn toàn không liên quan đến nhau.

4.3 Cách s d ng hàm s d ng m t hàm, ta g i tên hàm, theo sau là c p ngo c ơn ch a các giá tr

Hình 4.1) Các giá tr truy n vào cho hàm "c g i là các i s (argument) 5

Nh trong l i g i hàm A ( " , w ) t i Hình 4.1, " và w là các i s M t hàm có th "c g i nhi u l n v i các i s khác nhau

Khi ch ơng trình th!c thi m t l i g i hàm, giá tr c a các i s "c sao chép vào các tham s hình th c t ơng ng, ngh'a là giá tr c a " "c chép vào

Giá trị của biến "L" và "w" được ghi vào "B", phản ánh mã nghĩa hàm "c th!c thi" Cuối cùng, giá trị này sẽ được trả về ngay sau khi thực thi hàm Đồng thời, luồng điều khiển của chương trình cũng quay trở lại vị trí ghi hàm và các lệnh tiếp theo sẽ được thực thi.

4.4 Bi n toàn c c và bi n a ph ơng

Ch ơng 2 ã gi i thi u các khái ni m cơ b n v bi n Trong m c này, ta s bàn k' hơn v các lo i bi n, hi u l!c và ph m vi c a bi n

Chúng ta ã bi t r ng bi n có các thu c tính nh : tên, ki u, kích th c, giá tr Ngoài ra, m i bi n còn có các c i m khác, c th là:

• th i gian s ng: bi n t n t i bao lâu trong b nh

• ph m vi: bi n có th "c s d ng t i nh ng nơi nào trong ch ơng trình

Ph m vi (scope) c a m t bi n là nh ng nơi chúng ta có th s d ng bi n ó

M t bi n có th có ph m vi toàn c c hay ph m vi a ph ơng

Bi n toàn c c và bi n a ph ơng

Ph m vi c a bi n

Ph m vi (scope) c a m t bi n là nh ng nơi chúng ta có th s d ng bi n ó

M t bi n có th có ph m vi toàn c c hay ph m vi a ph ơng

Biến toàn cục (global variable) là biến được khai báo bên ngoài tất cả các hàm, có thể sử dụng trong toàn bộ chương trình, kể cả bên trong các hàm Biến này chỉ có thể được sử dụng sau dòng lệnh khai báo của nó Trong chương trình, có ba loại biến x với phạm vi khác nhau: biến x khai báo trong hàm có phạm vi là hàm; biến x khai báo ngay tại dòng đầu tiên của thân hàm có phạm vi là toàn bộ thân hàm; và biến x khai báo bên trong thân vòng lặp của hàm chỉ có phạm vi bên trong vòng lặp Các biến này hoàn toàn độc lập và không ảnh hưởng lẫn nhau, thể hiện qua các dòng output, trong đó biến x trong vòng lặp thay đổi giá trị trong khi hai biến x còn lại không thay đổi.

Th i gian s ng c a bi n

Trong trường hợp mà cần khai báo thông thường, một biến sẽ được tạo ra khi chương trình chạy và khai báo biến đó, và tồn tại cho đến khi chương trình ra khỏi phạm vi của biến Cụ thể, các biến toàn cục có phạm vi là toàn bộ chương trình, nên chúng được sinh ra và khởi tạo một lần.

"s ng" cho n khi ch ơng trình k t thúc

Các biến địa phương được khai báo theo kiểu thông thường, phạm vi của chúng kéo dài từ khi chương trình bắt đầu khai báo đến khi chương trình kết thúc Do đó, các biến này được tạo ra mới khi chương trình chạy đến phần khai báo biến và bị hủy khi chương trình kết thúc Người ta còn gọi các biến địa phương này là biến tự động.

Biến tĩnh trong C++ là các biến được khai báo với từ khóa "static" Những biến này tồn tại suốt quá trình thực thi chương trình, mặc dù không thể truy cập từ bên ngoài phạm vi của nó Biến tĩnh giữ nguyên giá trị của mình giữa các lần gọi hàm, và do đó, chúng thường được gọi là biến tĩnh (static variable).

Chương trình trong Hình 4.3 minh họa sự khác nhau giữa biến tĩnh và biến thông thường Trong hàm V b D, có hai biến: x là biến tĩnh và F là biến thông thường Cả hai đều được khai báo với giá trị khởi tạo bằng 0 và được in ra màn hình trước khi tăng thêm 1.

Hàm V b D nhận đầu vào là biến x và F, sau đó in ra màn hình một thông báo về giá trị của x và F Kết quả cho thấy x có giá trị bằng 0 trong tất cả các lần gọi hàm, trong khi biến t'nh y được khởi tạo với giá trị 0 Khi gọi hàm V b D, x cũng được khởi tạo với giá trị 0 Tuy nhiên, F chỉ được khởi tạo bằng 0 một lần, và nó không bị hủy khi hàm kết thúc mà vẫn "sống" để cung cấp giá trị cho phép tính cuối cùng trong hàm V b D.

4.5 Tham s , i s , và cơ ch truy n tham s cho hàm

Trong ph n này chúng ta s tìm hi u k' v các cơ ch truy n tham s cho hàm

Có hai cơ chế chính trong truy cập dữ liệu: truy cập giá trị và truy cập tham chiếu Truy cập giá trị cho phép hàm thao tác trên bản sao dữ liệu của nơi gọi hàm, trong khi truy cập tham chiếu cho phép hàm truy cập trực tiếp tới dữ liệu gốc.

Truy n giá tr

Trong cơ ch truy n giá tr hay truy n b ng giá tr (pass-by-value), tham s

Cách truyền biến giá trị trong hàm là quá trình sao chép giá trị của biến vào tham số của hàm, cho phép hàm làm việc với bản sao của biến đó mà không ảnh hưởng đến giá trị gốc Các tham số trong hàm sẽ nhận giá trị từ các biến tương ứng, giúp thực hiện các phép toán mà không làm thay đổi giá trị ban đầu Tất cả các ví dụ trong chương này đều minh họa cách truyền giá trị hiệu quả.

Hình 4.4 minh họa việc tham số hóa hình thức bên trong hàm, cho thấy giá trị của hàm không bị ảnh hưởng bởi biến L (một biến của hàm) Hàm này được sử dụng khi gọi hàm và sau khi thực hiện gọi hàm, giá trị của L vẫn giữ nguyên là 9.

Hình 4.4: Ví d v truy n giá tr cho hàm

Truy n giá tr "c xem là l!a ch n an toàn do nó m b o r ng hàm "c g i s không gây hi u ng ph không mong mu n i v i d li u c a nơi g i hàm

Sử dụng cơ chế truyền giá trị là một khía cạnh quan trọng trong phong cách lập trình C++ Cơ chế này có ưu điểm là giúp chương trình hiệu năng cao hơn nhờ tránh chi phí sao chép dữ liệu Tuy nhiên, việc truyền tham chiếu có thể làm giảm độ an toàn của chương trình do nguy cơ hàm có thể làm rò rỉ dữ liệu của tham số Bài viết này đề cập đến cơ chế mà C++ cung cấp để truyền tham số bằng tham chiếu.

Ch ơng 6 s nói n m t d ng truy n tham chi u khác c thù c a C/C++: con tr%

Trong ngôn ngữ lập trình C++, tham chiếu (reference) là một biến có tên khác của một biến gốc Tham chiếu cho phép thực hiện các thao tác hiệu quả trên biến gốc mà không cần sao chép giá trị Sau khi khai báo, tham chiếu được sử dụng trong chương trình giống như các biến khác, giúp tối ưu hóa hiệu suất và quản lý bộ nhớ.

& b @ k = b U@B; khai báo b @ k là m t tham chi u t i m t bi n ki u có tên b U@B L u ý r ng trong khai báo có d u & Ngoài ra, tham chi u ph i

"c kh i t o ngay khi khai báo, C++ không ch p nh n tình tr ng m t tham chi u không chi u i âu c

Hình 4.5 minh h a cách khai báo và s d ng tham chi u Bi n b @ k

Khai báo (có địa chỉ và vào trực tiếp tên biến) là một tham chiếu tới biến b U@B (stick là một tên gọi khác của USB stick) Mọi tính toán và tác động trên biến b @ k s t ơng t! nh trên biến b U@B và ng "c l i vì thực chất hai biến này là một.

Trong nhiều trường hợp, chúng ta cần thay đổi giá trị của tham số trong hàm số để thay đổi giá trị của biến tương ứng Ví dụ, khi viết một hàm nhập giá trị cho các biến từ bàn phím, chúng ta có thể sử dụng cơ chế truyền tham chiếu Cụ thể, tham số hình thức là một tham chiếu tới biến tương ứng Trong cơ chế này, các sửa đổi đối với tham số hình thức bên trong hàm sẽ được thực hiện trên chính biến dùng cho gọi hàm.

Hình 4.6 minh h a cơ ch truy n tham chi u v i hàm " @ Hàm này nh p hai s nguyên t& bàn phím và l u chúng vào hai tham s và k ( ã

"c khai báo là tham chi u) Vi c l u giá tr vào và k s làm thay ,i giá tr c a i s là các bi n t ơng ng c a hàm

Khác biệt giữa truyền giá trị và truyền tham chiếu là cách khai báo tham số Để truyền tham chiếu, cần có dấu "&" ngay sau tên kiểu dữ liệu trong khai báo tham số đó trong định nghĩa hàm Ví dụ, trong hàm "@", có các dấu "&" tại khai báo của các tham số.

L u ý: Hàm " @ không c n tr v giá tr gì nên nó ã "c khai báo v i t& khóa 6 cho ki u giá tr tr v và không c n có l nh kèm giá tr trong thân hàm

Hình 4.6: Ví d v truy n tham bi n cho hàm

Nh ã nói trên, vi c cho phép hàm "c g i truy nh p tr!c ti p t i d li u c a nơi g i hàm gây nguy cơ hàm "c g i phá r i d li u c a nơi g i hàm

Có cách nào giảm bớt hoang mang về nguy cơ này? Đó là thông qua hướng dẫn Một khi một hướng dẫn "được khai báo là hướng", trình biên dịch sẽ bảo đảm rằng hướng dẫn đó có thể được sử dụng một cách không sai lệch, bất kể nó chịu tác động từ đâu.

Khi khai báo hàm, ta có th t s n m t giá tr m c nh cho các tham s Các l i, n u m t giá tr "c truy n vào tham s thì giá tr m c nh s b b% qua dùng giá tr "c truy n vào

Hình 4.7 minh họa cách khai báo và sử dụng tham số mặc định trong hàm Trong ví dụ, tham số hình thức của hàm có giá trị mặc định là 9 Hàm được định nghĩa với hai tham số cụ thể (w = 1 và z = 5), cho phép người dùng thu được kết quả mong muốn.

"c k t qu là 15 L n g i hàm th hai ch# cung c p i s có giá b ng 1 cho tham s w , còn tham s s nh n giá tr m c nh (9), ta thu "c k t qu là 45

Tham s m c nh

Khi khai báo hàm, ta có th t s n m t giá tr m c nh cho các tham s Các l i, n u m t giá tr "c truy n vào tham s thì giá tr m c nh s b b% qua dùng giá tr "c truy n vào

Hình 4.7 minh họa cách khai báo và sử dụng tham số mặc định trong hàm Tham số hình thức của hàm có giá trị mặc định là 9 Khi gọi hàm, chúng ta chỉ cần cung cấp hai tham số cụ thể (w = 1 và một tham số khác = 5) để nhận được kết quả mong muốn.

"c k t qu là 15 L n g i hàm th hai ch# cung c p i s có giá b ng 1 cho tham s w , còn tham s s nh n giá tr m c nh (9), ta thu "c k t qu là 45

D 1, nh n giá tr m c nh L u ý: s i s truy n vào ph i nhi u hơn ho c b ng s tham s hình th c không "c g$n giá tr m c nh.

Hàm trùng tên

Trong C++, hai hàm có thể có cùng tên nhưng khác nhau về danh sách tham số (function overloading), miễn là số lượng hoặc kiểu dữ liệu của tham số khác nhau Điều này cho phép lập trình viên tạo ra các hàm với cùng tên nhưng thực hiện các tác vụ khác nhau dựa trên các tham số được truyền vào.

Trong C++, có ba hàm khác nhau được ký hiệu là 6 (x, F) Mỗi khi cần định danh một hàm theo tên, trình biên dịch sẽ kiểm tra kiểu dữ liệu của tham số và số lượng đối số trong lời gọi hàm để xác định hàm nào trong ba hàm đã được định nghĩa.

Hình 4.8 minh họa việc khai báo và sử dụng các hàm trùng tên liệt kê Ba hàm "c g i t" được định nghĩa trong hàm với danh sách tham số khác nhau Kết quả chạy chương trình cho thấy trình biên dịch đã gọi đúng hàm cho các bài số khác nhau.

Hình 4.8: Ví d v hàm trùng tên

Các hàm trùng tên "c phân bi t b i ch kí c a hàm Ch kí c a m t hàm bao g m tên c a hàm ó và danh sách ki u tham s theo th t! khai báo

Theo quy tắc của C++, ba hàm có thể khai báo trùng tên nếu chúng có chữ ký khác nhau Điều này có nghĩa là hai hàm trùng tên có thể tồn tại nếu một hàm có danh sách tham số khác biệt, trong khi hàm kia cho phép tất cả các tham số có thể nhận giá trị mặc định Tuy nhiên, tình huống này có thể gây ra sự lẫn lộn do việc không xác định được hàm nào sẽ được gọi trong trường hợp gọi hàm trùng tên.

C++ cho phép sử dụng cơ chế hàm trùng tên, giúp định nghĩa các phiên bản khác nhau cho các phép toán đã có sẵn cho các kiểu dữ liệu không cơ bản Điều này cho phép lập trình viên tạo ra các kiểu dữ liệu phức tạp và viết phép cộng (+) dành riêng cho các kiểu dữ liệu này Nội dung chi tiết về chủ đề này nằm ngoài phạm vi cuốn sách này, người đọc có thể tìm hiểu thêm tại [2].

Hàm quy

Trong lĩnh vực ví dụ về hàm số, chúng ta đã tìm hiểu về khái niệm hàm quy Hàm quy là một loại hàm mà giá trị của nó không thay đổi khi áp dụng chính nó, mà thông qua một hàm khác Điều này cho thấy sự liên kết giữa các hàm số trong toán học, mở ra nhiều ứng dụng và khái niệm mới trong việc nghiên cứu hàm số.

Dùng hàm này có thể biểu diễn các thuật toán quy nạp một cách hiệu quả hơn cho bài toán và các bài toán tương tự, nhưng với kích thước nhỏ hơn Đây là chi phí tối ưu, và sẽ được nhấn mạnh một cách rõ ràng hơn trong các môn học cao hơn của ngành.

Khoa h c Máy tính Ph n này ch# gi i thi u v quy m c ơn gi n nh t

Ví d i n hình th ng "c dùng minh h a cho hàm quy là bài toán tính giai th&a c a m t s Giai th&a c a n "c tính theo công th c quy: n! = n * (n-1) * (n-2) * (n-3) * 1 t ơng ơng v i: n! = n * (n-1)!

Ngh'a là, gi s f(n) là giai th&a b c n, f(n) "c nh ngh'a nh sau: f(0) = 1 f(n) = n * f(n-1)

Trong ó, dòng th nh t là tr ng h"p cơ b n, dòng th hai là công th c quy

Hàm quy trong C++ là một khái niệm quan trọng, giúp tính toán giá trị của các biểu thức phức tạp Ví dụ, hình 4.9 mô tả cách hàm quy tính giá trị của n! Hàm này thực hiện việc giải quyết bài toán một cách hiệu quả Trong trường hợp n còn lại lớn hơn 1, hàm quy sẽ tính giá trị của n! bằng cách sử dụng công thức đệ quy, với kết quả cuối cùng là tích của n và (n-1)!.

Trong hai phần chính của hàm quy, trạng hợp cơ bản đóng vai trò rất quan trọng Nếu thiếu hoặc có sự sai sót trong trạng hợp này, chương trình có nguy cơ rơi vào vòng lặp vô tận Việc đảm bảo tính chính xác của trạng hợp cơ bản là cần thiết để chương trình hoạt động hiệu quả.

Hình 4.9: Ví d v hàm quy tính n!

Trong chương trình tính giai thừa, kiểu dữ liệu cho hàm tính giai thừa rất quan trọng Giá trị của giai thừa tăng nhanh chóng, chẳng hạn như 10! đạt giá trị 3628800 Nếu sử dụng kiểu dữ liệu 4 byte trong C++, giai thừa của 16 sẽ vượt quá giới hạn giá trị Do đó, kiểu dữ liệu cho giá trị giai thừa cần có kích thước lớn hơn để đảm bảo tính chính xác.

Việc tính một hàm nhận tham số đầu vào là 5 số nguyên, và trả về kết quả là trung bình cộng của 5 số nguyên đó.

2 Hãy tìm nh ng hàm trùng nhau trong danh sách các hàm sau

- int foo (int student, float teacher)

3 Khi nào thì nên truy n i s cho hàm theo ki u truy n giá tr , khi nào thì nên truy n theo ki m tham chi u?

Chương trình có một hàm với 5 tham số, trong đó 3 tham số có giá trị cố định là 13, 25 và 35 Cần tìm và liệt kê tất cả các cặp số có tổng bằng một giá trị nhất định.

5 Vi t ch ơng trình v i m t hàm getMin tính giá tr nh% nh t c a 3 s Hàm trên d!a vào hàm getMin tính giá tr nh% nh t c a hai s L u ý, hai hàm này trùng tên

6 Nh p t& bán phím m t s nguyên x, hãy tính và hi n ra màn hình giá tr c(n b c hai c a x và e x

7 Tìm hi u hàm rand sinh ra các s ng u nhiên Hãy vi t ch ơng trình sinh ra 9 s nguyên ng u nhiên n m trong ph m vi t& 2 n 99

8 Dãy s Fibonacci "c tính nh sau:

Hãy vi t ch ơng trình v i hàm quy tính (k), v i k là giá tr nh p

Ch ơng 5 M ng và xâu kí t

Các kiểu dữ liệu cơ bản được giới thiệu trong Chương 2 không chỉ biểu diễn các loại dữ liệu mà còn phục vụ cho các bài toán thực tiễn Ví dụ, khi chương trình cần lưu trữ và xử lý một chuỗi các phần tử dữ liệu cùng kiểu, như danh sách sinh viên trong trường học hoặc danh sách điểm thi của một sinh viên, các thao tác như sắp xếp, tìm kiếm và tính toán các con số thống kê trên chuỗi dữ liệu đó là rất quan trọng Các ngôn ngữ lập trình cung cấp các kiểu dữ liệu có cấu trúc phù hợp với các nhiệm vụ này, trong đó, mảng là cấu trúc dữ liệu thông dụng nhất.

M ng m t chi u

Kh i t o m ng

Khi khai báo m t m ng, ta có th kh i t o giá tr cho các ph n t c a m ng theo cách sau:

N u không "c kh i t o, các ph n t c a m ng s có giá tr không xác nh cho n khi ta gán cho chúng m t giá tr nào ó

5.1.2 Trách nhi m ki m soát tính h$p l c a ch% s m ng i v i m ng "c khai báo v i kích th c n, ch# s c a các ph n t trong m ng ó là các s nguyên t& 0 n n–1 Ngoài ra, các giá tr khác u không h"p l Vi c truy nh p m ng b ng các ch# s không h"p l , ch.ng h n khi truy nh p n U-1V hay U V, có th d n n các thay ,i không mong mu n i v i d li u vùng b nh bên ngoài m ng (có th thu c v các bi n khác) Trong nhi u ngôn ng l p trình, vi c này "c ki m soát t! ng tránh tr ng h"p truy nh p v i ch# s không h"p l Tuy nhiên, trong C++ vi c truy nh p n các ph n t c a m ng v i ch# s nh% hơn 0 ho c l n hơn n–1 không h ph m l i cú pháp, vi c truy nh p ra ngoài m ng không gây l i khi d ch nh ng có th gây l i khi ch y, l p trình viên có trách nhi m ki m soát các giá tr ch# s m ng tránh tr ng h"p này

Hình 5.1: Ví d v khai báo và s d ng m ng

5.1.3 M ng làm tham s cho hàm

Có thể sử dụng tham số cho hàm Hình 5.2 thể hiện kết quả của việc sửa đổi chương trình trong Hình 5.1, với hai nhiệm vụ và nhập dữ liệu cho hàm, đồng thời tính giá trị trung bình trong hai hàm và truyền tham số vào trong hai hàm đó.

Khi cần quy định rõ ràng một hàm không có tham số nào, chúng ta có thể sử dụng từ khóa `void` trong C++ Để khai báo một hàm không có tham số, bạn chỉ cần định nghĩa hàm với từ khóa `void`, ví dụ như `void tenHam()` Điều này giúp đảm bảo rằng hàm không nhận bất kỳ tham số nào khi được gọi.

Kết quả của quá trình biên dịch sẽ không chỉ phụ thuộc vào các dòng lệnh mà còn vào giá trị của các tham số bên trong hàm Do đó, việc sử dụng từ khóa cho tất cả các tham số mà hàm không có nhu cầu thay đổi là rất cần thiết.

M ng làm tham s cho hàm

Có thể sử dụng tham số cho hàm Hình 5.2 thể hiện kết quả của việc sửa đổi chương trình trong Hình 5.1, bao gồm hai nhiệm vụ và nhập dữ liệu cho hàm Đồng thời, tính giá trị trung bình vào hai hàm và truyền tham số vào trong hai hàm đó.

Khi cần quy định rõ ràng một hàm không có tham số nào, ví dụ như không nên cho hàm 6 quy định tham số, C++ cung cấp từ khóa "void" Ta sẽ sửa phần khai báo tham số của hàm thành "void" để chỉ định rằng hàm không nhận tham số nào.

Kết quả của quá trình biên dịch sẽ không chỉ phụ thuộc vào các dòng lệnh mà còn vào giá trị của các tham số bên trong hàm Do đó, việc sử dụng từ khóa cho tất cả các tham số mà hàm không cần thay đổi là rất quan trọng.

Hình 5.2: Ví d v m ng làm tham s c a hàm.

M ng nhi u chi u

C u trúc m ng có th có nhi u hơn m t chi u Ví d , l u m t bàn c ca-rô,

B)AAD5B:DDH = >6; b UB)AAD5H.:NHDVUB)AAD5B:DDHV;

Ta dùng hai ch# s hàng và c t truy nh p t&ng ph n t trong m ng, ví d : b U11VU>V = 'x';

C)ng nh m ng m t chi u, m ng nhi u chi u c)ng có th dùng làm tham s cho hàm

L u ý, khi khai báo m ng nhi u chi u nh là tham s c a hàm, chúng ta ph i khai báo kích th c t t c các chi u c a m ng, ngo i tr& chi u u tiên có th b% tr ng

6 B ( b UVU@ A 05B:DDHV); là m t khai báo h"p l , còn

6 B ( b UVUV); là m t khai báo không h"p l

Xâu kí t!

Tìm ki m và s$p x p d li u trong m ng

Tìm ki m tuy n tính

Thuật toán tìm kiếm tuyến tính (linear search) duyệt từng phần tử trong mảng, so sánh khóa với mỗi phần tử Khi gặp phần tử khớp với khóa, thuật toán kết thúc và trả về chỉ số của phần tử đó Nếu duyệt hết mảng mà vẫn không tìm thấy phần tử nào khớp với khóa, thuật toán kết luận rằng kết quả là chỉ số mảng của phần tử đó (trong mảng C++ ánh xạ 0, kết quả của thuật toán trong trường hợp này sẽ là 4).

Hình 5.5: Ví d v tìm ki m tuy n tính

Ch ơng trình trong Hình 5.5 minh h a thu t toán tìm ki m tuy n tính trong

Tìm ki m nh phân

Thuật toán tìm kiếm tuyến tính có độ phức tạp O(n), dẫn đến hiệu quả không cao với dữ liệu lớn Ngược lại, tìm kiếm nhị phân (binary search) là một thuật toán tìm kiếm có độ phức tạp thấp hơn, mang lại hiệu quả cao hơn Bên cạnh đó, nó còn tối ưu hóa việc truy cập dữ liệu.

Thuật toán tìm kiếm nhị phân hoạt động như sau: đầu tiên, nó xác định 5 lần lặp ưu tiên, lấy phần tử giữa của mảng Nếu phần tử giữa khớp với khóa, thuật toán kết thúc Nếu giá trị giữa lớn hơn khóa, thuật toán sẽ tiếp tục tìm kiếm trong phần mảng bên trái Ngược lại, nếu giá trị giữa nhỏ hơn khóa, tìm kiếm sẽ diễn ra trong phần mảng bên phải Quá trình này lặp lại cho đến khi tìm thấy phần tử có giá trị bằng khóa hoặc phạm vi tìm kiếm giảm xuống còn một mảng có kích thước bằng 0.

Trong bài viết này, chúng ta sẽ tìm phần tử có giá trị 10 trong mảng {1, 3, 4, 7, 10, 12, 15} Đầu tiên, ưu tiên thuật toán tìm kiếm phần tử gần nhất với giá trị 7 và so sánh với 10 Do 7 nhỏ hơn 10, thuật toán sẽ tìm kiếm qua các phần tử trong mảng, nhằm mục tiêu tìm kiếm hiệu quả phần tử gần nhất với giá trị 10 Kết quả cuối cùng sẽ là thuật toán tìm kiếm phần tử gần nhất với giá trị 10 trong mảng {10, 12, 15}.

So sánh giữa khóa 12 và khóa 10 cho thấy khóa 12 lớn hơn khóa 10, dẫn đến việc tìm kiếm phần tử trong tập {10, 12, 15} sẽ cho kết quả là 10 Để tìm kiếm phần tử có giá trị 10 trong mảng, thuật toán cần xác định vị trí của nó Trong trường hợp này, phần tử cần tìm là duy nhất và có giá trị trùng với khóa, do đó thuật toán kết thúc khi tìm thấy phần tử có giá trị 10.

Thu t toán "c minh h a trong ch ơng trình Hình 5.6

Hình 5.6: Ví d v tìm ki m nh phân

Sắp xếp chọn (selection sort) là một trong những thuật toán sắp xếp đơn giản nhất trong mảng Thuật toán hoạt động bằng cách tìm phần tử nhỏ nhất trong mảng và tráo đổi với phần tử ở vị trí cuối cùng, dần dần đưa phần tử nhỏ nhất vào vị trí cuối mảng Kết quả cuối cùng của thuật toán là mảng được sắp xếp theo thứ tự tăng dần.

Hình 5.7 minh h a thu t toán s$p x p ch n

1 Nh p vào m t danh sách các s nguyên t& bàn phím Hãy th!c hi n các nhi m v sau và ghi k t qu ra màn hình

- Tìm s l n nh t trong danh sách

- Tìm s nh% nh t trong danh sách

- Tính trung bình c ng các s trong danh sách

- S$p x p danh sách theo th t! t(ng d n

2 Nh p vào t& bàn phím danh sách tên các b n sinh viên trong l p Hãy tìm hi u và cài t thu t toán s$p x p ch n (selection sort) s$p x p danh sách tên theo th t! t(ng d n Hi n danh sách sau khi ã s$p x p ra màn hình

3 Nh p vào t& bàn phím m t danh sách các s nguyên Hãy li t kê ra t t c các b s (a, b, c) mà t,ng c a chúng b ng 25

4 M t qu i "c chia thành m t l i ô vuông có kích th c m*n ô vuông M i ô vuông ch a m t s nguyên i di n cho cao t i ô vuông ó Hãy tìm:

- Ô vuông có cao nh% nh t

- T t c các hình vuông có kích th c 3*3, mà ô vuông gi a cao hơn các ô vuông xung quanh

- T t c các hình vuông có kích th c 3*3, mà ô vuông gi a th p hơn các ô vuông xung quanh

5 Nh p vào t& bàn phím m t xâu kí t! S d ng ki u d li u UV trong C++ ghi ra màn hình các k t qu sau:

6 Nh p m t danh sách tên các b n sinh viên trong l p, hãy m xem có bao nhiêu b n có tên v i ch cái b$t u là ‘T’, ‘C’, ‘V’, ‘A’, ‘Q’ Tìm tên có s b n trùng nhau là nhi u nh t

7 Nh p m t xâu ký t! t& bàn phím là danh sách tên các sinh viên Hai tên ng li n nhau "c cách nhau b i ít nh t m t d u cách Hãy tính xem có bao nhiêu sinh viên trong danh sách Ví d :

D li u vào K t qu t ơng ng

Vinh tuan vinh blah blah 5

8 Nh p m t xâu ký t! t& bàn phím Hãy chu-n hoá xâu b ng cách lo i b% các ký t! không ph i ch cái, d u cách, d u ph y, d u ch m Các t& cách nhau b i úng m t d u cách và ch# vi t hoa ch cái u tiên Ví d :

D li u vào K t qu t ơng ng tOi te1N !LA ng2uyen v3an aN; Toi Ten La Nguyen Van An

Ch ơng 6 Con tr' và b nh

Con tr% là một công cụ quan trọng trong các ngôn ngữ lập trình bậc cao như C và C++, cho phép chương trình quản lý và tương tác trực tiếp với biến Công cụ này giúp chương trình trở nên linh hoạt và hiệu quả hơn Tuy nhiên, việc sử dụng con tr% cũng có thể dẫn đến sai sót và khó phát hiện lỗi.

6.1 B nh máy tính hi u v con tr%, tr c tiên ta s tìm hi u v b nh máy tính Ta có th hình dung b nh máy tính là m t lo t các ô nh n i ti p nhau, m i ô nh có kích th c nh% nh t là m t byte Các ô nh ơn này "c ánh s liên t c, ô nh sau có s th t! hơn s th t! c a ô nh li n tr c là 1 T c là ô nh 1505 s ng sau ô nh 1504 và ng tr c ô nh 1506 (xem Hình 6.1)

Hình 6.1: Bi n ee i – xâu kí t "Hello"– trong b nh

Bi n trong m t ch ơng trình là tên c a m t vùng b nh "c dùng l u d li u Vi c truy nh p d li u t i các ô nh ó "c th!c hi n thông qua tên bi n

T c là, ta không ph i quan tâm n v trí v t lý c a ô b nh

Khi m t bi n "c khai báo, ph n b nh c n thi t s "c c p phát cho nó t i a ch# b nh

Trong C++, để sử dụng toán tử tham chiếu, chúng ta sử dụng ký hiệu "&" Khi áp dụng toán tử này trước tên của biến, chúng ta sẽ nhận được một biểu thức có giá trị là địa chỉ của biến đó trong bộ nhớ Ví dụ:

Trong th!c t , tr c khi ch ơng trình ch y, chúng ta không th bi t "c a ch# c a bi n

Biến con trỏ là một loại biến đặc biệt, dùng để lưu giữ địa chỉ của một ô nhớ Cụ thể, giá trị của nó là địa chỉ của ô nhớ trong bộ nhớ Hay nói một cách hình tượng, biến con trỏ chính là một ô nhớ trong bộ nhớ Biến con trỏ được khai báo như sau: `data_type *ptr;`, trong đó `data_type` là kiểu của dữ liệu được lưu trong ô nhớ mà con trỏ `ptr` sẽ trỏ đến Để truy cập dữ liệu tại ô nhớ mà biến con trỏ trỏ đến, ta sử dụng toán tử `*`.

Hình 6.3 minh h a v vi c khai báo và s d ng bi n con tr% Trong ví d , ta khai báo m t bi n con tr% A dùng l u gi a ch# ô nh c a bi n

A = & ; s gán a ch# c a bi n cho bi n con tr% A và t o hi u ng t ơng t! nh trong Hình 6.2 a ch# b nh

N i dung ô nh c3 4 byte Tên bi n

L u ý, các tác ng trên ô nh "c ch# n b i bi n con tr% A c)ng chính là các tác ng "c th!c hi n trên bi n apples và ng "c l i C th là l nh

++; s t(ng giá tr c a bi n lên m t, ng ngh'a v i vi c t(ng giá tr ô nh do bi n con tr% A ch# n lên 1

/ A += 1; s t(ng giá tr t i ô nh mà bi n con tr% A thêm 1, ng ngh'a v i vi c t(ng giá tr c a bi n thêm 1

Hình 6.3: Khai báo và s d ng bi n con tr

M ng và con tr% có liên h ch t ch v i nhau Gi s , khi khai báo m t m ng

S$p x p ch n

ta ã khai báo m t vùng nh liên ti p g m 7 ô, m i ô ch a m t s nguyên

Trong một số ngôn ngữ lập trình bậc cao như C++, có thể sử dụng con trỏ Cụ thể, biến con trỏ có thể được coi là một biến con trỏ trỏ tới ô nhớ tiên trong biến Để truy cập đến phần tử có chỉ số trong mảng, ta có thể sử dụng con trỏ.

U V ho c /( + ) Ví d , / và U1V u có ý ngh'a là ph n t u tiên trong m ng Cách dùng con tr% thao tác v i m ng "c minh h a trong Hình 6.4

Hình 6.4: S d ng m ng nh con tr

B nh ng

C p phát b nh ng

Khi m t bi n con tr% "c khai báo, ví d

Giá trị của biến con tr % A chưa được xác định, nghĩa là nó chưa được gán vào một vùng nhớ cụ thể nào Chúng ta có thể xin cấp phát một vùng nhớ mới, và vùng nhớ này sẽ được quản lý (trong thời gian) bởi biến con tr % A bằng cách sử dụng toán tử cấp phát động.

Lệnh này sẽ cập nhật một vùng nhạy cảm, ảnh hưởng đến vùng nhạy cảm này có thể gây ra biến động Quá trình cập nhật vùng nhạy cảm này thực hiện trong quá trình chạy chương trình và được gọi là cập nhật vùng nhạy cảm.

Sau khi xin c p phát, ta có th ti n hành l u gi , c p nh t giá tr vùng nh này thông qua a ch# c a nó (hi n l u t i bi n A ).

Gi i phóng b nh ng

Do l "ng b nh ng là có h n, d li u t trong b nh ng nên "c gi i phóng khi dùng xong dành b nh cho các yêu c u c p phát ti p theo

Khi chúng ta không s d ng n vùng nh này n a, chúng ta nên gi i phóng vùng nh này b ng toán t , ví d nh sau

Vùng nh mà bi n con tr% ptrApples tr% t i s "c gi i phóng và có th "c tái s d ng cho m t l n c p phát b nh ng khác

Hình 6.5 minh h a v vi c c p phát, s d ng, và gi i phóng b nh ng

Hình 6.5: C p phát, s d ng và gi i phóng b nh ng

Lưu ý: Nếu vì sơ suất của ng i lập trình hay lý do nào đó mà tìm thấy thời điểm nào đó chương trình không còn lưu học, có cách nào tính ra ảnh hưởng của một vùng như "cấp phát", thì vùng này được xem là "mất" Nghĩa là chương trình không có cách gì truy cập hay giải phóng vùng nhớ này nữa, nó sẽ chịu hành thu hồi sau khi chương trình kết thúc Ví dụ, trong chương trình sau, làm thế nào thoát phần nhớ "cấp phát" do lệnh malloc thành công:

M ng ng và con tr%

Trong các chương trình ví dụ như trắc nghiệm, kích thước của mảng phải được xác định trước khi khai báo Cụ thể, kích thước của mảng là một thông số quan trọng cho cách thức hoạt động của mảng đó, bao gồm kích thước mảng và việc cấp phát bộ nhớ cho mảng được xác định và tiến hành trong quá trình chạy chương trình Việc khai báo mảng thường được tiến hành thành hai bước.

1 Khai báo con tr' m ng: Tr c tiên, khai báo m t bi n con tr%: data_type / array_name ; trong ó data_type là ki u d li u c a m ng, array_name là tên m ng

Sau khi khai báo, chúng ta xin cấp phát bộ nhớ cho biến con trỏ bằng cách sử dụng cú pháp: array_name = new data_type [size] Hệ thống sẽ cấp cho chương trình một vùng nhớ liên tiếp có thể chứa "size" phần tử có kiểu data_type Địa chỉ của phần tử đầu tiên sẽ được gán cho biến array_name Lưu ý, size có thể là một hằng số hoặc một biến.

Sau khi phát biểu thành công, ta có thể truy cập biến con trỏ `array_name` như một mảng thông thường với kích thước phần tử Cụ thể, để truy cập phần tử thứ i trong mảng, ta sử dụng cú pháp `array_name[i]`.

Giải phóng bộ nhớ: Khi không còn sử dụng mảng động, chúng ta cần thực hiện việc giải phóng bộ nhớ bằng cách sử dụng toán tử delete [] với cú pháp như sau: delete [] array_name;

Khi giải phóng bộ nhớ cho một mảng, nếu sử dụng lệnh `delete array_name;`, chỉ ô nhớ `array_name[0]` sẽ được giải phóng, trong khi các ô nhớ tiếp theo của mảng sẽ không được giải phóng.

Hình 6.6 minh họa việc sử dụng mảng động tính toán, trong đó người dùng có thể nhập danh sách sinh viên qua bàn phím Số lượng "sinh viên" không được xác định trước mà được người dùng nhập vào, cho phép linh hoạt trong việc quản lý dữ liệu.

( nt nt = 0; nt n e e ; nt++) t %.nte t e e % nt %$ %; n e [ nt]; nt t t lT = 0;

( nt nt = 0; nt n e e ; nt++) t t lT += e [ nt]; t %D t l $ % t t lT endl;

Hình 6.6: M ng ng và con tr

Truy n tham s là con tr%

Ngoài hai ph ơng pháp truy n d li u vào trong hàm ã "c gi i thi u trong

M c 4.5, truy n tham s là giá tr và truy n tham s là tham chi u t i i s C++ cho phép sử dụng phương pháp thứ ba: truy n tham s là con tr% Trong Hình 6.7, biến con tr% được sử dụng để truyền vào hàm "etT" và nó là để tạo ra "n e e e td".

( nt nt = 0; nt n e e ; nt++) t %.nte t e e % nt %$ %; n e [ nt]; nt l l teT ( n t nt * e 2 nt n e e ) nt t t lT = 0;

( nt nt = 0; nt n e e ; nt++) t t lT += e [ nt]; et n t t lT ; nt n( nt " 2 * "6[]) nt n e e ; t %.nte t e n e e $ %; n n e e ; nt * e ; e = new nt[n e e ];

"etT ( e 2 n e e ); nt t t lT = l l teT ( e 2 n e e ); t %D t l $ % t t lT endl; delete e ; et n 0;

Hình 6.7: Tham s c a hàm là con tr

Trong trường hợp này, chúng ta muốn sử dụng con trỏ truyền vào hàm để không cho hàm sửa đổi dữ liệu Để thực hiện điều này, ta có thể dùng từ khóa `const` để lập quyền cho hàm đối với tham số Ví dụ, trong hàm `l_l_teT`, từ khóa `const` được đặt phía trước tham số `hình_nt_l_l_teT (const nt *e)`, quy định rằng hàm `l_l_te` phải coi dữ liệu `nt` mà `e` trỏ tới là hằng và không được phép sửa đổi.

V cách s d ng t& khóa n t khi khai báo m t bi n con tr%, ta có 4 l!a ch n:

1 không quy nh con tr% hay d li u "c tr% t i là h ng l t * t ;

2 quy nh d li u "c tr% t i là h ng, con tr% thì "c s a ,i n t l t * n t t ;

3 quy nh d li u tr% t i không ph i là h ng, nh ng bi n con tr% thì là h ng l t * n t t ;

4 quy nh c con tr% l n d li u nó tr% t i u là h ng n t l t * n t t ;

Sử dụng ngữ nghĩa cho những hoàn cảnh thích hợp là một phần quan trọng của phong cách lập trình tốt Nó giúp giảm quyền hạn của hàm, từ đó cải thiện khả năng bảo trì và tính toán dữ liệu Khi một hàm chỉ có trách nhiệm xử lý dữ liệu mà không nên có quyền sửa đổi dữ liệu, điều này sẽ giảm nguy cơ của hiệu ứng phụ không mong muốn.

Khi làm việc với biến con tr%, cần lưu ý rằng giá trị của nó có thể là null hoặc không xác định do chưa được gán Nếu con tr% có giá trị null hoặc không xác định, việc truy cập vào nó có thể dẫn đến lỗi run-time hoặc logic trong chương trình Do đó, cần kiểm tra giá trị của các biến con tr% và đảm bảo rằng chúng đã được gán giá trị trước khi truy cập Ngoài ra, nên sử dụng tham chiếu thay vì con tr% bất cứ khi nào có thể để giảm thiểu rủi ro.

1 Trình bày s! khác bi t, u i m, nh "c i m gi a bi n t'nh và bi n ng

2 Tính giá tr c a le , * t A , * t A 2 c a o n mã sau: nt le ; nt * t A = & le ; nt * t A 2 = t A ; le += 2;

3 Xác nh k t qu c a o n mã sau: nt * 1 = new nt; nt * 2;

4 Nh p t& bàn phím vào m t danh sách các s nguyên Hãy s d ng c u trúc m ng ng l u gi dãy s nguyên này và tìm s l "ng s nguyên chia h t cho s nguyên u tiên trong dãy

5 Trình bày m i quan h gi a m ng và con tr%

6 Phân tích s! khác bi t, nh "c i m, u i m c a vi c s d ng m ng ng và m ng t'nh

Sử dụng cấu trúc mảng để lưu trữ danh sách tên các sinh viên nhập vào từ bàn phím Hãy sắp xếp danh sách tên sinh viên theo thứ tự tăng dần dựa trên độ dài của tên Hiển thị danh sách đã được sắp xếp lên màn hình.

8 M t bàn c có kích th c m*n ô vuông Tr ng thái trên m i ô vuông

"c bi u di+n b i m t kí t! in th ng t& ‘A’ n ‘Z’ S d ng m ng ng hai chi u l u gi tr ng thái c a bàn c nh p t& bàn phím Tìm và hi n ra màn hình:

• Các hàng th%a mãn i u ki n t t c các ô cùng m t tr ng thái

• Các c t th%a mãn i u ki n t t c các ô cùng m t tr ng thái

• Các ng chéo th%a mãn i u ki n t t c các ô cùng m t tr ng thái

Ch ơng 7 Các ki u d li u tr u t $ng

Các kiểu dữ liệu cơ bản trong lập trình là những thành phần quan trọng để giải quyết bài toán Thông thường, chúng ta cần kết hợp một vài thành phần dữ liệu có liên quan để biểu diễn một phần dữ liệu phức hợp hơn.

• D li u c n thi t mô t m t ngày (D te) g m 3 thành ph n: ngày, tháng, n(m Ví d , d li u v ngày Qu c khánh c a Vi t Nam g m 3 thành ph n: 2 (ngày), 9 (tháng), 1945 (n(m)

• D li u c n thi t mô t St dent bao g m ba thành ph n: t dentN e thu c ki u nt, t d y thu c ki u D te, n e thu c ki u [50]

Kiểu dữ liệu trừu tượng là kiểu dữ liệu phù hợp cho các thành phần dữ liệu thuộc các kiểu dữ liệu khác nhau, cho phép chúng ta định nghĩa các kiểu dữ liệu mới Điều này đặc biệt hữu ích trong việc xử lý các kiểu dữ liệu như Date và Student Đối với mỗi kiểu dữ liệu trừu tượng, chúng ta cần định nghĩa một loạt các thao tác xử lý dữ liệu cho nó Ví dụ, với kiểu dữ liệu Date, có thể cần thực hiện các thao tác như in ra màn hình, tính toán ngày hôm qua, ngày mai, và khoảng cách giữa hai ngày.

Các ngôn ngữ lập trình bậc cao được chia thành hai loại chính: ngôn ngữ lập trình hướng thủ tục và ngôn ngữ lập trình hướng đối tượng Mỗi loại ngôn ngữ này có những đặc điểm và cách tiếp cận khác nhau trong việc phát triển phần mềm.

• i v i các ngôn ng l p trình h ng th t c, các ki u d li u có c u trúc ch# d&ng l i vi c óng gói các thành ph n d li u có liên quan l i v i nhau

Ph n x lý d li u "c t t i các hàm và th t c c l p

Các ngôn ngữ lập trình hướng đối tượng cho phép đóng gói các hàm xử lý dữ liệu vào trong kiểu dữ liệu, coi chúng như là một phần không thể tách rời của kiểu dữ liệu Trong các ngôn ngữ này, kiểu dữ liệu trừu tượng được gọi là các lớp (class).

7.1 nh ngh a ki u d li u tr u t $ng b ng c u trúc struct là c u trúc t t Ví d , ki u d li u tr&u t "ng D e có th "c nh ngh'a nh sau trong C++: t t D e nt ; nt n te; nt e nd;

Trong ó, , n te, e nd là các tr ng hay các thành viên d li u c a c u trúc D e

Chú ý rằng các trường thuộc cùng một cấu trúc có thể mang tên khác nhau, mặc dù có thể trùng tên với các trường của cấu trúc khác Bên cạnh đó, phần nhấn mạnh nghĩa của một cấu trúc phải kết thúc bằng một dấu chấm phẩy.

Sau khi ã nh ngh'a ki u d li u D e, ta có th s d ng nó y nh các ki u d li u khác Ta có th khai báo bi n, m ng, con tr%, tham chi u ki u D e, ví d :

L u ý: m c dù cùng dùng t& khóa t t, nh ng t t c a C++ không t ơng ơng v i t t c a ngôn ng l p trình C

Trong C++, biến thuộc kiểu dữ liệu cấu trúc cho phép chúng ta định nghĩa các kiểu dữ liệu phức tạp Chúng ta có thể thực hiện phép gán giá trị của biến này cho biến khác, ví dụ: `nt ent[1] = d nne D e;`.

Giá trị của các thành viên dữ liệu trong cấu trúc D được sao chép vào các thành viên dữ liệu tương ứng của nội dung Cần lưu ý rằng phép gán trong C++ là phép gán nông, có nghĩa là chỉ có giá trị của các thành viên được sao chép.

C sao chép là một khái niệm quan trọng trong việc quản lý dữ liệu, đặc biệt là trong các trường hợp liên quan đến việc sử dụng các thành viên của biến Việc sử dụng toán tử "c" giúp hiển thị thông tin trên màn hình, cho phép người dùng dễ dàng truy cập và tương tác với dữ liệu Ví dụ, bạn có thể in thành viên của biến D e hoặc sử dụng toán tử t t eRe để thực hiện các thao tác khác nhau trên dữ liệu.

Trong ó t ePt ang ch a a ch# c a bi n d nne D e, còn t eRe là m t tham chi u c a bi n d nne D e

Biểu thức toán học (*t ePt) cho phép chúng ta xác định các biến dừng D e, dẫn đến ba biểu thức chính (*t ePt), dừng D e và t ePt - tương ứng với nhau Ngoài ra, các phép toán trong biểu thức (*t ePt) cần thiết phải tuân thủ quy tắc không "cấu trúc bậc toán t -".

Hình 7.1 minh h a cách khai báo và s d ng t t khai báo c u trúc d li u D e C)ng nh các ki u d li u khác, ki u d li u có c u trúc c)ng có th

Trong bài viết này, chúng ta sẽ tìm hiểu về cách truyền tham số vào các hàm Cụ thể, chương trình sẽ in ra một giá trị kiểu D e trên màn hình, với tham số được truyền vào là một tham chiếu tới biến D e Tham số của hàm này quy định rằng nó là một tham chiếu (t& khóa n t) và hàm không có quyền sửa đổi dữ liệu nằm trong biến kiểu D e được truyền vào.

nh ngh'a ki u d li u tr&u t "ng b ng c u trúc class

Quy n truy nh p

Khi khai báo m t l p i t "ng, chúng ta mong mu n phân quy n truy nh p và s d ng d li u c)ng nh các hàm c a l p ó T c là, m t s d li u hay hàm

Truy cập và sử dụng rộng rãi các hàm thuộc tính là điều cần thiết trong lập trình Tuy nhiên, chúng ta cũng cần chú ý đến một số dữ liệu hay hàm "có bảo vệ" khi truy cập và sử dụng từ bên ngoài Cụ thể, chỉ những hàm thu thuộc tính mới được phép truy cập và sử dụng, trong khi các hàm bên ngoài không thuộc tính sẽ không được phép truy cập và sử dụng.

Các ngôn ng l p trình h ng i t "ng cung c p cho chúng ta cơ ch phân quy n nh v y

Nhãn quy n truy nh p (member access specifier) quy nh quy n truy nh p n các thành viên c a l p Trong s ó có hai lo i th ng "c s d ng là:

Hàm thu c công c ng ("public") cho phép truy cập và sử dụng rộng rãi bởi tất cả các hàm thu c khác, bất kể chúng có thuộc lớp nào hay không Ví dụ, trong Hình 7.4, hàm nt c a lớp "Time" là một hàm public, cho phép người dùng gọi nó thông qua các biến định nghĩa.

( dn " t nt) hay d nne D e (d nne D e nt)

• private: D li u hay hàm thu c lo i riêng t ( "c khai báo d i nhãn

Các hàm thành viên thuộc lớp có thể được truy cập và sử dụng, trong khi các hàm bên ngoài không thuộc lớp thì không được phép truy cập Hình 7.4 minh họa rằng các biến, như n te, e nd, và hàm 8 l d, là thành viên của lớp và có thể được truy cập trực tiếp Ngược lại, bên trong hàm n, không thể truy cập vào các biến n te, e nd hay hàm 8 l d Các lệnh sau đây không hợp lệ và có thể gây lỗi khi biên dịch: d nne D e = 1S; d nne D e 8 l d(10232

Ngày đăng: 17/12/2023, 10:08

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w