Nhập môn lập trình - Chương 4: Hàm và cấu trúc chương trình - Huỳnh Nguyễn Thành Luân

Cấu trúc một chương trình

Xây dựng và sử dụng hàm

Truyền tham số con trỏ và địa chỉ

Thuật toán tráo đổi giá trị 2 biến

pdf36 trang | Chuyên mục: Lập Trình | Chia sẻ: tuando | Lượt xem: 440 | Lượt tải: 1download
Tóm tắt nội dung Nhập môn lập trình - Chương 4: Hàm và cấu trúc chương trình - Huỳnh Nguyễn Thành Luân, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
i báo 
Cài đặt hàm 
Hàm main() 
C
H
Ư
Ơ
N
G
 T
R
ÌN
H
 C
Khai báo thư viện hàm 
Khai báo hằng số 
Khai báo hàm 
Cài đặt tất cả những hàm con 
đã được khai báo 
Gọi thực hiện các hàm theo 
yêu cầu của bài toán 
7 
1. Chỉ thị tiền biên dịch: giúp trình biên dịch thực hiện một số 
công việc trước khi thực hiện một số công việc trước khi 
thực hiện biên dịch chính thức 
 VD: #include 
 #include 
2. Khai báo kiểu dữ liệu mới: dung từ khoá typedef 
 VD: typedef int songuyen; 
 typedef float sothuc; 
3. Khai báo hằng và biến ngoài (nếu có): khai báo các hằng 
số và biến ngoài dùng trong chương trình 
4. Khai báo hàm: khai báo các hàm tự viết 
5. Chương trình chính: hàm main là hàm bắt buộc trong 
chương trình. Hàm main có thể trả về giá trị kiểu nguyên 
(int) hoặc không trả về giá trị nào (void) 
6. Cài đặt các hàm: viết chi tiết các hàm 
 Một đoạn chương trình có tên, đầu vào và đầu ra. 
 Có chức năng giải quyết một số vấn đề chuyên biệt cho 
chương trình chính. 
 Được gọi nhiều lần với các tham số khác nhau. 
 Được sử dụng khi có nhu cầu: 
• Tái sử dụng. 
• Sửa lỗi và cải tiến. 
Chương trình con = Hàm (trong C) 
8 
Khái niệm hàm 
Đặc điểm của hàm 
 Đặc điểu của hàm 
 Là một đơn vị độc lập của chương trình. 
 Không cho phép xây dựng một hàm bên trong một 
hàm khác. 
Có 2 loại hàm 
 Hàm chuẩn: Được định nghĩa sẵn bởi ngôn ngữ lập 
trình và được chứa vào các thư viện 
 Hàm tự định nghĩa: Do người lập trình tự tạo ra 
nhằm đáp ứng nhu cầu xử lý của mình 
9 
Khuôn mẫu hàm 
Cần xác định các thông tin sau đây: 
 Tên hàm. 
 Hàm sẽ thực hiện công việc gì. 
 Các đầu vào (nếu có). 
 Đầu ra (nếu có). 
Tên hàm 
Đầu vào 1 
Đầu vào 2 
Đầu vào n 
Đầu ra (nếu có) 
Các công việc 
sẽ thực hiện 
10 
Hàm 
Ví dụ 1: Xuất tổng của 2 số nguyên 
 Tên hàm: XuatTong 
 Công việc: tính và xuất tổng 2 số nguyên 
 Đầu vào: hai số nguyên x và y 
 Đầu ra: không có 
void XuatTong(int x, int y) 
{ 
 int s; 
 s = x + y; 
 printf(“%d cong %d bang %d”, x, y, s); 
} 
11 
Hàm 
Ví dụ 2: Tính tổng của 2 số nguyên 
 Tên hàm: TinhTong 
 Công việc: tính và trả về tổng 2 số nguyên 
 Đầu vào: hai số nguyên x và y 
 Đầu ra: một số nguyên có giá trị x + y 
int TinhTong(int x, int y) 
{ 
 int s; 
 s = x + y; 
 return s; 
} 
12 
Hàm 
Ví dụ 3: Nhập xuất tổng 
 Tên hàm: NhapXuatTong 
 Công việc: nhập và xuất tổng 2 số nguyên 
 Đầu vào: không có 
 Đầu ra: không có 
void NhapXuatTong() 
{ 
 int x, y; 
 printf(“Nhap 2 so nguyen: ”); 
 scanf(“%d%d”, &x, &y); 
 printf(“%d cong %d bang %d”, x, y, x + y); 
} 
13 
So sánh 2 hàm: 
14 
void XuatTong(int x, int y) 
{ 
 int s; 
 s = x + y; 
 printf(“%d cong %d bang %d”, x, y, s); 
} 
int TinhTong(int x, int y) 
{ 
 int s; 
 s = x + y; 
 return s; 
} 
Hàm nguyên mẫu (prototype) 
 TênHàm([ds các tham số]); 
Trong đó: 
Kiểu dữ liệu trả về của hàm (kết quả của hàm/ đầu ra), gồm 2 loại 
 void: Không trả về giá trị 
 float / int / long / char */ kiểu cấu trúc /  : Trả về giá trị 
