際際滷

際際滷Share a Scribd company logo
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang1
Bi 01
N T畉P K畛 THU畉T L畉P TRNH
M畛C TIU
Hon t畉t bi th畛c hnh ny, sinh vi棚n c坦 th畛:
 Hi畛u v s畛 d畛ng ki畛u con tr畛 trong C++.
 Ph但n bi畛t truy畛n tham bi畉n v truy畛n tham tr畛.
 Thao t叩c 畛c/ghi tr棚n t畉p tin vn b畉n.
 Hi畛u r探 v畛 l畉p tr狸nh 畛 quy, vi畉t 動畛c c叩c ch動董ng tr狸nh 畛 quy.
TH畛I GIAN TH畛C HNH
T畛 6-15 ti畉t, g畛m
 Con tr畛: 2-5 ti畉t
 Truy畛n tham bi畉n v truy畛n tham tr畛: 1-3 ti畉t
 Thao t叩c 畛c/ghi tr棚n t畉p tin vn b畉n: 2-4 ti畉t
 L畉p tr狸nh 畛 quy: 1-3 ti畉t
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang2
1. CON TR畛
Con tr畛 l kh叩i ni畛m 畉c bi畛t trong C/C++, l lo畉i bi畉n d湛ng 畛 ch畛a 畛a ch畛. C叩c thao t叩c v畛i con
tr畛 l畉n l動畛t qua c叩c b動畛c:
 Khai b叩o bi畉n con tr畛
 Kh畛i t畉o con tr畛 d湛ng c畉p ph叩t v湛ng nh畛
 Truy xu畉t gi叩 tr畛 担 nh畛 t畛 bi畉n con tr畛
 H畛y v湛ng nh畛 達 xin c畉p ph叩t
