Tải bản đầy đủ (.pptx) (62 trang)

Slide kỹ thuật lập trình CC++

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 (288.56 KB, 62 trang )

KỸ THUẬT LẬP TRÌNH C/C++
Hàm và cấu trúc chương trình
Vũ Hải
Email:

1


Các nội dung chính







Cấu trúc một chương trình
Hàm
Cách tổ chức chương trình
Một số loại biến đặc biệt trong chương trình
Con trỏ hàm
Hàm callback

2


Cấu trúc một chương trình


Mơ hình hướng chức năng


main

F1

F1.1

F1.2

F2

F1.3

F2.1

F2.2

F3

F2.3

F3.1

F3.2

3


Cấu trúc một chương trình



VD: các chức năng của chương trình giải PT bậc 2
main

Nhập các
hệ số

Tính
delta

Tính các
nghiệm

4


Hàm





Khái niệm
Phân loại
Cấu trúc một hàm
Các thao tác cơ bản trên hàm

5


Khái niệm





Hàm là một khối các câu lệnh thực hiện một nhiệm vụ nhất
định, và có thể được gọi khi cần
Mỗi hàm có một tên (các hàm trong C khơng được trùng tên
nhau), một số tham số, và một giá trị trả về
Sử dụng hàm giúp:





Cách khai báo:




Chia nhỏ chương trình thành nhiều bài tốn con
Sử dụng lại trong một hoặc nhiều chương trình
<kiểu trả về> <tên hàm>(<danh sách các tham số>) {
Khai báo các biến dùng cho hàm
Các câu lệnh của hàm
}

Toán tử return dùng để thoát khỏi hàm và trả kết quả
6

6



Ví dụ


Hàm tính tổng hai số




double sum(double x, double y) {
double z = x+y;
return z;
}
int main() {
double x = 10, y = sum(2,3);
printf("x + y = %g", sum(x,y));
return 0;
}

Các tham số và biến nội bộ chỉ giới hạn trong phạm vi của
hàm
7

7


Hàm



Cấu trúc của một hàm: gồm 2 phần




Phần đầu (header): lại gồm tên hàm, kiểu giá trị trả về
(void hoặc một kiểu DL), và danh sách các tham số (có
thể rỗng)
Phần thân (body): là khối lệnh chứa các lệnh cài đặt cho
chức năng của hàm.
float Delta(float a, float b, float c)

HEADER

{
float d;
d = b*b – 4*a*c;
return d;

BODY

}
8


Hàm


Các thao tác cơ bản với hàm:





Định nghĩa hàm (definition)
Khai báo hàm (declaration)
Gọi hàm (call)

9


Định nghĩa hàm






Là phần cài đặt chi tiết cho một hàm
Mỗi hàm cần có một và chỉ một định nghĩa
Định nghĩa này có thể được đặt trước hoặc sau hàm main
Không cho phép đặt định nghĩa hàm này lồng trong định
nghĩa của hàm khác, kể cả hàm main.
Khi định nghĩa một hàm cần phải xác định đầy đủ, chi tiết tất
cả các thành phần của hàm đó, gồm phần đầu và phần thân
của nó.

10


Định nghĩa hàm



Cú pháp:

T tên_hàm (T1 v1, T2 v2, …)
{
Lệnh 1;
Lệnh 2;

}

Header

Body

11


Định nghĩa hàm


Phần đầu hàm: cần xác định




Tên hàm
Kiểu dữ liệu trả về cho hàm (kiểu hàm)
Tên, kiểu dữ liệu cho các tham số, và kiểu tham số (đầu vào, đầu ra,
hoặc cả hai)


tham số vào

Tên/Chức
năng của hàm

tham số ra / kiểu hàm

12


Định nghĩa hàm


Phần thân hàm:





Là khối lệnh chứa các lệnh xử lý cho phần đầu hàm
Có thể khai báo thêm các kiểu dữ liệu (biến/hằng) có phạm vi sử
dụng cục bộ trong khối lệnh thân hàm
Các tham số trong phần đầu hàm được sử dụng như các dữ liệu
cục bộ, nhưng cần chú ý thêm đến vai trò vào/ra của chúng
Phần này có thể chứa các lệnh return (có hoặc khơng có tham số)
để thực hiện kết thúc khối lệnh (và có trả về giá trị cho hàm này nếu
có tham số)

13



Phạm vi của biến, hằng



Biến toàn cục: được khai báo ở ngồi các hàm, có phạm vi trong tồn
chương trình và tồn tại trong suốt quá trình chạy
Biến địa phương: được khai báo ở trong một hàm hoặc một khối lệnh,
chỉ có phạm vi trong hàm/khối đó, và bị huỷ sau khi kết thúc chạy
hàm/khối đó





Khai báo biến địa phương sẽ “che” mất biến cùng tên khác có phạm vi rộng hơn
Trong C, biến địa phương phải được khai báo ở đầu hàm hoặc khối lệnh

Ví dụ biến địa phương của hàm:


14

