Buổi 5: Hàm và chương trình

Giảng viên: TS. Lê Hoàng Sơn

lehoangson@hus.edu.vn

1

Lập trình tính toán khoa học kỹ thuật

Nội dung chính

Hàm & chương trình con

1

Bài tập

2

2/20 Lê Hoàng Sơn

1. Hàm  Là một đoạn chương trình độc lập thực hiện trọn vẹn

một công việc rồi trả về một giá trị cho chương trình đã gọi nó.

 Hỗ trợ cho chương trình chính nhằm thực hiện một số

thao tác cụ thể.

 Một chương trình C bao gồm một hoặc nhiều hàm.

 Hàm main() là thành phần bắt buộc của chương trình

 Đặc điểm của hàm:

 

Là một đơn vị độc lập của chương trình. Không cho phép xây dựng một hàm bên trong một hàm khác.

3/20 Lê Hoàng Sơn

Cú pháp Hàm  Kiểu dữ liệu (KiểuDL): Giá trị trả

về của hàm được xác định dựa vào mục đích của hàm. VD: int, float, double, void

 Tên hàm (hàmA): theo quy ước

đặt tên biến

 Tham số: danh sách các giá trị đầu vào (tham trị) và đầu ra (tham biến) của hàm

 Danh sách biến: là các biến chỉ sử dụng trong từng hàm con

 Gọi hàm trong main() bằng tên

hàm và tham số

KiểuDL: hàmA (tham số) { danh sách biến; các lệnh; return KiểuDL; } int main() { hàmA(); … }

4/20 Lê Hoàng Sơn

Ví dụ: Tính lũy thừa m của x

Định nghĩa hàm

Trả về lũy thừa m của x

Gọi hàm

# include # include # include double luy_thua(int x, int m) { double ket_qua; ket_qua = pow(x,m); return ket_qua; } int main() { int a, n; printf("\n Nhap vao a va so mu n:"); scanf("%d%d", &a,&n); printf("\n Luy thua a^n = %5.3f",luy_thua(a,n)); getch(); return 0; }

5/20 Lê Hoàng Sơn

Ví dụ: Vẽ dấu *

Hàm vẽ dấu *

Không có giá trị trả về

Gọi hàm

# include # include void line(int num) { int i; for(i = 0; i < num; i++) printf("*"); printf("\n"); } int main() { int so; printf("\n Nhap vao so dau *:"); scanf("%d", &so); line(so); getch(); return 0; }

6/20 Lê Hoàng Sơn

Nguyên tắc hoạt động của hàm

 Trong hàm main() khi gặp hàm thì cấp phát bộ nhớ cho

các tham số và biến của hàm

 Gán giá trị cho tham số hàm

 Thực hiện các lệnh trong thân hàm

 Khi gặp câu lệnh return hoặc dấu hiệu kết thúc hàm thì giải phóng bộ nhớ của các tham số và biến của hàm

 Thoát khỏi hàm quay về thời điểm sau khi gọi hàm trong

main()

7/20 Lê Hoàng Sơn

Tham số của hàm

 Tham trị: các giá trị sẽ truyền cho hàm (Input). Tham trị không bảo lưu lại những kết quả thay đổi của nó được tính toán trong Hàm khi Hàm kết thúc. Ví dụ: int so; line(so);

 Tham biến: các giá trị của biến mà ta mong

muốn nhận được sau khi kết thúc hàm (output). Khai báo dưới dạng địa chỉ.

8/20 Lê Hoàng Sơn

Ví dụ: Đếm số lần xuất hiện và in vị trí cuối trong dãy

# include # include int dem(float *a, int kichthuoc, float b,

int *vitri)

{ int i, so = 0; for(i = 0; i < kichthuoc; i++) if(a[i] == b) { so++; *vitri = i; } return so; }

