CHƯƠNG 3: LẬP TRÌNH MODULE 3.1 Phương pháp lập trình module
3.2.7. Xácđịnh kiểu trả về cho hàm:
Khi nào hàm có giá trị trả về, khi nào không? Dưới đây là một số gợi ý:
1) Khi muốn thể hiện các đoạn CT có tính chất giống như một hàm toán học và trả về một giá trị, ta dùng hàm có giá trị trả về. Chẳng hạn: tính giai thừa, tổ hợp, chỉnh hợp, tính chu vi hình vuông, tìm số lớn trong hai số, …
2) Dùng hàm không trả về giá trị đối với các đoạn CT có tính chất thực hiện một hành động nào đó (chẳng hạn, hoán vị hai số) hoặc đối với các đoạn CT có tính chất tính toán nhưng trả về cùng lúc nhiều giá trị (chẳng hạn: a) tìm số lớn và nhỏ trong hai số: trả về số lớn và số nhỏ; b) giải phương trình bậc hai: có thể trả về đến hai nghiệm); … Để trả về nhiều giá trị, ta dùng con đường truyền tham chiếu (&).
a, b là tham chiếu đến so_1_1, so_2_1. Có thể xem a là so_1_1, b là so_2_1.
a, b là các biến cục bộ nhận giá trị khởi đầu là so_1_2, so_2_2.
a là tham chiếu đến so_1_3, b là biến cục bộ nhận giá trị khởi đầu là so_2_3.
Dùng hàm trả về giá trị khi đoạn CT cần phải trả lại một giá trị cho biết tình trạng thực hiện của nó như: chạy thành công, các tình huống lỗi, … Trong các trường hợp đó, người ta thường trả về giá trị kiểu int. Chẳng hạn, đoạn CT đọc một file trên đĩa sẽ được viết bằng một hàm trả về: 1: nếu đọc thành công, 0: nếu không tìm thấy file, -1: nếu đầu đọc bị lỗi, …
Ví dụ 3.6: CT đổi thời gian dạng giây thành dạng giờ:phút:giây #include …
#define GIAY_TREN_PHUT 60
#define GIAY_TREN_GIO 3600
void doi_thoi_gian (int giay_doi, int &gio, int &phut, int &giay);
// Hàm này trả về ba giá trị: gio, phut, giay.
int main(int argc, char* argv[]) {
int giay_nhap_vao, gio, phut, giay; printf( “Nhap vao so giay:\t” );
scanf ( “%d”, &giay_nhap_vao);
doi_thoi_gian (giay_nhap_vao, gio, phut, giay);
printf ( “\nThoi gian quy đoi la: %d h: %d m : %d s ”, gio, phut, giay); getch (); return 0;
}
void doi_thoi_gian (int giay_doi, int &gio, int &phut, int &giay) {
int giay_du;
gio = giay_doi / GIAY_TREN_GIO; giay_du = giay_doi % GIAY_TREN_GIO; phut = giay_du / GIAY_TREN_PHUT; giay = giay_du % GIAY_TREN_PHUT; }
Ví dụ 3.7: CT xếp loại học sinh dựa trên điểm trung bình Sơ đồ:
#include …
char xep_loai_theo_diem (float diem); // Trả về xếp loại tương ứng với diem. void in_xep_loai (char loai); // Không trả về giá trị.
int main(int argc, char* argv[]) {
Điểm trung bình
Xếp loại theo điểmXếp loại theo điểm In xếp loại In xếp
loại Loại
char xep_loai; float diem_trung_binh;
printf( “Nhap vao diem trung binh cua hoc sinh can xep loai:\t” ); scanf ( “%f ”, &diem_trung_binh);
loai = xep_loai_theo_diem (diem_trung_binh); in_xep_loai (loai);
getch (); return 0; }
char xep_loai_theo_diem (float diem) {
char loai;
if (diem < 5.0) loai = ‘Y’; else if (diem < 6.5) loai = ‘T’; else if (diem < 8.0) loai = ‘K’; else loai = ‘G’; return loai;
}
void in_xep_loai (char xep_loai) {
switch (xep_loai) {
case ‘Y’: printf (“Hoc sinh xep loai Yeu.”); break;
case ‘T’: printf (“Hoc sinh xep loai Trung binh.”); break; case ‘K’: printf (“Hoc sinh xep loai Kha.”); break;
case ‘G’: printf (“Hoc sinh xep loai Gioi.”); break; }
}