Nhập môn Lập trình - Bài 8: Hàm nâng cao (Phần 1) - Đặng Bình Phương

Các đối số của chương trình

 Hàm main là hàm nên cũng có tham số.

 Chương trình tự động thực hiện hàm main mà

không cần lời gọi hàm.

 Làm sao truyền đối số?

 Khi thực thi tập tin chương trình (.exe), ta

truyền kèm đối số. Tất nhiên, hàm main cũng

phải định nghĩa các tham số để có thể nhận

các đối số này.

pdf26 trang | Chuyên mục: Lập Trình | Chia sẻ: tuando | Lượt xem: 482 | Lượt tải: 2download
Tóm tắt nội dung Nhập môn Lập trình - Bài 8: Hàm nâng cao (Phần 1) - Đặng Bình Phương, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Trường Đại học Khoa học Tự nhiên 
Khoa Công nghệ thông tin 
Bộ môn Công nghệ phần mềm 
1 
ThS. Đặng Bình Phương 
dbphuong@fit.hcmus.edu.vn 
NHẬP MÔN LẬP TRÌNH 
HÀM NÂNG CAO 
(PHẦN 1) 
VC 
& 
BB 
2 
Nội dung 
Hàm nâng cao (phần 1) 
Các tham số của hàm main 1 
Hàm có đối số mặc định 2 
Hàm trả về tham chiếu 3 
Hàm nội tuyến (inline) 4 
VC 
& 
BB 
3 
Các đối số của chương trình 
Các đối số của chương trình 
 Hàm main là hàm nên cũng có tham số. 
 Chương trình tự động thực hiện hàm main mà 
không cần lời gọi hàm. 
  Làm sao truyền đối số? 
  Khi thực thi tập tin chương trình (.exe), ta 
truyền kèm đối số. Tất nhiên, hàm main cũng 
phải định nghĩa các tham số để có thể nhận 
các đối số này. 
Hàm nâng cao (phần 1) 
VC 
& 
BB 
4 
Các tham số của hàm main 
Các tham số của hàm main 
 Trong đó 
• argc là số lượng đối số (tính luôn tên tập tin 
chương trình) 
• argv là mảng chứa các đối số (dạng chuỗi) 
Hàm nâng cao (phần 1) 
void main(int argc, char *argv[]) 
{ 
} 
VC 
& 
BB 
5 
Các tham số của hàm main 
Ví dụ 
 Viết chương trình có tên Cong, nhận 2 đối số 
x và y và xuất ra giá trị x + y. 
Hàm nâng cao (phần 1) 
argv = {“Cong.EXE”, “2912”, “1706”}; 
argc = 3 
VC 
& 
BB 
6 
Các tham số của hàm main 
Ví dụ 
 Viết chương trình có tên Cong, nhận 2 đối số 
x và y và xuất ra giá trị x + y. 
Hàm nâng cao (phần 1) 
#include 
#include // atoi 
void main(int argc, char *argv[]) { 
 if (argc == 3) { 
 int nX = atoi(argv[1]); 
 int nY = atoi(argv[2]); 
 printf(“%d + %d = %d”, nX, nY, nX+nY); 
 } 
 else 
 printf(“Sai! VD: Cong 2912 1706”); 
} 
VC 
& 
BB 
7 
Các tham số của hàm main 
Ví dụ 
 Viết chương trình có tên test nhận dữ liệu từ 
tập tin input.txt, xử lý và xuất kết quả ra tập 
tin output.txt. 
Hàm nâng cao (phần 1) 
argv = {“test”, “input.txt”, “output.txt”}; 
argc = 3 
VC 
& 
BB 
8 
Các tham số của hàm main 
Ví dụ 
 Viết chương trình có tên test nhận dữ liệu từ 
tập tin input.txt, xử lý và xuất kết quả ra tập 
tin output.txt. 
Hàm nâng cao (phần 1) 
#include 
void main(int argc, char *argv[]) { 
 if (argc == 3) { 
 // Nhập dữ liệu từ tập tin argv[1] 
 // Xử lý 
 // Xuất kết quả ra tập tin argv[2] 
 } 
 else 
 printf(“Sai! VD: test in.txt out.txt\n”); 
} 
VC 
& 
BB 
9 
Hàm có đối số mặc định 
Ví dụ 
 Viết hàm Tong để tính tổng 4 số x, y, z, t 
 Tính tổng 4 số 2912, 1706, 1506, 1904 
 Nếu chỉ muốn tính tổng 2 số 2912, 1706 
