Lập trình cơ bản - Thủ tục và hàm
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 đó.
6. Viết chương trình nhập số nguyên dương n gồm
k chữ số (0 < k ≤ 5) , tìm ước số lẻ lớn nhất của n
7. 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 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
39 trang |
Chia sẻ: nguyenlam99 | Lượt xem: 1089 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Lập trình cơ bản - Thủ tục và hàm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
THỦ TỤC VÀ HÀM
NGÔ QUỐC VIỆT
TP.HCM-2011
NỘI DUNG
1. Khái niệm thủ tục và hàm.
2. Cách khai báo và sử dụng hàm
3. Khái niệm prototype
4. Cách truyền tham số, tham biến.
5. Biến cục bộ, toàn cục
Ngô Quốc Việt-Lập trình cơ bản 2
SỰ CẦN THIẾT CỦA TÁCH NHỎ
Thực tế: luôn tách vấn đề lớn thành các vấn để
nhỏ hơn. Vấn đề “nhỏ hơn” lại có thể tách
thành các “nhỏ hơn nữa”.
Mỗi “nhỏ không chia nữa” đảm nhiệm một nhiệm
vụ/chức năng thuật ngữ task/function
Các task/function ghép lại để có được bộ phận lớn
hơn. Nnlt gọi là hàm-function.
Khái niệm hàm trong nnlt đóng vai trò tương tự.
Mỗi “hàm” đảm nhiệm một vai trò.
Kết nối các hàm để thành một chương trình.
Ngô Quốc Việt-Lập trình cơ bản 3
SỰ CẦN THIẾT CỦA TÁCH NHỎ
Nhắc lại hàm main trong ngôn ngữ C.
Chứa điểm bắt đầu và lệnh kết thúc của chương trình (lệnh
return cuối hàmmain).
Mọi ngôn ngữ đều có quy ước tương tự như hàm main()
nhưng tên có thể khác.
Tất cả lệnh đặt trong “main” ?
Ưu điểm: ???
Nhựợc điểm: quá dài; không dễ đọc; khó bảo trì ?
Không thể hiệu quả nếu tất cả đặt trong main.
Cần tách “main” thành những phần nhỏ hàm.
Đơn giản nhất: mỗi hàm thực hiện một phần
code củamain().
Ngô Quốc Việt-Lập trình cơ bản 4
THỦ TỤC VÀ HÀM
Thủ tục – procedure. Hàm – function.
Phần lớn nnlt sử dụng thuật ngữ ‘hàm’.
Hàm là một “đoạn mã” được “đóng gói” thực
hiện một khối công việc nhất định của chương
trình.
“Đóng gói” : mỗi hàm có tên và viết theo quy cách
nhất định tuỳ theo nnlt.
Ví dụ: hàm main() trong C/C++ là một hàm. Là
hàm chính trong kiểu chương trình Console.
Ngô Quốc Việt-Lập trình cơ bản 5
CÁCH KHAI BÁO MỘT HÀM
(arg1, arg2, ...)
Tên hàm: đặt theo quy cách đặt tên của nnlt. Theo
cách đặt tên biến/hằng.
Kiểu trả về: các kiểu dữ liệu cơ bản của nnlt hoặc các
kiểu dữ liệu có cấu trúc (thảo luận sau). Mỗi hàm chỉ
trả về một giá trị mỗi lần thực hiện. Một hàm chỉ có
một OUTPUT.
(arg1, arg2, ...): danh sách các tham số dùng làm
INPUT cho hàm. Không có ba dấu chấm.
Không có dấu chấm phẩy sau tên hàm, phải có cặp
dấu ngoặc ( ) sau tên hàm nếu hàm không có
tham số truyền vào.
Ngô Quốc Việt-Lập trình cơ bản 6
CÁCH KHAI BÁO MỘT HÀM
Chú thích đầu hàm
Name: tên hàm
Description: hàm làm gì – what
Tham số: xác định từng tham số của hàm
Giá trị trả về: mô tả output của hàm
Tên hàm cùng các tham số
Thân hàm: phần nằm giữa cặp dấu { }. Lệnh cuối
cùng của hàm là return.
Ngô Quốc Việt-Lập trình cơ bản 7
CÁCH KHAI BÁO MỘT HÀM
Ngô Quốc Việt-Lập trình cơ bản 8
Hàm không có tham số
()
Ví dụ khai báo hàm không tham số
int get_value() ;
hoặc
int get_value(void); //chỉ dùng trong nnlt C
Hàm không có OUTPUT được gọi là thủ tục. Ví dụ
void print_answer(int answer) ;
Usage
print_answer(45); //gọi hàm print_answer
Ngô Quốc Việt-Lập trình cơ bản 9
KHAI BÁO VÀ SỬ DỤNG HÀM
Hàm có thể không cần trả về kết quả. Mục tiêu cần
thực hiện một tác vụ nhưng hàm gọi không cần
lấy kết quả.
Sử dụng kiểu trả về void.
void myGioPhut(int phut)
{
int gio;
gio = phut/60;
phut = phut % 60;
printf(“Bay gio la %d:%d”, gio, phut);
}
Cuối hàm kiểu trả về void có thể có hay không
lệnh return.
Ngô Quốc Việt-Lập trình cơ bản 10
Không có lệnh
return trước
dấu } ???
KHAI BÁO VÀ SỬ DỤNG HÀM
int myFunction(int arg1) //Hàm myFunction đặt trên main. Có cách
//nào để đặt ở bất kỳ chỗ nào?
{
arg1++ ;
return arg1;
}
int main(int argc, char* argv[ ])
{
int x, y ;
y = 0;
x = myFunction(y); //Giá trị y trả về là y++ (=1).
return 0;
}
Ngô Quốc Việt-Lập trình cơ bản 11
Hàm main gọi hàm
myFunction. Lúc này,
hàm main được gọi là
hàm gọi.
Hàm myFunction chạy
xong, chạy tiếp lệnh kế trong
main. Lúc này, myFunction
là hàm bị gọi
KHAI BÁO VÀ SỬ DỤNG HÀM
#include
#include
int power(int ix, int in)
{
int i, ip = 1;
for(i = 1; i <= in; i++)
ip *= ix;
return ip;
}
int main(int argc, char *argv[])
{
printf("2 mu 2 = %d.\n", power(2, 2));
printf("2 mu 3 = %d.\n", power(2, 3));
getch();
}
Ngô Quốc Việt-Lập trình cơ bản 12
KHAI BÁO VÀ SỬ DỤNG HÀM
Ngô Quốc Việt-Lập trình cơ bản 13
void main(void)
{
printf("2 mu 2 = %d.\n", power(2, 2));
printf("2 mu 3 = %d.\n", power(2, 3));
getch();
}
int power(int ix, int in)
{
int i, ip = 1;
for(i = 1; i <= in; i++)
ip *= ix;
return ip;
}
Gọi hàm power
Kết thúc lần chạy.
Lệnh return quay
về hàm main.
Truyền tham số
Lệnh return để kết thúc một hàm và quay về hàm gọi
PROTOTYPE HÀM
Prototype: phần khai báo hàm không chứa phần mã
nguồn bên trong
Thường được đặt trên đầu tập tinmã nguồn.
Đối với nnlt C, các khai báo hàm được viết trong
tập tin .H có cùng tên.
Ngô Quốc Việt-Lập trình cơ bản 14
int myFunction(int arg1);
int main(int argc, char* argv[ ])
{
int y = myFunction(x);
return 0;
}
int myFunction(int arg1)
{
}
Có dấu ;
Hàm main gọi hàm
myFunction nên
được đặt sau
Hàm myFunction đặt
sau hàm main.
PROTOTYPE CỦA HÀM
Các nnlt hướng đối tượng không sử dụng khái
niệm “prototype”.
Mọi hàm đều bao gồm thân hàm.
Thảo luận trong học phần “Lập trình hướng đối
tượng”.
Ngô Quốc Việt-Lập trình cơ bản 15
TẬP TIN .H TRONG NNLT C/C++
Chứa khai báo các prototype (không có mã nguồn
bên trong).
Được #include từ các tập tin CPP.
Ngô Quốc Việt-Lập trình cơ bản 16
ptbac2.h
double tinhDelta(int a, b, c);
ptbac2. cpp
#include “ptbac2.h”
double tinhDelta(int a, int b, int c)
{
return b*b-4*a*c;
}
main.cpp
#include “ptbac2.h”
int main()
{
int a, b, c;
scanf(“% %d $d”, &a, &b, &c);
double delta = tinhDelta(a, b, c);
}
Không viết hàm
tinhDelta ở đây
SỬ DỤNG THƢ VIỆN BUILT-IN
Sử dụng #include trong C/C++ cho các tập mã
nguồn .CPP để sử dụng các hàm có sẵn.
Ví dụ
#include “conio.h” //dùng các hàm nhập xuất
#include “stdio.h” //một số hàm chuẩn
#include “math“ //các hàm toán học: sqrt, pow...
Sinh viên đọc thêm các tài liệu về các hàm
setw, printf, scanf, sqrt, pow, và một số hàm
toán học khác.
Sử dụng import trong ngôn ngữ JAVA. Sử dụng
using trong C#. Sinh viên đọc thêm tài liệu.
Ngô Quốc Việt-Lập trình cơ bản 17
THAM SỐ
Tham số - Parameters.
Dùng để truyền và nhận giữa hàm gọi và hàm bị
gọi.
Tham số! Nhưng không phải chỉ truyền/nhận số.
Truyền: OK. Vì hàm bị gọi cần có INPUT để xử lý.
Nhận: ???. Mỗi hàm chỉ trả về một OUTPUT. Nếu
cần nhiều hơn? Thảo luận sau.
Số lượng tham số của hàm: không nên nhiều quá.
Ngô Quốc Việt-Lập trình cơ bản 18
THAM TRỊ
Các giá trị đầu vào cho một hàm. Giá trị có thể là
Một hằng tường minh.
Một biến đã được gán giá trị.
Giá trị của biến (nếu được sử dụng) sẽ không
bị thay đổi bởi bất cứ lệnh nào trong hàm bị
gọi.
Cách khai báo
(style1 arg1, style2 arg2)
Ngô Quốc Việt-Lập trình cơ bản 19
THAM TRỊ
Ngô Quốc Việt-Lập trình cơ bản 20
int myFunction(int x)
{
x +=10 ;
return x;
}
int main(int argc, char* argv[ ])
{
int x = 0, y ;
int y = myFunction(x); //Giá trị y trả về là 10.
printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero
y = myFunction(5); //Giá trị y trả về là 15.
printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero
return 0;
}
NHÌN SÂU HƠN VỀ THAM TRỊ
Ngô Quốc Việt-Lập trình cơ bản 21
int myFunction(int x)
{
x +=10 ;
return x;
}
int main(int argc, char* argv[ ])
{
int x, y ;
x = 0;
int y = myFunction(x); //Giá trị y trả về là 10.
printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero
y = myFunction(5); //Giá trị y trả về là 15.
printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero
return 0;
}
Vùng nhớ dành cho
biến x và tham trị x
khác nhau. Hai “x”
này không liên quan.
Hai hàm khác nhau
có thể dùng cùng
hoặc khác tên biến
cục bộ.
THAM TRỊ HẰNG SỐ
(const style1 arg1, style2 arg2)
Các tham trị hằng số không thể thay đổi trong
hàm bị gọi.
int myFunction(const int x)
{
x +=10 ; //error compiler
int y = x; //OK
return (y + 5); //OK
}
Dùng trong trường hợp bảo đảm không thay đổi
giá trị tham trị trong toàn bộ hàm bị gọi.
Ngô Quốc Việt-Lập trình cơ bản 22
THAM BIẾN
Tham biến – Reference parameters
Nhu cầu cần nhận nhiều hơn một kết quả trả về
khi gọi hàm (vì mỗi hàm chỉ trả về một output).
Nhu cầu cần tác động thay đổi lên tham số truyền
cho hàm.
Tham biến: là cách hiệu quả để trả về nhiều hơn
một giá trị, hoặc cần thay đổi giá trị tham số của
hàm gọi.
Ngô Quốc Việt-Lập trình cơ bản 23
KHAI BÁO VÀ SỬ DỤNG THAM BIẾN
NNLT C/C++: đặt dấu & trước tên tham số cần
thay đổi hay nhận giá trị từ hàm bị gọi.
NNLT C#: đặt từ khóa ref trước tên tham số.
Ngô Quốc Việt-Lập trình cơ bản 24
void thamtri(int ix, int iy)
{
ix += 2;
iy +=2;
}
void thambien(int &ix, int &iy)
{
ix += 2;
iy +=2;
}
int main()
{
int ia = 5, ib = 6;
thamtri(ia, ib);
printf(“ia = %d, ib = %d”, ia, ib);
thambien(ia, ib);
printf(“ia = %d, ib = %d”, ia, ib);
}
Kiểu truyền
tham số không
thay đổi
Dấu & đặt
trước tên tham
số
Ia = 5, ib= 7
Ia = 7, ib= 9
BIẾN CỤC BỘ
Chỉ “sống” trong một hàm hoặc một khối lệnh. Không
có ý nghĩa ngoài hàm đó.
Mục tiêu sử dụng: dùng làm biến tạm thời trong khối
lệnh hay hàm để giải quyết công việc tạm thời.
int tinhCount()
{
int iCount1; //biến iCount1 cục bộ trong hàm tinhCount
{
int count; //cục bộ trong khối lệnh
count = 1;
}
count = 0; //error compiler, biến count không tồn tại ở đây
return 0;
}
Tham trị là các biến cục bộ trong hàm bị gọi.
Ngô Quốc Việt-Lập trình cơ bản 25
BIẾN TOÀN CỤC
Tồn tại khi chương trình còn hoạt động.
Khai báo ở một chỗ ngoài tất cả các hàm (đ/v C/C++).
Có thể sử dụng ở nhiều tập tin mã nguồn khác nhau.
Mục tiêu là chia sẻ thông tin dùng chung cho mọi
hàm. Ví dụ: giờ bắt đầu chạy chương trình.
Ưu điểm: dễ viết chương trình. Chia sẻ thông tin
chung của toàn bộ chương trình.
Nhượcđiểm: dễ nhầm lẫn, do có nhiều chỗ sử dụng.
Không nên tận dụng biến toàn cục vì rất dễ sai
sót.
Ngô Quốc Việt-Lập trình cơ bản 26
Biến toàn cục và biến cục bộ
Ngô Quốc Việt-Lập trình cơ bản 27
Biến toàn cục và biến cục bộ
int total; //total number of entries – global variable
int count; //count of total entries - global variable
int main() {
total = 0;
count = 0;
{
int count; //local variable
count = 1;
printf(“Count cho nay la: %d”, count);
}
count = 2; //what is count?
return 0;
}
Ngô Quốc Việt-Lập trình cơ bản 28
Biến count toàn
cục bị che-
hidden trong
đoạn này
Không nên viết
chƣơng trình kiểu
này. Tại sao?
Tóm tắt các kiễu tham số
Ngô Quốc Việt-Lập trình cơ bản 29
Các câu hỏi ngắn
1. Các tham số nào có thể thay đổi trong hàm sau
void onetwothree(int one, const int two, int &three, const int &four);
2. Sự khác nhau giữa hai hàm sau là gì
int funct1(void);
const int funct2();
Sinh viên đọc thêm kiểu static cho biến và tham số.
Sinh viên đọc thêm khái niệm namespace.
Sinh viên đọc thêm khai báo inline trong C/C++.
Ngô Quốc Việt-Lập trình cơ bản 30
Sử dụng #define trong C/C++
Từ khoá #define – còn gọi là macro. Dùng để định
nghĩa hằng, hàm đơn giản thường sử dụng trong
chương trình.
Định nghĩa hằng số (hạn chế sử dụng trong các
nnlt mới)
#define SIZE 20
#define PASSWORD “12345”
Định nghĩa hàm
#define SQR(x) (x*x)
Ngô Quốc Việt-Lập trình cơ bản 31
Lập trình có cấu trúc
Structured Programming
Xây dựng outline
Thay thế từng bước trong outline bằng các lệnh
chi tiết hơn.
Tiếp tục thay thế các lệnh bằng các lệnh chi tiết
hơn.
Lặp lại cho đến khi không chi tiết nữa.
Viết version đơn giản. Chưa quan tâm đến tất cả
mọi chức năng cùng một lúc.
Viết từng hàm còn thiếu theo ouline
Tiếp tục viết hàm cho đến khi đầy đủ.
Ngô Quốc Việt-Lập trình cơ bản 32
Lập trình bottom-up
Thiết kế tổng thể chương trình, danh sách các
hàm.
Viết trước mọi hàm nhỏ thực hiện các chức năng
cần thiết.
Tiếp tục viết các hàm nhỏ (trên một mức-tổng
quát hơn) thực hiện các chức năng cơ bản
Lắp ghép để thành các hàm tổng quát hơn.
Tiếp tục cho đến khi xong chương trình.
Ngô Quốc Việt-Lập trình cơ bản 33
Lập trình top-down
Thiết kế tổng thể chương trình.
Chia nhỏ dần từ hàm tổng quát đến chi tiết. Từ
phức tạp đến đơn giản
Viết các hàm chính trước.
Xem các yêu cầu của các hàm chính, tiếp tục viết
các hàm nhỏ hơn khi cần.
Tiếp túc cho đến khi hoàn thành
Ngô Quốc Việt-Lập trình cơ bản 34
Tóm tắt xây dựng hàm
Để xây dựng một hàm ta phải xác định mục đích của hàm
là dùng để làm gì, trên cơ sở đó, ta mới xác định được các
thành phần của hàm.
Mỗi hàm phải thực hiện một chức năng độc lập và tách
biệt với các hàm khác.
Đối với hàm có giá trị trả về phải lưu ý kiểu dữ liệu phải
tương ứng kiểu dữ liệu cả giá trị trả về và kiểu dữ liệu của
biến được gán khi gọi hàm
Trường hợp hàm trả về từ hai loại giá trị trở lên thì
phải có dòng chú thích cho trường hợp tương ứng để
khi gọi hàm biết được kết quả
Đặt tên hàm sao cho gợi nhớ được chức năng
Gọi hàm phải truyền đủ tham số, đúng kiểu dữ liệu và
đúng thứ tự của tham số
Ngô Quốc Việt-Lập trình cơ bản 35
Bài tập
1. Viết lại chương trình giải pt bậc 2 với hàm tính delta
được tách riêng.
2. Viết chương trình cho phép nhập vào một số bất kỳ.
Viết hàm kiểm tra một số là số nguyên tố . Chương
trình ngừng khi số nhập vào là zero.
3. Viết chương trình thực hiện yêu cầu:
Nhập một số từ bàn phím, lưu biến iN. Nhập số vào biến x.
Nhập ký tự từ bàn phím, kiểm tra nếu phím ESC (giá trị
ASCII = 26) thì ngừng lại.
Nếu ‘A’ hoặc ‘a’: gọi hàm tính
Nếu ‘F’ hoặc ‘f ’: gọi hàm tính giai thừa của iN.
Nếu ‘P’ hoặc ‘p’: gọi hàm tính số nguyên tố lớn nhất mà nhỏ hơn
iN. In số nguyên tố này ra.
Ngô Quốc Việt-Lập trình cơ bản 36
xxxx ...
Bài tập
4. Viết chương trình theo yêu cầu sau
Khai báo biến float fMyfloat, double dMydouble
Nhập từ bàn phím (ngừng khi nhấn ESC) giá trị cho
hai biến này.
Gọi hàm để in ra dạng IEEE754 cho số thập phân
dMydouble đã nhập
Gọi hàm để in số thập phân fMyfloat đã nhập
Ngô Quốc Việt-Lập trình cơ bản 37
Bài tập
5. 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 đó.
6. Viết chương trình nhập số nguyên dương n gồm
k chữ số (0 < k ≤ 5) , tìm ước số lẻ lớn nhất của n
7. 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 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.
Công thức tính diện tích s = sqrt(p*(p-a)*(p-b)*(p-c) ).
Công thức tính các đường cao: ha = 2s/a, hb=2s/b,
hc=2s/c.
Ngô Quốc Việt-Lập trình cơ bản 38
CÁM ƠN ĐÃ THEO DÕI
NGÔ QUỐC VIỆT
TP.HCM - 2011
Các file đính kèm theo tài liệu này:
- ltcb_baigiang05_8918.pdf