Ôn tập kỹ thuật lập trình

GV: Nguyễn Hữu Thể Khoa CNTT – Đại Học Cửu Long

1

NỘI DUNG

1

Hàm và thủ tục

2

Con trỏ

5

2

CTDL1- Nguyễn Hữu Thể

I. Hàm và thủ tục

I.1. Hàm − Khi định nghĩa hàm, ta luôn khai báo tường minh giá trị trả về khi

hàm thực hiện xong.

− Cú pháp:

(danh sách các tham số) {

//Thân hàm return //cùng kiểu dữ liệu với hàm

3

CTDL1- Nguyễn Hữu Thể

}

I.1. Hàm

Ví dụ: tính tổng 2 số nguyên a, b. Trả về giá trị là tổng 2 số

int TinhTong(int a, int b) {

int TinhTong(int a, int b) {

return (a+b);

int tong; tong = a + b; return tong; }

Gọi hàm trong main()

}

void main() {

int a=4, b=5; printf(“Tong 2 so la: %d”, TinhTong(a,b));

}

int a=4, b=5; int tmp; tmp = TinhTong(a,b); printf(“Tong 2 so:%d” ,tmp);

void main() {

4

CTDL1- Nguyễn Hữu Thể

}

I.2. Thủ tục (Hàm không có giá trị trả về)

− Thủ tục không trả về giá trị, ta dùng từ khóa void để khai báo kiểu

dữ liệu. − Cú pháp:

void (danh sách các tham số) {

//Thân hàm, xử lý các dữ liệu //Nếu cần biết thông tin dl thì in ra màn hình

5

CTDL1- Nguyễn Hữu Thể

}

I.2. Thủ tục

Ví dụ: tính tổng 2 số nguyên a, b. In kết quả ra màn hình

void TinhTong(int a, int b) {

void TinhTong(int a, int b) {

printf(“%d”,(a+b));

int tong; tong = a + b; printf(“%d”,tong); }

Gọi hàm trong main()

}

void main() {

TinhTong(4,5));

int a=4, b=5; TinhTong(a,b);

}

}

6

CTDL1- Nguyễn Hữu Thể

void main() {

Cách tổ chức mã nguồn trong C

Cách 2: để hàm main sau cùng

#include #include void TinhTong(int a, int b) {

Cách 1: khai báo prototype #include #include //khai báo prototype void TinhTong(int a, int b); void main() {

int tong; tong = a + b; printf(“%d”,tong);

int a=4, b=5; TinhTong(a,b); getch();

} void main() {

} void TinhTong(int a, int b) {

int a=4, b=5; TinhTong(a,b); getch();

int tong; tong = a + b; printf(“%d”,tong); }

7

CTDL1- Nguyễn Hữu Thể

}

II. Con trỏ

II.1 Truy cập địa chỉ − Trong các ngôn ngữ lập trình, khi một biến được khai báo, ba thuộc

Nội dung ô nhớ

10

Địa chỉ: FFF0

tính cơ bản sau được liên kết đến nó: (cid:1) Tên định danh của biến (cid:1) Kiểu dữ liệu liên quan (cid:1) Địa chỉ trong bộ nhớ Ví dụ: khai báo biến int n = 10; n là tên định danh của biến, có kiểu int và được lưu trữ đâu đó trong bộ nhớ máy tính.

(cid:1) Xuất:

printf(“%d”,n); //in nội dung biến printf(“%0X”,&n);//in địa chỉ của biến

8

CTDL1- Nguyễn Hữu Thể

II.1 Truy cập địa chỉ

Ví dụ: void main() {

int n=10; printf(“%d”,n); //in nội dung biến printf(“%0X”,&n);//in địa chỉ của biến

}

Kết quả thực hiện như sau:

Ta thấy giá trị của n là 10

• • Địa chỉ biến n theo số hexa là FFF0

9

CTDL1- Nguyễn Hữu Thể

10 FFF0

II.2 Biến tham chiếu

− Dùng một biến khác truy cập đến cùng một địa chỉ với biến đã có, ta

sử dụng biến tham chiếu (references)

− Cú pháp:

(cid:1) (cid:1) (cid:1)

type& alias = name type: kiểu dữ liệu alias: tên biến tham chiếu name: tên của biến mà biến alias tham chiếu đến

void main() {

Kết quả n = 10, r = 10 n= 11, r = 11

int n=10; int& r=n; printf(“n=%d, r=%d”,n,r); n++; printf(“n=%d, r=%d”,n,r);

}

10

CTDL1- Nguyễn Hữu Thể

II.3. Biến con trỏ

− Dùng để lưu địa chỉ bộ nhớ của một đối tượng. − Cú pháp:

(cid:1) (cid:1)

type* var type: kiểu dữ liệu var: biến con trỏ

Ví dụ:

int x=10; int* p; p=&x; //p lưu địa chỉ của x, hay p trỏ đến x

(cid:2) Ghi chú:

(*p): nội dung của p toán tử (*): toán tử đọc nội dung gián tiếp thông qua con trỏ.

11

CTDL1- Nguyễn Hữu Thể

II.3. Biến con trỏ

void main() Ví dụ: {

int x=10; int* p=&x; //p tr? d?n x printf("Dia chi cua x: %0X \n",&x); printf("Noi dung cua x: %d \n",x); printf("Dia chi cua p: %0X \n",&p); printf("Noi dung cua p: %0X",p); printf("Noi dung tai dia chi ma p tro den: %d",*p);

}

Biến

Địa chỉ

Nội dung (giá trị)

x

FFF0 (&x)

10 (x)

p

FFEE (&p)

FFF0 (&x hay p=&x)

12

CTDL1- Nguyễn Hữu Thể

Ví dụ

void main() {

void HoanVi_1(int a, int b) {

int a = 1, b = 2; HoanVi_1(a, b); printf("a = %d",a); printf("b = %d",b);

int tmp = a; a = b; b = tmp;

}

void main() {

}

void HoanVi_2(int *a, int *b) {

int *a = 1, *b = 2; HoanVi_2(a, b); printf("a = %d",*a); printf("b = %d",*b);

int tmp = *a; *a = *b; *b = tmp;

}

void main() {

}

void HoanVi_3(int &a, int &b) {

int a = 1, b = 2; HoanVi_3(a, b); printf("a = %d", a); printf("b = %d", b);

int tmp = a; a = b; b = tmp;

}

13

CTDL1- Nguyễn Hữu Thể

}

II.4. Con trỏ và mảng

− Con trỏ và mảng 1 chiều

(cid:1)

int a[] = {4,5,7,9}; Truy xuất phần tử thứ hai a[1]=5 Sử dụng con trỏ: • •

Tên mảng xem như con trỏ Truy xuất phần tử thứ i: a[i] hay *(a+i)

− Con trỏ và mảng 2 chiều int a[2][3]={{4,5,7}, {9,10,12}};

(cid:1)

Truy xuất phần tử thứ i=1,j=1 là: a[1][1]=10 Sử dụng con trỏ: • •

Tên mảng xem như con trỏ Truy xuất phần tử thứ i,j: a[i][j] hay *(*(a+i)+j)

14

CTDL1- Nguyễn Hữu Thể

Bài tập

1. Cho mảng 1 chiều int a[] = {4,5,7,9}

Viết thủ tục xuất giá trị mảng ra màn hình (sử dụng con trỏ truy xuất mảng).

2. Cho mảng 2 chiều int a[2][3]={{4,5,7},{9,10,12}};

Viết thủ tục xuất giá trị mảng ra màn hình (sử dụng con trỏ truy xuất mảng).

15

CTDL1- Nguyễn Hữu Thể

16