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ố và 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ố là 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 và 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 có thể gọi hàm này
Kiểu giá trị nó trả về
Tên hàm
Các tham số mà nó cần
Ví 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 là 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ố và biến cục bộ
5.2. Tham số và 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ố và biến cục bộ
5.2. Tham số và 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ố và 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)
Ví 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ó giá trị 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;
}
Ví 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ố là mảng, xâu ký tự
5.5 Tham số là 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 tử khô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ố là mảng, xâu ký tự
5.5 Tham số là 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ố là mảng, xâu ký tự
5.5 Tham số là 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ố là 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ố là mảng, xâu ký tự
5.5 Tham số là mảng, xâu ký tự
int main(void)
{
Tham số là mảng nhiều chiều. Với mảng 2 chiều tham
số được khuyết chỉ có thể là 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ố là 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 đủ
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:
- bai_giang_tin_hoc_dai_cuong_phan_5_ham.pdf