Thứ Tư, 1 tháng 5, 2024

21. Hàm trong C++

Chúng ta xét một ví dụ:

Lấy ví dụ chúng ta cần  một chương trình đóng mở mái che vườn rau tự động. Chương trình sẽ tự động đóng mở mái che, đo nhiệt độ môi trường, tự động tưới rau khi cần thiết...Nếu trời nắng quá sẽ đóng mái che, nếu trời mưa to cũng đóng mái che, ngày đẹp trời sẽ mở mái che...

Chúng ta tạm hình dung cấu trúc của chương trình như sau:

 

if(Trời nắng to){
    Đóng mái che
    Đo nhiệt độ
    Đo độ ẩm không khí
    Tưới rau
}
else if(Trời nắng nhẹ){
    Mở mái che
    Đo nhiệt độ
    Đo độ ẩm không khí
    Tưới rau
}
else if(Trời mưa to){
    Đóng mái che
    Đo nhiệt độ
    Đo độ ẩm không khí
    Ngừng tưới rau
}
else if(Trời mưa nhẹ){
    Mở mái che
    Đo nhiệt độ
    Đo độ ẩm không khí
    Ngừng tưới rau
}
else{
    //Code else-Làm một việc gì khác
}

 

Ta sẽ thấy rằng việc đo nhiệt độ, tưới rau, đóng mở mái...cứ lặp đi lặp lại rất nhiều lần. Nếu đây là một việc lặp đi lặp lại hàng trăm lần thì công việc lập trình thật sự trở nên rất nhàm chán...Từ đây khái niệm về Hàm-Function ra đời. 

Hàm (function) là một nhóm các câu lệnh cùng nhau thực hiện một nhiệm vụ, một chức năng nào đó.

Cú Pháp :

data_type function_name(type1 parameter1, type2 parameter2...){
    //code
}

 

Trong đó:

  •     data_type : Kiểu trả về của hàm, có thể là các kiểu dữ liệu như int, long long, float, char, double, hoặc void
  •     function_name : Tên của hàm, cần tuân theo quy tắc như đặt tên biến
  •     parameter : Tham số của hàm, đây được coi như đầu vào của hàm. Bạn có thể xây dựng bao nhiêu tham số tùy ý và lựa chọn kiểu dữ liệu cho từng tham số.
  •     code : Các câu lệnh bên trong của hàm 


Lời Gọi Hàm

Sau khi xây dựng hàm xong để hàm có thể thực thi bạn cần gọi nó trong hàm main() và truyền cho nó tham số (parameter) nếu cần.


Khi bạn gọi hàm trong hàm main thì các câu lệnh bên trong hàm sẽ được thực thi, sau khi thực thi hết các câu lệnh thì hàm kết thúc và chương trình tiếp tục thực hiện các câu lệnh bên dưới hàm.


Để dễ hiểu, cần một ví dụ.

Ở các phần trước hầu như mọi thứ nghĩ ra được, mọi thứ muốn thử nghiệm...chúng ta đều quẳng hết vào bên trong hàm main(), chương trình sẽ trở nên khó quản lý khi số lượng dòng code trở nên lớn, chương trình có tên Tào Lao chính vì thực tế không ai lập trình như vậy! Nhìn vào hoa cả mắt, ngay chính "thân chủ" cũng lúng túng không biết lệnh nào ra lệnh nào...

Chúng ta sẽ phải nói lời tạm biệt chương trình tào lao, nhưng trước khi làm cái việc "bất đắc dĩ" đó, chúng ta tiếp tục thử với Hàm.

Chúng ta sẽ cần 3 biến số nguyên so4, so5 và so6. Sau đó,ta sẽ viết một hàm tính Tổng của 3 số, cuối cùng ta sẽ dùng hàm đó để tính tổng của so4, so5 và so6.

Đây là khai báo 3 biến số nguyên:

    int  so4 = 2;
    int  so5 = 5;
    int  so6 = 7;

 

