Bài giảng Tin học đại cương - Phần 5: Hàm

11/11/2010  
Nội dung  
Khái niệm về hàm  
Tham số biến cục bộ  
Giá trị trả về  
5. Hàm function  
Hàm gọi hàm  
Hàm với tham số mảng, xâu ký tự  
Biến, hằng toàn cục  
Biến tĩnh – static  
Hàm đệ quy  
1
11/11/2010  
5.1. Khái niệm về hàm  
printf ("Programming is fun.\n");  
scanf("%i",&n);  
int main(void)  
5.1. Khái niệm về hàm  
Mọi chương trình C đều ẩn chứa một khái niệm cơ bản là  
hàm  
Hàm (function) cung cấp cơ chế cho phép các chương trình  
dễ dàng viết, đọc, hiểu, debug (bắt lỗi), sửa đổi bảo trì.  
2
11/11/2010  
5.1. Khái niệm về hàm  
5.1. Khái niệm về hàm  
Định nghĩa hàm  
Dòng đầu tiên trong định nghĩa hàm cung cấp cho chương  
trình dịch 4 thông tin về hàm (theo thứ tự từ trái sang)  
#include <stdio.h>  
void printMessage (void)  
{
printf ("Programming is fun.\n");  
}
Người thể gọi hàm này  
Kiểu giá trị trả về  
Tên hàm  
Các tham số mà nó cần  
dụ  
int main (void)  
{
void printMessage (void)  
printMessage ();  
int intTong(int x, int y)  
return 0;  
}
Dòng đầu tiên trong định nghĩa hàm được gọi mẫu hàm  
3
11/11/2010  
5.1. Khái niệm về hàm  
5.1. Khái niệm về hàm  
Kết quả chạy chương trình ?  
Kết quả chạy chương trình ?  
#include <stdio.h>  
#include <stdio.h>  
void printMessage (void)  
void printMessage (void)  
{
{
printf ("Programming is fun.\n");  
}
printf ("Programming is fun.\n");  
}
int main (void)  
int main (void)  
{
{
printMessage ();  
printMessage ();  
return 0;  
int i;  
for ( i = 1; i <= 5; ++i )  
printMessage ();  
}
return 0;  
}
4
11/11/2010  
#include <stdio.h>  
#include <stdlib.h> //cho ham system()  
#include <math.h>  
void CircleArea(float r)  
{
float S;  
5.2. Tham số và  
biến cục bộ  
S= M_PI*r*r;  
printf("%.2f co dien tich la: %.2f\n",r,S);  
}
int main()  
{
CircleArea(5);  
CircleArea(45);  
return 0;  
}
5
11/11/2010  
5.2. Tham số biến cục bộ  
5.2. Tham số biến cục bộ  
Với hàm giaiThua(int) đã được định nghĩa  
Tham số của hàm:  
giống tham số trong một hàm toán học,  
Tăng hiệu quả và tính mềm dẻo của hàm  
int main (void)  
{
giaiThua(5);  
giaiThua(7);  
giaiThua(10);  
void giaiThua(int n)  
{
int i;  
long gt;  
for(i=1;i<=n;i++) gt=gt*i;  
return 0;  
}
printf("%d!= %ld\n",n,gt);  
}
6
11/11/2010  
5.2. Tham số biến cục bộ  
5.2. Tham số biến cục bộ  
Hàm không có tham số: phần khai báo danh sách tham số  
của hàm để trống hoặc dùng từ khóa void (nên dùng cách  
này)  
Biến cục bộ: các biến được định nghĩa trong hàm là biến  
cục bộ.  
Dùng hàm không có tham số: tên_hàm();  
Chúng được tự động tạo ra mỗi khi hàm được gọi  
Giá trị của chúng là cục bộ (chỉ được truy cập trong  
phạm vi của hàm đó)  
void trinhBay(void)  
{
printf("CHUONG TRINH GIAI PHUONG TINH BAC HAI\n");  
printf("=====================================\n");  
}
Nếu biến có giá trị khởi tạo thì giá trị đó được gán  
mỗi khi gọi hàm  
int main (void)  
{
trinhBay();  
return 0;  
}
7
11/11/2010  
5.2. Tham số biến cục bộ  
void USCLN(int u, int v)  
{
int tmp;  
printf ("USCLN cua %i va %i la ", u, v);  
while ( v != 0 ) {  
5.3. Giá trị trả về  
tmp = u % v;  
u = v;  
v = tmp;  
}
printf ("%i\n", u);  
}
int main (void)  
{
USCLN (150, 35);  
USCLN (1026, 405);  
return 0;  
}
8
11/11/2010  
5.3. Giá trị trả về  
5.3. Giá trị trả về  
Trong khai báo hàm kiểu giá trị  
trong khai báo phải trùng với  
kiểu trả về trong lệnh return.  
Hàm có thể thực hiện và in luôn kết quả nên không cần  
giá trị trả về (khai báo hàm với từ khóa void)  
void USCLN(int u, int v)  
int gcd (int u, int v)  
float goc_do (float goc_rad)  
dụ  
void giaiThua(int n)  
Khi không muốn hiển thị ngay kết quả, hoặc kết quả thực  
hiện của hàm chưa phải kết quả cuối cùng. Ta cần trả về  
giá trị của hàm cho nơi gọi hàm.  
int USCLN (int u, int v)  
{
int temp;  
while ( v != 0 ) {  
Trả về giá trị trong hàm bằng từ khóa return  
return biểu_thức;  
temp = u % v; u = v; v = temp;  
}
return u;  
}
9
11/11/2010  
5.3. Giá trị trả về  
5.3. Giá trị trả về  
Với hàm USCLN đã khai báo trên  
Hàm có giá trị trả về được dùng giống như các hàm trong  
thư viện math.cnhư abs(), floor(), sqrt(), pow(),…  
int main (void)  
{
int result;  
result = USCLN(150, 35);  
printf ("USCLN cua 150 va 35 la %i\n", result);  
Kiểu trả về phải trùng với kiểu của giá trị trả về của biểu  
thức trong lệnh return, nếu không sẽ lỗi  
Hàm khai báo với từ khóa void thì không có gtrị trả  
về. Mọi cách thử dùng hàm này như một biểu thức đều  
gây ra lỗi biên dịch.  
result = USCLN(1026, 405);  
printf ("USCLN cua 1026 va 405 la %i\n", result);  
printf ("USCLN cua 83 va 240 la %i\n", USCLN(83,240));  
return 0;  
}
dụ. Với hàm void giaiThua(int n)ta không thể  
dùng  
int n=giaiThua(10);  
10  
11/11/2010  
5.4. Hàm gọi hàm  
Chương trình đọc số nguyên có nhiều nhất 3 chữ s, ví  
dụ đầu vào là số -125 thì chương trình sẽ in ra màn hình  
là âm một trăm hai mươi năm.  
5.4. Hàm gọi hàm  
Hướng giải quyết: chia nhỏ vấn đề thành các bài toán  
con  
Xây dựng hàm đọc chữ số  
Xây dựng hàm kiểm tra số đầu vào có hợp lệ hay  
không (có tối đa ba chữ s)  
Xây dựng hàm đọc số từ hàm trên  
11  
11/11/2010  
5.4. Hàm gọi hàm  
5.4. Hàm gọi hàm  
//hàm đọc chữ số  
void docChuSo(int a)  
{
Hàm kiểm tra số đầu vào số hợp lệ hay không (có tối đa  
ba chữ s). Hàm này trả về giá trị -1 nếu số đầu vào  
không hợp l, trả về 0 nếu ngược lại  
if(a==0) printf("khong");  
else if(a==1)printf("mot");  
else if(a==2)printf("hai");  
else if(a==3)printf("ba");  
else if(a==4)printf("bon");  
else if(a==5)printf("nam");  
else if(a==6)printf("sau");  
else if(a==7)printf("bay");  
else if(a==8)printf("tam");  
else if(a==9)printf("chin");  
else printf("ERROR!!!");  
}
int kiemTra(int n)  
{
if(n>999 || n<-999) return -1;  
else return 0;  
}
12  
11/11/2010  
c=n%10; n=n/10;  
b=n%10; n=n/10;  
a=n%10;  
5.4. Hàm gọi hàm  
if(a>0){ docChuSo(a); printf(" tram ");}  
if(a>0 && b==0)printf("le ");  
if(b==1){ printf("muoi ");}  
if(b>1){ docChuSo(b);printf(" muoi ");}  
Hàm đọc số  
void docSo(int n)  
{
int a,b,c;  
docChuSo(c); printf("\n");  
}
if(kiemTra(n)==-1)  
}
printf("Loi! So khong hop le.\n");  
else  
{
int main(void)  
{
docSo(-115);  
docSo(-125);  
docSo(-105);  
docSo(-5);  
return 0;  
}
if(n<0){  
printf("am ");  
n=-n;  
}
13  
11/11/2010  
5.4. Hàm gọi hàm  
Hàm và thiết kế top-down  
Thiết kế top-down: chia bài toán ban đầu thành các bài  
toán con cho đến khi các bài toán con có thể xử lý trực  
tiếp được.  
5.5. Hàm với tham số là  
mảng và xâu ký tự  
Viết các hàm để xử lý các bài toán con  
Chương trình chính sẽ chỉ cần gọi các hàm để thưc hiện  
các công việc  
Ưu điểm: chương trình gọn, dễ bắt lỗi  
14  
11/11/2010  
5.5 Tham số mảng, xâu ký tự  
5.5 Tham số mảng, xâu ký tự  
Hàm tìm giá trị lớn nhất trong một mảng số thực.  
Hàm in giá trị của các phần tử trong một mảng số thực  
gồm 10 phần tử  
float maximum(float A[], int size)  
{
float maxVal=A[0];  
int i;  
for(i=0;i<size;i++)  
if(A[i]>max) maxVal=A[i];  
void display(float A[10])  
{
int i;  
for(i=0;i<10;i++)  
printf("%.2f ",A[i]);  
printf("\n");  
}
return maxVal;  
}
Số lượng phần tkhông cố định, biểu diễn bởi tham số  
size hàm mềm dẻo hơn.  
15  
11/11/2010  
5.5 Tham số mảng, xâu ký tự  
5.5 Tham số mảng, xâu ký tự  
int main(void)  
{
Thay đổi giá trị của các phần tử trong mảng  
float array1[10] = { 15.7, -2.8, -3.7, 26, 1.08, 64,  
5.6, 12, 34, 9.01};  
Hàm tăng giá trị các phần tử trong mảng lên 2 đơn vị  
float array2[7] = { 1.2, 4.5, 1, -10, 6.5, 3, 2.2 };  
void incrementBy2(float A[], int size)  
{
printf("Noi dung mang array1\n");  
display(array1);  
int i;  
printf("Gia tri lon nhat trong array1: %.2f\n",  
maximum(array1,10));  
for(i=0;i<size;i++) A[i]+=2;  
}
printf("Gia tri lon nhat trong array2: %.2f\n",  
maximum(array2,7));  
return 0;  
}
16  
11/11/2010  
5.5 Tham số mảng, xâu ký tự  
5.5 Tham số mảng, xâu ký tự  
5
3
7
4
2
5
3
7
4
2
lần lặp 2  
Hàm sắp xếp giá trị các phần tử trong mảng theo thứ tự  
giảm dần  
5
5
5
7
7
7
3
4
4
4
3
3
2
2
2
5
5
7
7
3
4
4
3
2
2
Thuật toán sắp xếp mảng đơn giản:  
Dãy ban đầu  
3
5
2
7
4
lần lặp 1  
3
5
5
3
2
2
7
7
4
4
5
5
3
3
2
2
7
7
4
4
lần lặp 3  
7
7
5
5
4
4
3
3
2
2
7
7
5
5
4
4
3
3
2
2
5
5
3
3
7
7
2
4
4
2
5
5
3
3
7
7
2
4
4
2
7
5
4
3
2
lần lặp 4  
7
5
4
3
2
Dãy kết quả  
17  
11/11/2010  
void sort (int a[], int n)  
{
5.5 Tham số mảng, xâu ký tự  
int i, j, temp;  
for ( i = 0; i < n - 1; ++i )  
for ( j = i + 1; j < n; ++j )  
Thuật toán nổi bọt (đổi chỗ):  
Gán  
if ( a[i] < a[j] ) {  
temp = a[i];  
a[i] = a[j];  
a[j] = temp;  
Bước lặp: Lặp từ phần tử đầu tiên đến phần tử thứ  
(với biến lặp là )  
}
. So sánh giá trị hai phần tử kề nhau thứ và  
}
. Nếu giá trị phần tử lớn hơn  
chỗ hai phần tử này  
thì thực hiện đổi  
void display(int A[], int size)  
{
Gán  
Thực hiện lại bước lặp cho tới khi  
int i;  
for(i=0;i<size;i++)  
printf("%d ",A[i]);  
printf("\n");  
}
18  
11/11/2010  
5.5 Tham số mảng, xâu ký tự  
5.5 Tham số mảng, xâu ký tự  
int main(void)  
{
Tham số mảng nhiều chiều. Với mảng 2 chiều tham  
số được khuyết chỉ thể số dòng.  
int i;  
int array[16] = { 34, -5, 6, 0, 12, 100, 56, 22,  
44, -3, -9, 12, 17, 22, 6, 11 };  
Hàm in nội dung mảng 2 chiều dưới dạng bảng với số  
lượng dòng không xác định  
printf ("Mang ban dau:\n");  
display(array,16);  
void display(int A[][5], int size)  
{
int i,j;  
for(i=0;i<size;i++)  
sort (array, 16);  
{
printf("Mang sau khi sap xep:\n");  
display(array,16);  
for(j=0;j<5;j++)  
printf("%d\t",A[i][j]);  
printf("\n");  
system("pause");  
return 0;  
}
}
}
19  
11/11/2010  
int main(void)  
{
5.5 Tham số mảng, xâu ký tự  
int i;  
int Matrix[3][5] = { 34, -5, 6, 0, 12,  
100, 56, 22, 44, -3,  
-9, 12, 17, 22, 6};  
Hàm nhân đôi giá trị các phần tử trong mảng  
printf("Mang ban dau\n");  
display(Matrix,3);  
void nhanDoi(int A[][5],int nRow)  
{
int i,j;  
for(i=0;i<nRow;i++)  
for(j=0;j<5;j++)  
A[i][j]*=2;  
}
nhanDoi(Matrix,3);  
printf("Mang sau nhan doi\n");  
display(Matrix,3);  
system("pause");  
return 0;  
}
20  
Tải về để xem bản đầy đủ
pdf 27 trang Thùy Anh 26/04/2022 8720
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Phần 5: Hàm", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_tin_hoc_dai_cuong_phan_5_ham.pdf