Một số bài tập về mảng 1 chiều - 2 chiều


CÁC BÀI TP V MNG 1 CHIU VÀ 2 CHIU
BÀI TP 1
Nhp vào mt s n (5<=n<=10) và n phn t ca dãy a, 1<ai<100 (có kim tra d liu khi nhp).
a)      In ra các phn t là s nguyên t ca dãy.
b)      Tính ước chung ln nht ca tt c các phn t ca dãy.
c)       Tính biu thc sau:
d)      Sp xếp dãy tăng dn và in ra dãy sau sp xếp.
HƯỚNG DN
Ta nên chia chương trình thành các chương trình con, mi chương trình thc hin mt yêu cu. Ngoài ra ta cũng viết thêm các hàm kim tra nguyên t, hàm mũ, hàm UCLN để thc hin các yêu cu đó.
Chương trình như sau:
Khai báo d liu:
us­es crt;
var n : in­te­ger;
      a : ar­ray[1..10] of in­te­ger; {n<=10 nên mng có ti đa 10 phn t}
Th tc nhp d liu, có kim tra khi nhp.
pro­ce­dure nhap;
var i : in­te­ger;
be­gin
            clrscr;
            write('NHAP VAO SO PHAN TU N = ');
            re­peat
                        readln(n);
                        if (5<=n) and (n<=10) then break; {nếu thoã mãn thì dng vòng lp}
                        writeln('Khong hop le (5<=n<=10). Nhap lai!!!'); {ngược li thì báo li}
            un­til false;
            writeln('NHAP VAO N PHAN TU (1<ai<100)');
            for i := 1 to n do be­gin
                        write('a',i,'=');
                        re­peat
                                    readln(a[i]);
                                    if (1<a[i]) and (a[i]<100) then break;
                                    writeln('Khong hop le. Nhap lai!!!');
                        un­til false;
            end;
end;
func­tion ng­to(n : in­te­ger): boolean; {hàm kim tra nguyên t, xem gii thích phn trên}
var i : in­te­ger;
be­gin
            ng­to := false;
            if n < 2 then ex­it;
            for i := 2 to round(sqrt(n)) do
                        if n mod i = 0 then ex­it;
            ng­to := true;
end;
Th tc in các s nguyên t ca mt mng
pro­ce­dure in­ng­to;
var i :in­te­ger;
be­gin
            writeln('CAC PHAN TU NGUYEN TO TRONG DAY:');
            for i := 1 to n do                                     {duyt qua mi phn t t 1 đến n}
                        if ng­to(a[i]) then writeln(a[i]);                 {nếu ai là nguyên t thì in ra}
end;
func­tion UCLN(a,b: in­te­ger): in­te­ger;
var r : in­te­ger;
be­gin
            while b<>0 do be­gin
                        r := a mod b;
                        a := b;
                        b := r;
            end;
            UCLN := a;
end;
Th tc tính UCLN ca các phn t ca mt mng
pro­ce­dure Tin­hUC;
var i,u : in­te­ger;
be­gin
            u := a[1];                                               {u là UCLN ca các phn t t 1 đến i}
            for i := 2 to n do u := UCLN(u,a[i]);        {là UCLN ca các phn t t 1 đến i-1 và ai}
            writeln('UCLN cua ca day la:',u);                      
end;
func­tion ham­mu(a : re­al; n : in­te­ger): re­al; {hàm mũ tính an}
var s : re­al; i : in­te­ger;
be­gin
            s := 1;
            for i := 1 to n do s := s * a;
            ham­mu := s;
end;
Th tc tính tng các phn t có ly mũ:
pro­ce­dure tong;
var s : re­al; i : in­te­ger; {s phi khai báo là s thc để tránh tràn s}
be­gin
            s := 0;
            for i := 1 to n do s := s + ham­mu(a[i],i); {s := s + (ai)i}
            writeln('Tong can tinh:',s:10:0);
end;
Th tc sp xếp tăng dn các phn t ca mt mng:
pro­ce­dure sx­ep;
var i,j,tg : in­te­ger;
be­gin
            for i := 1 to n-1 do
                        for j := i + 1 to n do
                                    if a[i] > a[j] then be­gin
                                                tg := a[i]; a[i] := a[j]; a[j] := tg;
                                    end;
            writeln('DAY SAU KHI SAP XEP TANG DAN:');
            for i := 1 to n do writeln(a[i]);