Đây là hàm tinhTong

int tinhTong(int a, int b, int c){
    int sum = a + b + c;
    return sum;
}

 

Chúng ta tạm để nó ngay trên hàm main().

Sau đó chúng ta sẽ gọi hàm này. Trước hết, ta gọi hàm tinhTong() bên trong hàm main() để nó làm mọi thứ trong lặng lẽ.


tinhTong(so4,so5,so6);

 

Đây là chương trình tào lao của chúng ta sau khi thêm những "mắm muối" trên:

 

#include <iostream>
#include <iomanip>

using namespace std;
//typedef long long ll;
//#define ll long long
using ll = long long;
#define greet cout << "Dat Viet Lap Trinh" << endl;
typedef int arr[3];
 
int tinhTong(int a, int b, int c){
    int sum = a + b + c;
    return sum;
}


int main(){
    greet;
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    int x = 15 < 25 ? 100 : 200;
    int diBien1= (10 < 20) && (20 >= 20);
    int diBien2= (10 > 20) || (20 < 10);
    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    a +=10;
    ll g = 1234567890;
    arr array1{ 1 , 2, 3};
    int so1 = 20;
    int so2 = 18;
    int so3 = 0;
    int time = 15;
    int ngayThu = 5;
    int  so4 = 2;
    int  so5 = 5;
    int  so6 = 7;



    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;
    cout << "Gia tri cua x : " << x << endl;
    cout << "Gia tri cua diBien1 : " << diBien1 << ". Gia tri cua diBien2 : " << diBien2 << endl;
    cout << "Gia tri cua diBien1 : " << boolalpha << diBien1 << ". Gia tri cua diBien2 : " << boolalpha << diBien2 << endl;
    cout << (100 > 50) << endl;
    cout << (20 <= 30) << endl;
    cout << (80 >= 100) << endl;
    cout << "Gia tri cua g : " << g << endl;
    greet;
    if (20 > 18) {
    cout << "20 lon hon 18"<<endl;
    }
    if (so1 > so2) {
    cout << "so1 lon hon so2"<< endl;
    }
 
    if(so2){
        cout << so2 << " khac 0" << endl;
    }
    if(so3){
        cout << so3 << " khac 0" << endl;
    }
    
    if(time < 8){
    cout << "O nha." << endl;;
    }
    else if((time >= 8 && time < 12) || (time >= 15 && time < 17)){
        cout << "Lam viec." << endl;
    }
    else if(time >= 12 && time < 13){
        cout << "Gio An trua." << endl;
    }
    else if(time >= 13 && time < 14){
        cout << "Hop Cong ty." << endl;
    }
    else if(time >= 14 && time < 15){
        cout << "Chuyen hang toi cac cua hang." << endl;
    }
    else{
        cout << "Ve nha." << endl;
    }
     
    switch (ngayThu) {
  case 1:
    cout << "Thu Hai";
    break;
  case 2:
    cout << "Thu Ba";
    break;
  case 3:
    cout << "Thu Tu";
    break;
  case 4:
    cout << "Thu Nam";
    break;
  case 5:
    cout << "Thu Sau";
    break;
  case 6:
    cout << "Thu Bay";
    break;
  case 7:
    cout << "Chu Nhat";
    break;
}
 
  tinhTong(so4,so5,so6);
 
}
 

 

Khi bấm Run để chạy chương trình, mọi thứ ổn, nhưng chúng ta không thấy gì khác lạ cả?? Đó là vì hàm trả về một số nguyên gọi là sum, và không in ra màn hình. Nếu muốn thấy khác lạ, chúng ta cần in nó ra màn hình.


 

Chúng ta tạo một biến và gán cho nó giá trị của tinhTong()

int so7 =  tinhTong(so4,so5,so6);

Sau đó ta in biến so7 ra màn hình.

cout << "Tong cua 3 so là: " << so7 << endl;

Khi bấm Run để chạy chương trình, ta đã thấy kết quả!



Đây là mã nguồn của chương trình tao lao phiên bản C++ cho đến lúc này:

#include <iostream>
#include <iomanip>

using namespace std;
//typedef long long ll;
//#define ll long long
using ll = long long;
#define greet cout << "Dat Viet Lap Trinh" << endl;
typedef int arr[3];
 
int tinhTong(int a, int b, int c){
    int sum = a + b + c;
    return sum;
}

int main(){
    greet;
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    int x = 15 < 25 ? 100 : 200;
    int diBien1= (10 < 20) && (20 >= 20);
    int diBien2= (10 > 20) || (20 < 10);
    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    a +=10;
    ll g = 1234567890;
    arr array1{ 1 , 2, 3};
    int so1 = 20;
    int so2 = 18;
    int so3 = 0;
    int time = 15;
    int ngayThu = 5;
    int  so4 = 2;
    int  so5 = 5;
    int  so6 = 7;


    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;
    cout << "Gia tri cua x : " << x << endl;
    cout << "Gia tri cua diBien1 : " << diBien1 << ". Gia tri cua diBien2 : " << diBien2 << endl;
    cout << "Gia tri cua diBien1 : " << boolalpha << diBien1 << ". Gia tri cua diBien2 : " << boolalpha << diBien2 << endl;
    cout << (100 > 50) << endl;
    cout << (20 <= 30) << endl;
    cout << (80 >= 100) << endl;
    cout << "Gia tri cua g : " << g << endl;
    greet;
    if (20 > 18) {
    cout << "20 lon hon 18"<<endl;
    }
    if (so1 > so2) {
    cout << "so1 lon hon so2"<< endl;
    }
 
    if(so2){
        cout << so2 << " khac 0" << endl;
    }
    if(so3){
        cout << so3 << " khac 0" << endl;
    }
    
    if(time < 8){
    cout << "O nha." << endl;;
    }
    else if((time >= 8 && time < 12) || (time >= 15 && time < 17)){
        cout << "Lam viec." << endl;
    }
    else if(time >= 12 && time < 13){
        cout << "Gio An trua." << endl;
    }
    else if(time >= 13 && time < 14){
        cout << "Hop Cong ty." << endl;
    }
    else if(time >= 14 && time < 15){
        cout << "Chuyen hang toi cac cua hang." << endl;
    }
    else{
        cout << "Ve nha." << endl;
    }
     
    switch (ngayThu) {
  case 1:
    cout << "Thu Hai";
    break;
  case 2:
    cout << "Thu Ba";
    break;
  case 3:
    cout << "Thu Tu";
    break;
  case 4:
    cout << "Thu Nam";
    break;
  case 5:
    cout << "Thu Sau";
    break;
  case 6:
    cout << "Thu Bay";
    break;
  case 7:
    cout << "Chu Nhat";
    break;
}
 
  int so7 =  tinhTong(so4,so5,so6);
  cout << "Tong cua 3 so là: " << so7 << endl;

 
}

Hàm trong lập trình C++ hoạt động như thế nào? Hình ảnh sau đây mô tả gọi một hàm do người dùng định nghĩa (tương tự như hàm tinhTong chúng ta vừa định nghĩa) bên trong hàm main(). Vì chương trình của chúng ta có tên là Tào Lao, nên ta cho tuốt mọi thứ vào hàm main(), thực tế lập trình, ta nên định nghĩa hàm ngoài main():




Khi một chương trình gọi một hàm, điều khiển chương trình được chuyển đến hàm được gọi. Một hàm được gọi thực hiện một nhiệm vụ đã định nghĩa và khi câu lệnh trả về của nó được thực hiện hoặc khi nó kết thúc bằng hàm đóng, nó sẽ trả về chương trình điều khiển quay trở lại chương trình chính.
 


 


Không có nhận xét nào:

Đăng nhận xét