Hàm nâng cao (phần 1) 
int Tong(int x, int y, int z, int t) 
{ 
 return x + y + z + t; 
} 
Tong(2912, 1706, 1506, 1904); 
Tong(2912, 1706, 0, 0); // z = 0, t = 0 
VC 
& 
BB 
10 
Hàm có đối số mặc định 
Khái niệm 
 Hàm có đối số mặc định là hàm có một hay 
nhiều tham số hình thức được gán giá trị. 
 Tham số này nhận giá trị mặc định đó nếu 
không có đối số truyền vào cho tham số đó. 
 Phải được dồn về tận cùng bên phải. 
Ví dụ 
Hàm nâng cao (phần 1) 
int Tong(int x, int y, int z = 0, int t = 0) 
{ 
 return x + y + z + t; 
} 
VC 
& 
BB 
11 
Hàm có đối số mặc định 
Lưu ý 
 Muốn truyền đối số khác thay cho đối số mặc 
định, phải truyền đối số thay cho các đối số 
mặc định trước nó. 
Hàm nâng cao (phần 1) 
int Tong(int x, int y = 0, int z = 0); 
int Tong(1, 5); 
int Tong(1, 0, 5); 
VC 
& 
BB 
12 
Hàm có đối số mặc định 
Ví dụ 
 In thông tin SV trong lớp gồm: họ tên, phái, 
lớp, năm sinh 
Hàm nâng cao (phần 1) 
void xuatThongTin(char *szHoTen, char cPhai = 0, 
char *szLop = “TH07”, int nNamSinh = 1989) 
{ 
 puts(szHoTen); 
 printf(cPhai == 0? “Nam\n” : “Nu\n”); 
 puts(szLop); 
 printf(“%d\n”, nNamSinh); 
} 
VC 
& 
BB 
13 
Hàm có đối số mặc định 
Ví dụ 
 In thông tin SV trong lớp gồm: họ tên, phái, 
lớp, năm sinh 
Hàm nâng cao (phần 1) 
void main() 
{ 
 XuatThongTin(“Nguyen Van A”); 
 XuatThongTin(“Tran Thi B”, 1); 
 XuatThongTin(“Hoang Van C”, 0, “TH00”); 
 XuatThongTin(“Le D”, 1, “TH07”, 1988); 
} 
VC 
& 
BB 
14 
Hàm có đối số mặc định 
Nhận xét 
 x = a thường xuyên xảy ra thì nên chuyển x 
thành tham số có đối số mặc định là a. 
 Ví dụ, hầu hết phai = 0 (nam), lop = “TH07” 
và namsinh = 1989. 
 x = a và y = b thường xuyên xảy ra nhưng 
y = b thường xuyên hơn thì nên đặt tham số 
mặc định x trước y. 
 Ví dụ, lop = “TH07” xảy ra nhiều hơn 
phai = 0 nên đặt lop sau phai. 
Hàm nâng cao (phần 1) 
VC 
& 
BB 
15 
Chỉ thị tiền xử lý #define 
Định nghĩa hằng ký hiệu 
 Chỉ thị #define 
 Mọi chỗ xuất hiện trong chương 
trình nguồn được thay thế bằng để 
tạo ra chương trình tiền xử lý. 
 Ví dụ 
• #define MAX 1000 
• #define PI 3.14 
• #define message “Hello World\n” 
Hàm nâng cao (phần 1) 
VC 
& 
BB 
16 
Chỉ thị tiền xử lý #define 
Định nghĩa các macro (lệnh gộp - lệnh tắt) 
 #define () 
 Mọi chỗ xuất hiện của với lượng tham 
số đưa vào phù hợp sẽ được thay thế bởi 
 (tham số được thay thế tương 
ứng) 
 Ví dụ 
• #define showmsg(msg) printf(msg) 
showmsg(“Hello”);  printf(“Hello”); 
Hàm nâng cao (phần 1) 
VC 
& 
BB 
17 
Hàm nội tuyến (inline) 
Ví dụ 
 Xét 2 cách sau 
Hàm nâng cao (phần 1) 
#define PI 3.14159 
float addPi(float s) 
{ 
 return s + PI; 
} 
void main() 
{ 
 float s = 0; 
 for (int i = 1; i <= 100000; i++) 
 s = s + PI; // Cách 1 (0.7s) 
 s = addPi(s); // Cách 2 (1.4s) 
} 
VC 
& 
BB 
18 
Hàm nội tuyến (inline) 
Nhận xét 
 Sử dụng hàm giúp chương trình dễ hiểu nhưng 
