Tải bản đầy đủ (.pdf) (36 trang)

Bài giảng Ngôn ngữ lập trình C: Hàm – Chương trình con - TS. Ngô Hữu Dũng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (972.13 KB, 36 trang )

TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH

Ngơn ngữ lập trình C
Hàm – Chương trình con


Nội dung
Main()
Function1()
Input

Function2()

Function3()
FUNCTION

Function4()

2

Output

Ngơn ngữ lập trình C - Hàm


Đặt vấn đề
Viết chương trình tính S = a! + b! + c! với a, b, c là 3 số
nguyên dương nhập từ bàn phím.




Chương trình
chính

Nhập
a, b, c > 0

Nhập
a>0
3

Nhập
b>0

Tính
S = a! + b! + c!

Nhập
c>0

Tính
s1=a!

Tính
s2=b!

Tính
s3=c!

Ngơn ngữ lập trình C - Hàm


Xuất
kết quả S


Đặt vấn đề
3 đoạn lệnh nhập a, b, c > 0



1. do {
2.
printf(“Nhap mot so nguyen duong: ”);
3.
scanf(“%d”, &a);
4. } while (a <= 0);
5. do {
6.
printf(“Nhap mot so nguyen duong: ”);
7.
scanf(“%d”, &b);
8. } while (b <= 0);
9. do {
10.
printf(“Nhap mot so nguyen duong: ”);
11.
scanf(“%d”, &c);
12.} while (c <= 0);
4

Ngôn ngữ lập trình C - Hàm



Đặt vấn đề
3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c!



1. // Tính s1 = a! = 1 * 2 * … * a
2. s1 = 1;
3. for (i = 2; i <= a ; i++)
4.
s1 = s1 * i;
5. // Tính s2 = b! = 1 * 2 * … * b
6. s2 = 1;
7. for (i = 2; i <= b ; i++)
8.
s2 = s2 * i;
9. // Tính s3 = c! = 1 * 2 * … * c
10.s3 = 1;
11.for (i = 2; i <= c ; i++)
12.
s3 = s3 * i;
5

Ngôn ngữ lập trình C - Hàm


Đặt vấn đề
Giải pháp => Viết 1 lần và sử dụng nhiều lần






Đoạn lệnh nhập tổng quát, với n = a, b, c

1. do {
2.
printf(“Nhap mot so nguyen duong: ”);
3.
scanf(“%d”, &n);
4. } while (n <= 0);


Đoạn lệnh tính giai thừa tổng quát, n = a, b, c

1. { Tính s = n! = 1 * 2 * … * n }
2. s = 1;
3. for (i = 2; i <= n ; i++)
4.
s = s * i;
6

Ngơn ngữ lập trình C - Hàm


Hàm
Khái niệm









Một đoạn chương trình có tên, đầu vào và đầu ra.
Có chức năng giải quyết một số vấn đề chun biệt cho chương
trình chính.
Được gọi nhiều lần với các tham số khác nhau.
Được sử dụng khi có nhu cầu:



7

Tái sử dụng.
Sửa lỗi và cải tiến.

Ngơn ngữ lập trình C - Hàm


Hàm
Cú pháp



<kiểu trả về> <tên hàm>([danh sách tham số])
{
<các câu lệnh>

[return <giá trị>;]
}


Trong đó





8

<kiểu trả về> : kiểu bất kỳ của C (char, int, long, float,…). Nếu khơng
trả về thì là void.
<tên hàm>: theo quy tắc đặt tên định danh.
<danh sách tham số> : tham số hình thức đầu vào giống khai báo biến,
cách nhau bằng dấu ,
<giá trị> : trả về cho hàm qua lệnh return.
Ngơn ngữ lập trình C - Hàm


Kiểu trả về của hàm


Hàm có thể trả về một
giá trị








int
float
char


1.
2.
3.
4.
5.

void: Không trả về giá trị 6.
7.
8.



