Tải bản đầy đủ (.ppt) (72 trang)

CHƯƠNG 2 một số vấn đề TRONG KTLT

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 (296.7 KB, 72 trang )

Chương II
Môôt sô vấn đề trong KTLT
(6LT – 2BT)

Last update 8-2010

SE-SoICT

KTLT-2.1


Chương II
1.
2.
3.
4.

Tổ chức chương trình
Biến cục bôô/Biến toàn cục
Cấu trúc dữ liêôu đôông
Cấp phát tĩnh và cấp phát
đôông

Last update 8-2010

SE-SoICT

KTLT-2.2


2.1 Tổ chức CT


• Khi giai quyêêt BT, theo phương phap tiêêp
cân câêu truc, BT đươc phân chia thanh cac
BT con va cac CT con se đam nhiêm. Qua
trinh phân ra cư tiêêp tuc đêên 1 mưc đu chi
tiêêt.
• Moi NNLT đêêu cung câêp phương tiên đê tô
chưc chương trinh con.
• Goi la CT con đê phân biêt vơi CT ơ m ưc
ngoai (main) đươc goi thưc hiên bơi ND.
• CT con co câêu truc giôê
ng như main song
đươc goi va co thê goi cac CT con khac.
Last update 8-2010

SE-SoICT

KTLT-2.3


CT con (tiếp)
• CT con thương gôê
m 2 loai tuy theo cach sư
dung:
– CT con Hàm
– CT con Thủ tục

• CT con Ham la CT con dung đê thưc hiên 1
tinh toan va tra vêê1 gia tri cua 1 kiêu DL hơp
lê qui đinh bơi NNLT đo.
• CT con thu tuc thưc hiên 1 nhiêm vu phưc tap

hơn (không nhâê
t thiêêt la tinh toan) va không
tra vêê1 kêê
t qua nao.
• Trong C không phân biêt 2 khai niêm nay.
Tuy nhiên vân đươc dung theo phong cach
chung .
Last update 8-2010

SE-SoICT

KTLT-2.4


Thí dụ CT con (tiếp)
• CT con Ham trong C
int GT(int n)
{ if ( n==0) return 1;
else return n * GT(n-1);
}

• CT con thu tuc trong C
void nhapmang(Mang V, int n)
{int i;
for (i=0;i { printf("\n V[ %d ]=",i);
scanf("%d",&V[i]);
}
}
Last update 8-2010


SE-SoICT

KTLT-2.5


CT con (tiếp)
• Trong ham, đê tra vêêkêê
t qua tinh toan
ngươi ta dung lênh/biêu thưc. Lênh/biêu
thưc phu thuôc vao NNLT. Trong C, lênh
tra vêêkêê
t qua tinh toan: return <bt tri>
• Trong thu tuc không tra vêêkêê
t qua nên
dung dang “void” co nghia la rông, không
co: không co gia tri, không co tham sôê
.
• Thi du void main(void) == main()
• Lênh goi CT con ham xuâêt hiên trong bt;
lênh goi CT con thu tuc la 1 lênh hơp lê.
Last update 8-2010

SE-SoICT

KTLT-2.6


Tham sô thực và tham
sô hình thức


• Tham sôêthưc la tham sôêxuâê
t hiên trong
lơi goi CT con.
• Tham sôêhinh thưc la tham sôêxuâêt hiên
trong chư ky (header) cua CT con.
int GT(int n)

N là tham sô hình thức

{ if ( n==0) return 1;
else return n * GT(n-1);
}
….
Printf(“\3!= %d”,GT(3));
Last update 8-2010

3 là tham sô thực

SE-SoICT

KTLT-2.7


Quan hê ô giữa CT gọi và
CT được gọi
• Khi CT con gọi (calling) 1 CT con khác (called) “giá trị”
của tham số thực sẽ truyền cho tham số hình thức.
• Như vâây mối quan hêâ “gọi & được gọi” thông qua tham
số (cách thức chuẩn trong LT).

• Có nhiều cách truyền tham số:
•Truyền trị (by val): giá trị của th/số thực sẽ truyền
cho th/số hình thức. Mọi thay đổi giá trị của tham số
hình thức trong CT con không làm thay đổi giá trị của
tham số thực khi quay về CT gọi.
• Cú pháp, ngữ nghĩa của Th/số hình thức!!!
Last update 8-2010

SE-SoICT

KTLT-2.8


Quan hê ô giữa CT gọi và
được gọi (tiếp)
• Truyền theo tham chiếu (by reference) hay địa chỉ
(address) hay …: địa chỉ của th/số thực truyền cho th/số
hình thức. Mọi thay đổi giá trị của th/số hình thức trong
CT con sẽ tác đôâng đến th/số thực khi quay về CT con
gọi (hiêâu ứng lề – side effect).
•=> Cú pháp, ngữ nghĩa của Th/số thực!!!
• TD: Minh họa 1 số ví du
• Truyền theo tên (macro)
• Trong NN C chỉ có 1 kiểu truyền là theo trị. Tuy nhiên
LTV vẫn có thể dùng thủ thuâât để truyền theo địa chỉ
(xem phần sau).

Last update 8-2010

SE-SoICT


KTLT-2.9


Tham số truyền trị
#include <stdio.h>
#include <conio.h>
swap (int a, int b);
{ int temp = a;
a = b;
b= temp);
}
main()
{ int c = 5;
int d = 7;
clrscr();
swap (c,d);
printf("\n c= %d d=%d",c,d);
getch();
}