lại tốn chi phí cho lời gọi hàm. 
Khắc phục 
 Sử dụng hàm nội tuyến (inline) bằng cách thêm 
từ khóa inline trước prototype của hàm. 
 inline float addPi(float s) { return s + PI; } 
Khái niệm 
 Sao chép thân hàm đến bất cứ nào nào hàm 
được gọi  kết quả giống hệt cách 1. 
Hàm nâng cao (phần 1) 
VC 
& 
BB 
19 
Hàm nội tuyến (inline) 
Lưu ý 
 Giảm thời gian thực hiện hàm (gọi và kết thúc). 
 Giảm không gian bộ nhớ do các hàm con chiếm 
dụng khi hàm được gọi. 
 Không cho phép các hàm nội tuyến đệ quy. 
 Phần lớn không cho phép thực hiện nội tuyến 
các hàm sử dụng vòng lặp while. 
 Chỉ inline các hàm nhỏ, inline các hàm lớn sẽ gây 
phản tác dụng (bộ nhớ cho hàm inline chiếm giữ 
sẽ lâu giải phóng hơn). 
Hàm nâng cao (phần 1) 
VC 
& 
BB 
20 
Hàm trả về tham chiếu 
Ví dụ 
 Hàm chỉ trả về giá trị. Ví dụ, x = f(); 
 Vậy, g() = x hợp lệ hay không? 
  Hợp lệ khi g(x) trả về tham chiếu đến một 
biến (C++) 
Cú pháp 
Hàm nâng cao (phần 1) 
 &([]) 
{ 
 return ; 
} 
VC 
& 
BB 
21 
Hàm trả về tham chiếu 
Ví dụ 
Hàm nâng cao (phần 1) 
#include 
int x; 
int &getx() 
{ 
 return x; 
} 
void main() 
{ 
 getx() = 5; //  x = 5 
} 
VC 
& 
BB 
22 
Hàm trả về tham chiếu 
Ứng dụng 
 Chỉ số của mảng trong C/C++ bắt từ 0 
 Không quen thuộc lắm. 
 Viết hàm để khi muốn truy cập đến phần tử 
thứ i của mảng a ta sử dụng V(i) thay vì a[i-1] 
Hàm nâng cao (phần 1) 
int a[100]; 
int &V(int i) 
{ 
 return a[i-1]; 
} 
V(1) = 2912; //  a[0] = 2912; 
VC 
& 
BB 
23 
Hàm trả về tham chiếu 
Chú ý 
 Trong trường hợp sau, biến x phải là biến 
toàn cục  không nên sử dụng! 
Hàm nâng cao (phần 1) 
int x; // biến toàn cục 
int &getx() 
{ 
 return x; 
} 
void main() 
{ 
 getx() = 2912; 
} 
VC 
& 
BB 
24 
Hàm trả về tham chiếu 
Chú ý 
 Nếu không muốn sử dụng biến toàn cục, phải 
truyền x ở dạng tham chiếu. 
Hàm nâng cao (phần 1) 
int &getx(int x) { // SAI! x là tham trị  bản sao 
 return x; 
} 
int &getx() { 
 int x; // SAI! x là biến cục bộ 
 return x; 
} 
int &getx(int &x) { // ĐÚNG! x là tham chiếu 
 return x; 
} 
VC 
& 
BB 
25 
Hàm trả về tham chiếu 
Ví dụ 
Hàm nâng cao (phần 1) 
#include 
int &V(int a[], int i) 
{ 
 return a[i-1]; 
} 
void main() 
{ 
 int a[100]; 
 for (int i = 1; i <= 100; i++) 
 V(a, i) = 0; 
} 
VC 
& 
BB 
26 
Bài tập 
Bài 1: Viết chương trình có tên TinhToan sao 
cho khi gõ: TinhToan 2912 – 1706 sẽ xuất ra 
màn hình 1206 (có thể thay bằng +, *, /) 
Bài 2: Viết chương trình quản lý thông tin sinh 
viên (sử dụng hàm có đối số mặc định), bao 
gồm nhập, sắp xếp tăng dần theo tên và xuất 
danh sách sinh viên. 
Bài 3: Chuyển các hàm nhỏ hàm nội tuyến. 
Bài 4: Nhập mảng, sắp xếp mảng tăng dần và 
xuất mảng sử dụng hàm trả về tham chiếu. 
Hàm nâng cao (phần 1) 

File đính kèm:

  • pdfnhap_mon_lap_trinh_bai_8_ham_nang_cao_phan_1_dang_binh_phuon.pdf