kết quả có kiểu dữ liệu tương ứng với bài toán (chỉ trả về 
được 1 giá trị theo kiểu dữ liệu) 
Ví dụ: 
 int TinhTong(int a, int b); 
15 
Hàm nguyên mẫu (prototype) 
TênHàm: Đặt tên theo qui ước đặt tên sao 
cho phản ánh đúng chức năng thực hiện của 
hàm 
Danh sách các tham số (nếu có): đầu vào 
của hàm (trong một số trường hợp có thể là 
đầu vào và đầu ra của hàm nếu kết quả đầu 
ra có nhiều giá trị - Tham số này gọi là tham 
chiếu) 
16 
Cấu trúc chương trình khi có hàm 
 Cách 1: 
Khai báo nguyên mẫu trước theo cách 1 thì các hàm có thể gọi lẫn 
nhau. 
17 
 // khai báo thư viện 
 hàm1( ); //khai báo nguyên mẫu prototype 
 hàm2( ); 
 // khai báo biến toàn cục nếu có 
 void main( ) 
 { // khai báo biến cục bộ 
 hàm1( ); // gọi hàm1 
 hàm2( ); // gọi hàm2 
 } 
 hàm1( ) // khai báo chi tiết các hàm 
 { // khai báo biến cục bộ 
 ; 
 } 
 hàm2( ) 
 { // khai báo biến cục bộ 
 ; 
 } 
 Cách 2: 
18 
Cấu trúc chương trình khi có hàm 
 // khai báo thư viện 
 hàm1( ) 
 { // khai báo biến cục bộ 
 ; 
 } 
 hàm2( ) 
 { // khai báo biến cục bộ 
 ; 
 } 
 // khai báo biến toàn cục 
 void main( ) 
 { // khai báo biến cục bộ 
 hàm1( ); // gọi hàm1 
 hàm2( ); // gọi hàm2 
 } 
Thường 
được sử 
dụng 
19 
long Tong(int a, int b) 
{ 
 long s=a+b; 
 return s; 
} 
void main() 
{ 
 long kq = Tong (12, 3); 
 printf(“Tong cua 12 va 3: %d“,kq); 
} 
Truyền đối số 
Tham số 
Gọi hàm 
Hàm không trả về giá trị 
Cài đặt 
void TênHàm([danh sách các tham số]) 
{ 
 Khai báo các biến cục bộ 
 Các câu lệnh / khối lệnh hay lời gọi đến hàm khác 
} 
Gọi hàm 
TênHàm(danh sách tên các đối số); 
Những phương thức loại này thường rơi vào những nhóm chức 
năng: Nhập / xuất dữ liệu , thống kê, sắp xếp, liệt kê 
20 
Ví dụ 
Viết chương trình nhập số nguyên dương n và in ra màn 
hình các ước số của n 
 Phân tích bài toán: 
 Input: n (Để xác định tham số) 
 Kiểu dữ liệu: số nguyên dương (int). 
 Output: In ra các ước số của n (Để xác định kiểu dữ liệu trả 
về của hàm) 
Xuất ra màn hình  Không trả về giá trị  Kiểu dữ liệu của 
hàm là void 
 Xác định tên hàm: Hàm này dùng in ra các ước số của n nên 
có thể đặt là LietKeUocSo 
 void LietKeUocSo(int n); 
 21 
Cài đặt 
Hàm trả về giá trị 
Cài đặt 
 TênHàm([danh sách các tham số]) 
{ 
 kq; 
 Khai báo các biến cục bộ 
 Các câu lệnh / khối lệnh hay lời gọi đến hàm khác. 
 return kq; 
} 
Gọi hàm 
 Tên biến = TênHàm (danh 
sách tên các đối số); 
Những phương thức này thường rơi vào các nhóm: Tính tổng, 
tích, trung bình, đếm, kiểm tra, tìm kiếm 
23 
Ví dụ 
Viết chương trình nhập số nguyên dương n và tính tổng 
Phân tích bài toán: 
 Input: n (Để xác định tham số) 
 Kiểu dữ liệu: số nguyên dương (int). 
 Output: Tổng S (Để xác định kiểu dữ liệu phương thức) 
 Trả về giá trị của S. 
 S là tổng các số nguyên dương nên S cũng là số nguyên 
dương  Kiểu trả về của hàm là int (hoặc long). 
Xác định TênHàm: 
 Dùng tính tổng S nên có thể đặt là TongS 
