Nguyen DInh Phuong
Bài 12 M ng
M c tiêu:
K t thúc bài h c này, b n có th :ế
S d ng m ng m t chi u
S d ng m ng hai chi u.
Các b c trong bài h c này đ c trình bày chi ti t, rõ ràng và c n th n. Đi u này giúp ta hi u rõ vướ ượ ế
công c l p trình. Th c hi n theo các b c sau th t c n th n. ướ
Ph n I – Trong th i gian 1 gi 30 phút đ u:
12.1 M ng
Các m ng th đ c phân làm hai d ng d a vào chi u c a m ng: M ng m t chi u m ng đa ượ
chi u. Trong bài này, chúng ta s t p trung vào cách t o và s d ng các m ng.
12.1.1 S s p x p m t m ng m t chi u ế
M ng m t chi u có th đ c s d ng đ l u tr m t t p các giá tr có cùng ki u d li u. Xét m t ượ ư
t p đi m c a sinh viên trong m t môn h c. Chúng ta s s p x p các đi m này theo th t gi m ế
d n.
Các b c s p x p m ng m t chi u theo th t gi m nh sau:ướ ế ư
1. Nh p vào s l ng các đi m. ượ
Đ th c hi n đi u này, m t bi n ph i đ c khai báo giá tr c a bi n ph i đ c nh p. l nh ế ượ ế ượ
nh sau:ư
int n;
printf(“\n Enter the total number of marks to be entered : ”);
scanf(“%d”, &n);
2. Nh p vào t p các đi m.
Đ nh p vào t p các giá tr cho m t m ng, m ng ph i đ c khai báo. Mã l nh nh sau, ượ ư
int num[100];
S ph n t c a m ng đ c xác đ nh b ng giá tr đã nh p vào bi n n. n ph n t c a m ng ph i ượ ế
đ c kh i t o giá tr . Đ nh p n giá tr , s d ng vòng l p ượ for. M t bi n nguyên c n đ c khai báo ế ượ
đ s d ng nh là ch s c a m ng. Bi n này giúp truy xu t t ng ph n t c a m ng. Sau đó giá tr ư ế
c a các ph n t m ng đ c kh i t o b ng cách nh n các giá tr nh p vào t ng i dùng. l nh ượ ườ
nh sau:ư
int l;
for(l = 0; l < n; l++)
{
printf(“\n Enter the marks of student %d : ”, l + 1);
scanf(“%d”, &num[l]);
M ng169
King.P
}
các ch s c a m ng luôn b t đ u t 0 nên chúng ta c n kh i t o bi n ế l 0. M i khi vòng l p
đ c th c thi, m t giá tr nguyên đ c gán đ n m t ph n t c a m ng.ượ ượ ế
3. T o m t b n sao c a m ng.
Tr c khi s p x p m ng, t t h n nên gi l i m ng g c. v y m t m ng khác đ c khai báoướ ế ơ ượ
các ph n t c a m ng th nh t có th đ c sao chép vào m ng m i này. Các dòng l nh sau ượ
đ c s d ng đ th c hi n đi u này:ượ
int desnum[100], k;
for(k = 0; k < n; k++)
desnum[k] = num[k];
4. S p x p m ng theo th t gi m d n. ế
Đ s p x p m t m ng, các ph n t trong m ng c n ph i đ c so sánh v i nh ng ph n t còn l i. ế ượ
Cách t t nh t đ s p x p m t m ng, theo th t gi m d n, ch n ra giá tr l n nh t trong m ng ế
và hoán v v i ph n t đ u tiên. M t khi đi u này đ c th c hi n xong, giá tr l n th hai trong ượ
m ng có th đ c hoán v v i ph n t th hai c a m ng, ph n t đ u tiên c a m ng đ c b qua ượ ượ
đã ph n t l n nh t. T ng t , các ph n t c a m ng đ c lo i ra tu n t đ n khi ph n ươ ượ ế
t l n th n đ c tìm th y. Trong tr ng h p m ng c n s p x p theo th t tăng d n giá tr l n ượ ườ ế
nh t s đ c hoán v v i ph n t cu i cùng c a m ng. ượ
Quan sát d m t dãy s đ hi u đ c gi i thu t. Hình 12.1 trình bày m t m ng s nguyên c n ượ
đ c s p x p.ượ ế
10 40 90 60 70
Hình 12.1: M ng num v i ch s i (5 ph n t )
Đ s p x p m ng này theo th t gi m d n, ế
a. Chúng ta c n tìm ph n t l n nh t hoán v nó vào v trí ph n t đ u tiên. Xem nh đây ư
l n th c hi n th nh t. Đ đ a giá tr l n nh t v v trí đ u tiên, chúng ta c n so sánh ph n t th ư
nh t v i các ph n t còn l i. Khi ph n t đang đ c so sánh l n h n ph n t đ u tiên thì hai ph n ượ ơ
t này c n ph i đ c hoán v . ượ
Kh i đ u, l n th c hi n đ u tiên, ph n t ví trí th nh t đ c so sánh v i ph n t v trí th ượ
hai. Hình 12.2 bi u di n s hoán v t i v trí th nh t.
40 10 90 60 70
Hình 12.2: Đ o v trí ph n t th nh t v i ph n t th hai
Ti p đó, ph n t th nh t đ c so sánh v i ph n t th ba. Hình 12.3 bi u di n s hoán v gi aế ượ
ph n t th nh t và ph n t th ba.
170 L p trình c b n C ơ
num
i=0 i=4
i=0 i=4
num
10
40
Nguyen DInh Phuong
90 10 40 60 70
Hình 12.3 Đ o v trí ph n t th nh t v i ph n t th ba
Quá trình này đ c l p l i cho đ n khi ph n t th nh t đ c so sánh v i ph n t cu i cùng c aượ ế ượ
m ng. M ng k t qu sau l n th c hi n đ u tiên đ c trình bày trong hình 12.4 bên d i. ế ư ướ
90 40 10 60 70
Hình 12.4: M ng sau l n th c hi n đ u tiên
b. B qua ph n t đ u tiên, chúng ta c n tìm ph n t l n th hai hoán v v i ph n t th
hai c a m ng. Hình 12.5 bi u di n m ng sau khi đ c th c hi n l n hai. ượ
90 70 10 60 40
Hình 12.5: M ng sau l n th c hi n th hai
c. Ph n t th ba ph i đ c hoán v v i ph n t l n th ba c a m ng. Hình 12.6 bi u di n m ng ượ
sau khi hoán v ph n t l n th ba.
90 70 60 10 40
Hình 12.6: M ng sau l n th c hi n th ba
d. Ph n t th t ph i đ c hoán v v i ph n t l n th t c a m ng. Hình 12.7 bi u di n m ng ư ượ ư
sau khi hoán v ph n t l n th t . ư
90 70 60 40 10
Hình 12.7: M ng sau l n th c hi n th t ư
e. nh 12.7 cũng bi u di n m ng đã đ c s p x p. ượ ế
Đ l p trình cho bài toán này, chúng ta c n hai vòng l p, m t đ tìm ph n t l n nh t trong m ng
và m t vòng l p kia đ l p quá trình th c hi n n l n. Th c ch t quá trình ph i l p n-1 l n cho m t
ph n t c a m ng b i ph n t cu i cùng s không còn ph n t nào đ so sánh v i nó. v y,
chúng ta khai báo hai bi n i j đ thao tác v i hai vòng l p ế for. Vòng l p for v i ch s i đ c ượ
dùng đ l p l i quá trình xác đ nh ph n t l n nh t trong ph n còn l i c a m ng. Vòng l p for v i
ch s j đ c dùng đ tìm ph n t l n th i c a m ng trong các ph n t t ph n t th i+1 đ n ượ ế
ph n t cu i cùng c a m ng. Theo cách đó, ph n t l n th nh t th i trong ph n còn l i c a
m ng s đ c đ a vào v trí th i. ượ ư
Đo n mã l nh khai báo ch s và vòng l p th c hi n n - 1 l n v i i nh là ch s : ư
int i,j;
for(i = 0; i < n - 1; i++)
{
M ng171
num
i=0 i=4
num
i=0 i=4
num
i=0 i=4
num
i=0 i=4
i=0 i=4
num
40
90
King.P
Đo n mã l nh cho vòng l p t ph n t th i + 1 đ n ph n t th n c a m ng: ế
for(j = i + 1; j < n; j++)
{
Đ hoán v hai ph n t trong m ng chúng ta c n s d ng m t bi n t m. B i đây th i đi m ế
m t ph n t c a m ng đ c sao chép thành m t ph n t khác, giá tr trong ph n t th hai s b ượ
m t. Đ tránh m t giá tr c a ph n t th hai, giá tr c n ph i đ c l u l i trong m t bi n t m. ượ ư ế
Đo n mã l nh đ hoán v ph n t th i v i ph n t l n nh t trong ph n còn l i c a m ng là:
if(desnum[i] < desnum[j])
{
temp = desnum[i];
desnum[i] = desnum[j];
desnum[j] = temp;
}
}
}
Các vòng l p for c n đ c đóng l i v y hai d u ngo c đóng xu t hi n trong đo n l nh ượ
trên.
5. Hi n th m ng đã đ c s p x p. ượ ế
Ch s i có th đ c dùng đ hi n th các giá tr c a m ng nh các câu l nh trình bày bên d i: ượ ư ướ
for(i = 0; i < n; i++)
printf("\n Number at [%d] is %d", i, desnum[i]);
Theo cách đó các ph n t c a m t m ng đ c s p x p. Hãy xem ch ng trình hoàn thi n d i ượ ế ươ ướ
đây.
1. G i trình so n th o mà b n có th vi t ch ong trình C. ế ư
2. T o m t t p tin m i.
3. Đ a vào mã l nh sau:ư
void main()
{
int n;
int num[100];
int l;
int desnum[100], k;
int i, j, temp;
printf("\nEnter the total number of marks to be entered : “);
scanf(“%d”, &n);
clrscr();
for (l = 0; l < n; l++)
{
printf(“\n Enter the marks of student %d : ”, l + 1);
scanf(“%d”, &num[l]);
}
for(k = 0; k < n; k++)
desnum[k] = num[k];
172 L p trình c b n C ơ
Nguyen DInh Phuong
for(i = 0; i < n - 1; i++)
{
for(j = i + 1; j < n; j++)
{
if(desnum[i] < desnum[j])
{
temp = desnum[i];
desnum[i] = desnum[j];
desnum[j] = temp;
}
}
}
for(i = 0; i < n; i++)
printf("\n Number at [%d] is %d", i, desnum[i]);
}
Đ xem k t qu , th c hi n theo các b c li t kê d i đây: ế ướ ướ
4. L u t p tin v i tên arrayI.C.ư
5. Biên d ch t p tin, arrayI.C.
6. Th c thi ch ng trình, arrayI.C. ươ
7. Tr v trình so n th o.
Ví d v k t qu th c thi c a ch ng trình trên đ c trình bày trong hình 12.8 và 12.9. ế ươ ượ
Hình 12.8: K t qu xu t I c a arrayI.C - Nh p vào các giá trế
Hình 12.9 : K t qu xu t II c a arrayI.C – Xu t ra các giá trế
12.1.2 C ng ma tr n s d ng các m ng hai chi u
M ng173