Exercise 14 Lập Trình C – Learn C The Hard Way


Exercise 14: Writing And Using Functions

Bài tiếp theo trong loạt bài học lập trình C trên môi trường linux là viết và sử dụng hàm (function). Đây là một bài cực kì quan trọng. Nó liên quan rất nhiều thứ sau này, cái đơn giản nhất là coding style. Sau này khi đi vào lập trình nhúng hay lập trình gì đi chăng nữa, thì các bạn phải thực hiên code trên rất nhiều file, nghĩa là chia thành nhiều module khác nhau. Dự án có thể có nhiều người làm, một người hay một nhóm người sẻ đảm nhiệm 1 module, và trong module sẽ có rất nhiều hàm, dường như tất cả đều quy về hàm. Các bạn hãy tập làm quen ngay từ bây giờ.
Mở linux lên và thực hành nào! Tạo Makefile và file ex14.c như sau:

#include <stdio.h>
#include <ctype.h>

//forward declarations
int can_print_it(char ch);
void print_letters(char arg[]);

void print_arguments(int argc, char *argv[])
{
    int i = 0;
    
    for(i = 0; i < argc; i++)
    {
        print_letters(argv[i]);
    }
}

void print_letters(char arg[])
{
    int i = 0;

    for(i = 0; arg[i] != '\0'; i++)
    {
        char ch = arg[i];

        if(can_print_it(ch))
        {
            printf("'%c' == %d ", ch, ch);
        }
    }

    printf("\n");
}

int can_print_it(char ch)
{
    return isalpha(ch) || isblank(ch);
}

int main(int argc, char *argv[])
{
    print_arguments(argc, argv);
    return 0;
}

Code chỉ có vậy thôi! Bây giờ là phần giải thích code nhé!
1. Trong code chúng ta có sử dụng thêm một header file là ctype.h, và 2 hàm chúng ta sử dụng nằm trong header này: isalpha và isblank.
2. Trước khi sử dụng hàm, chúng ta sẽ khai báo hàm trước, giống như khai báo biến vậy, ở đoạn code phần khai báo hàm là dòng 5 và 6 nhé. Chúng ta có tổng cộng 3 hàm, vậy sao chỉ khai báo 2 hàm? Chúng ta giải thích đơn giản thế này: Khi trình biên dịch gọi 1 hàm, nếu hàm này được định nghĩa rồi thì sẽ không báo lỗi. Nhìn dòng thứ 14, khi trình biên dịch chạy tới đây, thì nó hiểu hàm print_letters là gì vì đã được khai báo từ trước, hàm print_arguments không được khai báo vì trình biên dịch sẽ biên dịch từng dòng 1 từ trên xuống dưới, trình biên dịch không gặp lời gọi hàm này, mà gặp luôn định nghĩa hàm nên không cần phải khai báo trước.
3. Hàm isalpha

int isalpha(int c);

c là mã ASCII của kí tự cần kiểm tra, khi c là chữ cái hàm trả về một số khác 0, ngược lại hàm trả về 0.
4. Hàm isblank

int isblank(int c);

c là mã ASCII của kí tự cần kiểm tra, c là khoảng trắng thì trả về một kí tự khác 0, ngược lại trả về 0.
5. Các bạn cứ từ từ nghiền ngẫm code + thực hành thì sẽ nhanh hiểu thôi, đừng chỉ đọc qua!
Các bạn thực hành như bên dưới nhé!

$ make ex14
cc -Wall -g
ex14.c
-o ex14
$ ./ex14
'e' == 101 'x' == 120
$ ./ex14 hi this is cool
'e' == 101 'x' == 120
'h' == 104 'i' == 105
't' == 116 'h' == 104 'i' == 105 's' == 115
'i' == 105 's' == 115
'c' == 99 'o' == 111 'o' == 111 'l' == 108
$ ./ex14 "I go 3 spaces"
'e' == 101 'x' == 120
'I' == 73 ' ' == 32 'g' == 103 'o' == 111 ' ' == 32 ' ' == 32 's' == 115 'p' == 112
,→'a' == 97 'c' == 99 'e' == 101 's' == 115
$

Reseach

1. Đương nhiên là hiểu từng dòng code 1 trong chương trình phía trên rồi. Và từ đó hình dung ra cách khai báo hàm!

[Kiểu trả về của hàm] [Tên hàm]([Tham số vào của hàm])
{
    code;
    return value;
}

2. Tìm hiểu thêm về hàm và cách kiểu trả về của hàm.
3. Google search về 2 hàm isalpha và isblank.

End

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s