Chương 4: Hàm và cấu trúc chương trình
1. Chương trình và hàm trong C. 2. Cách viết một hàm. 3. Phân loại hàm trong C. a) Hàm với đối số là tham trị. b) Hàm với đối số là tham biến.
Bạn đang xem trước 20 trang tài liệu Chương 4: Hàm và cấu trúc chương trình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TIN HỌC ĐẠI CƯƠNG
Lý thuyết: 6 buổi
Thực hành: 8 buổi
GVHD: Dương Khai Phong
Email: khaiphong@gmail.com
Ngôn ngữ lập trình: C
NỘI DUNG CÁC BUỔI HỌC
1. Tổng quan về C (chương 1,2)
2. Các cấu trúc điều khiển trong C (chương 3)
3. Hàm và cấu trúc chương trình (chương 4)
4. Mảng, chuỗi và con trỏ (chương 5)
5. Kiểu cấu trúc, đệ qui, tập tin (chương 6,7,8)
6. Ôn tập
CHƯƠNG 4: HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH
1. Chương trình và hàm trong C.
2. Cách viết một hàm.
3. Phân loại hàm trong C.
a) Hàm với đối số là tham trị.
b) Hàm với đối số là tham biến.
1. CHƯƠNG TRÌNH VÀ HÀM TRONG C
a. Chương trình là gì?
Chương trình là một tập hợp gồm một hay nhiều hàm. Trong
đó bắt buộc phải có hàm main().
Một chương trình bắt đầu thực hiện từ câu lệnh đầu tiên của
hàm main() cho đến khi gặp dấu ngoặc } cuối cùng của hàm này.
b. Hàm là gì?
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 nhất định, rổi trả về một giá trị cho chương trình gọi
nó.
Lưu ý:
- 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.
1. CHƯƠNG TRÌNH VÀ HÀM TRONG C
* Cấu trúc của một chương trình:
1.
2.
3.
4.
5.
Lưu ý: việc truyền dữ liệu từ hàm này sang hàm
khác được thực hiện theo một trong 2 cách:
Sử dụng đối số của hàm
Sử dụng biến toàn cục
1. CHƯƠNG TRÌNH VÀ HÀM TRONG C
* Ví dụ: viết CT tính bình phương của một số nguyên a
Cách 1:
#include “stdio.h”
#include “conio.h”
void main()
{
int a,binhphuong;
printf (“Nhap a = ”);
scanf(“%d”,&a);
binhphuong=a*a;
printf (“Binh phuong của
%d là %d”,a,binhphuong);
}
Cách 2: dùng hàm
#include “stdio.h”
#include “conio.h”
int binhphuong(int i);
void main()
{ int a,kq;
printf (“Nhap a = ”);
scanf(“%d”,&a);
kq=binhphuong(a);
printf (“Binh phuong của %d là
%d”,a,kq);
}
int binhphuong(int i)
{ int kq;
kq=i*i;
return kq;
}
2. CÁCH VIẾT MỘT HÀM
* Cú pháp khai báo chung:
([Danh sách các tham
số nếu có]);
Trong đó:
• : int,float,char,... Nếu hàm không
có kiểu dữ liệu trả về thì ta dùng kiểu void.
Ví dụ: int binhphuong(int a), void xuat()
• : cần đặt tên sao cho gợi nhớ chức n8ang
của hàm.
• [Danh sách các tham số nếu có]: tùy theo chức năng
của hàm mà danh sách này có hay không có tham số,
các tham số cách nhau bởi dấu phẩy “,”
2. CÁCH VIẾT MỘT HÀM
* Cú pháp định nghĩa chung: thường được định nghĩa
bên dưới hàm main()
([Danh sách các tham
số nếu có])
{
[return giá_tri_nếu có;]
}
2. CÁC VÍ DỤ CÁCH VIẾT HÀM
* Ví dụ 1: viết chương trình tính S,P hình chữ nhật bằng
cách dùng hàm.
#include “stdio.h”
#include “conio.h”
int tinhP(int dai,int rong);
int tinhS(int dai,int rong);
void main()
{ int dai,rong;
printf (“Nhap dai,rong: ”);
scanf(“%d %d”,&dai,&rong);
printf (“Chu vi hcn là %d”,tinhP(dai,rong));
printf (“Dien tich hcn là %d”,tinhS(dai,rong));
}
// Định nghĩa các hàm
int tinhP(int dai,int rong)
{
int P;
P=(dai+rong)*2;
return P;
}
int tinhS(int dai,int rong)
{
int S;
S=dai*rong;
return S;
}
2. CÁC VÍ DỤ CÁCH VIẾT HÀM
* Ví dụ 2: viết chương trình giải ptb1 ax+b=0 dùng hàm.
#include “stdio.h”
#include “conio.h”
void giaiPTB1(int a,int b);
void main()
{ int a,b;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
giaiPTB1(a,b);
}
// Định nghĩa hàm giaiPTB1
void giaiPTB1(int a,int b)
{
float x;
if (a==0)
if (b==0)
printf (“pt VSN”);
else
printf (“pt VN”);
else
{
x=(float)-b/a;
printf (“pt co nghiem x=%.2f”,x);
}
}
2. CÁC VÍ DỤ CÁCH VIẾT HÀM
* Ví dụ 3: viết chương trình giải ptb2 ax^2+bx+c=0 dùng hàm.
#include “stdio.h”
#include “conio.h”
void giaiPTB1(int a,int b);
void giaiPTB2(int a,int bint c);
void main()
{ int a,b,c;
printf (“Nhap a,b,c: ”);
scanf(“%d %d %d”,&a,&b,&c);
giaiPTB2(a,b,c);
}
// Định nghĩa các hàm
void giaiPTB1(int a,int b) {
// xem lại vi dụ 2
}
void giaiPTB2(int a,int b,int c)
{
if (a==0) // ptb1: bx+c=0
giaiPTB1(b,c);
else
{
float delta,x1,x2;
delta=b*b-4*a*c;
if (delta<0) …
if (delta==0) …
if (delta>0) …
}
}
3. PHÂN LOẠI HÀM TRONG C
* Xét ví dụ: viết CT hoán vị giá trị cho 2 số nguyên a,b như
sau:
…
void main()
{ int a,b,tam;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc khi hvi a=%d b=%d”,a,b);
tam=a;
a=b;
b=tam;
printf (“Sau khi hvi a=%d b=%d”,a,b);
}
Tạo 3 vùng nhớ chứa số nguyên:
a =0fx.. rác (-859…)
b =1fx.. rác (-859…)
tam =2fx.. rác (…)
5
6
5
6
5
Nhap a,b:
Truoc khi hvi a=5 b=6
Sau khi hvi a=6 b=5
5 6
3. PHÂN LOẠI HÀM TRONG C
* Xét ví dụ: viết CT hoán vị giá trị cho 2 số nguyên a,b bằng
cách dùng hàm như sau:
…
void hoanvi(int a,int b);
void main()
{ int a,b;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc khi hoan vi a=%d b=%d”,a,b);
hoanvi(a,b);
printf (“Sau khi hoan vi a=%d b=%d”,a,b);
}
void hoanvi(int a,int b)
{ int tam;
tam=a;
a=b;
b=tam;
}
…
void main()
{ int a,b,tam;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
// Xuat a,b
tam=a;
a=b;
b=tam;
// Xuat a,b da hoan vi
}
3. PHÂN LOẠI HÀM TRONG C
* Cách thực thi chương trình:
…
void hoanvi(int a,int b);
void main()
{ int a,b;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc a=%d b=%d”,a,b);
hoanvi(a,b);
printf (“Sau a=%d b=%d”,a,b);
}
void hoanvi(int a,int b)
{ int tam;
tam=a;
a=b;
b=tam;
}
Tạo 2 vùng nhớ chứa số nguyên:
a= giá tri rác (-859…)0fx..
b= giá tri rác (-859…)1fx..
a= 50fx..
b= 61fx..
a'= 5 (lấy giá trị từ a)2ffx.
b'= 6 (lấy giá trị từ b)3ffx.
a'= 6 (hoán vị a=b)2ffx.
b'= 5 (hoán vị b=tam)3ffx.
Tạo 2 vùng nhớ phụ khác:
Sau khi kết thúc hàm
hoanvi 2 vùng nhớ phụ
được giải phóng
Thực hiện các lệnh để hoán vị:
Không
đổi
3. PHÂN LOẠI HÀM TRONG C
* Cách khắc phục: truy cập trực tiếp đến địa chỉ vùng nhớ
…
void hoanvi(int &a,int &b);
void main()
{ int a,b;
printf (“Nhap a,b: ”);
scanf(“%d %d”,&a,&b);
printf (“Truoc a=%d b=%d”,a,b);
hoanvi(a,b);
printf (“Sau a=%d b=%d”,a,b);
}
void hoanvi(int &a,int &b)
{ int tam;
tam=a;
a=b;
b=tam;
}
Tạo 2 vùng nhớ chứa số nguyên:
Tạo 1 vùng nhớ:
a =0fx.. rác (-859…)
b =1fx.. rác (-859…)
5
6
6
5
tam =1fx.. rác (-859…)5
3. PHÂN LOẠI HÀM TRONG C
* Nhận xét: từ ví dụ trên, ta phân loại hàm trong C theo
2 dạng cơ bản sau:
a/ Hàm với đối số là tham trị (tham số vào/trang 98)
b/ Hàm với đối số là tham biến (tham số ra/trang 98)
Lưu ý:
Ta có thể xây dựng hàm vừa có tham trị vừa có
tham biến.
Tham số khi khai báo hàm gọi chung là tham số
hình thức.
Tham số khi gọi hàm trong CT gọi là tham số
thực.
3. PHÂN LOẠI HÀM TRONG C
a/ Hàm với đối số là tham trị:
Định nghĩa: là hàm không làm thay đổi giá trị của
các tham số truyền vào khi hàm kết thúc.
Khai báo:
([DS_các tham_số])
Ví dụ:
float tinhDTB(float van,float toan);
float rutcan_bac_hai(float so);
…
3. PHÂN LOẠI HÀM TRONG C
b/ Hàm với đối số là tham biến:
Định nghĩa: là hàm làm thay đổi giá trị của các
tham số truyền vào khi hàm kết thúc.
Khai báo cơ bản:
([&DS_các tham_số])
Ví dụ:
void tinhDTB(float van,float toan, float &DTB);
float rutcan_bac_hai(float so, float &kq);
…
3. PHÂN LOẠI HÀM TRONG C
* Các vấn đề liên quan đến biến: (xem trang 100)
a/ Địa chỉ của biến: là địa chỉ vùng nhớ của máy
tính khi ta khai báo biến (qui ước: đó là số thứ tự của
byte đầu tiên trong một dãy các byte liên tiếp)
=> Cú pháp để lấy địa chỉ của biến: &
b/ Biến con trỏ: là một loại biến dùng để lưu địa chỉ
của biến. (phụ thuộc vào kiểu dữ liệu của biến)
=> Cú pháp khai báo biến con trỏ:
*;
=> Qui tắc sử dụng: biến con trỏ bắt buộc phải sử
dụng kết hợp với địa chỉ của vùng nhớ.
3. PHÂN LOẠI HÀM TRONG C
* Ví dụ: cách sử dụng biến con trỏ:
…
void main()
{
int a=5;
printf(“Truoc a=%d”,a);
int *p; // khai báo con trỏ
p=&a; // gán vào địa chỉ biến a
*p=7; // Thay đổi giá trị biến a
printf(“Sau: a=%d”,a);
}
Tạo vùng nhớ chứa số
nguyên a:
a =0fx.. 57
Truoc a=5
Sau a=7
1fx.. p NULL
3. PHÂN LOẠI HÀM TRONG C
* Các vấn đề liên quan đến biến: (xem trang 115,117)
c/ Biến cục bộ (biến nội): là các biến khai báo bên
trong thân của một hàm
Thời gian tồn tại: từ lúc hàm bắt đầu cho đến khi hàm đó
kết thúc (như vậy các biến khai báo trong hàm main() tồn
tại cho đến khi kết thúc chương trình)
Phạm vi sử dụng: chỉ sử dụng bên trong hàm mà nó
được khai báo
d/ Biến toàn cục (biến ngoại): là các biến được khai
báo bên ngoài các hàm
Thời gian tồn tại: tồn tại trong suốt chương trình
Phạm vi sử dụng: từ vị trí nó được khai báo cho đến cuối
chương trình.
3. PHÂN LOẠI HÀM TRONG C
* Bảng tóm tắt về cách dùng hàm:
Hàm
Tham số hình thức
trong khai báo hàm
Tham số thực
trong hàm main
Đối số là
tham trị
int binhphuong(int a) int a,kq;
kq=binhphuong(a);
Đối số là
tham biến
(thay đổi
giá trị của
tham số
truyền
vào)
Khai báo dạng địa chỉ của biến
void hoanvi(int &a,int &b)
int a=5,b=6;
hoanvi(a,b);
Khai báo dạng biến con trỏ
void hoanvi(int *a,int *b)
int a=5,b=6;
hoanvi(&a,&b);