long TongS(int n); 
24 
0;321  nnSn 
Cài đặt 
Truyền tham số cho hàm 
Trong ví dụ trên tại sao hàm TongS khai báo 
đối số x TongS(int x) nhưng gọi hàm lại là n 
S = TongS(n); 
Xét 2 ví dụ sau: 
26 
Xét ví dụ (1) 
Hoán vị 2 số nguyên a, b cho trước 
27 
#include 
#include 
void HoanVi(int a, int b) 
{ 
 int tam; 
 tam = a; 
 a = b; 
 b = tam; 
 printf(“Trong HoanVi: a = %d; b = %d \n“,a,b); 
} 
void main() 
{ 
 int a = 5, b = 21; 
 printf(“Truoc khi HoanVi: a = %d; b = %d \n”,a,b); 
 HoanVi(a, b); 
 printf(“Sau khi HoanVi: a = %d; b = %d \n”,a,b); 
} 
hàm HoanVi 
không thay đổi 
giá trị của a và b 
a, b: tham số mặc định 
Xét ví dụ (2) 
Hoán vị 2 số nguyên a, b cho trước 
28 
#include 
#include 
void HoanVi(int *a, int *b) 
{ 
 int tam; 
 tam = *a; 
 *a = *b; 
 *b = tam; 
 printf(“Trong HoanVi: a = %d; b = %d \n “,*a,*b); 
} 
void main() 
{ 
 int a = 5, b = 21; 
 printf(“Truoc khi HoanVi: a = %d; b = %d \n”,a,b); 
 HoanVi(&a, &b); 
 printf(“Sau khi HoanVi: a = %d; b = %d \n”,a,b); 
} 
truyền địa chỉ của 
a và b vào hàm 
 HoanVi 
a, b: tham số địa chỉ của 
số int, khai báo với dấu * 
Truyền tham số cho hàm 
C hỗ trợ 2 cách truyền tham số: 
 Truyền tham số bởi giá trị (truyền giá trị - call 
by value) còn gọi truyền tham trị 
 Truyền tham số bởi địa chỉ (truyền địa chỉ - call 
by address) còn gọi truyền tham biến 
Mở rộng với C++ 
 Truyền tham chiếu (call by reference) 
29 
Ví dụ: Hoán vị 2 số nguyên a, b cho trước 
Truyền tham trị 
Hàm sẽ xử lý trên bản sao của tham số 
Hàm không thể thay đổi giá trị của tham số 
được. 
Được dùng trong các trường hợp cần chuyển 
dữ liệu vào bên trong hàm để xử lý, tính toán 
Mặc định hàm là truyền giá trị (tham trị) 
Ví dụ hàm có sẵn của C truyền giá trị: 
 float sqrt(float); //tính căn bậc 2 
 double pow(double, double); //tính lũy thừa 
31 
Truyền địa chỉ 
Hàm sẽ xử lý trên chính tham số nhờ vào địa chỉ của 
chúng 
Hàm có thể thay đổi giá trị của tham số. 
Được dùng trong các trường hợp cần chuyển dữ liệu 
là kết quả xử lý được bên trong hàm ra “ngoài” cho 
các hàm khác sử dụng. 
Khai báo tham số của hàm: 
Ví dụ hàm có sẵn của C truyền địa chỉ (truyền tham 
biến) 
 int scanf(const char *format, adr1, adr2, ); 
32 
function inputs outputs 
Kiểu dữ liệu * tên biến 
Truyền tham chiếu (C++) 
Khi muốn tham số hình thức và tham số thực cùng 
địa chỉ (bản chất là cùng ô nhớ nhưng khác tên), ta 
dùng cách chuyển tham chiếu cho hàm. 
Khai báo tham số của hàm: 
Như vậy, mọi thay đổi đối với tham số hình thức 
cũng làm thay đổi tham số thực. 
Có thể dùng chuyển tham chiếu để trả về giá trị cho 
nơi gọi hàm. 
33 
Kiểu dữ liệu & tên biến 
Thuật toán tráo đổi giá trị 2 biến 
Bài toán: Cho 2 số x và y làm thể nào để biến đổi 
giá trị x và y 
 Xác định bài toán: 
 Input: Hai biến x và y có giá trị tương ứng là a, b 
 Output: Hai biến x và y có giá trị tương ứng là b, a 
Mô tả thuật toán 
Mượn một biến z để chứa giá trị tạm thời 
Bước 1: z  x {Sau bước này giá trị của z sẽ bằng a} 
Bước 2: x  y {Sau bước này giá trị của x sẽ bằng b} 
Bước 3: y  z {Sau bước này giá trị của y sẽ bằng giá trị 
của z, chính là giá trị ban đầu a của biến x} 
34 
35 
Nguyên tắc xây dựng hàm 
Trước khi xây dựng hàm phải trả lời những câu hỏi sau: 
Hàm trả về gì?  
Hàm làm gì?  
Cần những thông tin gì để hàm xử lý?  
Ứng với mỗi thông tin đã xác định, xác định xem đã có giá trị 
trước khi vào hàm chưa, 
 - Nếu chưa có  
 - Nếu có mà sau khi thực hiện xong hàm vẫn không thay đổi 
 
 - Nếu có mà sau khi thực hiện xong hàm thì giá trị cũng bị 
thay đổi theo  
Xác định kiểu dữ liệu trả về của hàm 
Xác định tên hàm 
Xác định tham số 
Tham biến (tham chiếu trong C++) 
Tham trị (không là tham biến) 
Tham biến 
Ví dụ: 

File đính kèm:

  • pdfnhap_mon_lap_trinh_chuong_4_ham_va_cau_truc_chuong_trinh_huy.pdf