Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền

 Một chương trình viết trong ngôn ngữ C là một dãy các hàm, trong đó phải có một hàm chính (hàm main()).

 Hàm chia các bài toán lớn thành các công việc nhỏ hơn, giúp thực hiện những công việc lặp lại nào đó một

cách nhanh chóng mà không phải viết lại đoạn chương trình.

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 1

Trang 1

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 2

Trang 2

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 3

Trang 3

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 4

Trang 4

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 5

Trang 5

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 6

Trang 6

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 7

Trang 7

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 8

Trang 8

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 9

Trang 9

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 21 trang Danh Thịnh 09/01/2024 1160
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền

Bài giảng Kỹ thuật lập trình - Chương 4: Hàm - Nguyễn Thị Hiền
Ngôn ngữ lập trình C
Chương 4 – Hàm
 Giới thiệu
 Khai báo prototype
 Viết nội dung của hàm
 Tham số trong lời gọi hàm
 Hàm đệ quy
Giới thiệu
 Một chương trình viết trong ngôn ngữ C là một dãy các
hàm, trong đó phải có một hàm chính (hàm main() ).
 Hàm chia các bài toán lớn thành các công việc nhỏ
hơn, giúp thực hiện những công việc lặp lại nào đó một
cách nhanh chóng mà không phải viết lại đoạn chương
trình.
 Thứ tự các hàm viết trong chương trình là bất kỳ, 
song chương trình bao giờ cũng bắt đầu thực hiện từ
hàm main().
 Hàm có thể xem là một đơn vị độc lập của chương trình. 
Các hàm có vai trò ngang nhau, vì vậy không cho
phép xây dựng một hàm bên trong các hàm khác.
Quy tắc xây dựng hàm
 Cú pháp:
Trong đó
 : kiểu bất kỳ của C (char, int, long, float,). Nếu
không có kiểu trả về thì là void.
 : theo quy tắc đặt tên định danh.
 : tham số hình thức đầu vào giống khai
báo biến, cách nhau bằng dấu ,. Nếu không có đối, dung void để
khai báo đối.
 : trả về cho hàm qua lệnh return.
 ([danh sách tham số])
{
[return ;]
}
Khai báo prototype
 Khi biên dịch 1 chương trình C:
 Biên dịch theo thứ tự từ trên xuống dưới
 Trường hợp 1 hàm bị gọi trước vị trí hàm được
định nghĩa?
=> Phải khai báo prototype (nguyên mẫu) của hàm
trước khi sử dụng hàm
 Cú pháp khai báo prototype:
 ([Danh sách các tham số])
5
Khai báo prototype
 Ví dụ:
6
#include
double power(float,int); // Khai báo prototype hàm
main()
{ 
float x=12.3; int n=3;
printf(“lũy thừa bậc %d của %f là %f”,power(x,n));
}
double power(float base, int exp)
{//Định nghĩa hàm
.
}
Quy tắc hoạt động của hàm
 Lời gọi hàm có dạng:
Tên_hàm ([Danh sách đối số]);
 Chú ý: Số đối số = số tham số hình thức
 Quy trình thực hiện khi gọi hàm: 
 Cấp phát vùng nhớ cho các biến cục bộ và các tham số hình
thức
 Gán giá trị của đối số cho các tham số hình thức.
 Thực hiện các câu lệnh trong thân hàm
 Khi gặp câu lệnh return hoặc dấu } cuối cùng của thân hàm thì
máy sẽ xoá các biến cục bộ, các tham số hình thức và ra khỏi
hàm.
 Nếu trở về từ một câu lệnh return có chứa biểu thức thì giá trị
của biểu thức được gán cho hàm. Giá trị của hàm sẽ được sử
dụng trong các biểu thức chứa nó.
Tham số của hàm
 Tham số (function parameter):
 Như là 1 biến được khai báo trong khai báo hàm hoặc
khai báo prototype
 Có phạm vi hoạt động trong hàm mà chúng được khai
báo
 Là biến tự động, được cấp phát bộ nhớ khi hàm được
gọi và bị xóa khi ra khỏi hàm
 Có phạm vi hoạt động tạm thời, do đó, có thể đặt tên
trùng với các đại lượng ngoài hàm
Đối số của hàm
 Đối số (argument):
 Là giá trị được truyền vào hàm (khi gọi hàm) tại vị trí
của tham số
 Khi một hàm được gọi, tất cả tham số (parameter) 
