Tài liệu Hàm

Thảo luận trong 'Căn Bản' bắt đầu bởi Thúy Viết Bài, 5/12/13.

  1. Thúy Viết Bài

    Thành viên vàng

    Bài viết:
    198,891
    Được thích:
    167
    Điểm thành tích:
    0
    Xu:
    0Xu
    Hàm


    Mục tiêu:

    Kết thúc bài học này, bạn có thể:

    Ø Tìm hiểu về cách sử dụng các hàm
    Ø Tìm hiều về cấu trúc của một hàm
    Ø Khai báo hàm và các nguyên mẫu hàm
    Ø Thảo luận các kiểu khác nhau của biến
    Ø Tìm hiểu cách gọi các hàm:
    · Gọi bằng giá trị
    · Gọi bằng tham chiếu


    Ø Tìm hiểu về các qui tắc về phạm vi của hàm
    Ø Tìm hiểu các hàm trong các chương trình có nhiều tập tin
    Ø Tìm hiểu về các lớp lưu trữ
    Ø Tìm hiểu về con trỏ hàm.

    Giới thiệu


    Một hàm là một đoạn chương trình thực hiện một tác vụ được định nghĩa cụ thể. Chúng thực chất là những đoạn chương trình nhỏ giúp giải quyết một vấn đề lớn.

    15.1 Sử dụng các hàm


    Nói chung, các hàm được sử dụng trong C để thực thi một chuỗi các lệnh liên tiếp. Tuy nhiên, cách sử dụng các hàm thì không giống với các vòng lặp. Các vòng lặp có thể lặp lại một chuỗi các chỉ thị với các lần lặp liên tiếp nhau. Nhưng việc gọi một hàm sẽ sinh ra một chuỗi các chỉ thị được thực thi tại vị trí bất kỳ trong chương trình. Các hàm có thể được gọi nhiều lần khi có yêu cầu. Giả sử một phần của mã lệnh trong một chương trình dùng để tính tỉ lệ phần trăm cho một vài con số. Nếu sau đó, trong cùng chương trình, việc tính toán như vậy cần phải thực hiện trên những con số khác, thay vì phải viết lại các chỉ thị giống như trên, một hàm có thể được viết ra để tính tỉ lệ phần trăm của bất kỳ các con số. Sau đó chương trình có thể nhảy đến hàm đó, để thực hiện việc tính toán (trong hàm) và trở về nơi nó đã được gọi. Điều này sẽ được giải thích rõ ràng hơn khi thảo luận về cách hoạt động của các hàm.

    Một điểm quan trọng khác là các hàm thì dễ viết và dễ hiểu. Các hàm đơn giản có thể được viết để thực hiện các tác vụ xác định. Việc gỡ rối chương trình cũng dễ dàng hơn khi cấu trúc chương trình dễ đọc, nhờ vào sự đơn giản hóa hình thức của nó. Mỗi hàm có thể được kiểm tra một cách độc lập với các dữ liệu đầu vào, với dữ liệu hợp lệ cũng như không hợp lệ. Các chương trình chứa các hàm cũng dễ bảo trì hơn, bởi vì những sửa đổi, nếu yêu cầu, có thể được giới hạn trong các hàm của chương trình. Một hàm không chỉ được gọi từ các vị trí bên trong chương trình, mà các hàm còn có thể đặt vào một thư viện và được sử dụng bởi nhiều chương trình khác, vì vậy tiết kiệm được thời gian viết chương trình.

    15.2 Cấu trúc hàm


    Cú pháp tổng quát của một hàm trong C là:

    type_specifier function_name (arguments)
    {
    body of the function
    return statement
    }

    type_specifier xác định kiểu dữ liệu của giá trị sẽ được trả về bởi hàm. Nếu không có kiểu được đưa ra, hàm cho rằng trả về một kết quả số nguyên. Các đối số được phân cách bởi dấu phẩy. Một cặp dấu ngoặc rỗng () vẫn phải xuất hiện sau tên hàm ngay cả khi nếu hàm không chứa bất kỳ đối số nào. Các tham số xuất hiện trong cặp dấu ngoặc () được gọi là tham số hình thức hoặc đối số hình thức. Phần thân của hàm có thể chứa một hoặc nhiều câu lệnh. Một hàm nên trả về một giá trị và vì vậy ít nhất một lệnh return phải có trong hàm.

    15.2.1 Các đối số của một hàm

    Trước khi thảo luận chi tiết về các đối số, xem ví dụ sau,

    #include <stdio.h>
    main()
    {
    int i;
    for(i =1; i <=10; i++)
    printf(“
    Square of %d is %d “, i,squarer (i));
    }

    squarer(int x)
    /* int x; */
    {
    int j;
    j = x * x;
    return(j);
    }

    Chương trình trên tính tính bình phương các số từ 1 đến 10. Điều này được thực hiện bằng việc gọi hàm squarer. Dữ liệu được truyền từ thủ tục gọi (trong trường hợp trên là hàm main()) đến hàm được gọi squarer thông qua các đối số. Trong thủ tục gọi, các đối số được biết như là các đối số thực và trong định nghĩa của hàm được gọi (squarer()) các đối số được gọi là các đối số hình thức. Kiểu dữ liệu của các đối số thực phải cùng kiểu với các đối số hình thức. Hơn nữa, số lượng và thứ tự của các tham số thực phải giống như của các tham số hình thức.

    Khi một hàm được gọi, quyền điều khiển sẽ được chuyển đến cho nó, ở đó các đối số hình thức được thay thế bởi các đối số thực. Sau đó hàm được thực thi và khi bắt gặp câu lệnh return, nó sẽ chuyển quyền điều khiển cho chương trình gọi nó.

    Hàm squarer() được gọi bằng cách truyền số cần được tính bình phương. Đối số x có thể được khai báo theo một trong các cách sau khi định nghĩa hàm.

    Phương pháp 1

    squarer(int x)
    /* x được định nghĩa cùng với kiểu dữ liệu trong cặp dấu ngoặc ()*/

    Phương pháp 2

    squarer(x)
    int x;
    /* x được đặt trong cặp dấu ngoặc (), và kiểu của nó được khai báo ngay sau tên hàm */

    Chú ý, trong trường hợp sau, x phải được định nghĩa ngay sau tên hàm, trước khối lệnh. Điều này thật tiện lợi khi có nhiều tham số có cùng kiểu dữ liệu được truyền. Trong trường hợp như vậy, chỉ phải chỉ rõ kiểu đề một lần duy nhất tại điểm bắt đầu.

    Khi các đối số được khai báo trong cặp dấu ngoặc (), mỗi đối số phải được định nghĩa riêng lẻ, cho dù chúng có cùng kiểu dữ liệu. Ví dụ, nếu x và y là hai đối số của một hàm abc(), thì abc(char x, char y) là một khai báo đúng và abc(char x, y) là sai.

    15.2.2 Sự trả về từ hàm

    Lệnh return có hai mục đích:

    Ø Ngay lập tức trả điều khiển từ hàm về chương trình gọi
    Ø Bất kỳ cái gì bên trong cặp dấu ngoặc () theo sau return được trả về như là một giá trị cho chương trình gọi.

    Trong hàm squarer(), một biến j kiểu int được định nghĩa để lưu giá trị bình phương của đối số truyền vào. Giá trị của biến này được trả về cho hàm gọi thông qua lệnh return. Một hàm có thể thực hiện một tác vụ xác định và trả quyền điều khiển về cho thủ tục gọi nó mà không cần trả về bất kỳ giá trị nào. Trong trường hợp như vậy, lệnh return có thể được viết dạng return(0) hoặc return. Chú ý rằng, nếu một hàm cung cấp một giá trị trả về và nó không làm điều đó thì nó sẽ trả về giá trị không thích hợp.

    Trong chương trình tính bình phương của các số, chương trình truyền dữ liệu tới hàm squarer thông qua các đối số. Có thể có các hàm được gọi mà không cần bất kỳ đối số nào. Ở đây, hàm thực hiện một chuỗi các lệnh và trả về giá trị, nếu được yêu cầu

    Chú ý rằng, hàm squarer() cũng có thể được viết như sau
     

    Các file đính kèm:

Đang tải...