int main() { float m[5], n; int i, vitri, solan; for(i = 0; i < 5; i++) { printf("\n Nhap vao so thu %d:",i+1); scanf("%f", &m[i]); } printf("\n Nhap vao so can tim:"); scanf("%f", &n); solan = dem(m,5,n,&vitri); printf("\n So lan xuat hien = %d, vi tri cuoi = %d",solan,vitri); getch(); return 0; }

9/20 Lê Hoàng Sơn

Kết quả

10/20 Lê Hoàng Sơn

Phạm vi của biến

 Biến cục bộ: các biến sử dụng trong từng hàm kể cả

hàm main(). Kết thúc hàm sẽ giải phóng bộ nhớ của các biến này.

 Biến toàn cục: các biến khai báo từ đầu chương trình và không thuộc về hàm nào. Mục đích để sử dụng chung giữa các hàm.

 Nên khai báo ít biến toàn cục để tránh lãng phí bộ nhớ.

 Nếu tên biến toàn cục và cục bộ trùng nhau thì sẽ ưu

tiên cho biến cục bộ

11/20 Lê Hoàng Sơn

Ví dụ: Kiểm tra một số có phải số nguyên tố

int main() { printf("\n Nhap vao so can kiem

tra: ");

scanf("%d", &n); if (languyento(n)) printf("\n Day la so nguyen

to"); else printf("\n Day khong la so

nguyen to");

# include # include int n; //biến toàn cục int languyento(int so) { int i, kt = 1; //biến cục bộ for(i = 2; i < so; i++) if(so % i == 0) { kt = 0; break; } return kt; }

getch(); return 0; }

12/20 Lê Hoàng Sơn

Kết quả

13/20 Lê Hoàng Sơn

Ví dụ: Sắp xếp dãy tăng dần

# include # include # include float *a; int n, i, j; float *nhapday(int *n) { float *b; printf("\n Nhap vao so phan tu: "); scanf("%d", n); b = (float *) calloc(*n,

sizeof(float));

for(i = 0; i < *n; i++) { printf("\n Nhap A[%d] = ",i); scanf("%f",&b[i]); } return b; }

void sapxep(float *a, int n) { float tam; for(i = 0; i < n -1; i++) for(j = i + 1; j < n ; j++) if (a[i] > a[j]) // đổi chỗ { tam = a[i]; a[i] = a[j]; a[j] = tam; } } void inday(float *a, int n) { puts("Day sau khi da sap xep la:"); for(i = 0; i < n; i++) printf("%f\t",a[i]); }

14/20 Lê Hoàng Sơn

Ví dụ: Sắp xếp dãy tăng dần (tiếp)

int main() { a = nhapday(&n); sapxep(a,n); inday(a,n); getch(); return 0; }

15/20 Lê Hoàng Sơn

Tóm tắt bài học

Hàm và chương trình con

 Cấu trúc hàm  Các loại tham số  Phạm vi của biến

16/20 Lê Hoàng Sơn

Câu hỏi thảo luận

17/20 Lê Hoàng Sơn

Nội dung chính

Hàm & chương trình con

1

Bài tập

2

18/20 Lê Hoàng Sơn

Bài tập

1. Viết hàm tính n! 2. Viết hàm tính tổng S = 1+2n+….+mn 3. Viết lại bài số đối xứng (Lesson 4) thành dạng hàm. 4. Số hoàn hảo là số nguyên dương có tổng các ước số nguyên dương bé hơn nó bằng chính nó. Hãy tìm tất cả các số hoàn hảo nhỏ hơn một số N cho trước.

5. Nhập vào số N. In ra N số Fibonacci đầu tiên 6. Tìm tất cả các ước của số N 7. Nhập hai dãy kích thước N từ bàn phím. Trộn hai dãy

này thành một dãy tăng.

8. Viết các hàm nhập, in và tính tổng hai ma trận cỡ m x

n thành các hàm.

19/20 Lê Hoàng Sơn

Lê Hoàng Sơn

C l i c k t o e d i t c o m p a n y s l o g a n .

Lập trình tính toán khoa học kỹ thuật