Khi kết thúc, hàm sẽ
mang một giá trị trừ
trường hợp hàm mang
kiểu void.

9.
10.
11.
12.


9

int cong(int x, int y)
{
return x + y;
}
float nhan(int x, int y)
{
return x * y;
}
void in(char line[])
{
printf("%s",line);
}
Ngơn ngữ lập trình C - Hàm


Tên hàm và tham số


Tên hàm do người lập
trình đặt




Tương tự đặt tên biến

int cong(int x, int y)
{

return x + y;
}

1.
2.
3.
4.

Tham số (đối số)




Một, nhiều hoặc khơng
có tham số
Mỗi tham số đều có kiểu
dữ liệu
Các tham số có thể được
dùng như một biến cục
bộ trong hàm.

float nhan(int x, int y)
{
return x * y;
}

5.
6.
7.
8.

9.
10.
11.
12.

10

void in(char line[])
{
printf("%s",line);
}

Ngơn ngữ lập trình C - Hàm


Giá trị trả về


Hàm return



Trả về giá trị cho hàm
Kết thúc hàm

1.
2.
3.
4.




Cú pháp: return <biểu thức>;
5.





int cong(int x, int y)
{
return x + y;
}

Kiểu dữ liệu của <biểu thức>
phải trùng với kiểu trả về của
hàm.

6.

Hàm void khơng có giá trị trả
về

9.



11

Khơng dùng lệnh return (Ví dụ

3)

7.
8.

10.
11.
12.

float nhan(int x, int y)
{
return x * y;
}
void in(char line[])
{
printf("%s",line);
}

Ngơn ngữ lập trình C - Hàm


Khai báo prototype
1.
1.
2.
3.

int cong(int, int);
float nhan(int, int);
void in(char);


2.
3.
4.
5.



Prototype: Khai báo các hàm 6.
7.
dùng trong chương trình







Kiểu trả về
Tên hàm
Danh sách tham số (nếu có)
Dấu chấm phẩy ;

Đầu chương trình hoặc trong
file header (*.h)
12

8.
9.
10.

11.
12.

int cong(int x, int y)
{
return x + y;
}
float nhan(int x, int y)
{
return x * y;
}
void in(char line[])
{
printf("%s",line);
}

Ngôn ngữ lập trình C - Hàm


Gọi hàm


Lệnh gọi hàm



1.

2.
Tên hàm

Danh sách tham số (nếu có) 3.



Theo thứ tự
Cùng kiểu dữ liệu

4.
5.
6.



Hàm có thể trả về một giá
trị có kiểu của kiểu trả về
của hàm.

7.
8.
9.
10.
11.
12.
13.

13

#include <stdio.h>
int cong(int, int);
void main()

{
int a = 5, b, c;
b = cong(a, 3);
c = b + cong(a,b);
printf("Tong: %d", c);
}
int cong(int x, int y)
{
return x + y;
}

Ngơn ngữ lập trình C - Hàm


Các bước viết hàm


Cần xác định các thông tin sau đây:





Tên hàm.
Hàm sẽ thực hiện cơng việc gì.
Các đầu vào (nếu có).
Đầu ra (nếu có).
Đầu vào 1

Tên hàm

Đầu vào 2
Đầu vào n

14

Đầu ra (nếu có)
Các cơng việc
sẽ thực hiện

Ngơn ngữ lập trình C - Hàm


Hàm


Ví dụ 1





Tên hàm: XuatTong
Cơng việc: tính và xuất tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: khơng có

1. void XuatTong(int x, int y)
2. {
3.
int s;

4.
s = x + y;
5.
printf(“%d cong %d bang %d”, x, y, s);
6. }

15

Ngơn ngữ lập trình C - Hàm


Hàm


Ví dụ 2





Tên hàm: TinhTong
Cơng việc: tính và trả về tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: một số nguyên có giá trị x + y

int TinhTong(int x, int y)
{
int s;
s = x + y;
return s;

}

16

Ngơn ngữ lập trình C - Hàm


