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

Bài giảng Kĩ thuật lập trình pdf

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 (1.19 MB, 62 trang )

CON TRỎ
(POINTER)
Chương 7:
CON TRỎ (Pointer)


Gán địa chỉ
P = &x; // p = x; Error
Truy xuất nội dung biến
*p = *p – 12;
p = &y;
y – = 15;
x += 20;
P = (int*)malloc(sizeof(int));
*P = x – 10;
Free(p);
Khai báo biến và khởi tạo
int x = 8, y = 10;
Khai báo biến pointer
int *p;
x
0xFA30
y
0xFA32
????
p
????
0xFA30 0xFA32
NULL
8 10
- 4


- 5
16
6 ?
// x = *p = – 4 , y = 10
// y = *p = 10 , x = – 4
// y = *p = – 5 , x = – 4
// x = 16 , y = *p = – 5
// *p = 6, x = 16, y = – 5
0xAA00
// p = NULL
???? 0xAA00
????
HÀM
(FUNCTION)
Chương 8:
Function


 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, sau đ tr v gi tr cho chương
trnh gi n.

 Hay ni cch khc hm l s chia
nh ca chương trnh.
Khái niệm
Function


Ví dụ:

#include <stdio.h>
#include <conio.h>
// Prototype
void HoanDoi (int& a, int& b);
//
void main()
{
int a,b;
clrscr();
printf("Nhap vao 2 so nguyen A,B: ");
scanf("%d %d",&a,&b);
printf("Truoc khi hoan doi: A=%d va B=%d\n",a,b);
HoanDoi(a,b);
printf("Sau khi hoan doi: A=%d va B=%d\n",a,b);
getch();
}
//
void HoanDoi (int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
Function


<Kiu d liệu trả về> Tên hàm([ danh sách các tham s]);


Với:

Kiu d liệu : int, float, char, struct (void: không kiu)
Tên hàm : người lập trình tự đặt tên theo qui tắc như tên Biến.


Ví dụ:

void HoanDoi (int& a, int& b);
Khai báo
Function



<Kiểu trả về> Tên_h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.
}
Cách Khai báo biến trong hàm:
#include <stdio.h>
#include <conio.h>
// Prototype
void HoanDoi (int& a, int& b);
//
void main()
{
int a,b;
clrscr();
printf("Nhap vao 2 so nguyen A,B: ");
scanf("%d %d",&a,&b);
printf("Truoc khi hoan doi: A=%d va B=%d\n",a,b);

HoanDoi(a,b);
printf("Sau khi hoan doi: A=%d va B=%d\n",a,b);
getch();
}
//
void HoanDoi (int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}

Function


Truyền tham s hàm:
1.Truyền Tham Trị: Bên trong giá trị các
tham số thay đổi, nhưng ra khỏi hàm vẫn
không đổi.

Ví dụ:

int Tinh (int a)
{
int temp;
a = a+3;
temp = 2*(a+4);
return temp;
}
Truyền Tham TRỊ

Function


Truyền tham s hàm:
2.Truyền Tham Chiếu (&): Bên trong giá trị các
tham số thay đổi, ra khỏi hàm bị thay đổi theo.

Ví dụ:

void HoanDoi (int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
Truyền Tham CHIẾU
Function


Truyền tham s hàm:
3.Truyền Tham Biến (*): Bên trong giá trị các
tham số thay đổi, ra khỏi hàm bị thay đổi theo.

Ví dụ:

void HoanDoi (int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;

}
Truyền Tham BiẾN
Cơ chế giống Tham
Chiếu, nhưng cách
viết theo con trỏ
Function


Hàm Đệ quy:
 Ngôn ngữ C cho phép từ trong thân của mt hm có li gi hm
chính hm đó. Hàm như vậy gọi là hàm đệ qui.
 Khi hàm gọi đệ qui đến chính nó, thì mỗi lần gọi, máy sẽ tạo ra một tập
các biến cục bộ mới hoàn toàn độc lập với tập các biến cục bộ đã được
tạo ra trong các lần gọi trước.
Ví dụ:
#include<conio.h>
#include<stdio.h>
// Prototype
unsigned long GiaiThua(int n);
unsigned long GiaiThuaDQ(int n);
//
void main()
{
int n;
printf(“Nhap n = ”);
scanf(“%d”,&n);
printf(" %d!=%lu", n, GiaiThua(n) );
printf(" %d!=%lu", n, GiaiThuaDQ(n) );
getch( );
}

//
unsigned long GiaiThua(int n) // Tính n! với n>=0
{
unsigned long gt=1;
for (int i=2; i<=n; i++)
gt *=i;
return gt;
}
//
unsigned long GiaiThuaDQ(int n)
{
if (n==0 || n==1)
return 1;
else
return (n*GiaiThuaDQ(n-1));
}
MẢNG
(ARRAY)
Chương 9:
MẢNG MỘT CHIỀU (One-dimensional array)


 Khái niệm
 Khai báo
 Khởi tạo mảng
 Chỉ s – giá trị – địa chỉ của phần tử mảng
 Truyền mảng qua tham s của hàm
 Các thao tác trên mảng
Nội dung
MẢNG MỘT CHIỀU (One-dimensional array)



 Khái niệm
 Khai báo
 Khởi tạo mảng
 Chỉ s(index)–Giá trị(value)–Địa chỉ(address)
của phần tử mảng
 Truyền mảng qua tham s của hàm
 Các thao tác trên mảng
Nội dung


Khái niệm
3
0 1 2 3 4
CHỖ
ĐẬU XE
Tất cả
xe này
của
tôi
3
One-dimensional array


 Mng l nhm cc phần tử cùng kiểu dữ liu v c chung tên.
 Mỗi phần tử l mt biến thnh phần ca mng được qun lý
bằng chỉ số(index) bắt đầu từ 0 (liên tiếp, tăng mt đơn v).
Như vy để truy xut mt phần tử ca mng, chúng ta phi
biết được chỉ số ca n.

 Trong b nhớ, cc phần tử ca mng được cp pht cc ô nhớ
c đa chỉ liên tiếp khc nhau.
Khái niệm
MẢNG MỘT CHIỀU (One-dimensional array)


 Khi nim
 Khai báo
 Khởi tạo mảng
 Chỉ s(index)–Giá trị(value)–Địa chỉ(address)
của phần tử mảng
 Truyền mảng qua tham s của hàm
 Các thao tác trên mảng
Nội dung
One-dimensional array


< Kiu d liệu > < Tên mảng > [ < S phần tử ti đa của mảng> ] ;

Với:
Kiu d liệu : int, float, char, struct, pointer
Tên mảng : người lập trình tự đặt tên theo qui tắc như tên Biến. Tên
mảng thực chất là một hằng địa chỉ của phần tử đầu tiên.
S phần tử ti đa của mảng : là hằng s nguyên cụ th.

Ví dụ:
int a[100]; // Khai bo mảng s nguyên a gồm 100 phần tử

#define MAX 50
float b[MAX]; // Khai bo mảng s thực b gồm 50 phần tử

const int n = 10; // n l bin hằng
char str[n]; // Error, n không phải l hằng s nguyên c thể
long c[]; // Error, phải khai bo s phần tử ti đa của mảng
Khai báo
dạng con trỏ hằng (constant pointer)
One-dimensional array


< Kiu d liệu > *< Tên mảng >;
Lưu ý: Tên mảng tại thời điểm khai báo này thực chất là biến
(pointer) đang chỉ đến vùng nhớ (k cả giá trị tại vùng nhớ đó)
không tường minh. Để chính thức là mảng cần thao tác thêm:

Cách 1: cùng quản lý chung với mảng đã tồn tại
Ví dụ :
int *p; // khai bo con trỏ p
int b[100];
p = b; // p trỏ vo phần tử tại vị trí 0 của mảng b

Với cách viết này có thể hiểu các cách viết sau là tương đương:
p[i]  *(p + i)  b[i]  *(b+i)
Khai báo
dạng Con trỏ động (Pointer) (1)
??
??
?
p
??
Cách 2:
Xin cấp phát một vùng nhớ động đ con trỏ thành mảng động.


- Dng hàm malloc trong thư vin <stdlib.h>

Ví dụ:
int *px; // Khai bo con trỏ px
px = (int*) malloc(10*sizeof(int)); // Cấp pht 10 ô nhớ kiểu int
Chú ý:
Sau khi s dụng xong thì nên giải phóng vng nhớ bng hàm free
V d : free (px) ; // giải phóng vùng nhớ cho con trỏ px
One-dimensional array


Khai báo
dạng Con trỏ động (dynamic array) (2)
????
?
px
????
px
0xFA30
MẢNG MỘT CHIỀU (One-dimensional array)


 Khi nim
 Khai báo
Khởi tạo mảng
 Chỉ s(index)–Giá trị(value)–Địa chỉ(address)
của phần tử mảng
 Truyền mảng qua tham s của hàm
 Các thao tác trên mảng

Nội dung
One-dimensional array


S lượng các giá trị được khởi tạo bằng đúng với s phần tử khai
báo trong mảng.
Ví dụ: int a[5] = { 1, 2, 3, 4, 5 };
S lượng các giá trị được khai báo nếu ít hơn s phần tử của
mảng, thì các phần tử còn lại của mảng sẽ được khởi tạo bằng 0.
Ví dụ: int a[5] = { 1, 2 }; // int a[5] = { 1, 2, 0, 0, 0 };
S phần tử của mảng không được chỉ định, thì s phần tử khởi tạo
sẽ xác định kích thước của mảng.
Ví dụ: int a[ ] = { 1, 2, 3, 4, 5 }; // s phần tử của mảng a bằng 5
Khởi tạo giá trị của tất cả các phần tử trong mảng bằng một giá trị
hằng.
Ví dụ: int a[10] = {0};//gi trị tất cả cc phần tử của mảng a bằng 0
Khởi tạo mảng
MẢNG MỘT CHIỀU (One-dimensional array)


 Khi nim
 Khai báo
 Khởi tạo mảng
 Chỉ s – giá trị – địa chỉ của phần tử mảng
 Truyền mảng qua tham s của hàm
 Các thao tác trên mảng
Nội dung
One-dimensional array



Ví dụ:
#define MAX 10
int a[MAX] = {5, 3, -2, 6, 3, -3, 9, 8, 44, 6};
int *pa;
pa = a; // tương đương pa = &a[0];
a
0xFA30
pa
0xFA30
Chỉ s (index)–giá trị (value)–địa chỉ(address) của phần tử mảng
One-dimensional array


Cách truy xuất giá trị và địa chỉ của các phần tử của mảng a
hay con trỏ pa là tương đương
Index – Value – Address của phần tử mảng (tiếp theo)

×