Trang 2 trên tổng số 3 Đầu tiênĐầu tiên 123 Cuối cùngCuối cùng
Từ 11 tới 20 trên tổng số 26 kết quả

Đề tài: Giáo trình C của Aptech [Elementary Programming With C]

  1. #11
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Mặc định Giáo trình C của Aptech [Elementary Programming With C]

    Bài 10: Vòng lặp - Thực hành

    1. Sử dụng vòng lặp "for"

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.    int num;
    7.    clrscr();
    8.    printf("\nThe even Numbers from 1 to 30 are \n");
    9.    for (num = 2; num<=30; num += 2)
    10.       printf("%d\n", num);
    11. }

    2. Sử dụng vòng lặp "while"

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.    int num;
    7.    clrscr();
    8.    num = 10;
    9.    printf("\n Countdown");
    10.    while (num >= 0)
    11.   {
    12.       printf("\n %d", num);
    13.       num--;
    14.   }
    15. }

    3. Sử dụng vòng lặp "do...while"

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.    int cnt = 0, num;
    7.    clrscr();
    8.    do
    9.    {
    10.       printf("\n Enter a Number");
    11.       scanf("%d", &num);
    12.       printf("No. is %d", num);
    13.       cnt++;
    14.    } while (num != 0);
    15.    printf("\n The total numbers entered were %d", --cnt);
    16. }

    4. Sử dụng lệnh "break"

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.    int cnt;
    7.    clrscr();
    8.    for (cnt = 1; cnt <= 10; cnt++)
    9.    {
    10.        if (cnt==5)
    11.            break;
    12.        printf("%d \t", cnt);
    13.    }
    14. }

    5. Sử dụng lệnh "continue"

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.    int cnt;
    7.    clrscr();
    8.    for (cnt = 1; cnt <= 10; cnt++)
    9.    {
    10.       if (cnt == 5)
    11.          continue;
    12.       printf("%d \t", cnt);
    13.    }
    14. }

    Bài tập bắt buộc

    1. Tìm giai thừa của một số

    Gợi ý: Xem công thức tính giai thừa của một số
    - n! = n * (n-1) * (n-2) * ... * 1

    Hết bài 10 rồi bà con

    Bài tập tự làm

    1. Khai báo một biến lưu tuổi của một người. In ra tên của người đó với số lần in bằng số tuổi.

    2. Viêt chương trình sinh dãy số theo dạng sau:

    Code:
    1
    12
    123
    1234
    12345
    123456
    1234567
    12345678
    123456789
    3. Viết chương trình in ra bảng cửu chương của một số được nhập vào
    Đã được chỉnh sửa lần cuối bởi Solokop : 04-02-2007 lúc 05:28 PM.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  2. #12
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bài 11: Mảng - Lý thuyết

    Giới thiệu

    - Có thể bạn sẽ gặp khó khăn khi lưu trữ một tập hợp các phần tử dữ liệu giống nhau trong các biến khác nhau. Ví dụ, điểm cho tất cả 11 cầu thủ của một đội bóng đá phải được ghi nhận trong một trận đấu. Sự lưu trữ điểm của mỗi cầu thủ trong các biến có tên khác nhau thì chắc chắn phiền hà hơn dùng một biến chung cho chúng. Với mảng mọi việc sẽ được thực hiện đơn giản hơn. Một mảng là một tập hợp các phần tử dữ liệu có cùng kiểu. Mỗi phần tử được lưu trữ ở các vị trí kế tiếp nhau trong bộ nhớ chính. Những phần tử này được gọi là phần tử mảng.

    1. Các phần tử mảng và các chỉ mục

    - Mỗi phần tử của mảng được định danh bằng một chỉ mục hoặc chỉ số gán cho nó. Chiều của mảng được xác định bằng số chỉ số cần thiết để định danh duy nhất mỗi phần tử. Một chỉ số nguyên dương được bao bằng dấu ngoặc vuông [ ] đặt ngay sau trên mảng, không có khoảng trắng ở giữa. Một chỉ số chứa các giá trị bắt đầu bằng 0. Cấu trúc của việc khai báo mảng

    Code:
    Kiểu_dữ_liệu Tên_mảng [ biểu_thức_kích_thước ]
    - Ở đây, biểu_thức_kích_thước là một biểu thức xác định số phần tử trong mảng và phải định ra một trị nguyên dương. Lớp_lưu_trữ là một tùy chọn. Mặc định lớp automatic được dùng cho mảng khai báo bên trong một hàm hoặc một khối lệnh, và lớp external được dùng cho mảng khai báo bên ngoài một hàm. Kiểu_dữ_liệu được dùng chỉ rõ kiểu dữ liệu thống nhất của các phần tử trong mảng và một mảng bao giờ cũng bằng đầu bằng chỉ số 0. Hầu hết các quy tắc đặt tên mảng là giống với quy tắc đặt tên biến. Một tên mảng và một tên biến không được giống nhau, nó dẫn đến sự nhập nhằng. Nếu một sự khai báo như vậy xuất hiện trong chương trình, trình biên dịch sẽ hiển thị thông báo lỗi.
    - Một vài quy tắc với mảng:
    + Tất cả các phần tử của một mảng có cùng kiểu.
    + Mỗi phần tử của mảng có thể được sử dụng bất cứ nơi nào mà một biến được cho phép hay được yêu cầu.
    + Một phần tử của mảng có thể được tham chiêu đến bằng cách sử dụng một biến hoặc một biểu thức nguyên
    + Kiểu dữ liệu của mảng có thế là: int, char, float, hoặc double.

    2. Việc quản lý mảng trong C:

    - Một mảng được "đối xử" khác với một biến trong C. Thậm chí hai mảng có cùng kiểu và kích thước cũng không thể tương đương nhau. Hơn nữa, không thể gán một mảng trực tiếp cho một mảng khác. Thay vì thế, mỗi phần tử mảng phải được gán riêng lẻ tương ứng với từng phần tử của mảng khác. Các giá trị không thể được gán cho toàn bộ một mảng, ngoại trừ tại thời điểm khởi tạo.

    a. Việc khởi tạo mảng

    - Các mảng không được khởi tạo tự động, trừ khi mỗi phần tử mảng được gán một giá trị riêng lẻ, không được khởi tạo tự động, do đó dễ gây ra kết quả không lường trước. Mỗi khi các phần tử của một mảng chưa khởi tạo được sử dụng trong các biểu thức toán học, các giá trị đã tồn tại sẵn trong ô nhớ sẽ được sử dụng, các giá trị này không đảm bảo rằng có cùng kiểu như khai báo của mảng, trừ khi các phần tử của mảng được khai tạo một cách rõ ràng. Điều này đùng không chỉ cho các mảng mà còn cho biến thông thường.
    - Trong trường hợp sự khởi tạo là tường minh, lớp extern hoặc static, các phần tử của mảng được bỏ qua khi khai báo, trình biên dịch sẽ xác định kích thước của mảng bằng cách đếm cac giá trị đang được khởi tạo.

    b. Các mảng chuỗi / ký tự

    - Một chuỗi có thể được khai báo như là mảng ký tự, và được kết thúc bởi một ký tự NULL. Mỗi ký tự của chuỗi chiếm 1 byte, và ký tự cuối cùng của chuối luôn là ký tự "\0". Ký tự "\0" được gọi là ký tự NULL. Nó là một mã thoát (escape sequence) tương tự như "\n", thay thế cho ký tự có giá trị 0. Vì "\0" luôn là ký tự cuối cùng của một chuỗi, nên các mảng ký tự phải có nhiều hơn một ký tự so với chiều dài tối đa mà chúng quản lý.
    - Mặc dù C không cso kiểu dữ liệu chuỗi, nhưng no cho phép các hằng chuỗi. Một hằng chuỗi là một dãy các ký tự được đặt trong dấu nháy đôi " ". C hỗ trợ nhiều hàm cho chuỗi, các hàm này nằm trong thư viện chuẩn string.h. Một vài hàm được đưa ra trong bảng dưới này

    <picture>

    c. Mảng hai chiều

    - Chúng ta đã biết thế nào là mảng một chiều. Điều này có nghĩa là các mảng chỉ có một chỉ số. Các mảng có thể có nhiều hơn một chiều. Các mảng đa chiều giúp dễ dàng trình bày các đối tượng đa chiều, chẳng hạn một đồ thị với các dòng và cột hay tọa độ màn hình của máy tính. Các mảng đa chiều được khai báo giống như các mảng một chiều, ngoại trừ có thêm một cặp dấu ngoặc vuông [ ] trong trường hợp mảng hai chiều. Một mảng ba chiều sẽ cần ba cặp ngoặc vuông...Một cách tổng quát đây là cách thức khai báo một mảng nhiều chiều.

    Code:
    Data_type ary[exp1][exp2][exp3]...[expN]
    - Ở đó, ary là một mảng có kiểu dữ liệu là data_type, và exp1,exp2,exp3,...,expN là các biểu thức nguyên dướng xác định số phần tử của mảng được kết hợp với mỗi chiều.

    Kết thúc bài 11 rồi, chuẩn bị ăn tết thôi mai chén nốt bài 12

    Bài tập tự làm

    1. Viết một chương trình để sắp xếp các tên sau đây theo thứ tự abc.

    Code:
    George
    Albert
    Tina
    Xavier
    Roger
    Tim
    William
    2. Viêt một chương trình đếm số ký tự nguyên âm trong một dòng văn bản

    3. Viết một chương trình nhập các số sau đây vào một mảng và đảo ngược mảng

    Code:
    34
    45
    56
    67
    89
    Đã được chỉnh sửa lần cuối bởi Solokop : 05-02-2007 lúc 07:18 PM.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  3. #13
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bài 12: Mảng - Thực hành

    1. Sự sắp xếp một mảng một chiều

    - Về các thuật toán sắp xếp trong mảng các bạn có thể tham khảo trực tiếp nhiều bài viết trên diễn đàn này. Đây là một ví dụ về việc sắp xếp trong mảng.

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main
    5. {
    6.    int n;
    7.    int num[100];
    8.    int L;
    9.    int desnum[100], k;
    10.    int i, i, temp;
    11.    printf("\nEnter the total number of marks to be entered: ");
    12.    scanf("%d", &n);
    13.    clrscr();
    14.    for(L=0;L<n;L++)
    15.    {
    16.       printf("\n Enter the marks of student %d : ", L+1);
    17.       scanf("%d", &num[L]);
    18.    }
    19.    for(k=0;k<n;k++)
    20.    {
    21.       desnum[k] = num[k]
    22.    }
    23.    for(i=0;i<n-1;i++)
    24.    {
    25.       for (j = i+1; j<n; j++)
    26.       {
    27.          if (desnum[i]<desnum[j])
    28.          {
    29.             temp = desnum[i];
    30.             desnum[i] = desnum[j];
    31.             desnum[j] = temp;
    32.          }
    33.       }
    34.    }
    35.    for(i=0;i<n;i++)
    36.       printf("\nNumber at [%d] is %d", i, desnum[i]);
    37. }

    2. Cộng ma trận sử dụng mảng hai chiều

    C Code:
    1. void main()
    2. {
    3.    int A[10][10], B[10][10], C[10][10];
    4.    int row, col;
    5.    int i,j;
    6.    printf("\nEnter the dimension of the matrix: ");
    7.    scanf("%d %d", &row, &col);
    8.    printf("\nEnter the values of the matrix A and B: \n");
    9.    for(i=0;i<row;i++)
    10.    {
    11.       for(j=0;j<col;j++)
    12.       {
    13.          printf("\n A[%d,%d], B[%d,%d]:", i, j, i, j);
    14.          scanf("%d%d", &A[i][j], &B[i][j]);
    15.          C[i][j] = A[i][j] + B[i][j];
    16.       }
    17.    }
    18.    for(i=0;i<row;i++)
    19.    {
    20.       for(j=0;j<col;j++)
    21.       {
    22.          printf("\n A[%d,%d]=%d, B[%d,%d]=%d, C[%d,%d]=%d\n", i, j, A[i][j], i, j, B[i][j], i, j, C[i][j]);
    23.       }
    24.    }
    25. }

    Bài tập bắt buộc

    1. Viêt một chương trình C nhập một tập hợp số vào trong một mảng và đảo ngược mảng.

    - Để thực hiện điều này:
    + Khai báo hai mảng
    + Nhập các giá trị vào một mảng.
    + Thực hiện vòng lặp theo thứ tự ngược trên mảng này để sao chép các giá trị vào mảng thứ hai. Dùng một chỉ số khác cho mảng thứ hai, chỉ số này chạy từ 0.

    Bài tập tự làm

    1. Viết một chương trình C để tìm giá trị nhỏ nhất và giá trị lớn nhất trong một mảng.
    2. Viêt một chương trình C để đếm số lượng nguyên âm và phụ âm trong một từ.
    Đã được chỉnh sửa lần cuối bởi Solokop : 09-02-2007 lúc 09:09 PM.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  4. #14
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bài 13: Con trỏ - Lý thuyết

    Giới thiệu

    - Con trỏ cung cấp một cách thức truy xuất biến mà không tham chiếu trực tiếp đến biến. Nó cung cấp cách thức sử dụng địa chỉ. Bài này sẽ đề cập đến các khái niệm về con trỏ và cách sử dụng chúng trong C.

    1. Con trỏ là gì?

    - Một con trỏ là một biến, nó chưa địa chỉ vùng nhớ của một biến khác, chứ không lưu trữ giá trị của biến đó. Nếu một biến chứa địa chỉ của một biến khac, thì biến này được gọi là con trỏ đến biến thứ hai kia. Một con trỏ cung cấp phương thức gián tiếp để truy xuất giá trị của các phần tử dữ liệu. Các con trỏ có thể trỏ đến các biến của các kiểu dữ liệ cớ sở như int, char, hay double hoặc dữ liệu có cấu trúc như mảng.

    2. Tại sao con trỏ được dùng?

    - Con trỏ có thể được sủ dụng trong một số trường hợp sau:
    + Để trả về nhiều hơn một giá trị từ một hàm.
    + Thuận tiện hơn trong việc truyền các mảng và chuỗi từ một hàm đến một hàm khác.
    + Sử dụng con trỏ để làm việc với các phần tử của mảng thay vì truy xuất trực tiếp vào các phần tử này98.
    + Để cấp phát bộ nhớ động và truy xuất vào vùng nhớ được cấp phát này (dynamic memory allocation)

    3. Các biến con trỏ

    - Nếu một biến được sử dụng như một con trỏ, nó phải được khai báo trước. Câu lệnh khai báo con trỏ bao gồm một kiểu dữ liệu cơ bản, một dấu *, và một tên biến. Cú pháp tổng quát để khai báo một biến con trỏ như sau:

    Code:
       type *name;
    - Ở đó type là một kiểu dữ liệu hợp lệ bất kỳ, và name là tên của biến con trỏ. Câu lện khai báo trên nói với trình biên dịch là name được sử dụng để lưu địa chỉ của một biến dữ liệu type. Trong câu lệnh khai báo, * xác định rằng một biến con trỏ đang được khai báo.
    - Kiểu dữ liệu cơ sở của con trỏ xác định kiểu của biến mà con trỏ trỏ đến. Về mặt kỹ thuật, một con trỏ có kiểu bất kỳ có thể trỏ đến bất kỳ vị trí nào trong bộ nhớ. Tuy nhiên, tất cả các phép toán số học trên con trỏ đều có liên quan đến kiểu cơ sở của nó, vì vậy khai báo kiểu dữ liệu của con trỏ một cách rõ ràng là điều rất quan trọng.

    4. Các toán tử con trỏ

    - Có hai toán tử đặc biệt được dùng với con trỏ: * và &. Toán tử & là một toán tử một ngôi và nó trả về địa chỉ của toán hạng. Toán tử thứ hai, toán tử *, được dùng với con trỏ là phần bổ xung của toán tử &. Nó là một toán tử một ngôi và trả về giá trị chứa trong vùng nhớ được trỏ bởi giá trị của biến con trỏ. Cả hai toán tử * và & có độ ưu tiên cao hơn tất cả các toán tử toán học ngoại trừ toán tử lấy giá trị âm. Chúng có cùng độ ưu tiên với toán tử với toán tử lấy giá trị âm

    5. Gán giá trị cho con trỏ

    - Các giá trị có thể được gán cho biến con trỏ thông qua toán tử &. Câu lệnh gán sẽ là:

    Code:
       pointer_variable = &variable;
    - Lúc này địa chỉ variable được lưu trong biến pointer_variable. Cũng có thể gán giá trị cho con trỏ thông qua một biến con trỏ khác trỏ đến phần tử dữ liệu có cùng kiểu.

    Code:
       pointer_variable = &variable;
       pointer_variable2 = pointer_variable;
    - Giá trị NULL cũng có thể được gán đến một biến con trỏ bằng số 0 như sau:

    Code:
       pointer_variable = 0;
    - Các biến cũng có thể được gán giá trị thông qua con trỏ của chúng.

    Code:
       *pointer_variable = 10;
    - Nói chung, các biểu thức có chứa con trỏ cũng theo cùng quy luật như các biểu thức khác trong C. Điều quan trọng cần chú ý phải gán giá trị cho biến con trỏ trước khi sử dụng chúng; nếu không chúng có thể trỏ đến một giá trị không xác định nào đó.

    6. Phép toán số học con trỏ

    - Chỉ phép cộng và trừ là các toán tử có thể được thực hiện trên các con trỏ, dưới đây là bảng liệt kê một vài ví dụ:



    - Mỗi khi con trỏ được tăng giá trị, nó sẽ trỏ đến ô nhớ của phần tử kế tiếp. Mỗi khi nó được giảm giá trị, nó sẽ trỏ đến vị trí của phần tử đứng trước nó. Với những con trỏ trỏ tới các ký tự, nó xuất hiện bình thường, bởi vì mỗi ký tự chiếm 1 byte. Tuy nhiên, tất cả những con trỏ khác sẽ tăng hoặc giảm trị tùy thuộc và độ dài kiểu dữ liệu mà chúng trỏ tới. Trong các ví dụ ở bảng trên, ngoài các toán tử tăng trị và giảm trị, các số nguyên cũng có thể được cộng vào và trừ ra với con trỏ. Ngoài phép cộng và trừ một con trỏ với một số nguyên, không có một phép toán nào khác có thể thực hiện được trên các con trỏ. Nói rõ hơn, các con trỏ không thể được nhân hoặc chia. Cũng như kiểu float và double không thể được cộng hoặc trừ với con trỏ.

    7. So sánh con trỏ

    - Hai con trỏ có thể so sánh trong một biểu thức quan hệ. Tuy nhiên, điều này chỉ có thể nếu cả hai biến này đều trỏ đến các biến có cùng kiểu dữ liệu. Ta giả sử có 2 biến con trỏ ptr_a và ptr_b là hai biến có cùng kiểu dữ liệu và đều trỏ đến các phần tử dữ liệu là a và b. Trong trường hợp này, các phép so sánh sau đây là có thể thực hiện được, đây là bảng liệt kê.



    - Tương tự ta có 2 con trỏ ptr_begin và ptr_end trỏ đến các phần tử của cùng một mảng thì ptr_end - ptr_begin sẽ trả về số bytes cách biệt giữa hai vị trí mà chúng trỏ đến.

    8. Con trỏ và mảng một chiều


    - Tên của một mảng thật ra là một con trỏ trỏ đến phần tử đầu tiên của mảng đó. Vì vậy, nếu ary là một mảng một chiều, thì địa chỉ địa chỉ phần tử đầu tiên trong mảng có thể được biểu diễn là &ary[0] hoặc đơn giản chỉ là ary. Tương tự, địa chỉ của phần tử mảng thứ hai có thể được viết như &ary[0] hoặc ary+1,... Tổng quát, địa chỉ của phần tử mảng thứ (i+1) có thể được biểu diễn là &ary[i] hoặc hay (ary+i). Như vậy, địa chỉ của một phần tử mảng bất kỳ có thể được biểu diễn theo hai cách:
    + Sử dụng ký hiệu & trước mỗi phần tử trong mảng
    + Sử dụng một biểu thức trong đó chỉ số được cộng vào tên của mảng, với giá trị của chỉ số cộng vào là một số nguyên.

    9. Con trỏ và mảng nhiều chiều

    - Một mảng nhiều chiều cũng có thể được biểu diễn dưới dạng con trỏ của mảng một chiều (tên của mảng) và một độ dời chỉ số. Thực hiện điều này là bởi vì một mảng nhiều chiều là một tập hợp của các mảng một chiều. Cú pháp như sau:

    Code:
       data_type (*ptr_var) [expr 2]...[expr N];
    Thay vì
    Code:
       data_type  [expr 1] [expr 2]...[expr N];
    - Trong khai báo trên data_type là kiểu dữ liệu của mảng, ptr_var là tên của biến con trỏ, array là tên mảng, và expr 1, expr 2, expr 3, ... expr N là các giá trị nguyên dương xác định số lượng tối đa các phần tử mảng được kết hợp với mỗi chỉ số. Chú ý dấu ngoặc () bao quanh tên mảng và dấu * phía trước trên mảng trong cách khai báo theo dạng con trỏ. Cặp dấu ngoặc () là không thể thiếu, ngược lại cú pháp khai báo sẽ khai báo một mảng của các con trỏ chứ không phải một con trỏ của một nhóm các mảng.
    - Có nhiều cách thức để định nghĩa mảng, và có nhiều cách để xử lý các phần tử mảng. Lựa chọn cách thức nào tùy thuộc và người dùng. Tuy nhiên, trong các ứng dụng có các mảng dạng số, định nghĩa mảng theo cách thông thường sẽ dễ dàng hơn.

    10. Con trỏ và chuỗi

    - Chuỗi đơn giản chỉ là một mảng một chiều có kiểu ký tự. Mảng và con trỏ có mối liên hệ mật thiết, và như vậy, một cách tự nhiên chuỗi cũng sẽ có mối liên hệ mật thiết với con trỏ. Xem trường hợp hàm strchr(), hàm này nhận các tham số là một chuỗi và một ký tự để tìm kiếm ký tự đó trong mảng nghĩa là,

    Code:
       ptr_str = strchr(str1, 'a');
    - Biến con trỏ ptr_str sẽ được gán địa chỉ của ký tự 'a' đầu tiên xuất hiện trong chuỗi str. Đây không phải là vị trí trong chuỗi, từ 0 đến cuối chuỗi, mà là địa chỉ, từ địa chỉ bắt đầu chuỗi đến địa chỉ kết thúc của chuỗi.

    11. Cấp phát bộ nhớ


    - Cho đến thời điểm này thì chúng ta đã biết đến trên của một mảng thật ra là một con trỏ trỏ tới phần tử đầu tiên của mảng. Hơn nữa, ngoài cách định nghĩa một mảng thông thường có thể định nghĩa một mảng như một biến con trỏ. Tuy nhiên, nếu một mảng được khai báo một cách bình thường, kết quả là một khối bộ nhớ cố định được dành sẵn tại thời điểm bắt đầu thực thi chương trình, trong khi điều này không xảy ra nếu mảng được khai báo như là một biến con trỏ. Sử dụng một biến con trỏ để biểu diễn một mảng đòi hỏi việc gán một vài ô nhớ khởi tạo trước khi các phần tử mảng được xử lý. Sự cấp phát bộ nhớ như vậy thông thường được thực hiện bằng cách sử dụng hàm thư viện.

    + malloc() : cấu trúc câu lệnh như sau:

    Code:
       pointer_name = malloc(block_of_memory * sizeof(type_data));
    - Trong đó pointer_name là một con trỏ, block_of_memory là khối bộ nhớ mà ta sẽ cung cấp cho mảng được nhân với sizeof(type_date) là kiểu dữ liệu được cung cấp cho mảng con trỏ.
    + free() : hàm này có thể được sử dụng để giải phóng bộ nhớ khi nó không còn cần thiết. Dạng tổng quát của hàm free() là:


    Code:
       void free(void *ptr);
    - Hàm free() giải phóng không gian được trỏ bởi ptr, không gian được giải phóng này có thể sử dụng cho việc cấp phát hoặc lưu trữ sau này

    + calloc() : cũng tương tự như malloc, nhưng khác biệt chính là mặc nhiên các giá trị được lưu trong không gian bộ nhớ đã cấp phát là 0. Với malloc, cấp phát bộ nhớ có thể có giá trị bất kỳ, đây là cấu trúc chung cho hàm calloc():

    Code:
       void * calloc(size_t num, size_t size);
    - calloc đòi hỏi hai đối số. Đối số thứ nhất là số các biến mà bạn muốn cấp phát bộ nhớ cho. Đối số thứ hai là kích thước của mỗi biến, cũng giống như malloc, calloc sẽ trả về một con trỏ rỗng (void) nếu sự cấp phát bộ nhớ là thành công, ngược lại nó sẽ trả về một con trỏ NULL.

    + realloc() : giả sử chúng ta đã cấp phát một số bytes cho một mảng nhưng sau đó nhận ra là bạn muốn thêm các giá trị. Bạn có thể sao chép mọi thứ vào một mảng lớn hơn, cách này không hiệu quả. Hoặc bạn có thể cấp phát thêm cá bytes sử dụng bằng cách họi hàm realloc, mà dữ liệu của bạn không bị mất đi.
    - relloc() nhận hai đối số. Đối số thứ nhất là một con trỏ tham chiếu đến bộ nhớ. Đối số thứ hai là tổng số bytes bạn muốn cấp phát thêm.

    Code:
       void * realloc(void *ptr, size_t size);
    - Nếu ta truyền giá trị 0 vào đối số thứ hai thì tương đương với việc gọi hàm free(). Hảm realloc trả về một con trỏ rỗng (void) nếu thành công, ngược lại một con trỏ NULL được trả về.
    Đã được chỉnh sửa lần cuối bởi Solokop : 06-03-2007 lúc 02:04 PM.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  5. #15
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bài 14 : Con trỏ - Thực hành

    1. Đếm số nguyên âm trong một chuỗi sử dụng con trỏ:

    C Code:
    1. void main()
    2. {
    3.    char *ptr;
    4.    char word[10];
    5.    int i, vowcnt = 0;
    6.  
    7.    printf("\nEnter a word:");
    8.    scanf("%s", word);
    9.    ptr = &word[0];
    10.  
    11.    for(i=0; i<strlen(word); i++)
    12.    {
    13.       if((*ptr=='a')||(*ptr=='e')||(*ptr=='i')||(*ptr=='o')||(*ptr=='u')||(*ptr=='A')||(*ptr=='E')||(*ptr=='I')||(*ptr=='O')||(*ptr=='U'))
    14.       {
    15.          vowcnt++;
    16.       }
    17.       ptr++;
    18.    }
    19.    printf("\nThe word is: %s \n The number of vowels in the word is: %d", word, vowcnt);
    20. }

    2. Sắp xếp một mảng theo thứ tự abc sử dụng con trỏ

    C Code:
    1. void main()
    2. {
    3.    char *ptr[5];
    4.    int i;
    5.    int j;
    6.    char cpyptr1[5][10], cpyptr2[5][10];
    7.    char *temp;
    8.  
    9.    for(i=0;i<5;i++)
    10.    {
    11.       printf("\nEnter a string:");
    12.       scanf("%s", cpyptr1[i]);
    13.       ptr[i] = cpyptr1[i];
    14.    }
    15.    for(i=0;i<5;i++)
    16.    {
    17.       strpcpy(cpyptr2[i], cpyptr1[i]);
    18.    }
    19.    for(i=0;i<4;i++)
    20.    {
    21.       for(j=i+1;j<5;j++)
    22.       {
    23.          if(strcmp(ptr[i], ptr[j])>0)
    24.          {
    25.             temp = ptr[i];
    26.             ptr[i] = ptr[j];
    27.             ptr[j] = temp;
    28.          }
    29.          printf("\n The Original list is");
    30.          for(i=0;i<5;i++)
    31.          {
    32.             printf("\n%s", cpyptr2[i]);
    33.          }
    34.          printf("\n The Sorted list is");
    35.          for(i=0;i<5;i++)
    36.          {
    37.             printf("\n%s", ptr[i]);
    38.          }
    39.       }
    40.    }
    41. }

    Bài tập bắt buộc

    - Viết một chương trình C để nối hai chuỗi bằng cách sử dụng các con trỏ.
    - Để thực hiện điều này:
    a. Khai báo ba biến chuỗi
    b. Khai báp ba con trỏ kiểu ký tự
    c. Nhập các giá trị của hai chuỗi
    d. Tạo ba con trỏ để trỏ đến ba biến chuỗi. Chuỗi thứ ba hiện tại không có bất kỳ giá trị gì.
    e. Lặp qua chuỗi thứ nhất và sao chép nội dung của chuỗi đó vào chuỗi thứ ba. Sử dụng cac biến con trỏ để sao chép các giá trị.
    f. Sau khi sao chép chuỗi thứ nhất, lặp qua chuỗi thứ hai và chép nội dung của chuỗi vào cuối chuỗi ba. Sử dụng các biến con trỏ để sao chép giá trị.
    g. In ra chuỗi thứ ba.

    Hết bài rồi

    Bài tập tự làm

    1. Viết một chương trình C để đảo một mảng ký tự bằng cách sự dụng con trỏ.
    2. Viết một chương trình để cộng hai ma trận sử dụng các con trỏ.
    Đã được chỉnh sửa lần cuối bởi Solokop : 06-03-2007 lúc 01:52 PM.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  6. #16
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Mặc định Giáo trình C của Aptech [Elementary Programming With C]

    Bài 15 : Hàm - Lý thuyết

    Giới thiệu


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

    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 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 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á 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ự dơ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.

    2. Cấu trúc hàm

    - Cú pháp tổng quát của một hàm trong C là:
    Code:
    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 trê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.

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

    - Phương pháp 1
    Code:
    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
    Code:
    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.

    4. 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.
    - Ở đây một biểu thức hợp lệ được xem như một đối số trong câu lện return. Trong thực tế, lệnh return có thể được sử dụng theo một trong các cách sau đây:
    Code:
    return;
    return(hằng);
    return(biến);
    return(biểu thức);
    return(câu lệnh đánh giá); ví dụ return(a>b?a:b);
    - Tuy nhiên, giới hạn của câu lện return là nó chỉ có thể trả về một giá trị duy nhất.

    5. Kiểu của một hàm

    - Type_specifier được sử dụng để xác định kiểu dữ liệu trả về của một hàm. Trong ví dụ trên, type-specifier không được viết bên cạnh hàm squarer(), vì squarer() trả về một giá trị kiểu int. Type-specifier là không bắt buộc nếu một giá trị kiểu số nguyên được trả về hoặc nếu không có giá trị nào được trả về. Tuy nhiên, tốt hơn nên chỉ ra kiểu dữ liệu trả về là int nếu một giá trị số nguyễn được trả về và tương tự dúng void nếu hàm không trả về giá trị nào.

    6. Gọi hàm

    - Có thể gọi một hàm từ chương trình chính bằng cách sử dụng tên của hàm, theo sau là cặp dấu ngoặc(). Cặp dấu ngoặc là cần thiết để nói với trình biên dịch là đây là một lời gọi hàm. Khi một tên hàm được sử dụng trong chương trình gọi, tên hàm có thể là một phần của một lệnh hoặc chính nó là một câu lệnh. Mà ta đã biết một câu lệnh luôn kết thúc với một dấu chấm phẩy (. Tuy nhiên, khi định nghĩa hàm, không được dùng dấu chấm phẩy ở cuối phần định nghĩa. Sự vắng mặt của dấu chấm phẩy nói với trình biên dịch đây là phần định nghĩa của hàm và không được gọi hàm.
    - Một số điều cần nhớ:
    + Một dấu chấm phẩy được dùng ơ cuối câu lệnh khi một hàm được gọi, nhưng nó không được dùng sau một sự định nghĩa hàm.
    + Cặp dấu ngoặc () là bắt buộc theo sau tên hàm, cho dù có đối số hay không.
    + Hàm gọi đến một hàm khác được gọi là hàm gọi hay thủ tực gọi. Và hàm được gọi đến còn được gọi là hàm gọi hay thủ tục được gọi.
    + Các hàm không trả về một giá trị số nguyên cần phải xác định kiểu của giá trị được trả về.
    + Chỉ một giá trị có thể được trả về bởi một hàm.
    + Một chương trình có thể có một hoặc nhiều hàm.

    7. Khai báo hàm

    - Một hàm nên được khai báo trong hàm main() trước khi nó được định nghĩa hoặc sử dụng. Điều này phải được thực hiện trong trường hợp hàm được gọi trước khi nó được định nghĩa.

    8. Các nguyên mẫu hàm

    -Một nguyên mẫu hàm là một khai báo trong đó xác định rõ kiểu dữ liệu của các đối số và trị trả về. Thông thường, các hàm được khai báo bằng cách xác định kiểu của giá trị được trả về bới hàm, và tên hàm. Tuy nhiên, chuẩn ANSI C cho phép số lượng và kiểu dữ liệu của các đối số hàm được khai báo. Một hàm abc() có hai đối số kiểu int là x và y, và trả một giá trị kiểu char, có thể được khai báo như sau:
    Code:
       char abc()
    hoặc
       char abc(int x, int y);
    - Cách định nghĩa sau được gọi là nguyên mẫu hàm. Khi các nguyên mẫu được sử dụng, C có thể tìm và thông báo bất kỳ kiểu dữ liệu không hợp lệ khi chuyển đổi giữa các đối số được dùng để gọi một hàm với sự định nghĩa kiểu của các tham số. Một số sẽ được thông báo ngay khi có sự khác nhau giữa số lượng các đối số được sử dụng để gọi hàm và số lượng các tham số khi định nghĩa hàm. Cú pháp tổng quát của một nguyên mẫu hàm:
    Code:
      type function_name(type parm_name, type parm_name2,...,type parm_nameN)
    - Khi hàm được khai báo không có các thông tin nguyên mẫu, trình biên dịch cho rằng không có thông tin về các tham số được đưa ra. Một hàm không có đối số có thể gây ra lỗi khi khai báo không có thông tin nguyên mẫu. Để tránh điều này, khi một hàm không có tham số, nguyên mẫu của nó sử dụng void trong cặp dấu ngoặc(). Như đã nói ở trên, void cũng được sử dụng để khai báo tường mình một hàm không có giá trị trả về.

    9. Các biến

    - Như đã thảo luận, các biến là những vị trí được đặt tên trong bộ nhớ, được sử dụng để chứa giá trị có thể hoặc không thể được sửa đổi bởi một chương trình hoặc một hàm. Có ba loại biến cơ bản: biến cục bộ, tham số hình thức, và biến toàn cục.
    + Biến cục bộ là những biến được khải báo bên trong một hàm.
    + Tham số hình thức được khai báp trong một định nghĩa hàm như là các tham số.
    + BIến toàn cục được khai báo bên ngoài các hàm.

    a. Biến cục bộ
    - Biến cục bộ còn được gọi là biến động, từ khóa auto được sử dụng để khai báo chúng. Chúng chỉ được tham chiếu đến bởi các lệnh bên trong của khối lệnh mà biến được khai báo. Để rõ hơn, một biến
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  7. #17
    No Avatar
    love_love_love1375 Khách

    Mặc định Để tôi giúp bạn bổ xung cho hết quyển giáo trình C Aptech !!!

    9.a, Biến cục bộ :
    - Biến cục bộ còn được gọi là biến động,từ khóa auto được sử dụng dể khai báo chúng.Chúng chỉ được tham chiếu đên bởi các lệnh bên trong của khối lệnh mà biến được khai báo.Để rõ hơn, một biến cục bộ được tạo ra trong lúc vào một khối và bị hủy trong lúc đi ra khỏi khối đó. Khối lệnh thông thương nhất mà trong đó một biến cục bộ được khai báo chính là hàm .
    - Xem đoạn mã lệnh sau:
    Code:
    void blkl(void)
    {
      char ch;
      cha = 'a' ;
     . 
     .
    }
    void blk2(void)
    {
       char ch;
       ch ='b';
      .
      .
    }
    -Biến ch được khai báo hai lần, trong blk1() và blk2().ch trong blk1() không có liên quan đến ch trong bk2() bởi vì mỗi ch chỉ được biết đến trong khối lệnh mà nó được khai báo.

    - VÌ các biến cục bộ được tạio ra và hủy đi trong một khối mà chúng được khai báo, nên nội dung của chúng bị mất bên ngoài phạm vi của khối. Điều này cs nghĩa là chúng không thể duy trì giá trị của chúng giữa các lần gọi hàm.

    - Từ khóa auto có thể được dùng để khai báo các biến cục bộ,nhưng thường nó không được dùng vì mặc nhiên các biến không toàn cục được xem như biến cục bộ.

    - Các biến cục bộ được sử dụng bởi các hàm thường được khai báo ngay sau dấu ngoặc mở '{'
    của hàm và trước tất cả các câu lệnh . Tuy nhiên , các khai báo hàm có thể ở bên trong một khối của một hàm. Ví dụ,
    Code:
     void blk1(void)
    {
       int t;
       t=1;
       ì(t>5);
       {
            char ch;
            .
            .
        }
        .
    }
    - Trong ví dụ trên biến ch được tạo ra và chỉ hợp lệ bên trong khối mã lệnh 'if'. Nó không thể được tham chiếu đến trong một phần khác của hàm blk1().

    - Một trong những thuận lợi của sự khai báo một biến theo cách này đó là bộ nhớ sẽ chỉ được cấp phát cho nó khi nếu điều kiện để đi vào khối lệnh if được thoả. Điều này là bởi vì các biến cục bộ chỉ được khai báo khi đi vào khối lệnh mà các biến được định nghĩa trong đó.
    +, Chú ý : Điều quan trong cần nhớ là tất cả các biến cục bộ phải được khai báo tại điểm bắt đầu của khối mà trong đó chúng được định nghĩa, và trước tất cả các câu lệnh thực thi.

    - Ví dụ sau có thể không làm việc với một số các trình biên dịch.
    Code:
    void blk1( void)
    {
      int len;
      len = 1;
      char ch;
      ch = 'a';
      .
      .
    }
    Đã được chỉnh sửa lần cuối bởi iamvtn : 01-07-2007 lúc 12:27 AM.

  8. #18
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bài 15 : Hàm - Lý thuyết

    Giới thiệu

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

    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 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 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á 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ự dơ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.

    2. Cấu trúc hàm

    - Cú pháp tổng quát của một hàm trong C là:
    Code:
    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 trê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.

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

    - Phương pháp 1
    Code:
    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
    Code:
    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.

    4. 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.
    - Ở đây một biểu thức hợp lệ được xem như một đối số trong câu lện return. Trong thực tế, lệnh return có thể được sử dụng theo một trong các cách sau đây:
    Code:
    return;
    return(hằng);
    return(biến);
    return(biểu thức);
    return(câu lệnh đánh giá); ví dụ return(a>b?a:b);
    - Tuy nhiên, giới hạn của câu lện return là nó chỉ có thể trả về một giá trị duy nhất.

    5. Kiểu của một hàm

    - Type_specifier được sử dụng để xác định kiểu dữ liệu trả về của một hàm. Trong ví dụ trên, type-specifier không được viết bên cạnh hàm squarer(), vì squarer() trả về một giá trị kiểu int. Type-specifier là không bắt buộc nếu một giá trị kiểu số nguyên được trả về hoặc nếu không có giá trị nào được trả về. Tuy nhiên, tốt hơn nên chỉ ra kiểu dữ liệu trả về là int nếu một giá trị số nguyễn được trả về và tương tự dúng void nếu hàm không trả về giá trị nào.

    6. Gọi hàm

    - Có thể gọi một hàm từ chương trình chính bằng cách sử dụng tên của hàm, theo sau là cặp dấu ngoặc(). Cặp dấu ngoặc là cần thiết để nói với trình biên dịch là đây là một lời gọi hàm. Khi một tên hàm được sử dụng trong chương trình gọi, tên hàm có thể là một phần của một lệnh hoặc chính nó là một câu lệnh. Mà ta đã biết một câu lệnh luôn kết thúc với một dấu chấm phẩy (. Tuy nhiên, khi định nghĩa hàm, không được dùng dấu chấm phẩy ở cuối phần định nghĩa. Sự vắng mặt của dấu chấm phẩy nói với trình biên dịch đây là phần định nghĩa của hàm và không được gọi hàm.
    - Một số điều cần nhớ:
    + Một dấu chấm phẩy được dùng ơ cuối câu lệnh khi một hàm được gọi, nhưng nó không được dùng sau một sự định nghĩa hàm.
    + Cặp dấu ngoặc () là bắt buộc theo sau tên hàm, cho dù có đối số hay không.
    + Hàm gọi đến một hàm khác được gọi là hàm gọi hay thủ tực gọi. Và hàm được gọi đến còn được gọi là hàm gọi hay thủ tục được gọi.
    + Các hàm không trả về một giá trị số nguyên cần phải xác định kiểu của giá trị được trả về.
    + Chỉ một giá trị có thể được trả về bởi một hàm.
    + Một chương trình có thể có một hoặc nhiều hàm.

    7. Khai báo hàm

    - Một hàm nên được khai báo trong hàm main() trước khi nó được định nghĩa hoặc sử dụng. Điều này phải được thực hiện trong trường hợp hàm được gọi trước khi nó được định nghĩa.

    8. Các nguyên mẫu hàm

    -Một nguyên mẫu hàm là một khai báo trong đó xác định rõ kiểu dữ liệu của các đối số và trị trả về. Thông thường, các hàm được khai báo bằng cách xác định kiểu của giá trị được trả về bới hàm, và tên hàm. Tuy nhiên, chuẩn ANSI C cho phép số lượng và kiểu dữ liệu của các đối số hàm được khai báo. Một hàm abc() có hai đối số kiểu int là x và y, và trả một giá trị kiểu char, có thể được khai báo như sau:
    Code:
       char abc()
    hoặc
       char abc(int x, int y);
    - Cách định nghĩa sau được gọi là nguyên mẫu hàm. Khi các nguyên mẫu được sử dụng, C có thể tìm và thông báo bất kỳ kiểu dữ liệu không hợp lệ khi chuyển đổi giữa các đối số được dùng để gọi một hàm với sự định nghĩa kiểu của các tham số. Một số sẽ được thông báo ngay khi có sự khác nhau giữa số lượng các đối số được sử dụng để gọi hàm và số lượng các tham số khi định nghĩa hàm. Cú pháp tổng quát của một nguyên mẫu hàm:
    Code:
      type function_name(type parm_name, type parm_name2,...,type parm_nameN)
    - Khi hàm được khai báo không có các thông tin nguyên mẫu, trình biên dịch cho rằng không có thông tin về các tham số được đưa ra. Một hàm không có đối số có thể gây ra lỗi khi khai báo không có thông tin nguyên mẫu. Để tránh điều này, khi một hàm không có tham số, nguyên mẫu của nó sử dụng void trong cặp dấu ngoặc(). Như đã nói ở trên, void cũng được sử dụng để khai báo tường mình một hàm không có giá trị trả về.

    9. Các biến

    - Như đã thảo luận, các biến là những vị trí được đặt tên trong bộ nhớ, được sử dụng để chứa giá trị có thể hoặc không thể được sửa đổi bởi một chương trình hoặc một hàm. Có ba loại biến cơ bản: biến cục bộ, tham số hình thức, và biến toàn cục.
    + Biến cục bộ là những biến được khải báo bên trong một hàm.
    + Tham số hình thức được khai báp trong một định nghĩa hàm như là các tham số.
    + BIến toàn cục được khai báo bên ngoài các hàm.

    a. Biến cục bộ

    - Biến cục bộ còn được gọi là biến động, từ khóa auto được sử dụng để khai báo chúng. Chúng chỉ được tham chiếu đến bởi các lệnh bên trong của khối lệnh mà biến được khai báo. Để rõ hơn, một biến cục bộ được tạo ra trong lúc vào một khối và bị hủy trong lúc đi ra khỏi khối đó. Khối lệnh thông thường nhất mà trong đó một biến cục bộ được khai báo chính là hàm. Vì các biến cục bộ được tạo ra và hủy đi trong một khối mà chúng được khai báo, nên nội dung của chúng bị mất bên ngoài phạm vi của khổi. Điều này có nghĩa là chúng không thể duy trì giá trị của chúng giữa các lần gọi hàm. Từ khóa auto có thể được dùng để khai báo các biến cục bộ, nhưng thường nó không được dùng vì mặc nhiên các biến không toàn cục được xem như là biến cục bộ. Điều quan trọng cần nhớ là tất cả các biến cục bộ phải được khai báo tại điểm bắt đầu của khối mà trong đó chúng được định nghĩa, và trước tất cả các câu lện thực thi.

    b. tham số hình thức

    - Một hàm sử dụng các đối số phải khai báo các biến để nhận các giá trị của các đối số. Các biến này được gọi là tham số hình thức của hàm và hoạt động giống như bất kỳ một biến cục bộ bên trong hàm. Các biến này được khai báo bên trong cặp dấu ngoặc () theo sau tên hàm. Các tham số hình thức phải được khai báo cùng với kiểu của chúng. Các biến này có thể được sử dụng bên trong hàm như các biến cục bộ bình thường. Chúng bị hủy đi khi ra khỏi hàm. Cần chú ý là các tham số hình thức đã khai báo có cùng kiểu dữ liệu với các đối số được sử dụng khi gọi hàm. Trong trường hợp có sai, C có thể không hiển thị lỗi nhưng có thể đưa ra một kết quả không mong muốn. Điều này là vì, C vẫn đưa ra một vài kết quả trong các tình huống khác thường. Người lập trình phải đảm bảo rằng không có các lỗi về sai kiểu. Cúng giống như với các biến cục bộ, các phép gán cũng có thể được thực hiện với tham số hình thức của hàm và chúng cùng có thể được sử dụng bất kỳ biểu thức nào mà C cho phép.

    c. BIến toàn cục

    - Các biến toàn cục là biến được thấy bởi toàn bộ chương trình, và có thể được sử dụng bởi một mã lệnh bất kỳ. Chúng được khai báo bên ngoài các hàm của chương trình và lưu giá trị của chúng trong suốt sự thực thi của chương trình. Các biến này có thể được khai báo bên ngoài main() hoặc khai báo bất kỳ nơi đâu trước lần sử dụng đầu tiên. Tuy nhiên, tốt nhất để khai báo các biển toàn cục là tại đầu chương trình, nghĩa là trước hàm main(). Các biến toàn cục được lưu trữ trong các vùng cố định của bộ nhớ. Các biến toàn cục hữu dụng khi nhiều hàm trong chương trình sử dụng cùng dữ liệu. Tuy nhiên, nên tránh sử dụng biến toàn cục nếu không cần thiết, vì chúng giữ bộ nhớ trong suốt thời gian thực hiện chương trình. Vì vậy việc sử dụng một biến toàn cục ở nơi mà một biến cục bộ có khả năng đáp ứng cho hàm sử dụng là không hiệu quả.

    d. Lớp lưu trữ (Stroage Class)

    - Mỗi biến trong C có một đặc trưng được gọi là lớp lưu trữ. Lớp lưu trữ xác định hai khía cạnh của biến: thời gian sống và pham vi của biến. Thời gian sống của một biến là thời gian mà giá trị của biến tồn tại. Sự thấy được của một biến xác định các phần của một chương trình sẽ có thể nhận ra biến. Một biến co thể xuất hiện trong một khối, một hàm, một tập tin, một nhóm các tập tin, hoặc toàn bộ chương trình. Theo cách nhìn của chương trình C, một tên biến xác định một vài vị trí vật lý bên trong máy tính, ở đó một chuỗi các bit biểu diễn giá trị được lưu trữ của biến. Có hai loại vị trí trong máy tính mà ở đó giá trị của biến có thể được lưu trữ : bộ nhớ hoặc thanh ghi CPU. Lớp lưu trữ của biến xác định vị trí biến được lưu trữ là trong bộ nhớ hay trong một thanh ghi. C có bốn lớp lưu trữ. Đó là:
    + Auto : biến tự động
    + External : biến ngoại
    + Static : biến tĩnh
    + Register : biến thanh ghi

    e. Các quy luật về phạm vi của hàm


    - Qui luật về phạm vi là những qui luật quyết định một đoạn mã lệnh có thể truy xuất đến một đoạn mã lệnh khác hoặc dữ liệu hay không. Trong C, mỗi hàm của chương trình là các khối lệnh riêng lẻ. Mã lệnh bên trong một hàm là cục bộ với hàm đó và không thể được truy xuất bởi bất kỳ lệnh nào ở ngoài hàm, ngoại trừ lời gọi hàm. Mã lệnh bên trong một hàm là ẩn đối với phần còn lại của chương trình, và trừ khi nó sử dụng biến hoặc dữ liệu toàn cục, nó có thể tác động hoặc bị tác động bởi các phần của chương trình. Để rõ hơn, mã lệnh và dữ liệu được nghĩa bên trong một hàm không thể tương tác với mã lệnh hay dữ liệu được định nghĩa trong hãm khác bởi vì hai hàm có phạm vi khác nhau. Trong C, tất cả các hàm có cùng mức phạm vi. Nghĩa là, một hàm không thể được định nghĩa bên trong một hàm khác. Chính vì lý do này mà C không phải là một ngôn ngữ cấu trúc khối về mặt kỹ thuật.

    f. Gọi hàm

    - Một cách tổng quát, các hàm giao tiếp với nhau bằng cách truyền tham số. Các tham số được truyền theo một trong hai cách sau:
    + Truyền bằng giá trị : Mặc nhiên trong C, tất cả các đối số của hàm được truyền bằng giá trị. Điều này nghĩa là, khi các đối số được truyền đến hàm được gọi, các giá trị được truyền thông qua các biến tạm. Mọi sự thao tác chỉ được thực hiện trên các biến tạm này. Hàm được gọi không thể thay đổi giá trị của chúng. Vì vậy, các đối số được gọi là truyền bằng giá trị khi giá trị của các biến được truyền đến hàm được gọi và bất kỳ sự thay đổi trên giá trị này cũng không ảnh hưởng đến giá trị gốc của biến đã truyền.
    + Truyền bằng tham chiếu. : Khi các đối số được truyền bằng giá trị, các giá trị của đối số của hàm đang gọi không bị thay đổi. Tuy nhiên, có thể có trường hợp, ở đó giá trị của các đối số phải được thay đổi. Trong những trường hợp như vậy, truyền bằng tham chiếu được dùng. Truyền bằng tham chiếu, hàm được phép truy xuất đến vùng bộ nhớ thực hiện của các đối số và vì vậy có thể thay đổi giá trị của các đối số của hàm gọi.

    10. Sự ***g nhau của lời gọi hàm

    - Lời gọi hàm từ một khác được gọi là sự ***g nhau của lời gọi hàm.

    11. Hàm trong chương trình nhiều tệp tin

    - Các chương trình có thể được tạo bởi nhiều tập tin. Những chương trình như vậy được tao bởi các hàm lớn, ở đó mỗi hàm có thể chiếm một tập tin. Cũng như các biến trong các chương trình nhiều tập tin, các hàm cũng có thể được định nghĩa là static hoặc external. Phạm vi của hàm external có thể được sử dụng trong tất cả các tập tin của chương trình, và đó là cách lưu trữ mặc định cho các tập tin. Các hàm static chỉ được nhận biết bên trong tập tin chương trình và phạm vi của nó không vượt khỏi tập tin chương trình.

    12. Con trỏ đến hàm

    - Một đặc tính mạnh mẽ của C vẫn chưa được đề cập, chính là con trở hàm. Dù rằng một hàm không phải là một biến, nhưng nó có địa chỉ vật lý trong bộ nhớ nơi có thể gán cho một con trỏ. Một địa chỉ hàm là điểm đi vào của hàm và con trỏ hàm có thể sử dụng để gọi hàm.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  9. #19
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bài 16 : Hàm - Thực hành

    1. Gọi một hàm:

    C Code:
    1. #include <stdio.h>
    2.  
    3. void main()
    4. {
    5.    printf("\nI am in main");
    6.    italy();
    7.    brazil();
    8.    argentina();
    9. }
    10.  
    11. italy()
    12. {
    13.    printf("\nI am in italy");
    14. }
    15.  
    16. brazil()
    17. {
    18.    printf("\nI am in brazil");
    19. }
    20.  
    21. argentina()
    22. {
    23.    printf("\nI am in argentina");
    24. }

    2. Sử dụng tham số trong hàm:

    C Code:
    1. #include <stdio.h>
    2.  
    3. void main()
    4. {
    5.    int a, b, c, sum;
    6.  
    7.    printf("\nEnte any three numbers: ");
    8.    scanf("%d %d %d", &a, &b, &c);
    9.  
    10.    sum = calculasum(a, b, c);
    11.  
    12.    printf("\nSum = %d", sum);
    13. }
    14.  
    15. calculasum(int x, int y, int z)
    16. {
    17.    int d;
    18.  
    19.    d = x + y + z;
    20.    return (d);
    21. }
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  10. #20
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Bài 17 : Chuỗi - Lý thuyết

    Giới thiệu

    - Các chuỗi trong C được cài đặt như là các mảng ký tự kết thúc bởi ký tự NULL ('\0'). Bài này sẽ thảo luận về công dụng và thao tác trên chuỗi.

    1. Các biến và hằng kiểu chuỗi

    - Các biến chuỗi sử dụng để lưu trữ một chuỗi các ký tự. Như các biến khác, các biến này phải được khai báo trước sử dụng. Một hằng chuỗi là một dãy các ký tự nằm trong dấu nháy kép. Mỗi ký tự trong một chuỗi được lưu trữ như là một phần tử của mảng. Ký tự "\0" (null) được tự động thêm vào trong cách biểu diễn bên trong của chuỗi để đánh dấu điểm kết thúc chuỗi. Vì vậy, khi khai báo một chuỗi, phải tăng kích thước của nó thêm một phần tử để chứa dữ liệu kết thúc null.

    2. Con trỏ trỏ đến chuỗi

    - Chuỗi có thể được lưu và truy cập bằng cách sử dụng con trỏ kiểu ký tự. Một con trỏ kiểu ký tự trỏ đến một chuỗi được khai báo như sau:

    Code:
    char *pstr = "WELCOME":
    -pstr là một con trỏ được khởi tạo để trỏ đến một hằng chuỗi. Con trỏ pstr có thể thay đổi đến bất kỳ một chuỗi nào khác. Mặc dù khi con trỏ pstr trỏ đến một chuỗi khác thì ta không thể truy xuất đến chuỗi "WELCOME" được nữa.

    3. Các thao tác nhập xuất chuỗi

    - Các thao tác nhập/xuất chuỗi (I/O) chuỗi trong C được thực hiện bằng cách gọi các hàm. Các hàm này là một phần của thư viện nhập/xuất chuẩn tên stdio.h. Một chương trình muốn sử dụng các hàm nhập/xuất chuỗi phải có câu lệnh khai báo như sau ở đầu chương trình:

    Code:
    #include <stdio.h>;
    - Khi chương trình có chứa câu lệnh này được biên dịch, thì nội dung của tập tin stdio.h sẽ trở thành một phần của chương trình.

    a. Các thao tác nhập/xuất chuỗi đơn giản :

    - Sử dụng hàm gets() là cách đơn giản nhất để nhập một chuỗi thông qua thiết bị nhập chuẩn. Các ký tự sẽ được nhập vào cho đến khi nhấn phím Enter. Hàm gets() thay thế ký tự kết thúc trở về đầu dòng '\n' bằng ký tự '\0'. Cú pháp hàm như sau:

    Code:
    gets(str);
    - Trong đó str là một mảng ký tự đã được khai báo.
    - Tương tự, hàm puts() được sử dụng để hiển thị một chuỗi ra thiết bị xuất chuẩn. Ký tự xuống dòng sẽ kết thúc việc xuất chuỗi. Cú pháp hàm như sau:

    Code:
    puts(str);
    - Trong đó str là một mảng ký tự đã được khai báo và khởi tạo.

    b. Các thao tác nhập/xuất chuỗi có định dạng :

    - Có thể sử dụng các hàm scanf() và printf() để nhập và hiển thị các giá trị chuỗi. Các hàm này được dụng để nhập và hiển thị các kiểu dữ liệu hỗn hợp trong một câu lệnh duy nhất.Cú pháp như sau :

    Code:
    scanf("%s", str);
    - Trong đó ký hiện định dạng "%s" cho biết rằng một giá trị chuỗi sẽ được hiển thị và str là một mảng ký tự đã được khai báo và khởi tạo. Hàm printf() có thể dùng để hiển thị ra các thông báo mà không cần ký tự định đạng. Có thể sửa chương trình bên trên để nhập vào và hiển thị một tên, sử dụng ham scanf() và printf().

    4. Các hàm về chuỗi

    - C hỗ trợ rất nhiều hàm về chuỗi. Các hàm này có thể tìm thấy trong tập tin string.h. Một số thao tác mà các hàm này thực hiện là:
    + Nối chuỗi
    + So sánh chuỗi
    + Định vì một ký tự trong chuỗi
    + Sao chép một chuỗi sang chuỗi khác
    + Xác định chiều dài của chuỗi
    - Những hàm này có thể thao khảo trực tiếp trên thư viện của C

    5. Truyền mảng vào hàm

    - Trong C, khi một mảng được truyền vào hàm như một tham số, thì chỉ có địa chỉ của mảng được truyền vào. Tên mảng không kèm theo chỉ số là địa chỉ của mảng. Đoạn mã dưới đây mô tả cách truyền địa chỉ của mảng ary cho hàm fn_ary():

    Code:
    void main()
    {
       int ary();
       ...
       ...
       fn_arry();
       ...
       ...
    }
    - Nếu tham số của hàm là một mảng một chiều thì tham số có thể được khai báo theo một trong các cách sau:

    Code:
    fn_ary (int ary[10]) /* sized array*/
    {
       :
    }
    hoặc
    fn_ary (int ary[]) /* unsized array*/
    {
       :
    }
    - Có hai cách khai báo ở trên đều cho cùng kết quả. Kiểu thứ nhất sử dụng cách khai báo mảng chuẩn, chỉ rõ ra kích thước của mảng. Kiểu thứ hai, chỉ ra rằng tham số là một mảng kiểu int có kích thước bất kỳ. Chương trình sau đây nhân các số vào một mảng số nguyên. Sau đó mảng này sẽ được truyền vào hàm sum_arr(). Hàm sẽ tính toán và trả về tổng của các số nguyên trong mảng.

    6. Truyền chuỗi vào hàm

    - Chuỗi, hay mảng ký tự, có thể được truyền vào hàm.

    Hết bài 17

    Bài tập tự làm

    1. Viết một chương trình để nhập vào hai chuỗi. Chương trình sẽ xác định liệu chuỗi thứ nhất có xuất hiện ở cuối chuỗi thứ hai không.
    2. Viết một chương trình nhập vào một mảng các số và hiển thị giá trị trung bình. Sử dụng hàm để tính giá trị trung bình.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

Các đề tài tương tự

  1. Tài liệu aptech | Giáo trình C căn bản của aptech đây
    Gửi bởi sieutanbinh1711 trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 6
    Bài viết cuối: 12-01-2016, 11:18 AM
  2. FPT-Aptech hay Aptech ?
    Gửi bởi thanhle_uit trong diễn đàn Kinh nghiệm CNTT
    Trả lời: 12
    Bài viết cuối: 18-05-2013, 11:00 AM
  3. Giáo trình C của aptech
    Gửi bởi vinhphat2808 trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 10
    Bài viết cuối: 15-09-2010, 04:40 PM
  4. Elementary Programming With C ( tài liệu lập trình của Aptech Viet+ ENG+ Bài tập...)
    Gửi bởi emperor.ns trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 2
    Bài viết cuối: 21-05-2009, 05:06 PM
  5. Toàn bộ giáo trình học Aptech ở Hà Nội
    Gửi bởi zkday2686 trong diễn đàn Công cụ, ebooks C#, ASP.NET, và Windows Mobile
    Trả lời: 2
    Bài viết cuối: 15-09-2008, 06:40 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn