Bài tập về hàm trong lập trình c năm 2024

Đối với những bài tập lập trình C dễ thì chắc chắn sẽ không hề làm khó được bạn đúng không? Nhưng để trở thành lập trình viên giỏi thì bạn sẽ phải giải quyết được các bài tập lập trình C từ dễ đến phức tạp.

Show

    Vậy khi gặp một bài tập lập trình C khó thì bạn cần làm thế nào? Trước tiên, tốt nhất là bạn phải làm thế nào để hiểu được đề bài, hiểu bài hỏi gì và định hướng được cách giải. Mẹo giải bài tập lập trình C ở đây chính là bạn nên tìm một bài tập tương tự trong các cuốn sách học lập trình C.

    Bài tập về hàm trong lập trình c năm 2024

    Việc hiểu được bài giải của bài tập đó sẽ giúp bạn vỡ ra vô số vấn đề và có thể dễ dàng giải quyết khúc mắc mà bạn còn mắc phải. Lưu ý là dù đọc phần giải có thế nào thì quan trọng là bạn phải hiểu được cách giải để có thể áp dụng được vào bài tập của mình nhé!

    2. Biểu diễn các thuật toán lập trình C bằng lưu đồ

    Nếu bạn đã thành taho các cú pháp, câu lệnh thông dụng và các từ khóa trong ngôn ngữ lập trình C thì bạn hãy thử biểu diễn các thuật toán đơn giản nhất bằng lưu đồ xem. Sau khi đã làm được thì bạn hãy thử biên dịch, thực thi và cố gắng đọc các thông báo và sửa các lỗi nếu có.

    Khi bạn đã thành thạo chúng ở những bài tập đơn giản thì việc thực hiện thuật toán, giải các bài tập lập trình C phức tạp sẽ bớt khó khăn hơn nhiều.

    3. Sử dụng các hàm, các thư viện có sẵn

    Trong các bài tập lập trình C bạn hãy thử sử dụng các hàm, các thư viện có sẵn để tìm lời giải nhanh nhất. Cái quan trọng là bạn biết thử và vận dụng nhiều cách để trả lời được câu hỏi mà bài toán đưa ra.

    Bài tập về hàm trong lập trình c năm 2024

    Mỗi bài toán như bạn biết sẽ có nhiều cách triển khai và nhiều phương pháp giải khác nhau. Dù là sử dụng phương pháp giải bài tập lập trình C nào thì quan trọng là sau mỗi bài tập bạn sẽ rút ra được cho mình những kiến thức, kinh nghiệm quý báu.

    4. Hệ thống được những kiến thức sau mỗi bài tập

    Có thể nói, để trở thành lập trình viên giỏi thì trau dồi kiến thức không chỉ ở những bài giảng, ở lý thuyết mà còn ở những bài tập mà bạn giải. Sau mỗi bài giải bạn nên hệ thống cho mình những kiến thức mới và cũ. Từ đó sẽ giúp ích cho việc giải các bài tập lập trình C sau này.

    5. Hỏi ý kiến “người thân”

    Và tip cuối cùng giúp giải bài tập lập trình C chính là hỏi người có chuyên môn hơn. Bạn có thể hỏi những người bạn, người thầy để có được cách giải bài tập lập trình C chính xác nhất hay đơn giản là đăng ký tham gia một khóa học lập trình tốt nhất.

    Bài tập về hàm trong lập trình c năm 2024

    MindX hy vọng với một vài kinh nghiệm giải bài tập lập trình C trên sẽ giúp bạn không hề gặp khó khăn trước bất kể một câu hỏi nào nữa!

    Bạn đã từng sử dụng các hàm như sqrt, pow, abs... của các thư viện có sẵn trong C, tuy nhiên để giải quyết bài toán của bạn thì bạn cần phải tự xây dựng các hàm để giải quyết các chức năng nhỏ cho bài toán của mình.

    Hàm (function) là một các khối lệnh có nhiệm vụ thực hiện một chức năng nào đó.

    Ở các bài học trước bạn đều viết mã nguồn C 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, cùng điểm qua các lợi ích của việc sử dụng hàm

    loi ich

    Cú Pháp :

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

    Các thành phần của hàm :

    • 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 (tương ứng với kiểu trả về là rỗng)
    • 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

    Ví dụ 1 : Hàm có kiểu trả về là int, có 3 tham số là a, b, c

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } Ví dụ 2 : Hàm có kiểu trả về là void, có 3 tham số là a kiểu int, b kiểu long long, c kiểu double

    void display(int a, long long b, double c){

    printf("%d %lld %.2lf\n", a, b, c);  
    
    }


    2. 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ố 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.

    Mỗi lần bạn gọi hàm thì các câu lệnh trong hàm sẽ được thực hiện.

    function_call

    Ví dụ 1 :

    include "stdio.h"

    void greet(){

    printf("Hello 28tech !\n");  
    printf("blog.28tech.com.vn\n");  
    
    } int main(){
    printf("Before\n");  
    greet();   
    printf("After\n");  
    return 0;  
    
    }

    Output :

    Before Hello 28tech ! blog.28tech.com.vn After

    Giải thích :

    1. Hàm main thực hiện câu lệnh đầu tiên in ra "Before"
    2. Câu lệnh thứ 2 trong main là lời gọi hàm greet(), chương trình tiến hành nhảy vào bên trong hàm greet() và thực hiện lần lượt 2 câu lệnh in ra "Hello 28tech !" và "blog.28tech.com.vn"
    3. Sau khi thực hiện xong 2 câu lệnh thì hàm greet() kết thúc tương đương câu lệnh thứ 2 trong main thực hiện xong
    4. Hàm main tiếp tục thực hiện câu lệnh thứ 3 in ra "After" sau đó kết thúc chương trình

    3. Đối Số Và Tham Số

    Tham số (Parameter) hay tham số hình thức là các thành phần khi bạn xây dựng hàm, xem xét ví dụ dưới đây thì a, b, c sẽ được gọi là tham số

    Đối số (Argument) hay tham số chính thức là các giá trị bạn truyền vào cho hàm khi gọi hàm, xem xét ví dụ dưới đây thì m, n, p được gọi là đối số

    Khi bạn gọi hàm thì lần lượt giá trị của các đối số sẽ được gán cho tham số, trong ví dụ dưới thì m được gán cho a, n được gán cho b, p được gán cho c. Những gì thay đổi trên tham số sẽ không có ảnh hưởng gì tới đối số

    Chú ý : Kiểu dữ liệu của đối số và tham số nên trùng nhau hoặc của tham số nên là kiểu dữ liệu lớn hơn kiểu dữ liệu của đối số. Ví dụ bạn xây dựng 1 hàm có tham số là long long thì nó có thể áp dụng với 1 số int nhưng ngược lại thì không.

    Ví dụ 1 :

    include "stdio.h"

    void display(int a, int b, int c){

    printf("%d %d %d\n", a, b, c);  
    
    } int main(){
    int m = 100, n = 200, p = 300;  
    display(m, n, p);  
    return 0;  
    
    }

    Output :

    100 200 300

    Ví dụ 2 :

    include "stdio.h"

    void display(int a, int b, int c){

    printf("%d %d %d\n", b, a, c);  
    
    } int main(){
    int x = 30;  
    display(100.2, 200.3, x);  
    return 0;  
    
    }

    Output :

    200 100 30

    Giải thích :

    1. a được gán giá trị là 100.2 nhưng do a có kiểu là int nên chỉ lưu được 100
    2. b được gán giá trị là 200.3 nhưng do b có kiểu là int nên chỉ lưu được 200
    3. c được gán giá trị của x tương tương với 30
    4. Câu lệnh in ra b, c, a lần lượt là 200 100 30

    Ví dụ 3 : Thay đổi tham số sẽ không ảnh hưởng gì tới đố số

    include "stdio.h"

    void thaydoi(int n){

    n += 28;  
    printf("%d\n", n);  
    
    } int main(){
    int a = 100;  
    thaydoi(a);  
    printf("%d\n", a);  
    return 0;  
    
    }

    Output :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 0

    Giải thích :

    1. Tham số n được gán giá trị của đối số a nên n = 100
    2. n += 28 => n = 128, câu lệnh printf bên trong hàm thay đổi in ra n sẽ là 128
    3. Hàm kết thúc, câu lệnh in ra a thì a vẫn là 100

    4.Câu Lệnh Return

    Khi hàm của bạn thực hiện các chức năng tính toán và mong muốn trả về 1 giá trị cụ thể thì bạn cần câu lệnh return, trong các ví dụ trên thì hàm của mình đều không cần trả về giá trị nào nên mình để kiểu trả về là void.

    Giả sử bạn cần viết hàm tính tổng của 3 số nguyên, khi đó hàm sẽ nhận vào tham số là 3 số nguyên và cần trả về tổng 3 số. Vậy bạn cần xác định tổng của 3 số đó sẽ có kiểu là gì để làm kiểu trả về cho hàm và bổ sung thêm câu lệnh return kèm giá trị bạn muốn trả về.

    Có thể hiểu đơn giản giá trị đi kèm với return chính là kết quả mà hàm trả về cho bạn khi bạn gọi hàm.

    Ví dụ 1 : Hàm tính tổng 3 số nguyên int

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 1

    Output :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 2

    Ví dụ 2 : Hàm tính giai thừa của số n

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 3

    Output :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 4

    Chú ý :

    1. Hàm của bạn sẽ kết thúc ngay khi gặp câu lệnh return và giá trị return đầu tiên đó sẽ được trả về cho hàm
    2. Kiểu dữ liệu trả về của hàm với kiểu của biến mà bạn sử dụng trong câu lệnh return cần giống nhau. Ví dụ hàm factorial trả về long long thì khi trả về biến gt thì biến gt cũng nên có kiểu long long, nếu bạn sử dụng gt kiểu int có thể bị tràn dữ liệu, khi đó kiểu trả về là long long cũng không tự khôi phục cho bạn được kết quả đúng

    Ví dụ 3 :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 5

    Output :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 6

    Ví dụ 4 :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 7

    Output :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 8


    5.Chú Ý Khi Xây Dựng Hàm

    chu_y_khi_xay_dung_ham

    1. Hàm này có cần trả về giá trị không, nếu có thì trả về kiểu dữ liệu là gì ?
    2. Hàm này có bao nhiêu tham số, các tham số có kiểu dữ liệu là gì ?
    3. Hàm của bạn xây dựng đã đủ tổng quát chưa hay quá quá chi tiết và chỉ phù hợp cho 1 bài toán cụ thể
    4. Bạn gọi hàm có đúng thứ tự tham số mà mình mong muốn hay không, kiểu dữ liệu của tham số hình thức và tham số chính thức có hợp lí hay không?
    5. Nếu hàm của khác void, thì hàm sẽ kết thúc ngay lập tức khi gặp câu lệnh return một giá trị nào đó, còn nếu hàm void mà các bạn muốn kết thúc tại thời điểm nào đó các bạn có thể sử dụng câu lệnh return; là đủ.

    Ví dụ bài toán : Tính tổng các ước của N và in ra màn hình

    Cách 1 :

    int tong(int a, int b, int c){

    int sum = a + b + c;  
    return sum;  
    
    } 9

    Phân tích : Cách làm này không sai, code này sẽ tiến hành nhập, tính tổng và in ra luôn trong hàm xử lý. Tất cả các công việc đều được xử lý bởi hàm xuly(), tuy nhiên cách làm này không phù hợp vì hàm chưa đủ tổng quát.

    Ví dụ nếu muốn tính tổng các ước của từng số từ 1 tới n thì hàm này không dùng được, hoặc chỉ muốn lấy ra tổng của 1 số để thực hiện các chức năng khác thì hàm này cũng không sử dụng được.

    Cách 2 :

    void display(int a, long long b, double c){

    printf("%d %lld %.2lf\n", a, b, c);  
    
    } 0

    Phân tích : Cách làm này tổng quát hơn, hàm tính tổng ước của bạn có thể sử dụng bất cứ lúc nào bạn cần tính tổng ước của 1 số.

    Các thao tác nhập và xuất bạn nên xử lý trong hàm main, hàm chỉ nên có chức năng xử lý nhiệm vụ nhất định.