end;
Chương trình chính: ln lượt gi tng th tc
BE­GIN
            nhap;
            in­ng­to;
            tin­huc;
            tong;
            sx­ep;
END.
BÀI TP 2
Tìm phn t nh nht, ln nht ca mt mng (cn ch ra c v trí ca phn t).
HƯỚNG DN
Gi s phn t min cn tìm là phn t k. Ban đầu ta cho k=1. Sau đó cho i chy t 2 đến n, nếu a[k] > a[i] thì rõ ràng a[i] bé hơn, ta gán k bng i. Sau khi duyt toàn b dãy thì k s là ch s ca phn t min. (Cách tìm min này đơn gin vì t v trí ta cũng suy ra được giá tr).
pro­ce­dure tim­min;
var i, k : in­te­ger;
be­gin
            k := 1;
            for i := 2 to n do
                        if a[k] > a[i] then k := i;
            writeln('Phan tu nho nhat la a[',k,']=',a[k]);
end;
Tìm max cũng tương t, ch thay du so sánh.
pro­ce­dure tim­max;
var i, k : in­te­ger;
be­gin
            k := 1;
            for i := 2 to n do
                        if a[k] < a[i] then k := i;
            writeln('Phan tu lon nhat la a[',k,']=',a[k]);
end;
Chú ý:
1. Nếu áp dng vi mng 2 chiu thì cũng tương t, ch khác là để duyt qua mi phn t ca mng 2 chiu thì ta phi dùng 2 vòng for. Và v trí mt phn t cũng gm c dòng và ct.
Ví d 1. Tìm phn t nh nht và ln nht ca mng 2 chiu và đổi ch chúng cho nhau:
pro­ce­dure ex­change;
var i,j,i1,j1,i2,j2,tg : in­te­ger;
be­gin
            i1 := 1; j1 := 1; {i1,j1 là v trí phn t min}
            i2 := 1; j2 := 1; {i2,j2 là v trí phn t max}
            for i := 1 to m do
                        for j := 1 to n do be­gin
                                    if a[i1,j1] > a[i,j] then be­gin {so sánh tìm min}
                                                i1 := i; j1 := j;     {ghi nhn v trí min mi}
                                    end;
                                    if a[i2,j2] < a[i,j] then be­gin {so sánh tìm max}
                                                i2 := i; j2 := j; {ghi nhn v trí max mi}
                                    end;
                        end;
            tg := a[i1,j1]; a[i1,j1] := a[i2,j2]; a[i2,j2] := tg; {đổi ch}
end;
2. Nếu cn tìm phn t ln nht / nh nht hoc sp xếp 1 dòng (1 ct) ca mng 2 chiu thì ta cũng coi dòng (ct) đó như 1 mng 1 chiu. Chng hn tt c các phn t trên dòng k đều có dng ch s là a[k,i] vi i chy t 1 đến n (n là s ct).
Ví d 2. Tìm phn t ln nht ca dòng k và đổi ch nó v phn t đầu dòng.
pro­ce­dure tim­max(k : in­te­ger);
var i, vt, tg : in­te­ger;
be­gin
            vt := 1; {vt là v trí ca phn t min dòng k}
            for i := 1 to n do
                        if a[k,i] > a[k,vt] then vt := i; {các phn t dòng k có dng a[k,i]}
            tg := a[k,1]; a[k,1] := a[k,vt]; a[k,vt] := tg;
end;
Ví d 3. Sp xếp gim dn ct th k.
pro­ce­dure sapx­ep(k: in­te­ger);
var i,j,tg : in­te­ger;
be­gin
            for i := 1 to m-1 do {mi ct có m phn t, vì bng có m dòng}
                        for j := i+1 to m do
                                    if a[i,k] > a[j,k] then be­gin {các phn t ct k có dng a[i,k]}
                                                tg := a[i,k]; a[i,k] := a[j,k]; a[j,k] := tg;
                                    end;