của hàm đều được tạo như là một biến, và giá trị của
đối số (argument) được copy vào trong tham số.
 Việc copy giá trị của đối số vào tham số được gọi là
truyền tham số (parameter passing)
Truyền tham số cho hàm
 Có 2 cách truyền tham số cho hàm:
 Truyền theo tham trị (by value)
 Truyền theo tham biến hay tham trỏ (by 
variable/pointer)
Truyền tham số cho hàm
Truyền giá trị
Truyền đối số cho hàm ở dạng giá trị.
Có thể truyền hằng, biến, biểu thức nhưng hàm chỉ
sẽ nhận giá trị.
Được sử dụng khi không có nhu cầu thay đổi giá trị
của tham số sau khi thực hiện hàm.
void TruyenGiaTri(int x)
{
x++;
}
Truyền tham số cho hàm
Truyền Địa chỉ (Call by Address)
Truyền đối số cho hàm ở dạng địa chỉ (con trỏ).
Không được truyền giá trị cho tham số này.
Được sử dụng khi có nhu cầu thay đổi giá trị của
tham số sau khi thực hiện hàm.
void TruyenDiaChi(int *x)
{
(*x)++;
}
Truyền tham số cho hàm
 Truyền mảng vào hàm:
 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)
 Ví dụ:
int a[20], n = 10;
Input_array(a, n); 
/*Input_array(int a[], int n) là hàm nhập giá trị
các phần tử mảng từ bàn phím*/
Truyền tham số cho hàm
Lưu ý khi truyền tham số
Trong một hàm, các tham số có thể truyền theo nhiều
cách.
void HonHop(int x, int *y)
{
x++;
(*y)++;
}
Truyền tham số cho hàm
Lưu ý khi truyền đối số
Sử dụng tham chiếu là một cách để trả về giá trị cho
chương trình.
int TinhTong(int x, int y)
{
return x + y;
}
void TinhTong(int x, int y, int *tong)
{
*tong = x + y;
}
void TinhTongHieu(int x, int y, int *tong, int *hieu)
{
*tong = x + y; *hieu = x – y;
}
Truyền tham số cho hàm
Một số lưu ý khi gọi hàm
{ Các hàm được khai báo ở đây }
void main()
{
int n = 9;
XuatTong(1, 2);
XuatTong(1, n);
TinhTong(1, 2);
int tong = TinhTong(1, 2);
TruyenGiaTri(1);
TruyenGiaTri(n);
TruyenDiaChi(1);
TruyenDiaChi(&n);
}
Hàm đệ quy
 Định nghĩa:
 Hàm đệ quy là hàm cho phép gọi đến chính nó trong
thân của hàm.
 Khi hàm gọi đệ qui đến chính nó, thì mỗi lần gọi máy
sẽ tạo ra một tập và <các tham
số nhận theo giá trị> mới hoàn toàn độc lập với tập
 và 
đã được tạo ra trong các lần gọi trước.
17
Hàm đệ quy
 Các bài toán có thể sử dụng hàm đệ quy: 
Thường áp dụng cho các bài toán phụ thuộc 
tham số có 2 đặc điểm sau:
 Bài toán dễ dàng giải quyết trong một số trường 
hợp riêng ứng với các giá trị đặc biệt của tham số. 
Người ta thường gọi là trường hợp suy biến.
 Trong trường hợp tổng quát, bài toán có thể qui về 
một bài toán cùng dạng nhưng giá trị tham số thì bị 
thay đổi. Sau một số hữu hạn bước biến đổi đệ qui 
nó sẽ dẫn tới trường hợp suy biến.
Hàm đệ quy
 Cách xây dựng hàm đệ quy:
if (trường hợp suy biến){
Thực hiện cách giải bài toán khi suy
biến
}
else { /* Trường hợp tổng quát */
Gọi đệ qui tới hàm đang viết với các giá
trị khác của tham số
}
Hàm đệ quy
 Ví dụ: Tính n! 
#include "stdio.h“
#include "ctype.h“
long gtdq(int n)
{
if (n==0 || n==1) return 1;
else return(n*gtdq(n-1));
}
main()
{
char kt; int n;
do{
printf("Nhap vao mot so: ");
scanf("%d",&n);
printf("\n n!=%ld",gtdq(n));
printf("\nCo tinh tiep? (c/k)");
kt=getche();
} w

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_4_ham_nguyen_thi_hien.pdf