1.1. Khai b叩o bi畉n con tr畛 trong C++
<KieuDuLieu> *<TenBien>;
V鱈 d畛:
int* pa; // con tr畛 畉n ki畛u int
DIEM *pd; // con tr畛 畉n ki畛u DIEM
畛 x叩c 畛nh 畛a ch畛 c畛a m畛t 担 nh畛: to叩n t畛 &
V鱈 d畛:
int a = 1;
int* pa = &a; // con tr畛 tr畛 畉n 担 nh畛 c畛a bi畉n a
1.2. Kh畛i t畉o bi畉n con tr畛 d湛ng c畉p ph叩t v湛ng nh畛 (c畉p ph叩t 畛ng)
S畛 d畛ng to叩n t畛 new
V鱈 d畛:
int* pInt = new int; // xin c畉p ph叩t v湛ng nh畛 cho 1 s畛 nguy棚n
DIEM *pDiem = new DIEM; // xin c畉p ph叩t v湛ng nh畛 cho 1 bi畉n ki畛u c畉u tr炭c DIEM
To叩n t畛 new c嘆n c坦 th畛 s畛 d畛ng th畛 c畉p ph叩t v湛ng nh畛 cho nhi畛u ph畉n t畛.
int* arr = new int[5]; // xin c畉p ph叩t v湛ng nh畛 cho 5 s畛 nguy棚n
L動u 箪:
畛 ki畛m tra c畉p ph叩t v湛ng nh畛 thnh c担ng hay kh担ng, ta d湛ng con tr畛 畉c bi畛t NULL.
NULL l con tr畛 畉c bi畛t, c坦 th畛 動畛c g叩n cho c叩c bi畉n con tr畛 c畛a c叩c ki畛u d畛 li畛u kh叩c nhau.
V鱈 d畛:
int* pInt = NULL;
DIEM* pDiem = NULL;
畛u h畛p l畛.
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang3
畛 ki畛m tra c畉p ph叩t thnh c担ng, ta lm nh動 sau:
DIEM* pDiem = NULL; // khai b叩o con tr畛 v g叩n b畉ng NULL
pDiem = new DIEM; // xin c畉p ph叩t v湛ng nh畛
if (pDiem == NULL) // n畉u pDiem v畉n b畉ng NULL th狸 xin c畉p ph叩t kh担ng thnh c担ng
printf(Cap phat khong thanh cong);
1.3. Truy xu畉t gi叩 tr畛 担 nh畛 t畛 bi畉n con tr畛
1.3.1.畛i v畛i c叩c ki畛u d畛 li畛u c董 b畉n (nh動 ki畛u int, float, )
畛 x叩c 畛nh gi叩 tr畛 担 nh畛 t畉i 畛a ch畛 trong bi畉n con tr畛: to叩n t畛 *
V鱈 d畛:
V畛i khai b叩o c叩c bi畉n a, pa
int a = 1;
int* pa = &a; // con tr畛 tr畛 畉n 担 nh畛 c畛a bi畉n a
c但u l畛nh
printf("%dn", *pa);
s畉 xu畉t ra 1
Gi畉i th鱈ch:
int a = 1;
V畛i khai b叩o ny, m畛t 担 nh畛 s畉 動畛c c畉p ph叩t v n畛i dung 担 nh畛 l 1
int* pa = &a;
Sau khai b叩o ny, bi畉n pa s畉 gi畛 畛a ch畛 担 nh畛 v畛a 動畛c c畉p ph叩t cho bi畉n a
Khi 坦, *pa s畉 l畉y n畛i dung c畛a 担 nh畛 動畛c tr畛 畉n b畛i bi畉n pa, m bi畉n pa gi畛 畛a ch畛 担 nh畛 動畛c
c畉p ph叩t cho bi畉n a.
V畉y *pa = a = 1.
1.3.2.畛i v畛i c叩c ki畛u d畛 li畛u c畉u tr炭c (nh動 ki畛u SINHVIEN, DIEM, )
畛 truy xu畉t c叩c thnh ph畉n c畛a ki畛u c畉u tr炭c, d湛ng ->
V鱈 d畛:
V畛i ki畛u c畉u tr炭c DIEM 動畛c 畛nh ngh挑a nh動 sau
struct DIEM
{
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang4
int hoanhDo, tungDo;
} ;
DIEM *pDiem = new DIEM;
畛 truy xu畉t thnh ph畉n d湛ng
pDiem->hoanhDo v pDiem->tungDo
1.4. H畛y v湛ng nh畛 達 xin c畉p ph叩t
畛 h畛y v湛ng nh畛 達 xin c畉p ph叩t, d湛ng to叩n t畛 delete
V畛i khai b叩o
int* pa = new int;
int* pb = new int[5];
C叩ch h畛y t動董ng 畛ng s畉 l
delete pa;
delete pb[];
Bi t畉p (code m畉u: ConTroCoBan)
#include <stdio.h>
struct DIEM
{
int hoanhDo, tungDo;
} ;
void main()
{
// khoi tao cac bien gia tri
int a = 1;
DIEM d;
d.hoanhDo = 1;
d.tungDo = 2;
// khai bao bien con tro va tro den vung nho cua cac bien gia tri da co
int *pa = &a;
int *pb = pa;
DIEM *pd = &d;
// xac dinh dia chi o nho: toan tu &
printf("Dia chi o nho: %d n", &a);
// truy xuat gia tri o nho tu bien con tro: toan tu *
printf("Gia tri a: %d n", *pa);
// truy xuat thanh phan trong cau truc
printf("Diem D: (%d,%d)n", d.hoanhDo, d.tungDo);//doi voi bien gia tri: .
printf("Diem D: (%d,%d)n", pd->hoanhDo, pd->tungDo);// doi voi bien con
tro: ->
}
1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n.
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang5
2. N畉u l畛nh
int a = 1;
動畛c 畛i thnh
int a = 10;
Cho bi畉t gi叩 tr畛 c畛a *pa.
3. N畉u d嘆ng
int *pa = &a;
動畛c s畛a l畉i thnh
int *pa;
Cho bi畉t k畉t qu畉 bi棚n d畛ch ch動董ng tr狸nh? Ch動董ng tr狸nh c坦 b叩o l畛i khi th畛c thi kh担ng? N畉u c坦, cho
bi畉t t畉i sao l畛i.
4. N畉u tr動畛c d嘆ng
printf("Gia tri a: %d n", *pa);
ta th棚m d嘆ng code
*pb = 2;
Cho bi畉t k畉t qu畉 c畛a l畛nh xu畉t
printf("Gia tri a: %d n", *pa);
Gi畉i th鱈ch t畉i sao c坦 k畉t qu畉 xu畉t nh動 v畉y.
1.5. Con tr畛 v畛i m畉ng (c畉p ph叩t m畉ng 畛ng)
C叩ch lm tr動畛c 但y khi kh担ng s畛 d畛ng c畉p ph叩t 畛ng v畛i m畉ng 1 chi畛u
int a[100]; // xin 100 担 nh畛 cho m畉ng t畛i a 100 ph畉n t畛
int n;
printf("Nhap so luong phan tu: ");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("Nhap a[%d]: ",i);
scanf("%d", &a[i]);
}
C叩ch lm ny c坦 nhi畛u h畉n ch畉 nh動: c畉p ph叩t th畛a trong tr動畛ng h畛p n nh畉p vo < 100 v kh担ng cho
ph辿p n nh畉p vo l畛n h董n m畛t s畛 l動畛ng 畛nh tr動畛c 動畛c ci 畉t trong code (100).
畛 c畉p ph叩t m畉ng 畛ng (s畛 l動畛ng ph畉n t畛 c畉p ph叩t 炭ng b畉ng v畛i n nh畉p vo v kh担ng gi畛i h畉n gi叩
tr畛 n), ta lm nh動 sau
int n;
printf("Nhap so luong phan tu: ");
scanf("%d", &n);
//khai bao bien con tro a va xin cap phat vung nho chua n so interger
int* a = new int[n];
//dung vong lap de nhap cac gia tri a[i]
for (int i = 0; i < n; i++)
{
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang6
printf("Nhap a[%d]: ",i);
scanf("%d", &a[i]);
}
Sau khai b叩o
int* a = new int[n];
m畛t v湛ng nh畛 ch畛a n s畛 nguy棚n s畉 動畛c c畉p ph叩t, con tr畛 a s畉 ch畛 畉n ph畉n t畛 畉u ti棚n c畛a d達y n
s畛.
C叩c ph畉n t畛 c畛a m畉ng 動畛c truy xu畉t qua to叩n t畛 [] nh動 v畛i m畉ng tr動畛c 但y 達 d湛ng.
Bi t畉p (code m畉u: ConTroVoiMang)
Nh畉p m畉ng m畛t chi畛u c叩c s畛 nguy棚n d湛ng c畉p ph叩t m畉ng 畛ng.
#include <stdio.h>
void main()
{
// MANG 1 CHIEU
int n;
printf("Nhap so luong phan tu: ");
scanf("%d", &n);
//khai bao bien con tro a va xin cap phat vung nho chua n so interger
int* a = new int[n];
//dung vong lap de nhap cac gia tri a[i]
for (int i = 0; i < n; i++)
{
printf("Nhap a[%d]: ",i);
scanf("%d", &a[i]);
}
printf("a[0] = %dn", a[0]);
printf("*a = %dn", *a);
//xuat cac gia tri a[i]
for (int i = 0; i < n; i++)
{
printf("a[%d] = %dn",i, a[i]);
}
}
1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n.
2. Nh畉p vo m畛t vi m畉ng s畛 nguy棚n, nh畉n x辿t v畛 k畉t qu畉 c畛a 2 l畛nh xu畉t sau c叩c l畉n ch畉y.
printf("a[0] = %dn", a[0]);
printf("*a = %dn", *a);
3. Gi畉i th鱈ch t畉i sao c坦 th畛 r炭t ra k畉t lu畉n 畛 c但u 2.
4. S畛a l畉i o畉n ch動董ng tr狸nh tr棚n 畛 nh畉p vo m畛t m畉ng s畛 nguy棚n v xu畉t ra t畛ng c叩c s畛 trong
m畉ng 坦.
5. Vi畉t ch動董ng tr狸nh cho ph辿p nh畉p vo m畛t m畉ng 2 chi畛u c叩c s畛 nguy棚n d湛ng c畉p ph叩t 畛ng.
G畛i 箪:
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang7
M畉ng 2 chi畛u mxn c叩c s畛 nguy棚n 動畛c khai b叩o nh動 sau
int** b = new int*[m];
trong 坦 m畛i b[i] (ki畛u int*) l m畛t m畉ng m畛t chi畛u n s畛 nguy棚n
b[i] = new int[n];
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang8
2. TRUY畛N THAM S畛: TRUY畛N THAM BI畉N vs TRUY畛N THAM TR畛
Gi畉 s畛 ta c坦 o畉n ch動董ng tr狸nh:
void BinhPhuong(int a)
{
a = a * a;
}
void main()
{
int a = 2;
BinhPhuong(a);
printf(%d, a);
}
v畛i hm BinhPhuong nh畉n vo 1 tham s畛 ki畛u int v t鱈nh b狸nh ph動董ng c畛a s畛 坦 ( a = a * a).
Ta mong mu畛n k畉t qu畉 xu畉t ra l 4. Tuy nhi棚n, th畛c t畉 k畉t qu畉 xu畉t ra l畉i l 2.
Gi畉i th鱈ch:
Khi g畛i th畛c hi畛n hm Funtciton(a), gi叩 tr畛 c畛a a s畉 動畛c truy畛n cho hm, kh担ng ph畉i l b畉n th但n
bi畉n a. Do 坦, d湛 c但u l畛nh
a = a * a;
動畛c th畛c hi畛n v gi叩 tr畛 c畛a a trong hm BinhPhuong c坦 thay 畛i nh動ng do ta ch畛 truy畛n gi叩 tr畛 ch畛
kh担ng ph畉i b畉n th但n bi畉n n棚n khi ra kh畛i hm BinhPhuong(), gi叩 tr畛 c畛a bi畉n a khi th畛c hi畛n c但u
l畛nh in ra v畉n l 2.
C叩ch truy畛n tham s畛 a vo hm BinhPhuong nh動 tr棚n g畛i l c叩ch truy畛n tham tr畛 (ch畛 truy畛n gi叩 tr畛
vo hm, c叩c thao t叩c lm thay 畛i gi叩 tr畛 c畛a bi畉n b棚n trong hm kh担ng 畉nh h動畛ng 畉n gi叩 tr畛 bi畉n
khi k畉t th炭c hm).
Tuy nhi棚n trong tr動畛ng h畛p ny, ta mu畛n nh畛ng thay 畛i gi叩 tr畛 bi畉n a trong hm BinhPhuong v畉n
c坦 t叩c d畛ng khi ra kh畛i hm. Ta s畛a l畉i o畉n ch動董ng tr狸nh tr棚n nh動 sau
void BinhPhuong(int& a)
{
a = a * a;
}
void main()
{
int a = 2;
BinhPhuong(a);
printf(%d, a);
}
th狸 k畉t qu畉 xu畉t ra l 4.
trong 坦 c叩ch khai b叩o
void BinhPhuong(int& a) // d湛ng to叩n t畛 &
cho bi畉t bi畉n a s畉 動畛c truy畛n theo ki畛u tham bi畉n (truy畛n tr畛c ti畉p bi畉n vo hm, do 坦 nh畛ng
thay 畛i gi叩 tr畛 c畛a bi畉n b棚n trong hm s畉 畉nh h動畛ng 畉n gi叩 tr畛 bi畉n k畛 c畉 khi k畉t th炭c hm.
Bi t畉p (code m畉u: ThamBien_ThamTri)
#include <stdio.h>
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang9
struct DIEM
{
int x, y;
};
void TruyenThamTri(int a)
{
a = a * 10;
}
void TruyenThamBien(int &a)
{
a = a * 10;
}
void ThamTriConTro(DIEM* d)
{
d->x = d->x * 10;
d->y = d->y * 10;
}
void ThamBienConTro(DIEM* &d, DIEM* p)
{
d->x = d->x * 10;
d->y = d->y * 10;
d = p;
}
void main()
{
// tham tri, tham bien voi bien du lieu
int a = 1, b = 10;
printf("a = %dn", a);
TruyenThamTri(a);
printf("a sau ham TruyenThamTri = %dn", a);
TruyenThamBien(a);
printf("a sau ham TruyenThamBien = %dn", a);
// bien con tro
DIEM* d2 = new DIEM;
d2->x = 5; d2->y = 5;
printf("Diem d2(%d, %d)n", d2->x, d2->y);
ThamTriConTro(d2);
printf("d2 sau khi goi ham ThamTriConTro: (%d,%d)n", d2->x, d2->y);
printf("n");
DIEM* d1 = new DIEM;
d1->x = 5; d1-> y = 5;
d2->x = 5; d2->y = 5;
printf("Diem d2(%d, %d)n", d2->x, d2->y);
ThamBienConTro(d2, d1);
printf("d2 sau khi goi ham ThamBienConTro: (%d,%d)n", d2->x, d2->y);
}
1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n.
2. Cho bi畉t k畉t qu畉 c畛a l畛nh in
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang10
printf("a sau ham TruyenThamTri = %dn", a);
v
printf("a sau ham TruyenThamBien = %dn", a);
3. Cho bi畉t k畉t qu畉 c畛a l畛nh in
printf("d2 sau khi goi ham ThamTriConTro: (%d,%d)n", d2->x, d2->y);
Nh畉n x辿t gi叩 tr畛 c畛a d2->x v d2->y c坦 b畛 thay 畛i kh担ng? N畉u gi叩 tr畛 c畛a d2->x v d2->y c坦 b畛
thay 畛i, gi畉i th鱈ch t畉i sao khi khai b叩o hm
void ThamTriConTro(DIEM* d)
bi畉n d truy畛n theo ki畛u tham tr畛 (kh担ng s畛 d畛ng &) nh動ng d2->x, d2->y l畉i b畛 thay 畛i
G畛i 箪: d l ki畛u con tr畛.
4. Cho bi畉t k畉t qu畉 c畛a l畛nh in
printf("d2 sau khi goi ham ThamBienConTro: (%d,%d)n", d2->x, d2->y);
Nh畉n x辿t gi叩 tr畛 c畛a d2->x v d2->y c坦 b畛 thay 畛i kh担ng? N畉u gi叩 tr畛 c畛a d2->x v d2->y kh担ng b畛
thay 畛i, gi畉i th鱈ch t畉i sao khi khai b叩o hm
void ThamBienConTro(DIEM* &d, DIEM* p)
bi畉n d truy畛n theo ki畛u tham bi畉n (s畛 d畛ng &) nh動ng d2->x, d2->y l畉i kh担ng b畛 thay 畛i
G畛i 箪
Thay 畛i
d1->x = 5; d1-> y = 5;
thnh gi叩 tr畛 kh叩c r畛i quan s叩t k畉t qu畉 c畛a l畛nh in 畛 r炭t ra nh畉n x辿t.
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang11
3. NH畉P/XU畉T TRN T畉P TIN VN B畉N
3.1. Nh畉p
畛 畛c m畛t file vn b畉n, c畉n th畛c hi畛n c叩c b動畛c sau
B1:
#include <stdio.h>
// mo file de doc
FILE* fi = fopen("input.txt", "rt");
trong 坦 hm fopen nh畉n 2 tham s畛: tham s畛 畉u ti棚n (ki畛u char*) l t棚n file (input.txt), tham s畛 th畛
2 l chu畛i rt (read + text: 畛c d畉ng file vn b畉n)
Trong tr動畛ng h畛p mu畛n vi畉t hm 畛c file v truy畛n t棚n file nh動 m畛t tham s畛 vo hm:
void DocFile(char* tenFile)
{
FILE* fi = fopen(tenFile, "rt");

}
B2:
//doc du lieu
int n;
fscanf(fi, "%d", &n);
d湛ng hm fscanf 畛 畛c d畛 li畛u. C叩ch d湛ng hm fscanf t動董ng t畛 hm scanf (ch畛 kh叩c c坦 th棚m tham
s畛 畉u ti棚n ki畛u FILE* l con tr畛 畉n t畉p tin 達 m畛 畛 tr棚n)
B3:
//dong file
fclose(fi);
3.2. Xu畉t
T動董ng t畛 v畛i nh畉p d畛 li畛u, ta c滴ng c坦 c叩c b動畛c
B1:
//mo file de ghi
FILE* fo = fopen(tenFile, "wt"); // wt = write (ghi) + text (dang van ban)
B2:
//ghi du lieu ra file
fprintf(fo, "%d ",n);
D湛ng hm fprintf() t動董ng t畛 printf()
B3:
// dong file
fclose(fo);
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang12
3.3. C叩ch qu畉n l箪 t畉p tin nh畉p/xu畉t trong project c畛a VS2005
Khi lm vi畛c v畛i t畉p tin, ta c畉n ph畉i 畉t t畉p tin 畛 炭ng th動 m畛c 畛 c坦 th畛 debug/th畛c thi ch動董ng
tr狸nh. Ta c坦 th畛 s畛 d畛ng VS2005 畛 t畉o t畉p tin txt, VS2005 s畉 t畛 畛ng 畉t file 坦 畛 炭ng th動 m畛c v
ta c坦 th畛 qu畉n l箪 file d畛 dng h董n.
畛 t畉o file txt, t畛 c畛a s畛 Solution Explorer, nh畉n chu畛t ph畉i vo Resources Files, ch畛n Add -> New
Item
Ch畛n Text File (.txt) v g探 t棚n (kh担ng g探 u担i .txt)
Sau 坦 g探 n畛i dung t畉p tin.
V畛i c叩c file m ta xu畉t k畉t qu畉 ra, ta c滴ng c坦 th畛 th棚m file 坦 vo project 畛 d畛 qu畉n l箪.
C叩ch lm t動董ng t畛, nh畉n chu畛t ph畉i vo Resources Files, ch畛n Add -> Existing Item
Ch畛n file m ta 達 xu畉t ra.
(Xem Demo)
Bi t畉p (code m畉u: NhapXuatFile)
畛c t畛 file input.txt m畉ng m畛t chi畛u c叩c s畛 th畛c. T畉p tin input.txt c坦 n畛i dung nh動 sau:
- D嘆ng 畉u ch畛a 1 s畛 nguy棚n l s畛 l動畛ng ph畉n t畛 c畛a m畉ng
- D嘆ng sau ch畛a c叩c ph畉n t畛 c畛a m畉ng c叩ch nhau b畛i kho畉ng tr畉ng
V鱈 d畛:
5
1.2 2.3 3.4 4.5 5.6
#include <stdio.h>
void XuatFile(char* tenFile, float* arr, int n)
{
//mo file de ghi
FILE* fo = fopen(tenFile, "wt"); // wt = write (ghi) + text (dang van ban)
//ghi du lieu ra file
for (int i = 0; i < n; i++)
fprintf(fo, "%0.1f ", arr[i]);
// dong file
fclose(fo);
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang13
}
void main()
{
// mo file de doc
FILE* fi = fopen("input.txt", "rt");
//doc du lieu
int n;
fscanf(fi, "%d", &n);
float* arr = new float[n];
for (int i = 0; i < n; i++)
fscanf(fi, "%f", &arr[i]);
//dong file
fclose(fi);
// in ra man hinh de kiem tra
for (int i = 0; i < n; i++)
printf("%0.1f ", arr[i]);
printf("n");
// xuat ra file
XuatFile("output.txt", arr, n);
}
1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n.
2. T畉o t畉p tin d畛 li畛u m畛i MSSV.txt thay cho file input.txt. Nh畉p d畛 li畛u cho file MSSV.txt v
ch畉y ch動董ng tr狸nh.
3. Xu畉t ra file out_MSSV.txt thay cho file output.txt. Th棚m file output.txt vo project 畛 c坦 th畛
xem k畉t qu畉 xu畉t t畛 Visual Studio thay v狸 ph畉i d湛ng Windows Explorer v Notepad.
3. S畛a l畉i ch動董ng tr狸nh 畛 ch畛 xu畉t ra file c叩c t畉p tin c坦 ch畛 s畛 l畉 c畛a m畉ng. (ch畛 in ra arr[1], arr[3],
)
4. S畛a l畉i ch動董ng tr狸nh 畛 t鱈nh t畛ng c叩c ph畉n t畛 v xu畉t ra file t畛ng 坦.
3.4. 畛c 畉n h畉t file
N畉u bi to叩n 畛c m畉ng c叩c s畛 th畛c 畛 tr棚n kh担ng c坦 th担ng tin s畛 l動畛ng ph畉n t畛 th狸 ta s畉 gi畉i quy畉t
theo h動畛ng c畛 畛c vo 畉n khi no h畉t file th狸 d畛ng. V畉y ta c畉n ph畉i bi畉t d畉u hi畛u k畉t th炭c file:
hm feof()
Xem o畉n ch動董ng tr狸nh m畉u sau: 畛c m畛t m畉ng kh担ng bi畉t tr動畛c s畛 l動畛ng c叩c s畛 th畛c v in ra mn
h狸nh.
void DocHetFile1(char* tenFile)
{
FILE* fi = fopen(tenFile, "rt");
float temp;
while (!feof(fi)) // khi chua ket thuc file
{
fscanf(fi, "%f", &temp); // doc so thuc vao bien temp
printf("%0.1f ", temp);
}
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang14
printf("n");
fclose(fi);
}
Trong 坦, ta s畛 d畛ng v嘆ng while v i畛u ki畛n 畛 th畛c hi畛n l ch動a h畉t file: !feof(fi)
Hm feof() nh畉n 1 tham s畛 ki畛u FILE* l file ang 畛c v tr畉 v畛 true/false n畉u k畉t th炭c/ch動a k畉t
th炭c file.
Bi t畉p (code m畉u: NhapXuatFile)
#include <stdio.h>
void DocHetFile1(char* tenFile)
{
FILE* fi = fopen(tenFile, "rt");
float temp;
while (!feof(fi))
{
fscanf(fi, "%f", &temp);
printf("%0.1f ", temp);
}
printf("n");
fclose(fi);
}
void DocHetFile2(char* tenFile)
{
FILE* fi = fopen(tenFile, "rt");
float temp;
while (!feof(fi))
{
if (fscanf(fi, "%f", &temp)>0)
printf("%0.1f ", temp);
else
break;
}
printf("n");
fclose(fi);
}
void main()
{
printf("Doc khi khong biet so luong phan tu, doc den het file thi
dung:n");
DocHetFile1("input2.txt");
DocHetFile1("input3.txt");
}
Trong 坦
input2.txt c坦 n畛i dung
1.2 2.3 3.4 4.5 5.6
input3.txt c坦 n畛i dung (c坦 1 d畉u kho畉ng tr畉ng 畛 cu畛i file)
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang15
1.2 2.3 3.4 4.5 5.6
1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n.
2. Nh畉n x辿t v畛 k畉t qu畉 xu畉t ra mn h狸nh (2 d嘆ng t動董ng 畛ng v畛i 2 file input2.txt v input3.txt). 2
d嘆ng k畉t qu畉 xu畉t ra c坦 gi畛ng nhau kh担ng?
3. N畉u 2 d嘆ng k畉t qu畉 xu畉t ra kh担ng gi畛ng nhau, gi畉i th鱈ch t畉i sao v畛i d畛 li畛u vo nh動 nhau (xem
n畛i dung file input2.txt v input3.txt) k畉t qu畉 xu畉t l畉i kh担ng gi畛ng nhau.
G畛i 箪: file input3.txt c坦 m畛t d畉u kho畉ng tr畉ng 畛 cu畛i file n棚n 畛 v嘆ng l畉p cu畛i sau khi 畛c 5.6 i畛u
ki畛n (!feof(fi)) v畉n tr畉 v畛 炭ng (v狸 h畉t s畛 5.6 ch動a l cu畛i file) .
4. S畛a l畉i 2 d嘆ng
DocHetFile1("input2.txt");
DocHetFile1("input3.txt");
thnh
DocHetFile2("input2.txt");
DocHetFile2("input3.txt");
v ch畉y l畉i ch動董ng tr狸nh. Nh畉n x辿t k畉t qu畉 xu畉t. T畛 坦 r炭t ra k畉t lu畉n hm no 畛c h畉t file ch鱈nh
x叩c h董n.
G畛i 箪:
Hm DocHetFile2 v DocHetFile1 ch畛 kh叩c nhau 畛 ch畛 hm DocHetFile2 c坦 ki畛m tra l畛nh 畛c s畛
th畛c t畛 file c坦 thnh c担ng hay kh担ng nh動 sau:
Hm fscanf() c坦 gi叩 tr畛 tr畉 v畛 l s畛 l動畛ng bi畉n 畛c thnh c担ng
if (fscanf(fi, "%f", &temp)>0)
畛 但y ta 畛c 1 bi畉n , do 坦 ch畛 c畉n ki畛m tra gi叩 tr畛 tr畉 v畛 > 0 l 畛c thnh c担ng.
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang16
4. 畛 QUY
M畛t hm 動畛c g畛i l 畛 quy n畉u b棚n trong th但n c畛a hm 坦 c坦 l畛i g畛i hm l畉i ch鱈nh n坦 m畛t c叩ch
t動畛ng minh hay ti畛m 畉n
Khi vi畉t hm 畛 quy, c畉n x叩c 畛nh:
- i畛u ki畛n d畛ng
- C担ng th畛c 畛 quy
V鱈 d畛:
T鱈nh t畛ng S(n) = 1 + 2 +  + n
Ta c坦
S(n) = (1 + 2 +  + n-1) + n
hay S(n) = S(n-1) + n (c担ng th畛c 畛 quy)
S(0) = 0 (i畛u ki畛n d畛ng)
Ta c坦 ch動董ng tr狸nh t動董ng 畛ng v畛i c担ng th畛c 畛 quy tr棚n nh動 sau:
int Tong(int n )
{
if (n == 0)
return 0;
return Tong(n-1) + n;
}
Bi t畉p (code m畉u: DeQuy)
#include <stdio.h>
int Tong(int* a, int n)
{
if ( n == 0)
return a[0];
return Tong(a, n-1) + a[n];
}
void main()
{
int n;
printf("Nhap n: ");
scanf("%d", &n);
int* a = new int[n];
for (int i = 0; i < n; i++)
{
printf("Nhap a[%d] = ",i);
scanf("%d",&a[i]);
}
Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t
HCMUS 2010
Trang17
printf("%dn",Tong(a, n-1));
}
1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n.
2. Cho bi畉t o畉n ch動董ng tr狸nh tr棚n th畛c hi畛n t叩c v畛 g狸.
3. Vi畉t c担ng th畛c 畛 quy v i畛u ki畛n d畛ng c畛a ch動董ng tr狸nh 畛 quy tr棚n. N畉u ch動董ng tr狸nh 畛 quy
kh担ng c坦 i畛u ki畛n d畛ng th狸 i畛u g狸 s畉 x畉y ra?
4. S畛a l畉i ch動董ng tr狸nh 畛 t鱈nh t鱈ch c畛a c叩c ph畉n t畛 c畛a m畛t d達y s畛 nguy棚n b畉ng ph動董ng ph叩p 畛
quy
5. S畛a l畉i ch動董ng tr狸nh 畛 t鱈nh t畛ng c叩c s畛 l畉 c坦 trong m畉ng b畉ng ph動董ng ph叩p 畛 quy

More Related Content

Ctdl lab01

  • 1. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang1 Bi 01 N T畉P K畛 THU畉T L畉P TRNH M畛C TIU Hon t畉t bi th畛c hnh ny, sinh vi棚n c坦 th畛: Hi畛u v s畛 d畛ng ki畛u con tr畛 trong C++. Ph但n bi畛t truy畛n tham bi畉n v truy畛n tham tr畛. Thao t叩c 畛c/ghi tr棚n t畉p tin vn b畉n. Hi畛u r探 v畛 l畉p tr狸nh 畛 quy, vi畉t 動畛c c叩c ch動董ng tr狸nh 畛 quy. TH畛I GIAN TH畛C HNH T畛 6-15 ti畉t, g畛m Con tr畛: 2-5 ti畉t Truy畛n tham bi畉n v truy畛n tham tr畛: 1-3 ti畉t Thao t叩c 畛c/ghi tr棚n t畉p tin vn b畉n: 2-4 ti畉t L畉p tr狸nh 畛 quy: 1-3 ti畉t
  • 2. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang2 1. CON TR畛 Con tr畛 l kh叩i ni畛m 畉c bi畛t trong C/C++, l lo畉i bi畉n d湛ng 畛 ch畛a 畛a ch畛. C叩c thao t叩c v畛i con tr畛 l畉n l動畛t qua c叩c b動畛c: Khai b叩o bi畉n con tr畛 Kh畛i t畉o con tr畛 d湛ng c畉p ph叩t v湛ng nh畛 Truy xu畉t gi叩 tr畛 担 nh畛 t畛 bi畉n con tr畛 H畛y v湛ng nh畛 達 xin c畉p ph叩t 1.1. Khai b叩o bi畉n con tr畛 trong C++ <KieuDuLieu> *<TenBien>; V鱈 d畛: int* pa; // con tr畛 畉n ki畛u int DIEM *pd; // con tr畛 畉n ki畛u DIEM 畛 x叩c 畛nh 畛a ch畛 c畛a m畛t 担 nh畛: to叩n t畛 & V鱈 d畛: int a = 1; int* pa = &a; // con tr畛 tr畛 畉n 担 nh畛 c畛a bi畉n a 1.2. Kh畛i t畉o bi畉n con tr畛 d湛ng c畉p ph叩t v湛ng nh畛 (c畉p ph叩t 畛ng) S畛 d畛ng to叩n t畛 new V鱈 d畛: int* pInt = new int; // xin c畉p ph叩t v湛ng nh畛 cho 1 s畛 nguy棚n DIEM *pDiem = new DIEM; // xin c畉p ph叩t v湛ng nh畛 cho 1 bi畉n ki畛u c畉u tr炭c DIEM To叩n t畛 new c嘆n c坦 th畛 s畛 d畛ng th畛 c畉p ph叩t v湛ng nh畛 cho nhi畛u ph畉n t畛. int* arr = new int[5]; // xin c畉p ph叩t v湛ng nh畛 cho 5 s畛 nguy棚n L動u 箪: 畛 ki畛m tra c畉p ph叩t v湛ng nh畛 thnh c担ng hay kh担ng, ta d湛ng con tr畛 畉c bi畛t NULL. NULL l con tr畛 畉c bi畛t, c坦 th畛 動畛c g叩n cho c叩c bi畉n con tr畛 c畛a c叩c ki畛u d畛 li畛u kh叩c nhau. V鱈 d畛: int* pInt = NULL; DIEM* pDiem = NULL; 畛u h畛p l畛.
  • 3. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang3 畛 ki畛m tra c畉p ph叩t thnh c担ng, ta lm nh動 sau: DIEM* pDiem = NULL; // khai b叩o con tr畛 v g叩n b畉ng NULL pDiem = new DIEM; // xin c畉p ph叩t v湛ng nh畛 if (pDiem == NULL) // n畉u pDiem v畉n b畉ng NULL th狸 xin c畉p ph叩t kh担ng thnh c担ng printf(Cap phat khong thanh cong); 1.3. Truy xu畉t gi叩 tr畛 担 nh畛 t畛 bi畉n con tr畛 1.3.1.畛i v畛i c叩c ki畛u d畛 li畛u c董 b畉n (nh動 ki畛u int, float, ) 畛 x叩c 畛nh gi叩 tr畛 担 nh畛 t畉i 畛a ch畛 trong bi畉n con tr畛: to叩n t畛 * V鱈 d畛: V畛i khai b叩o c叩c bi畉n a, pa int a = 1; int* pa = &a; // con tr畛 tr畛 畉n 担 nh畛 c畛a bi畉n a c但u l畛nh printf("%dn", *pa); s畉 xu畉t ra 1 Gi畉i th鱈ch: int a = 1; V畛i khai b叩o ny, m畛t 担 nh畛 s畉 動畛c c畉p ph叩t v n畛i dung 担 nh畛 l 1 int* pa = &a; Sau khai b叩o ny, bi畉n pa s畉 gi畛 畛a ch畛 担 nh畛 v畛a 動畛c c畉p ph叩t cho bi畉n a Khi 坦, *pa s畉 l畉y n畛i dung c畛a 担 nh畛 動畛c tr畛 畉n b畛i bi畉n pa, m bi畉n pa gi畛 畛a ch畛 担 nh畛 動畛c c畉p ph叩t cho bi畉n a. V畉y *pa = a = 1. 1.3.2.畛i v畛i c叩c ki畛u d畛 li畛u c畉u tr炭c (nh動 ki畛u SINHVIEN, DIEM, ) 畛 truy xu畉t c叩c thnh ph畉n c畛a ki畛u c畉u tr炭c, d湛ng -> V鱈 d畛: V畛i ki畛u c畉u tr炭c DIEM 動畛c 畛nh ngh挑a nh動 sau struct DIEM {
  • 4. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang4 int hoanhDo, tungDo; } ; DIEM *pDiem = new DIEM; 畛 truy xu畉t thnh ph畉n d湛ng pDiem->hoanhDo v pDiem->tungDo 1.4. H畛y v湛ng nh畛 達 xin c畉p ph叩t 畛 h畛y v湛ng nh畛 達 xin c畉p ph叩t, d湛ng to叩n t畛 delete V畛i khai b叩o int* pa = new int; int* pb = new int[5]; C叩ch h畛y t動董ng 畛ng s畉 l delete pa; delete pb[]; Bi t畉p (code m畉u: ConTroCoBan) #include <stdio.h> struct DIEM { int hoanhDo, tungDo; } ; void main() { // khoi tao cac bien gia tri int a = 1; DIEM d; d.hoanhDo = 1; d.tungDo = 2; // khai bao bien con tro va tro den vung nho cua cac bien gia tri da co int *pa = &a; int *pb = pa; DIEM *pd = &d; // xac dinh dia chi o nho: toan tu & printf("Dia chi o nho: %d n", &a); // truy xuat gia tri o nho tu bien con tro: toan tu * printf("Gia tri a: %d n", *pa); // truy xuat thanh phan trong cau truc printf("Diem D: (%d,%d)n", d.hoanhDo, d.tungDo);//doi voi bien gia tri: . printf("Diem D: (%d,%d)n", pd->hoanhDo, pd->tungDo);// doi voi bien con tro: -> } 1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n.
  • 5. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang5 2. N畉u l畛nh int a = 1; 動畛c 畛i thnh int a = 10; Cho bi畉t gi叩 tr畛 c畛a *pa. 3. N畉u d嘆ng int *pa = &a; 動畛c s畛a l畉i thnh int *pa; Cho bi畉t k畉t qu畉 bi棚n d畛ch ch動董ng tr狸nh? Ch動董ng tr狸nh c坦 b叩o l畛i khi th畛c thi kh担ng? N畉u c坦, cho bi畉t t畉i sao l畛i. 4. N畉u tr動畛c d嘆ng printf("Gia tri a: %d n", *pa); ta th棚m d嘆ng code *pb = 2; Cho bi畉t k畉t qu畉 c畛a l畛nh xu畉t printf("Gia tri a: %d n", *pa); Gi畉i th鱈ch t畉i sao c坦 k畉t qu畉 xu畉t nh動 v畉y. 1.5. Con tr畛 v畛i m畉ng (c畉p ph叩t m畉ng 畛ng) C叩ch lm tr動畛c 但y khi kh担ng s畛 d畛ng c畉p ph叩t 畛ng v畛i m畉ng 1 chi畛u int a[100]; // xin 100 担 nh畛 cho m畉ng t畛i a 100 ph畉n t畛 int n; printf("Nhap so luong phan tu: "); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ",i); scanf("%d", &a[i]); } C叩ch lm ny c坦 nhi畛u h畉n ch畉 nh動: c畉p ph叩t th畛a trong tr動畛ng h畛p n nh畉p vo < 100 v kh担ng cho ph辿p n nh畉p vo l畛n h董n m畛t s畛 l動畛ng 畛nh tr動畛c 動畛c ci 畉t trong code (100). 畛 c畉p ph叩t m畉ng 畛ng (s畛 l動畛ng ph畉n t畛 c畉p ph叩t 炭ng b畉ng v畛i n nh畉p vo v kh担ng gi畛i h畉n gi叩 tr畛 n), ta lm nh動 sau int n; printf("Nhap so luong phan tu: "); scanf("%d", &n); //khai bao bien con tro a va xin cap phat vung nho chua n so interger int* a = new int[n]; //dung vong lap de nhap cac gia tri a[i] for (int i = 0; i < n; i++) {
  • 6. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang6 printf("Nhap a[%d]: ",i); scanf("%d", &a[i]); } Sau khai b叩o int* a = new int[n]; m畛t v湛ng nh畛 ch畛a n s畛 nguy棚n s畉 動畛c c畉p ph叩t, con tr畛 a s畉 ch畛 畉n ph畉n t畛 畉u ti棚n c畛a d達y n s畛. C叩c ph畉n t畛 c畛a m畉ng 動畛c truy xu畉t qua to叩n t畛 [] nh動 v畛i m畉ng tr動畛c 但y 達 d湛ng. Bi t畉p (code m畉u: ConTroVoiMang) Nh畉p m畉ng m畛t chi畛u c叩c s畛 nguy棚n d湛ng c畉p ph叩t m畉ng 畛ng. #include <stdio.h> void main() { // MANG 1 CHIEU int n; printf("Nhap so luong phan tu: "); scanf("%d", &n); //khai bao bien con tro a va xin cap phat vung nho chua n so interger int* a = new int[n]; //dung vong lap de nhap cac gia tri a[i] for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ",i); scanf("%d", &a[i]); } printf("a[0] = %dn", a[0]); printf("*a = %dn", *a); //xuat cac gia tri a[i] for (int i = 0; i < n; i++) { printf("a[%d] = %dn",i, a[i]); } } 1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n. 2. Nh畉p vo m畛t vi m畉ng s畛 nguy棚n, nh畉n x辿t v畛 k畉t qu畉 c畛a 2 l畛nh xu畉t sau c叩c l畉n ch畉y. printf("a[0] = %dn", a[0]); printf("*a = %dn", *a); 3. Gi畉i th鱈ch t畉i sao c坦 th畛 r炭t ra k畉t lu畉n 畛 c但u 2. 4. S畛a l畉i o畉n ch動董ng tr狸nh tr棚n 畛 nh畉p vo m畛t m畉ng s畛 nguy棚n v xu畉t ra t畛ng c叩c s畛 trong m畉ng 坦. 5. Vi畉t ch動董ng tr狸nh cho ph辿p nh畉p vo m畛t m畉ng 2 chi畛u c叩c s畛 nguy棚n d湛ng c畉p ph叩t 畛ng. G畛i 箪:
  • 7. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang7 M畉ng 2 chi畛u mxn c叩c s畛 nguy棚n 動畛c khai b叩o nh動 sau int** b = new int*[m]; trong 坦 m畛i b[i] (ki畛u int*) l m畛t m畉ng m畛t chi畛u n s畛 nguy棚n b[i] = new int[n];
  • 8. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang8 2. TRUY畛N THAM S畛: TRUY畛N THAM BI畉N vs TRUY畛N THAM TR畛 Gi畉 s畛 ta c坦 o畉n ch動董ng tr狸nh: void BinhPhuong(int a) { a = a * a; } void main() { int a = 2; BinhPhuong(a); printf(%d, a); } v畛i hm BinhPhuong nh畉n vo 1 tham s畛 ki畛u int v t鱈nh b狸nh ph動董ng c畛a s畛 坦 ( a = a * a). Ta mong mu畛n k畉t qu畉 xu畉t ra l 4. Tuy nhi棚n, th畛c t畉 k畉t qu畉 xu畉t ra l畉i l 2. Gi畉i th鱈ch: Khi g畛i th畛c hi畛n hm Funtciton(a), gi叩 tr畛 c畛a a s畉 動畛c truy畛n cho hm, kh担ng ph畉i l b畉n th但n bi畉n a. Do 坦, d湛 c但u l畛nh a = a * a; 動畛c th畛c hi畛n v gi叩 tr畛 c畛a a trong hm BinhPhuong c坦 thay 畛i nh動ng do ta ch畛 truy畛n gi叩 tr畛 ch畛 kh担ng ph畉i b畉n th但n bi畉n n棚n khi ra kh畛i hm BinhPhuong(), gi叩 tr畛 c畛a bi畉n a khi th畛c hi畛n c但u l畛nh in ra v畉n l 2. C叩ch truy畛n tham s畛 a vo hm BinhPhuong nh動 tr棚n g畛i l c叩ch truy畛n tham tr畛 (ch畛 truy畛n gi叩 tr畛 vo hm, c叩c thao t叩c lm thay 畛i gi叩 tr畛 c畛a bi畉n b棚n trong hm kh担ng 畉nh h動畛ng 畉n gi叩 tr畛 bi畉n khi k畉t th炭c hm). Tuy nhi棚n trong tr動畛ng h畛p ny, ta mu畛n nh畛ng thay 畛i gi叩 tr畛 bi畉n a trong hm BinhPhuong v畉n c坦 t叩c d畛ng khi ra kh畛i hm. Ta s畛a l畉i o畉n ch動董ng tr狸nh tr棚n nh動 sau void BinhPhuong(int& a) { a = a * a; } void main() { int a = 2; BinhPhuong(a); printf(%d, a); } th狸 k畉t qu畉 xu畉t ra l 4. trong 坦 c叩ch khai b叩o void BinhPhuong(int& a) // d湛ng to叩n t畛 & cho bi畉t bi畉n a s畉 動畛c truy畛n theo ki畛u tham bi畉n (truy畛n tr畛c ti畉p bi畉n vo hm, do 坦 nh畛ng thay 畛i gi叩 tr畛 c畛a bi畉n b棚n trong hm s畉 畉nh h動畛ng 畉n gi叩 tr畛 bi畉n k畛 c畉 khi k畉t th炭c hm. Bi t畉p (code m畉u: ThamBien_ThamTri) #include <stdio.h>
  • 9. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang9 struct DIEM { int x, y; }; void TruyenThamTri(int a) { a = a * 10; } void TruyenThamBien(int &a) { a = a * 10; } void ThamTriConTro(DIEM* d) { d->x = d->x * 10; d->y = d->y * 10; } void ThamBienConTro(DIEM* &d, DIEM* p) { d->x = d->x * 10; d->y = d->y * 10; d = p; } void main() { // tham tri, tham bien voi bien du lieu int a = 1, b = 10; printf("a = %dn", a); TruyenThamTri(a); printf("a sau ham TruyenThamTri = %dn", a); TruyenThamBien(a); printf("a sau ham TruyenThamBien = %dn", a); // bien con tro DIEM* d2 = new DIEM; d2->x = 5; d2->y = 5; printf("Diem d2(%d, %d)n", d2->x, d2->y); ThamTriConTro(d2); printf("d2 sau khi goi ham ThamTriConTro: (%d,%d)n", d2->x, d2->y); printf("n"); DIEM* d1 = new DIEM; d1->x = 5; d1-> y = 5; d2->x = 5; d2->y = 5; printf("Diem d2(%d, %d)n", d2->x, d2->y); ThamBienConTro(d2, d1); printf("d2 sau khi goi ham ThamBienConTro: (%d,%d)n", d2->x, d2->y); } 1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n. 2. Cho bi畉t k畉t qu畉 c畛a l畛nh in
  • 10. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang10 printf("a sau ham TruyenThamTri = %dn", a); v printf("a sau ham TruyenThamBien = %dn", a); 3. Cho bi畉t k畉t qu畉 c畛a l畛nh in printf("d2 sau khi goi ham ThamTriConTro: (%d,%d)n", d2->x, d2->y); Nh畉n x辿t gi叩 tr畛 c畛a d2->x v d2->y c坦 b畛 thay 畛i kh担ng? N畉u gi叩 tr畛 c畛a d2->x v d2->y c坦 b畛 thay 畛i, gi畉i th鱈ch t畉i sao khi khai b叩o hm void ThamTriConTro(DIEM* d) bi畉n d truy畛n theo ki畛u tham tr畛 (kh担ng s畛 d畛ng &) nh動ng d2->x, d2->y l畉i b畛 thay 畛i G畛i 箪: d l ki畛u con tr畛. 4. Cho bi畉t k畉t qu畉 c畛a l畛nh in printf("d2 sau khi goi ham ThamBienConTro: (%d,%d)n", d2->x, d2->y); Nh畉n x辿t gi叩 tr畛 c畛a d2->x v d2->y c坦 b畛 thay 畛i kh担ng? N畉u gi叩 tr畛 c畛a d2->x v d2->y kh担ng b畛 thay 畛i, gi畉i th鱈ch t畉i sao khi khai b叩o hm void ThamBienConTro(DIEM* &d, DIEM* p) bi畉n d truy畛n theo ki畛u tham bi畉n (s畛 d畛ng &) nh動ng d2->x, d2->y l畉i kh担ng b畛 thay 畛i G畛i 箪 Thay 畛i d1->x = 5; d1-> y = 5; thnh gi叩 tr畛 kh叩c r畛i quan s叩t k畉t qu畉 c畛a l畛nh in 畛 r炭t ra nh畉n x辿t.
  • 11. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang11 3. NH畉P/XU畉T TRN T畉P TIN VN B畉N 3.1. Nh畉p 畛 畛c m畛t file vn b畉n, c畉n th畛c hi畛n c叩c b動畛c sau B1: #include <stdio.h> // mo file de doc FILE* fi = fopen("input.txt", "rt"); trong 坦 hm fopen nh畉n 2 tham s畛: tham s畛 畉u ti棚n (ki畛u char*) l t棚n file (input.txt), tham s畛 th畛 2 l chu畛i rt (read + text: 畛c d畉ng file vn b畉n) Trong tr動畛ng h畛p mu畛n vi畉t hm 畛c file v truy畛n t棚n file nh動 m畛t tham s畛 vo hm: void DocFile(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); } B2: //doc du lieu int n; fscanf(fi, "%d", &n); d湛ng hm fscanf 畛 畛c d畛 li畛u. C叩ch d湛ng hm fscanf t動董ng t畛 hm scanf (ch畛 kh叩c c坦 th棚m tham s畛 畉u ti棚n ki畛u FILE* l con tr畛 畉n t畉p tin 達 m畛 畛 tr棚n) B3: //dong file fclose(fi); 3.2. Xu畉t T動董ng t畛 v畛i nh畉p d畛 li畛u, ta c滴ng c坦 c叩c b動畛c B1: //mo file de ghi FILE* fo = fopen(tenFile, "wt"); // wt = write (ghi) + text (dang van ban) B2: //ghi du lieu ra file fprintf(fo, "%d ",n); D湛ng hm fprintf() t動董ng t畛 printf() B3: // dong file fclose(fo);
  • 12. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang12 3.3. C叩ch qu畉n l箪 t畉p tin nh畉p/xu畉t trong project c畛a VS2005 Khi lm vi畛c v畛i t畉p tin, ta c畉n ph畉i 畉t t畉p tin 畛 炭ng th動 m畛c 畛 c坦 th畛 debug/th畛c thi ch動董ng tr狸nh. Ta c坦 th畛 s畛 d畛ng VS2005 畛 t畉o t畉p tin txt, VS2005 s畉 t畛 畛ng 畉t file 坦 畛 炭ng th動 m畛c v ta c坦 th畛 qu畉n l箪 file d畛 dng h董n. 畛 t畉o file txt, t畛 c畛a s畛 Solution Explorer, nh畉n chu畛t ph畉i vo Resources Files, ch畛n Add -> New Item Ch畛n Text File (.txt) v g探 t棚n (kh担ng g探 u担i .txt) Sau 坦 g探 n畛i dung t畉p tin. V畛i c叩c file m ta xu畉t k畉t qu畉 ra, ta c滴ng c坦 th畛 th棚m file 坦 vo project 畛 d畛 qu畉n l箪. C叩ch lm t動董ng t畛, nh畉n chu畛t ph畉i vo Resources Files, ch畛n Add -> Existing Item Ch畛n file m ta 達 xu畉t ra. (Xem Demo) Bi t畉p (code m畉u: NhapXuatFile) 畛c t畛 file input.txt m畉ng m畛t chi畛u c叩c s畛 th畛c. T畉p tin input.txt c坦 n畛i dung nh動 sau: - D嘆ng 畉u ch畛a 1 s畛 nguy棚n l s畛 l動畛ng ph畉n t畛 c畛a m畉ng - D嘆ng sau ch畛a c叩c ph畉n t畛 c畛a m畉ng c叩ch nhau b畛i kho畉ng tr畉ng V鱈 d畛: 5 1.2 2.3 3.4 4.5 5.6 #include <stdio.h> void XuatFile(char* tenFile, float* arr, int n) { //mo file de ghi FILE* fo = fopen(tenFile, "wt"); // wt = write (ghi) + text (dang van ban) //ghi du lieu ra file for (int i = 0; i < n; i++) fprintf(fo, "%0.1f ", arr[i]); // dong file fclose(fo);
  • 13. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang13 } void main() { // mo file de doc FILE* fi = fopen("input.txt", "rt"); //doc du lieu int n; fscanf(fi, "%d", &n); float* arr = new float[n]; for (int i = 0; i < n; i++) fscanf(fi, "%f", &arr[i]); //dong file fclose(fi); // in ra man hinh de kiem tra for (int i = 0; i < n; i++) printf("%0.1f ", arr[i]); printf("n"); // xuat ra file XuatFile("output.txt", arr, n); } 1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n. 2. T畉o t畉p tin d畛 li畛u m畛i MSSV.txt thay cho file input.txt. Nh畉p d畛 li畛u cho file MSSV.txt v ch畉y ch動董ng tr狸nh. 3. Xu畉t ra file out_MSSV.txt thay cho file output.txt. Th棚m file output.txt vo project 畛 c坦 th畛 xem k畉t qu畉 xu畉t t畛 Visual Studio thay v狸 ph畉i d湛ng Windows Explorer v Notepad. 3. S畛a l畉i ch動董ng tr狸nh 畛 ch畛 xu畉t ra file c叩c t畉p tin c坦 ch畛 s畛 l畉 c畛a m畉ng. (ch畛 in ra arr[1], arr[3], ) 4. S畛a l畉i ch動董ng tr狸nh 畛 t鱈nh t畛ng c叩c ph畉n t畛 v xu畉t ra file t畛ng 坦. 3.4. 畛c 畉n h畉t file N畉u bi to叩n 畛c m畉ng c叩c s畛 th畛c 畛 tr棚n kh担ng c坦 th担ng tin s畛 l動畛ng ph畉n t畛 th狸 ta s畉 gi畉i quy畉t theo h動畛ng c畛 畛c vo 畉n khi no h畉t file th狸 d畛ng. V畉y ta c畉n ph畉i bi畉t d畉u hi畛u k畉t th炭c file: hm feof() Xem o畉n ch動董ng tr狸nh m畉u sau: 畛c m畛t m畉ng kh担ng bi畉t tr動畛c s畛 l動畛ng c叩c s畛 th畛c v in ra mn h狸nh. void DocHetFile1(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); float temp; while (!feof(fi)) // khi chua ket thuc file { fscanf(fi, "%f", &temp); // doc so thuc vao bien temp printf("%0.1f ", temp); }
  • 14. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang14 printf("n"); fclose(fi); } Trong 坦, ta s畛 d畛ng v嘆ng while v i畛u ki畛n 畛 th畛c hi畛n l ch動a h畉t file: !feof(fi) Hm feof() nh畉n 1 tham s畛 ki畛u FILE* l file ang 畛c v tr畉 v畛 true/false n畉u k畉t th炭c/ch動a k畉t th炭c file. Bi t畉p (code m畉u: NhapXuatFile) #include <stdio.h> void DocHetFile1(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); float temp; while (!feof(fi)) { fscanf(fi, "%f", &temp); printf("%0.1f ", temp); } printf("n"); fclose(fi); } void DocHetFile2(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); float temp; while (!feof(fi)) { if (fscanf(fi, "%f", &temp)>0) printf("%0.1f ", temp); else break; } printf("n"); fclose(fi); } void main() { printf("Doc khi khong biet so luong phan tu, doc den het file thi dung:n"); DocHetFile1("input2.txt"); DocHetFile1("input3.txt"); } Trong 坦 input2.txt c坦 n畛i dung 1.2 2.3 3.4 4.5 5.6 input3.txt c坦 n畛i dung (c坦 1 d畉u kho畉ng tr畉ng 畛 cu畛i file)
  • 15. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang15 1.2 2.3 3.4 4.5 5.6 1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n. 2. Nh畉n x辿t v畛 k畉t qu畉 xu畉t ra mn h狸nh (2 d嘆ng t動董ng 畛ng v畛i 2 file input2.txt v input3.txt). 2 d嘆ng k畉t qu畉 xu畉t ra c坦 gi畛ng nhau kh担ng? 3. N畉u 2 d嘆ng k畉t qu畉 xu畉t ra kh担ng gi畛ng nhau, gi畉i th鱈ch t畉i sao v畛i d畛 li畛u vo nh動 nhau (xem n畛i dung file input2.txt v input3.txt) k畉t qu畉 xu畉t l畉i kh担ng gi畛ng nhau. G畛i 箪: file input3.txt c坦 m畛t d畉u kho畉ng tr畉ng 畛 cu畛i file n棚n 畛 v嘆ng l畉p cu畛i sau khi 畛c 5.6 i畛u ki畛n (!feof(fi)) v畉n tr畉 v畛 炭ng (v狸 h畉t s畛 5.6 ch動a l cu畛i file) . 4. S畛a l畉i 2 d嘆ng DocHetFile1("input2.txt"); DocHetFile1("input3.txt"); thnh DocHetFile2("input2.txt"); DocHetFile2("input3.txt"); v ch畉y l畉i ch動董ng tr狸nh. Nh畉n x辿t k畉t qu畉 xu畉t. T畛 坦 r炭t ra k畉t lu畉n hm no 畛c h畉t file ch鱈nh x叩c h董n. G畛i 箪: Hm DocHetFile2 v DocHetFile1 ch畛 kh叩c nhau 畛 ch畛 hm DocHetFile2 c坦 ki畛m tra l畛nh 畛c s畛 th畛c t畛 file c坦 thnh c担ng hay kh担ng nh動 sau: Hm fscanf() c坦 gi叩 tr畛 tr畉 v畛 l s畛 l動畛ng bi畉n 畛c thnh c担ng if (fscanf(fi, "%f", &temp)>0) 畛 但y ta 畛c 1 bi畉n , do 坦 ch畛 c畉n ki畛m tra gi叩 tr畛 tr畉 v畛 > 0 l 畛c thnh c担ng.
  • 16. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang16 4. 畛 QUY M畛t hm 動畛c g畛i l 畛 quy n畉u b棚n trong th但n c畛a hm 坦 c坦 l畛i g畛i hm l畉i ch鱈nh n坦 m畛t c叩ch t動畛ng minh hay ti畛m 畉n Khi vi畉t hm 畛 quy, c畉n x叩c 畛nh: - i畛u ki畛n d畛ng - C担ng th畛c 畛 quy V鱈 d畛: T鱈nh t畛ng S(n) = 1 + 2 + + n Ta c坦 S(n) = (1 + 2 + + n-1) + n hay S(n) = S(n-1) + n (c担ng th畛c 畛 quy) S(0) = 0 (i畛u ki畛n d畛ng) Ta c坦 ch動董ng tr狸nh t動董ng 畛ng v畛i c担ng th畛c 畛 quy tr棚n nh動 sau: int Tong(int n ) { if (n == 0) return 0; return Tong(n-1) + n; } Bi t畉p (code m畉u: DeQuy) #include <stdio.h> int Tong(int* a, int n) { if ( n == 0) return a[0]; return Tong(a, n-1) + a[n]; } void main() { int n; printf("Nhap n: "); scanf("%d", &n); int* a = new int[n]; for (int i = 0; i < n; i++) { printf("Nhap a[%d] = ",i); scanf("%d",&a[i]); }
  • 17. Ti li畛u h動畛ng d畉n th畛c hnh m担n C畉u tr炭c d畛 li畛u v gi畉i thu畉t HCMUS 2010 Trang17 printf("%dn",Tong(a, n-1)); } 1. Bi棚n d畛ch o畉n ch動董ng tr狸nh tr棚n. 2. Cho bi畉t o畉n ch動董ng tr狸nh tr棚n th畛c hi畛n t叩c v畛 g狸. 3. Vi畉t c担ng th畛c 畛 quy v i畛u ki畛n d畛ng c畛a ch動董ng tr狸nh 畛 quy tr棚n. N畉u ch動董ng tr狸nh 畛 quy kh担ng c坦 i畛u ki畛n d畛ng th狸 i畛u g狸 s畉 x畉y ra? 4. S畛a l畉i ch動董ng tr狸nh 畛 t鱈nh t鱈ch c畛a c叩c ph畉n t畛 c畛a m畛t d達y s畛 nguy棚n b畉ng ph動董ng ph叩p 畛 quy 5. S畛a l畉i ch動董ng tr狸nh 畛 t鱈nh t畛ng c叩c s畛 l畉 c坦 trong m畉ng b畉ng ph動董ng ph叩p 畛 quy