int x = 10, y = 20;
int sum() {
int z = x+y;
return z;
}
int main() {

int x = 1, y = 2;
int z = sum();
return 0;
}

/* phải khai báo trước hàm sum() */

/* trả về: 10+20 */

14


Biến trong khối lệnh



Trong một khối lệnh { … } ta có thể khai thêm biến, biến đó chỉ tồn tại từ
khi chương trình chạy vào tới khi thốt khỏi khối lệnh đó
Ví dụ:


15

int x = 1, y = 2;
int sum(int x, int y) {
return x+y;
}
int a = 1000, b = 2000;
int main() {
int x = 10, y = 20;

{
int x = 100, y = 200;
x+y;
}
x+y;
sum(a,b);
return 0;
}
15


Biến trong khối lệnh: vịng lặp



Chỉ có phạm vi trong một lần chạy của vòng lặp, mỗi lần lặp
sẽ tạo ra biến mới và khởi tạo lại
Ví dụ:


16

int x = 20;
for (i=0; i<10; i++) {
int y = 20;
x++; y++;
printf("%d %d\n", x, y);
}

16



Biến static



Là biến chỉ có phạm vi địa phương nhưng vẫn tồn tại ngay cả khi chưa
vào hoặc đã thoát khỏi hàm/khối
Khai báo bằng cách thêm từ khố static




Cũng có biến static toàn cục: thuộc nội bộ của một file nguồn




int callCount() {
static int count = 0;
count++;
return count;
}
static int tic_time = 0;
void tic() {
tic_time = clock();
}
int toc() {
return clock() - tic_time;
}


Hàm static: tự tìm hiểu thêm
17

17


Câu lệnh return


Kết thúc hàm và trả về một giá trị cho nơi gọi nó




int find(int number, int a[], int n) {
int i;
for (i=0; iif (number == a[i])
return i;
return -1;
}

Hàm void: khơng trả về giá trị gì


void copy(int *a, int *b, int n) {
if (a==NULL || b==NULL || a==b || n==0)
return;
for (; n>0; n--)

*a++ = *b++;
}



Câu lệnh return không có tham số
Khơng cần lệnh return ở cuối hàm



18

18


Tham số kiểu giá trị và kiểu tham chiếu




Tham số của hàm là biến tạm thời, tạo ra khi gọi và huỷ khi hàm kết
thúc  thay đổi giá trị của tham số không ảnh hưởng tới biến nơi gọi
 void assign10(int x) { x = 10; }
x (int)
int main() {
int a = 20;
copy
assign10(a);
printf("a = %d", a);
a

return 0;
}
Muốn thay đổi giá trị của biến ở nơi gọi: Dùng con trỏ




void assign10(int *x)
{ *x = 10; }
int a = 20;
assign10(&a);

x (int*)
copy
&a

a

Tham số con trỏ thường được dùng như một cách khác để trả về thêm
giá trị, vì mỗi hàm chỉ có một giá trị trả về theo đúng nghĩa
19

19


Hàm trả về con trỏ


Vấn đề với hàm trả về biến địa phương



int* sum(int x, int y) {
int z = x+y;
return &z;
}

int* sum() {

int* p = sum(2, 3);/* sai */


Cấp phát bộ nhớ trong hàm


copy
địa chỉ
p

int* sum(int x, int y) {
int* z = (int*)malloc(sizeof(int));
*z = x+y;
z
return z;
}

int* sum() {

copy

int* p = sum(2, 3);

/* ... */
free(p);
20

}

z

}
*z

p
20


Một số ví dụ định nghĩa hàm


Định nghĩa hàm tính USCLN(a,b)

//Cách 1: hàm có giá trị trả về
int uscln(int a, int b)
{
while(a!=b)
if(a>b) a -= b;
else b -= a;
return a;
}

21



Một số ví dụ


Định nghĩa hàm tính USCLN(a,b)

//Cách 2: hàm khơng có giá trị trả về
void uscln(int a, int b, int* u)
{
while(a!=b)
if(a>b) a -= b;
else b -= a;
*u = a;
}

22


Một số ví dụ


Định nghĩa hàm tính tổng của một dãy a có n số

//Cách 1: hàm có giá trị trả về
float sum(float a[], int N)
{
int i;
float sf=0;
for (i=0;i

return sf;
}

23


Một số ví dụ


Định nghĩa hàm tính tổng của một dãy a có n số

//Cách 2: hàm khơng có giá trị trả về
void sum(float a[], int N, float* s)
{
int i;
float sf=0;
for (i=0;i*s = sf;
}

24


Nguyên mẫu (prototype) của hàm



Là việc khai báo hàm trước, nội dung của nó được triển
khai sau  thường khai báo ở đầu file hoặc trong file .h
Ví dụ:



25

double tong(double x, double
double tich(double x, double
int main() {
double x = 5., y = 10.;
tong(x, y);
tich(x, y);
return 0;
}
double tong(double x, double
double tich(double x, double

y);
y);

y) { return x+y; }
y) { return x*y; }
25


×