Chương trình con - Function


Ví dụ 3





Tên hàm: NhapXuatTong
Cơng việc: nhập và xuất tổng 2 số ngun
Đầu vào: khơng có
Đầu ra: khơng có

void NhapXuatTong()
{
int x, y;
printf(“Nhap 2 so nguyen: ”);
scanf(“%d%d”, &x, &y);
printf(“%d cong %d bang %d”, x, y, x + y);
}
17


Ngơn ngữ lập trình C - Hàm


Một số lưu ý


Thông thường người ta thường đặt phần tiêu đề
hàm/nguyên mẫu hàm (prototype) trên hàm main và phần
định nghĩa hàm dưới hàm main.
1. void XuatTong(int x, int y);

// prototype

2. void main()
3. {
4.

5. }
6. void XuatTong(int x, int y)
7. {
8.
printf(“%d cong %d bang %d”, x, y, x + y);
9. }
18

Ngơn ngữ lập trình C - Hàm


Các cách truyền đối số



Truyền Giá trị (Call by Value)




Truyền đối số cho hàm ở dạng giá trị.
Có thể truyền hằng, biến, biểu thức nhưng hàm chỉ sẽ nhận giá
trị.
Được sử dụng khi khơng có nhu cầu thay đổi giá trị của tham
số sau khi thực hiện hàm.

void TruyenGiaTri(int x)
{

x++;
}

19

Ngôn ngữ lập trình C - Hàm


Các cách truyền đối số


Truyền Địa chỉ (Call by Address)





Truyền đối số cho hàm ở dạng địa chỉ (con trỏ).
Không được truyền giá trị cho tham số này.
Được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau
khi thực hiện hàm.

void TruyenDiaChi(int *x)
{

*x++;
}

20

Ngơn ngữ lập trình C - Hàm


Các cách truyền đối số


Truyền Tham chiếu (Call by Reference) (C++)




Truyền đối số cho hàm ở dạng địa chỉ (con trỏ). Được bắt đầu
bằng & trong khai báo.
Không được truyền giá trị cho tham số này.
Được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau
khi thực hiện hàm.


void TruyenThamChieu(int &x)
{

x++;
}

21

Ngơn ngữ lập trình C - Hàm


Lưu ý khi truyền đối số


Lưu ý


Trong một hàm, các tham số có thể truyền theo nhiều cách.

void HonHop(int x, int &y)
{

x++;
y++;
}

22

Ngơn ngữ lập trình C - Hàm



Lưu ý khi truyền đối số


Lưu ý


Sử dụng tham chiếu là một cách để trả về giá trị cho chương
trình.

int TinhTong(int x, int y)
{
return x + y;
}
void TinhTong(int x, int y, int &tong)
{
tong = x + y;
}
void TinhTongHieu(int x, int y, int &tong, int &hieu)
{
tong = x + y; hieu = x – y;
}
23

Ngơn ngữ lập trình C - Hàm


Lời gọi hàm



Cách thực hiện





Gọi tên của hàm đồng thời truyền các đối số (hằng, biến, biểu
thức) cho các tham số theo đúng thứ tự đã được khai báo trong
hàm.
Các biến hoặc trị này cách nhau bằng dấu ,
Các đối số này được được đặt trong cặp dấu ngoặc đơn ( )
<tên hàm> (<đối số 1>,… , <đối số n>);

24

Ngôn ngữ lập trình C - Hàm


Lời gọi hàm


Ví dụ
{ Các hàm được khai báo ở đây }
void main()
{
int n = 9;
XuatTong(1, 2);
XuatTong(1, n);
TinhTong(1, 2);

int tong = TinhTong(1, 2);
TruyenGiaTri(1);
TruyenGiaTri(n);
TruyenDiaChi(1);
TruyenDiaChi(&n);
TruyenThamChieu(1);
TruyenThamChieu(n);
}
25

Ngơn ngữ lập trình C - Hàm


×