Tải bản đầy đủ (.pdf) (35 trang)

Tài liệu tham khảo cơ bản về hàm trong c

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (322.67 KB, 35 trang )

Hàm
#include <stdio.h>
int tich(int X, int y)
{ return (x*y);
}
void mainO
{ int dai, rong, dt;
printf(“\n Nhap chieu dai:”); scanf(“%d”, &dai);
printf(“\n Nhap chieu rong:”); scanf(“%d”, &rong);
dt= tich(dai,rong);
printf(“\n Dien tích: %d”, dt);
Hàm
#include <stdio.h>
int tich(int X, int y ) ; II nguyên mẫu hàm (prototype)
void mainO
{ int dai, rong, dt;
printf(“\n Nhap chieu dai:”); scanf(“%d”, &dai);
printf(“\n Nhap chieu rong:”); scanf(“%d”, &rong);
dt= tich(dai,rong);// lời gọi hàm
printf(“\n Dien tich: %d”, dt);
}
int tich(int X, int y)// định nghĩa hàm
{ return (x*y);
}
Hoạt động của hàm
cấp phát bộ nhớ cho các tham số và các
biến cục bộ
■ ■
Gán giá trị của các đối số cho các tham số
tương ứng
Thực hiện các lệnh trong thân hàm


■ ■ ■ W
Khi gặp lệnh return hoặc cuối thân hàm thì
giải phóng vùng nhớ vừa cấp phát và thoát
khỏi hàm
1.
#include <stdio.h>
2. void hoanvi(int a,int b);
3. void main()
4.
{ int x=2, y=3;
5.
printf(“\nTruoc khi goi ham :
x = %d , y = %d “,x,y);
6.
hoanvi(x,y);
7. printf(“\nSau khi goi ham : x
= %d , y = %d “,x,y);
8.
}
9. void hoanvi(int a,int b)
10. { int tarn;
11.
printf(“\nTruoc khi hoan vi: a
= %d , b = %d “,a,b);
12. tam=a;
13. a=b;
14. b=tam;
15.
printf(“\nSau khi hoan vi: a =
%d , b = %d “,a,b);

16.
}
Truyền đối số theo giá trị
Hàm tạo ra một biến mới cùng kiểu với đối số và
sao chép giá trị của đối số vào biến đó.
Hàm không truy cập trực tiếp vào biến ban đẩu
mà chỉ tác động lên bản sao mà nó tạo ra.
Sự thay đổi ở bản sao không tác động đến biến
ban đẩu (biến gốc).
Hữu dụng khi hàm không có ý định thay đổi giá
trị của biến gốc.
1. #include <stdio.h> // truyền địa chỉ cho hàm
2. void hoanvi(int *px,int *py);
3. void mainO
4. { int x=2, y=3;
5. hoanvi(&x,&y);
6. printf(“\nx=%d,y=%d”,x,y);
7. }
8. void hoanvi(int *px,int *py)
9. { int tam;
10. tam=*px;
11. *px=*py;
12. *py=tam;
13. }
Phạm vi biến

Biến toàn cục:

- Được khai báo ở ngoài mọi hàm (kể cả hàm
main)

- Được sử dụng ở mọi nơi trong chương trình
Biến địa phương:
- ĐƯỢC khai báo trong hàm hoặc trong khối lệnh
- Chỉ được sử dụng trong thời gian gọi hàm đó
hoặc trong thời gian thực hiện khối lệnh đó
■ w ■ ■ ■
cấp phát bộ nhớ
Biến toàn cục được cấp phát tĩnh
Biến địa phương:
- cấp phát động: biến được giải phóng khi kết
thúc hàm, không lưu kết quả cho lẩn sau
- Cấp phát tĩnh: biến không được giải phóng khi
kết thúc hàm, lưu kết quả cho lần sau
- Mặc định biến địa phương là cấp phát động.
Để Cấp phát tĩnh biến địa phương, ta dùng từ
khoá static trước khai báo của biến
1. #include <stdio.h>
2. void ham(void);
3. void mainO
4. { int dem;
5. for(dem=0;dem<=3;dem++)
6. { printf(“\nLan goi thu %d”,dem);
7. hamO;
8. }
9. }
10. void ham(void)
11. { static int x;
12. int y=0;
13. printf(“ x = %d , y = %d “,x++,y++);
14. }

cấp phát bộ nhớ
Biến địa phương (tiếp theo)
- Biến địa phương thanh ghi:
• khai báo : register int x;
• yêu cáu trình biên dịch đặt biến đó vào thanh
ghi (nếu có thể)
• không dùng từ khóa register với biến tĩnh.
• không định nghĩa con trỏ đến biến thanh ghi
Đệ quy
• Một hàm gọi lại chính nó
■ W ■ ■
1. #include <stdio.h>
2. long int giaithua(int n);
3. void mainO
4. { int n;
5. printf(“\nNhap n:”);scanf(“%d”,&n);
6. printf(“%d! = %ld”,n,giaithua(n));
7. }
8. long int giaithua(int n)
9. { if (n==0) return(l);
10. else return(giaithua(n-l)*n);
11. }
#include <stdio.h>
int uscln(int x.inty)
{ if (y==0) return x;
else return uscln( y , x% y);
}
void mainO
{ intx.y;
do { printf("\nNhap 2 so nguyen duong

scanf("%d%d",&x,&y);
}
while ((x<=0)||(y<=0));
printf("\nx=%d\ny=%d",x,y);
printf("\nUSCLN=%d",uscln(x,y));
}
Đệ quy
Nên hạn chế dùng đệ quy, nếu có thể
thì dùng vòng lặp để thày thế
long int giaithua(int n)
{ long int i=l,k=l;
while (i<=n) { k=k*i ; i++ ;}
return(k);
}
Mảng
Một số lượng hữu hạn các phần tử cùng
I ■ ^
kiêu
Các phần tử được đánh chỉ số từ 0 trở đi
c không báo lỗi khi truy cập vùng nhớ ngoài
mảng
Khai báo mảng: int a[3];
Khai báo và khởi tạo mảng: int a[3]={l,3,2} ;
Khai báo xâu ký tự:
- char text[5]={‘a ,’b’,’c’,’d’,’\0’ };
- char text[5]=“abcd”;
Mảng
1. #include <stdio.h>
2. #define n 5
3. void mainO

4. { int i, mang[n];
5. for(i=0 ; i<n ; i++)
6. { printf( \nx[ó/od]=”, i);
7. scanf(“%d”, &mang[i]);
8. }
9. printf(“\n Mang gom cac phan tu :\n”);
10. for(i=0 ; i<n ; i++)
11. pri ntf(“\nx[%d]=%d”, i, mang [i]);
12. }
Mảng nhiều chiểu
Khai báo và khởi tạo mảng nhiều chiều
intx[2][3]={ {1 ,2 ,3 },
{2,3,4}
Con trỏ
1. Khái niệm

2. Con trỏ và biến đơn
3. Con trỏ và mảng một chiều
4. Truyền mảng một chiều cho hàm
5. Con trỏ và xâu ký tự
6. Con trỏ và mảng nhiều chiều
7. Truyền mảng nhiều chiều cho hàm
Khái niệm con trỏ

Khi khai báo 1 biến, trình biên dịch sẽ cấp
phát 1 ô nhớ với địa chỉ duy nhất cho biến
đó
Con trỏ là biến dùng để chứa địa chỉ của
biến khác
Con trỏ ptr chứa địa chỉ của biến b => con

trỏ ptr đang trỏ đến biến b
Con trỏ và biến đơn
Khai báo con trỏ: int b, *ptr;
Khởi tạo con trỏ: ptr = &b;
Sử dụng con trỏ:
*ptr : giá trị của biến mà con trỏ ptr đang trỏ tới
ptr, &b : địa chỉ của biến b
*ptr, b : giá trị của biến b
1. #include <stdio.h>
2. void mainQ
3. { int x,y,*px,*py;
4. px=&x; py=&y;
5. printf(“Nhap x:”); scanf(“%d”,px);
6. printf(“Nhap y:”); scanf(“%d”,py);
7. printf(“x = %d , y = %d”, *px, *py);
8. }
1. #include <stdio.h>
2. void main()
3. { int b, *ptr;
4. b=10;
5. *ptr=20;
6. }
Vi du kiem dinh gia tri con tro
■ ■ ■
#include <stdio.h>
void mainO
{
int number=10;
int *pointer=&number;
printf(“\nGia tri cua number: %d”,number);

printf(“\nDia chi cua number: %p”,&number);
printf(“\nGia tri cua con tro pointer: %p”,pointer);
printf(“\nGia tri duoc tro toi boi pointer: %d”,*pointer);
printf(“\nDia chi cua con tro pointer: %p”,&pointer);
getchO;
}
1. #include <stdio.h>
2. void hoanvi(int *px,int *py)
3. { int tam;
4. tam=*px;
5. *px=*py;
6. *py=tam;
7- }
8. void mainO
9. { int x=2;
10. int y=3;
11. hoanvi(&x,&y);
12. printf(“\nx=%d,y=%d”,x,y);
13. }
1. #include <stdio.h> // hàm có nhiều giá trị đẩu ra
2. void ham(int X, int y, int *sum, int *product)
3. { *sum=x+y;
4. *product=x*y;
5. }
6. void mainO
7. { int x=2,y=3,tong,tich;
8. ham(x,y,&tong,&tich);
9. printf("\n x=%d",x);
10. printf("\n y=%d",y);
11. printf("\n tong=%d",tong);

12. printf("\n tich=%d",tich);
13. }
Con trỏ và mảng một chiểu
Các phần tử của mảng được cấp phát liên
tiếp nhau, phần tử đầu tiên có địa chỉ
thap nhất.
Tên mảng là hằng con trỏ, luôn trỏ đến
phắn tử đầu tiên của mảng.
Số học con trỏ: phép tăng / giảm con trỏ
làm cho con trỏ trỏ đến phần tử liền sau /
liền trước của phần tử ban đầu .
1. int a[10], i ;
2. for(i-0 ; ¡<10 ; i++)
3. { printf(“%d \n”, *a);
4. a++;
5. }
1. int a[10], i, *p;
2. p=a; //p=&a[0]
3. for(i=0 ; ¡<10 ; i++)
4. { printf(“%d \n”, *p);
5. |3++;
6. }

×