1 Nguyờn mẫu (prototype) hàm

Một phần của tài liệu Giáo trình tin học cơ sở phần lập trình ngôn ngữ trên C pot (Trang 88 - 95)

Nguyờn mẫu hàm là dũng khai bỏo cho chương trỡnh dịch biết cỏc thụng tin về hàm bao gồm: tờn hàm, kiểu hàm và kiểu cỏc tham số (đầu vào) của hàm.

Cỳ phỏp khai bỏo nguyờn mẫu hàm

<kiểu_hàm> <tờn_hàm>([Cỏc_khai_bỏo_kiểu_tham_số]);

Trong đú

à tờn_hàm: là một tờn hợp lệ theo quy tắc về tờn của ngụn ngữ C. mỗi hàm cú tờn duy nhất và khụng được trựng với cỏc từ khúa. Tờn hàm sẽđược dựng để gọi hàm.

à kiểu_hàm : Hàm cú thể trả về một giỏ trị cho nơi gọi, giỏ trị đú thuộc một kiểu dữ liệu nào đú, kiểu đú được gọi là kiểu hàm. Kiểu hàm cú thể là kiểu chuẩn cũng cú thể là kiểu do người dựng định nghĩa. Nếu hàm khụng trả về giỏ trị thỡ kiểu hàm là

void.

cú nhiều tham số, cỏc tham số cỏch nhau bởi dấu phẩy (,). Trong nguyờn mẫu khụng bắt buộc phải cú tờn tham số nhưng kiểu của nú thỡ bắt buộc. Nếu hàm khụng cú tham số chỳng ta cú thểđể trống phần này hoặc cú thể khai bỏo là void.

Vớ d:

à int max(int a, int b); // khai bỏo nguyờn mẫu hàm max, cú hai tham số kiểu int, kết quả trả về kiểu int

à float f(float, int); // nguyờn mẫu hàm f, cú hai tham, tham số thứ nhất kiểu float, tham số

thứ 2 kiểu int, kết quả trả về kiểu float

à void nhapmang(int a[], int ); // hàm nhapmang, kiểu void (khụng cú giỏ trị trả về), tham số thứ nhất là một mảng nguyờn, tham số thứ 2 là một số nguyờn

à void g(); // hàm g khụng đối, khụng kiểu.

VI.2 - Định nghĩa hàm

Cỳ phỏp:

<kiểu_hàm> <tờn_hàm>([khai_bỏo_tham_số]) {

< thõn hàm> }

Dũng thứ nhất là tiờu đề hàm (dũng tiờu đề) chứa cỏc thụng tin về hàm: tờn hàm, kiểu của hàm (hai thành phần này giống như trong nguyờn mẫu hàm) và khai bỏo cỏc tham số (tờn và kiểu) của hàm, nếu cú nhiều hơn một thỡ cỏc tham số cỏch nhau bởi dấu phẩy(,). Thõn hàm là cỏc lệnh nằm trong cặp { }, đõy là cỏc lệnh thực hiện chức năng của hàm. Trong hàm cú thể cú cỏc định nghĩa biến, hằng hoặc kiểu dữ liệu; cỏc thành phần này trỏ thành cỏc thành phần cục bộ của hàm.

Nếu hàm cú giỏ trị trả về (kiểu hàm khỏc void) thỡ trong thõn hàm trước khi kết thỳc phải cú cõu lệnh trả về giỏ trị:

return <giỏ trị>;

<giỏ_trị> sau lệnh return chớnh là giỏ trị trả về của hàm, nú phải cú kiểu phự hợp với kiểu của hàm được khai bỏo trong dũng tiờu đề. Trường hợp hàm void chỳng ta cú thể dựng cõu lệnh return (khụng cú giỏ trị) để kết thỳc hàm hoặc khi thực hiện xong lệnh cuối cựng (gặp } cuối cựng) hàm cũng kết thỳc.

Vớ dụ 1: Hàm max trả lại giỏ trị lớn nhất trong 2 số nguyờn a, b

void max (int a, int b) { if(a>b)

return a; else

return b; }

Vớ dụ 2: Hàm nhập một mảng cú n phần tử nguyờn: à tờn hàm: nhapmang

à giỏ trị trả về: khụng trả về

à tham số: cú hai tham số là mảng cần nhập A và số phần tử cần nhập N

nguyờn mẫu hàm như sau:

void nhapmang (int [], int); (adsbygoogle = window.adsbygoogle || []).push({});

