intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Ngôn ngữ lập trình C - Chương 4

Chia sẻ: Nguyen Nhi | Ngày: | Loại File: PDF | Số trang:0

156
lượt xem
27
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tài liệu tham khảo bài giảng về Ngôn ngữ lập trình C++ gồm 7 chương - Chương 4 Hàm và phương pháp lập trình thủ tục

Chủ đề:
Lưu

Nội dung Text: Ngôn ngữ lập trình C - Chương 4

  1. Ch−¬ng 4 Ch Hμ m v μ ph−¬ng ph¸p lËp tr×nh thñ tôc
  2. 4.1 C++ và phương pháp lËp tr×nh thñ tôc 4.1.1 Tổng quan về phương pháp lập trình thủ tục – Phương pháp lập trình tuyến tính (hay lập trình tuần tự): • Khi các ứng dụng tin học còn đơn giản, số dòng lệnh phải viết ít chương trình được viết tuần tự. – Các câu lệnh thực hiện tuần tự từ đầu đến cuối. • Khoa học máy tính phát triển, phần mềm lớn và phức tạp: – Phương pháp này không hiệu quả. – Người lập trình có thể không thể kiểm soát được chương trình. – Phương pháp lập trình thủ tục (hay lập trình cấu trúc) • Khắc phục nhược điểm của lập trình tuần tự bằng cách tổ chức chương trình thành các chương trình con. • Các ngôn ngữ như FoxPro, Pascal hay C/C++ đều cho phép triển khai phương pháp lập trình thủ tục. • Tư tưởng chung: cấu trúc dữ liệu + giải thuật = chương trình! 2 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  3. 4.1 C++ và phương pháp lËp tr×nh thñ tôc 4.1.1 Tổng quan về phương pháp lập trình thủ tục – Các khái niệm chính trong lập trình thủ tục • Chương trình con – Là một chương trình độc lập dùng để thực hiện một phần việc nào đó (nhập số liệu, in kết quả, thực hiện một số thao tác tính toán). – Chương trình con cần có đối, biến, mảng… cục bộ dùng riêng – Việc trao đổi dữ liệu giữa các chương trình con thực hiện thông qua các đối và các biến toàn cục. • Cấu trúc dữ liệu và giải thuật – Một chương trình thủ tục bao gồm các cấu trúc dữ liệu (như biến, mảng, cấu trúc, …) và các hàm, thủ tục. – Trong PASCAL có 2 kiểu chương trình con là thủ tục và hàm, còn trong C++ chỉ có một loại chương trình con là hàm. • Để sử dụng được thành thạo C++ trong lập trình thủ tục phải hiểu rõ tư tưởng lập trình thủ tục ! 3 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  4. 4.1 C++ và phương pháp lËp tr×nh thñ tôc 4.1.2 Lập trình thủ tục trong C++ – Nhắc lại về đặc điểm C++ • C: ngôn ngữ lập trình thủ tục. • C++: thừa hưởng tất cả điểm mạnh của C. – Là ngôn ngữ bao trùm lên C thừa hưởng đầy đủ sức mạnh của C (ví dụ tính khả chuyển, tính mềm dẻo, ...). • C++ có một số cải tiến tăng cường sức mạnh cho C: – Sự khác nhau giữa C trong C++ so với ANSI C. – Thay đổi, thêm mới phù hợp hơn. • Như vậy, C++ là ngôn ngữ lai cho phép cả lập trình thủ tục và lập trình hướng đối tượng. – Các ngôn ngữ hiện đại (như Java, C#, …) chỉ cho phép lập trình hướng đối tượng (thuần túy hướng đối tượng). 4 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  5. 4.1 C++ và phương pháp lËp tr×nh thñ tôc 4.1.2 Lập trình thủ tục trong C++ – C++ và lập trình thủ tục • C++ có một số điểm khác với các ngôn ngữ khác (ví dụ Pascal) về mặt cấu trúc chương trình và biên dịch mã nguồn. • Cấu trúc khối: – C++ xem các hàm là các thực thể tách biệt. – Một số ngôn ngữ khác có thể gộp nhiều hàm đơn giản thành hàm phức tạp hơn. – Với cấu trúc khối chú ý đến tên biến và phạm vi biến. • Dịch tách biệt: – Bố trí chương trình trong nhiều tập tin tách biệt. – Sử dụng tập tin tiêu đề thuận lợi cho việc thống nhất chương trình, dễ dàng hiệu chỉnh và bảo trì chương trình. 5 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  6. 4.2 Hµm 4.2.1 Khai báo và định nghĩa hàm – Cấu trúc tổng quát của hàm: [kiểu_giá_trị_trả_về] tên_hàm([danh_sách_tham_số]){ khai báo & lệnh; } • VD: int max(int a, int b) { int tmp; tmp = (a > b) ? a : b; return tmp; } • Trả lại quyền điều khiển (và giá trị) cho hàm: – Dùng lệnh return [biểu_thức]; – Lệnh return có thể viết bất kỳ đâu trong thân hàm. Khi hàm không trả về giá trị, chỉ cần viết return; – – Trong C không cần lệnh return nếu hàm không trả về giá trị 6 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  7. 4.2 Hµm 4.2.1 Khai báo và định nghĩa hàm – Kiểu giá trị trả về: • Hàm không trả về giá trị kiểu_giá_trị_trả_về là void. • Không viết kiểu giá trị trả về ngầm định là int. • Không cho trả về kiểu mảng. – Danh sách tham số: • Các tham số hình thức (cùng với kiểu tương ứng) cách nhau bằng dấu “,” không hạn chế kiểu (có thể là kiểu cơ sở hay phức hợp). • Hàm không có tham số danh_sách_tham_số là void. – Lúc này danh sách tham số cũng có thể để trống. • Không viết kiểu tham số ngầm định là int. • Chú ý: trong C có thể khai báo kiểu tham số riêng ra sau, ví dụ: double func(a,b) int a; float b; 7 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  8. 4.2 Hµm 4.2.1 Khai báo và định nghĩa hàm – Khai báo hàm nguyên mẫu: • Tất cả hàm dùng trong chương trình phải khai báo nguyên mẫu. – Trong nguyên mẫu có thể bỏ tên các tham số (chỉ cần khai báo kiểu). – C++ cho phép ép kiểu tham số truyền vào cho phù hợp. • Trong C có thể không khai báo nguyên mẫu, hoặc chỉ cần khai báo tên hàm và giá trị trả về, không cần danh sách kiểu tham số. – Nếu không khai báo, C tự tạo ra nguyên mẫu với kiểu trả về là int. – Tập tin tiêu đề (header file): • Mỗi thư viện trong C++ đều có một tập tin tiêu đề dạng *.h. – Tập tin này chứa khai báo của các hàm trong thư viện (nguyên mẫu), định nghĩa của các kiểu dữ liệu, hằng dùng trong hàm đó. • Người lập trình có thể tạo các tập tin tiêu đề riêng cho mình. 8 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  9. 4.2 Hµm 4.2.1 Khai báo và định nghĩa hàm – Con trỏ hàm: • Giống như biến, mỗi hàm đều có địa chỉ có thể khai báo một con trỏ hàm trỏ đến hàm đó. • Khai báo con trỏ hàm: [kiểu_gtrị_trả_về](*tên_biến_trỏ_hàm) ([dsách_thsố]); – VD: int(*fp) (int n, float x); • Ý nghĩa các thành phần trong khai báo con trỏ hàm giống như khai báo hàm. • Muốn sử dụng phép gán, con trỏ hàm phải tương thích với hàm cả về kiểu giá trị trả về lẫn danh sách tham số. • Con trỏ hàm có thể dùng làm tham số hình thức cho hàm. – Khi đó trong lời gọi hàm, có thể dùng tên hàm làm tham số thực. 9 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  10. 4.2 Hµm 4.2.2 Tham số và giá trị trả về trong lời gọi hàm – Tham số và truyền tham số • Tham số – Tham số hình thức: đại diện cho tham số thực (sẽ truyền cho hàm). Kiểu giá trị của tham số hình thức quyết định kiểu tham số thực. – Tham số thực: thông tin được truyền trong lời gọi hàm. Mỗi tham số thực tương ứng với một tham số hình thức. • Truyền tham số – Truyền theo trị (tham trị): bản sao giá trị được truyền cho hàm (tham trị) việc thay đổi giá trị được truyền vào trong thân hàm không ảnh hưởng đến giá trị ban đầu của biến. – Truyền theo biến (tham biến): bản thân biến được truyền cho hàm (tham biến) việc thay đổi trong hàm sẽ làm thay đổi giá trị biến. – Chú ý 1: trong C++ tất cả tham số được truyền theo trị. – Chú ý 2: nếu tham số truyền vào có kích thước lớn (ví dụ như cấu trúc) hoặc cần thay đổi giá trị biến, nên truyền theo biến. 10 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  11. 4.2 Hµm 4.2.2 Tham số và giá trị trả về trong lời gọi hàm – Tham số và truyền tham số (tiếp) • Tham số hình thức của hàm là con trỏ – Trong C++ muốn truyền theo biến có thể sử dụng con trỏ. – Tham số hình thức là con trỏ trong thân hàm có thể thay đổi giá trị biến mà con trỏ đó trỏ đến. – Một số chú ý khi tham số hình thức là mảng (một chiều, nhiều chiều). • Tham số hình thức của hàm là tham chiếu – Có thể truyền tham số cho hàm bằng tham chiếu hàm sẽ thao tác trực tiếp trên biến đó ~ truyền theo biến. – Việc khởi tạo tham số hình thức sẽ thực hiện trong mỗi lời gọi hàm. – Tham số ứng với tham số hình thức là tham chiếu phải là biến, trừ trường hợp có từ khóa const đứng trước khai báo tham số hình thức. – Có thể dùng tham chiếu cho biến trỏ, ví dụ : int *&adr; 11 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  12. 4.2 Hµm 4.2.2 Tham số và giá trị trả về trong lời gọi hàm – Tham số và truyền tham số (tiếp) • Tham số hình thức của hàm là con trỏ hàm – Các hàm được gọi trong hàm khác nên khai báo trước. – Có thể gọi hàm theo nhiều cách. Ví dụ : f(x,m), (f)(x,m), (*f)(x,m). – Không có sự khác biệt giữa việc gọi bằng tên hàm hay con trỏ hàm. • Tham số ngầm định trong lời gọi hàm – C++ cho phép tạo giá trị mặc định cho các tham số. – Giá trị ngầm định có thể là biếu thức (không nhât thiết phải là hằng). – Khi khai báo nguyên mẫu, giá trị ngầm định cũng phải khởi gán. – Các tham số ngầm định phải đặt cuối cùng trong danh sách tham số hình thức. – Khi gọi hàm, các tham số thiếu phải ở cuối cùng (tính từ trái phải). – Chú ý: Để khai báo giá trị ngầm định cho một tham số là biến trỏ phải viết dấu * và dấu = cách nhau. 12 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  13. 4.2 Hµm 4.2.2 Tham số và giá trị trả về trong lời gọi hàm – Giá trị trả về của hàm • Ngoài giá trị trả về kiểu cơ sở, hàm còn có thể trả về tham chiếu. • Cú pháp định nghĩa tham chiếu hàm: [kiểu_giá_trị_trả về] &tên_hàm ([danh_sách_thsố]){ khai báo & lệnh; } • Chú ý rằng lúc này, lệnh return phải trả về một biến toàn cục (tức là không phải biến được khai báo trong hàm). – Biến toàn cục là để ta có thể sử dụng tham chiếu của hàm. • Với giá trị trả về là tham chiếu, ta có thể sử dụng phép gán cho tên hàm (giống như gán giá trị cho biến). 13 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  14. 4.2 Hµm 4.2.3 Các vấn đề khác về hàm – Hàm viết tại chỗ (inline) • Ảnh hưởng của việc gọi hàm trong tốc độ thực hiện chương trình: – Cấp phát vùng nhớ, truyền dữ liệu, giải phóng vùng nhớ. – Cơ chế quản lý lời gọi và trở về (lưu ngữ cảnh, sao chép thông số, …). • Hàm inline: – C++ cho phép tạo ra các hàm được thay thế trực tiếp thành mã lệnh máy ngay tại chỗ gọi (inline). – Để khai báo và định nghĩa hàm inline, chỉ cần thêm từ khóa inline trước khai báo hàm. – Chương trình chứa hàm inline sẽ dài hơn (đặc biệt khi hàm được gọi nhiều lần) nhưng chạy nhanh hơn chỉ nên dùng hàm inline với những hàm nhỏ, không chứa cấu trúc lặp. • Trình dịch xử lý hàm inline giống như các macro. – Macro có nhiều hạn chế hơn trong thực tế nên dùng hàm inline. 14 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  15. 4.2 Hµm 4.2.3 Các vấn đề khác về hàm – Hàm viết tại chỗ (tiếp) • Hạn chế của trình dịch đối với hàm inline: – Không xử lý theo cách inline với các hàm chứa biến static, lệnh chu trình, lệnh goto, lệnh switch, hàm đệ quy, … – Ngay cả khi không có những hạn chế trên, nếu bộ nhớ chương trình đã quá lớn, trình dịch cũng bỏ qua yêu cầu inline. – Hàm main và tham số dòng lệnh • Hàm main đầy đủ có hai tham số hình thức như sau: void main (int agrc, char *agrv[]) { … } – agrc : số tham số được đưa vào. – agrv[] : mảng các tham số đưa vào, cách nhau bởi dấu cách. • Khai báo này được dùng khi cần sử dụng các tham số dòng lệnh cho việc thực thi chương trình. 15 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  16. 4.3 Chång hµm vµ chång phÐp to¸n 4.3.1 Định nghĩa chồng hàm – Chồng hàm • C++ cho phép sử dụng cùng một tên để định nghĩa các hàm khác nhau (khác kiểu giá trị trả về và danh sách kiểu các tham số) chồng hàm (overloading). • VD: int max (int a, int b); float max (float x, float y); • Chồng hàm còn được gọi là đa dạng hóa hàm, tải bội hàm. • Việc xác định gọi hàm nào khi trong chương trình có hàm trùng tên là do trình dịch đảm nhiệm. – Trình dịch dựa vào sự khác nhau của tập tham số để đổi tên các hàm các hàm có tên khác nhau sau khi dịch. – Nếu hai hàm có tên và tập tham số trùng nhau, trình dịch sẽ báo lỗi, kể cả khi kiểu trả về khác nhau. 16 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  17. 4.3 Chång hµm vµ chång phÐp to¸n 4.3.1 Định nghĩa chồng hàm – Quy tắc xác định hàm phù hợp khi gọi hàm • Căn cứ vào số lượng và kiểu của các tham số để gọi hàm. – Khi không có hàm nào có bộ tham số cùng kiểu, trình dịch chọn hàm có bộ tham số gần kiểu nhất (bằng phép chuyển kiểu). – Nếu đã theo quy tắc mà có hơn một hàm phù hợp, trình dịch sẽ báo lỗi. • Nếu hàm có một tham số trình dịch tìm kiếm hàm phù hợp tương ứng theo thứ tự ưu tiên sau: – Có tham số tương ứng thực sự: phân biệt các kiểu dữ liệu khác nhau (cả về dấu). – Có tham số tương ứng gần nhất (sau các chuyển đổi kiểu dữ liệu tự động: char và short int, float double). – Có tham số tưong ứng sau các chuyển đổi kiểu được C++ chấp nhận. – Có tham số tưong ứng sau các chuyển đổi kiểu do người dùng định nghĩa. 17 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  18. 4.3 Chång hµm vµ chång phÐp to¸n 4.3.1 Định nghĩa chồng hàm – Quy tắc xác định hàm phù hợp khi gọi hàm (tiếp) • Theo thứ tự ưu tiên trên, nếu có hơn một hàm phù hợp tại một mức ưu tiên, trình dịch sẽ báo lỗi không xác định được hàm. • Nếu hàm có nhiều tham số, trình dịch xác định hàm phù hợp theo quy tắc sau: – Chọn cho mỗi tham số các hàm phù hợp (tất cả mức độ). – Trong số các hàm đã được lựa chọn, chọn ra hàm đạt được sự phù hợp nhất đối với mỗi đối số. • Theo quy tắc trên, nếu vẫn có hơn một hàm phù hợp, trình dịch sẽ báo lỗi không xác định được hàm. 18 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  19. 4.3 Chång hµm vµ chång phÐp to¸n 4.3.1 Định nghĩa chồng hàm – Chú ý với chồng hàm • Một hàm có thể gọi đến hàm cùng tên với nó. • Không nên lạm dụng khả năng định nghĩa chồng hàm: – Chỉ nên định nghĩa chồng các hàm thực hiện những công việc như nhau nhưng trên các đối tượng có kiểu khác nhau. – Nên dùng các phép chuyển đổi kiểu (nếu cần) để tập tham số trong lời gọi hàm hoàn toàn trùng với tập tham số của một hàm cần đến, tránh sự nhập nhằng cho trình dịch. • Chồng hàm và gọi hàm với tham số có giá trị ngầm định có thể dẫn tới lỗi biên dịch. – Khi gọi hàm mà một số tham số ngầm định bị khuyết có thể có hai lời gọi hàm hoàn toàn giống hệt nhau trình dịch không xác định được hàm phù hợp. 19 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
  20. 4.3 Chång hµm vµ chång phÐp to¸n 4.3.2 Định nghĩa chồng phép toán – Chồng phép toán • Để thực hiện các thao tác trên kiểu dữ liệu phức hợp hay kiểu tự định nghĩa ta thường xây dựng các hàm. • C++ cho phép dùng các phép toán chuẩn để định nghĩa hàm định nghĩa chồng phép toán (overloading). – Mục đích là để tránh dài dòng, thiếu tự nhiên khi sử dụng hàm thực hiện các phép toán trong chương trình. – Chồng phép toán còn được gọi là đa dạng hóa phép toán, tải bội phép toán… • Hàm phép toán cho phép viết câu lệnh tính toán với kiểu dữ liệu phức hợp giống như công thức toán học. 20 Bài giảng C++. 14/10/2008 V.S.Nam. B/m KTHT, khoa CNTT, ĐHXD
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
4=>1