Khai báo hàm tiếpKiểu dữ liệu trả về của hàm: Kiểu dữ liệu của giá trị tính toán mà hàm trả về sau khi thực hiện.. Tham số trong lời khai báo hàm được gọi là tham số hình thức, tham
Trang 1TIN HỌC ĐẠI CƯƠNG
PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C
BÀI 5: HÀM
KHOA C¤NG NGHÖ
INFORMATION TECHNOLOGY
Trang 35.1 Khái niệm hàm
Còn được gọi là chương trình con
Những đoạn chương trình lặp đi lặp lại
nhiều lần ở những chỗ khác nhau:
Viết thành hàm để khi cần chỉ cần gọi ra
chứ không phải viết lại toàn bộ
Ví dụ:
Các hàm toán học: sin(x), pow(x,y), sqrt(x),
Các hàm do người dùng viết ra.
Trang 45.1 Khái niệm hàm
Giải quyết một bài toán lớn thì chương trình của
ta có thể rất lớn và dài Chia thành các công
viết, kiểm tra và sửa lỗi
Việc chia nhỏ một chương trình thành các
chương trình con đảm nhận những công việc
nhỏ khác nhau chính là tư tưởng chính cho
phương pháp lập trình cấu trúc (structured
programming)
Trang 6//Than ham` bao gom:
//Cac khai bao
//Cac cau lenh
}
Trang 75.2.1 Khai báo hàm (tiếp)
Trang 85.2.1 Khai báo hàm (tiếp)
Kiểu dữ liệu trả về của hàm:
Kiểu dữ liệu của giá trị tính toán mà hàm trả
về sau khi thực hiện
Hàm có thể có giá trị trả về hoặc không có giá trị trả về
Nếu có giá trị trả về, trong thân hàm có ít nhất một
lệnh return.
Nếu không có giá trị trả về cần khai báo cho hàm
đó có kiểu trả về là void.
Trang 95.2.1 Khai báo hàm (tiếp)
Trang 105.2.1 Khai báo hàm (tiếp)
Tham số của hàm:
Các thông tin cần cho hoạt động của hàm và các
thông tin, kết quả tính toán được hàm trả lại.
Tham số chứa dữ liệu vào cung cấp cho hàm
Tham số chứa dữ liệu ra mà hàm tính toán được.
Tham số trong lời khai báo hàm được gọi là tham số
hình thức, tham số giả định của hàm.
Cần chỉ ra tên của tham số và kiểu dữ liệu của tham số.
Một hàm có thể không có tham số, hoặc có nhiều
tham số.
Trang 115.2.1 Khai báo hàm (tiếp)
Lệnh return
Cú pháp:
return bieu_thuc;
Khi gặp lệnh này, chương trình sẽ tính toán
giá trị của bieu_thuc, lấy kết quả tính toán
được làm giá trị trả về cho lời gọi hàm rồi kết
thúc việc thực hiện hàm, trở về chương trình
đã gọi nó
Nếu thiếu bieu_thuc Kết thúc việc thực
hiện hàm mà không trả về giá trị nào cả
Trang 12Ví dụ về các hàm trong thư viện Math.h
Trang 135.2.2 Sử dụng hàm
Sử dụng hàm hay gọi hàm Cú pháp:
Tham số được cung cấp cho hàm trong
quá trình thực hiện được gọi là tham số
thực.
Kiểu dữ liệu của tham số hình thức và
tham số thực phải giống nhau.
Trang 15Lưu ý
Trong chương trình, khi gặp một lời gọi hàm thì
hàm bắt đầu thực hiện bằng cách chuyển các
lệnh thi hành đến hàm được gọi Quá trình diễn
ra như sau:
Nếu hàm có tham số, trước tiên các tham số sẽ được
Chương trình sẽ thực hiện tiếp các câu lệnh trong
thân hàm bắt đầu từ lệnh đầu tiên đến câu lệnh cuối
cùng.
Khi gặp lệnh return hoặc dấu } cuối cùng trong
thân hàm, chương trình sẽ thoát khỏi hàm để trở về
chương trình gọi nó và thực hiện tiếp tục những câu
lệnh của chương trình này.
Trang 17void nhap_mang(int *a, int n)
Trang 19Viết hàm để hoán đổi giá trị hai biến?
void trao_doi(int so1, int so2)
}
Trang 20Gọi hàm: tham chiếu và tham trị
Khi gọi hàm cần truyền đối số (tham số)
cho hàm.
2 phương pháp truyền giá trị:
Tham chiếu (biến)
Tham trị
Trang 21Gọi hàm: tham chiếu và tham trị
Gọi theo tham trị (Call by value)
Bản sao của đối số được truyền cho hàm
Sử dụng khi không muốn thay đổi giá trị tham số
truyền vào
Gọi hàm tham trị loại bỏ các thay đổi ngoài ý muốn
lên các tham số
Gọi hàm tham biến (Call by reference)
Truyền cho hàm biến gốc (không phải bản sao)
Truyền địa chỉ và sử dụng con trỏ
Thay đổi giá trị của đối số trong hàm sẽ ảnh hưởng
Trang 22Viết hàm để hoán đổi giá trị hai biến?
trao_doi(&a[i], &a[j]);
}
Trang 24void hien_thi_mang(int *a, int n)
Trang 275.3 Phạm vi biến
Biến địa phương (Local Variable):
Là các biến được khai báo trong lệnh khối
hoặc trong thân chương trình con
Biến toàn cục (Global Variable):
Là biến được khai báo trong chương trình
chính
Vị trí khai báo của biến toàn cục là sau phần
khai báo tệp tiêu đề và khai báo hàm nguyên
mẫu
Trang 28} {
int a = 3;
printf(“\n a = %d”,a);
} getch();
}
Trang 30Để làm điều này ta đặt từ khóa register trước khai
báo của biến đó
Số lượng và kích thước các thanh ghi có hạn Số
lượng biến khai báo register sẽ không nhiều và
thường chỉ áp dụng với những biến có kích thước nhỏ
như kiểu char, int
Trang 31Biến static
Một biến cục bộ khi ra khỏi phạm vi của biến đó
thì bộ nhớ dành để lưu trữ biến đó sẽ được giải
phóng
Nếu cần lưu giá trị của các biến cục bộ này, cần
khai báo biến với từ khóa static.
Ví dụ: static int a;
Biến static là biến tĩnh, nghĩa là nó sẽ được
cấp phát một vùng nhớ thường xuyên từ lúc khai báo và chỉ giải phóng khi chương trình chính kết
thúc
Trang 32static int count = 1;
printf("\n Lan goi ham fct lan thu %2d",count+
Trang 35Nguyên mẫu hàm
Nếu muốn đặt phần khai báo hàm nằm sau hàm
Để báo cho chương trình dịch biết có một hàm có
dòng đầu hàm giống như trong phần nguyên mẫu
này.
Chương trình dịch có thể kiểm tra được là các lời gọi
hàm trong chương trình chính có đúng hay không
Có phù hợp về kiểu dữ liệu trả về hay không
Các tham số thực có kiểu dữ liệu có phù hợp với kiểu dữ
liệu đã khai báo hay không.
Trong hàm nguyên mẫu có thể không cần nêu
tên các tham số hình thức, nhưng trong phần
khai báo hàm ta cần phải có các tham số hình
Trang 375.5 Hàm đệ quy
Khái niệm hàm đệ quy
Hàm tự gọi chính mình
Khi xây dựng hàm đệ quy cần:
Xây dựng trường hợp cơ bản
Nguyên lý đưa trường hợp tổng quát về
Trang 40Ví dụ hàm đệ quy: tính giai thừa
/* dung de quy dinh nghia ham factorial */
long factorial(long number)
Trang 41Ví dụ hàm đệ quy: Dãy số Fibonacci
Dãy số Fibonacci: 0, 1, 1, 2, 3, 5, 8
Mỗi số trong dãy số Fibonacci có giá trị là tổng của hai số đứng trước nó trong dãy
Công thức tổng quát của dãy số Fibonacci
fib(n) = fib(n - 1) + fib(n – 2)
Hai số đầu tiên của dãy số Fibonacci có giá trị tương ứng 0 và 1:
fib(0)=0 fib(1)=1
Trang 42
Ví dụ hàm đệ quy: Dãy số Fibonacci
Dãy số Fibonacci: 0, 1, 1, 2, 3, 5, 8
Giải thuật đệ quy để tính giá trị các số trong dãy Fibonacci:
long fibonacci(long n) {
if (n == 0 || n == 1) //Truong hop co ban
return n;
else return fibonacci(n - 1) + fibonacci(n – 2);
}
Trang 43
Ví dụ hàm đệ qui: Tìm kiếm nhị phân
Trên mảng đã sắp xếp tăng dần hoặc giảm dần
Nếu giá trị cần tìm > giá trị của phần tử đầu tiên
và nhỏ hơn giá trị của phần tử trong mảng:
So sánh phần tử giữa mảng với giá trị cần tìm
Nếu bằng, tìm thấy và kết thúc
Lặp lại cho tới khi tìm thấy hoặc đã duyệt qua hết các nửa
Mỗi lần như vậy ta loại bỏ được một nửa số
phần tử đang xét - tìm kiếm nhị phân
Giải thuật này sẽ thực hiện tìm kiếm rất nhanh
Trang 44int cs_min, cs_max; /* Bien luu chi so cua ptu dau
va ptu cuoi trong mang */
int gtri_tim; // gia tri can tim kiem
int cs; // chi so
scanf( “Nhap gia tri can tim: %d”, & gtri_tim);
minindex = 0; // Chi so cua phan tu dau tien
maxindex = KT-1; // Chi so cua phan tu cuoi cung
Trang 45while (cs_min < cs_max)
Trang 46Câu hỏi?