Bài giảng Tin học đại cương - Bài 10: Chương trình con trong C
Bạn đang xem tài liệu "Bài giảng Tin học đại cương - Bài 10: Chương trình con trong C", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_tin_hoc_dai_cuong_bai_10_chuong_trinh_con_trong_c.pdf
Nội dung text: Bài giảng Tin học đại cương - Bài 10: Chương trình con trong C
- TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 10. Chương trình con trong C Nội dung 10.1. Khái niệm hàm 10.2. Khai báo và sử dụng hàm 10.3. Phạm vi của biến 2 1
- Nội dung 10.1. Khái niệm hàm 10.1.1. Khái niệm chương trình con 10.1.2. Phân loại chương trình con 11.2. Khai báo và sử dụng hàm 11.3. Phạm vi của biến 3 Một ví dụ #include #include int giaiThua(int);//Khai báo nguyên mẫu hàm int main(){ //Khai báo n, k và nhập thông tin // toHop=giaiThua(n)/(giaiThua(k)*giaiThua(n-k)); //In kết quả } //Khai báo nội dung hàm int giaiThua(int n){ int i,ketQua = 1; for(i = 1;i <= n; i++) ketQua = ketQua*i; return ketQua; 4 } 2
- 10.1.1. Khái niệm chương trình con • Khái niệm – Là một chương trình nằm trong một chương trình lớn hơn nhằm thực hiện một nhiệm vụ cụ thể • Vai trò – Chia nhỏ chương trình ra thành từng phần để quản lý => Phương pháp lập trình có cấu trúc – Có thể sử dụng lại nhiều lần: printf, scanf – Chương trình dễ dàng đọc và bảo trì hơn 5 10.1.2. Phân loại chương trình con • Phân loại chương trình con Chương trình con Hàm Thủ tục (function) (procedure) – Hàm: trả về giá trị trong khi thủ tục thì không – Trong C: • Chỉ cho phép khai báo chương trình con là hàm. • Sử dụng kiểu “void” với ý nghĩa “không là kiểu dữ liệu nào cả” để chuyển thủ tục về dạng hàm 6 3
- 10.1.2. Phân loại chương trình con • Phân loại hàm HÀM Hàm chuẩn Hàm tự viết (Có trong thư viện) (Người dùng định nghĩa) 7 10.2. Khai báo và sử dụng hàm 10.2.1. Khai báo hàm 10.2.2. Sử dụng hàm 8 4
- 10.2.1. Khai báo hàm • 1. Trong chương trình lớn có nhiều chương trình con, điểm bắt đầu thực hiện chương trình sẽ thuộc chương trình con nào? • 2. Main là một chương trình con? • 3. Khai báo các chương trình con độc lập nhau/lồng lẫn nhau? • 4. Muốn “lắp ráp” các công việc khác nhau để cùng thực hiện, cần phải đưa ra “lời gọi” hàm. “Lời gọi” cần cung cấp những gì? 9 10.2.1. Khai báo hàm • Ví dụ: – Chương trình in ra bình phương của các số tự nhiên từ 1 đến 10 – Gồm 2 hàm: • Hàm binhPhuong(int x): trả về bình phương của x • Hàm main(): với mỗi số nguyên từ 1 đến 10, gọi hàm binhPhuong với một giá trị đầu vào và hiển thị kết quả. 10 5
- 10.2.1. Khai báo hàm #include #include int binhPhuong(int x){ Khai báo hàm int y; y = x * x; return y; } void main(){ int i; for (i=0; i ] tên_hàm ([danh_sách_tham_số]) { [ ] [ ] } • Dòng đầu hàm – Là thông tin trao đổi giữa các hàm. Phân biệt giữa các hàm với nhau. – Kiểu giá trị trả về: kiểu dữ liệu bất kì, không được là kiểu dữ liệu mảng. – Tên hàm: là tên hợp lệ, trong C tên hàm là duy nhất 12 6
- 10.2.1. Khai báo hàm – Tham số • Cho biết những tham số giả định cung cấp hoạt động cho hàm => các tham số hình thức • Tham số cung cấp dữ liệu cho hàm lúc hoạt động: tham số thực – Ví dụ: int max(int a, int b, int c) • Thân hàm – return • Gọi hàm thông qua tên hàm và các tham số thực cung cấp cho hàm. • Sau khi thực hiện xong, trở về điểm mà hàm được gọi thông qua câu lệnh return hoặc kết thúc hàm. 13 • Cú pháp chung: return biểu_thức; 10.2.1. Khai báo hàm #include #include Nguyên mẫu hàm int binhPhuong(int ); void main(){ (function prototype) int i; for (i=0; i<= 10; i++) printf(“%d ”, binhPhuong(i)); getch(); } int binhPhuong(int x){ Định nghĩa hàm int y; y = x * x; return y; } 7
- 10.2.1. Khai báo hàm • Ý nghĩa của nguyên mẫu hàm – Cho phép định nghĩa sau khi sử dụng. Nhưng phải khai báo trước – Cho phép đưa ra lời gọi đến một hàm mà không cần biết định nghĩa • Ví dụ: khi gọi printf, scanf chúng ta chỉ cần quan tâm các tham số truyền cho hàm • Tệp stdio.h chứa nguyên mẫu hàm của printf và scanf 10.2.1. Khai báo hàm • Các hàm thư viện • Ngôn ngữ C cung cấp một số hàm thư viện như: xử lý vào ra, hàm toán học, hàm xử lý xâu • Để sử dụng các hàm này chúng ta chỉ cần khai báo nguyên mẫu của chúng trước khi sử dụng. – Khai báo thông qua chỉ thị #include – tệp_tiêu_đề (.h) đã chứa các nguyên mẫu hàm 8
- 10.2.2. Sử dụng hàm • Cú pháp: tên_hàm (danh_sách_tham_số); • Ví dụ: binhphuong(0), binhphuong(1) • Lưu ý: – Nếu hàm nhận nhiều tham số thì các tham số ngăn cách nhau bởi dấu phẩy – Luôn luôn cần cặp dấu ngoặc đơn sau tên hàm – Các tham số của hàm sẽ nhận các giá trị từ tham số truyền vào – Thực hiện lần lượt các lệnh cho đến khi gặp lệnh return/kết thúc chương trình 17 10.3. Phạm vi của biến • 10.3.1. Phạm vi của biến • 10.3.2. Phân loại biến • 10.3.3. Câu lệnh static và register 18 9
- 10.3.1. Phạm vi của biến • Phạm vi: khối lệnh, chương #include trình con, chương trình #include chính int i; • Biến khai báo trong phạm vi int binhPhuong(int x){ nào thì sử dụng trong phạm int y; vi đó y = x * x; return y; • Trong cùng một phạm vi các } biến có tên khác nhau. void main(){ • Tình huống int y; – Trong hai phạm vi khác for (i=0; i<= 10; i++){ nhau có hai biến cùng tên. y = binhPhuong(i); Trong đó một phạm vi này printf(“%d ”, y); nằm trong phạm vi kia? } } 19 10.3.2. Phân loại biến • Phân loại biến – Biến toàn cục: biến được khai báo ngoài mọi hàm, được sử dụng ở các hàm đứng sau nó – Biến cục bộ: biến được khai báo trong lệnh khối hoặc chương trình con, được đặt trước các câu lệnh. • Ghi nhớ – Hàm main() cũng là một chương trình con nhưng là nơi chương trình được bắt đầu cũng như kết thúc – Biến khai báo trong hàm main() cũng là biến cục bộ, chỉ có phạm vi trong hàm main(). 20 10
- 10.3.3. Câu lệnh static và register • Biến static – Xuất phát: biến cục bộ ra khỏi phạm vi thì bộ nhớ dành cho biến được giải phóng – Yêu cầu lưu trữ giá trị của biến cục bộ một cách lâu dài => sử dụng từ khóa static – So sánh với biến toàn cục? – Cú pháp: static tên_biến; 21 10.3.3. Câu lệnh static và register # include # include void fct() { static int count =0; printf("\n Day la lan goi ham fct lan thu %2d", count++); } void main(){ int i; for(i = 0; i < 10; i++) fct(); getch(); } 22 11
- 10.3.3. Câu lệnh static và register Day la lan goi ham fct lan thu 1 Day la lan goi ham fct lan thu 2 Day la lan goi ham fct lan thu 3 Day la lan goi ham fct lan thu 4 Day la lan goi ham fct lan thu 5 Day la lan goi ham fct lan thu 6 Day la lan goi ham fct lan thu 7 Day la lan goi ham fct lan thu 8 Day la lan goi ham fct lan thu 9 Day la lan goi ham fct lan thu 10 23 10.3.3. Câu lệnh static, register • Biến register – Thanh ghi có tốc độ truy cập nhanh hơn RAM, bộ nhớ ngoài – Lưu biến trong thanh ghi sẽ tăng tốc độ thực hiện chương trình – Cú pháp register tên_biến; – Lưu ý: số lượng biến register không nhiều và thường chỉ với kiểu dữ liệu nhỏ như int, char 24 12
- Thảo luận 25 13