Last update 8-2010

Kết quả in ra
c=5

SE-SoICT

d=7


KTLT-2.10


Tham số truyền theo địa chỉ
#include <stdio.h>
#include <conio.h>
swap (int *a, int *b);
{ int temp = *a;
*a = *b;
*b= temp;
}
main()
{ int c = 5;
int d = 7;
clrscr();
swap (&c,&d);
printf("\n c= %d d=%d",c,d);
getch();
}

Last update 8-2010

Kết quả in ra
c=7

SE-SoICT

d=5

KTLT-2.11



Tổ chức CT con


Để tiện sử dụng CT con được tổ chức theo nhiều
hình thức khác nhau:
1. Trong cùng 1 chương trình với CT chính
2. Ghép thành đơn vị CT
3. Ghép thành mô đun (đơn thể chương trình)



Cách tổ chức thứ 2 và 3 tiện dụng hơn vì tính tái sử
dụng. Các CT con của ND có thể chuyển vào Thư
Viện chương trình của NNLT đó (các NNLT đều có
công cụ hỗ trợ việc này.

• TD: minh họa qua C/ Pascal.
Last update 8-2010

SE-SoICT

KTLT-2.12


Chương II
1.
2.
3.

4.

Tổ chức chương trình
Biến cục bôô/Biến toàn cục
Cấu trúc dữ liêôu thay đổi
Cấp phát tĩnh và cấp phát
đôông

Last update 8-2010

SE-SoICT

KTLT-2.13


2.2 Biến cục bô ô (local) và
toàn cục (global)
• Khi 1 CT được gọi nó được nạp vào bộ nhớ và thường
trú trong bộ nhớ đến khi kết thúc thực hiện. Đó chính là
vòng đời của CT => Do vậy các đại lượng định nghĩa
trong CT đó cũng kết thúc vòng đời của mình. => Nảy
sinh khái niệm biến cục bộ và biến toàn cục.
• Biến cục bộ (local variables): Các biến được định nghĩa
trong 1 CT và chỉ được sử dụng trong CT con đó. Nó có
cùng vòng đời với CT sinh ra nó. Khái niệm cục bộ cũng
là tương đối và phụ thuộc vào cách tổ chức CT. Nó là
cục bộ của CT con đó song là toàn cục với CT con của
nó.
Last update 8-2010


SE-SoICT

KTLT-2.14


Biến cục bô ô và toàn cục
(tiếp)
• Biến toàn cục (global variables): Các biến được định
nghĩa trong 1 CT và được sử dụng trong CT con đó và
các CT con của nó. => Đ/n ở 1 nơi và sử dụng ở nơi
khác.
• Một loại nữa là static: Nó là cục bộ của 1 CT song lại
duy trì vòng đời cùng với mức cao nhất: Khi CT nơi nó
đ/n kết thúc (loại khỏi bộ nhớ) nó vẫn còn tồn tại. => Ưu
điểm: tránh hiêâu ứng lề.
• Chú ý cách dùng

Last update 8-2010

SE-SoICT

KTLT-2.15


Thí dụ
int V[…];
void inmang(int n)
{
Biến cục bôô của CT con inmang
int i;

for (i=0;i printf(" %4d",V[i]);
}
Biến cục bôô của main
main ()
{int i,j,n, tam;
clrscr();
printf(" So Phan tu cua mang:\n");
scanf("%d",&n);
nhapmang(n);
printf("\n Day so vua nhap:");
inmang(n);
}
=> Lưu ý sử dụng biến toàn cục
để liên kết với CT con!!!
Last update 8-2010
SE-SoICT

KTLT-2.16


Chương II
1.
2.
3.
4.

Tổ chức chương trình
Biến cục bôô/Biến toàn cục
Cấu trúc dữ liêôu thay đổi

Cấp phát tĩnh và cấp phát
đôông

Last update 8-2010

SE-SoICT

KTLT-2.17


2.3 Cấu trúc dữ liê ôu thay
đổi
• Trong quá trinh lââp trình nhiều khi ta cần có kiểu dữ
liêâu đáp ứng được tình huống cụ thể. TD:
1. Học sinh phải học các môn học văn hóa như
nhau. Tuy nhiên viêâc học nghề lại phụ thuôâc vào giới
tính: Nam học Môâc, Cơ khí; Nữ học Thêu, Cắm hoa,
… Vâây cấu trúc nào hỗ trợ biểu diễn đáp ứng tình
huống trên.
•Pascal: cấu trúc mẫu tin thay đỏi
•C: dùng cấu trúc Union

Last update 8-2010

SE-SoICT

KTLT-2.18


Mẫu tin biến thê

struct WORDREGS {
unsigned int ax, bx, cx, dx, si, di, cflag, flags;
};
struct BYTEREGS {
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Last update 8-2010

SE-SoICT

KTLT-2.19


Mẫu tin biến thê (tiếp)
Typedef union {
struct { long abscisse ;
long ordonne;
}cart;
struct {
float rho;
float theta;
}pol;
coord p1,p2;// định nghĩa 2 điểm p1 và p2
=> Truy nhââp tới thành phần của các điểm:
P1.cart.abscisse, p2.pol.theta
Last update 8-2010


SE-SoICT

KTLT-2.20


Tê ôp (file)
2- Trong CT đê lưu các thông tin lâu dài,
người ta sử dụng các tê p
ô .


Có nhiều loại têôp khác nhau: têôp văn
bản (text file), têôp có cấu trúc thí dụ như
têôp lưu danh sách SV 1 lớp, tê p
ô nhị phân
không cấu trúc (têôp ảnh, têôp mã máy).

• Cũng có thê cùng 1 kiêu tê p
ô song do cách
dùng khác nhau mà ta coi chúng khác
nhau.
• Trong C chỉ có 2 loại tê p
ô là text file và tê p
ô
nhị phân (binary file).
Last update 8-2010

SE-SoICT


KTLT-2.21


TD đọc ghi tê ôp nhị phân
void main()
{ int i , j, n;
mang A, B;
FILE *fp;
char filename[]="Mang.Txt";
clrscr();
if ((fp=fopen(filename,"w+"))==NULL)
printf("\n Khong mo duoc tep!");
else
{ do
{ printf("\n so phan tu (1 scanf("%d",&n);
} while ((n < 1) ||(n>10));
printf("\n nhap cac phan tu:");
for (i =0;ifor (j=0;j{printf("\n A[%d,%d]=",i,j);
scanf("%d",&A[i][j]);
}
fwrite(&A,sizeof(int), MAX * MAX,fp);
Last update 8-2010

SE-SoICT

KTLT-2.22



TD đọc ghi tê ôp nhị phân
if ((fp=fopen(filename,"r+"))==NULL)
printf("\n Khong mo duoc tep!");
else
{ fread(&B,sizeof(int), MAX * MAX,fp);
fclose(fp);
}// ket thuc else
printf("\n Mang doc ra tu tep:");
for (i = 0;i{ for (j = 0;jprintf("\ %d ",B[i][j]);
printf("\n");
}

Last update 8-2010

SE-SoICT

KTLT-2.23


TD đọc ghi tê ôp văn bản
void main()
{ char c;
FILE *fv, *fr;
char *filename="D_ghitep.cpp";
clrscr();
if ((fv=fopen(filename,"r+"))==NULL)
printf("\n Khong mo duoc tep!");

else
{
filename= "D_ghitep.Txt";
if ((fr = fopen(filename,"w+")) == NULL);
do { c = fgetc(fv);
fputc(c,fr);
} while (c != EOF);
fclose(fv);
fclose(fr); }
Last update 8-2010

SE-SoICT

KTLT-2.24


Chương II
1.
2.
3.
4.

Tổ chức chương trình
Biến cục bôô/Biến toàn cục
Cấu trúc dữ liêôu thay đổi
Cấp phát tĩnh và cấp phát
đôông

Last update 8-2010


SE-SoICT

KTLT-2.25


×