định nghĩa hàm như sau:

void nhapmang (int A[], int N) { int i;

printf("\nNhap mang co %d phan tu \n",N); for(i=0;i<N; i++) { printf("a[%d]= ",i); scanf("%d",&a[i]); } return ; }

VI.3 - Li gi hàm và truyn tham s

Một hàm cú thể gọi thực hiện thụng qua tờn hàm, với những hàm cú tham số thỡ trong lời gọi phải truyền cho hàm cỏc tham số thực sự (đối số) tương ứng với cỏc tham số hỡnh thức.

Khi hàm được gọi và truyền tham số phự hợp thỡ cỏc lệnh trong thõn hàm được thực hiờn bắt đầu từ lệnh đầu tiờn sau dấu mở múc { và kết thỳc khi gặp lệnh return, exit hay gặp dấu đúng múc } kờt thỳc hàm.

Cỳ phỏp:

<tờn_hàm> ([danh sỏch cỏc tham số thực sự]);

Cỏc tham số thực sự phải phự hợp với cỏc tham số hỡnh thức: à số tham số thực sự phải bằng số tham số hỡnh thức.

à Tham số thực sự được truyền cho cỏc tham số hỡnh thức tuần tự từ trỏi sang phải, tham số thực sự thứ nhất truyền cho tham số hỡnh thức thứ nhất, tham số thực sự thứ 2 truyền cho tham số hỡnh thức thứ 2,.. kiểu của cỏc tham số hỡnh thức phải phự hợp với kiểu của cỏc tham số hỡnh thức. Sự phự hợp ởđõy được hiểu là kiểu trựng nhau hoặc kiểu của tham số thực sự cú thể ộp về kiểu của tham số hỡnh thức.

Vớ dụ: giả sử cú cỏc hàm max, nhapmang nhưđó định nghĩa ở trờn

c = max(a,b); nhapmang(D,5);

Lưu ý sau này chỳng ta thấy hàm cú thể cú đối số thay đổi và chỳng cú thể được truyền tham số với giỏ trị ngầm định vỡ vậy tham số hỡnh thức cú thể ớt hơn tham số thực sự.

Mt s vớ d

Vớ d VI.1: Viết chương trỡnh nhập một số n từ bàn phớm ( n >2), in cỏc số nguyờn tố từ 2 tới n.

Giải: Để in cỏc số nguyờn tố trong khoảng từ 2 tới n chỳng ta thực hiện như sau: với mỗi số k ∈ [2,n] kiểm tra xem k cú là nguyờn tố hay khụng, nếu đỳng thỡ in k ra màn hỡnh. Vậy chỳng ta sẽ xõy dựng hàm để kiểm tra một số cú là nguyờn tố hay khụng,

− tờn hàm: nguyento

− đầu vào: k là một số nguyờn cần kiểm tra

− giỏ trị trả về: 1 nếu đỳng k là số nguyờn tố, ngược lại trả về 0.

#include <math.h> #include <stdio.h> #include <conio.h>

int nguyento(int k);//nguyờn mẫu hàm kiểm tra k là số nguyờn tố

void main(){ int k, n; do{

printf("\nNhap gia tri n (n>=2) = "); scanf("%d",&n);

} while(n<2);

printf("\nCac so nguyen to tu 2 toi %d la \n",n); for(k=2; k<=n; k++) if (nguyento(k)) printf("%d, ",k); } //---định nghĩa hàm nguyento --- int nguyento(int k){ int i=2; while((i<=sqrt(k))&&(k%i)) i++; if(i>sqrt(k)) return 1;

else

return 0;

}

( vớ dụ VI.1 - in cỏc số nguyờn tố từ 2 tới n) (adsbygoogle = window.adsbygoogle || []).push({});

Vớ dụ VI.2 - Viết chương trỡnh nhập 2 mảng A, B cú n phần tử nguyờn từ bàn phớm, tớnh mảng tổng C = A+B, in 3 mảng A, B, C ra màn hỡnh. Yờu cầu: - n <20; - chương trỡnh gồm 3 hàm: hàm nhập mảng, hàm in mảng, hàm tổng hai mảng. Giải: Chỳng ta cần xõy dựng 3 hàm như sau 1. Hàm nhập mảng − Tờn hàm: nhapmang − Giỏ trị trả về: khụng trả về (void)

− Tham số: mảng cần nhập ( int A[]) và số phần tử kiểu int