end;
BÀI TP 3
Tìm các phn t tho mãn 1 tính cht gì đó.
HƯỚNG DN
Nếu tính cht cn tho mãn là cn kim tra phc tp (chng hn: nguyên t, hoàn thin, có tng ch s bng 1 giá tr cho trước…) thì ta nên viết mt hàm để kim tra 1 phn t có tính cht đó không. Còn tính cht cn kim tra đơn gin (chn / l, dương / âm, chia hết, chính phương…) thì không cn.
Sau đó ta duyt qua các phn t t đầu đến cui, phn t nào tho mãn tính cht đó thì in ra.
Ví d 1. In ra các s chính phương ca mt mng:
Để kim tra n có chính phương không, ta ly căn n, làm tròn ri bình phương và so sánh vi n. Nếu biu thc sqr(round(sqrt(n))) = n là true thì n là chính phương.
Vy để in các phn t chính phương ta viết:
     for i := 1 to n do be­gin
         if sqr(round(sqrt(a[i]))) = a[i] then writeln(a[i]);
Ví d 2. In ra các s hoàn thin t 1 đến n:
Để kim tra s có hoàn thin ta dùng hàm tng ước (đã có phn đầu).
     for i := 1 to n do be­gin
         if tongus(i) = i then writeln(i);
Ví d 3. In ra các phn t ca mng chia 3 dư 1, chia 7 dư 2:
     for i := 1 to n do be­gin
         if (a[i] mod 3=1) and (a[i] mod 7=2) then writeln(a[i]);
Ví d 4. In ra các s có 3 ch s, tng ch s bng 20, chia 7 dư 2.
Ta dùng hàm tng ch s đã có trên:
     for i := 100 to 999 do be­gin {duyt qua mi s có 3 ch s}
         if (tongcs(i)=20) and (i mod 7=2) then writeln(i);
Chú ý: Nếu áp dng vi mng 2 chiu thì cũng tương t, ch khác là để duyt qua mi phn t ca mng 2 chiu thì ta phi dùng 2 vòng for.
Ví d, để in các phn t nguyên t ca 1 mng 2 chiu:
     for i := 1 to m do be­gin
     for j := 1 to n do be­gin
         if ng­to(a[i,j]) then writeln(a[i,j]);
BÀI TP 4
Nhp và in mng 2 chiu dng ma trn (m dòng, n ct).
HƯỚNG DN
Để nhp các phn t ca mng 2 chiu dng ma trn, ta cn dùng các lnh sau ca unit CRT (nh phi có khai báo us­er crt đầu chương trình).
Go­toXY(a,b): di chuyn con tr màn hình đến v trí (a,b) trên màn hình (ct a, dòng b). Màn hình có 80 ct và 25 dòng.
whereX: hàm cho giá tr là v trí ct ca con tr màn hình.
whereY: hàm cho giá tr là v trí dòng ca con tr màn hình.
Khi nhp 1 phn t ta dùng lnh readln nên con tr màn hình s xung dòng, do đó cn quay li dòng ca bng lnh Go­toXY(j * 10, whereY -1 ), nếu ta mun mi phn t ca ma trn ng vi 10 ct màn hình.
pro­ce­dure nhap;
var i,j : in­te­ger;
be­gin
            clrscr;
            write('Nhap m,n =  '); readln(m,n);
            for i := 1 to m do be­gin
                        for j := 1 to n do be­gin
                                    write('A[',i,',',j,']=');  readln(a[i,j]); {nhp xong thì xung dòng}
                                    go­toXY(j*10,whereY-1); {di chuyn v dòng trước, v trí tiếp theo}
                        end;
                        writeln; {nhp xong 1 hàng thì xung dòng}
            end;
end;
Để in bng dng ma trn thì đơn gin hơn, vi mi dòng ta s in các phn t trên 1 hàng ri xung dòng:
pro­ce­dure in­bang;
var i,j : in­te­ger;
be­gin
            for i := 1 to m do be­gin                           {viết các phn t ca hàng i }
                        for j := 1 to n do write(a[i,j]:6);    {mi phn t chiếm 6 ô để căn phi cho thng ct và không khít nhau}
                        writeln; {hết 1 hàng thì xung dòng}
            end;
end;

Không có nhận xét nào:

Đăng nhận xét