13/10/2018, 16:24

Các loại hàm do người dùng định nghĩa trong lập trình C

Học lập trình C++ Để hiểu rõ hơn về các đối số và giá trị trả về từ hàm, các loại hàm do người dùng định nghĩa có thể được phân loại theo đối số truyền vào và kiểu trả về, như sau: Hàm không có đối số và không có giá trị trả về Hàm không có đối số và có giá trị trả về ...

Học lập trình C++

Để hiểu rõ hơn về các đối số và giá trị trả về từ hàm, các loại hàm do người dùng định nghĩa có thể được phân loại theo đối số truyền vào và kiểu trả về, như sau:

  • Hàm không có đối số và không có giá trị trả về
  • Hàm không có đối số và có giá trị trả về
  • Hàm có đối số và không có giá trị trả về
  • Hàm có đối số và có giá trị trả về

4 chương trình dưới đây kiểm tra xem một số nguyên được nhập bởi người dùng có phải là số nguyên tố hay không. Và, tất cả các chương trình này tạo ra cùng một đầu ra. Sau đây là các ví dụ về các loại hàm do người dùng định nghĩa trong lập trình C:

Ví dụ 1: Hàm không có đối số và không có giá trị trả về

#include <stdio.h>

void checkPrimeNumber();

int main()
{
    checkPrimeNumber(); // khong co doi so nao duoc chuyen vao ham nay
    return 0;
}

// kieu tra ve cua ham la void vi khong co gia tri nao duoc tra ve tu ham
void checkPrimeNumber()
{
    int n, i, flag=0;

    printf("Nhap mot so nguyen duong: ");
    scanf("%d",&n);

    for(i=2; i <= n/2; ++i)
    {
        if(n%i == 0)
        {
            flag = 1;
        }
    }
    if (flag == 1)
        printf("%d khong phai la mot so nguyen to.", n);
    else
        printf("%d la mot so nguyen to.", n);
}

Hàm checkPrimeNumber() có đầu vào từ người dùng, kiểm tra cho dù đó là một số nguyên tố hay không và hiển thị nó trên màn hình.

Các dấu ngoặc đơn trống trong câu lệnh checkPrimeNumber(); bên trong hàm main() chỉ ra rằng không có đối số nào được truyền cho hàm.

Kiểu trả về của hàm là void. Do đó, không có giá trị nào được trả về từ hàm.

Ví dụ 2: Hàm không có đối số và có giá trị trả về

#include <stdio.h>
int getInteger();

int main() {
    int n, i, flag = 0;

    // khong co doi so nao duoc chuyen vao ham nay
    // gia tri tra ve tu ham nay duoc gan cho n
    n = getInteger();

    for (i = 2; i <= n/2; ++i) {
        if (n % i == 0) {
            flag = 1;
            break;
        }
    }

    if (flag == 1)
        printf("%d khong phai la mot so nguyen to.", n);
    else
        printf("%d la mot so nguyen to.", n);

    return 0;
}

// ham getInteger() tra ve mot so nguyen duong
int getInteger() {
    int n;

    printf("Nhap mot so nguyen duong: ");
    scanf("%d",&n);

    return n;
}

Dấu ngoặc đơn trống trong câu lệnh n = getInteger(); chỉ ra rằng không có đối số nào được truyền cho hàm. Và, giá trị trả về từ hàm được gán cho n.

Ở đây, hàm getInteger() nhận đầu vào từ người dùng và trả về nó. Mã để kiểm tra xem một số có phải là số nguyên tố hay không nằm trong hàm main().

Ví dụ 3: Hàm có đối số và không có giá trị trả về

#include <stdio.h>

void checkPrimeAndDisplay(int n);

int main() {
    int n;

    printf("Nhap mot so nguyen duong: ");
    scanf("%d",&n);

    // n duoc truyen vao ham
    checkPrimeAndDisplay(n);

    return 0;
}

// void chi ra rang khong co gia tri nao duoc tra ve tu ham
void checkPrimeAndDisplay(int n)
{
    int i, flag = 0;

    for(i = 2; i <= n/2; ++i) {
        if(n%i == 0) {
            flag = 1;
            break;
        }
    }
    if (flag == 1)
        printf("%d khong phai la mot so nguyen to.", n);
    else
        printf("%d la mot so nguyen to.", n);
}

Giá trị số nguyên do người dùng nhập vào được chuyển đến hàm checkPrimeAndDisplay().

Ở đây, hàm checkPrimeAndDisplay() kiểm tra xem đối số đã truyền có phải là số nguyên tố hay không và hiển thị thông báo thích hợp.

Ví dụ 4: Hàm có đối số và có giá trị trả về

#include <stdio.h>

int checkPrimeNumber(int n);

int main()
{
    int n, flag;

    printf("Nhap mot so nguyen duong: ");
    scanf("%d", &n);

    // n duoc truyen vao ham checkPrimeNumber()
    // gia tri tra ve tu ham duoc gan cho bien flag
    flag = checkPrimeNumber(n);

    if (flag == 1)
        printf("%d khong phai la mot so nguyen to.", n);
    else
        printf("%d la mot so nguyen to.", n);

    return 0;
}

/*
 * Mot so nguyen duoc tra ve tu ham nay
 * parameter: n - so nguyen duong
 * return: 0 - n la so nguyen to
 *         1 - n khong phai la so nguyen to
 */
int checkPrimeNumber(int n) {
    int i;

    for (i = 2; i <= n/2; ++i) {
        if (n%i == 0)
            return 1;
    }

    return 0;
}

Dữ liệu đầu vào từ người dùng được chuyển đến hàm checkPrimeNumber().

Hàm checkPrimeNumber() kiểm tra xem đối số được truyền vào là số nguyên tố hay không. Nếu đối số được truyền là một số nguyên tố, hàm trả về 0. Nếu đối số đã truyền không là một số nguyên tố, hàm trả về 1. Giá trị trả về được gán cho biến flag.

Cách tiếp cận nào tốt hơn?

Nó phụ thuộc vào vấn đề bạn đang cố gắng giải quyết. Trong trường hợp của vấn đề này, cách tiếp cận cuối cùng là tốt hơn.

Một hàm nên thực hiện một tác vụ cụ thể. Hàm checkPrimeNumber() không lấy dữ liệu đầu vào từ người sử dụng cũng không hiển thị thông báo đến người sử dụng. Nó chỉ kiểm tra xem một số là nguyên tố hay không, mà làm cho code có tính mô-đun, dễ hiểu và gỡ lỗi.

Học lập trình C++
0