− nguyờn mẫu: void nhapmang( int A[], int n);

2. Hàm in mảng

− Tờn hàm: inmang

− Giỏ trị trả về: khụng trả về (void)

− Tham số: mảng cần in ( int A[]) và số phần tử của mảng kiểu int

− nguyờn mẫu: void inmang( int A[], int n);

3. Hàm tớnh tổng hai mảng

− Tờn hàm: tong

− Giỏ trị trả về: khụng trả về (void)

− Tham số: hai mang A, B, mảng kết quả C và số phần tử kiểu int

− nguyờn mẫu: void tong ( int A[], int B[], int C[], int n);

#include <stdio.h> #include <conio.h>

void nhapmang(int a[], int n); void inmang(int a[], int n);

void tong(int A[],int B[],int C[],int n); void main(){

clrscr();

const int max = 20; // int A[max], B[max],C[max]; int n;

do{

printf("\nNhap so phan tu mang = "); scanf("%d",&n); } while(n<1 || n>max); printf("\nNhap A \n"); nhapmang(A,n); printf("\nNhap B \n"); nhapmang(B,n); tong(A,B,C,n); printf("\nmang A: "); inmang(A,n); printf("\nmang B: "); inmang(B,n); printf("\nmang C: "); inmang(C,n); getch(); }

void nhapmang(int a[], int n){ int i;

printf("\nNhap mang co %d phan tu \n",n); for(i=0; i<n; i++)

{

printf("pt thu [%d]= ",i); scanf("%d",&a[i]);

} }

void inmang(int a[], int n){ int i;

for(i=0; i<n; i++) printf("%d ",a[i]); }

void tong(int A[],int B[],int C[],int n){ int i;

for (i = 0; i<n; i++) C[i]=A[i]+B[i]; }

Hàm và truyn tham s (adsbygoogle = window.adsbygoogle || []).push({});

Với C việc tryền tham số cho hàm được thực hiện qua cơ chế truyền tham trị. Tức là trong hàm chỳng ta sử dụng tham số hỡnh thức như là một bản sao dữ liệu của tham số được truyền cho hàm, do vậy chỳng khụng làm thay đổi giỏ trị của tham số truyền vào. Hay núi khỏc đi, cỏc tham số hỡnh thức là cỏc biến cụ bộ trong hàm, sự thay đổi của nú trong hàm khụng ảnh hưởng tới cỏc biến bờn ngoài.

Vậy trong trường hợp thực sự cần thay đổi giỏ trị của tham số thỡ thế nào? chẳng hạn bạn cần hàm để hoỏn đổi giỏ trị của a và b.

Nếu bạn viờt hàm

void doicho(int x, int y) { int tg; tg = x; x=y; y=tg; } hàm này đỳng cỳ phỏp nhưng với cỏc lệnh sau: int a = 4; int b = 6;

printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b); doicho(a,b);

printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b);

kết quả in ra là

truoc khi goi ham doi cho a=4,b=6 sau khi goi ham doi cho a=4,b=6

Rừ ràng hàm đổi chỗ (doicho) thực hiện khụng đỳng, nguyờn nhõn là với hàm doicho x, y là hai biờn cục bộ, khi gọi hàm doicho(a,b) chương trỡnh dịch cấp phỏt vựng nhớ cho hai biến (tham số hỡnh thức) x, y và sao chộp giỏ trị của a vào x, b vào y, mọi thao tỏc trong hàm doicho đều thực hiờn trờn x, y mà khụng ảnh hưởng tới a và b, kết quả là a, b khụng đổi.

void doicho2(int * x, int *y) { int tg; tg = *x; *x = *y; *y = tg; } Lỳc này với cỏc lệnh sau: int a = 4; int b = 6;

printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b); doicho(&a,&b);

printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b);

kết quả in ra là

truoc khi goi ham doi cho a = 4,b = 6 sau khi goi ham doi cho a = 6 , b = 4

---

Tài liu tham kho

1. Đỗ Phỳc, Tạ Minh Chõu - Kỹ thuật lập trỡnh Turbo C

2. Phạm Văn Ất - Kỹ thuật lập trỡnh Turbo C - Cơ sở và nõng cao 3. Scott Robert Ladd - C++ Kỹ thuật và ứng dụng, Nguyễn Hựng dịch

Một phần của tài liệu Giáo trình tin học cơ sở phần lập trình ngôn ngữ trên C pot (Trang 88 - 95)