Chương 4 trình bày về lập trình C bằng phương pháp hàm. Các nội dung được trình bày trong chương này gồm có: Phương pháp xây dựng hàm; khai báo hàm, gọi hàm; tầm vực biến; tham số là tham trị, tham biến;... Mời các bạn cùng tham khảo.
Trang 2đã được khai báo
Gọi thực hiện các hàm theo yêu cầu của bài toán
Trang 3Xét chương trình nhập vào số nguyên dương n,
Trang 4void main()
{ int n;
cout<<"Nhap so nguyen duong: ";
cin>>n;
cout<<"Cac so nguyen to nho hon "<<n<<" la:"<<endl;
for(int so=2; so<n; so++)
Trang 5printf( "Cac so nguyen to nho hon %d la:\n" , n);
for ( int so = 2; so < n; so++)
Trang 7void NhapSoNguyen(int &n)
Trang 9Khái niệm
•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 và trả về kết quả cho chương trình gọi nó
Trang 10Mẫu hàm
Kiểu dữ liệu trả về của hàm (kết quả của hàm/ đầu
ra), gồm:
• void: Không trả về giá trị
• float / int / long / char */ kiểu cấu trúc / … : Trả về
kết quả tính được với KDL tương ứng
10
<KDL trả về của hàm> TênHàm([ds tham số]);
Trang 11•TênHàm: Đặt tên theo qui ước sao cho phản ánh đúng chức năng thực hiện của hàm
•Danh sách các tham số (nếu có): đầu vào của
hàm (trong một số trường hợp có thể là đầu vào
và đầu ra của hàm nếu kết quả đầu ra có nhiều giá trị - Tham số này gọi là tham chiếu)
Trang 12Hàm không trả về giá trị
Cài đặt
void TênHàm([danh sách các tham số])
{
Khai báo các biến cục bộ
Các câu lệnh / khối lệnh hay lời gọi đến hàm khác.
}
Gọi hàm
TênHàm(danh sách tên các đối số);
Những phương thức loại này thường rơi vào những nhóm
chức năng: Nhập / xuất dữ liệu , thống kê, sắp xếp, liệt kê
12
Trang 13Ví dụ
Viết chương trình nhập số nguyên dương n và in ra màn hình các ước số của n
Phân tích bài toán:
• Input: n (Để xác định tham số)
KDL: số nguyên dương (int).
• Output: In ra các ước số của n (Để xác định KDL trả
về của hàm)
Xuất ra màn hình Không trả về giá trị KDL của hàm
là void
• Xác định tên hàm: Hàm này dùng in ra các ước số của
n nên có thể đặt là LietKeUocSo
void LietKeUocSo(int n);
Trang 15Hàm có trả về giá trị
Cài đặt
<Kiểu dữ liệu trả về> TênHàm([danh sách các tham số])
{
<Kiểu dữ liệu trả về> kq;
Khai báo các biến cục bộ
Các câu lệnh / khối lệnh hay lời gọi đến hàm khác.
Trang 16Ví dụ
Viết chương trình nhập số nguyên dương n và tính tổng
Phân tích bài toán:
Input: n (Để xác định tham số)
KDL: số nguyên dương (int).
Output: Tổng S (Để xác định KDL phương thức)
Trả về giá trị của S
S là tổng các số nguyên dương nên S cũng là số
nguyên dương KDL trả về của hàm là int (hoặc
2
Trang 19Phạm vi khối
•Một khối được giới hạn bởi ngoặc {}
•Biến khai báo trong khối đó có phạm vi khối, nghĩa là nó chỉ hoạt động trong khối đó mà thôi
Phạm vi này còn gọi là cục bộ, và biến đưọc gọi
là biến cục bộ.
Trang 20Gia tri i ben trong khoi: 10
Gia tri i ben ngoai khoi: 20
Trang 21Phạm vi hàm
Hoạt động từ đầu đến cuối một hàm, chỉ có tác dụng trong hàm
void main() {
int k;
float m;
double x;
//Các lệnh khác //…
}
Trang 22int i;
//Các lệnh
.}
Trang 23Phạm vi chương trình
•Được khai báo bên ngoài
các hàm – còn được gọi
là biến toàn cục
•Không nên khai báo sử
dụng nhiều nếu không
thực sự cần thiết, vì nó sẽ
gây trở ngại cho quá trình
dò tìm lỗi khi debug
chương trình
int a, b;
void Nhap() {
cout<<"Nhap a: "; cin>>a;
cout<<"Nhap b: "; cin>>b;
} void main() {
int c;
Nhap();
c=a+b;
cout<<"Tong = "<<c; }
Trang 24Tham số là tham chiếu
• Tham số làm kết quả đầu ra
• Tham số vừa làm đầu vào và đầu ra
• Dùng dấu & phía trước tên tham số khi cài đặt hàm
24
Trang 25Ví dụ
Xét chương trình hoán vị 2 số nguyên a, b cho
trước
Viết chương trình với 2 trường hợp
•Trường hợp không dùng tham chiếu
•Trường hợp dùng tham chiếu
Trang 26void HoanVi(int a, int b)
Trang 27Kết quả
Trang 28void HoanVi(int &a, int &b)
Trang 29Kết quả
Trang 30Nguyên tắc xây dựng hàm
•Kết quả của hàm? KDL trả về của hàm
•Hàm làm gì? Xác định tên hàm
•Cần những thông tin gì? Tham số
Ứng với mỗi thông tin đã xác định, xác định xem đã có giá trị trước khi vào hàm chưa,
- Nếu chưa có Tham chiếu
- Nếu có mà sau khi thực hiện xong hàm vẫn không thay đổi Tham trị
- Nếu có mà sau khi thực hiện xong hàm thì giá trị cũng bị thay đổi theo Tham chiếu
30
Trang 31Bài tập
1.Viết chương trình tính diện tích và chu vi của hình chữ nhật với chiều dài và chiều rộng được nhập từ bàn phím.
2.Viết chương trình tính diện tích và chu vi hình tròn với bán kính được nhập từ bàn phím.
3.Nhập vào 3 số thực a, b, c và kiểm tra xem chúng có thành lập thành 3 cạnh của một tam giác hay không? Nếu có hãy tính diện tích, chiều dài mỗi đường cao của tam giác và in kết quả ra màn hình 4.Viết chương trình nhập 2 số nguyên dương a, b Tìm USCLN và BSCNN của hai số nguyên đó
Trang 32• Công thức tính diện tích
s = sqrt(p*(p-a)*(p-b)*(p-c) )
với p là nửa chu vi của tam giác
• Công thức tính các đường cao:
ha = 2s/a, hb=2s/b, hc=2s/c
32
Trang 337 Viết chương trình nhập số nguyên dương n gồm k chữ
số, đếm xem n có bao nhiêu chữ số là số nguyên tố
Trang 348 Viết chương trình tính tiền thuê máy dịch vụ Internet Với dữ liệu nhập vào là giờ bắt đầu thuê (GBD), giờ kết thúc thuê (GKT), số máy thuê (SoMay)
Điều kiện cho dữ liệu nhập: 6<=GBD<GKT<=21 Giờ
Giả sử rằng:
Tiền trả cho mỗi giờ trước 12 giờ: 6000đ và sau 12
giờ: 7500đ
Giờ vào ca sớm nhất là 6 giờ sáng và giờ ra ca trễ
nhất là 18 giờ (Giả sử giờ nhập vào nguyên).
34
Trang 35Giới thiệu hàm đệ qui
•Một hàm được gọi có tính đệ qui nếu trong thân của hàm đó có lệnh gọi lại chính nó một cách tường minh hay tiềm ẩn.
•Phân loại đệ qui
•Đệ qui tuyến tính.
•Đệ qui nhị phân.
•Đệ qui phi tuyến.
•Đệ qui hỗ tương.
Trang 36//Thực hiện một số công việc (nếu có)
TenHam (<danh sách tham số>);
//Thực hiện một số công việc (nếu có)
}
36
Trang 37Ví dụ: Tính
- Điều kiện dừng: S(0) = 0.
- Qui tắc (công thức) tính: S(n) = S(n-1) + n.
long TongS (int n)
Trang 38Đệ qui nhị phân
Trong thân của hàm có hai lời gọi hàm gọi lại chính nó một cách tường minh.
<Kiểu dữ liệu hàm> TenHam (<danh sách tham số>)
//Thực hiện một số công việc (nếu có)
.TenHam (<danh sách tham số>); //Giải quyết vấn đề nhỏ hơn
//Thực hiện một số công việc (nếu có)
TenHam (<danh sách tham số>); //Giải quyết vấn đề còn lại
//Thực hiện một số công việc (nếu có)
Trang 39Ví dụ: Tính số hạng thứ n của dãy Fibonaci được định nghĩa như sau:
Trang 40Đệ qui phi tuyến
Trong thân của hàm có lời gọi hàm gọi lại chính nó được đặt bên trong vòng lặp.
<Kiểu dữ liệu hàm> TenHam (<danh sách tham số>)
{
for (int i = 1; i<=n; i++)
{ //Thực hiện một số công việc (nếu có)
if (điều kiện dừng) {
//Trả về giá trị hay kết thúc công việc }
else { //Thực hiện một số công việc (nếu có)
TenHam (<danh sách tham số>);
}
}
Trang 41Ví dụ: Tính số hạng thứ n của dãy {Xn} được định nghĩa như sau:
Trang 42h() f()
Trang 43<Kiểu dữ liệu hàm> TenHam2 (<danh sách tham số>);
<Kiểu dữ liệu hàm> TenHam1 (<danh sách tham số>)
{
//Thực hiện một số công việc (nếu có)
…TenHam2 (<danh sách tham số>);
//Thực hiện một số công việc (nếu có)
}
<Kiểu dữ liệu hàm> TenHam2 (<danh sách tham số>)
{
//Thực hiện một số công việc (nếu có)
…TenHam1 (<danh sách tham số>);
//Thực hiện một số công việc (nếu có)
}
Trang 44Ví dụ: Tính số hạng thứ n của hai dãy {X n }, {Y n } được định nghĩa như sau:
Trang 45Cách hoạt động hàm đệ qui
6 24
120
GiaiThua(2)
1 n GiaiThua(1)
Trang 46Q&A