ơ ả Ấ Ấ Ể ậ Ị Các bài t p Pascal  c  b n, KINH ĐI N, khó, R T KHÓ & R T THÚ V

ệ ở ầ ặ (Đ c bi ầ  ph n GRAPHIC và ph n GRAPH THEORY ) t

Ơ Ả

PH N I­

CÁC BÀI TOÁN C  B N.

A/ L P TRÌNH KHÔNG DÙNG C U TRÚC NÀO.

ỉ ượ ạ ớ 1­Ch  đ ơ c dùng phép nhân, tính a mũ 28 v i không h n 6 phép nhân (khi Test, b n nên cho a=2)

{Tinh a mu 28 chi dung khong hon 6 phep nhan} Uses crt; var a,b:longint; Begin clrscr;    Write('Nhap a='); Readln(a);          a:=a*a;

a:=a*a; Writeln('a mu 4=',a);

b:=a; {luu a mu 4 vao b}          a:=a*a*a; Writeln('a mu 12=',a);          a:=a*a;  Writeln('a mu 24=',a);          a:=a*b; Writeln('a mu 28=',a);  Readln End.

sau: Sách ToanA1 250000, Sách Ly 100000, Sách Anh van 150000, ự ẵ 2­ Cho s n xâu ký t Sach Mach IC 80000.

Ế Ủ ố ề Ạ ạ ậ ổ ộ ượ Hãy in lên màn t ng s  ti n bán các lo i sách thu c xâu nh p vào trên đây. H N CH  C A BÀI TOÁN:  Không đ c dùng phép gán sau

ặ ươ ự ể ề ổ ng t khác đ  tính t ng ti n Tongsotienbansach:=250000+100000+150000+80000 ho c các phép gán t bán!

Uses crt; Const s='GiaiTich2  250000, Vatly1  100000, Anh2  150000, MachIC  80000'; Var   so1,so2,so3,so4:longint;k1,k2,k3,k4:integer; Begin      Clrscr;     Writeln('Xau cho truoc:',s);     val('250000',so1,k1); val('100000',so2,k2); val('150000',so3,k3);     val('80000',so4,k4);     Writeln('=  =  =  =  =  =  =  =  =  =  =  =  =');     Write('Tong so tien ban cac loai sach:',so1+so2+so3+so4);     Readln; End.

ế

Th y Tr n Thông Qu

2

ố ọ ừ bàn phím vào. ề ử ờ ớ ồ ử ệ ộ ự ể ế ủ t c a hs v  cách dùng toán t gán đ ng th i v i toán t quan h  trong m t ấ ỳ ấ 3­Không dùng b t k  c u trúc nào, hãy so sánh hai s  đ c t ể (Bài này ki m tra s  hi u bi ệ dòng l nh).

Uses crt; Var a,b:integer; check1,check2,check3:Boolean; Begin clrscr;   Write('a,b:'); Readln(a,b);   check1:=a>b; check2:=a 0) Then            Nhuan:=False;      End;     Case thang Of        1,3,5,7,8,10,12:songay:=31;               4,6,9,11:songay:=30;                      2:If nhuan Then                            songay:=29                        Else                            songay:=28;    End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

3

Writeln;    Writeln('Thang ',thang:2,'/',nam:4,' co:',songay,' ngay');    Writeln;    Writeln('Bam phim  de ket thuc');    Readln End.

ọ ừ ố ự ị ủ ủ ộ ộ bàn phím vào 4 s  th c mà tr  c a chúng thu c kho ng ị ả  [­3,0, 3,0]. Tính tr  trung bình c ng c a 5­ Đ c t chúng.

Test   Vào     ­3    2    1.85    ­1.05;  Ra: Tong=­0.20; Trung binh cong=­0.4

Uses crt;         Var  s1,s2,s3,s4,tbc,t:Real; d:byte;         Begin  clrscr;               Write('s1,s2,s3,s4=');readln(s1,s2,s3,s4);               tbc:=0;t:=0;d:=0;                   If (s1>=­3.0) and (s1<=3.0) then                      Begin                         Inc(d);                         t:=t+s1;                      End;                   If (s2>=­3.0) and (s2<=3.0) then                      Begin                         Inc(d);                         t:=t+s2;                      End;                   If (s3>=­3.0) and (s3<=3.0) then                      Begin                         Inc(d);                         t:=t+s3;                      End;                   If (s4>=­3.0) and (s4<=3.0) then                      Begin                         Inc(d);                         t:=t+s4;                      End;                      tbc:=t/d;         Writeln('Tong cua cac so trong khoang [­3.0,3.0]=',t:0:2);             Write(' va Trung binh cong cua chung =',tbc:0:2);         Readln;        End.

ộ ươ ị ứ ớ ị ng l ch, in lên màn hình tên năm âm l ch  ng v i năm ọ ừ  bàn phím vào m t năm d ậ ừ

ậ 6­ L p trình đ c t ị ươ ng l ch v a nh p vào. d ụ Ví d . vào:2016, ra: Bính Thân.

Uses crt;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

4

Var Year:integer; Begin clrscr;      Write('Cho biet nam duong lich:'); Readln(Year);      Write('Nam ',year,' la nam am lich:');      Case (Year Mod 10) of           0:Write('Canh ');           1:Write('Tan ');           2:Write('Nham ');           3:Write('Quy ');           4:Write('Giap ');           5:Write('At ');           6:Write('Binh ');           7:Write('Dinh ');           8:Write('Mau ');           9:Write('Ki ');      End;

Case (Year Mod 12) of           0:Write('Than');           1:Write('Dau');           2:Write('Tuat');           3:Write('Hoi');           4:Write('Ty');           5:Write('Suu');           6:Write('Dan');           7:Write('Mao');           8:Write('Thin');           9:Write('Ti');           10:Write('Ngo');           11:Write('Mui');      End;    Readln; End.

ậ ế ố ươ ứ ấ ỳ ọ ừ ủ ố ậ 7­ L p trình cho bi t s  La Mã t ng  ng c a s  th p phân b t k  đ c t bàn phím vào.

ụ Ví d  vào: 2017; ra:MMXVII.

Write('Nhap so Thap phan can chuyen:'); Readln(n);

Program ThapPhan_LaMa;     uses crt;     var n:integer; ans:char;     Begin clrscr;     Repeat              Write(n,' ­­­> Viet theo chu so La ma la:');          While n>=1000 do             Begin Write('M');

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

5

Begin

n:=n­1000;             End;             If n>=900 then                                  Write('CM');                     n:=n­900;                 End;             If n>=500 then             Begin                  Write('D');                  n:=n­500;             End;             If n>=400 then             Begin                  Write('CD');                  n:=n­400;             End;            If n>=100 then             Begin                  Write('C');                  n:=n­100;             eND;            If n>=90 then             Begin                  Write('XC');                  n:=n­90;             End;            If n>=50 then             Begin                  Write('L');                  n:=n­50;             End;            If n>=40 then             Begin                  Write('XL');                  n:=n­40;             End;             If n>=20 then             Begin                  Write('XX');                  n:=n­20;             End;            If n>=10 then             Begin                  Write('X');                  n:=n­10;             End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

6

If n=9 then             Begin                  Write('IX');                  n:=n­9;             End;             If n>=7 then             Begin                  Write('VII');                  n:=n­7;             End;            If n>=5 then             Begin                  Write('V');                  n:=n­5;             End;            If n=4 then             Begin                  Write('IV');                  n:=n­4;             End;            If n=3 then             Begin                  Write('III');                  n:=n­3;             End;            If n=2 then             Begin                  Write('II');                  n:=n­2;             End;             If n=1 then             Begin                  Write('I');                  n:=n­1;             End;  Writeln;           Writeln;           Write('      ANOTHER TEST (Y/N)?'); Readln(ans);       Until Ans In ['n','N'];      End.

ậ ế ố ươ ứ ủ ố ọ ừ C C A BÀI 7). L p trình cho vi ậ t s  Th p Phân t ng  ng c a s  La Mã đ c t ƯỢ Ủ 8­ (BÀI TOÁN NG ụ bàn phím vào.. Ví d . vào: MMXVII, ra: 2017.

Ơ (BÀI NÀY KHÓ H N BÀI TRÊN)

Program LaMa_ThapPhan; Uses crt; Var s:string;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

7

Procedure Nhap; Begin     Writeln;     Write('Nhap vao so Lama:'); Readln(s); End;

Function GtriThphan(s:string; i:integer):Integer; Var x:integer;    Function Val(c:char):Integer;    Begin        Case c of          'M','m':Val:=1000;          'D','d':Val:=500;          'C','c':Val:=100;          'L','l':Val:=50;          'X','x':Val:=10;          'V','v':Val:=5;          'I','i':Val:=1;          Else  Val:=0;        End;     End; Begin    x:=val(s[i]);    If i=Length(s) Then GtriLama:=x    Else If x

Begin {Main Prog.}   Clrscr;   Nhap;   Write('Gia tri thap phan cua so La ma vua nhap=',gtriThphan(s,1));   Readln End.

(Các bài khó: *;  Các bài r t khó: **)

Ặ Ấ B2­CÁC C U TRÚC L P.

Ặ Ệ Ị B.2.1) L NH L P XÁC Đ NH FOR.

ế ữ ỉ ượ ế ắ ộ ộ c phép dùng m t bi n n a là bi n Logic đ  l p trình ướ ả ứ ể ế i bài toán d ự ể ậ i đây: không tính toán c  th , hãy so sánh 2 bi u th c sau: (1+1/2016) ^ 2017 và ự ể 9­ Ngoài 2 bi n th c (Real) b t bu c, b n ch  đ gi (1+1/2017)^2016. (ký t ạ ụ ể ừ  “^” hi u là lũy th a)

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

8

Uses crt; Var a,b:Real; i:integer; check:Boolean; Begin    clrscr;     a:=1+1/2016; b:=1;     For i:=1 to 2016 Do         Begin             a:=a*(1+1/2016);             b:=b*(1+1/2017);         End;         check:=(a>b);     If check then Write('(1+1/2016) mu 2017 lon hon (1+1/2017) mu 2016')     Else        Begin            check:=(a=b);            If check then Write('(1+1/2016) mu 2017 bang (1+1/2017) mu 2016')            Else                Write('(1+1/2016) mu 2017 nho hon (1+1/2017) mu 2016');         End;      Readln; End.

ề ế ả ậ ơ ử ầ ạ ỉ ậ ả 10­ Không dùng thu t toán x  lý m ng 2­chi u, ch  dùng các bi n đ n, l p trình in lên màn hình b ng  ượ ố ự ứ ziczac ch a 100 s  t  nhiên đ u tiên (B n có làm đ c bài này trong 10 phút không?)

0 1 2 3 4 5 6 7 8 9  10 11 12 13 14 15 16 17 18 19  ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­  90 91 92 93 94 95 96 97 98 99

Ắ Ơ Ể ƯỚ KHÔNG TH  CÓ CODE NÀO NG N H N CODE D I ĐÂY!

Uses crt; Var i,j:Byte; Begin clrscr;     For i:=0 to 9 do       begin          For j:=0 to 9 do             Write(10*i+j:4);             Writeln;       end;    Readln; End.

ự ế ạ ạ ả ỗ ượ '*', l p trình t o tam giác cân r ng. In k t qu  lên màn hình. (B n có làm đ c bài này ậ 11­ Dùng ký t trong 10 phút không?)

Uses   Crt; Var chcao,i: Byte; Begin clrscr;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

9

Write('Nhap chieu cao tam giac:');  Readln(chcao);    Writeln('*':chcao);    For i:=2 to chcao­1 do      Writeln('*':chcao­i+1,'*':2*i­2);      For i:=1 to 2*chcao­1 do         Write('*');         Writeln;         Writeln;     Readln; End.

ậ ộ ể ứ ự ấ ậ ộ ố ố ố ế ổ ừ ướ 12­ Nh p m t dãy s  nguyên t ằ ti p có t ng b ng s  M cho tr bàn phím vào, l p trình tìm trong dãy  y b  (không k  th  t ) 3 s  liên  c.

Uses Crt; Var a:array[1..1000] of integer;     n,i,j,k,M:integer; Begin clrscr;     Writeln;     Write(#32:2,'M='); Readln(M);     Write('n='); Readln(n);     For i:=1 to n do         Begin             Write('a[',i,']='); Readln(a[i]);         End;     Writeln('Cac bo so trong day thoa man yeu cau bai toan la:');     For i:=1 to n do        For j:=1 to n­1 do            For k:=j+1 to n do                if (i<>j) and (i<>k) and (j<>k) and (a[i]+a[j]+a[k]=M) then                  Writeln(a[i]:3,a[j]:3,a[k]:3)    Readln; End.

ấ ả ả ủ ố ọ ừ ố ấ ế ả t c  các s  hoàn h o c a s  n tùy ý đ c t ầ  bàn phím vào. Yêu c u xu t k t qu  theo

ẳ ậ 13­ L p trình tìm t Form sau: ạ Ch ng h n, Vào: 1200,

Ra:

ả ứ ấ ướ ủ c c a nó là: 1 2 3

S  hoàn h o th  nh t: 6 Và các  = = = = = = = = = = = = = = = = =  ứ ả S  hoàn h o th  hai: 28 ướ ủ Và các  c c a nó là: 1 2 4 7 14 = = = = = = = = = = = = = = = = =  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

10

Uses crt; Var i,j,n,tong_uoc,dem:longint; tt:byte; Begin   clrscr;    Repeat       Write('Nhap so nguyen duong n:'); Readln(n);       dem:=0;       For i:=1 to n Do           Begin            tong_uoc:=0;               For j:=1 to i­1 Do                   If(i MOD j=0) Then  tong_uoc:=tong_uoc+j;                   If tong_uoc=i Then                   Begin                       dem:=dem+1;                       Writeln('* So hoan hao thu ', dem,' la:',i);                       Write('* va cac uoc so cua no la:');                       For j:=1 to i­1 Do                          If (i MOD J=0) Then Write(j,' ');                       Writeln;                       Writeln('=  =  =  =  =  =  =  =  =');                       Writeln;                   End;             End;      Write('More (1/0)?. Come On ­> Press 1; Stop ­> Press 0:');      Readln(tt);    Until tt=0; End.

ọ ố ự Ẵ ớ ể ể ề ả ế Snhirenman: “M i s  t ơ  nhiên CH N l n h n 2 đ u có th  bi u Ổ thi ủ ả ế ỉ t ứ  – N a đ u t Goldbach – ố ế Christian Goldbach – nhà toán h c Đ c ọ ố ẻ ấ ỳ ề ế ố t: “M i s  l b t k  đ u vi t đ ề ử ầ  th  k  XVIII ế ượ ướ ạ c d ả ể *14­ Ki m tra gi Ố ằ ễ di n b ng T NG c a HAI  s  NGUYÊN T ”. ọ (Gi   thi Euler, Goldbach vi ố t ủ i d ng t ng c a ba s  nguyên  t Goldbach) ơ ế

ọ ố ẵ ể ể ả ư ử   , năm 1742 trong th  g i ổ ế 1930, nhà toán h c ọ Nga L.  ề ế “M i s  ch n n ≥ 4 đ u có th  bi u c g i là bài toán Goldbach (hay gi  thi ư ượ c ch ng minh, và cho đ n năm  ợ ườ  thi ứ ỏ ủ ng h p nh  c a gi t: ỉ ứ ố ễ ổ ố ượ ọ ệ  “. Sau này m nh đ  đó đ ẫ H n 250 năm bài toán Goldbach v n ch a đ ớ G. Snhirenman m i ch  ch ng minh tr ủ di n thành t ng c a 2 s  nguyên t ”).

Uses crt; Var so1, so2, so3, so4: integer;      kt1, kt2: boolean; {kt=kiem tra}      hoi:char;

Begin clrscr;   Repeat     Write(‘Nhap so chan so1>2:’); Readln(so1);     so2:=2;     Repeat 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

11

so3:=so1­so2;        so4:=2;        While (so4<=sqrt(so2)) And (so2 Mod so4<>0) do          Inc(so4);          If so4>sqrt(so2) then kt1:=true Else kt1:=false;          so4:=2;

While (so4<=sqrt(so3)) And (so3 Mod so4<>0) do          Inc(so4);          If so4>sqrt(so3) then kt2:=true Else kt2:=false;          Inc(so2);     Until (so3<=2) Or (kt1 and kt2);     If kt1 and kt2 then Write(‘GIA THIET GOLDBACH DUNG.’)     Else Write(‘GIA THIET GOLDBACH SAI.’);     Writeln;     Write(‘Another test (y/n)?’); Readln(hoi);   Until hoi In [‘N’, ‘n’]; End.

ớ ệ ấ ả t c  các s  Mersenne nh  h n m t s  t nhiên N cho tr ố c (v i n>=3)­Các s t kê t ố ự ộ ố ự ọ ố ố i d ng 2 ỏ ơ n – 1 (n­s  t ướ  nhiên) g i là s  Mersenne­ ễ ượ ướ ạ c d bi u di n đ

*15­ Tìm và li ố ể nguyên t uses Crt; Var so, n, i, ntmin:longint;         check, stop: Boolean; tt:Byte;

Begin clrscr;     Repeat           Write(‘Nhap n>=3:’); Readln(n);           stop:=false;           ntmin:=2;           Writeln(#32:20,’CAC SO MERSENNE:’);           While Not stop Do              Begin                i:=2;                While (i<=sqrt(ntmin)) And (ntmin MOD i<>0) Do                    Inc(i);                   If i>sqrt(ntmin) then check:=true Else check:=false;                   If check then                       Begin                          so:=1;                          For i:=1 to ntmin do so:=2*so;                            Dec(so,1);                            i:=2;                            While (i<=sqrt(so)) And (so MOD i<>0) do Inc(i);                            If i>sqrt(so) then check:=true                            Else check:=false;                            stop:=so>n;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

12

If check and Not stop  Then                               Writeln(so);                        End;                        Inc(ntmin);                    End;             Writeln;        Write(‘Another Test (1/0)?, Come on ­) press 1; Stop ­> press 0:’);           Readln(tt);       Until tt=0; End.

ớ ộ ệ ậ ậ ướ 16­ Không dùng thu t toán đ  quy, l p trình tìm và in lên màn dãy FIBONACI v i đ  dài cho tr c n.

Program Day_Fibo; Uses crt; Var i,n,f1,f2,fi,fi_1,fi_2:Integer; Begin  clrscr;      Write(‘Nhap do dai day Fibonaci n=’); Readln(n);      Writeln(‘  DAY FIBONACI UNG VOI DO DAI ‘,N,’ LA:’);      Writeln;      i:=1; f1:=1;f2:=1;            fi:=f1+f2;         Write(f1:3, f2:3);         For i:=3 to n Do              Begin                   Write(fi:5);                   f1:=f2;                   f2:=fi;                   fi:=f1+f2;              End;   Readln; End.

ướ ố ọ ừ ớ ố ậ Ệ ấ ủ c s  chung l n nh t c a N s  tùy ý đ c t bàn phím vào. 17­ L p trình (PHI Đ  QUY) tìm   Test. Vào: 72   40   24   48   56,  Ra:  8

Uses Crt; Var a:Array[1..100] of integer;     n,i,tt: Byte; d: Integer;

Ẫ ẽ ạ Ữ Ệ Ự Ộ ẽ ơ b n nên dùng PHÁT SINH D  LI U NG U NHIÊN T  Đ NG, s  nhanh h n!}

Begin Clrscr;  {Có l   Repeat     {Randomize;}     Write(‘ Nhap so luong cac so hang n:’); Readln(n);     For i:=1 to n Do       Begin          Write(‘a[‘,i,’]=’); Readln(a[i]);       End; {a[i]:=Random(20);} 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

13

Writeln(‘Day so vua nhap:’);        For i:= 1 to n Do  Write(a[i]:3);     Writeln;     Writeln(‘= = = = = = = = = = = = = = =’);     For i:=1 to n­1 do        Repeat            d:=a[i];            a[i]:=a[i+1] MOD a[i];            a[i+1]:=d;        Until a[i]=0;     Write(‘USC max cua ‘,n,’ so vua nhap la:’,a[n]); Writeln;     Write(‘More(1/0)? Continue ­ > 1, Stop ­> 0:’); Readln(tt);   Until tt=0; End.

ươ ươ ệ 18­ Tìm nghi m nguyên d ủ ng c a ph ng trình sau:

ọ ừ ớ a) 4x+3y­9z=n, v i 0  ≤ x, y, z ≤ 50; n­ đ c t bàn phím vào.

ặ ướ ị ủ ề ệ ươ ủ ươ Không áp đ t tr c mi n giá tr  c a x, y, z hãy tìm nghi m nguyên d ng c a các ph ng trình sau:

ọ ừ bàn phím vào.

ọ ừ b) x + y + z = n ; n­ đ c t c) x2  +  y2  =  n; n­ đ c t bàn phím vào.

5 Bài a)

Uses Crt; Var x,y,z,n,d:integer;

Begin   clrscr;     Write(‘Nhap n:’); Readln(n);     d:=0;     For x:=0 to 50 do       For y:=0 to 50 do          For z:=0 to 50 do             If ((4*x+3*y­9*z)=n) then             Begin                Writeln(x:4,y:4,z:4);                Inc(d);                If (d MOD 20)=0 then                Begin                  Write(‘Go ENTER ­> xem tiep.’);                  Readln;                End;             End; End.

ạ Các bài còn l ư i làm t ong t ự .

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

14

ậ ạ ộ ớ ả   19­ L p trình t o b ng ba c t   GÓC       ứ ị SIN           COS, tính giá tr  hàm Sin, Cos  ng v i góc

o đ n 360

o nên yêu c u m i l n ch  hi n lên màn 20 giá tr  k t qu , đ   ả ể

ế ỗ ầ ỉ ệ ị ế ầ ừ c t c n trái. (Vì có t góc 0 Ế ở ộ ậ XEM TI P: gõ phím ENTER.)

Uses Crt; Var goc:word; gocradian: Real;

Begin  clrscr;     Writeln(#32:9,’BANG GIA TRI  GOC,     SIN,     COS:’);     Writeln(‘ Nho an ENTER de xem tiep.’);     For goc:=1 To 360 Do        Begin            gocradian:=goc*pi/180;            Writeln(#32:24,goc,#32:5,sin(gocradian):0:4,#32:3,cos(gocradian):0:4);            If (goc MOD 20) = 0 then Readln;        End; End.

Ặ Ệ Ị B.2.2) CÁC L NH L P KHÔNG XÁC Đ NH (WHILE. . .DO; REPEAT…UNTIL)

ậ ả L p trình gi i các bài toán sau:

ầ ố ố ớ 20­ Tính g n đúng v i sai s  10^­6 (1/1000000): s  Pi;  sinx;  cosx;  e^x.

ầ ố a) Tính g n đúng s  PI.

Program tinhgandung_So_Pi; Uses Crt; Const  ss=1E­6 Var sp: Real; n, dau: integer; Begin clrscr;      n:=0;      sp:=0;     While (1/(2*n+1))>=ss  do           Begin                 If  n MOD 2 = 0 then dau:=1                 Else dau:=­1;                 sp:=sp+dau*(1/(2*n+1));                 n:=n+1;     End;      Write(‘Gia tri gan dung cua so Pi=’,4*sp:8:4);    Readln; End.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

15

3

Ố Ạ Ầ Ứ Ọ Ồ Ở   b) TÍNH G N ĐÚNG SINX B I CÔNG TH C TRUY H I RÚT G N CÒN 1 S  H NG

(cid:0) x sin n x n *( +   1)

ờ ừ ể ầ ầ ở ọ ơ ị đây c n hi u ng m có đ n v  đo là Radian (Trong m i Program ắ ố ố ể ớ ộ ố Ơ Ờ

L i nh c không th a: + Đ i s  x trong các hàm sin, cos  ư ộ ư ố    đ  nó nh  m t h  s ). Ắ + và có L I NH C QUAN TR NG H N: Hãy test program v i b  s  sau:  ặ            x=0  ho c x=3.1416 (= Ọ (cid:0) ) sinx=0; x=1.5708 (=(cid:0) /2)  sinx=1; x=4.7124 (=3(cid:0) /2) sinx=­1

ầ ả ơ

ị và trong đ u luôn có hình  nh Vòng Tròn Đ n V :   Uses Crt; Const ss=1E­6; Var x,S,T: Real; n: Integer;  hd:char;

Begin    Clrscr;   Repeat     Write(‘Nhap vao cung x (Radian)cua ham Sin:’);     Readln(x);     S:=x; T:=x; n:=0;     While ABS(T)>=ss Do        Begin           n:=n+2;           T:=­T*SQR(x)/(n*(n+1));           S:=S+T;        End;     Write(‘Sin(x)=’,S:0:6);     Writeln;     Write(‘More (y/n)? Come on ­> Press y; Stop ­> Press n:’);     Readln(hd);   Until hd In [‘n’,’N’]; End.

2

Ạ ƯƠ HAI HÀM CÒN L I LÀM T Ự Ể NG T ! Đ  Ý:

x

(cid:0) - x cos 1 + x n n ( *( 1)

+ (cid:0) e 1 x n

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

16

nhiên ra các ừ ố 21­ Phân tích m t s  t th a s  nguyên t ộ ố ự ố .

Program Thua_so_nguyen_to;  {Repeat và While l ng nhau}         Uses crt;         Var n,i:longint;         Begin clrscr;               Write(‘n=’);Readln(n);               Writeln(‘Cac thua so nguyen to cua ‘,n,’ la:’);               Repeat               i:=2;                   While (n Mod i<>0) AND (i

ả ử ố s  dân s  Vi ố  bình quân tăng dân s  hàng năm là 3/1000. ỷ ệ t Nam năm 2017 là 96 tri u dân và t  l ạ ệ Ấ ế Ớ ệ ệ 22­ Gi ố ướ Tính xem S M NH T đ n năm nào thì dân s  n c ta đ t 110 tri u dân.

Uses Crt; Const tyle=0.003; Var ds:Real; nam: Integer; Begin   clrscr;    Write(‘Nhap dan so hien tai:’); Readln(ds);    nam:=2017;    While (ds<=110*1E+6) Do      Begin           Inc(nam);          ds:=ds*(1+tyle);      End;    Write(‘Som nhat den nam ‘,nam,’ dan so nuoc ta dat 110 trieu dan.’);    Readln; End.

ươ ố ữ ố ủ ố ữ ố ế ủ ề ổ ơ c s  nguyên d ng n có nhi u h n 1 ch  s . Đ m s  ch  s  c a s  đó và tính t ng c a ướ ố ạ ẳ 23­ Cho tr chúng. Ch ng h n, vào: 9876543, ra: 7 và 42

Uses crt; Var  n,dem,tong:Longint;

Begin   clrscr;     Write(‘Nhap so nguyen duong nhieu hon 1 chu so:’);     Readln(n);     tong:=0; dem:=0;     While n>0 Do       Begin          Inc(dem); 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

17

tong:=tong+n MOD 10;          n:=n DIV 10;       End;    Writeln(‘Tong cac chu so cua so vua nhap:’,tong);    Writeln(‘So cac chu so cua so vua nhap=’,dem);    Readln; End.

ự ệ ằ ừ 24­ Th c hi n phép chia b ng phép tr .

Program Chia_la_tru; Uses crt; Var Sobichia, Sochia,Thuong, du:Longint; hoi:char; Begin    clrscr; REPEAT    Write(‘Nhap Sobichia:’) ; Readln(Sobichia);    Write(‘Nhap Sochia<=Sobichia:’) ; Readln(Sochia);    Thuong:=0;        While (Sochia<=Sobichia) Do             Begin                    Sobichia:=Sobichia­sochia;                    thuong:=thuong+1;             End;               du:=Sobichia;     Writeln(‘Thuong=’,Thuong);     Writeln(‘So du=’,du);     Writeln;     Write(‘Another Test (y/n)?:’);   Readln(hoi); UNTIL hoi In [‘n’,’N’]; End.

ậ ả ượ ộ ố ươ Ệ ướ ữ ố ề ơ c m t s  nguyên d ng (PHI Đ  QUY) cho tr ụ c có nhi u h n 1 ch  s . Ví d 25­ L p trình đ o ng vào 2017, ra: 7102.

ố ế ượ t ng c}

USES CRT; Var sovng, n, dv:longint; Begin clrscr;   Write(‘n=’); Readln(n);       sovng:=0;       While (n>0) do       Begin           dv:=n MOD 10;           sovng:=10*sovng+dv;   {sovng=s  vi           n:=n DIV 10;       End;    Write(‘So viet nguoc lai la:’,sovng);  Readln;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

18

End.

ố ớ ươ ướ ậ ờ ướ ố ấ ủ c s  chung l n nh t c a hai s  nguyên d ng cho tr c nh  thu t toán Euclide:

26­ Tìm  26.1) Dùng phép trừ 26.2) Dùng phép chia

ĐÁP:

26.1)  Uses crt; Var a,b,d:integer; Begin clrscr;    Write(‘Nhap 2 so nguyen duong:’); Readln(a,b);    While (a­b<>0) Do            Begin                   if a>b then a:=a­b                   else b:=b­a;            End;    Write(‘Uscmax=’,b);  Readln; End.

26.2) Uses crt; Var a,b,du:integer; Begin clrscr;    Write(‘Nhap 2 so nguyen duong:’); Readln(a,b);    While (b<>0) Do    Begin           du:=a Mod b;           a:=b;           b:=du;    End;    Write(‘Uoc so chg max=’,a);    Readln; End.

ươ ọ ừ ữ ố ớ ố ừ ậ ấ ị ng N (N>1). Tìm ch  s  l n nh t trong s  v a nh p và v ố ừ ộ ố ệ bàn phím vào m t s  nguyên d ả ế

*27­ Đ c t ậ ủ trí c a nó trong s  v a nh p. Hi n k t qu  lên màn.   Program Tim_Chuso_Max; uses crt; Var so,i,max,temp,vitri:longint;

BEGIN Clrscr;       write(‘Nhap so :’); readln(so);       writeln(‘Trong so ‘,so,’ vua nhap ‘);       max:=0;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

19

i:=1;       while (so<>0) do            Begin                   temp:=so mod 10;                   if temp>max then                        Begin                            max:=temp;                            vitri:=i;                        End;                     i:=i+1;                     so := so div 10;           End; Write(‘ thi chu so ‘, max,’ la chu so lon nhat va nam o vi tri thu ‘,vitri);        Write(‘ ke tu ben phai sang.’);       readln; END.

ệ ụ sinh đôi mà ướ ố ự c s  t nhiên N (ví d  100). Tìm & hi n lên màn t ặ ố ấ ả t c  các c p s  nguyên t ố ơ ơ ố ố ố ị  sinh đôi là hai s  h n kém nhau 2 đ n v )

*28­ Cho tr ị ủ giá tr  c a chúng không quá N. ( Hai s  nguyên t Uses crt; Var so1, so2, so3, so4, n, dem: longint;      kt1, kt2: boolean; {kt=kiem tra} Begin clrscr;   Write(‘Nhap so tu nhien n:’); Readln(n);   Writeln(‘Cac cap so sinh doi < n:’);   For so1:=2 to n­2 do      Begin         so4:=2;           While (so4<=sqrt(so1)) And (so1 MOD so4<>0) do              Inc(so4);              If so4>sqrt(so1) then                  Begin                      so2:=so1;                      so3:=so2+2;                      so4:=2;           While (so4<=sqrt(so3)) And (so3 Mod so4<>0) do Inc(so4);                If so4>sqrt(so3) then                Begin                  Inc(dem);                  Writeln(dem,’:’,’(‘,so2,’,’,so3,’)’);                End;           End;       End;      Readln; End.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

20

ỏ ơ ớ ả ố ố ỏ ố ủ ỉ ố ơ ể ườ ườ   i ỗ ố ậ ư ộ *29­ Trên bàn có 26 viên s i. Ng ỗ ầ ch i v i máy tính. M i l n, m i đ i th  ch  b c không h n 4 viên. Đ i th  nào ph i b c viên s i cu i  ế i  đi tr cùng là thua. Tìm m t chi n thu t ch i đ  ng ủ ơ ướ c nh ng luôn luôn thua máy tính.

PROGRAM BOCSOI; uses crt;   VAR     TONG_SOI,I,SOI_CON,N:INTEGER;ch:char;   BEGIN     REPEAT        clrscr;     I:=1;     TONG_SOI:=26;       REPEAT       WRITELN(‘LAN BOC THU ‘,I,’:’);          WRITE(‘     BAN BOC MAY VIEN (khong qua 4 vien): ‘);READLN(N);             WRITELN(‘    MAY BOC: ‘,5­N);{WRITELN(5­N);}             WRITELN(‘    SO SOI CON LAI:= ‘,TONG_SOI­(5*i)); {WRITELN(TONG_SOI­(5*i));}

SOI_CON:=TONG_SOI­(5*i);           I:=I+1;       UNTIL SOI_CON =1;         WRITELN(‘BAN PHAI BOC VIEN CUOI CUNG. BAN THUA ROI!’);         writeln;      write(‘     Tiep khong (c/k):’);readln(ch);    UNTIL (ch=’k’) OR (ch=’K’);   END.

ấ ả ệ ị ủ t c  các c p s  thân thi n mà giá tr  c a chúng không quá 10000. (Hai s  đ ặ ố ƯỚ Ủ Ố Ớ Ằ ặ ố Ố ụ ố ượ c  Ỏ C C A S  L N B NG S  NH : ví d  48 và 75 là c p s  thân ệ ổ ướ *30­ Tìm và in lên màn t ế Ổ ệ ọ g i là thân thi n n u T NG CÁC  ớ ủ thi n vì các u c c a 75 là: 3   5   15   25 và t ng các ằ c này b ng 48!)

Uses Crt; Var n1,n2,t,k: Integer; tt:Byte;

Begin Clrscr;    Repeat       Writeln(#32:20,’Cac cap so Than Thien <10000:’);       Writeln(#32:20,’= = = = = = = = = = = = = =’);       For n1:=1 to 10000 do          Begin             t:=0;             k:=2;             While (k<=(n1 DIV 2)) And (t<=10000) do                Begin                   If (N1 mod k=0) Then t:=t+k;                   inc(k);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

21

End;             If (t>0) and (t<=10000) Then                Begin                   n2:=t; t:=0;                   k:=2;                   While (k<=(n2 Div 2)) And (t<=n1) do                     Begin                        If (n2 mod k=0) then t:=t+k;                        Inc(k);                     End;                   If t=n1 then Writeln(#32:30,’(‘,n1,’,’,n2,’)’);                End;              End;            Writeln(‘DONE!’);            Write(‘More?(1/0),Continue ­> 1, Stop ­> 0:’); Readln(tt);            Until tt=0; End.

k  *31­ (LU  TH A NHANH. INFORMATIC OLYMPIC MOSCOW 1980). Nh p c  s  a và mũ k. Tính a ượ ế ớ ạ v i h n ch : Không đ c dùng liên ti p k phép nhân ( vì  ầ k c c l n và m c tiêu đ u bài là tính NHANH!)

Ỹ Ừ ậ ơ ố ế ượ ừ ứ c dùng công th c tính lũy th a, cũng không đ ự ớ ụ

PROGRAM NANGNHANH_LUYTHUA;

Uses Crt; VAR a, b : Real; k, n : integer;  hoi: char; BEGIN  Clrscr;   Repeat     Write('a,k= '); Readln(a,k);     Write(a,' mu ',k,' = ');       b:=1;       While k>0 do         Begin              n:=k div 2;              If (n+nPress c; Stop­>Press k:');      Readln(hoi);    Until hoi='k'; END.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

22

ệ ơ ố ượ ế ế ố t trong h  c  s  2 theo tr t t ệ ậ t trong h  th p phân c vi c l ậ ượ ớ c vi ị ủ ậ ự ượ ạ i. S  nh n đ  ng ạ ẳ ị c coi là giá tr  c a hàm B(m). Hãy tính giá tr  hàm B(m) ch ng h n v i m=512 ; 513; 514;…; 1024. *32­ (Đ O BIT. INFORMATIC OLYMPIC MOSCOW 1983)  ố S  nguyên m đ ượ đ

PROGRAM DaoBit; {chay voi m=513} VAR m, b, k: integer; BEGIN     k:=513;     m:=1;     Writeln(m);      While m<1024 do            begin                  while m>=k do                        begin                            m:=m­k;                            k:=k div 2;                       end;                       m:=m+k;                      k:=513;                   Writeln(m);            end; Readln; END.

ứ ấ ả ố ự ỏ ơ ướ ố ự c s  t nhiên n. Hàm Eul(n) ch a t t c  các s  t nhiên nh  h n n và ớ cùng nhau v i n. Tính hàm Eul(n).

33. (Hàm Euler Eul(n)). Cho tr ố nguyên t Uses Crt; Var n, ham_Eul,i,a,b,r: integer; Begin clrscr;            Write('Nhap n:'); Readln(n);             ham_Eul:=0;             For i:=1 to (n­1) do                   Begin                         a:=i;                         b:=n;                        While b<>0 do                               Begin                                      r:= a MOD b;                                      a:=b;                                      b:=r;                              End;                        If a=1 then Inc(ham_Eul);                   End;                Write('Gia tri ham Euler=:',ham_Eul);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

23

Readln; End.

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

PH N IIẦ

.  L P TRÌNH THEO MODUL

ể ậ ơ ủ ụ

ể Trong Pascal có hai Modul đ  ta l p trình Đ n Th . Âý là: * Procedure (Th  T c). * (và) FUNCTION (Hàm)

ủ ậ ệ ắ ấ ầ ệ ả t các em c n chú ý và n m th t v ng b n ch t 3 khái ni m sau c a l p trình Modul: ậ ữ ế ụ ộ ụ ệ ề

ậ ng cách truy n data trong l p trình Modul c a Pascal:

ươ ề ề ề ị ế ặ Đ c bi ế a­Bi n toàn c c (Global Var.) và bi n c c b  (Locate Var.) ế b­Các khái ni m v  tham chi u ủ c­Hai ph c1. Truy n theo Tham Tr  (Transfer By Value Parameters) c2. Truy n theo Tham Bi n (Transfer By Variable Parameters)

ị ạ ướ ế Ể Ị Ế c h t các b n hãy “khai v ” 3 “món” sau ( 3 MÓN “KHAI V ” NÀY KI M TRA XEM CÁC B N  Ệ Ạ ể Ọ Ồ ỉ Ể ấ Ậ ệ ể ạ ự ạ ả ủ ỉ ế ả ấ ỉ ỉ i thích t  m  k t qu ! ƯỢ Ớ Ễ Ị Tr CÓ HI U Đ N T N NG N NGU N CÁC KHÁI NI M a); b) ; c); d) nêu trên không. Vì ch  khi hi u rõ  ơ ậ ớ th c ch t 4 khái ni m đó, b n m i hòng l p trình đ n th  th o): ế Không RUN program, ch  dùng bút ghi k t qu  c a 3 program sau đây lên gi y + gi BA BÀI “KHAI V ” NÀY KHÔNG D  ĐÂU! NH : KHÔNG Đ ả C RUN PROGRAM NHÉ!!!

1. Program Transf_By_Val;   Uses Crt; Var so1, so2:integer; Procedure Transf_Val(x, y:integer); Begin        Writeln(' Ben trong thu tuc:');        x:=x+15;        y:=y+15;        Writeln('X=',x);        Write('Y=',y); End; Begin {Main Prog.)         Writeln('Co che truyen data theo THAM TRI:');         Write('Nhap so thu nhat so1='); Readln(so1);         Write('Nhap so thu hai so2='); Readln(so2);         Transf_Val(so1, so2);         Writeln;         Writeln('Ben ngoai thu tuc(tuc la sau truyen Data):');         Writeln('Bay gio so thu 1 so1=',so1);         Writeln('Bay gio so thu 2 so2=',so2);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

24

Writeln('Go ENTER de stop!'); Readln; End.

2. Program Transf_By_Vari_Para; Uses Crt; Var so1, so2:integer;

Procedure Transf_By_Vari_Para(Var x, y:integer); Begin       Writeln('Trong than thu tuc:');        x:=x+15;        y:=y+15;       Writeln(' Tham so X=', x);       Writeln(' Tham so Y=', y); End; BEGIN {Main Prog.}           Writeln('Co che truyen Data theo THAM BIEN:');           Write('Nhap so thu nhat so1='); Readln(so1);           Write('Nhap so thu hai so2='); Readln(so2);           Writeln('Sau khi truyen Data (tucla ben ngoai thu tuc):');           Writeln('Bay gio so1=',so1);           Writeln('Bay gio so2=',so2); Writeln; Write(' Go ENTER de Stop!'); Readln; END.

3. Program Obser_Transf_Data; Uses Crt; Var a, b: integer; Procedure Obser(Var x, y:Integer); Begin          Write(x:3, y:3);           x:=2;           x:=x+1;            y:=2*x; End; BEGIN {Main Prog.} Clrscr;           a:=4; b:=5;           Write('Cac gia tri a, b:', a,'; ',b);            Writeln;           Obser(a,b);           Writeln('Cac gia tri a, b:',a,'; ',b);           Obser(b,a);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

25

Writeln('Cac gia tri b, a:',b,'; ',a); Readln; END.

ạ ể Ự Ệ ƯỚ Ạ ợ ự ệ Ủ ơ ả I.) th c thi 3 phép tính c  b n (H p, Hi u, Giao) c a hai ế ả Ạ Ể Ế Ở Ạ Ế ệ Ư Ở Ề      2 MODUL: CÁCH THAM CHI U KHÁC NHAU (T I SAO?); CÁCH DÙNG CÁC Ậ ơ ọ ậ 4. L p trình đ n th  (B n ch n FUNCTION hay PROCEDURE LÀ VI C C A B N. HÃY T  SUY  ủ ƯỚ C LÚC XEM ĐÁP ÁN BÊN D NGHĨ TR ướ ợ ậ t p h p cho tr c. Hi n k t qu  lên màn. Ắ BÀI NÀY NG N, NH NG KHÁ HAY VÌ NÓ CHO B N NHI U HI U BI T: 1. CÁCH KHAI BÁO  Ầ Đ U PROGRAM;  Ệ Ở L NH MODUL NH P VÀ MODUL INRA…

Uses Crt; Type Kytu='!'..'}'; Tapkytu=Set of Kytu; Var A,B,C,D,E: Tapkytu;

Procedure Nhap(Var x:Tapkytu); Var kt: Char; Begin         Read(kt);         While kt<>#13 Do                 Begin                       x:=x+[kt];                      Read(kt);                     End; End;

Procedure Inra(Y: Tapkytu); Var kt: Char; Begin          For kt:='!' to '}' Do         If kt In Y then Write(kt:3); End;

{main Prog.} Begin clrscr;             A:=[]; B:=[]; C:=[]; D:=[]; E:=[];              Write('Nhap cac phan tu cua tap A (Ngung, go ENTER:'); Nhap(A);             Write('Nhap cac phan tu cua tap B (Ngung, go ENTER:'); Nhap(B);             C:=A+B;             D:=A*B;               E:=A­B;               Write('Hop cua 2 tap vua nhap C=A+B='); Inra(C); Writeln;               Write('Giao cua 2 tap vua nhap D=A*B='); Inra(D); Writeln;                Write('Hieu cua 2 tap vua nhap E=A­B='); Inra(E); Writeln; Readln; End.

ọ ừ ế ố ấ ể ố ươ ng ươ ủ ố ự ươ ố *5. Đ c t ố ằ không (S  b ng bình ph ố  bàn phím vào s  nguyên d ươ ng c a s  t ộ ng n. Vi ọ  nhiên khác g i là s  chính ph t m t hàm ki m tra xem s   y có là s  chính ph ng).

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

26

Uses Crt; Var n:longint; tt:byte;

Function chphuong_check(var k:longint):boolean; Begin          If Sqrt(k)=Trunc(Sqrt(k)) then chphuong_check:=true          Else chphuong_check:=false; End;

Begin     clrscr;       Repeat           Write('Nhap so nguyen n:'); Readln(n);           If chphuong_check(n) then Write(n,' la so chinh phuong.')           Else Write(n,' khong phai la so chin phuong.');          Writeln;          Write('More (1/0)?, Continue ­> press 1, Stop ­> press 0:');          Readln(tt); Until tt=0; End.

ố ế ể ố ố ấ t m t hàm ki m tra xem s   y có là s  hoàn h o không ướ ủ ươ ể ả ơ ng n. Vi ị ọ ộ ố ả ẳ ạ ả ố ả c c a nó k  c  đ n v , g i là s  hoàn h o,. Ch ng h n 28 là s  hoàn h o vì

ọ ừ  bàn phím vào s  nguyên d *6. Đ c t ổ ố ằ (s  b ng t ng các  28= 1 + 2 + 4 + 7 + 14).  Uses Crt; Var n:longint;

Function Hhao_Check(var k:longint):Boolean; Var i,sum:longint; Begin         sum:=0;         For i:=1 to k DIV 2 do              If n MOD i=0 then sum:=sum+i;              If sum=n then Hhao_Check:=true              Else Hhao_Check:=false; End;

Begin    clrscr;        Write('n='); Readln(n);        If Hhao_Check(n) then Write(n,' la so hoan hao.')        Else Write(n,' khong la so hoan hao.');        Readln; End.

Ể Ể Ạ Ặ ụ ế ự ự ờ ọ Ế ả ở Ố Ự Ự ƯỢ ƯỢ Ộ Ế C Ứ ố Ể CÓ TH  B N KHÔNG Đ  Ý HO C KHÔNG HI U: Trong 2 bài 28 & 29, bi n Toàn c c và Tham s   Ặ Ụ  Main Program luôn luôn ph i dùng BI N TOÀN C C HO C  Th c s  là trùng nhau (n). L i g i hàm  Ụ C DÙNG BI N C C B  OR KHÔNG Đ THAM S  TH C S  (NGHĨA LÀ: KHÔNG Đ Ố DÙNG THAM S  HÌNH TH C).

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

27

ố bàn phím vào s  nguyên ố ấ ể ộ ố ố ế t m t hàm ki m tra xem s   y có là s  nguyên t không.

ọ ừ 7. Đ c t ươ ng n. Vi d USES CRT; Var n ,d,i: Integer;

Function ktnt:Boolean; Begin      d:=0;      For i:=2 to n­1 do          If n mod i=0 then d:=d+1;          If(d=0) and (n>1) then ktnt:=True          Else ktnt:=False; End;

BEGIN      CLRSCR;            Write(#32:5,'Nhap n = '); Readln(n);            If ktnt then                    Writeln(#32:9,n,' la so nguyen to.')           Else Writeln (#32:9,n,' khong phai la so nguyen to.');          Readln; END.

Ể Ể Ể Ế Ử Ớ Ể ƯỜ Ạ Ặ Ể Ủ Ả NG) HO C LÀ CHAR (ĐàCÓ LÚC NHÀO B N TH  V I KI U Ư Ứ Ữ Ể Ấ (CÁC HÀM KI M TRA TRÊN ĐÂY, KHÔNG NH T THI T PH I CÓ KI U BOOLEAN. KI U C A  NÓ CÓ TH  LÀ BYTE (TH CHAR CHO NH NG HÀM CÓ CH C NĂNG KI M TRA CH A?)

ọ ừ ộ ố ươ ể ộ ố ọ ố ấ ố ứ ng, ki m tra xem s   y có đ i x ng không. M t s  đ c xuôi, ụ ư ượ ề 8. Đ c t ọ đ c ng bàn phím vào m t s  nguyên d ố ố ứ c đ u nh  nhau là s  đ i x ng. Ví d  123454321.

ƯỚ Ắ Ơ Ấ Ắ Ể CODE D I ĐÂY LÀ NG N NH T, KHÔNG TH  NG N H N.

Uses crt; var n,m,tam:longint; tt:byte; Begin clrscr;      Repeat         Write('Nhap n:'); Readln(n);         m:=0; tam:=n;         While (tam>0) Do              Begin                   m:=m*10+tam MOD 10;                   tam:=tam DIV 10;              End;              If m=n then Write('So vua nhap la so Doi xung.')              Else Write('So vua nhap Khong la so Doi xung.');          Writeln;          Write('Another Test (1/0)?. Come on­>Press 1; Stop­> Press 0:');          Readln(tt);         Until tt=0; End.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

28

ậ ễ ể ộ ố ầ ổ ố ự nhiên LIÊN TI P khác. Yêu c u xu t: ng b ng t ng c a n s  t ố ự ế ằ ạ Ế ễ ượ ằ ể ổ c b ng t ng 2 s  t ấ  nhiên liên ti p.

ố ự ổ ễ ượ ằ ể ố c b ng t ng c a 8 s  t ế    nhiên liên ti p.

ế ễ ượ ằ ố ự ủ ể ổ nhiên liên ti p. **9. L p trình bi u di n m t s  nguyên ủ ươ d ẳ Ch ng h n: Vào 4, ra: 4 không bi u di n đ                    Vào 100, ra: 100=9+10+11+12+13+14+15+16  ủ                                    S  100 bi u di n đ                    Vào 5, ra: 5=2+3 ố                    S  5 bi u di n đ c b ng t ng c a 2 s  t

Ả Ố Ớ BÀI NÀY KHÁ KHÓ Đ I V I HS VÀ C  SINH VIÊN!

uses crt; Const max=10000; Var n,i,dem:Longint; a:array[1..max] of Longint;

Function Check(m:Longint):boolean; Var stop,kt:Boolean; kd,bd,t:Longint;

Begin      stop:=False;      kt:=False;      kd:=0;      While Not Stop do           Begin               bd:=kd;dem:=0;               t:=0;              If bd>=(m+1) DIV 2 then stop:=true              Else                    Begin                          While t

Var tt:Byte; Begin     clrscr;        Repeat               Repeat                   Write('Nhap so duong n='); Readln(n); 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

29

If n<0 then Writeln(' Nhap lai  n>=0');              Until n>=0;           If Check(n) then                    Begin                            Write(n,'=');                            For i:=1 to dem­1 do

Write(a[i],'+');                                Writeln(a[dem]);                                Write('So ',n,' bieu dien duoc thanh');                               Write(' tong cua ',dem,' so tu nhien lien tiep!');                    End           Else                  Begin                          Write('So ',n,' khong bieu dien duoc thanh');                         Write(' tong cua >=2 so tu nhien lien tiep!');                  End;           Writeln; Writeln;           Write('More (1/0)? Tiep: go 1; Ngung: go 0:');            Readln(tt); Until tt=0; End.

ấ ỳ ố ố ể ượ Ủ ổ  nhiên b t k  thành t ng các s  nguyên t đ  thu đ c TÍCH C A ộ ố ự Ấ ậ Ố Ạ Ớ **10. L p trình phân tích m t s  t CÁC S  H NG LÀ L N NH T.

ạ ố ạ ạ ố ạ Test1 vào: 8; ra: 3 3 2, tích các s  h ng đ t max=18 Test2: Vào 23; ra: 3 3 3 3 3 3 3 2, tích các s  h ng này đ t max=4374

Uses crt; Const m=65; Var pa_opt:Array[0..m] of Byte; tic:Array[0..m] of longint; j,s,p,k:longint; tt:Byte;

Procedure Innit; Var k:longint; Begin           For k:=0 to p do                  Begin                        tic[k]:=0; pa_opt[k]:=0;                  End;           tic[0]:=1; End;

Procedure Process; Var j,k,s,ticmax:longint; Begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

30

For j:=1 to p do                  Begin                      For k:=0 to p­j do                           If (k=0) or (pa_opt[k]>0) then                             Begin                                   s:=k+j;                                   ticmax:=tic[k]*j;                                  If ((pa_opt[s]=0) or (pa_opt[s]>0)) and (ticmax>tic[s]) then                                            Begin                                                    tic[s]:=ticmax; pa_opt[s]:=j;                                            End;                          End;             End; End;

Begin     clrscr;          Repeat                   Write('Nhap so nguyen duong p<100:'); Readln(p);                   Innit;                   Process;                  s:=p;                  Write('Phuong an phan tich so ',p,' thanh tong cac so ng_to de co tich max la:');

While s>0 Do                         Begin                               Write(pa_opt[s]:3); s:=s­pa_opt[s];                         End;                 Writeln;                 Write('Ung voi ptich toi uu tren day, ta duoc tich max=',tic[p]:2);                  Writeln; Writeln;                  Writeln('* * * * * * * * * * * * * * ');                  Write('Continue(1/0)?. Go 1­>Tiep; go 0­>ngung:');            Readln(tt); Until tt=0; End.

ệ Ố ấ ả ố ượ ố ng các s  TAM TAM đã li t kê. t c  các s  Tam Tam và đ m s  l ố ả ệ ạ ố ẳ ế ượ ủ c c a nó nguyên t ố ố ớ  v i nó. Ch ng h n s  974 ố ữ ố  cùng 479 là hai s  TAM TAM)

**11. (S  TAM TAM) Li t kê t ố ữ ố (Các s  Tam Tam là nh ng s  có 3 ch  s  mà s  đ o ng ố nguyên t Uses crt; Var dem, i:integer;

Function uscln(a,b:integer):integer; var r:integer; Begin           While b>0 do                  Begin                       r:=a MOd b; a:=b; b:=r;                  End; 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

31

uscln:=a; End;

Function daoso(x:integer):integer; Var y:integer; Begin         y:=0;           While x>0 do                  Begin                       y:=10*y+(x MOD 10);                       x:=x DIV 10;                  End;                 daoso:=y; End;

Procedure Tim; Begin             dem:=0; writeln; Writeln;             Writeln(#32:18,'Cac so Tam tam thoa man d/kien dau bai:');             Writeln; Writeln(#32:18,'­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­');             For i:=101 to 999 do                  if uscln(i,daoso(i))=1 Then                        Begin                              Inc(dem);                              Write(i:4);                        End;               Writeln; Writeln;               Write(#32:20,'Bang tren day co tong cong ',dem,' so Tam tam.'); End;

Begin     clrscr;       Tim;       Readln; End.

ấ ả ặ ố ớ ạ ố ượ ế t c  các c p s  Lucasa. (Gi i h n: 1

ấ ả ệ **12. Li t kê t ệ ặ t kê. c p đã li ậ ụ Ví d  Vào c n trên: 1000, Ra: (1,1); (5, 25); (6, 36); (25, 625). Có t ặ t c  4 c p Lucasa.

ƯỚ Ấ Ắ CODE D I ĐÂY LÀ NG N NH T!

Uses crt; Var n, i:longint; s1, s2:string; d: byte; hd:char; Begin clrscr;          Repeat              d:=0;              Writeln(' Tim cac cap lucasa_number:');                  Repeat                          Write('Nhap can tren cua gioi han:'); Readln(n);                  Until (n>1) and (n<2147483647);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

32

Writeln('Cac cap Lucasa number  <=',n,': ');              n:=Trunc(Sqrt(n));              For i:=1 to n do                        If (i MOD 10 in [1, 5, 6]) then                                  Begin                                       Str(i,s1);                                       Str(i*i,s2);                                       If Copy(s2,Length(s2)­Length(s1)+1, Length(s1))=s1 Then                                                   Begin                                                            Inc(d);                                                             Writeln('(',s1,',',s2,')');                                                   End;                                  End;                Writeln('Tong cong co ',d,' cap LucasaNumbers.');                Write('Go ESc de tro lai chuong trinh!');        Until Readkey = #27; End.

ữ ố ố ố ệ ấ ả ạ ẫ ẳ ạ ầ ố ố Ố ơ t c  các s  SIÊU NGUYÊN T  có không h n 8 ch  s . (Các s  SIÊU NGUYÊN T  dài  . Ch ng h n: ố i v n là s  nguyên t ố Ố ả ủ ặ ặ ố

t kê t **13. Li ố ữ L là nh ng s  mà xóa đi k (k

Function NT(n:longint):boolean; Var i:longint; Begin         If (n=0) or (n=1) then                NT:=False         Else                Begin                      i:=2;                      While (n mod i<>0) and (i<=sqrt(n)) do                             i:=i+1;                             If i> sqrt(n) then NT:=True                             Else NT:=False;               End; End;

BEGIN      CLrscr;          Write('Nhap so chu so n (n<=8):');          Readln(n);          dem:=1;          a[dem]:=0;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

33

For i:=1 to n do                    Begin                          kb:=0;                          For k:=1 to dem do                          For cs:=0 to 9 do                          If NT(a[k]*10+cs) then                                    Begin                                        kb:=kb+1;                                        b[kb]:=a[k]*10+cs;                                  End;                        dem:=kb;                         For k:=1 to dem do                                 a[k]:=b[k];               End;                For k:=1 to dem do                Write(a[k]:10);               Writeln;         Writeln('Co tat ca ',dem,' so sieu nguyen to co ',n,' chu so.'); Readln; END.

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

PH N III­

M NG (ARRAY)

Ề II_1) M NG 1_CHI U. L P TRÌNH GI

I CÁC BÀI TOÁN SAU:

ấ (Bài khó: *; Bài r t khó: **)

ố ọ ừ ủ ố ự bàn phím vào dãy n s  t nhiên. Tìm và in lên màn hình các ướ ộ ố 1­ Cho tr ố s  nguyên t c đ  dài n c a dãy s . Đ c t  cùng nhau trong dãy.

Program songuyento_trongday; uses crt; var a:array[1..100] of integer;     i,n,j,dem:integer;

Begin      clrscr;      write(‘Nhap do dai cua day so: ‘); readln(n);      writeln(‘Nhap cac phan tu cua mang:’);      for i:=1 to n do      Begin           write(‘a[‘,i,’]=’);readln(A[i]);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

34

End;

write(‘Day vua nhap la:’);      For i:=1 to n do write(‘ ‘,a[i]);      writeln;      writeln(‘= = = = = = = = = = = = = = = = =’);      write(‘Cac so nguyen to co trong mang la:’);      For i:=1 to n do      Begin           dem:=0;           for j:=2 to a[i]­1 do           Begin              If a[i] mod j=0 then dem:=dem+1;           End;          If dem=0 then write(‘ ‘,a[i]);      End; readln; End.

ố ọ ừ ố 2­ Cho tr bàn phím vào dãy n s  nguyên. Tìm và in lên màn dãy con ng. ướ ộ ấ ồ ạ ẳ

ủ c đ  dài n c a dãy s . Đ c t ố ươ dài nh t g m toàn s  d Ch ng h n, Vào: 12   ­4     6    3    ­21    19    5    7    21    ­9     2                      Ra:  19   5    7     21

Program DayconDuongDainhat; Uses crt; Var a:Array[1..1000] of Integer;     n,i,j,k,kmax,id:byte; Begin      clrscr;     { Randomize;}      write(‘Nhap do dai n (2<=n<=1000) cua day so: ‘); readln(n);      writeln(‘Nhap cac phan tu cua mang:’);      for i:=1 to n do      Begin           write(‘a[‘,i,’]=’);           readln(a[i]);           {a[i]:=Random(100);}      End;      clrscr;      writeln(‘Day vua nhap la:’);      For i:=1 to n do write(‘ ‘,a[i]);      writeln;      writeln(‘= = = = = = = = = = = = = = = = = = = = = = = = = =’);      kmax:=0;      For i:=1 to n do         Begin          j:=i+1;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

35

While ((a[i]>0) and

(a[j]>0)) Do                Inc(j);                k:=j­i;                if k>kmax then                   Begin                      kmax:=k;                      id:=i;                   End;         End;      Writeln(‘Day con gom cac so duong lien tiep dai nhat:’);      For i:=id to id+kmax­1 do Write(a[i]:4);     Readln; End.

ướ Ệ ầ 3­ Hai bài d Ậ i đây yêu c u dùng THU T TOÁN PHI Đ  QUY: Ề

ệ ố ủ ị ứ ứ ể ố

a/ In lên màn hình tam giác Đ U Pascal. b/ In lên màn hình tam giác VUÔNG Pascal. ả (Tam giác Pascal là b ng s  có hình tam giác ch a các h  s  c a khai tri n nh  th c Newton) 3.a)  Program Tg_vuong_Pascal; uses crt; Var a:array[1..16] of byte; i,j:byte;

Begin  clrscr;     Writeln(‘Tam giac vuong Pascal co 16 dong:’);     Writeln;     For i:=1 to 16 do        Begin           For j:=i Downto 1 Do If (j=i) or (j=1) then a[j]:=1     Else a[j]:=a[j]+a[j­1];

For j:=1 to i do              Write(a[j]:4);           Writeln;        End;   Readln End.

3.b) Program InTamGiacPascal; uses crt; var hs:array[0..12] of integer; i,j:integer;

Begin ClrScr;     Write(‘Tam giac Pascal deu co 13 dong:’);       For i:=0 to 12 do

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

36

Begin

For j:=i DownTo 0 do                If (j=i) or (j=0) then hs[j]:=1                Else hs[j]:=hs[j]+hs[j­1];                  Gotoxy((70­5*i) DIV 2,i+6);             For j:=0 to i do Write(hs[j]:5);          End;   Readln; End.

ấ ả ộ ố ự ễ ằ ể t c  các cách bi u di n m t s  t nhiên b ng ố ự *4­ (INFORMATIC OLYMPIC MOSCOW 1985). Tìm t ổ t ng c a các s  t nhiên khác. ụ

ễ ể ố ủ Ví d . Vào: 5    ứ            Ra  : Cách th  1: 5=4+1 ứ                     Cách th  2: 5=2+3 ứ                     Cách th  3: 5=3+1+1 ứ                     Cách th  4: 5=2+2+1 ứ                     Cách th  5: 5=2+1+1+1  ứ                     Cách th  6: 5=1+1+1+1+1+1                                          S  cách bi u di n = 6

Program ptich_thanh_tong; Uses crt; Var n,d,l,i,sum:Integer; dem:longint; tt:char; s,r:array[1..100] of integer; Begin  clrscr; Repeat     Write(‘ Nhap n:’); Readln(n);     Writeln(‘Cac phuong an bieu dien tong:’); Writeln;     dem:=0;     s[1]:=n; r[1]:=1; d:=1;     While s[1]>1 do     Begin         inc(dem); sum:=0;         If s[d]=1 Then         Begin              sum:=sum+r[d];              Dec(d);         end;         sum:=sum+s[d]; r[d]:=r[d]­1; L:=s[d]­1;         If r[d]<>0 then Inc(d);         s[d]:=L; r[d]:=sum DIV L; L:=Sum MOD L;         If L<>0 then         Begin          Inc(d); s[d]:=L; r[d]:=1;         End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

37

Write(‘  Cach thu

‘,dem,’:’,n,’=’);        For i:=1 to d Do        For L:=1 to r[i] Do Write(s[i],’+’);        Writeln; Writeln;    End;    Writeln(#32:5,’So cach bieu dien=’,dem); Writeln;    Write(‘Continue (y/n) ?, Go y­>de tiep; go n hoac N de thoat:’);    Readln(tt); Writeln; Writeln;    Until tt IN [‘n’,’N’]; End.

Ậ Ử Ộ *5­ INFORMATIC OLYMPIC MOSCOW 1987 (T P N A B I­HALF MULTI SET). ư ậ ị nhiên đ nh nghĩa nh  sau:

ầ ử ầ ủ ậ T p A các s  t a­ 1 (cid:0) b­ K (cid:0) A. Tìm và in lên màn n ph n t A và 3K+1 (cid:0) đ u tiên c a t p A ậ ầ ử ầ ủ ậ ạ ẳ ớ

ố ự  A  A  thì 2K+1 (cid:0) ọ ị (n<1000). T p đ nh nghĩa trên đây g i là HALF MULTI SET.  đ u tiên c a t p A là:  Ch ng h n v i n=9 thì các ph n t                                               1   3   4   7   9   10   13   15   19

Program half_multi_Set; Uses Crt; Const max=100; Var i,k2,k3,a2,a3,n: Integer; a:array[1..100] of integer; Begin  Clrscr;     Write(‘Nhap n:’); Readln(n);     k2:=1; k3:=1; a[1]:=1;     Write(1);     For i:=2 to n do        Begin           a2:=2*a[k2]+1; a3:=3*a[k3]+1;           If a2<=a3 Then              Begin                a[i]:=a2;                  k2:=k2+1;              End;           If a3<=a2 then              Begin                a[i]:=a3;                  k3:=k3+1;              End;           Write(a[i]:4);       End;    Readln; End.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

38

ố ộ c dãy s  nguyên có đ  dài ề ấ ằ ổ **6­ Cho tr ọ ừ n (n đ c t ướ  bàn phím vào). Tìm cách chia dãy  y thành nhi u dãy con có t ng b ng nhau.

{ Go ESC de ve Program} Uses Crt; const mn=60; Var a,c:Array[1..mn] of word;

Procedure View(n:word); Var i: word; Begin   for i:=1 to n do   Write(a[i]:4);   Writeln; End;

Function Min(a,b: word):word; Begin     if a

Procedure RandomGene(t, n:word);  {Tao sinh data ngau nhien} var i,s: word; Begin    s:=t;    For i:=1 to n do      Begin         a[i]:=min(Random(t),s);         s:=s­a[i];         if s=0 then s:=t;      End; End;

Function Check(tt, n, k: word):boolean; Var t,s,i,m:word; Begin    check:=False;    t:=tt Div k ;    If t*k <> tt then exit;    m:=1;    c[m]:=0;    s:=0;    For i:=1 to n do       Begin          s:=s+a[i];          If s>t then exit;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

39

If s=t then             Begin               m:=m+1;c[m]:=i;               s:=0;             End;       End;       c[m]:=n;       check:=True; End;

Procedure Result(tt, n, k:word); Var s,i:word; Begin   Writeln;   Write(‘Day a[1..’,n,’] co the chia thanh ‘,k,’ doan’);   Writeln(‘ co tong nhu nhau la=’,tt Div k);   s:=0;   If k=1 Then      Begin       For i:=1 to n do         s:=s+a[i];         Write(‘a[1..’,n,’]=’,s);         Exit;      End;     Writeln;     For i:=1 to k do        Begin           Writeln(‘Doan thu ‘,i,’: a[‘,c[i]+1,’..’,c[i+1],’]’);           If (i Mod 15 =0) then           If readkey=#27 then Exit;         End; End;

Procedure Partion(n:word); Var tt, k:word; Begin    tt:=0;    For k:=1 to n do tt:=tt+a[k];    For k:=n Downto 1 do       If check (tt,n,k) then          Begin             Result(tt,n,k);             Exit;          End; End;

Procedure Test;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

40

var n:word; Begin    randomize;      Repeat          clrscr;            n:=random(mn)+1;            RandomGene(n Div (random(5)+1),n);            View(n);            Partion(n);      Until readkey=#27; End;

ế ở ấ ứ ặ ạ ấ ứ    làng i đ t tr m c p c u, thì xe c p c u đi ọ ầ ờ

ấ ứ ố ệ ừ ớ ẽ ấ ề ờ ấ ờ i làng xa nh t (v  th i gian) s  m t th i gian

ầ ử ấ ả ướ 7­ IFORMATIC OLYMPIC MOSCOW 1986. Có k làng. N u  ệ ế đ n làng j theo tín hi u g i c n th i gian:                                          A[i,i] + A[i,j]  ( 1<=i, j<=k, i = j ) ể ặ ạ Tìm s  hi u làng i đ  đ t tr m c p c u sao cho t  đó đi t ít nh t.ấ ả M ng A[1..k,1..k] cho tr c, trong đó t t c  ph n t ể  A[i,j]>0 và có th  A[i,j] <>A[j,i].

Uses Crt; Const kk=20; Var i,j,k,i1:integer;     s, t: real;     a:Array[1..kk,1..kk] of real;

Begin  clrscr;   Write(‘Nhap so lang:’); Readln(k);   For i:=1 to k do     For j:=1 to k do       Begin          Write(‘a[‘,i,’,’,j,’]=’);   Readln(a[i,j]);       End;    For i:=1 to k do      Begin        s:=0;        for j:=1 to k do          If(i<>j) And (s

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

41

End.

ộ ố ậ ổ ị 8­ Đ i m t s  th p phân sang nh  phân dài 8 bits.

Program Thap_nhi_phan; Uses crt; Const ktuhe2:Array[0..1] Of Char='01'; Var so:Word;i:Byte; sohe2:string[8];hd:Char; Begin  ClrScr;     Repeat         Write('Vao mot so nguyen kieu Word:');Readln(so);         sohe2[0]:=#8;         For i:=8 Downto 0 Do           If (so AND (1 SHL i))=(1 SHL i) Then               sohe2[8­i]:=ktuhe2[1]           Else              sohe2[8­i]:=ktuhe2[0];              Delete(sohe2,9,80);          Writeln(so,' O he THAP PHAN, doi sang he 2 la :',sohe2);          Write('Ban co thu tiep khong (c/k)?');Readln(hd);      Until (hd='k') OR (hd='K'); End.

ƯỢ Ủ ộ ố ụ ậ ổ ị C C A BÀI 8) Đ i m t s  nh  phân sang th p phân. Ví d  Vào là 1101 thì Ra là

9­ (BÀI TOÁN NG 13 Program Nhi_Thapphan; uses crt; var A: array [1..100] of integer;     n: string;     i, j, loi, S, b, len: integer; dap:char;

Begin   clrscr;  Repeat   Write('Nhap n o he nhi phan: '); Readln(n);     len:= length(n); s:=0;       for i:=1 to len do         begin            val(n[i], A[i], loi);            if A[i]=1 then               begin                  b:=1;                  for j:=1 to len­i do b:=b*2;                     s:=S+b;               end;         end;   Write('Doi sang thap phan la: ',S);   Writeln;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

42

Write('More(y/n)?'); Readln(dap);  Until dap In['n', 'N']; End.

ấ ữ ầ ử ố ộ thu c dãy s  nguyên đã cho.

ỏ ả 10­ Tìm kho ng cách nh  nh t gi a các ph n t Program Khoangcachmin; uses crt; var a:array[2..1000] of integer;     i,n,dmin:integer; hoi:byte;

III_2) M NG HAI CHI U (TÊN KHÁC: MA TR N)

Begin   clrscr;    Repeat      Randomize;      write('Nhap do dai n (n<=1000) cua day so: '); readln(n);      writeln('Nhap cac phan tu cua mang:');      For i:=2 to n do           a[i]:=Random(100);      clrscr;      writeln('Day vua nhap la:');      For i:=2 to n do write(' ',a[i]);      writeln;      writeln('= = = = = = = = = = = = = = = = = = = = = = = = = =');      dmin:=abs(a[3]­a[2]);      For i:=4 to n do          If (dmin>abs(a[i]­a[i­1])) then dmin:=abs(a[i]­a[i­1]);      Writeln('Khoang cach nho nhat giua cac phan tu trong day la:',dmin);      Write('Another Test (1/0)?. Continue­>Press 1; Stop­>Press 0:');      Writeln;      Readln(hoi);    Until hoi=0; End.

Ộ Ớ Ủ Ề Ạ Ặ Ậ Ề Ị (CH  Đ  NÀY KHÁ NHI U BÀI T P THÚ V  HO C ÍT QUEN THU C V I CÁC B N)

ề ạ ọ Các b n h c sinh hãy chú ý đi u sau: ế Khuy n cáo:

Ủ ạ ọ Ố Ậ ễ ớ Ở Ế ạ Ế  THU T TOÁN TÌM KI M HAY TÍNH TOÁN (nh ng thu t toán này quá d  v i các b n)  ế Ậ ở ậ Ệ THU T TOÁN DUY T THEO CÁC INDEX (CÁC CH  S  ) C A MA TR N. B i v y khuy n  Ệ ố ớ ữ ậ Ỉ Ố Ủ ở Ớ Ỹ Ẫ ạ Ừ       CÁI KHÓ C T LÕI C A CÁC BÀI TOÁN T  7 Đ N 11 đ i v i các b n h c sinh hay sinh viên  KHÔNG  Ở MÀ  cáo các b n nên XEM+NG M+NH  K  CÁCH DUY T INDEX Ậ  các bài toán đó.

ậ ướ ậ ướ i & ma tr n tam giác trên. ộ ườ *11­ Cho tr c­ d­ Xem các ph n t ấ c ma  tr n vuông c p n. L p trình làm ậ In lên màn ma tr n tam giác d ầ ử  thu c đ

ậ ng chéo chính. 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

ầ ử ở e­ Xem các ph n t 43  PHÍA ườ TRÊN đ ng chéo chính. ầ ử ở Ổ ườ f­ T NG các ph n t PHÍA TRÊN đ ng chéo chính.

Program Bt_7; Uses crt; Var i,j,m,n,d,s,s1,s2,t:integer;     a:array[1..50,1..50] of integer;

Begin   clrscr;    Randomize;    Write(‘Nhap so hang cot n cua ma tran vuong:’); Readln(n);    for i:=1 to n do         Begin           for j:=1 to n do a[i,j]:=Random(10);         End;

Writeln(‘Ma tran vua nhap:’);               For i:=1 to n do                      Begin                         For j:=1 to n do                            Write(a[i,j]:3);                            Writeln;                      End;

Writeln(‘An ENTER de tiep..’); Readln;              clrscr;

Writeln(‘* * * * * * * * * * * * * * * * *’);

Writeln(‘Ma tran tam giac duoi:’);         For i:=1 to n do            Begin                For j:=1 to i do                   write(a[i,j]:3);                   writeln;            End;

Writeln(‘* * * * * * * * * * * * * * * * *’);        Writeln(‘An ENTER de tiep..’); Readln;              clrscr;

Writeln(‘Ma tran tam giac tren:’);                  For i:=1 to n do                      Begin                        For j:=i to n do                          Begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

44

Gotoxy(4*(j+1),3+i);                             Write(a[i,j],’ ‘);                          end;                          Writeln;                       end;

Writeln(‘An ENTER de tiep..’); Readln;              clrscr;        Writeln(‘ Cac phan tu thuoc duong cheo chinh:’);            for i:=1 to n do               Write(a[i,i]:4);               writeln;

Writeln(‘An ENTER de tiep..’); Readln;              clrscr;         Writeln(‘* * * * * * * * * * * * * * * * *’);

Writeln(‘ Cac phan tu nam PHIA tren duong cheo chinh:’);        for i:=1 to n do          Begin            for j:=i+1 to n do              Begin                 Gotoxy(4*(j+1),3+i);                 write(a[i,j],’ ‘);                 writeln;              End;          End;        Writeln(‘An ENTER de tiep..’); Readln;              clrscr;

Writeln(‘* * * * * * * * * * * * * * * * *’);      t:=0;      for i:=1 to n do      Begin         For j:=i+1 to n do           t:=t+a[i,j];      End;      Write(‘Tong cac phan tu o PHIA tren duong cheo chinh:’,t); Readln End.

ấ ướ ệ ng chéo chính.

ậ ậ ầ ử ầ ử ng chéo chính SÁT NGAY PHÍA TRÊN. thu c đ  thu c đ ầ ử ườ **12­ Cho tr        a/ In lên màn ma tr n tam giác d ộ ườ        b/ Xem các ph n t ộ ườ        c/ Xem các ph n t ổ        d/ Tính t ng các ph n t ậ c ma tr n vuông c p n. L p trình làm các vi c sau: ướ ườ i đ ng chéo chính. ườ ng // đ ộ ườ ng // đ thu c đ ng chéo chính SÁT NGAY PHÍA TRÊN.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

45

ầ ử e/ Xem các ph n t ộ  thu c I. ng // đ ng chéo chính  SÁT NGAY PHÍA D ườ ộ ườ ầ ử ƯỚ ng // đ ƯỚ ng chéo chính SÁT NGAY PHÍA D I. thu c đ

ườ ườ đ ổ        f/ Tính t ng các ph n t   TEST. Vào:                                     49    20    25    12         5    37    19    19                                       5    43    25    15                                       3    13    48      8

ậ ướ i:

Ra:               a/ Ma tr n tam giác d                                                             49                                                                    5    37                                                                    5    43    25                                                                    3    13    48    8

ầ ử ầ ử ộ ườ ộ ườ thu c đ  thu c đ ầ ử ng chéo chính:   49    37    25    8 ng // đ ộ ườ ườ ng chéo chính sát ngay phía trên: 20    19    15 ng chéo chính SÁT NGAY PHÍA TRÊN: ườ ng // đ thu c đ

ầ ử ộ ườ ườ ƯỚ thu c đ ng // đ ng chéo chính  SÁT NGAY PHÍA D I:

ổ ầ ử ộ ườ ườ ƯỚ thu c đ ng // đ ng chéo chính SÁT NGAY PHÍA D I: b/ Các ph n t                    c/ Các ph n t ổ                    d/ T ng các ph n t                         54                    e/ Các ph n t                        5    43    48                     f/ T ng các ph n t                        96

Program Bt_8; Uses crt; Var i,j,n,d,s,s1,s2,ln:integer;     a:array[1..20,1..20] of integer;

Begin   clrscr;    Randomize;      s:=0;    Write('Nhap kich co ma tran vuong n='); Readln(n);    for i:=1 to n do         Begin           for j:=1 to n do a[i,j]:=Random(50);         End;     Writeln('Ma tra vua nhap:');      For i:=1 to n do        Begin           For j:=1 to n do           Write(a[i,j]:4);            Writeln;        End;      { * * * * * * * * * * * * * * * *}

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

46

Writeln('Ma tran tam giac duoi:');

For i:=1 to n do            Begin                For j:=1 to i do                   write(a[i,j]:4);                   writeln;           End;       Writeln('* * * * * * * * * * * * * * * * *');

Writeln(' Cac phan tu  thuoc duong cheo chinh:');       for i:=1 to n do Write(a[i,i]:4); writeln;

Writeln('* * * * * * * * * * * * * * * * *');

s1:=0;    Writeln(' Cac phan tu thuoc duong // sat ngay PHIA TREN duong cheo chinh:');        For i:=1 to n­1 do           Write(#32:2,a[i,i+1]); Writeln;

Write('Tong cac phan tu thuoc duong // sat ngay PHIA TREN duong cheo chinh:');         For i:=1 to n­1 do                 s1:=s1+a[i,i+1];                 Write(s1:4); Writeln;       Writeln('* * * * * * * * * * * * * * * * *');       s2:=0;    Writeln(' Cac phan tu nam tren duong // sat ngay PHIA DUOI duong cheo chinh:');        For i:=2 to n do           Write(#32:2,a[i,i­1]); Writeln;    Write('Tong cac phan tu nam tren duong // sat ngay PHIA DUOI duong cheo chinh:');         For i:=2 to n do                 s2:=s2+a[i,i­1];                 Write(s2:4); Writeln;    Readln; End.

**13­ Cho ma tr n vuông c p n (n đ c t bàn phím vào). Tìm: ố ẻ ớ a/ S  l ậ  l n nh t D ọ ộ ủ ấ ọ ừ ấ Ụ ấ ƯỚ ƯỜ NG CHÉO PH . I Đ ỉ ơ ố ẻ ớ ậ ớ ộ ố  l n nh t  y+ch  ra t a đ  c a nó.      b/ Tìm ít nh t m t s  trong ma tr n l n h n s  l ấ ơ ố ẻ ớ ố ượ ấ ố ấ ấ  l n nh t đã tìm th y trên đây. ố ớ ng các s  l n h n s  l c/ Th ng kê s  l     TEST. Vào:

10   12   47   7   5   45   11   39 19   33   29   20 16   19   20   23

ụ ở ộ ố Ẻ    Ra: + S  L  Max d ồ ạ i ph n t ướ ườ ng chéo ph =39 i đ ơ ố ầ ử ớ   l n h n s  max + T n t hàng 1, c t 3

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

47

ầ ử ở ơ i ph n t ộ ầ ử ớ ố l n h n max là: 2

ồ ạ                               + T n t ơ ố ớ l n h n s  max   hàng 2, c t 2                               + S  ph n t    Program Bt_9;    Uses Crt;   Type mt=array[1..50,1..50] of integer;   Var a:mt; n,i,j,max:byte;

Procedure Input(Var a:mt; n:byte); Var i,j:byte; Begin    randomize;    For i:=1 to n do       For j:=1 to n do  a[i,j]:=random(50);       { Begin            Write('a[',i,',',j,']=');            readln(a[i,j]);        End; } End;

Procedure View(a:mt; n:byte); Var i,j:byte; Begin    For i:=1 to n do    Begin       For j:=1 to n do          Write(a[i,j]:4);          Writeln;    End; End;

Function Timmax(a:mt; n:byte):byte; Var i,j,m:Byte; Begin    max:=0;    For i:=1 to n do       For j:=1 to n do      If ((i+j)>(n+1)) And ((a[i,j] Mod 2)=1)  then max:=a[i,j];      If max=0 then          Writeln('Khong co so le nao lon nhat duoi duong cheo phu.')      Else         Begin           For i:=1 to n do             For j:=1 to n do               If ((i+j)>(n+1)) And ((a[i,j] Mod 2)=1) And (max

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

48

End;     Timmax:=max; End;

Procedure Maxindex(a:mt; n,max:byte); Var i,j,dem:byte; Begin    dem:=0;    For i:=1 to n do      For j:=1 to n do         if ((i+j)<=n) And (a[i,j]>max) then           Begin              Inc(dem);              Writeln('Ton tai phan tu lon hon max o hang ',i,' cot ',j);           End;         If dem=0 Then write('Khong co phan tu nao > max.')         Else Write('So phan tu lon hon max la:',dem); End;

Begin clrscr;     Write('Nhap kich co ma tran VUONG:'); Readln(n);     Input(a,n);     View(a,n);     max:=Timmax(a,n);     Maxindex(a,n,max);     Readln; End.

ọ ừ bàn phím vào). Tìm: i đ ầ ử ỏ ậ ầ ử ằ ớ ườ ụ ồ ng song song v i đ ng chéo ph , r i tính ườ ổ ng chéo chính. ườ  n m trên đ ứ ể ậ ấ *14­Cho ma tr n vuông c p n (n đ c t ấ ướ ườ  nh  nh t d + Ph n t ọ ộ ủ + Nh p vào t a đ  c a ph n t ầ ử    t ng các ph n t trên đ ng // này và ch a đi m đó.

ế ả ng chéo chính=16 ộ ượ ổ ầ ử ườ ứ ầ c t ng các ph n t trên đ ng ch a ph n TEST. Dùng matrix trên đây, ta có k t qu  sau: ướ ườ i đ                         + Min d ọ ộ                         + Đ c vào t a đ  hàng 1, c t 2 ta đ ớ ụ ọ ử ấ   y và // v i chéo ph  là 17 (=5+12) t

Program Bt_10;    Uses Crt;   Type mt=array[1..50,1..50] of byte;   Var a:mt; n,i,j,k,l,row,col,ans:byte;       min,s:integer;

Procedure Input(Var matrix:mt; ten:char; soh,soc:byte); Var i,j:byte; Begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

49

Randomize;    For i:=1 to soh do       For j:=1 to soc do  {matrix[i,j]:=Random(10);}        Begin            Write(ten,'[',i,',',j,']=');  Readln(a[i,j]);

End; End;

Procedure View(matrix:mt; soh,soc:byte); Var i,j:byte; Begin    For i:=1 to soh do    Begin       For j:=1 to soc do          Write(matrix[i,j]:3);          Writeln;    End; End;

Begin Clrscr;   Repeat      Write('Nhap kich co n cua ma tran vuong:'); Readln(n);      Input(a,'a',n,n);      Writeln('Matrix vua nhap:');      Writeln;      View(a,n,n);      Writeln;      min:=a[2,1];      row:=2; col:=1;      For i:=1 to n do        For j:=1 to n do          If(i>j) And (min>a[i,j]) Then            Begin               Min:=a[i,j];               row:=i; col:=j;            End;      Writeln('Phan tu min o duoi duong cheo chinh:',min);      Write('Nhap chi so hang, cot can xu ly:'); Readln(k,l);      s:=0;      For i:=1 to n do         For j:=1 to n do           If (i+j=k+l) then S:=S+a[i,j];      Writeln('Tong cac phan tu tren duong // voi duong cheo phu va ');            Write('chua phan tu tren hang ',k,' cot ',l,' la:',S);      Writeln;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

50

Write('Another Test (1/0)? More ­­>  Press 1, Stop ­­> Press 0:');      Readln(Ans);  Until ans=0; End.

ậ ậ ắ ố ư ế ệ ả

ạ *15­ L p trình t o ma tr n xo n  c. L u k t qu  vào t p Xoanoc.txt. Program Mt_xoan; Uses Crt; var a:array[1..150,1..150]of word; i,j,n,k:word; f:text;

Procedure View; Begin    For j:=1 to n do     Begin       For i:=1 to n do         Write(f,a[i,j]:6);         Writeln(f);     End; End;

Procedure Datso; Begin      inc(k);      a[i,j]:=k; End;

Begin  clrscr;    Write('Nhap kich co ma tran n='); Readln(n);    Assign(f,'Xoanoc.txt'); Rewrite(f);    j:=1;    while k

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

51

ậ c ma tr n vuông c p n. ậ ậ ấ ả ề ộ t c  các c t, hàng đ u là hoán ướ ể ố ọ ậ ấ *16­ Cho tr   ả ậ L p trình ki m tra xem nó có ph i là ma tr n La Tinh không. Ma tr n mà t ị ủ v  c a n s  g i là ma tr n LaTinh.

{    Test1:                            Test2:

1 2 3                               8 7 9        2 3 1                               5 4 6               3 1 2                               2 3 1   }

Program Check_Mtran_LaTinh; Uses Crt; type a=Array[1..30,1..30] of Integer; Var mt:a; i,j,n,d:Integer;

Function ktrahang(i:integer):Boolean; Var j,k:integer; check:boolean; Begin     ktrahang:=false;     For k:=1 to n do       Begin          check:=false;          For j:=1 to n do             if k=mt[i,j] then check:=true;             If Not check then exit;       End;    ktrahang:=true; End;

Function ktracot(j:integer):boolean;

var i,k:integer; check:boolean; Begin    ktracot:=false;    For k:=1 to n do       Begin         check:=false;         For i:=1 to n do           If k=mt[i,j] then check:=true;           If Not check then Exit;       End;     ktracot:=true; End;

Begin   Clrscr;    Write('Nhap kich co ma tran vuong n='); Readln(n);    For i:=1 to n Do       For j:=1 to n Do

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

52

Begin           write('mt[',i,',',j,']=');readln(mt[i,j]);       End;      writeln('Ma tran vua nhap:');        For i:=1 to n do          Begin            For j:= 1 to n do              write(mt[i,j]:3);              writeln;          End;      writeln;      writeln('= = = = = = = = = = = = = = = = =');      d:=0;      For i:=1 to n Do         If (Not ktrahang(i)) Or (Not ktracot(i)) then          inc(d);         If d=0 then Write('La ma tran Latinh.')         Else Write('khong la ma tran Latinh.');      Readln; End.

ướ ố ứ ể ậ ả ậ ấ ậ 17­ Cho tr c ma tr n vuông c p n. . L p trình ki m tra xem nó có ph i là ma tr n  đ i x ng không.

ể ma tr n chuy n v ằ  A b ng chính ố ứ ộ ậ ườ ầ ử ượ ủ ị c a nó. ế ậ ng chéo. Do v y, n u các ph n t đ c ố ứ  là  ma tr n vuông ậ ớ ậ M tộ  ma tr n đ i x ng ỗ ầ ử ủ M i ph n t ế ướ ạ  A=a[i,j] thì v i m i i d ng t d vi ậ ố ứ  c a m t ma tr n đ i x ng thì đ i x ng qua đ ọ  i,  j ta có: a[i, j]=a[j,i].

{Test1:   1   2   3                    Test2:      9  5  7                2   4  ­5                                   3  1  6                3  ­5   6                                   8  4  2   }   Program Check_Symetr_ Matrix; Uses Crt; Type a=Array[1..30,1..30] of integer; Var mt:a;i,j,n,d:integer; tt:byte; Begin clrscr;  Repeat     Write(' Nhap kich thuoc ma tran vuong n:'); Readln(n);      for i:=1 to n do         for j:= 1 to n do           begin             write(' Nhap phan tu mt[',i,',',j,']=');              Readln(mt[i,j]);           end;     Writeln;     writeln('Ma tran vua nhap:');     Writeln;         for i:=1 to n do

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

53

begin              for j:= 1 to n do                write(mt[i,j]:3);                writeln;           end;     writeln;     d:=0;          for i:=1 to n do            for j:= 1 to n do              If mt[i,j]<>mt[j,i] Then Inc(d);              If d>0 Then Write('Ma tra vua nhap Khong Doi Xung.')              Else Write('Ma tran vua nhap Doi Xung.');        Writeln;        Write('More (1/0)?. More ­­> Press 1, Stop ­­> Press 0:');        Readln(tt);    Until tt=0; End.

ươ ậ ẻ ậ ổ ọ ỳ ệ ng (g i khác: ma tr n k  di u­magic matrix­) b c l ộ ằ ằ ổ ỉ ứ ố ớ ượ ậ ạ ố **18­ T o ma ph . Đó là ma tr n mà t ng các s   ườ ằ ng chéo b ng  trên các hàng b ng nhau = t ng các s  trên các c t b ng nhau = t ng các s  trên hai đ Ẻ ậ ươ Ở ứ ổ ng b c L . nhau . ọ  m c t ng quát, toán h c m i ch  ch ng minh đ ổ ỉ ạ ượ c: ch  t o đ ổ c ma ph

{Nhap xong data nho go ENTER de xem ket qua chay Program}

Program Magic_Matrix; Uses crt, addcrt; Const lim=11; Type mt=array[1..lim,1..lim] of integer;      mtktr=array[1..lim,1..lim] of boolean; Var  matr:mt; mtcheck:mtktr; ok:boolean;      n,i,j,k:integer;      ch:char;

Procedure chinhtoado(Var i,j:integer; n:integer); Begin      If i<1 then i:=n;      If i>n then i:=1;      If j<1 then j:=n;      If j>n then j:=1; End;

Procedure datso(var matr:mt; Var mtcheck:mtktr; Var k:integer; i,j:integer); Begin    matr[i,j]:=k;    mtcheck[i,j]:=false;    Inc(k); End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

54

Procedure DrawTab(matr:mt; n:integer); Var i,j:integer; Begin     textbackground(lightred);     clrscr;     textcolor(lightcyan);     For j:=1 to 25 do        Begin           If(j<(13­n+1)) Or (j>(13+n+1)) then              For i:=1 to 80 do                 Begin                     gotoxy(i,j); write('$');                 End           Else              For i:=1 to 80 do                 If (i<(40­(5*n) Div 2­1)) or (i>(40+(5*n) Div 2+2)) then                    Begin gotoxy(i,j); write('$'); End;        End;        FONT(40­(5*n) Div 2­2,13­n­1,40+(5*n) Div 2+3,13+n+1,14,1);        textcolor(white);        for i:=13­n+1 to 13+n­1 do        if (i Mod 2)=(13­n) Mod 2 then            Begin                for j:=40­(5*n) Div 2 to 40+(5*n) div 2+1 do                  if j Mod 5=(40­(5*n) Div 2) Mod 5 then                     Begin                        gotoxy(j,i); write('!');                     End                  Else                     Begin                        gotoxy(j,i); write('=');                     End;             End        Else Begin                for j:=40­(5*n) Div 2 to 40+(5*n) Div 2+1 do                if j Mod 5=(40­(5*n) Div 2) Mod 5 then                    Begin                       gotoxy(j,i); write('!');                    End;             End;        for j:=40­(5*n) Div 2 to 40+(5*n) Div 2+1 do           if j Mod 5=(40­(5*n) Div 2) Mod 5 then              Begin                  gotoxy(j,13­n); write('=');                  gotoxy(j,13+n); write('=');              End

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

55

else              Begin                  gotoxy(j,13­n); write('=');                  gotoxy(j,13+n); write('=');              End;       textcolor(yellow);       for i:=1 to n do          for j:=1 to n do              Begin                  gotoxy((40­(5*n) Div 2+1)+5*(j­1),(13­n+1)+2*(i­1));                  write(matr[i,j]:3);              End; End;

Begin {Main}     clrscr;     ch:='t';     While ch In ['t','T'] Do         Begin             Khungkep(20,4,61,16,14);             gotoxy(31,5); write('   HINH VUONG KY AO.');             WINDOW(21,6,60,15);             writeln(#32:7,'­­­­­­­­­­­­­­­­­­­­­­­­­­­­­');             writeln(#32:5,'Day la bai toan tao hinh vuong va');             writeln(#32:5,' cac con so dat trong no thoa:');             writeln(#32:5,' Tong cac so tren cac hang,');             writeln(#32:5,' tren cac cot va tren duong cheo');             writeln(#32:5,' deu bang nhau. Den nay bai toan');             writeln(#32:5,' chi giai duoc voi cac hinh vuong ' );              writeln(#32:5,' co do dai canh la so le');             writeln;             write('Cho do dai canh:(n=3, 5, 7, 9, 11 ...):');             read(n);             setwin;             If (n Mod 2=0) or (n<3) or (n>lim) then n:=5;             for i:=1 to n do                for j:=1 to n do                   mtcheck[i,j]:=true;                   i:=1;                   j:=n Div 2+1;                   k:=1;                   Repeat                      datso(matr,mtcheck,k,i,j);                      i:=i­1;                      j:=j+1;                      chinhtoado(i,j,n);                      If mtcheck[i,j]=true then ok:=true

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

56

Else Begin                              j:=j­1;                              i:=i+1;                              chinhtoado(i,j,n);                              Inc(i);                              if mtcheck[i,j]=true then ok:=true                              else ok:=false;                           End;          Until ok=false;          Drawtab(matr,n);          gotoxy(18, 25);          write('Go phom bat ky de thoat hay t, T de tiep tuc!');          Repeat Until Keypressed;          ch:=Readkey;          clrscr;      end; End.

Ẻ ể ậ ấ ộ ươ **19­ Ki m tra xem m t ma tr n vuông c p n ( n L ) có là ma ph ng không?

{  Test 1:   3   7   1                               Test 2:      8   1   6                                 3   5   7 5   2   9       8   4   5                                                4   9   2    }

Program Maphuong_Check; Uses Crt; Type mt=Array[1..30,1..30] of Integer; var  a:mt; i,j,n,s,s1,s2:integer;

Function shang(i:integer):integer; var j,s:integer; Begin   S:=0;   For j:=1 to n do      s:=s+a[i,j];      shang:=s; End;

Function Scot(j:integer):integer; Var i,s:Integer;

Begin    s:=0;   For i:=1 to n do     s:=s+a[i,j];     scot:=s; End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

57

Begin   clrscr;     write(' Nhap kich thuoc n cua ma tran vuong:'); Readln(n);     for i:=1 to n do       for j:= 1 to n do         begin           write(' Nhap phan tu a[',i,',',j,']=');           Readln(a[i,j]);         end;      clrscr;

writeln('Ma tran vua nhap:');    for i:=1 to n do      begin         for j:= 1 to n do            write(a[i,j]:3);            writeln;  end;

s:=shang(1);    s1:=0; s2:=0;    For i:=1 to n Do       Begin          If (shang(i)<>s) Or (scot(i)<>s) Then               Begin               Write('Ma tra vua nhap khong phai ma phuong');               Readln;               Exit;            End;          s1:=s1+a[i,i];          s2:=s2+a[i,n+1­i];       End;      If (s<>s1) Or (s<>s2) Then         Write('Ma tra vua nhap khong phai ma phuong')      Else Write('Ma tran vua nhap la ma phuong.');    Readln End.

ầ ử ạ ố ổ ộ ư **20­ Cho dãy các s  nguyên có đ  dài N. Tìm cách chia dãy đã cho thành các đo n có t ng các ph n t nh  nhau.

Thoat}

{Go ESC (cid:0) Uses Crt; const mn=60; Var a,c:Array[1..mn] of word;

Procedure View(n:word); Var i: word;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

58

Begin   for i:=1 to n do   Write(a[i]:4);   Writeln; End;

Function Min(a,b: word):word; Begin     if a

Procedure RandomGene(t, n:word);  {Tao sinh data ngau nhien} var i,s: word; Begin    s:=t;    For i:=1 to n do      Begin         a[i]:=min(Random(t),s);         s:=s­a[i];         if s=0 then s:=t;      End; End;

Function Check(tt, n, k: word):boolean; Var t,s,i,m:word; Begin    check:=False;    t:=tt Div k ;    If t*k <> tt then exit;    m:=1;    c[m]:=0;    s:=0;    For i:=1 to n do       Begin          s:=s+a[i];          If s>t then exit;          If s=t then             Begin               m:=m+1;c[m]:=i;               s:=0;             End;       End;       c[m]:=n;       check:=True; End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

59

Procedure Result(tt, n, k:word); Var s,i:word; Begin   Writeln;   Write('Day a[1..',n,'] co the chia thanh ',k,' doan');   Writeln(' co tong nhu nhau la=',tt Div k);   s:=0;   If k=1 Then      Begin       For i:=1 to n do         s:=s+a[i];         Write('a[1..',n,']=',s);         Exit;      End;     Writeln;     For i:=1 to k do        Begin           Writeln('Doan thu ',i,': a[',c[i]+1,'..',c[i+1],']');           If (i Mod 15 =0) then           If Readkey=#27 then Exit;         End; End;

Procedure Partion(n:word); Var tt, k:word; Begin    tt:=0;    For k:=1 to n do tt:=tt+a[k];    For k:=n Downto 1 do       If check (tt,n,k) then          Begin             Result(tt,n,k);             Exit;          End; End;

Procedure Test; var n:word; Begin    randomize;      Repeat          clrscr;            n:=random(mn)+1;            RandomGene(n Div (random(5)+1),n);            View(n);            Partion(n);      Until readkey=#27;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

60

End;

Begin   Clrscr;      Test; End.

Ọ Ố Ở Ỗ Ỗ Ộ ướ ỗ ố ở ỗ ậ ấ ọ c ma tr n vuông c p n. Hãy ch n m i s m i hàng ỗ ộ ấ ổ ớ M I HÀNG M I C T) Cho tr 21­(CH N S   ủ (khác nhau), m i c t (khac nhau) sao cho t ng c a chúng l n nh t.

{ Test1:                               Test2:                                  Test3:     3                                      4                                          4     7  9  6                              4  3  4  5                              241  164  180  20     3  5  8                              6  7  8  9                              162   81  102  96     8  6  9                              1  9  7  4                              169  197   80 153                                             1  3  5  7                              11   26  214 223   } Uses Crt; Var a:Array[1..20, 1..20] of word;     b:Array[1..20] of Boolean;     x,ng:Array[1..20] of Byte;     r,n,i,dem:Byte;     max,sum:integer;     fi,fo:Text;

Procedure Doc; Var i,j:word; Begin   Assign(fi,'mang.in'); Reset(fi);   Readln(fi,n);   For i:=1 to n do     For j:=1 to n do        read(fi,a[i,j]);   Close(fi); End;

Procedure Ghi; Var i,j:word; Begin    Assign(fo,'mang.ou'); Rewrite(fo);    For i:=1 to n do      Begin        For j:=1 to n do          Write(fo,a[i,j]:4);          Writeln(fo);      End; End;

Procedure Xuly;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

61

Var i: Word; Begin   If sum>max Then      Begin        max:=sum;        ng:=x;      End; End;

Procedure Xuat; var i:Word; Begin   Writeln(fo,' Tong max cua cac phan tu da chon=',max);    Writeln(fo,'Va cac phan tu ay la:');   For i:=1 to n do     Write(fo,a[i,ng[i]]:4,'(',i,',',ng[i],')'); End;

Procedure Chon(i:word); Var j:Word; Begin   For j:=1 to n do      If b[j] Then        Begin          x[i]:=j;          sum:=sum+a[i,j];          b[j]:=false;          if i=n Then xuly else chon(i+1);          b[j]:=true;          sum:=sum­a[i,j];        End; End;

Begin   clrscr;   Doc;   Ghi;   max:=0; sum:=0;   For i:=1 to n Do     b[i]:=true;     chon(1);   Xuat;   Close(fo);   Writeln('Done! Go ENTER ­> ve Program; Go F3 ­> Go MANG.OU: Xem kqua.');   Readln; End.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

62

PH N IV.

XÂU KÝ TỰ

ễ ớ ọ

(STRING) (Tr  bài 1, không có bài nào d  v i h c sinh, sinh viên)

L p trình gi

i các bài toán sau:

ộ ự ữ c a xâu có ứ ữ ấ ừ ủ Ấ Ẩ ơ ề ướ ừ  (Word). Gi a các t c m t xâu (dài < 256 ký t ) ch a các t ỉ Ữ Ạ Ộ ừ ự ố , ch  GI  tr ng). Hãy kh  các d u cách gi a các t L I M T D U ọ ư ậ ử ẩ ượ ế ở ấ ộ ứ ấ c k t thúc b i d u cách SPACE,

1/(CHU N HÓA XÂU). Cho tr ộ ấ nhi u h n m t d u cách (ký t ữ CÁCH gi a chúng. Xâu nh  v y g i là xâu chu n. ừ ộ (T  là m t xâu con không ch a d u cách thu c xâu đã cho mà nó đ ặ ấ ho c d u TAB.)  CODE. ses crt; var i:Byte; s:string; Begin Clrscr;      Write('Nhap vao xau s co vai dau trong o giua cac tu:'); Readln(s);         While s=#32 do Delete(s,1,1);         While s[length(s)]=#32 do             Delete(s,length(s),1);        i:=1;        Repeat           If (s[i]=#32) and (s[i+1]=#32) then  Delete(s,i,1)           Else Inc(i);        Until i>Length(s); {da xet het cac pt cua xau}        Write('Xau da khu trong :',s);    Readln; End.

ồ ướ ừ ầ ủ ỗ ừ ữ c m t xâu g m các t mà ch  cái đ u c a m i t ữ  là ch ườ ỗ ừ ự ầ ủ Ủ Ừ  đ u c a m i t Ế ử ng. Hãy s a các ký t ộ ữ  thành ch  HOA.

Ự Ầ 2/(VI T HOA KÝ T  Đ U C A T ) Cho tr th Vào: ton nu nguyet anh      Ra: Ton Nu Nguyet Anh CODE. Uses Crt; Const chuthg =['a'..'z'];   {Khai bao hang xau} Var xau:string; i,d:Byte; Begin Clrscr;       Write(' Nhap xau:'); Readln(xau);       d:=length(xau);       If xau[1] In chuthg Then xau[1]:=Upcase(xau[1]);       For i:=2 to d do           If (xau[i­1]=#32) and (xau[i] In chuthg) Then              xau[i]:=Upcase(xau[i]);       Write('Chu cai dau moi tu sua thanh chu hoa:',xau);   Readln;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

63

End.

ướ ủ ộ Ủ c hai xâu s1 và s2. Tính đ  dài max c a xâu con

Ộ 3/ (Đ  DÀI  MAX C A XÂU CON CHUNG). Cho tr chung. Vào: s1=xabcxxabcdxd;     s2=aybcyabcdydy Ra do dai max doan chung 2 xau=4

Uses Crt; Var s1, s2:string; Function lonnhat(a,b:integer):integer; Begin    If (a>b) then lonnhat:=a    Else lonnhat:=b; End; Function DodaiMaxXauchung(Var x,y:string):integer; Var m,n,i,j,v,t,kmax: integer;     a:array[1..255] of integer; Begin   m:=length(x); n:=length(y);   kmax:=0;   Fillchar(a,sizeof(a),0);   For i:=1 to m do      Begin         v:=0;         For j:=1 to n do           Begin              t:=a[j];              If x[i]=y[j] then a[j]:=v+1              Else a[j]:=0;              kmax:=lonnhat(kmax,a[j]);              v:=t;           End;      End;      DodaiMaxXauchung:=kmax; End;

Begin clrscr;    Write('xau s1='); Readln(s1);    Write('Xau s2='); Readln(s2);    Write('Do dai max cua doan chung thuoc 2 xau=',DodaiMaxXauchung(s1,s2));    Readln; End.

Ầ Ữ Ủ Ấ Ả Ạ Ị Ặ Ế Ệ (cid:0) ề ấ ố ỏ ị ệ ằ ự ạ ồ ớ Ọ Ậ *4/ (ĐO N L P (Đ U BÀI L Y TRONG “NH NG VIÊN NG C L P TRÌNH” C A JON BENTLEY­ Ố ộ Ệ B N D CH TI NG VI T: GIA VI T & MINH TRUNG. NXB TH NG KÊ,11/2002)) Cho xâu s có đ    i < j (cid:0) ố ớ dài n. Xác đ nh 2 s  i, j  th a mãn đi u ki n 1   n và k là s  l n nh t sao cho s[i] = s[j], s[i+1] =  s[j+1], . . ., s[i+k­1] = s[j+k­1]. Hai đo n b ng nhau trong s g m k ký t là s[i..i+k­1] và s[j..j+k­1] v i i

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

64

ộ ủ

ạ ặ   ọ và k g i là đ  dài max c a đo n l p trong s. Vào s=xabababayyy        Ra i, j, k=2, 4, 5

Uses Crt; Var i,j,k:integer;

Procedure Doanlap(s:string; var imax, jmax, kmax:integer); Var n,i,j,v,t:integer;     a:array[1..255] of integer; Begin   n:=length(s); kmax:=0;   FillChar(a,sizeof(a),0);   For i:=1 to n do     Begin        v:=0;        For j:=i+1 to n do          Begin            t:=a[j];            if s[i]=s[j] Then a[j]:=v+1            else a[j]:=0;            If kmax

Begin clrscr;   Doanlap('xabababayyy',i,j,k);   Write('Cac chi so i, j, k cua doan lap:',i:2,j:2,k:2);   Readln; End.

Ể Ủ Ọ ể ứ ớ ế ạ t d ng khai tri n  ng v i xâu thu g n  ố ể ứ ọ ư ấ ấ ố

ể ồ ữ ế ậ t theo lu t sau: ấ ệ ọ ủ ồ ọ **5/ (KHAI TRI N C A XÂU G N) Cho xâu thu g n S. Hãy vi ọ đó. Trong xâu thu g n có th  ch a các d u tr ng nh ng các d u tr ng này xem là vô nghĩa nên chúng  không xu t hi n trong xâu khai tri n.  ể Xâu thu g n c a xâu khai tri n g m các ch  cái HOA vi Xm: g m m ch  cái X; ế ế ạ ầ ế ầ ụ ữ ọ ầ           (s)m: m l n vi t xâu con g n trong S; ỏ           m=0 thì b  qua đo n c n vi t;                     m=1 thì không c n vi t m; Ví d .  Vào:      (AB3(C2D)2(C5D)0)2A3

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

65

Ủ Ả Ế Ra:  ABBBCCDCCDABBBCCDCCDAAA                  B NG DÒ V T C A PROGRAM:

ầ ừ ướ ầ ừ ướ ặ ặ ế ướ ế ướ t. L p 2 l n t t. L p 2 l n t b  b c 3 đ n b c 1 đ n b c 5 c 6 ế Ả                 n    c    m    t           GI I THÍCH ầ ế                 1    A    1                 Vi t A 1 l n ầ ế t B 2 l n                 2    B    2                  Vi ầ ế t C 2 l n                 3    C    2                  Vi ầ ế t D 1 l n                 4    D    1                   Vi ự ể ế  đ  vi                 5    #     2    3    Không có ký t ự ể ế  đ  vi                 6    #     2    1    Không có ký t ầ t A 3 l n.                 7    A     3                    Vi

CODE. Uses Crt; Const max=500;       chuso=['0'..'9']; chucai=['A'..'Z']; Type  mi1=Array[0..max] of integer;       mc1=Array[0..max] of char; Var M,T,R,st: mi1; {M:so lan lap; T: tu;R: luu; st:Stack}     c:mc1; p:integer; {dinh stack} s:string;     v:integer; {index cua stack}     n: integer;

Procedure Incre_Index; Begin    While (s[v]=#32) do    Inc(v); End;

Function Napso:integer; var so:integer; Begin   so:=0;   Incre_Index;   If Not (s[v] in Chuso) then      Begin        Napso:=1;        Exit;      End;

While (s[v] In Chuso) do       Begin          so:=so*10+(Ord(s[v])­Ord('0'));          Inc(v);       End;       Napso:=so;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

66

End;

Procedure GanCnvaMn(ch:char); Var so:integer; Begin   Inc(v); so:=Napso;   If so=0 then Exit;   Inc(n);   C[n]:=ch; M[n]:=so; End;

Procedure Chenngoac; Begin   Inc(v);   Inc(p);   st[p]:=n+1; End;

Procedure RutphantukhoiStack; var tu, so: integer; Begin    Inc(v); tu:=st[p];    Dec(p);    so:=Napso;    If (so=0) Then n:=tu­1;    If (so<2) Then Exit;    Inc(n);    C[n]:='#'; M[n]:=so; T[n]:=tu; R[n]:=so; End;

Procedure Xulytiep; Var i,j: integer; Begin   Writeln('CAC BUOC KHAI TRIEN VA XAU KHAI TRIEN CUA XAU THU GON:');   For i:=1 to n do     Begin        Write(#13#10,i,'. ',C[i],#32,M[i],#32);        If C[i]='#' Then Write(T[i]);        Writeln;      End;      i:=1;      While (i<=n) Do         Begin           If (C[i]='#') Then               Begin                  Dec(R[i]);                  If (R[i]=0) Then

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

67

Begin                       R[i]:=M[i];                       Inc(i);                     End                  Else i:=T[i];               End            Else               Begin                  For j:=1 to M[i] Do                     Write(C[i]);                     Inc(i);               End;       End; End;

Procedure Khaitrien(Var s:string); Var i:integer; Begin    s:=s+'#'; v:=1; p:=0;          While (s[v]<>'#') Do    Begin      If(s[v] In Chucai) Then GanCnvaMn(s[v])      Else  If (s[v]='(') Then ChenNgoac      Else If (s[v]=')') Then RutphantukhoiStack      Else Inc(v);    End;    Writeln(s,':');    Xulytiep; End;

Begin clrscr;    s:='(AB3(C2D)2(C5D)0)2A3';    Khaitrien(s);    Readln; End.

Ừ ị ừ ủ ừ ộ ố ượ 1 đ n M. Đ  dài c a t là s  l ng các lo i M là dãy các ch  s  có giá tr  t ừ ữ ố ẩ ượ ọ ế ứ ề ề ế ạ c g i là t chu n n u nó không ch a hai đo n con k  li n trong nó

ướ ố ấ ả ừ ẩ c s  nguyên N, tìm và ghi lên text file TUCHUAN.OU t t c  các t ạ  chu n lo i 3 dài N

ộ ừ ạ Ẩ *6/)(T  CHU N) M t t ữ ố ừ ạ ch  s  trong dãy. T  lo i M đ ố gi ng nhau. Cho tr (1<=N<=40000) CODE. Uses Crt; Const mn=40;mn1=40000;       fo='tuchuan.ou'; Var v:Array[0..mn1] of byte;     n:integer;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

68

f:text;

Function Bang(i,k:integer):Boolean; Var j:integer; Begin    Bang:=false;    For j:=0 to k­1 do      If (v[i­j]<>v[i­k­j]) Then Exit;      Bang:=true; End;

Function Chuan(i:integer):Boolean; Var k:integer; Begin   chuan:=false;   For k:=1 to (i DIV 2) do   If Bang(i,k) then Exit;   Chuan:=true; End;

Function Tim(i:integer):Boolean; Begin    Tim:=true;    While (v[i]<3) do      Begin        Inc(v[i]);        If chuan(i) then Exit;      End;      Tim:=False; End;

Procedure Ketqua(d:integer); Var i:integer; Begin   If d=0 then Write(f,'Vo nghiem')   Else     Begin       Write(f,'Ngiem thu ',d,':');       For i:=1 to n Do         Write(f,v[i]);         Writeln(f);     End; End;

Procedure Timtu(len:integer); Var i:integer;    d:longint;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

69

Begin   If(len<1) Or (len>mn) then Exit;   n:=len;   For i:=1 to n do v[i]:=0;     Assign(f,fo);  Rewrite(f);     i:=1;     d:=0;     Repeat       If(i>n) then         Begin           Inc(d);           Ketqua(d);           i:=n;         End;       If (i<1) then         Begin            If d=0 then Ketqua(0);            close(f);            Write('Done.');            Readln;            Exit;         End;       If Tim(i) Then Inc(i)       Else          Begin             v[i]:=0;             Dec(i);          End;     Until False;

End;

Procedure Test; Begin      Clrscr;      Timtu(7); End;

Begin {Main}         Test; End.

ủ ữ ị ế ầ ủ ậ ỗ ộ ầ ủ ế ằ t r ng không có mã nào là khúc đ u c a mã khác, và đ  dài max c a m i mã là 10. L p  ộ ướ ạ c.

7/ (DECODING BINARY­CODE) Cho mã nh  phân (Binary­code) c a n ch  cái đ u tiên trong Alphabet  ti ng Anh. Bi ả trình gi i mã m t đo n cho tr Vào                                                          5

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

70

0000 0001 0010 0011 110 0000000100010000

Ra 5 0000 0001 0010 0011 110

14  E 16   A 17   B 18   C 19   D

CODE. Uses crt; Const fi='code.in'; fo='code.ou';       mn=2050; Var a:Array[0..mn] of char;  {mang tao Heap:cay ma}

Procedure giaima; Var i,j,v,n:integer;      ch:char;      f,g:text;      x:string; Begin    ch:='A';    Assign(f,fi); Reset(f);    Assign(g,fo); Rewrite(g);    Readln(f,n); Writeln(n,#13#10);    Fillchar(a,sizeof(a),0);    For i:=1 to n do      Begin        Readln(f,x); Writeln(x);        v:=1;        For j:=1 to length(x) do           If x[j]='0' Then v:=v*2           Else v:=v*2+1;           a[v]:=ch;           inc(ch);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

71

End;      Writeln(#13#10);      For i:=1 to mn do        If(a[i]<>#0) then Writeln(i,#32,a[i]);      {Decoding}      While Not Eof(f) Do        Begin          Read(f,ch);          If (ch='0') or (ch='1') Then             Begin                v:=2*v;                If ch='1' Then v:=v+1;                If (a[v]<>#0) then                   Begin                      Write(g,a[v]);                      v:=1;                   End;             End;        End;     Close(f); close(g); End;

Begin  clrscr;      giaima;      Writeln('DONE!');      Readln; End.

ọ ộ ị ọ  m t mã Caesar ơ ả ậ ấ ữ ậ ậ ủ ỗ ế ậ ệ ả ượ ộ ể ạ ụ ế ế ộ ị ươ ằ ế ng pháp đ ệ ứ ế ế ằ  C và c  th  đ n h t. Ph c thay b ng ng xuyên trong công vi c.

ả ư ậ ữ ữ ậ ể 8/ (CEASAR CODE) Trong m t mã h c, , còn g i là m t mã d ch chuy n, là m t trong  ậ ầ ổ ộ ạ nh ng m t mã đ n gi n và c  nh t (nên hi n nay h u không dùng). M t mã này là m t d ng c a m t  ộ ạ ự ế ằ ự  cách nó m t đo n trong  c thay th  b ng m t ký t mã thay th , trong đó m i ký t  trong văn b n đ ẽ ượ ọ ữ ả ả b ng ch  cái đ  t o thành b n mã. Vĩ d , n u đ  d ch là 3 (3 g i là khóa mã), c thay b ng   A s  đ ử ị ượ ặ ẽ ượ c đ t tên theo Caesar, v  hoàng đ  đã s   D, Ă s  đ ườ ụ d ng nó th Ví d :ụ ả B n ch  cái ch a mã hóa (b n rõ):   ABCDEFGHIJKLMNOPQRSTUVWXYZ ả B n ch  cái m t mã:   DEFGHIJKLMNOPQRSTUVWXYZABC

ộ ọ ự ứ ượ ậ ọ ổ ự ứ  th  I trong Alphabet đ ố  th  (I + K) MOD 27 v i ở c mã b i ký t Sau Ceasar, các nhà m t mã h c, t ng quát mã này lên m t chút: ch n K (s  nguyên) ớ làm khóa mã và ký t 0 <=I<=26.

ủ ừ ộ ừ c t khác nhau t ng đôi m t và không t ỗ  nào r ng, ứ ướ ừ ể ừ ồ  đi n g m các t ở ượ ả c mã hóa b i mã Ceasar. ả ấ ế ả ứ ị Bài toán c a chúng ta là: Cho tr ộ ữ ch a các ch  cái hoa. M t văn b n S đ ể ả Hãy xác đ nh khóa K đ  gi i mã văn b n  y (t c là cho bi t b n rõ).

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

72

ư ữ ệ ế ứ ấ ộ ừ ể ừ ủ ừ  c a t đi n (N<=100); N dòng ti p theo ghi các t ố N thu c t ộ ở ậ ể ả ụ ả ả ữ  có đ  dài <= 20 và ghi trên m t dòng. Dòng cu i cùng ghi văn b n S có không quá 250 ch   ọ c mã hóa b i mã Ceasar nói trên. L p trình ch n khóa K đ  khôi ph c b n rõ sao cho b n rõ đi n. ế ả ầ ị

ả D  li u vào l u trên text file tên là ố ừ CEASAR.IN, dòng th  nh t ghi s  t ộ ỗ ừ ể đi n, m i t ượ cái đã đ ề ừ ấ ủ ừ ể ứ ch a nhi u t  nh t c a t ư ữ ệ D  li u ra l u trên text file có tên CEASAR.OU mà dòng đ u ghi giá tr  khóa K, dòng ti p theo ghi b n rõ ả ủ c a văn b n mã hóa S. Xem: Vào.  CEASAR.IN 7 HANOI YES PEDAGOGICAL HELLO UNIVERSITY ITEM HERO IBOPJAQFEBHPHJDBMAVOJWFSTJUZAJJ  b n mã

CEASAR.OU 1 HANOI PEDAGOGICAL UNIVERSITY II

CODE. Uses crt; Const max=250; fi='Ceasar.In'; fo='Ceasar.Ou'; Type  st21=String[21];       tudien=Array[1..max] Of st21; Var  td:tudien; ma,vb,kt,gm:string;     km,sl,slm:Byte; f:Text; n,k:Byte;

Procedure Init; Var i:Byte; begin   kt:=' ';   For i:=Ord('A') to Ord('Z') Do   kt:=kt+Char(i);   kt:=kt+kt;   Assign(f,'Ceasar.In'); Reset(f);   Readln(f,n);   For i:=1 to n Do      Begin          Readln(f,td[i]); td[i]:=td[i]+' ';      End;      Readln(f,ma);      Close(f); End;

Function Before(c:Char; k:Byte): Char;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

73

Begin    Before:=kt[pos(c,kt)+27­k]; End;

Procedure Key_Find; Var i,j:Byte; Begin    km:=0; slm:=0;    For k:=1 to Length(ma) Do    Begin       vb[0]:=Succ(ma[0]);       For j:=1 to Length(ma) Do          vb[j]:=Before(ma[j],k); sl:=0;          For j:=1 to n Do              If pos(td[j],vb)>0 Then sl:=sl+1;              If sl>slm Then                 Begin                     slm:=sl; gm:=vb; km:=k;                 End;    End; End;

Procedure Result; Begin    Assign(f,'Ceasar.Ou'); Rewrite(f);    Writeln(f,km); Writeln(f,gm);    Close(f); End;

Procedure Proccess; Begin    Key_Find;    Result; End;

Begin  clrscr;   Init;   Proccess;   Write('Done!');   Readln; End.

Ề Ơ Ả Ọ Ố Ắ

ượ ử ụ ể ả ươ ả ấ ế ậ ơ ạ ố ế ộ ớ ọ ng pháp mã hoá thông tin đ  vòng s  lo i thi tin h c Qu c t ộ ả c s  d ng r ng rãi đ  đ m b o tính ch t an toàn, b o m t  ề , có bài toán v  mã BW đ  c p t ấ ậ ề ậ ớ i m t cách ti p c n m i  ầ ậ ươ ụ ề ả **9/ (BURROWS­WHEELER CODE, T T: BW­CODE, Đ  S  KH O OLYMPIC TIN H C QU C  T ). Ế ề Có nhi u ph ữ ệ Ở d  li u.  ậ ỹ trong k  thu t mã hóa và gi ư ng pháp m t mã  nh  sau: ví d  ta c n i mã. Burrows Wheeler đ  xu t ph

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

74

ừ ướ BANANA, các b ế   c ti n mã hoá t hành là:

ượ ị ể ậ ộ ự ạ c d ch chuy n vòng tròn và t o thành m t ma tr n L*L ký t , trong đó L là ủ ừ . Ta có:

ừ ầ ướ B c 1: T  c n mã hoá đ ộ đ  dài c a t BANANA ANANAB NANABA ANABAN NABANA ABANAN

ế ạ ướ ắ ủ ậ B c 2: S p x p l i các dòng c a ma tr n theo th  t ứ ự ừ ể  t đi n:

ABANANANABANANANABBANANANABANANANABA

ể ướ t t g c là t ủ ừ ố ự ế ừ ố ị  m i dòng, hi n th  xâu này và cho bi ầ ạ ặ c 2 (t c là c n t o c p (st,d): st­xâu đã mã, 4: index c a t ừ ứ ấ  th  m y   g c trong xâu ướ ừ mã BURROWS WHEELER. D i đây là CODE. Ố ở ỗ ộ ừ  CU I   các ký t ậ ượ ở ướ ứ  b c   đi n. Ta có (NNBAAA,4) là t

ạ B c 3: T o m t xâu t ậ trong ma tr n nh n đ ắ ừ ể đã s p t Program BW_code; Uses Crt; Var n:integer;    id:Array[0..256] of integer;

Procedure Doichoid(i,j:integer); Var t:integer; Begin   t:=id[i];   id[i]:=id[j];   id[j]:=t; End;

Function So(Var s:string; i,j:integer):integer; Var k: integer; Begin   For k:=1 to n do      Begin        If (s[i]<>s[j]) Then           Begin             If s[i]

i:=(i MOD n)+1;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

75

j:=(j MOD n)+1;      End;      So:=0; End;

Procedure NoibotXep(Var s: string); Var i,j:integer; Begin   For i:=1 to n do id[i]:=i;   For i:=1 to n­1 do   For j:=n downto i+1 do      If So(s,id[j],id[j­1]) < 0 then Doichoid(j,j­1); End;

Procedure BW_CREATE(Var s:string; Var u: string; Var d:integer); Var i:integer; Begin   N:=length(s);   NoibotXep(s);   u:=' ';   For i:=1 to n do       Begin         u:=u+s[(id[i]­1+n­1) MOD n+1];         If id[i]=1 then d:=i;       End;

End;

Procedure Bs(var u:string); Var i,j:integer; Begin    For i:=1 to n do id[i]:=i;    For i:=1 to n­1 do    For j:=n downto i+1 do      If u[id[j]]

Procedure DECODE(Var u:string; d:integer; Var s:string); Var i:integer; Begin   n:=length(u);   BS(u);   s:=' '; d:=id[d];   For i:=1 to n do      Begin        s:=s+u[d];

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

76

d:=id[d];      End; End;

ộ ẳ ầ ả ể ứ ứ ườ ộ ằ ể ư ự ấ ằ ộ ữ ậ ớ ứ ộ ấ ể ễ ộ ượ ấ ấ ồ ằ ư ề ộ ả ữ ộ ộ ấ ỗ ư ấ ể ượ ữ ậ ớ ỉ ệ ở ủ ọ ộ ứ ữ ở c mã hóa b i các ch   ể ứ ở ỉ ướ ả ủ i cùng ph i c a hcn đó.

ộ ữ ộ ỗ ộ ể

ộ i ta c n tìm m t m nh đ t hình ch  nh t l n nh t b ng ph ng (t c là ch a các đi m có đ   **10/ Ng ể cao b ng nhau) thu c m t vùng đ t g  gh  (ch a các đi m có đ  cao không nh  nhau) đ  xây d ng sân  ộ ả ồ bay. Vùng đ t đó đ c bi u di n b ng m t b n đ  là m t b ng vuông c p m.n ch a các dòng có đ  dài  ộ ủ ườ nh  nhau và m i dòng có không quá 70 ch  cái th ng. Đ  cao c a các đi m đ ượ ữ cái. Đ  cao nh  nhau đ c mã hóa b i cùng m t ch  cái. Hãy tìm hình ch  nh t l n nh t ch a các đi m  ữ ậ ằ ộ có đ  cao b ng nhau: in ra di n tích c a hình ch  nh t này, t a đ  các đ nh góc trên cùng trái và đ nh  góc d Test.    Vào: Data c t trên file CNMAX.IN có n i dung sau: 20                                         s  các ch  cái (mã) thu c m i dòng ố bcccddddeabcvvvvvvvb       mã hóa đ  cao các đi m thu c vùng bbbbbccccccccccbbbbb vvvvvcccccccccccccbb vvcccccccccccccbbbbb pppppccccccccccabbbb pppppcccccccccczzzzz ssccccccccccccczzzzz sssssccccccccccccczz hhhhhcccccccccczzzzz uuuuuuuuczzzzzzzzzzz

Ra        CNMAX.OU               80 2 9 6 15

CODE. Uses Crt; Const fi='CNMAX.IN'; fo='CNMAX.OU';       mn=80;  {Do dai toi dai cua xau ky tu}        Var f,g:Text;     ten:string[12];       m:Byte; {Chieu rong manh dat}       d:Longint; { Dem so dong}     x,y:String; {Theo thu tu: dong tren va dong duoi}       h:Array[0..mn] of Longint; { chieu cao ca cot}   dtmax:Longint; { Dien tich max}   axmax, cxmax:Longint; aymax, cymax:Byte; {Toa do diem a,c}

Procedure Ghi; Begin    Assign(g,fo); Rewrite(g);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

77

Writeln(g,dtmax);    Writeln(g,axmax,#32,aymax);    Writeln(g,cxmax,#32,cymax);    close(g); end;

Function Dientich(i:Byte; Var c1,c2: Byte):Longint; Begin    c1:=i;    While (y[c1­1]=y[i]) And (h[c1­1]>=h[i]) Do          Dec(c1);    c2:=i;    While (y[c2+1]=y[i]) And (h[c2+1]>=h[i]) Do          Inc(c2);          Dientich:=h[i]*(c2+1­c1); End;

Procedure Run; Var i,c1,c2:Byte; dt:Longint; Begin    Write('Cho biet ten tep chua data vao:'); Readln(ten);    Assign(f,ten); Reset(f); Readln(f,m);    d:=0;    x:=#32;    For i:=1 to m Do x:=x+#32;    FillChar(h, sizeof(h),0);    While Not Eof(f) Do       Begin          Readln(f,y);          Inc(d);          For i:=1 to m Do             If y[i]=x[i] then Inc(h[i]) Else h[i]:=1;          For i:=1 to m Do            Begin                dt:=Dientich(i,c1,c2);                If dt>dtmax Then                   Begin                      dtmax:=dt;                      axmax:=d­h[i]+1; aymax:=c1;                      cxmax:=d; cymax:=c2;                   End;            End;       x:=y;    End;    Close(f);    Ghi; End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

78

Procedure Xem; Var g:Text; Line:String; Begin     Writeln('KET QUA CHAY CHUONG TRINH:');     Writeln('* * * * * * * * * * * * *');     Writeln;     Assign(g,'CnMax.Ou'); Reset(g);        While Not SeekEof(g) Do          Begin              Readln(g,Line);              Writeln(#32:7,Line);          End;      Close(g); End;

Begin clrscr;    Run;    Xem;    Readln End.

Ọ Ạ Ắ Ủ Ấ Ự Ể

Ạ Ủ ọ ượ ướ ọ ộ ư c nó đ u nh  nhau. Cho tr ườ ế ệ ng (có phân bi t) và các ch  s . Cho bi ạ ủ ả ử ự ộ ọ ữ ố i c a s cũng là m t PALINDROM. Gi ấ t c n xóa  đi ít nh t bao nhiêu ký t ự ộ  còn l ề ế ầ  s  sau xóa các ký t c s đ  dài n g m  ự  đ ng xích l ồ  trong s  ạ   i i c a s t

Ả Ả Ề Ề Ẹ Ố Ế **11/ OLYMPIC TIN H C QU C T  NĂM 2000 T I B C KINH (H Y ĐI ÍT NH T CÁC KÝ T  Đ Ẫ Ầ PH N CÒN L I C A XÂU V N LÀ  PALINDROM) ự Dãy ký t  s g i là PALINDROM n u đ c xuôi, đ c ng ữ các ch  cái hoa, th ạ ủ ầ ể đ  ph n còn l ầ g n nhau. Ộ Ầ YÊU C U: Dùng 3 cách: Đ  QUY; M T M NG 1­CHI U; 2 M NG 1­CHI U

ộ Test   Vào:         Palindr.vao                            9                            đ  dài xâu s                           baeadbadb

ự ầ ố ấ c n xóa

Ra:         Palindr.ra                            4                            s  ít nh t các ký t CODE. Uses Crt; Const mn=51;       fi='Palindro.in'; Type mi1=Array[0..mn] of Integer;      mi2=Array[0..mn] of mi1;      mc1=Array[0..mn] of Char; Var n:integer;     f:Text;     s:mc1;     d,v:mi1;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

79

c:mi2;

Procedure Doc; Var i:integer; Begin     Assign(f,fi); Reset(f);     Read(f,n);        For i:=1 to n do Read(f,s[i]); End;

Function max(a,b:Integer):Integer; Begin     If (a>b) Then max:=a     Else max:=b; End;

Function Dequy(i,j:integer):integer; Begin    if (i>j) then Dequy:=0    Else If i=j Then dequy:=1    Else       If s[i]=s[j] Then Dequy:=Dequy(i+1,j­1)+2       Else           Dequy:=Max(Dequy(i,j­1), Dequy(i+1,j)); End;

Procedure Qhd2;     {DunG 2 mang 1­chieu v va d} Var i,j: Integer; Begin    Fillchar(v,sizeof(v),0);    For j:=1 to n do      Begin        d[j]:=1;        For i:=j­1 Downto 1 do           Begin             If s[i]=s[j] Then d[i]:=v[i+1]+2             Else d[i]:=Max(v[i],d[i+1])           End;       v:=d;      End;    Writeln(n­d[1]) End;

Procedure Qhd1;            {Dung 1 mang 1­chieu} Var i,j,t,tr:Integer; Begin   For j:=1 to n do

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

80

Begin         Tr:=0;         d[j]:=1;         For i:=j­1 downto 1 do            Begin               t:=d[i];               If s[i]=s[j] then d[i]:=tr+2               else d[i]:=Max(d[i],d[i+1]);               tr:=t;            End;      End;     Write(n­d[1]); End;

Procedure Test; Begin   Doc;   Writeln('Dung Dequy: so it nhat cac ky tu can xoa=', n­Dequy(1,n));   Write('Dung 2 Mang 1 chieu:so it nhat ca ky tu can xoa=');   Qhd2;   Write('Dung 1 Mang mot chieu:so it nhat cac ky tu can xoa=');   Qhd1; End;

Begin Clrscr;   Test;   Readln; End.

ừ ề ấ ượ i đa là 50 và đ ộ c xâu s có đ  dài không quá 200 ký t Ừ Ể ế c vi ồ ừ ể ộ t trên m t dòng. Cho tr ự ể ỗ ừ  khác nhau đôi m t. M i t . Hãy  ừ ể ế ỏ ộ đi n ướ ộ ạ ạ i t o thành m t dãy liên ti p các t ượ ư ự  trong t ạ ừ ế ủ ệ ể ầ  đ  ph n còn l ừ ể  có th  xu t hi n nhi u l n. T  đi n Dic đ c l u trên text file Dic.in và k t q a ch y ư ướ ộ 12/ (OLYMPIC MOCKBA ­T  ĐI N) T  đi n Dic g m nhi u nh t 100 t ố ộ có đ  dài t ế ầ t c n xóa kh i s bao nhiêu ký t cho bi ề ầ ấ ỗ ừ Dic, m i t ấ ư program l u tren text file Dic.ou  có c u trúc và n i dung nh  d i đây:

Dic.in                            Dic.ou                               6                                    5                        abba                                                         not                                                               is                                                              astra                                                            saint panama saintpavnamtranasnotsaintabba

Dic.ou 5

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

81

i thích

ữ ạ vnamtranaisnotsaintabba ừ ạ ả Gi ố *S  ký t *Các ký t *Các t ự ầ  c n xóa=5 ự  đã xóa là: v, t, r, n, a (các ch  g ch chân): saintpa i là: 5,6,3,2,5,1:      saintpanamaisnotsaintabba  ghép l

CODE. Uses Crt; const fi='dictio.in'; fo='dictio.ou'; Type st=string[60]; Var f,g:Text;     s:string[200];     w:Array[1..110] of st;     d:Array[0..205] of integer;     n, kq:integer;

Procedure Doc; Var i:integer; Begin    Assign(f,fi); Reset(f);    Readln(f,n);    For i:=1 to n do Readln(f,w[i]);    Readln(f,s);    Close(f); End;

Procedure Ghi(v:integer); Begin   Assign(g,fo); Rewrite(g);   Writeln(g,v);   Close(g); End;

Function So(var w:st; i:integer):integer; Var j:integer; Begin   so:=0;   j:=Length(w);   If j>i Then Exit;   If w[j]<>s[i] then Exit;   For I:=i Downto 1 do     If(s[i]=w[j]) Then     Begin        Dec(j);        If j=0 Then        Begin           So:=i; exit;        End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

82

End; End;

Function min(a,b:integer):integer; Begin    If(a

Procedure tinh(i:integer); Var j, v:Integer; Begin    d[i]:=d[i­1]+1;    For j:=1 to n do      Begin        v:=so(w[j],i);        If v>0 then d[i]:=min(d[i],d[v­1]+i­v+1­length(w[j]));

End; End;

Function Xuly:Integer; var m,i:integer; Begin   d[0]:=0;     m:=length(s);     For i:=1 to m do Tinh(i);     Xuly:=d[m]; End;

Begin  Clrscr;    Doc;    kq:=Xuly;    Ghi(kq);    Writeln('So min cac chu cai can xoa de phan con lai la day lien tiep cac tu thuoc Tu dien=',kq ');    Readln; End.

Đ  QUY & QUAY LUI

PH N V.     (RECURSION & BACKTRACKING)

Ủ Ụ

VI T CÁC HÀM HO C TH  T C Đ  QUY GI

I CÁC BÀI TOÁN SAU:

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

83

ớ ấ ể ụ ướ ố ố ủ ố ọ ừ bàn phím vào.

1/ Tìm  c s  chung l n nh t (USCLN) ủ c a 2 s . Áp d ng đ  tìm USCLN c a n s  đ c t CODE: Program uscln; Uses crt; Var i,n,uc,tt:Integer;     a:array[1..1000] of integer;

Function uscmax(x,y:integer):integer; Begin      If (y=0) Then uscmax:=x      Else uscmax:=uscmax(y,x MOD y) End;

Begin clrscr;   Randomize;   Repeat     Write('Ban can bao nhieu so?:'); Readln(n);     For i:=1 to n do   a[i]:=Random(100);     {Begin         Writeln('So thu ',i,':');         Readln(a[i]);     End;}     Writeln('Day so vua nhap:');        For i:=1 to n do  Write(a[i]:3);     i:=1;        Repeat           uc:=uscmax(uc,a[i]);           Inc(i);        Until i=n+1;     Writeln;     Write('Uoc so chung lon nhat cua ',n,' so vua nhap=',uc);     Writeln;     Write('More (1/0)?. More­>go 1; Stop­>go 0:'); Readln(tt);   Until tt=0; End.

Ả ố ọ ừ ủ ẻ C DÙNG M NG). Tìm USCLN c a 5 s  đ c t ơ    bàn phím vào. (Bài này có v  khó h n ớ ƯỢ ộ ố ọ

2/ (KHÔNG Đ bài trên v i m t s  h c sinh!) CODE: Program uso; Uses crt; Var a,b,c,d,e,uc1,uc2,uc3,uc1a,uc1b:integer; Function ucln(x,y:longint):longint; Begin      if y=0 then ucln:=x      Else ucln:=ucln(y,x MOD y);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

84

End; Begin clrscr;       Write('Nhap 5 so a,b,c,d,e:'); Readln(a,b,c,d,e);       uc1:=ucln(a,b);       uc2:=ucln(c,d);       uc3:=ucln(e,uc2);       uc1a:=ucln(uc1,uc2);       uc1b:=ucln(uc1a,uc3);       Write('Usc lon nhat cua 5 so vua nhap:',ucln(a,b));    Readln; End.

(cid:0) ộ ố ươ ọ ừ ồ ụ c m t s  nguyên d ữ ố ng g m n ch  s  (n>=2) đ c t bàn phím vào. Ví d     2017 đ o ả

ả ượ 3/  Đ o ng ượ ng c thành 7102 CODE: Program Dao_so; Uses crt; Var n:longint;

Procedure Daoso(so:longint); Var csdv,caccscl:integer; Begin      If (so<10) then Write(so)      Else Begin                csdv:=so MOD 10;  {xac dinh chu so hang don vi}            caccscl:=so DIV 10;   {xac dinh cac chu so con lai}              Write(csdv);              Daoso(caccscl);           End; End; Begin clrscr;      Writeln;      Write('Nhap vao mot so nguyen duong:'); Readln(n);      Write('So ',n,' viet nguoc lai la:');      Daoso(n);      Readln; End.

ị ề ứ Ổ Ế ố

4/ (DÃY FIBONACCI N I TI NG). Hai bài thú v  v  dãy này:      4.1­ Tìm và in lên màn s  Fibonacci  th  k. CODE: Program So_Fibonacci_thu_K; USES CRT; Var K:Longint;  tt:Byte; FUNCTION Fibo(m:Longint):Longint; Begin    If ((m=1) Or (m=2)) Then

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

85

Fibo:=1    Else       Fibo:=Fibo(m­1) + Fibo(m­2);    End; BEGIN CLRSCR; Repeat    Writeln('TIM SO FIBONACI THU K');    Writeln('­­­­­­­­­­­­­­­­­­­­­'); Write('­Nhap so K= ');

Readln(K);    Writeln('So Fibonacci thu ',k,' = ',Fibo(K));    Writeln;    Write('More (1/0)?. Come on ­> Press 1; Stop ­> Press 0:');    Readln(tt); Until tt=0; END.

ướ ộ ộ ướ c đ  dài n. Tìm và in lên màn dãy Fibonacci có đ  dài n cho tr c.

4.2­ Cho tr CODE: Program Fibo; Uses crt; Var i,n: longint; Function Fibona(i: longint): longint; Begin      if (i<3) then fibona:=1      Else Fibona:=Fibona(i­1)+Fibona(i­2); End;

Begin clrscr;     Write('n='); Readln(n);     Write('Day Fibonaci can tim ung voi do dai cho truoc ',n,' la:');     For i:= 1 to n do     Write(Fibona(i):6);     Readln End.

ọ ừ ể ấ ị gi a (n đ c t bàn ỗ ở ữ ậ ể ơ ể ượ ọ c c a cách  y chuy n n đĩa có l c dùng c c trung gian 3 trong quá trình chuy n. Lu t ch i:

(cid:0)

(cid:0) ấ ứ ặ ằ ế ề ặ ượ ặ c đ t đĩa trên b t c  m t b ng nào (m t bàn, gh , n n nhà . . .). ướ ủ Ệ 5/ Dùng Đ  QUY, tìm cách và hi n th  các b ừ ọ ọ  c c 1 sang c c 2 đ phím vào) t (cid:0) M i l n ch  đ ỉ ượ ể ỗ ầ c chuy n 1 đĩa, ớ ỏ ở  trên đĩa l n, Đĩa nh   ể Khi  chuy n không đ

CODE: Uses Crt; var n, count:integer; hoi:char;

Procedure Move(n,c1,c2,c3: integer); Begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

86

If n=1  Then        Begin           Writeln('Chuyen dia tu coc ',C1,' sang coc ',C2);           Inc(count);        End      Else        Begin          Move(n­1,C1,C3,C2);          Move(1,C1,C2,C3);          Move(n­1,C2,C1,C3);        End; End;

Begin  clrscr;   Repeat      Write('Nhap so dia can chuyen:'); Readln(n);      count:=0;      Move(n,1,2,3);      Write('So lan chuyen dia=',count);      Writeln;      Writeln('= = = = = = = = = = = = = = ');      Write('Thu nua chu (c/k)? Tiep=>go c, ngung=> go k:');      Readln(hoi);   Until hoi IN ['k', 'K']; End.

Ổ Ụ Ớ ị ố Ớ Ớ ọ ủ ạ ả ạ ủ ờ ờ ế ươ ấ ầ ớ ổ ng trình (v i Ớ Ố CHÚ Ý B  ÍCH: KHI TEST, CH  CÓ TEST V I S  ĐĨA L N, VÍ  D  V I  N=64. Dùng tr  s  này, ồ có ch ng ch t 100 l n tu i th  c a b n cũng không đ  th i gian ch  k t qu  ch y ch N=64) !

ệ ố ọ ừ ế ổ ị ấ ầ ố t t ng s  các hoán v   y. Yêu c u: M i ị ủ t kê các hoán v  c a N s  đ c t ỉ ệ ị ằ ế ế ả ố ổ ỗ  bàn phím vào và cho bi 6/ Li ụ ầ l n ch  hi n lên màn 20  k t qu , xem ti p gõ ENTER. Ví d  vào N=6 thì t ng s  hoán v   b ng 720.

Program HoanVinhodequy; Uses crt; Type chuoi=Array[1..20] of Integer; Var a:chuoi; m,n,i,dem:integer;

Procedure Init; Var i:Integer; Begin    for i:=1 to n do a[i]:=i; End;

Procedure Doicho(var x,y:integer); var tg:integer; Begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

87

tg:=x; x:=y;y:=tg; End;

Procedure Inra; var i:integer; Begin    Writeln; Inc(dem);    For i:=1 to n do           Write(a[i]:4);           If (dem MOD 20)=0 then Readln; End;

Procedure Hoanvi(i:integer); var j:integer; Begin    If i=1 then Inra    Else       For j:=i downto 1 do          Begin             Doicho(a[i],a[j]);             Hoanvi(i­1);             Doicho(a[i],a[j]);          End; End; {Main Program} Begin  clrscr;   dem:=0;   Write('Nhap so luong so n can hoan vi:');readln(n);   Writeln(' Cac hoan vi cua ',n,' so: ');   Init;   Hoanvi(n);   Writeln; Writeln;   If dem<>0 then Write('Tong cong co ',dem,' hoan vi cua ',n,' so.');   Readln; End.

ộ ế ộ ế ủ ỉ ế ữ ủ ạ ế ẽ ể Ế ư ọ ồ ọ ỏ ở ạ ở i đây (cũng nh  m i Code đ  h a khác), đòi h i ch y    ậ ứ   ỗ ợ  VERSION 7 tr  lên không h  tr  FULL CREEN. Nói v y t c ỉ ạ ượ ạ 7/V  liên ti p các hình vuông n i ti p trong hình vuông đã cho, sao cho các đ nh c a hình vuông n i ti p  ủ ạ là đi m gi a c a các c nh c a hinh vuông ngo i ti p nó. KHU N CÁO ĐÁNG NGHE: Code đ  h a d MODE FULL CREEN, mà các Windows t là b n ch  ch y đ ồ ọ ướ ừ c các GRAPHIC PROGRAM trong WinXp.

ả ạ ề

CODE (Ph i ch y trên n n WinXp) uses crt, graph; const w=400; Var gd,gm:integer;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

88

procedure hv(x1,y1,x2,y2,x3,y3,x4,y4,  sb:integer); Begin    setcolor(sb mod 15+1);    line(x1,y1,x2,y2);    line(x2,y2,x3,y3);    line(x3,y3,x4,y4);    line(x4,y4,x1,y1);    If sb>0 then       hv((x1+x2) DIV 2, (y1+y2) DIV 2,(x2+x3) DIV 2,(y2+y3) DIV 2,          (x3+x4) DIV 2,(y3+y4) DIV 2,(x4+x1) DIV 2,(y4+y1)DIV 2,sb­1); End; Begin  clrscr;    gd:=detect;    Initgraph(gd,gm,' ');    hv((getmaxX­w) DIV 2,(getmaxY­w) DIV 2,(getmaxX­w) DIV 2,     (getmaxY+w) DIV 2,    (getmaxX+w) DIV 2,(getmaxY+w) DIV 2,(getmaxX+w) DIV 2,    (getmaxY­w) DIV 2,16);    Readln;    closeGraph; End.

ế ệ ổ 8/ Vi t các hàm đ  quy tính các t ng S sau:

k+1k!! (k<1000)

ể 8.1­ Tính N!! . Sau đó dùng hàm đó đ  tính: S=1!!­2!!+…+(­1)

n

i

1

-+ n

8.2­ S=1+22+33+44. . .+nn

n

3

8.3­ S= n n - + + 1 ... + + i ... 2

+ 8.4­ S= 1

n

2

3

ấ có n d u căn. + nn n - + + 1 ... + 2 1

+ + *8.5­ S(n)= ố ự   trong đó x là s  th c x + + ... x n x 2! x 3! !

ế ư ở ể ệ ấ ậ ứ ế ổ bi u th c đã cho, thì hãy bi n đ i toán ể ấ c đ  quy. ượ ệ ạ ệ ẻ ư ế ạ ổ ệ ứ ạ Ợ G I Ý: N u nh  tho t nhìn, không th y quy lu t dùng đ  quy  ứ ọ h c nó sao cho xu t hi n bi u th c dùng đ ẳ ấ ớ Ch ng h n bài 8.5 có v  khó nh t v i các b n. Ta bi n đ i nó nh  sau: a) Nhìn vào h  th c (8.5) ta suy ra:

n

n

2

3

2

1

- - + + + x + + ... S(n­1) = - - x n x n x 2! x 3! ( ( 2)! 1)!

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

89

n

n

2

3

3

2

- - + + + x + + ... S(n­2) = - - x n x n x 2! x 3! ( ( 3)! 2)!

nx n !

n

ệ ượ b)  Tính hi u S(n) – S(n­1) ta đ c  S(n) = S(n­1) + (*)

(

)

- - - ệ ượ c)  Tính hi u S(n­1) – S(n­2) ta đ c (**) S n ( 1) S n ( = 2) x n x n !

ậ ể ế ế ế ệ Th  (**) vào (*) ta có ngay quy lu t đ  thi t k  đ  quy tính S(n):

)

-

(

ậ ệ ệ S n ( - + 1) S n ( 2) S(n) = S(n­1)  + quy lu t đ  quy đã hi n rõ! (cid:0) x n

ệ ạ ế ệ ễ ố ớ ạ Vi c còn l i (vi t code tính S(n)) là vi c d  đ i v i các b n!

ệ ấ ả ọ ừ ị 9­ Li t kê t t c  các dãy nh  phân dài n (n đ c t bàn phím vào).

Uses Crt; Var i,n:integer;       b:Array[1..100] of 0..1; tt:byte;

Procedure Result; Var  i: Integer; Begin    For i:=1 to n Do Write(b[i]:2); Writeln; End;

Procedure Try(i:Integer); Var j:Integer; Begin    For j:=0 to 1 do       Begin          b[i]:=j;          If i=n Then Result Else Try(i+1);       End; End;

Begin  clrscr;   Repeat      Write('Nhap n:'); Readln(n);      Try(1);      Writeln;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

90      Write('Another Test (1/0)?. Come

on ­> Press 1, Stop ­> Press 0:');      Readln(tt);   Until tt=0; End.

ề ứ ố ọ ể ố ọ ể ấ ộ ị

*10­ Đi n các d u “(“, “)” và 4 phép tính s  h c vào m t bi u th c s  h c đ  tính đúng gía tr  n cho  tr c.ướ

Program Dien_dau_phep_tinh; Uses crt; Var p,a:array[1..100] of char; i,j,k,h,d:longint; n:real;hoi:char;

Procedure Inra; Begin       Write('(((((');            For i:=1 to 6 do                 Begin                      If i=1 then Write(i,a[i]);                      If i>1 then Write(i,')',a[i]);                End;          Writeln;          d:=d+1; End;

Procedure Test(k:integer); Var j,i1:integer; t:real; Begin For j:=1 to 4 do Begin        a[k]:=p[j];        If k=5 then           Begin                t:=1;                For i1:=2 to 6 do                    Begin                          If a[i1­1]='­' then t:=t­i1;                          If a[i1­1]='+' then t:=t+i1;                          If a[i1­1]='*' then t:=t*i1;                         If a[i1­1]='/' then t:=t/i1;                    End;                    If t=n then Inra;          End     Else Test(k+1); End; End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

91

Begin    clrscr; Repeat       Writeln;               Write('Nhap gia tri n can co='); Readln(n);               d:=0;               p[1]:='­';               p[2]:='+';               p[3]:='*';               p[4]:='/';         Test(1); Writeln; Writeln(' Co ',d,' cach dien cac phep tinh de bieu thuc da cho co gia tri bang so ',n:9:2); Write('Another Test (y/n)?'); Readln(hoi); Until hoi In ['n','N']; End.

ệ ấ ả ậ ố ừ ộ ố ướ ộ ố t kê t t c  các s  dài n l p nên t b  s  đã cho. c b  s  1, 2, 3, 4. Li

11­ Cho tr CODE. Uses Crt; Var n:Byte; a:Array[1..20] of Byte; Ans:Char;

Procedure Result_Print; Var i:Byte; Begin        For i:=1 to n Do              Write(a[i]); End; Procedure For_Recur(i:integer); Var j:Byte; Begin       For j:=1 to 4 do             Begin                   a[i]:=j;                   If i

Begin clrscr;   Repeat       Write('Nhap n:'); Readln(n);            For_Recur(1);           Write('More(c/k)?. Come on­> Press c; Stop­.Press k or K.');           Readln(Ans); 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

92

Until Ans In ['k', 'K']; End.

ướ ố ướ ạ c (n cho tr c). Phân ho ch dãy này thành các dãy con. Tìm  ế ố ậ ớ ả

ầ ử ộ **12­ Nh p vào m t dãy s  có n ph n t ỗ ộ ấ ủ ố s  chung l n nh t c a các s  thu c m i dãy con. In k t qu  lên màn. Program PhanHoach_Tap; uses crt; Type m=array[1..100] of integer; Var c,a:m; p:array[1..100] of Boolean; z,i,n,dem:integer;

Function uscln(a,b:integer):integer; Begin        while a<>b do            begin                   if a>b then a:=a­b                  Else b:=b­a;            end;             uscln:=b; end;

Procedure thu(k:integer); var j,i1,us1,i,j1:integer; Begin         for j:=z to n do               if p[j] then                     Begin                           c[k]:=a[j]; p[j]:=False;                           If k>1 then                                  Begin                                         dem:=dem+1;                                         Writeln('* Tap con thu ',dem,' la:');                                         For i1:=1 to k do                                                 write(c[i1]:4);Writeln;                                                 us1:=c[1];                                         For j1:=2 to k do us1:=uscln(us1,c[j1]);                                        Write('Uoc so chung lon nhat cua ');                                        Writeln(' tap con thu ',dem,' la:',us1);                                 End;              If k<>n then                    Begin                          z:=j+1; Thu(k+1);                    End;                    p[j]:=true;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

93

z:=j­1;       End; End;

ư Begin     clrscr; Write('Vao n='); Readln(n);              For i:=1 to n do                    Begin                          Write('a[',i,']='); Readln(a[i]);                    End;                   dem:=0; z:=1;                    For i:=1 to n do p[i]:=true;                          Thu(1);                 Writeln;                 Writeln('Voi so n=',n,' vua nhap vao, so tap con =',dem);          Readln { không có “;” cũng nh  có “;” } End.

ạ ậ ộ ừ ừ ữ ế ấ có t 2 đ n 4 ch  cái (trong đó có ít nh t ữ ộ ộ ế ủ ư *13­Cho b  9 ch  cái a, b, c, d, e, f, g, h, i. L p trình t o các t 1 nguyên âm) thu c b  trên. K t q a l u lên text file cactu.ou

Uses Crt; Const chucai=['a','e','i'];       fo='cactu.ou'; Var c:ArrAy[1..5] Of Char;     yes:Boolean;     dem, n:longint;     f:text;

Procedure WriteTo; Var i:integer; Begin    {Inc(dem);}    For i:=1 to n Do Write(f,c[i],' ');    Writeln(f); End;

Procedure Tim(i:Integer); Var ch:char; nho:Boolean; Begin   Nho:=yes;   For ch:='a' to 'i' do      Begin         c[i]:=ch;         If ch In chucai then yes:=True;         If (i=n) Then            Begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

94

If yes then WriteTo

End         Else            Tim(i+1);         yes:=nho;      End; End;

Begin clrscr;

{Dem:=0;}   Assign(f,fo); Rewrite(f);   For n:=2 to 4 do     Begin        yes:=False;        Tim(1);     End;   {Writeln(f,'So tu da liet ke=',dem);}   Close(f);   Write('Done!');   Readln; End.

ờ ướ ế ể ượ ỗ ầ ng 8x8 đ  không quân nào ăn đ ầ c  nào. Yêu c u: M i l n ừ ế 14/ Tìm cách x p 8 quân xe lên bàn c  t ả ộ xem t ng k t qu  m t. Xem ti p gõ  ENTER; Thoát  gõ CTRL­ECS.

ế Uses Crt; Const fo='tamxe.ou'; Var f:Text; d:word;  line:string;    cx:Array[1..8] Of Boolean;     a:Array[1..8] of Byte;

Procedure WriteOnFile; Var i:Byte; Begin    Inc(d);    Writeln(f);    Write(f,'cachh thu ',d,':');    For i:=1 to 8 do Write(f,'[',i,',',a[i],']',';'); End;

Procedure Try(k:Byte); Var i:Byte; Begin   For i:=1 to 8 do     If cx[i] Then       Begin          a[k]:=i;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

95

cx[i]:=False;

If k=8 then WriteOnFile Else Try(k+1);          cx[i]:=True;       End; End;

Begin   Clrscr;   d:=0;   FillChar(cx,sizeof(cx),True);   Assign(f,fo); Rewrite(f);   Try(1);   Reset(f);   While Not SeekEof(f) Do    Begin      Readln(f,line);      Writeln(#32:7,line);      If (d MOD 20)=0 Then Readln;  {De xem tung dap so mot; Go CTRL­ESC: Thoat}    End;   Close(f);   Readln; End.

= = = = = = = = = = = = = = = = = =

PH N VI.

B N GHI & T P  (RECORD and FILES)

L p trình làm các vi c sau:

RECORD

ố ự 1/Th c hi n các phép toán trên hai phân s . Uses Crt; Type phanso=Record           ts,ms:Integer; End; Var ps1,ps2,ps3:phanso; pheptoan,tiep: char;     err: Boolean;

Procedure Nhap(Var ps:phanso); Begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Write('Nhap tu:');Readln(ps.ts);      Write('Nhap mau:');Readln(ps.ms); End;

Procedure Xuat(Var ps:phanso); Begin      Write('(',ps.ts,'/',ps.ms,')'); End;

Procedure Cong(ps1,ps2:phanso; Var tps:phanso); Begin      tps.ts:=ps1.ts*ps2.ms+ps1.ms*ps2.ts;      tps.ms:=ps1.ms*ps2.ms; End;

Procedure Tru(ps1,ps2:phanso; Var tps:phanso); Begin

tps.ts:=ps1.ts*ps2.ms­ps1.ms*ps2.ts;      tps.ms:=ps1.ms*ps2.ms; End;

Procedure Nhan(ps1,ps2:phanso; Var tic:phanso); Begin     tic.ts:=ps1.ts*ps2.ts;     tic.ms:=ps1.ms*ps2.ms; End;

Function Uscln(a,b:integer):integer; Begin      While a<>b do        If a> b then a:=a­b        Else b:=b­a;        Uscln:=a; End;

Procedure Rutgon(Var ps:phanso); Var uc:integer; Begin     uc:=Uscln(ps.ts,ps.ms);

96

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

ps.ts:=ps.ts DIV uc;     ps.ms:=ps.ms DIV uc; End;

Procedure Doidau(Var ps:phanso); Begin      ps.ts:=­ps.ts; End;

Procedure Ngichdao(Var ps:phanso); Var tam:integer; Begin       tam:=ps.ts;       ps.ts:=ps.ms;       ps.ms:=tam; End;

{Main Prog.}

Begin clrscr; Repeat    Write('Nhap ps thu nhat:'); Writeln;    Nhap(ps1);    Write('Nhap ky hieu phep toan:'); Readln(pheptoan);    err:=false;    If pheptoan In ['+','­','*',':'] Then        Begin            Writeln;            Write('Nhap ps thu hai:');            Writeln;            Nhap(ps2);            Write('Ket qua:');            Xuat(ps1);            Write(pheptoan);            xuat(ps2);            Write('=');

Case pheptoan of               '+':Begin Cong(ps1,ps2,ps3); Rutgon(ps3); End;               '­':Begin

97

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Tru(ps1,ps2,ps3);                               Doidau(ps2);                                cong(ps1,ps2,ps3);                                Rutgon(ps3);                   End;               '*':Begin nhan(ps1,ps2,ps3);Rutgon(ps3);  End;

':':If ps2.ts<>0 then                      Begin                          Ngichdao(ps2);                          Nhan(ps1,ps2,ps3);                          Rutgon(ps3);                       End                   Else err:=true;             End;            If Not err Then                 Begin                    Xuat(ps3);                    Writeln;                    Write('Go phim bat ky de tiep tuc cong viec!'); Readln;                    Clrscr;                 End            Else Write('Loi: khong chia duoc cho Zero!');            Writeln;            End            Else Writeln('Program chua lam duoc phep toan nay!');

Write('More(y/n)?, tiep ­> go y, ngung ­> go n:');            Readln(tiep); Until tiep='n'; End.

ứ 2/ Th c hi n các phép toán trên hai đa th c

Uses Crt; Const max=20; Type dathuc=record         bac:integer;         hso:Array[0..max] of real; End;

98

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Var a,b,c:dathuc; i:integer; Procedure Nhap(kh:String; var p:dathuc); Begin   Writeln; Writeln; With p do    Begin       Repeat          Write('Nhap vao lan luot bac ',Chr(Ord(kh[1])+7),          ' va cac he so cua da thuc ',kh,'=');          Readln(bac);          If bac>max Then            Write('Bac cua da thuc phai <=max)',max);       Until (Bac>=1) And (Bac<=max);       For i:=bac downto 0 Do          Begin Write(#32:3,'a[',i,']='); Readln(hso[i]); End;     End; End;

Procedure PolyDisp(kyhieu:string; p:dathuc); Begin    Write(kyhieu,'=');    With p do       Begin         For i:=bac downto 1 Do           Begin             If hso[i]<>0 Then              Begin                If Frac(hso[i])=0 Then                    Write(hso[i]:0:0,'.x')                Else Write(hso[i]:0:2,'.x');                If i>1 then Write('^',i);              End;              If hso[i­1]>0 Then Write('+');           End;            If hso[0]<>0 Then            If Frac(hso[0])=0 Then Write(hso[0]:0:0)            Else Write(hso[0]:0:2);       End;       Writeln;

99

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

End;

Procedure PolyAdd(p,q:dathuc; Var sum:dathuc); {cong da thuc} Var i,j:integer; Begin    If p.bac>q.bac Then sum.bac:=p.bac    Else sum.bac:=q.bac;    For i:=sum.bac downto 0 Do      sum.hso[i]:=p.hso[i]+q.hso[i];    Write('Tong cua 2 d/thuc f(x) va g(x) la:');    Polydisp('S(x)',sum); End;

Procedure PolySubt(p,q:dathuc; Var h:dathuc);  {tru da thuc} Var i,j:integer; Begin       If p.bac>q.bac Then h.bac:=p.bac     Else h.bac:=q.bac;     For i:=h.bac downto 0 Do       h.hso[i]:=p.hso[i]­q.hso[i];    Write('Hieu cua 2 d/thuc f(x) va g(x) la:');    Polydisp('H(x)',h); End;

Procedure PolyFact(p,q:dathuc; Var tic:dathuc);  {nhan da thuc} Var i,j:integer; Begin    tic.bac:=p.bac+q.bac;    For i:=0 to tic.bac do tic.hso[i]:=0;    For i:=p.bac downto 0 Do    For j:=q.bac downto 0 Do      tic.hso[i+j]:=tic.hso[i+j]+p.hso[i]*q.hso[j];      Write('Tich cua 2 dthuc f(x) va g(x) la:');    Polydisp('T(x)',tic); End;

Procedure PolyDivi(p,q:dathuc; Var thg:dathuc);  {chia da thuc} Var i,j,m:integer; du:dathuc; Begin   m:=p.bac­q.bac;

100

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

If m<0 Then      Begin         Write('Khong chia duoc!');         Readln;         Exit;      End;      For i:=0 to m Do thg.hso[i]:=0;        thg.bac:=m;      For i:=m Downto 0 Do         Begin           thg.hso[i]:=p.hso[p.bac]/q.hso[q.bac];           For j:=q.bac downto 0 Do             p.hso[p.bac­q.bac+j]:=p.hso[p.bac­q.bac+j]­thg.hso[i]*q.hso[j];             p.bac:=p.bac­1;          End;      du:=p;      While (du.hso[du.bac]=0) and (du.bac>0) Do          du.bac:=du.bac­1;          Write('Thuong cua 2 dthuc f(x) va g(x) la:');          PolyDisp('Th(x)',thg);          If (du.bac=0) then Write('2 dthuc da cho chia het nhau!')          Else Polydisp('Da thuc du',du); End; {Main Prog} Begin  clrscr;    Nhap('f(x)',a);    Nhap('g(x)',b);    Writeln('Cac da thuc vua nhap:');    PolyDisp('f(x)',a);    PolyDisp('g(x)',b);    Writeln;    PolyAdd(a,b,c);    Writeln;    PolySubt(a,b,c);    Writeln;    PolyFact(a,b,c);    Writeln;    PolyDivi(a,b,c);   Readln; End.

101

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

ố ứ

ố ệ 3/Th c hi n các phép toán trên hai s  ph c. (V i nhi u h c sinh, phép tính chia hai s   ph c là khó nh t!)

Uses Crt; Type complex=Record              thuc,ao:Real; End;

Var a,b,c: complex;

Procedure Input(kt: Char; Var x: complex); Begin   Writeln('Nhap so phuc ',kt,':');   Write('Phan thuc:'); Readln(x.thuc);   Write('Phan ao:'); Readln(x.ao); End;

Procedure WriteCompl(x:complex); Begin    Write('(');    If Frac(x.thuc)=0 then Write(x.thuc:0:0)    Else Write(x.thuc:0:2); Write(';');    If Frac(x.ao)=0 then Write(x.ao:0:0)    Else Write(x.ao:0:2); Write(')'); End;

Procedure Add(x,y:complex; Var z:complex); Begin     z.thuc:=x.thuc+y.thuc;     z.ao:=x.ao+y.ao; End;

Procedure Sub(x,y:complex; Var z:complex); Begin     z.thuc:=x.thuc­y.thuc;     z.ao:=x.ao­y.ao; End;

Procedure Multip(x,y:complex; Var z:complex);

102

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Begin   z.thuc:=x.thuc*y.thuc­x.ao*y.ao;   z.ao:=x.thuc*y.ao+x.ao*y.thuc; End;

Procedure Divi(x,y:complex; Var z:complex); Begin     z.thuc:=(x.thuc*y.thuc+x.ao*y.ao)/(sqr(y.thuc)+sqr(y.ao));     z.ao:=(x.ao*y.thuc­x.thuc*y.ao)/(sqr(y.thuc)+sqr(y.ao)); End;

Begin  clrscr;   Input('A',a);   Input('B',b);   clrscr;   Writeln('Hai so phuc vua nhap la:');   Writeln;   Write('So phuc A:'); WriteCompl(a); Writeln;   Write('So phuc b:'); WriteCompl(b); Writeln;     Add(a,b,c);     Write('Tong 2 so phuc vua nhap='); WriteCompl(c); Writeln;     sub(a,b,c);     Write('Hieu 2 so phuc vua nhap='); WriteCompl(c); Writeln;     Multip(a,b,c);     Write('Tich 2 so phuc vua nhap='); WriteCompl(c); Writeln;     Divi(a,b,c);     Write('Thuong cua 2 so phuc vua nhap='); WriteCompl(c);    Readln; End.

FILES

ượ ư

i sân bay N i Bài đ

c l u trong text file tên là

ế

ấ ồ

ủ ừ

ữ ệ

ng c a t ng đ  xách tay (túi, h p, balô …) c a m i khách. D  li u ra g m hai

ượ

ng các đ  xách tay c a m i khách bay;

ế

103

ị ủ Ặ ố ồ

ế ổ ơ

ườ

ư ậ

4/ Các thông tin Check In c a khách t ầ KHACHBAY.VAO có c u trúc sau: Dòng đ u ghi s  khách bay, các dòng ti p theo ghi  ượ ọ tr ng l text file:  ổ file TRONGLUONG.RA ghi t ng tr ng l ố ứ ự ủ ữ  c a nh ng khách bay b  h y chuy n bay n u t ng tr ng  file HUYBAY.RA ghi s  th  t ủ ượ l  20 KG HO C s  đ  xách tay nhi u h n 5. i này  ng các đ  xách tay c a ng ụ ề ướ D i đây là m t ví d  v  3 files nh  v y:

(cid:0)

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

ự ố

tr ng)

KHACHBAY.VAO                       5 19.5 2.5   1.5   2   3.25   1    3   (Trên m i dòng các s  cách nhau ít nh t m t ký t 6.25   2.5   7 12   6.5   4   10   7.5 2   6   8

TRONGLUONG.RA                                   19.50                                                             13.25                                                             15.75 40.00 16.00

HUYBAY.RA →

ố ồ

khách này có s  đ  xách tay >5

104

Uses Crt; Var tepvao,tepra,tephuy: Text;        sum,w: Real; n,i,k:Byte;      Begin Clrscr;    Assign(tepvao,'khachbay.vao'); Reset(tepvao);    Readln(tepvao,n);    Assign(tepra,'trgluong.ra'); Rewrite(tepra);    Assign(tephuy,'huybay.ra'); Rewrite(tephuy);    For i:=1 to n do    Begin      sum:=0; k:=0;      While Not(SeekEoln(tepvao)) Do         Begin            Read(tepvao,w);            sum:=sum+w;            k:=k+1;         End;         Writeln(tepra,sum);         If (sum>20) Or (k>7) Then Writeln(tephuy,i);         Readln(tepvao);

2      4

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

End;    Close(tepvao);    Close(tepra);    Close(tephuy);

Assign(tepra,'trgluong.ra');  Reset(tepra);    Writeln('Noi dung cua file trgluong.ra ghi tong trongluong');    Writeln(' cac kien hang cua tung khach hang:');    Writeln;      While Not(SeekEof(tepra)) do        Begin          Readln(tepra,sum);          Writeln(sum:0:2);        End;    Close(tepra);    Writeln;    Assign(tephuy,'huybay.ra');  Reset(tephuy);    Writeln('Noi dung tep huybay.ra ghi so thu tu cac khach bi huy bay:');    Writeln;       While Not(SeekEof(tephuy)) do        Begin           Readln(tephuy,i);           Writeln(i);      End;     Close(tephuy);     Readln; End.

ả ố ươ

ẫ ố

ượ ư

ng l n s  âm) đ

c l u trên text file

ị ộ

ng lên file POSI.DAT, c t các s  âm lên fie NEGA.DAT. Hi n th  n i

ố 5/ Các s  nguyên (g m c  s  d SONGUYEN.DAT, ố ươ Hãy c t các s  d dung hai file này lên màn hình.

Program PosiNegaFile; Uses Crt; Var f1,f2,f3: file Of Integer;     i,n,x:integer; Begin clrscr;   {$I­} Assign(f1,'Songuyen.dat'); Rewrite(f1); {$I+}         Write('Cho so luong cac so nguyen:'); Readln(n);

105

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

For i:=1 to n do           Begin              Write('So thu ',i,':');              Readln(x);              Write(f1,x);           End;      Close(f1);      Write(#10#13,'Da nhap xong ',n,' so nguyen len file songuyen.dat');      Writeln('Press Any Key to Continue...');      Repeat Until KeyPressed;      Readkey;      Clrscr;    {$I­} Assign(f1,'Songuyen.dat');           Assign(f2,'Posi.dat');          Assign(f3,'Nega.dat');           Reset(f1);          Rewrite(f2);          Rewrite(f3);    {$I+}    {Ghi cac so Duong len File f2, ghi cac so am len file f3}      While Not EOF(f1) Do        Begin           Read(f1,x);           If (x>=0) Then Write(f2,x)           Else Write(f3,x);        End;    Close(f1); Close(f2); Close(f3);   {Doc Data cua file f2}    Assign(f2,'Posi.dat'); Reset(f2);    Writeln('Data tren file Posi.dat:');      While Not EOF(f2) Do        Begin           Read(f2,x);           Write(x:3);        End;    Close(f2);   Writeln;   { Doc Data tren file f3}    Assign(f3,'Nega.dat'); Reset(f3);    Writeln('Data tren file Nega.dat:');

106

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

While Not EOF(f3) Do        Begin           Read(f3,x);           Write(x:3);        End;    Close(f3);    Write(#10#13,' Press Any Key to continue...');    Repeat until KeyPressed; End.

ộ ố ố

ặ ở ả

ố ư

c  hai file trên và

ộ ố ố 6/Text file Num1.txt ch a m t s  s  nguyên; text file Num2.txt cũng ch a m t s  s   nguyên. Hai files này có vài s  nh  nhau. Tìm và “nh t” các s  có m t  ộ ư l u chúng lên file Ketqua.txt. Hi n n i dung  file Ketqua.txt lên màn hình.

Uses Crt; Var f1,f2,f3: Text;     m,n,i,j,x:Integer;     a1,a2:Array[1..100] of Integer; Begin  clrscr;   {$I­}    Assign(f1,'Num1.txt');    Assign(f2,'Num2.txt');    Rewrite(f1);    Rewrite(f2);   {$I+}   Write('Cho so cac so trong file Num1.txt:'); Readln(m);   Writeln(f1,m);   For i:=1 to m do     Begin        Write('So thu ',i,':');        Readln(x);        Writeln(f1,x:3);     End;     Close(f1);   Write('Cho so cac so trong file Num2.txt:'); Readln(n);   Writeln(f2,n);   For i:=1 to n do     Begin        Write('So thu ',i,':');

107

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Readln(x);        Writeln(f2,x:3);     End;     Close(f2);  {$I­}    Assign(f1,'Num1.txt');    Assign(f2,'Num2.txt');    Assign(f3,'Ketqua.txt');    Reset(f1);    Reset(f2);    Rewrite(f3);  {$I+}  {Doc Data tren file f1 vao mang a1 (tuc vao Ram)}   Readln(f1,m);   For i:=1 to m do     Readln(f1,a1[i]);  {Doc Data tren file f2 vao mang a2 (tuc vao Ram)}   Readln(f2,n);   For j:=1 to n do     Readln(f2,a2[j]);   Writeln;   Writeln('CAC SO CO MAT O CA 2 FILE:');   Writeln;   For i:=1 to m do     For j:=1 to n do       Begin         If a1[i]=a2[j] Then            Begin              Writeln(f3,a1[i]:3);              Writeln(a1[i]:3);            End;       End;   Close(f1);   Close(f2);   Close(f3);    Write(#10#13,'GO PHIM BAT KY DE TIEP...');   Repeat Until KeyPressed; End.

108

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

= = = = = = = = = = = = = = = = = = =

109

Ồ Ọ

PH N VII.

Đ  H A (GRAPHIC)

ị ớ

ườ

(Ít nh t cũng có 5 bài khá thú v  v i nh ng ng

ậ i mê l p trình:

ạ Ấ Ả

ẽ ồ ặ ậ

ặ ậ

ủ   Ộ đó là các bài: In l ch; V  đ ng h ; Kính v n hoa; Tìm M T nghi m c a bài toán Đ t H u; Tìm T T C  NGHI M có th cho bài toán Đ t H u)

ờ ữ Ả Ấ Ả Ề Ỗ Ợ Ạ Ả Ế Ế Ờ Ặ Ừ L i khuyên h u ích: T T C  CÁC BÀI TOÁN GRAPHIC VÀ GRAPH  DÙNG GRAPHIC Đ U PH I  CH Y TRONG CÁC PHIÊN B N  WINDOW CÓ H  TR  FULL SCREEN MODE.  Đ N CH T  CŨNG Đ NG QUÊN L I D N NÀY!!!

ồ ọ ậ ự L p trình Đ  h a  th c thi các bài toán sau:

ẽ ộ ề 1/  V  c t phát sóng và các vòng sóng truy n lan.

Uses Crt, Graph; Var Gd, Gm: Integer; r:word;

Begin  clrscr;    Gd:=Detect; InitGraph(Gd,Gm,'D:\BP\BGI');    r:=15;    Repeat      SetColor(4);      MoveTo(300,200);      LineTo(320,440);      LineTo(280,440);      LineTo(300,200);      Rectangle(280,440,320,470);      SetColor(15);      Circle(300,200,r);      Delay(100);      If r>GetmaxY/2 then ClearDevice;      If r<=GetmaxY/2 then r:=r+30      Else r:=15;    Until KeyPressed;    CloseGraph; End.

ụ ẽ ồ ổ 2/ V  các vòng tròn đ ng tâm đ i màu liên t c.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

110

Uses Crt,Graph; Var i,j,Gd,Gm,xt,yt,yc:Integer;     r:Word; hoi:char;

Begin clrscr;   Gd:=Detect; InitGraph(Gd,Gm,'D:\BP\BGI');   If GraphResult<>0 Then      Begin         Write('Loi do hoa.');         Halt;      End    Else      Begin        xt:=getMaxX Div 2;        yt:=GetMaxY Div 2;        yc:=GetMaxY Div 30;      End;   Repeat      SetBkColor(Black);      SetColor(15);      Rectangle(1,1,200,15);      SetColor(12);      OutTextXY(12,5,'PRESS ANY KEY TO STOP.');      R:=1;      For i:=1 to 15 do        Begin           SetColor(Random(16));           For j:=1 to yc do              Circle(xt,yt,r+j);              Inc(r,yc);        End;   Until KeyPressed;   CloseGraph; End.

ẽ ồ ị ầ ươ ấ ắ ặ 3/ V  đ  th  hàm sinx (ho c cosx: Tùy!).Yêu c u: ch ể ng trình ng n nh t có th .

uses crt,graph; var mh, mot,maxx,maxy, xtam,ytam:integer;     x, y:real; Function F(x:real):real; Begin     F:=sin(x); End;

Begin clrscr;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

111

mh:=Detect;  InitGraph(mh,mot,'..\BGI');     SetBkColor(Cyan);     If GraphResult<>GrOk then Halt     Else        Begin            maxx:=Getmaxx;maxy:=Getmaxy;            xtam:=maxx DIV 2;            ytam:=maxy DIV 2;            Setcolor(White);            Line(0,ytam,maxx­5,ytam);            OutTextxy(maxx­10,ytam­3,'>');            Line(xtam,5,xtam,maxy);            OutTextxy(xtam­3,5,'>');            OutTextxy(xtam­10,ytam+10,'O');            X:=­4*Pi;            Repeat               y:=Round(F(x)*40);               PutPixel(Round(20*x)+xtam,ytam­Round(y),Red);               x:=x+0.001;           Until x>4*Pi;          Readln;          closegraph;       End; End.

ị ươ ạ ươ ự ị ờ ườ *4/ In l ch d ng có khuôn d ng t ng t l ch t to treo t ng.

PROGRAM InLich; Uses Crt,Graph,Dos; Label 1; Var n,m,y: integer;

Function NumDays(m: integer): Integer; {Ham tra ve so ngay trong thang} Begin      case m of    4,6,9,11:NumDays:=30;    2:if (m mod 4)<>0 then NumDays:=28 else      begin        if (m mod 100)<>0 then NumDays:=29 else          begin            if (m mod 400)<>0 then NumDays:=28 else NumDays:=29          end      end    else Numdays:=31   end;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

112

End;

{Ham tra ve so thu tu cua thu trong tuan ung voi ngay mong 1 cua thang} function FirstDay(m,y:word): word; var d,y1,m1,d1,dow1,dow: word; Begin   d:=1;   GetDate(y1,m1,d1,dow1);   setdate(y,m,d);   GetDate(y,m,d,dow);   FirstDay:=dow;   setdate(y1,m1,d1); End;

Procedure In_lich(m,y: integer); var i,j,k,n,rows,cols,gd,gm: integer; Begin

k:=FirstDay(m,y);     n:=numDays(m);     Cols:=7;     Rows:= (n+k) DIV 7;     if (n+k) MOD 7 <> 0 then Rows:= Rows + 1;     Writeln;     textmode(c80);     textcolor(12);

Writeln(#32:16,'LICH THANG ',m,' ­ NAM ',y); writeln(#32:16,'­­­­­­­­­­­­­­­­­­­­­­­­­'); writeln; textcolor(lightmagenta); Write('SUN':8); textcolor(lightgreen); Write('MON':8,'TUE':8,'WED':8,'THU':8,'FRI':8); textcolor(lightblue); Writeln('SAT':8); Writeln; For i:=1 to n+k do Begin     If i<=k then Write(#32:8)        Else            Write(i­k:8);  textcolor(yellow);     If i MOD 7 = 0 then Writeln; End; End;

BEGIN

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

113

1:clrscr;   Write('Nhap thang,nam (nam co 4 chu so):');   readln(m,y);   In_lich(m,y);   Writeln(#10#13);   textcolor(lightmagenta);   Write('Nhan phim bat ky de tiep tuc. Nhan "k" de ket thuc...');   if readkey<> 'k' then goto 1; END.

ế ể ỉ ử ậ ữ ệ Ố Ấ ạ ớ ớ Ư Ớ Ị ả ạ ứ ủ ấ ả Ỏ

ấ ỳ ể ạ ậ ở ộ ể ế ả ầ Cách ki m tra k t qu  ch y program xem có CHÍNH XÁC KHÔNG: G a s  nh p d  li u là tháng 7 năm  ứ 2017 thì L U Ý: Ra SAT  ng v i ngày 8, SUN  ng v i ngày 9 là prog. ch y chính xác. T T NH T NÊN SO V I L CH B  TÚI c a nhà xu t b n uy tín.       *5/ T o l p b ng mã ASCII m  r ng.  Yêu c u: gõ PgDn đ  xem ti p. Gõ phím b t k  đ  thoát.

Program AsciiTable; Uses Crt, Addcrt; Label 1; Const Hexa:Array[0..15] of Char='0123456789ABCDEF'; Type St=String[3]; Var i,j,x,m,n,y,e:Integer;     ch:Char;

Procedure Box(x1,x2,y1,y2:Byte); Var i:Byte; Begin    If (x1<0)Or (y1<0) Or (x2>80) Or (y2>25) Or (x1>x2) Or (y1>y2) Then exit;    Textcolor(0);    GotoXY(x1,y1); Write('I');       GotoXY(x2,y1); Write(';');         GotoXY(x1,y2); Write('H');           GotoXY(x2,y2); Write('<');    For i:=(x1+1) to (x2­1) Do       Begin          GotoXY(i,y1);          Write('M');       End;    For i:=(x1+1) to (x2­1) Do       Begin          GotoXY(i,y2);          Write('M');       End;    For i:=(y1+1) to (y2­1) Do       Begin          GotoXY(x1,i);          Write(':');

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

114

End;    For i:=(y1+1) to (y2­1) Do       Begin          GotoXY(x2,i);          Write(':');       End; End;

Procedure Color(x1,x2,y1,y2:Byte); Begin    Tomau(x1,y1,x2,y2,3);    Box(x1+1,y1+1,x2­1,y2­1);    Tomau(x1+2,y1+2,x2­2,y2­2,3); End;

Function Doi(i1:Byte):St; Begin    Doi:=Hexa[i1 Shr 4]+Hexa[i1 And $0F]; End;

Begin {Main}    TextBackGround(3);    clrscr;    Cursor(1);    Khungdon(2,2,79,24,15);TextC(14,9); Writexy(35,2,' TABLE ASCII ');    TextC(1,15);    WriteXY(50,3,'Wroten By TRAN THONG QUE'); TextC(4,3);    Window(2,4,79,24);    x:=1; y:=1;       While (x<=72) Do         Begin            Khungdon(x+2,y,x+8,y+2,15);            Khungdon(x+2,y+2,x+8,y+19,15);            x:=x+6;         End;       i:=3;       While (i<=79) Do         Begin           GotoXY(i,3); Write(#197);           i:=i+6;         End;         WriteXY(3,3,'C'); WriteXY(75,3,'D');       i:=9;       While (i<=79) Do          Begin             WriteXY(i,1,'B');             i:=i+6;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

115

End;          WriteXY(75,1,'Y');       i:=9;       While (i<=79) Do          Begin             WriteXY(i,20,'A');             i:=i+6;          End;          WriteXY(75,20,'Y');       TextC(1,3); x:=5;     For i:=1 to 4 Do Begin WriteXY(x,2,'Deci'); x:=x+18; End; x:=11;       For i:=1 to 4 Do Begin WriteXY(x,2,'Hexa'); x:=x+18; End; x:=17;         For i:=1 to 4 Do Begin WriteXY(x,2,'Char'); x:=x+18; End;   Repeat       m:=64; n:=16;       Window(4,4,76,24);       y:=2; i:=4; j:=1; e:=4;          Repeat             While (i<=m) And (j<=n) Do                Begin                   TextC(e,3); WriteXY(15,10,' ');                   WriteXY(15,11,' '); WriteXY(15,13,' ');                   WriteXY(15,16,' ');                   GotoXY(y,i); Write(j:3);                   GotoXY(y+6,i); Write(Doi(j):3);                    If (j<>7) Then                       Begin                          GotoXY(y+12,i); Write(chr(j):3);                       End;                   i:=i+1; j:=j+1;                 End;              y:=y+18; i:=4; n:=n+16; e:=e+2;          Until n=80;     SetWin;       WriteXY(40,24,'PgDn­>Continue; Other Key­>Quit.');       ch:=Readkey;       If ch=#0 then ch:=Readkey; If ch<>#81 then Goto 1;       m:=128; n:=80;       Window(4,4,76,24);       y:=2;i:=4; j:=65; e:=4;         Repeat            While (i<=m) And(j<=n) Do               Begin                  TextC(e,3);                  GotoXY(y,i); Write(j:3);                  GotoXY(y+6,i); Write(Doi(j):3);                  GotoXY(y+12,i); Write(chr(j):3);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

116

i:=i+1; j:=j+1;               End;            y:=y+18;  i:=4; n:=n+16; e:=e+2;         Until n=144;      Setwin;      Write(40,24,'PgDn­>Continue; Other key­>Quit.'); ch:=Readkey;        If ch=#0 then ch:=Readkey;  If ch<>#81 then Goto 1;        m:=192; n:=144;        Window(4,4,76,24);        y:=2; i:=4; j:=129; e:=4;     Repeat        While (i<=m) And (j<=n) do           Begin              TextC(e,3);              GotoXY(y,i); Write(j:3);              GotoXY(y+6,i); Write(Doi(j):3);              GotoXY(y+12,i); Write(chr(j):3);              i:=i+1; j:=j+1;          End;         y:=y+18; i:=4; n:=n+16; e:=e+2;       Until n=208;      Setwin;      Write(40,24,'PgDn­>Continue; Other key­>Quit.'); ch:=Readkey;      If ch=#0 then ch:=Readkey;  If ch<>#81 then Goto 1;      m:=256; n:=208;      Window(4,4,76,24);      y:=2; i:=4; j:=193; e:=4;      Repeat         While (i<=m) And (j<=n) Do            Begin               TextC(e,3);               GotoXY(y,i); Write(j:3);               GotoXY(y+6,i); Write(Doi(j):3);               GotoXY(y+12,i); Write(chr(j):3);               i:=i+1; j:=j+1;          End;          y:=y+18; i:=4; n:=n+16; e:=e+2;       Until n=272;    Setwin;     Write(40,24,'PgDn­>Continue; Other key­>Quit.'); ch:=Readkey;      If ch=#0 then ch:=Readkey;  If ch<>#81 then Goto 1;   Until ch=#27;    Setwin;    1:TextC(15,0);  Clrscr; End.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

117

: di chuy n “súng”; Gõ: Esc: ra.

ạ (cid:0) ự **6/T o trò ch i b n v t tr i đang bay.   ể Gõ ký t ơ ắ ắ  “d” b n; Gõ ị ờ , (cid:0)

ế ụ ấ ỳ ạ ạ ầ **7/ T o “Kính v n hoa”. Yêu c u: Gõ ESC: Thoát; Gõ phím b t k : Ti p t c.

PROGRAM  VANHOA; USES crt,graph; const      dong=1; lim=3; TYPE      BASEARRAY=ARRAY[1..100] OF real; Var ordrePoly,khoang:integer; number:byte; f1,f2,f3,f4:integer; c1,c2,c3,c4:integer; GraphDriver,graphMode:integer; xp1,yp1,xp2,yp2:real; xtl,ytl:real; MaxX,MaxY:integer; XgFen,xdFen,YbFen,YhFen:real; XgClot,XdClot,YbClot,YhClot:integer; mangX,mangY:basearray; i:integer; Sotg,kc,lap:byte; ch:char;k:integer;

PROCEDURE KTDOHOA; VAR errorCode:integer; somau:byte; Begin  graphDriver:=detect;  initgraph(graphdriver,graphMode,'D:\bp\bgi');  ErrorCode:=graphResult;    If errorCode<> grOK then       begin         writeln('LOI DO HOA ',graphErrorMsg(ErrorCode));         halt(1);       end;  MaxX:=getMaxx;  MaxY:=getMaxY;

end;

PROCEDURE CUASO(f1,f2,f3,f4:real);    BEGIN

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

118

Xgfen:=f1;     XdFen:=f2;     ybFen:=f3;     yhFen:=f4;    END;

PROCEDURE TAMNHIN(C1,C2,C3,C4:INTEGER);     BEGIN      XgClot:=c1;       XdClot:=c2;       YbClot:=c3;       YhClot:=c4;     Xtl:=(XdClot­XgClot)/(XdFen­XgFen);     Ytl:=(YhClot­YbClot)/(YhFen­YbFen);     Setviewport(xgClot,maxY­YhClot,xdClot,maxY­YbClot,ClipOn);     END;

PROCEDURE CAT(x1,y1,x2,y2:real);     type     muc=(l,r,low,h);     code=set of muc;     Var     c,c1,c2:code;     x,y:real;     xx1,yy1:integer;     xx2,yy2:integer;

PROCEDURE BINARY(X,Y:REAL;VAR C:CODE);    Begin          c:=[];          If xxdfen then c:=[r];          If yYhFen then c:=c+[h]           End;  BEGIN

binary(x1,y1,c1);     binary(x2,y2,c2);     WHILE (c1<>[] ) or (c2<>[])do

BEGIN        if (c1*c2)<>[] then exit;        if c=[] then c:=c2 else c:=c1;        if l in c then          begin           x:=xgFen;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

119

y:=y1+(y2­y1)*(xgFen­x1)/(x2­x1)          end        else if r in c then            begin           x:=xdFen;           y:=y1+(y2­y1)*(xdFen­x1)/(x2­x1)           end          else if low in c then            begin           y:=ybFen;           x:=x1+(x2­x1)*(ybFen­y1)/(y2­y1)           end           else if h in c then            begin           y:=yhFen;           x:=x1+(x2­x1)*(yhFen­y1)/(y2­y1)           end;       IF c=c1 then             Begin               x1:=x;               y1:=y;               binary(x,y,c1);             END        Else          Begin           x2:=x;           y2:=y;           binary(x,y,c2);           End;      END  ;      xx1:=round((x1­xgFen)*Xtl);       yy1:=round((yhfen­y1)*Ytl);       xx2:=round((x2­xgFen)*Xtl);       yy2:=round((yhfen­y2)*Ytl);       MoveTo(xx1,yy1);       Lineto(xx2,yy2);    END;

PROCEDURE VETOI(x,y:real);      BEGIN         xp2:=x;         yp2:=y;         cat(xp1,yp1,xp2,yp2);         xp1:=xp2;         yp1:=yp2;       END;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

120

PROCEDURE DATBUT(x,y:real);        BEGIN         xp1:=x;         yp1:=y;         vetoi(x,y);         END;

PROCEDURE NHAPSOLIEU; Begin   TextBackGround(blue);   ClrScr;   Writeln('      KINH VAN HOA            ');   Write('    Cho so Tam giac ' );   Textcolor(white);     Write('( An 0 de thoat ) :  ');   readln(Sotg);   If sotg<>0 then    Begin    writeln;    write('    Cho so khoang chia :  ');    readln(kc);    writeln;    write('    Cho so lan Lap :  ');    readln(Lap);   end; END;

PROCEDURE DAGIAC(MANGX,MANGY:BASEARRAY;LIM:INTEGER;MODE: INTEGER); Var   i:integer;   Begin   datbut(mangx[1],mangy[1]);     For i:=2 to lim do   vetoi(mangx[i],mangy[i]);     If mode=dong then vetoi(mangx[1],mangy[1]);     End;

PROCEDURE VEDAGIAC(MANGX,MANGY:BASEARRAY;LIM:INTEGER;MODE: INTEGER;color:byte);     Begin     setcolor(color);     dagiac(MANGx,mangy,lim,mode);      End;

PROCEDURE VE(SoTg,kc,lap:byte);      Var      angle,hs:real;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

121

i,j,sogoc:byte;      tg:byte;

Begin     hs:=2*pi/Sotg;   For Sogoc:=1 to sotg do    Begin            mangx[1]:=0;mangy[1]:=0;            angle:=(sogoc­1)*hs;            mangx[2]:=cos(angle);            mangy[2]:=sin(angle);            angle:=Sogoc*hs;            mangx[3]:=cos(angle);            mangy[3]:=sin(angle);            mangx[4]:=0;mangy[4]:=0;       For i:=1 to lap do        Begin          Vedagiac(mangx,mangy,lim,dong,white);         If odd(sogoc) then          Begin            For j:=lim+1 downto 2 do             Begin                mangx[j]:=mangx[j]+(mangx[j­1]­mangx[j])/kc;                mangy[j]:=mangy[j]+(mangy[j­1]­mangy[j])/kc;             End;            Mangx[1]:= Mangx[lim+1];            Mangy[1]:=Mangy[lim+1];          End        Else         Begin           For j:=1 to lim do             Begin                mangx[j]:=mangx[j]+(mangx[j+1]­mangx[j])/kc;                mangy[j]:=mangy[j]+(mangy[j+1]­mangy[j])/kc;             End;            Mangx[lim+1]:= Mangx[1];            Mangy[lim+1]:=Mangy[1];           End;      end;{cua lap}   end;{for ngoai cung}

End;{cua ve}

(**************************************************************)

BEGIN    nhapSolieu;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

122

Repeat    ktdohoa;    CuaSo(­1,1 ,­1,1);    TamNhin(160,maxx­160,75,maxy­75);    Ve(sotg,kc,lap);    TamNhin(0,maxx,0,maxy);    rectangle(1,1,maxx­1,maxy­1);    rectangle(5,5,maxx­5,maxy­5);    setcolor(yellow);    settextjustify(1,1);    settextstyle(1,0,4);    outtextxy(maxx div 2,20,' VE KINH VAN HOA ');    outtextxy(maxx div 2,45,' ************************ ');    settextstyle(1,0,1);    setcolor(lightblue);    outtextxy(maxx div 2,maxy­20,' Go ESC de thoat, Go phim BAT KY de tiep tuc !');    settextstyle(2,1,8);    outtextxy(20,maxy div 2,'Thay: TRAN THONG QUE');    outtextxy(maxx­24,maxy div 2,'COPYRIGHT (C) 1994');    repeat until KeyPressed;    ch:=readkey;    if ch=#27 then         begin              cleardevice;              closegraph;              halt;         end;    closeGraph;    nhapsolieu;    Until  ( Sotg=0); END.

Ả Ề Ặ Ả Ề Ỹ Ậ Ậ Ấ CÁC BÀI  7, 8, 10, 11 R T KHÓ C  V  M T THU T TOÁN VÀ C  V  K  NĂNG L P TRÌNH!!!

ạ ạ ủ ế ắ ồ ồ ị ầ **7/ T o đ ng h  có 3 kim+ti ng tích t c kêu theo nh p ch y c a kim giây.     Và thêm các yêu c u sau: ả ấ ỳ ể ổ ề ờ ệ ệ ả ờ ứ ạ ả ồ ố ố  và kim phút có d ng hình t ệ  giác. (gi

a­ Dòng trên cùng phía ph i màn hình có dòng chũ: “Gõ phím b t k  đ ồ      đ i màu đ ng h  và n n màn hình. b­ Dòng cu i cùng phía trái màn hình hi n th i gian hi n hành. ệ c­ Dòng cu i cùng phía ph i màn hình hi n ngày tháng năm hi n th i.  ờ d­ Kim gi  hình thoi­ Quasi Lozenge) program Draw_Clock;   uses crt,GRAPH,dos;   const    color:array[0..15] of byte=(8,7,3,15,6,14,10,4,2,9,1,12,5,0,13,11);   var    m,co:byte;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

123

col:set of 0..15;

r,xt,yt:word;    e:char;    st:string[10];st1,st2,st3:string[4];

{­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}

procedure init;   var gd,gm:integer;   begin     gd:=0;     initgraph(gd,gm,'..\bgi');     if graphresult<>0 then halt;m:=1;e:=#2;   end;

{­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}

procedure draw_frame;   const     number:array[1..12] of     string[2]=('1','2','3','4','5','6','7','8','9','10','11','12');     dayofweek:array[0..6]of string[3]=('Sun','Mon','Tue','Wed','Thu','Fri','Sat');   var     i,x,y,year,month,day,day_of_week:word;   begin     xt:=getmaxx div 2;yt:=getmaxy div 2;     r:=yt­10;     settextjustify(1,1);     {ve duong vien ngoai cung:}     setcolor(color[13]);     setlinestyle(0,0,3);     rectangle(1,1,getmaxx,getmaxy);     rectangle(3,3,getmaxx­2,getmaxy­2);    {ve duong tron bao dong ho:}     for i:= 0 to 6 do circle(xt,yt,r+3­i);    {to mau nau khoang trong:}     m:=(m mod 2)+1;     if odd(m) then co:=1 else co:=1+(color[13] mod 11);     setfillstyle(co,color[4]);     floodfill(xt+r­20,yt+r­20,color[13]);     setfillstyle(1,color[3]);     floodfill(xt,yt,color[13]);     setcolor(color[1]);     setlinestyle(0,0,3);     rectangle(1,1,getmaxx,getmaxy);     rectangle(3,3,getmaxx­2,getmaxy­2);     setfillstyle(1,color[1]);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

124

bar(0,getmaxy­

15,getmaxx,getmaxy);     setfillstyle(solidfill,color[13]);     bar(80,getmaxy­15,getmaxx­80,getmaxy);    {hien ngay thang nam o dong duoi cung phai man hinh:}     setfillstyle(solidfill,color[8]);     bar(8,getmaxy­50,170,getmaxy­20);     bar(getmaxx­170,getmaxy­50,getmaxx­8,getmaxy­20);     setfillstyle(1,color[11]);     bar(getmaxx­150,60,getmaxx­10,70);     getdate(year,month,day,day_of_week);     str(day,st1);     str(month,st2);     str(year,st3);     if day<10 then st1:='0'+st1;     if month<10 then st2:='0'+st2;     {settextstyle(4,0,6);     setcolor(color[5]);     outtextxy(getmaxx­80,25,st3);     settextstyle(4,0,4);     setcolor(color[6]);     outtextxy(120,20,' Happy New Year !'); }     settextstyle(0,0,2);     setcolor(color[7]);     for i:=0 to 1 do outtextxy(40+30*i,60,chr(i+3));     setcolor(color[15]);     for i:=2 to 3 do outtextxy(40+30*i,60,chr(i+3));     st:=' ';st:=dayofweek[day_of_week]+','+st1+'.'+st2;     settextstyle(0,0,2);     setcolor(color[9]);     outtextxy(getmaxx­90,getmaxy­35,st);     settextstyle(2,0,1);     setusercharsize(2,3,1,1);     setcolor(color[10]);     outtextxy(getmaxx­80,63,' * Press any key to change color...');     {trang tri ben trong dong ho:}     settextstyle(0,0,1);     setcolor(color[11]);     for i:=1 to 60 do    begin         x:=xt+round((r­20)*sin(i*pi/30));         y:=yt­round((r­20)*cos(i*pi/30));         if(i mod 5)<>0 then outtextxy(x,y,chr(1))    end;     settextstyle(0,0,2);     for i:=1 to 12 do    begin

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

125         x:=xt+round((r­50)*sin(i*pi/6));

y:=yt­round((r­50)*cos(i*pi/6));         setcolor(color[12]);         outtextxy(x,y,number[i]);         x:=xt+round((r­20)*sin(i*pi/6));         y:=yt­round((r­20)*cos(i*pi/6));         setcolor(color[10]);         outtextxy(x,y,chr(2));         {chr(2)=""}    end;     {setcolor(color[14]);

outtextxy(xt,yt+100,'   CHA DE PASCAL!  ');     outtextxy(xt,yt­100,'');     outtextxy(xt,yt­105,' NIKLAUS WIRTH '); }     setcolor(color[2]);     settextstyle(0,0,3);     outtextxy(xt,yt,chr(3));         {chr(3):hinh trai tim}    end;

{­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}

procedure draw_index(r:word;goc:real;color:byte);    var     x,y,a,b,c:real;     d:array[1..5]of pointtype;         {toa do 4 dinh tu giac}    begin                  {if goc>=2*pi then goc:=goc­2*pi;}     x:=xt+r*sin(goc);     y:=yt­r*cos(goc);     setcolor(color);     if r>yt­35 then       begin             {kim giay}         setlinestyle(0,0,2);         line( xt,yt,round(x),round(y));         setlinestyle(0,0,3);         line(xt,yt,round(xt­r/5*sin(goc)),round(yt+r/5*cos(goc)));       end     else       begin          {ve kim gio hoac kim phut duoi dang hinh tu giac co 4 dinh          toa do 4 dinh chua trong mang d:}        d[1].x:=xt;d[1].y:=yt;         a:=(4*xt+x)/5;b:=(4*yt+y)/5;c:=(x­xt)/(yt­y+0.000001);         d[2].x:=round(a­sqrt((100+(r mod (yt­40)))/(1+sqr(c))));         d[2].y:=round(b+c*((a­sqrt((100+(r mod (yt­40)))/(1+sqr(c))))­a));         d[3].x:=round(x);         d[3].y:=round(y);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

126

d[4].x:=round(a+sqrt((100+(r

mod (yt­40)))/(1+sqr(c))));         d[4].y:=round(b+c*((a+sqrt((100+(r mod (yt­40)))/(1+sqr(c))))­a));         d[5].x:=xt;         d[5].y:=yt;         drawpoly(5,d);          {ve hinh tu giac}       end;    end;   {­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}    procedure run;    const      a:array[1..2] of string=('SEE YOU GAIN','!');    var     h,m,s,se,ok:word;     goch,gocm,gocs,g:real;     i,j,k:integer;     nb:boolean;     {­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}   procedure tinhgoc;    begin      goch:=pi*((h mod 12)/6+m/360+s/4320);      gocm:=pi*(m/30+s/1800);      gocs:=pi*s/30;      if (s=59)and odd(m) then e:='a';      ok:=s;    end;      {­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}   procedure draw;     begin       draw_index(r­80,goch,color[11]);       draw_index(r­30,gocm,color[12]);       draw_index(r­20,gocs,color[14]);     end;       {phan phu}       {­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­}  procedure change;     begin       i:=(i mod k)+1;if i=1 then j:=(j mod 4)+1;           case j of             1:k:=179;             2:k:=186;             3:k:=191;             4:k:=196           end;     end;                 {het phan phu}   Begin     setwritemode(xorput);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

127

gettime(h,m,s,se);

tinhgoc;     draw;     {hien gio o dong duoi cung ben trai man hinh:}    str(h,st1);    str(m,st2);    str(s,st3);st:=' ';     if m<10 then st2:='0'+st2;     if s<10 then st3:='0'+st3;     st:=' ';     st:=st1+':'+st2+':'+st3;     settextstyle(0,0,2);     setcolor(color[9]);     outtextxy(90,getmaxy­35,st);     i:=0;     j:=0;     k:=179;     nb:=false;     repeat       gettime(h,m,s,se);       if ok<>s then         begin           if((m=59)and(s>(58­h)))or((m=29)and(s=59))then nb:=true;           setcolor(color[13]);           outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));           change;           settextstyle(0,0,2);           setcolor(color[8]);           outtextxy(90,getmaxy­35,st);           draw;tinhgoc;           {phan phu:co the bo di:}          if (s mod 5)=0 then           begin             if gocs>=2*pi then gocs:=gocs­2*pi;setfillstyle(solidfill,color[2]);             floodfill(round(xt+(r­20)*sin(gocs)),round(yt­(r­20)*cos(gocs)),color[10]);           end;           if ((s­1) mod 5)=0 then           begin             g:=pi*(s­1)/30;             if g>=2*pi then g:=g­2*pi;setfillstyle(solidfill,color[3]);             floodfill(round(xt+(r­20)*sin(g)),round(yt­(r­20)*cos(g)),color[10]);           end;               {het phan phu}               draw;           str(h,st1);str(m,st2);str(s,st3);st:=' ';           if m<10 then st2:='0'+st2;if s<10 then st3:='0'+st3;           st:=' ';

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

128

st:=st1+':'+st2+':'+st3;

settextstyle(0,0,2);           setcolor(color[9]);           outtextxy(90,getmaxy­35,st);           settextstyle(0,0,1);           setcolor(color[13]);           outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));           change;           setcolor(color[3]);           outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));           if nb then              begin                  sound(2700);                  delay(1000);                  nosound;                  delay(1000);                  sound(2700);                  delay(1000);                  nosound;              end           else Begin

sound(2700);  delay(750);             nosound;             delay(750);                         End;           setcolor(color[13]);           outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));           change;           setcolor(color[3]);           outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));           if nb then           Begin delay(750); sound(2700);            delay(100);            nosound;                       delay(750);           End           else              delay(1000);              setcolor(color[13]);              outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));              change;              setcolor(color[3]);              outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));           if nb then

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

129

Begin

nosound; delay(80);

sound(2700);delay(120);                                    End           else Begin sound(2700);

delay(1000); nosound; delay(1000);

End;                 setcolor(color[13]);                 outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));                 change;                 setcolor(color[3]);                 Outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));                 delay(200);                 setcolor(color[13]);                 outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));                 change;                 setcolor(color[3]);                 outtextxy(getmaxx div 2,getmaxy­7,copy(a[j],i,60));                 delay(150);nb:=false;            end;  while keypressed do e:=readkey;     until e<>#2;     if e<>#27 then e:=#2;   End;   {­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­} procedure set_color;   var i:byte;   begin     randomize;     col:=[];     for i:=0 to 15 do       begin         repeat           color[i]:=random(16);           if (i>=11) and (i<=14) then             if (color[i]=0) and not(0 in col) then color[i]:=color[i­1];         until not(color[i] in col);         col:=col+[color[i]]       end;   end;   {­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­} procedure maker;   begin       clrscr;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

130

gotoxy(30,17);

TEXTCOLOR(YELLOW);       write('Press any key to continue...');       window(20,10,60,15);       textbackground(lightgray);       clrscr;       textcolor(blue);       writeln;       writeln('           THAY TRAN­THONG­QUE ');       writeln;       writeln('        *  *  *  *  *  *  *  *  * ');       textcolor(lightgray);       e:=readkey;   end;   begin     maker;     init;     repeat       graphdefaults;       cleardevice;       draw_frame;       run;       set_color;     until e=#27;     closegraph;   end.

ể ớ ộ ỉ ượ ậ ơ ọ **8/ Đ  h a hóa bài toán Tháp Hà N i (Hanoi Tower Problem): Chuy n n đĩa (ch  nên test v i n=3 or  ọ n=4) có l c dùng c c trung gian. Lu t ch i: c c 1 sang c c 2 đ

ượ ặ ấ ứ ỗ ế ặ ỉ ể c đ t đĩa (ngh ) trên b t c  ch  nào (m t bàn, gh , sàn nhà…), ồ ọ ỗ ở ữ ừ ọ    gi a t ể ỉ ỗ ầ a­ M i l n ch  chuy n 1 đĩa, b­ Trong lúc chuy n không đ ằ c­ Đĩa to n m trên đĩa bé.

Uses Crt,Graph; Type coc=1..3; Const n=3; yorg=20;xorg:Array[coc] of integer=(13,40,67);       time=5000; time2=4000; Var dk:Array[1..n,coc] of Integer;     docao:Array[coc] of integer;     i:integer;

Procedure tre(T:integer); Begin    GotoXY(43,4);    Delay(T); End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

131

Procedure MoveUp(c1,c2:Integer); Var i,j,x:Integer; Begin     For j:=1 to 4 Do       Begin          X:=xorg[c1]­dk[docao[c1],c1];          GotoXY(X,YORG­n­j­1);          For i:=1 to 2*dk[docao[c1],c1]+1 do Write(#219);          tre(time);          GotoXY(X,Yorg­n­j­1);          For i:=1 to 2*dk[docao[c1],c1]+1 do Write(#32);          tre(time);       End; End;

Procedure MoveDown(c1,c2:integer); Var i,j,x:Integer; Begin   For j:=4 Downto 1 Do     Begin        x:=XORG[c2]­DK[docao[c1],c1];        GotoXY(X,YORG­n­j­1);        For i:=1 to 2*DK[docao[c1],c1]+1 Do Write(#219);        tre(time);        GotoXY(X,YORG­n­j­1);        For i:=1 to 2*DK[docao[c1],c1]+1 Do Write(#32);        tre(time);     End; End;

Procedure MoveRight(c1,c2:integer); Var i,j,x,xx:integer; Begin   x:=XORG[c1];   While x<=XORG[c2] Do      Begin        xx:=XORG[c1]­DK[docao[c1],c1]+x­XORG[c1];        GotoXY(XX,YORG­n­5);        For i:=1 to 2*DK[docao[c1],c1]+1 Do Write(#219);        tre(time2);        GotoXY(XX,YORG­n­5);        For i:=1 to 2*DK[docao[c1],c1]+1 Do Write(#32);        tre(time2);        X:=X+2;      End; End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

132

Procedure MoveLeft(c1,c2:Integer); Var i,j,x,xx:integer; Begin   x:=XORG[c1];   While x>=XORG[c2] Do      Begin        xx:=XORG[c1]­DK[docao[c1],c1]+x­XORG[c1];        GotoXY(XX,YORG­n­5);        For i:=1 to 2*DK[docao[c1],c1]+1 Do Write(#219);        tre(time2);        GotoXY(XX,YORG­n­5);        For i:=1 to 2*DK[docao[c1],c1]+1 Do Write(#32);        tre(time2);        X:=X­2;      End; End; Procedure Move(n,c1,c2,c3:integer); Var x:integer; Begin  If n=1 Then     Begin        x:=XORG[c1]­Dk[docao[c1],c1];        GotoXY(x,YORG­docao[c1]+1);        For i:=1 to 2*DK[docao[c1],c1]+1 do          Begin             If docao[c1]=1 Then               Begin                 Write('­');                 If i=DK[docao[c1],c1] Then  Write(#193);               End             Else Write(#32);          End;        GotoXY(XORG[c1],YORG ­ docao[c1]+1);        Write(#179); tre(time);        MoveUp(c1,c2);        If c2>c1 then MoveRight(c1,c2)        Else MoveLeft(c1,c2);             MoveDown(c1,c2);             docao[c2]:=docao[c2]+1;             DK[docao[c2],c2]:=DK[docao[c1],c1];             Dk[docao[c1],c1]:=0;             docao[c1]:=docao[c1]­1;             x:=XORG[c2]­DK[docao[c2],c2];             GotoXY(x,YORG­docao[c2]+1);             For i:=1 to 2*DK[docao[c2],c2]+1 do Write(#219);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

133

Delay(200);        End      Else      Begin         Move(n­1,c1,c3,c2);         Move(1,c1,c2,c3);         Move(n­1,c3,c2,c1);      End; End; {Main prog.} Begin Clrscr;   GotoXY(35,4); Write('BAI TOAN THAP HA NOI.');   GotoXY(4,YORG­n+4);   GotoXY(XORG[1],YORG­n); Write(#179);   GotoXY(XORG[1]­1,YORG­n+1); Write(#219#219#219);   GotoXY(XORG[1]­2,YORG­n+2); Write(#219#219#219#219#219);   GotoXY(XORG[1]­3,YORG­n+3); Write(#219#219#219#219#219#219#219);   GotoXY(XORG[1]­4,YORG­n+4); Write(#219#219#219#219#219#219#219#219#219);   For i:=0 to n Do   Begin      GotoXY(XORG[2],YORG­n+I);      Write(#179);   End;   For I:=0 to n do   Begin      GotoXY(XORG[3],YORG­n+I);      Write(#179);   End;   docao[1]:=n; docao[2]:=0; docao[3]:=0;   For I:=1 to n do DK[I,1]:=n­I+1;   For I:=1 to n do DK[I,2]:=0;   For I:=1 to n do DK[I,3]:=0;   GotoXY(22,24); Write('Press Ctrl_C to Stop.');   GotoXY(43,4);  Repeat     Delay(500); Move(n,1,2,3);     Delay(500); Move(n,2,3,1);     Delay(500); Move(n,3,1,2);   Until KeyPressed; End.

B NG TEST

Ọ Ọ Ủ Ề ườ ươ ữ ệ ầ ị Ố ng tròn. Xét các v  trí t ở   ớ ạ i h n b i  ệ ặ ế ủ ế ể ặ ớ ở ị Ộ *9/ (M T TRONG S  CÁC Đ  OLYMPIC TIN H C C A H C SINH THCS 4/1994)  ẳ ẽ V  hai đ ườ 2  đ ng quan gi a chúng. Và tính di n tích ph n m t ph ng gi  trong nhau ho c ti p súc trong v i nhau. Hi n th  các k t q a tính di n tích. ng tròn khi chúng

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

134

ươ ữ CÁC TEST ị V  trí t ng quan gi a hai vòng tròn ọ ộ T a đ  tâm & bán kính vòng tròn Y X R

ờ Hai vòng tròn r i nhau Vòng tròn 1 Vòng tròn 2 200 50 200 50 100 30

ắ Hai vòng tròn c t nhau Vòng tròn 1 Vòng tròn 2 200 270 200 130 100 40

ế Hai vòng tròn ti p xúc ngoài Vòng tròn 1 Vòng tròn 2 200 350 200 200 100 50

Hai vòng tròn trùng khít nhau Vòng tròn 1 Vòng tròn 2 200 200 200 200 100 100

ằ ạ ủ ọ i c a vòng to=2016 tròn to. Dt còn l Vòng tròn 1 Vòng tròn 2 200 220 200 220 100 Vòng tròn tròn bé n m tr n trong vòng  60

ồ ớ ạ ủ i c a vòng to=11310 Dt còn l Vòng tròn 1 Vòng tròn 2 200 200 200 200 100 Vòng tròn bé đ ng tâm v i vòng tròn to 80

ạ ả ớ i . . . =23562 vòng tròn to. Dt còn l Vòng tròn 1 Vòng tròn 2 200 250 200 200 ế 100 Vòng tròn bé ti p xúc trong ph i v i  50

ế ạ Vòng tròn to. Dt còn l i . . .=16022 Vòng tròn 1 Vòng tròn 2 200 200 200 170 ớ 100 Vòng tròn bé ti p xúc trong phía trên v i 70

Uses Crt, graph; Const maxx=639; maxy=449; Var x1,x2,y1,y2,r1,r2:Integer;

Procedure Khung(x1,x2,y1,y2:Integer); Var i,j: Integer; Begin   TextBackGround(Blue); TextColor(LightGray);   Gotoxy(x1,y1); Write(#218);   For i:=x1+1 to x2­1 do Write(#196);                          Write(#191);   For j:=y1+1 to y2­1 do     Begin        Gotoxy(x1,j); Write(#179);        For i:=x1+1 to x2­1 do Write(' ');        Write(#179);     End;   Gotoxy(x1,y2); Write(#192);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

135

For i:=x1+1 to x2­1 do Write(#196);                          Write(#217); End;

Function Doc(min,max:Integer):Integer; Var n:Integer; {min0) Or (n<=min) Or (n>=max) Then      Begin        Sound(1200);        Delay(100);        Nosound;      End;   Until (IoResult=0) And (n>min) And (n

Function Min( a,b:Integer):Integer; Begin   If a

Procedure Init; Begin   Clrscr;   Khung(10,1,70,13); Window(11,2,69,12); TextColor(Yellow);   Writeln('OLYMPIC QUOC GIA TINHOC THCS 1994.'); TextColor(LightRed);   Writeln('To chuc tai HA NOI.');   Writeln('Nha to chuc: HOI TINHOC VN.');   Writeln;   TextColor(LightGray);   Write('Nhap toa do x cua tam vong tron 1:'); x1:=Doc(1,maxx­1);   Write('Nhap toa do y cua tam vong tron 1:'); y1:=Doc(1,maxy­1);   Write('Nhap ban kinh vong tron 1:');       r1:=Doc(0,min(min(x1,maxx­x1),min(y1,maxy­y1)));   Write('Nhap toa do x cua tam vong tron 2:'); x2:=Doc(1,maxx­1);   Write('Nhap toa do y cua tam vong tron 1:'); y2:=Doc(1,maxy­1);   Write('Nhap ban kinh vong tron 2:');       r2:=Doc(0,min(min(x2,maxx­x2),min(y2,maxy­y2)));   Sound(800);   Delay(100);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

136

Nosound;   Writeln('WELCOME TO INFOMATIC OLYMPIC.');   Window(1,1,80,25); End;

Function Run:Boolean; Var Gd, Gm:Integer;     i:Real; s:String;     ch:char; Begin    GD:=DETECT;    INITGRAPH(GD,GM,'..\BGI');     If GraphResult<>GrOk then     Begin        Gotoxy(11,11);        Sound(1200); Delay(100); Nosound;        Writeln('Khong khoi dong duoc do hoa.');        Run:=False; Exit;     End;     SetBkColor(Blue); SetColor(LightRed);     SetFillStyle(1,LightGray);     Bar(1,1,maxx­1,maxy­1);     Rectangle(0,0,maxx,maxy);     SetColor(Yellow);     Circle(x1,y1,r1); Circle(x2,y2,r2);     i:=Sqrt((Longint(x1)­x2)*(x1­x2)+(Longint(y1)­y2)*(y1­y2));     If (x1=y1) And (x2=y2) And (r1=r2) Then       Begin         SetColor(White);         OutTextxy(10,450,'Hai vong tron trung khit nhau.')       End       Else If(r1>=r2+i) Then         Begin           SetColor(White);           OutTextxy(10,450,'Vong tron 2 nam trong vong tron 1.');           Str(Pi*(Longint(r1)*r1­Longint(r2)*r2):0:2,s);           OutTextxy(10,460,'Dien tich phan trong la:');           SetColor(LightRed);  OutTextxy(10+26*8,460,s);           SetFillStyle(3,LightGray);             If x2+r2=x1+r1 Then FloodFill(x1,y1­r1+1,Yellow)             Else FloodFill(x1,y1+r1­1,Yellow)           End           Else If(r2>=r1+i)  Then             Begin               SetColor(White);               OutTextxy(10,450,'Vong tron 1 nam trong vong tron 2.');               Str(Pi*(Longint(r2)*r2­Longint(r1)*r1):0:2,s);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

137

OutTextxy(10,460,'Dien tich  phan trong la:');               SetColor(LightRed); OutTextxy(10+26*8,460,s);               SetFillStyle(3,LightGray);               If y1+r1=y2+r2 Then FloodFill(x2,y2­r2+1,Yellow)               Else  FloodFill(x2,y2+r2­1,Yellow);             End;       SetColor(LightGray);       OutTextxy(10,470,'Nhan Rnter ­> Stop.');       Sound(1500); Delay(100); Nosound;   Repeat ch:=Readkey  Until ch=#13;   CloseGraph;   Run:=True; End;

Function Done:Boolean; Var ch:char; Begin   Khung(20,15,60,17); Window(21,16,59,16);   TextColor(LightGray);   Write('More (y/n)?');   Repeat ch:=Readkey  Until ch In ['y','Y','n','N'];   TextColor(LightRed);   Write(ch);   Window(1,1,80,25);   If ch In ['n','N'] Then Done:=true   Else Done:=False; End;

Begin   Repeat     Init;     If not Run then Halt;     Until Done; End.

Ậ Ộ ệ I CHO BÀI TOÁN 8 H U TRÊN BÀN C  VUA 8X8). Tìm  M T nghi m cho Ờ Ả ậ ờ ượ Ờ **10­ (TÌM 1 L I GI ặ bài toán: Đ t 8 h u trên bàn c  vua 8x8 sao cho không con nào ăn đ c con nào.

Program Tim_Mot_Loi_Giai_Cho_Bai_8_Hau;   Uses crt,graph;   Const dl=200;   Var     p:pointer;     found:boolean;     a:array[1..8] of boolean;     b:array[2..16] of boolean;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

138

c:array[­7..7]of boolean;     h:array[1..8] of Integer;

Procedure Initgr;   Var gd,gm:integer;     Begin      gd:=detect;      initgraph(gd,gm,'..\bgi');      if graphresult<>grok then       begin        write('Loi Do Hoa ! Go Enter Ket Thuc');        readln;        halt(1)       end     End;

Procedure Demo;   Begin    settextstyle(1,0,3);    setbkcolor(green);    setcolor(blue);    outtextxy(425,30,'Tim Mot Loi Giai');    settextstyle(1,0,4);    setcolor(white);    outtextxy(425,90,'Cho Bai Toan');    setcolor(red);    settextstyle(4,0,7);    outtextxy(440,160,'8 Hau');    setcolor(blue);    settextstyle(1,0,3);    outtextxy(440,410,'Ha Noi ­ 2005');    setcolor(white);    settextstyle(3,0,1);    outtextxy(425,440,' Thay Tran­Hong­Que');  End;

Procedure Draw(i,j:integer);   Begin    if (i+j)mod 2=0 then     begin      setfillstyle(1,7);      bar((i­1)*50+10,(j­1)*50+10,(i­1)*50+50+10,(j­1)*50+50+10);     end     else      begin       setfillstyle(1,white);       bar((i­1)*50+10,(j­1)*50+10,(i­1)*50+50+10,(j­1)*50+50+10);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

139

end;   End;

Procedure Draw_Queen(i,j:integer);   Var size:integer;     Begin      setfillstyle(1,3);      setcolor(red);      bar(i,j,i+50,j+55);      ellipse(i+25,j+35,0,360,10,5);      line(i+25­10,j+35,i+25­20,j+35­20);      line(i+25+10,j+35,i+25+20,j+35­20);      line(i+25­10­10,j+35­20,i+25+20,j+35­20);      circle(i+25­10­10+5,j+35­20­3,3);      circle(i+25­10­10+5+10,j+35­20­3,3);      circle(i+25­10­10+5+20,j+35­20­3,3);      circle(i+25­10­10+5+30,j+35­20­3,3);      setfillstyle(1,4);      floodfill(i+25,j+35­10,4);      setfillstyle(1,8);      floodfill(i+25­10­10+5,j+35­20­3,4);      floodfill(i+25­10­10+5+10,j+35­20­3,4);      floodfill(i+25­10­10+5+10+10,j+35­20­3,4);      floodfill(i+25­10­10+5+10+10+10,j+35­20­3,4);      size:=Imagesize(i+1,j+1,i+51,j+51);      getmem(p,size);      getimage(i+2,j+2,i+50­2,j+50­2,p^);     End;

Procedure Put_Queen(i,j:integer);     Begin      Putimage(i+2,j+2,P^,Xorput);     End;

Procedure Table;   Var m,n:integer;     Begin       setviewport(0,0,getmaxx,getmaxy,false);       for m:=1 to 8 do       for n:=1 to 8 do       Draw(m,n);       Demo;       Draw_Queen(10,getmaxy­65);Put_Queen(10,getmaxy­65);       setfillstyle(1,blue);       bar(7,410,413,470);       setcolor(red);       rectangle(8,8,412,411);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

140

rectangle(7,7,413,412);     End;

Procedure Result;   Var s:string[2];       i:integer;      Begin       setfillstyle(1,blue);       bar(7,410,413,470);       setcolor(red);       rectangle(8,8,412,411);       rectangle(7,7,413,412);       settextstyle(1,0,3);       setcolor(white);       for i:=1 to 8 do        begin         str(h[i],s);         outtextxy(28+(i­1)*50,getmaxy­50,s);        end;      End;

Procedure Try(i:integer;Var q:boolean);  Var j:integer;   Begin    j:=0;    repeat     q:=false; inc(j);     if a[j] and b[i+j] and c[i­j] then      begin       h[i]:=j;       Put_Queen((i­1)*50+10,(j­1)*50+10);       sound(150);delay(dl);nosound;       a[j]:=false;b[i+j]:=false;c[i­j]:=false;       if i<8 then        begin         Try(i+1,q);         if not q then          begin           a[j]:=True;b[i+j]:=true;c[i­j]:=true;           Put_Queen((i­1)*50+10,(j­1)*50+10);           sound(350);delay(dl);nosound;          end;        end        else q:=true;      end;    until q or(j=8);   End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

141

Procedure Search;   Var i:integer;ch:char;      Begin       for i:=1 to 8 do a[i]:=true;       for i:=2 to 16 do b[i]:=true;       for i:=­7 to 7 do c[i]:=true;       Try(1,found);       if found then Result;       setcolor(white);       settextstyle(2,0,7);       outtextxy(430,300,'Go Esc Ket Thuc !');       repeat ch:=readkey until ch=#27;      End;

BEGIN     Initgr;     Table;     Search;     Closegraph;    END.

Ấ Ả Ờ Ậ Ặ Ệ Ể Ả Ệ ể ậ ặ ờ ấ ỳ ể ầ ượ ậ ừ ượ ệ ộ c con nào. Gõ l n l Ủ **11­ (TÌM T T C  CÁC NGHI M CÓ TH  CÓ C A BÀI TOÁN Đ T 8 H U TRÊN BÀN C  VUA  Ấ 8X8). Tìm T T C  CÁC NGHI M  có th  cho bài toán “H u”: Tìm cách đ t 8 h u trên bàn c  vua 8x8  ể sao cho không con nào ăn đ t m t phím b t k  đ  xem t ng nghi m. Gõ ESC đ   ra.

Program Tim_Tat_Ca_Loi_Giai_Xep_8_Hau; Uses crt,graph; Const Mc:Array [1..210,1..2] of Word =         ((1046,24),(1046,12),(1174,12),(1244,24),         (1046,24),(1244,24),(1046,24),(1244,24),

(1174,24),(934,24),(934,12),(1046,12),         (1174,24),(934,24),(1174,24),(934,24),         (1174,24),(1046,24),(880,24),(880,12),         (934,12),(1046,24),(880,24),(1046,24),         (934,24),(880,24),(934,24),(784,96),         (1046,24),(1046,12),(1174,12),(1244,24),         (1046,24),(1244,24),(1046,24),(1244,24),         (1174,24),(934,24),(934,12),(1046,12),         (1174,24),(934,24),(1174,24),(934,24),         (1174,24),(1046,24),(880,24),(880,12),         (934,12),(1046,24),(1244,24),(1174,24),         (742,24),(784,24),(36000,24),(36000,48),         (36000,24),(1174,24),(1174,48),(1046,24),         (1174,24),(784,72),(784,24),(1174,48),

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

142

(1398,24),(1244,24),(1174,72), (1046,24),         (1174,48),(934,24),(784,24),(880,72),         (880,24),(934,48),(784,24),(880,24),         (588,72),(1174,24),(1174,48),(1046,24),         (1174,24),(784,72),(588,24),(588,48),         (784,24),(934,24),(880,72),(880,24),         (934,48),(742,24),(880,24),(588,72),         (588,24),(1046,48),(1046,24),(934,24),         (934,96),(36000,48),(36000,24),(1174,24),         (1174,48),(1046,24),(1174,24),(784,72),         (784,24),(1174,48),(1398,24),(1244,24),         (1174,72),(1046,24),(1174,48),(934,24),         (784,24),(880,72),(880,24),(934,48),         (784,24),(880,24),(588,72),(1174,24),         (1174,48),(1046,24),(1174,24),(784,72),         (588,24),(588,48),(784,24),(934,24),         (880,72),(880,24),(934,48),(742,24),         (784,24),(880,72),(1046,24),(1046,24),         (1174,24),(742,24),(880,24),(784,96),         (784,48),(880,72),(784,24),(880,48),         (588,24),(588,24),(522,72),(934,24),         (880,48),(588,24),(784,24),(880,72),         (880,24),(1046,48),(1174,24),(1244,24),         (1174,96),(36000,48),(1398,24),(1244,24),         (1174,72),(934,24),(934,48),(1046,24),         (1174,24),(1174,72),(880,24),(934,48),         (784,24),(880,24),(588,48),(36000,48),         (1046,32),(934,32),(880,32),(784,48),         (36000,24),(36000,48),(36000,24),(1174,24),         (1174,48),(1046,24),(1174,24),(784,72),         (784,24),(1174,48),(1398,24),(1244,24),         (1174,72),(1046,24),(1174,48),(934,24),         (784,24),(880,72),(880,24),(934,48),         (784,24),(880,24),(588,72),(1174,24),         (1174,48),(1046,24),(1174,24),(784,72),         (588,24),(588,48),(784,24),(934,24),         (880,72),(880,24)); Var     p:pointer;     t,g:integer;     ch:char;     stop:boolean;     a:array[1..8] of boolean;     b:array[2..16] of boolean;     c:array[­7..7]of boolean;     h:array[1..8] of Integer;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

143

Procedure Initgr;   Var gd,gm:integer;     Begin      gd:=detect;      initgraph(gd,gm,'..\bgi');      if graphresult<>grok then       begin        write('Loi Do Hoa ! Go Enter Ket Thuc');        readln;        halt(1)       end     End;

Procedure Demo;   Begin    settextstyle(1,0,2);    setbkcolor(green);    setcolor(blue);    outtextxy(425,30,'Tim Tat Ca Loi Giai');    settextstyle(1,0,4);    setcolor(white);    outtextxy(425,60,'Cho Bai Toan');    setcolor(red);    settextstyle(4,0,7);    outtextxy(440,100,'8 Hau');    setcolor(Blue);    settextstyle(1,0,3);    outtextxy(440,370,'Ha Noi ­ 2002');    setcolor(Magenta);    settextstyle(3,0,1);    outtextxy(425,410,'  Thay Tran­hong­Que');    setcolor(red);    outtextxy(425,440,'  Hoi Tin hoc Viet nam');  End;

Procedure Draw(i,j:integer);   Begin    if (i+j)mod 2=0 then     begin      setfillstyle(1,7);      bar((i­1)*50+10,(j­1)*50+10,(i­1)*50+50+10,(j­1)*50+50+10);     end     else      begin       setfillstyle(1,white);       bar((i­1)*50+10,(j­1)*50+10,(i­1)*50+50+10,(j­1)*50+50+10);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

144

end;   End;

Procedure Draw_Queen(i,j:integer);   Var size:integer;     Begin      setfillstyle(1,3);      setcolor(red);      bar(i,j,i+50,j+55);      ellipse(i+25,j+35,0,360,10,5);      line(i+25­10,j+35,i+25­20,j+35­20);      line(i+25+10,j+35,i+25+20,j+35­20);      line(i+25­10­10,j+35­20,i+25+20,j+35­20);      circle(i+25­10­10+5,j+35­20­3,3);      circle(i+25­10­10+5+10,j+35­20­3,3);      circle(i+25­10­10+5+20,j+35­20­3,3);      circle(i+25­10­10+5+30,j+35­20­3,3);      setfillstyle(1,4);      floodfill(i+25,j+35­10,4);      setfillstyle(1,8);      floodfill(i+25­10­10+5,j+35­20­3,4);      floodfill(i+25­10­10+5+10,j+35­20­3,4);      floodfill(i+25­10­10+5+10+10,j+35­20­3,4);      floodfill(i+25­10­10+5+10+10+10,j+35­20­3,4);      size:=Imagesize(i+1,j+1,i+51,j+51);      getmem(p,size);      getimage(i+2,j+2,i+50­2,j+50­2,p^);     End;

Procedure Put_Queen(i,j:integer);     Begin      Putimage(i+2,j+2,P^,Xorput);     End; {===============================} Procedure Table;   Var m,n:integer;     Begin       setviewport(0,0,getmaxx,getmaxy,false);       for m:=1 to 8 do       for n:=1 to 8 do       Draw(m,n);       Demo;       Draw_Queen(10,getmaxy­65);Put_Queen(10,getmaxy­65);       setfillstyle(1,blue);       bar(7,410,413,470);       setcolor(red);       rectangle(8,8,412,411);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

145

rectangle(7,7,413,412);     End;

Procedure Result;   Var s:string[2];       i:integer;      Begin       setfillstyle(1,blue);       bar(7,410,413,470);       setcolor(red);       rectangle(8,8,412,411);       rectangle(7,7,413,412);       settextstyle(1,0,3);       setcolor(white);       for i:=1 to 8 do        begin         str(h[i],s);         outtextxy(28+(i­1)*50,getmaxy­50,s);        end;      End;

Procedure Wait;   Begin    inc(t);    Result;    setcolor(yellow);    settextstyle(2,0,6);    outtextxy(430,200,'Go Phim Esc De Ngung !');    setcolor(white);    settextstyle(2,0,5);    outtextxy(420,230,'Go Phim Bat Ky De Tiep Tuc...');    while keypressed do ch:=readkey;    repeat until keypressed;    ch:=readkey;    if ch=#27 then stop:=true;   End;

Procedure Music;  Begin   sound(Mc[g][1]);   delay(mc[g][2]*8);{ delay(20000);}   nosound;   if g=210 then g:=1 else inc(g)  End;

Procedure Try(i:integer);  Var j:integer;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

146

Begin    j:=0;    repeat     inc(j);     if a[j] and b[i+j] and c[i­j] then      begin       h[i]:=j;       Put_Queen((i­1)*50+10,(j­1)*50+10);       Music;       a[j]:=false;b[i+j]:=false;c[i­j]:=false;       if i<8 then Try(i+1)              else Wait;       a[j]:=True;b[i+j]:=true;c[i­j]:=true;       Put_Queen((i­1)*50+10,(j­1)*50+10);       Music;      end;    until (j=8) or stop;   End;

Procedure Search;   Var i:integer;       s:string[30];      Begin       t:=0;g:=1;       stop:=false;       for i:=1 to 8 do a[i]:=true;       for i:=2 to 16 do b[i]:=true;       for i:=­7 to 7 do c[i]:=true;       Try(1);       str(t,s);       if stop then       s:='Da Tim Duoc '+s+' Loi Giai'       else       s:='Tong So Co '+s+' Loi Giai';       setcolor(red);       settextstyle(2,0,6);       outtextxy(418,280,s);       setcolor(white);       settextstyle(2,0,7);       outtextxy(430,310,'Go Esc Ket Thuc !');       repeat ch:=readkey until ch=#27;      End;

BEGIN     Initgr;     Table;     Search;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

147

Closegraph; END.

= = = = = = = = = = = = = = = = = = = = = =

PH N VIII.

GRAPH THEORY & APPLICATIONS

Ế Ồ

Ị VIII.1­TÌM KI M TRÊN Đ  TH  (tên khác: DUY T Đ  TH ); TÔ MÀU Đ  TH ; TÌM MI N LIÊN THÔNG C A ĐT.

ế ơ ơ ề ộ ấ ề ề ấ ạ  m  v  lý thuy t m t v n đ  nào đó, các b n nên đ n th  vi n – đ  m t ít ti n nh t­ ế ầ Ồ Ụ ể ả Ị ế (N u quên OR l xem quy n: LÝ THUYÊT Đ  TH , nxb GIÁO D C 2012. Tác gi ư ệ ể ấ ế : Tr n Thông Qu )

ậ Ư Ả ể ừ ể ậ ầ thu t toán DFS sang BFS và ng ượ ạ c l i, ể

Ồ Ị A/ CÁC THU T TOÁN TÌM KI M (DUY T) TRÊN Đ  TH . ồ ọ Ơ ộ ả ặ ự 1­Hãy cài đ t tr c quan (đ  h a hóa code) hai thu t toán DBF và BFS trên cùng m t b n Code (BÀI C   Ễ   B N NH NG KHÔNG D !). Yêu c u: * Gõ ENTER đ  chuy n t * Gõ ESC đ  thoát

CODE:

PROGRAM DFS_BFS_SEARCH; USES CRT,GRAPH; CONST R=15;DL=500;N=8;VC=100; {KHONG CO DUONG DI THI DAT VO CUC VC=100} C:ARRAY[1..8] OF INTEGER=(150,330,450,450,330,150,30,30); D:ARRAY[1..8] OF INTEGER=(30,30,150,330,450,450,330,150); CL:ARRAY[0..3] OF WORD=(BLUE,YELLOW,WHITE,WHITE); NL:ARRAY[0..3] OF WORD=(YELLOW,BLUE,RED,BLACK); TYPE CSD=0..VC; AR=ARRAY[CSD] OF CSD; QUEUE=RECORD REAR:CSD; ELEMENT:AR; END; VAR G:ARRAY[CSD,CSD] OF BOOLEAN; I,J,K,U:CSD; P:AR; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE INITGR; { KHOI TAO DO HOA} VAR GD,GM:INTEGER; BEGIN GD:=DETECT;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

148

INITGRAPH(GD,GM,'..\BGI'); IF (GRAPHRESULT<> GROK) THEN BEGIN WRITELN('LOI KHOI TAO DO HOA, GO ENTER KET THUC !'); READLN; HALT(1) END END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE ADD(X:CSD;VAR Q:QUEUE); {THEM PHAN TU TU DUOI HANG DOI} BEGIN WITH Q DO BEGIN REAR:=REAR+1; ELEMENT[REAR]:=X END; END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE DELETE(VAR Q:QUEUE;VAR X:CSD); {BOT PHAN TU KHOI HANG DOI} VAR K:CSD; BEGIN WITH Q DO BEGIN X:=ELEMENT[1]; FOR K:=1 TO REAR­1 DO ELEMENT[K]:=ELEMENT[K+1]; REAR:=REAR­1 END; END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE VENUT(U:CSD;M1,M2:WORD); {VE CAC DINH DO THI} VAR ST:STRING[3]; BEGIN SETFILLSTYLE(1,M2); SETCOLOR(M1); FILLELLIPSE(C[U],D[U],R,R); STR(U,ST); OUTTEXTXY(C[U]­2,D[U]­2,ST); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE LINK(X,Y:CSD;M:WORD); BEGIN SETCOLOR(M); LINE(C[X],D[X],C[Y],D[Y]); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE DATA_AUTO_CREA; {TU DONG TAO DU LIEU NGAU NHIEN CHO PROG.} BEGIN

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

149

RANDOMIZE; FOR I:=1 TO N DO BEGIN G[I,I]:=FALSE; FOR J:=I+1 TO N DO BEGIN G[I,J]:=RANDOM(3)=1; G[J,I]:=G[I,J] END; END; FOR I:=1 TO N DO BEGIN J:=0; REPEAT J:=J+1 UNTIL G[I,J] OR (J=N); IF (J=N) AND (NOT G[I,N]) THEN BEGIN J:=1+RANDOM(N); IF J=I THEN IF I

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

150

(*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE VE_GR_BFS(U:CSD); {HIEN THI DO THI DE DUYET THEO BE RONG} VAR Q:QUEUE; BEGIN VENUT(U,CL[K],NL[K]); P[U]:=0; Q.REAR:=0; ADD(U,Q); WHILE Q.REAR<>0 DO BEGIN DELETE(Q,I); FOR J:=1 TO N DO IF G[I,J] THEN IF P[J]=VC THEN BEGIN P[J]:=I; LINK(I,J,NL[K]); VENUT(J,CL[K],NL[K]); VENUT(I,CL[K],NL[K]); ADD(J,Q); DELAY(DL); END; END; END;

(*­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE BFS; {DUYET THEO CHIEU RONG} BEGIN FOR U:=1 TO N DO P[U]:=VC; K:=0; FOR U:=1 TO N DO IF P[U]=VC THEN BEGIN K:=(K+1) MOD 4; VE_GR_BFS(U);DELAY(DL) END; END; (*­­­­­­­­­­­­­­­­­­­­*) PROCEDURE VE_DT_DFS(U:CSD); {HIEN THI DO THI DE DUYET THEO CHIEU SAU} VAR T:CSD; BEGIN I:=I+1; P[U]:=I; FOR T:=1 TO N DO IF G[U,T] THEN IF P[T]=0 THEN BEGIN LINK(U,T,NL[K]);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

151

VENUT(U,CL[K],NL[K]); VENUT(T,CL[K],NL[K]); DELAY(DL); VE_DT_DFS(T); END; END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE DFS; {DUYET THEO CHIEU SAU} BEGIN FOR I:=1 TO N DO P[I]:=0; I:=0; FOR U:=1 TO N DO IF P[U]=0 THEN BEGIN K:=(K+1) MOD 4; VENUT(U,CL[K],NL[K]); VE_DT_DFS(U);DELAY(DL) END; END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE PROC_CALL_PROC; {THU TUC GOI CAC THU TUC DUYET} VAR KT:CHAR; BEGIN IF KEYPRESSED THEN REPEAT KT:=READKEY UNTIL NOT KEYPRESSED; REPEAT DATA_AUTO_CREA; PRINT_GRAPH; DEMO('Theo Be Rong'); KT:=READKEY; IF KT=#27 THEN EXIT; BFS; KT:=READKEY; IF KT=#27 THEN EXIT; PRINT_GRAPH; DEMO('Theo Do Sau'); KT:=READKEY; IF KT=#27 THEN EXIT; DFS; KT:=READKEY; UNTIL (KT=#27); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) BEGIN (* CHUONG TRINH CHINH *) CLRSCR; INITGR; PROC_CALL_PROC;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

152

CLOSEGRAPH; END.

ử ộ ấ ở ứ Ơ Ả ệ ố ậ Ọ ự ế ươ ỳ ệ ẳ ạ ọ ư ề Th  m t bài duy nh t   m c TRÊN C  B N v  duy t theo BFS: Ố Ế ỳ ệ ng k  di u,  2­(IOI­1996: THI OLYMPIC TIN H C QU C T  1996) Ti p theo thành t u kh i l p ph ộ ố ủ ông Rubik phát minh d ng c i biên ph ng c a kh i này và ông g i đó là các ô vuông k  di u. Đó là m t  ượ ả b ng 8 ô vuông có kích th c tô màu khác nhau. ả ướ c nh  nhau đ

1 2 3 4

8 7 6 5

ố ở ươ ượ ề c ký hi u b i 8 s  nguyên d ng đàu tiên (xem hình ngay trên) vi t theo chi u ế ầ ượ t l n l ở ế ướ i cùng trái. ầ ô góc d ệ ổ ơ ả ự ế ệ ấ ấ ủ ả

ộ ỗ ệ ổ ự ả ả

ổ ơ ả ủ ề ế ộ c tác đ ng b i 3 phép bi n đ i c  b n nói trên. Và tác đ ng c a 3 phép ƯỚ Ố I ĐÂY CÁC S  TRÊN CÙNG M I B  DATA D ở ữ  gi a ở Ở Ỗ Ộ i đây: ( Ả Ủ ị ồ ể ượ ả ở Ị ệ Các màu tô đ ồ ắ ầ ừ ồ kim đ ng h , b t đ u t  ô góc trên cùng trái và k t thúc  ộ ấ ọ ư M t c u hình nh  trên g i là c u hình ban đ u. Ta th c hi n 3 phép bi n đ i c  b n ký hi u là ‘A’, ‘B’,  ể ‘C’ đ  tác đ ng lên c u hình c a b ng, trong đó: ướ • ‘A’: Đ i ch  dòng trên và dòng d i ề • ‘B’: Th c hi n phép hoán v  theo chi u sang ph i vòng quanh b ng. ồ ề • ‘C’: Quay theo chi u kim đ ng h  4 ô  ọ ấ M i c u hình đ u có th  đ ổ ơ ả ấ ế bi n đ i c  b n  y mô t ƯỚ VÀ D ộ ướ  b i hình d I CÙNG LÀ V  TRÍ CÁC Ô C A B NG)

(cid:0) Ả ủ B NG 1                                  1          2          3          4 INDEX c a các ô

1 2 3 4

8 7 6 5

ủ INDEX c a các ô

8         7          6          5      (cid:0)

Ả B NG 2

4 1 2 3

5 8 7 6

Ả B NG 3 1 7 2 4

8 6 3 5

ứ ố ở ị ộ ỉ ị ả ổ ươ ứ ủ ả ị ể ế ị ố Các s  ghi  làm phép bi n đ i t ở  ngoài b ng ch  v  trí các ô c a b ng. N u m t ô  ế ế ng  ng, ô vuông mà v  trí tr ế  v  trí p ch a s  i thì có nghĩa là sau khi  ẽ ượ ổ ủ ướ c lúc bi n đ i c a nó là i s  đ c chuy n đ n v  trí

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

153

ế ề ộ ấ ướ ầ t program tìm dãy các phép bi n đ i đ  đ a c u hình ban đ u v  m t c u hình đích cho tr c. ể ế ố ổ ủ ạ ổ ể ư ấ ế c thêm 2 đi m n u s  phép bi n đ i c a b n không quá 300 ấ ồ ả ấ ứ ấ ố c u hình đích.

ả ầ ổ ủ ạ Ự ế ệ ế ổ ạ ự p.  ế a) Hãy vi ạ ẽ ượ b) B n s  đ ữ ệ * D  li u vào c t trên text file Data.in g m: ộ ­ M t dòng duy nh t ch a 8 s  nguyên mô t ế * K t qu  ghi lên text file Data.ou: ế ố ­Dòng đ u tiên ghi s  các phép bi n đ i L ­ T i L dòng ti p theo ghi ký hi u các phép bi n đ i đã nói trên theo TRÌNH T  mà program c a b n đã  ệ th c hi n

Ụ Ụ Ể Ủ ƯỚ I ĐÂY

Ộ M T VÍ D  C  TH  C A BÀI TOÁN NÀY CHO D Data.In  2 6 8 4 5 7 3 1

Data.Ou  7 B  C  A B  C C B

Program MagicSquare; {BAI NAY DUYET DO THI THEO BFS) Uses crt; Const kt=8; m=40320; fi='Data.In'; fo='Data.Ou'; Type Bd=array[1..kt] of 1..kt; Ht=array[1..kt] of 1..kt; Const  thuan:Array['A'..'C'] Of Bd=((8,7,6,5,4,3,2,1),(4,1,2,3,6,7,8,5),                                                          (1,7,2,4,5,3,6,8)); {Cac b_doi co ban}            nguoc:Array['A'..'C'] of Bd=((8,7,6,5,4,3,2,1),(2,3,4,1,8,5,6,7),                                                          (1,3,6,4,5,7,2,8)); {Nguoc cua b_doi}               dau:Ht=(1,2,3,4,5,6,7,8); {Trang thai ban dau} Var dic:Ht; {Bien luu trang thai dich}           s:String; {Day cac b_doi dua tr_thai dau den tr_thai dich}       fact:Array[0..kt] of Longint; {mang luu tu 0! den 8!}        last:Array[0..m] of Char; {last[sh(dic)] la ky tu cuoi cung cua day cac}                             {b_doi dua trang thai dau ve trang thai dich}                       {Neu last[sh(dic)]=' ' thi dich cung rong (tuc dich khong duoc sinh} Procedure Nhap; Var tepvao:text; i:word; Begin Assign(tepvao,fi); Reset(tepvao); For i:=1 to kt Do Read(tepvao,dic[i]); Close(tepvao); End; {Het nhap lieu}

Procedure Facto; {Tinh giai thua} Var i:word; 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

154

Begin        fact[1]:=1; fact[0]:=1;        For i:=2 to kt Do               fact[i]:=i*fact[i­1]; End;

ỏ ơ

ố ị ủ ầ ủ  đ u tiên c a p thì có

Function sh(p:Ht):Word; {ham sh de tinh so hieu cua mot hoan vi bat ky} Var res, L, i,j:Word; Begin res:=0; For i:=1 to kt Do Begin L:=0; {L­ so cac phan tu cua p o cac vi tri tu 1­>i­1 nh  h n p[i]} For j:=1 to i­1 Do       If p[j]dic[i] then Begin bang:=false; exit; End; End; Procedure sinh; {Tao day cac b_doi tu tr_thai dau de dat tr_thai dich} {last[sh(dic)] la phep b_doi cuoi cung cua day} Const qs=700; {kich thuoc danh sach} 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

155

Var hdoi:Array[0..qs­1] of ht; {Khai bao  hang doi chua cac b_doi} notfound:Boolean; head, tail, i, rankq:Word; r, s:Ht; x:Char; Begin For i:=0 to m Do last[i]:=' '; {khoi tri} last[0]:='.'; head:=0; tail:=1; hdoi[0]:=dau; notfound:=true; While notfound Do Begin r:=hdoi[head]; Inc(head); If head=qs Then head:=0; For x:='A' to 'C' Do Begin App(r, x, s); rankq:=sh(s); If last[rankq]=' ' Then Begin last[rankq]:=x; If bang(dic,s) Then Begin notfound:=false; break; End; hdoi[tail]:=s; Inc(tail); If tail=qs Then tail:=0; End; End; End; End; {ket thuc thu tuc sinh} Procedure tim; {kien tao cac phep bien doi} Var rankq:Word; x:Char; p,q:Ht; Begin q:=dic; rankq:=sh(q); s:=' '; While rankq<>0 do Begin x:=last[rankq]; s:=x+s; bd_nguoc(q,x,p); q:=p; rankq:=sh(q); End; End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

156

ƯỚ

Ề Ồ ề

NG ộ ồ ị ư

ế ằ ặ t r ng t kê các thành ph n (mi n) liên thông c a m t đ  th  vô h ượ ướ ng. Bi ư ướ ể ệ ễ ầ ở c bi u di n b i danh sách li t kê c nh nh  sau (Ds này l u trên Text ệ ng đ Procedure Xuat; Var tepra:text; L,i:word; Begin Assign(tepra,fo); rewrite(tepra); L:=length(s); Writeln(tepra, L­1); For i:=1 to L do Writeln(tepra, s[i]); Close(tepra); End; Begin {Main Prog.} clrscr; Nhap; Facto; Sinh; Tim; Xuat; Writeln('Done!'); readln; End. Ồ Ị B/ CÁC THU T TOÁN TÌM CÁC MI N LIÊN THÔNG TRÊN Đ  TH B.1) TÌM MI N LIÊN THÔNG TRÊN Đ  TH  VÔ H ủ ậ 3­ Cài đ t thu t toán tìm & li ạ ủ ồ ị ấ c u trúc c a đ  th  vô h File LTHG.IN):

13 10 1 2 1 3  2 3 4 5 4 7 5 6 8 9 10 12 11 12  12 13

ả ư ế K t qu  l u trên file Xuat.kq

ể ạ ượ ệ ồ ị ệ ụ ề CODE: Đ  đ t đ c m c tiêu đ  bài ta duy t đ  th  Đ  quy theo DFS

Program Dem_so_thp_lthong; uses crt; const max=50; fi='lthg.in'; fo='xuat.kq'; {Du lieu vao la Ds liet ke canh!} type m1=Array[0..max] of integer; m2=Array[1..max,1..max] of byte; var a:m2; {ma tran danh sach liet ke canh}

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

157

n:integer; v:m1; sm:integer; {so mien lien thong}

Procedure Nhap; var f:text; i,j:integer; Begin Assign(f,fi); Reset(f); Read(f,n); FillChar(a,sizeof(a),0); {khoi tri cho mang a} While not seekeof(f) do {tao ma tran luu dinh dau va cuoi cua moi canh} Begin Read(f,i); While not seekeoln(f) do Begin Read(f,j); a[i,j]:=1; a[j,i]:=1; End; Readln(f); End; Close(f); End;

Procedure DFS(i:integer); Var j:integer; Begin For j:=1 to n do If v[j]=0 then {neu j chua thuoc mien lien thong nao thi} If a[i,j]=1 then {neu j ke voi i thi } Begin v[j]:=sm; {ghi nho dinh j cung mien lth sm voi i} DFS(j); {duyet tiep do thi theo chieu sau tu dinh j} End; End;

Procedure Xuly; Var s:integer; Begin FillChar(v,sizeof(v),0); sm:=0; For s:=1 to n do If v[s]=0 then Begin Inc(sm); {danh so cho mien lth moi} v[s]:=sm; {s la dinh dau tien phat hien thuoc mien lth moi} DFS(s); {Duyet dthi tim tat ca cac dinh lth voi s} End; End;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

158

Procedure ghikq; var f:text; i,j:integer; Begin Assign(f,fo); Rewrite(f); Writeln(f,'So mien lien thong la:',sm); For i:=1 to sm do Begin For j:=1 to n do If v[j]=i then Write(f,j,' '); Writeln(f,'<­­ Day la cac dinh o mien Lt thu ',i); End; close(f); End;

ƯỚ

NG (TH C

Procedure Inkq; var f:text; line:string[50]; Begin Assign(f,fo); Reset(f); While not seekeof(f) Do Begin Readln(f,line); Writeln(line); End; Close(f); End; Begin clrscr; Nhap; Xuly; Ghikq; Inkq; Writeln; Write('Go ENTER de thoat!'); Readln; End.

B.2) TÌM MI N LIÊN THÔNG M NH TRÊN Đ  TH  CÓ H CH T LÀ CÀI Đ T THU T TOÁN TARJAN) ậ 4/ Cài đ t thu t toán tìm & li ồ ị ế ằ TARJAN). Bi LTH_MANH.IN): 11 15 1 2 8 h 54 m                                                                                                                                         28/7/2017

ặ ủ ồ ị ướ Ạ ệ ề t kê các mi n liên thông M NH c a đ  th  có h ậ ng (thu t toán ượ ướ ư ễ ể ở c bi u di n b i ds cung sau đây (và ds này l u trên text file t r ng đ  th  có h ng này đ

ế

Th y Tr n Thông Qu

159

1 8 2 3 3 4 4 2 4 5 5 6 6 7 7 5 8 9 9 4 9 10 10 8 10 11 11 9

ả ư ế K t qu  l u trên file LTH_MAMH.OU

ệ ồ ị

ề CODE: (V  duy t đ  th , bài này cũng dùng DFS) Program Tarjan_Alg; Uses crt; Const fi='LTH_MANH.IN'; fo='LTH_MANH.OU'; Type lk=^nut; nut=record s:word; next:lk; End; cay=array[0..200] of lk; m1=array[0..200] of word; Var sv,id,m,n,top:word; {m:so dinh; n:so canh} Num,Low,p,s:m1; dsk:cay; f:Text;

Procedure Nhap; Var i,u,v: word; t:lk; Begin Assign(f,fi); Reset(f); Readln(f,m,n); {doc so dinh m, so canh n tu tep vao cac bien nho m,n} For i:=1 to n Do Begin Readln(f,u,v); New(t); t^.s:=v; t^.next:=dsk[u]; dsk[u]:=t; End; Close(f); End;

Function min(u,v:word):word; Begin 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

160

If u

Procedure DFS(i:word); Var j:word; t:lk; Begin Inc(id); Num[i]:=id; Low[i]:=Num[i]; t:=dsk[i]; Inc(top); s[top]:=i; While Not (t=Nil) Do Begin j:=t^.s; If p[j]=0 then If Num[j]=0 then Begin DFS(j); Low[i]:=min(Low[i], Low[j]); End Else Low[i]:=min(Low[i], Num[j]); t:=t^.next; End; If Low[i]=Num[i] then Begin Inc(sv); Repeat j:=s[top]; {lay 1 phan tu ra khoi Stack tai dinh, luu vao j} dec(top); {Khi do so phan tu o Stack giam di mot} p[j]:=sv; Until i=j; End; End;

Procedure Visit; var i:word; Begin For i:=1 to m do If Num[i]=0 then DFS(i); End;

Procedure Xuat; Var i,j:word; Begin Assign(f,fo); Rewrite(f); Writeln;Writeln; Writeln(f,'So mien lien thong la:',sv); For i:=1 to sv Do

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

161

Begin For j:=1 to m Do If p[j]=i then write(f,j,' '); Writeln(f,'­> Cac dinh thuoc mien lien thong thu ',i,'.'); End; Close(f); end;

Procedure Inkq; Var f:Text;line:String; Begin Assign(f,fo); Reset(f); While Not SeekEof(f) Do Begin Readln(f,line); Writeln(line); End; Close(f); End;

{ Main Program } Begin clrscr; Nhap; Visit; Xuat; Inkq; Readln; End.

ả ượ ỉ ỉ Ấ ồ ị Ỳ Ề c ấ ể

Ị B.3) BÀI TOÁN TÔ MÀU Đ  THỒ ố 5­ Hãy dùng s  màu ít nh t đ  tô màu đ  th  có N đ nh, sao cho hai đ nh B T K  K  NHAU ph i đ ằ tô b ng màu KHÁC NHAU. Yêu c u:ầ   ồ ọ 1­Đ  h a hóa Code ấ 2­C u trúc đ  th  t CODE: PROGRAM COLOR_GRAPH; USES CRT,GRAPH; CONST R=15;DL=500;VC=100;N=8; C:ARRAY[1..8] OF INTEGER=(150,330,450,450,330,150,30,30); D:ARRAY[1..8] OF INTEGER=(30,30,150,330,450,450,330,150); CL:ARRAY[0..4] OF WORD=(WHITE,RED,YELLOW,BLUE,GREEN); TYPE CSD=0..VC; VAR G:ARRAY[CSD,CSD] OF BOOLEAN; V,V0,V1:SET OF CSD; I,J,K:CSD; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*)

ờ ổ ấ ồ ị ự ộ ể ấ đ ng thay đ i nh  nh n phím ENTER; nh n ESC đ  thoát.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

162

PROCEDURE INITGR; VAR GD,GM:INTEGER; BEGIN GD:=DETECT; INITGRAPH(GD,GM,'..\BGI'); IF (GRAPHRESULT<> GROK) THEN BEGIN WRITELN('LOI KHOI TAO DO HOA, GO ENTER KET THUC !'); READLN; HALT(1) END END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE VENUT(U:CSD;M:WORD); BEGIN SETFILLSTYLE(1,M);SETCOLOR(M); FILLELLIPSE(C[U],D[U],R,R); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE LINK(X,Y:CSD;M:WORD); BEGIN SETCOLOR(M); LINE(C[X],D[X],C[Y],D[Y]); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE INIT_GRAPH; BEGIN RANDOMIZE; FOR I:=1 TO N DO BEGIN G[I,I]:=FALSE; FOR J:=I+1 TO N DO BEGIN G[I,J]:=RANDOM(3)=1; G[J,I]:=G[I,J] END; END; FOR I:=1 TO N DO BEGIN J:=0; REPEAT J:=J+1 UNTIL G[I,J] OR (J=N); IF (J=N) AND (NOT G[I,N]) THEN BEGIN J:=RANDOM(N)+1; IF J=I THEN IF I

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

163

G[I,J]:=TRUE;G[J,I]:=TRUE END; END; END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE MENU_PRINT; BEGIN SETCOLOR(WHITE); OUTTEXTXY(500,30,'Son Do Thi'); SETCOLOR(YELLOW); OUTTEXTXY(490,90,'Go Enter Tiep Tuc ...'); SETCOLOR(RED); OUTTEXTXY(490,150,'Go Esc Ket Thuc !'); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE PRINT_GRAPH; BEGIN SETBKCOLOR(BLUE);CLEARDEVICE; SETFILLSTYLE(1,DARKGRAY); BAR(0,0,GETMAXY,GETMAXY); FOR I:=1 TO N DO FOR J:=1 TO N DO IF G[I,J] THEN LINK(I,J,CL[0]); LINE(C[I],D[I],C[J],D[J]); FOR I:=1 TO N DO VENUT(I,CL[0]); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE COLORING; {To mau do thi} VAR CHECK:BOOLEAN; BEGIN V0:=V;K:=0; WHILE V0<>[] DO BEGIN K:=K+1; I:=0; REPEAT I:=I+1 UNTIL I IN V0; VENUT(I,CL[K]); DELAY(DL); V1:=[I]; FOR I:=1 TO N DO IF I IN V0 THEN BEGIN J:=0; REPEAT J:=J+1; CHECK:=G[I,J] AND (J IN V1); UNTIL CHECK OR (J=N); IF NOT CHECK THEN BEGIN VENUT(I,CL[K]); DELAY(DL);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

164

V1:=V1+[I]; END; END; V0:=V0­V1; END; END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) PROCEDURE PROC_CALL_PROC; {THU TUC GOI CAC THU TUC} VAR KT:CHAR; BEGIN IF KEYPRESSED THEN REPEAT KT:=READKEY UNTIL NOT KEYPRESSED; REPEAT INIT_GRAPH; PRINT_GRAPH; MENU_PRINT; COLORING; KT:=READKEY; UNTIL (KT=#27); END; (*­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­*) BEGIN (* CHUONG TRINH CHINH *) CLRSCR; INITGR; V:=[]; FOR I:=1 TO N DO V:=V+[I]; PROC_CALL_PROC; CLOSEGRAPH; END.

VIII­2/ Đ  TH  EULER & Đ  TH  HAMILTON

ể ễ ệ ườ ướ ượ ồ ị ề ướ ậ ng đ ng đi Euler trên đ  th  vô h ở c bi u di n b i ma tr n k  d i đây:

Ị Ồ A) Đ  TH  EULER 6­ Li t kê các đ 9    (cid:0) ố ỉ 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 8 h 54 m                                                                                                                                         28/7/2017

ộ ắ ả ủ ồ ị ữ ệ S  đ nh c a đ  th  (B t bu c ph i có d  li u này!)

ế

Th y Tr n Thông Qu

165

0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0

CODE: Program Duongdi_Euler; uses crt; Label L1; Const max=30; Type mg1=array[1..max,1..max] of byte; mg2=array[1..max] of boolean; mg3=array[1..max] of integer; Var c:mg1; check:mg2; i,j,u,n,dem1,dem:integer; f:text; tf:string[12];

Function l_thg(u,v:integer; ktra:mg2):integer; var i,j,d,k,l:integer; p:mg3; Begin c[u,v]:=0; c[v,u]:=0; For i:=1 to n do p[i]:=0; d:=0; For i:=1 to n do Begin If (p[i]=0) and ktra[i] then Begin Inc(d); p[i]:=d; for j:=1 to n do for L:=1 to n do If (p[j]=0) and ktra[j] and (p[L]=d) and (c[L,j]=1) then p[j]:=d; End; End; c[u,v]:=1; c[v,u]:=1; L_thg:=d; End;

{Main Prog.} Begin clrscr; Write('Nhap ten tep du lieu:'); readln(tf); Assign(f,tf); Reset(f); Readln(f,n); For i:=1 to n do For j:=1 to n do Read(f,c[i,j]); Close(f); Write('Cho biet dinh xuat phat:'); Readln(u); Writeln('Duong di Euler tim duoc:'); Writeln; dem:=0; For j:=1 to n do check[j]:=true; L1:dem1:=0; For j:=1 to n do

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

166

If c[u,j]=1 then Inc(dem1); dem:=dem+1; If dem1=1 then Begin For j:=1 to n do If c[u,j]=1 then Begin check[u]:=false; c[u,j]:=0; c[j,u]:=0; Writeln('Di qua canh thu ',dem,' dung 1 lan la tu:',u,'­>',j); u:=j; Goto L1; End; End Else Begin For j:=1 to n do If c[u,j]=1 then Begin If L_thg(u,j,check)=1 then Begin c[u,j]:=0; c[j,u]:=0; Writeln('Di qua canh thu ',dem,' dung 1 lan la tu:',u,'­>',j); u:=j; Goto L1; End End End; Readln; End.

ở ạ ầ ể ả ồ ị ướ ệ ướ ễ ướ ị ạ ượ ả ớ ồ ị t kê c nh. Yêu c u: Program  ng: gõ  ng: gõ 0; đ  th  có h ồ ị ng (đ  th  vô h c c  v i đ  th  vô h ồ ị ể ồ ị ng và đ  th  có h

ỉ ộ ắ ả ạ

7­ Tìm và hi n th  chu trình EULER trên đ  th  bi u di n b i danh sách li ướ ph i ch y đ 1). Test1: Dùng file vào DTEUL.IN 4 5 ­> 4 đ nh; 5 c nh (B t bu c ph i có hai data này!) 1 2 1 4 2 3 2 4 3 4 Test 2: Dùng file vào EU1.IN 5 6 1 2 1 5 2 5 3 4 3 5 4 5 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

167

B) Đ  TH  HAMILTON 8­ Tìm và hi n th  đ Test1: Dùng file vào DTEUL.IN 4 5  1 2 1 4 2 3 2 4 3 4 Test 2: Dùng file vào EU1.IN 5 6 1 2 1 5 2 5 3 4 3 5 4 5

ồ ị ướ ượ ể ễ ệ ể ị ườ ng đi Hamilton trên đ  th  vô h ng đ ở c bi u di n b i danh sách li ạ t kê c nh.

ề ủ ồ ị ử ệ ồ ị ượ t kê chu trình Hamilton trên đ  th  đ c ể ễ ậ ớ ạ 9/ (Bài này b n th  test v i ma tr n k  c a đ  th ) Tìm và li ề ướ ở bi u di n b i ma tr n k  d ậ i đây.

8  0 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0

CODE: Program Chutrinh_Hamilton; Uses crt; Var i,j,n:Integer; c:Array[1..20,1..20] of byte; p:Array[1..20] of byte; b:array[1..20] of boolean; d:Word; f1,f2:Text;

Procedure Xuly; Label l1; Var t:integer; ktra:boolean; Begin ktra:=true; For t:=1 to n­1 Do If c[p[t],p[t+1]]=0 then Begin 8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

168

ktra:=False; goto L1; End; If c[p[n],p[1]]=0 then ktra:=False; L1:If ktra then Begin d:=d+1; Write(f2,'Chu trinh Hamilton thu ',d,' la:'); For t:=1 to n Do Write(f2,p[t]:3); Writeln(f2); End; End;

Procedure test(k:integer); Var i1,j:integer; Begin For j:=1 to n do If b[j] then Begin p[k]:=j; b[j]:=False; If k=n then xuly Else test(k+1); b[j]:=True; End; End; {Main Prog.} Begin clrscr; Assign(f1,'CtHamil.Inp'); Reset(f1); Assign(f2,'CtHamil.Out'); Rewrite(f2); Readln(f1,n); For i:=1 to n do For j:=1 to n do Read(f1,c[i,j]); Close(f1); For i:=1 to n do b[i]:=True; d:=0; Test(1); Close(f2); Writeln('DONE!'); Writeln('Go Enter de quay ve chuong trinh!'); Writeln('De xem ket qua, go phim F3, go CtHamil.Out, roi ENTER.'); Readln; End.

Ọ Ồ Ể Ị ổ ế ả ề ả ưở ế ộ Ố ng đ n n i dung và cách gi i bài toán, ta ƯỜ Ị 10/ CHU TRÌNH HAMILTON TRÊN Đ  TH  CÓ TR NG S : Bài toán KINH ĐI N n i ti ng:  TRAVELLING SALESMAN PROBLEM. Không h   nh h ọ g i bài toán này là bài toán NG I DU L CH.

ị ố ừ ượ ườ ữ ể ế ị ể c có N đ a đi m du l ch đ 1 đ n N. Gi a hai đ a đi m b t k  có th  có đ c đánh s  t ng đi ữ ể ằ ạ ị ể ữ ể ấ ố ố ấ ả ỗ ị ị ề ể ể ầ ộ ị ấ ỳ ị ộ ướ M t n ị ẳ ặ ườ ng đi thì giá đi (b ng ô tô ch ng h n) du l ch gi a chúng là  ho c không. Gi a hai đ a di m i, j có đ ừ ị ữ nh ng s  nguyên C(i,j)>0. Nói chung C(i, j) khác C(j, i). Khách du l ch xu t phát t  đ a đi m k ,mu n  ậ ồ t c  các đ a đi m, m i đ a đi m đúng 1 l n, r i quay v  k (k

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

169

ụ ụ ể ể ị ữ ệ ề ễ ậ ấ ộ ở ả ạ ư ị ỏ  ớ ổ trình du l ch v i t ng chi phí C nh nh t. D  li u vào cho m t ví d  c  th  bi u di n b i ma tr n k  mô t m ng du l ch nói trên nh  sau:

6 0 3 0 4 0 0 3 0 4 0 2 0 0 4 0 0 1 1 4 0 0 0 1 5 0 2 1 1 0 5 0 0 1 5 5 0 1 6

CODE:

Program Nguoi_Dulich; { chu trinh Hamilton tren do thi co trong so} Uses crt;  Const sd=10; fi='HMT.VAO'; fo='HMT.RA'; Type m1=Array[1..sd,1..sd] of Integer; m2=Array[1..sd] of Integer; m3=Array[1..sd] of Boolean; Var c:m1; a,x:m2; d:m3; n,cmin,sum,maxsum,dem:Integer;

Procedure Nhap; Var f:text; x,i,j:Integer; Begin Assign(f,fi); Reset(f); Readln(f,n); cmin:=maxint; For i:=1 to n do Begin For j:=1 to n do Begin Read(f,c[i,j]); If c[i,j]>0 then If (c[i,j]j) Then cmin:=c[i,j]; End; Readln(f); End; Close(f); End;

Procedure Tim_Chiphi_Min; Begin If sum+c[a[n],a[1]]

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

170

maxsum:=sum+c[a[n],a[1]]; x:=a; Inc(dem); End; End; Procedure Try(i:integer); var j:Integer; Begin If i>n Then Begin If c[a[n],a[1]]>0 Then Tim_Chiphi_Min; End Else For j:=1 to n Do If d[j] Then If c[a[i­1],j]>0 then Begin a[i]:=j; d[j]:=False; sum:=sum+c[a[i­1],j]; If sum+(n­i+1)*cmin0 then Begin Writeln(g,'Tong chi phi cua hanh trinh DU LICH=',maxsum); Write(g,'Tour du lich KHEP KIN co chi phi min ma khach da di la:'); For i:=1 to n do Write(g,x[i],' '); Writeln(g,x[1]); End Else Writeln(g,0); End; Procedure Init; {Khoi tri cho cac bien} Var i,j:integer; Begin For i:=1 to n do d[i]:=True; maxsum:=maxint; sum:=0; a[1]:=1; d[1]:=false;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

171

dem:=0; End; Begin clrscr; Nhap; Init; Assign(g,fo); Rewrite(g); Try(2); Xuat; Writeln; Writeln(#32:7,'XONG! GO ENTER­>GO PHIM F3­>GO HMT.RA­>ENTER: DE XEM KET QUA.'); Readln; Close(g); End.

= = = = = = = = = = = = = = = =

Ậ VIII­3/ CÁC THU T TOÁN TÌM Đ

NG ĐI

ƯỜ Ị NG N NH T TRÊN Đ  TH .

ườ

ấ ừ ộ

ế

ắ ng ng n nh t t

m t đi m đ n các

Tìm đ

Ậ VIII­3.1) THU T TOÁN DIJKSTRA: ồ ị i trên đ  th . đi m còn l

ướ

Ố ượ

ạ t kê c nh

ễ Ọ ng CÓ TR NG S  đ i đây (L u trên text file DATA.VAO có c u trúc d ướ ấ ỳ ế

ở c bi u di n b i danh sách li ướ i đây). L p trình tìm và  ỉ

ấ ừ ỉ

ư ắ ị ườ ng ng n nh t t

ồ c b t k  đ n đ nh đích tùy ch n trên đ

đ nh cho tr

ộ ồ ị 1­ M t đ  th  vô h ướ d ể hi n th  đ ị ấ th   y.

ắ   5 đ nh, 9 cung: b t bu c ph i ghi

đây

5  9  (cid:0) 1 2 1 1 5 9 2 3 2 2 4 5 3 4 1 3 5 2 4 3 7 5 2 8 5 4 10

CODE:

{Chuong trinh nay Test tren tep DATA.VAO}

Program Min_Path;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Uses crt;

Const max=50; Type contro=^ct;          ct=record          bd:byte;   {Dinh bat dau}          lk:contro; End; Var n,m,xp,dich:integer;                 tt:boolean;     v,dau,cuoi,len:Array[1..max] of integer;     FileName:String;

Procedure Data_Inp(Filename:String); Var i:byte; f:Text; Begin    Assign(f,FileName); Reset(f);    Readln(f,n,m);      For i:=1 to m do Readln(f,dau[i],cuoi[i],len[i]);    Close(f);    Writeln('Do thi dang xet co ',n,' dinh va ',m,' cung');    For i:=1 to m do      Writeln('Canh ',dau[i],'­­>',cuoi[i],' co trong so=',len[i]); End;

Function MemCheck(x:byte):contro; Var p:contro; Begin    New(p);    If p=Nil Then       Begin          Writeln('Thieu bo nho!'); Halt;          Readln;       End;    p^.bd:=x;    MemCheck:=p; End;

Procedure PathMin_Find; Var ds,p:contro; i,d,x:byte; Begin

172

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

x:=dich; ds:=Nil; d:=v[x];

While (x<>xp) Do      For i:=1 to m do        If cuoi[i]=x Then           If (v[dau[i]]<>­1) and (v[dau[i]]+len[i]=v[x]) Then             Begin                v[x]:=­1;                   x:=dau[i];                   p:=MemCheck(x);                   p^.lk:=ds; ds:=p;                   Break;             End;       p:=ds;       While p<>Nil Do        Begin           Write(p^.bd,'­­>'); p:=p^.Lk;        End;   Writeln(dich,' voi do dai min=',d); End;

Procedure Init; Var i:Byte; Begin    For i:=1 to n do v[i]:=­1; End;

Procedure LastProces; Var tt:boolean; j,x,y:byte; Begin    tt:=True;     While tt Do        Begin           tt:=False;           For j:=1 to m do             Begin               x:=dau[j]; y:=cuoi[j];               If v[x]<>­1 Then                 Begin                  If (v[y]=­1) Or (v[x]+len[j]

173

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

tt:=True;

v[y]:=v[x]+len[j];                  End;               End;           End;       End;   If (v[dich]=­1) Then Writeln('Khong co duong di tu ',xp,' den ',dich)   Else Begin          Write('Duong di ngan nhat tu ',xp,' den ',dich,' qua cac dinh:');            PathMin_Find;        End; End;

{Chuong trinh me} Begin   clrscr;    Write('Nhap ten tep du lieu:'); Readln(FileName); {hay nhap DATA.VAO}    Data_Inp(FileName);    Repeat       Init;       Write('Cho biet dinh xuat phat:'); Readln(xp);       v[xp]:=0;       Write('Cho biet dinh den:'); Readln(dich);       v[dich]:=­1;       LastProces;       Writeln;       Writeln('Tiep go ENTER, ngung go ESC.');    Until Readkey=#27; End.

ế

ữ ệ

ư t m t code cho bài toán trên, nh ng x  lý trên file d  li u vào

ỏ Bài t p nh  cho b n: Vi Ề ủ ồ ị Ậ là MA TR N K  c a đ  th .

ườ

Tìm đ

ấ ng ng n nh t gi a m i

Ặ ỉ

ồ ị

VIII­3.2) THU T TOÁN  FORD­BELLMAN:  C P đ nh tùy ý trên đ  th  KHÔNG CÓ CHU TRÌNH ÂM.

ố ồ ạ ậ

ự ẽ ị

Ặ ổ ứ ư ệ Ề Ậ

ộ ồ ị ậ

ớ ể

ồ ị

2­CÀI Đ T FORD­BELLMAN ALGORITHM  ạ ọ  v  b a ra m t đ  th  có tr ng s , r i b n l p MA  (T  ch c d  li u VÀO: B n hãy t ủ ạ ẽ TR N K  CHO nó. Code c a b n s  Test trên ma tr n đó. Khi t o đ  th  nh  ki m tra ả b o đ m nó không có chu trình ÂM)

CODE:

174

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Program Ford_Bell_Algo;

Uses Crt; Const fi='sl.vao';  fo='sl.ra'; max=100;       vocuc=100*50*maxint;  {=163835000} Type m1=array[1..max,1..max] of longint;      m2=array[1..max] of longint;      m3=array[1..max] of byte; Var  a:m1;v:m2; t:m3;      m:integer; n,x,y:byte;

Procedure Input; Var f:Text; k,w:integer;     i,j:byte; Begin      assign(f,fi); reset(f);      Fillchar(a,sizeof(a),0); Readln(f,n,m,x,y);      For k:=1 to m do      Begin           Readln(f,i,j,w);           a[i,j]:=w; a[j,i]:=w;      End;     close(f); End;

Procedure init; var i,j:byte; Begin      For i:=1 to n do         For j:=1 to n do         If a[i,j]=0 then a[i,j]:=vocuc;         For i:=1 to n do v[i]:=a[x,i]; v[x]:=0;         FillChar(t,sizeof(t),0); End;

Procedure Ford_Bellman; Var i,j,k:byte; stop:boolean; Begin      for k:=1 to n­1 do      Begin      stop:=true;

175

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

For i:=1 to n do

For j:=1 to n do      If j<>x then         If v[j]>v[i]+a[i,j] then         Begin             v[j]:=v[i]+a[i,j];             t[j]:=i;             stop:=false;         End;      If stop then break;      End; End;

Procedure Xuat; var f:text; kq:m3; i,j:byte; Begin      Assign(f,fo);  Rewrite(f);      If v[y]=vocuc then      Begin           Writeln(f,­1);           close(f);           halt;      End;            Writeln(f,v[y]);            i:=y;            j:=0;    Repeat      Inc(j);      kq[j]:=i;          i:=t[i];    Until i=0;    Assign(f,fo); Reset(f);    While Not SeekEof(f) Do       For i:=j Downto 1 do Writeln(f,kq[i]);    close(f); End;

Begin clrscr;     input;     init;

176

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Ford_Bellman;

xuat;     Write('DONE!');     readln End.

: Tìm đ

ấ ng ng n nh t gi a m i

ườ ọ

ồ ị

VIII.­3.3) THU T TOÁN FLOYD­WARSHALL ố ỉ ặ c p đ nh thông qua các đ nh TRUNG GIAN trên đ  th  có tr ng s .

Ồ Ọ

3­Đ  H A HÓA code cho thu t toán trên. Yêu c u:

ậ ổ ấ

ồ ị a) Gõ ENTER đ  thay đ i c u trúc đ  th , b) Gõ SPCE: tìm ti p,ế c) Gõ ESC: Thoát.

CODE: Program Floyd_Warshall_Alg; uses crt,graph; const r=15;dl=500;n=5;vc=200;vocuc=10000;   c:array[1..5]of integer =(240,460,350,130,20);   d:array[1..5] of integer=(20,240,460,460,240);   ec:array[1..10] of integer =(350,276,204,130,405,295,240,240,185,75);   ed:array[1..10] of integer=(130,166,166,130,360,360,240,460,360,360); var g,p,a:array[1..n,1..n] of integer;  dau,cuoi:integer;

Procedure initgr;   var gd,gm:integer;   begin   gd:=detect;   initgraph(gd,gm,'..\bgi');   if (graphresult<>grok) then   begin    writeln('Loi khoi tao do hoa,go enter ket thuc!');    readln;    halt(1);    end  end;

Procedure venut(u,m1,m2:integer);  var st:string[3];

177

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

begin   setfillstyle(1,m2);   setcolor(m1);   fillellipse(c[u],d[u],r,r);   str(u,st);   outtextxy(c[u]­2,d[u]­2,st);   end;

Procedure link(x,y,m1,m2:integer);   var t:integer;st:string[3];   begin   setcolor(m2);   line(c[x],d[x],c[y],d[y]);   t:=y­x +((x­1)*(2*n­x)) div 2;   str(g[x,y],st);   setcolor(m1);   outtextxy(ec[t],ed[t],st);   end;

Procedure init_graph;   var i,j:integer;   begin   randomize;   for i:=1 to n do   begin     g[i,i]:=0;     for j:= i+1 to n do       begin          if random(2) = 1 then g[i,j]:=10 +random(vc­10)          else g[i,j]:=vocuc;          g[j,i]:=g[i,j];        end;   end;       for i:= 1 to n do          begin             j:=0;             repeat                j:=j+1;             until((g[i,j]>0) and (g[i,j]

178

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

begin                j:=1+random(n);                if j=i then if i

Procedure demo; var k:char; i :integer; begin      setfillstyle(1,blue);      bar(480,0,getmaxx,getmaxy);      setcolor(yellow);      outtextxy(500,30,'Nhap hai dinh:');      outtextxy(500,60,'Dinh dau,cuoi');      setcolor(white);      outtextxy(460,105,' Dinh dau=');        repeat           k:=readkey;           val(k,dau,i)        until i=0;           outtextxy(540,105,k);           outtextxy(460,150,' Dinh cuoi=');           repeat                 k:=readkey;                 val(k,cuoi,i)           until i=0;                 outtextxy(548,150,k);                 outtextxy(490,270,'Go space tim tiep...');                 setcolor(yellow);                 outtextxy(490,320,'Go enter tao do thi moi...');                 setcolor(red);                 outtextxy(490,370,'Go Esc ket thuc !'); end;

Procedure print_graph; var i,j:integer; begin

179

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

setbkcolor(blue); cleardevice;      setfillstyle(1,darkgray);      bar(0,0,getmaxy,getmaxy);      for i:= 1 to n do      begin          for j:= 1 to n do          if (g[i,j]>0) and(g[i,j]

Procedure floyd; var i,j,k:integer; begin     for i:=1 to n do        for j:= 1 to n do            begin                a[i,j]:=g[i,j];                p[i,j]:=0;            end;     for k:=1 to n do        for i:= 1 to n do            for j:=1 to n do            if a[i,k]+a[k,j]

Procedure TimDequy(d1,d2:integer); var st:string[20]; begin      if p[d1,d2]=0 then      begin          venut(d1, blue,yellow);          delay(dl);          venut(d2,blue,yellow);          delay(dl);      end

180

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

else            begin               TimDequy(d1,p[d1,d2]);               TimDequy(p[d1,d2],d2);            end; end;

Procedure Thbao_kq; var st:string[20]; Begin    if a[dau,cuoi]=vocuc then st:='Khong co duong di!'    else        begin            str(a[dau,cuoi],st);            st:='Duong di min='+st;            Timdequy(dau,cuoi);        end;            setcolor(red);            outtextxy(490,210,st); End;

Procedure Thutuc_goi_thutuc; Var k:char; Begin     if keypressed then     repeat             k:=readkey     until not keypressed;             repeat                   init_graph;                   floyd;                   repeat                         print_graph;                         demo;                         Thbao_kq;                         k:=readkey;                   until (k=#27) or (k=#13);             until(k=#27); End;

181

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Begin clrscr;       initgr;       Thutuc_goi_thutuc;       closegraph; End.

Ố B N BÀI T  LUY N (TL) CHO CÁC B N ÁP D NG ALGORITHMS TRÊN  ĐÂY:

ướ

ộ ố

TL1/ Trong m t m ng l ờ

thành ph  i đ n thành ph  j là t

ố ể

ố ộ

i thành ph  s

i giao thông có n thành ph  và m hành trình tàu đi trong n ế ij. M i hành trình i   ố i2,  ố i1  vào th i đi m t i, đi qua m t dãy các thành ph  s   i đ  hành khách lên ho c xu ng tàu.

ờ ẽ ừ ạ

ườ

thành ph  s t

i th i đi m t mu n đi t

ố ặ i thành ph  d.

ạ ể ể ớ

ố i đó đ n d s m nh t.

ạ thành ph  đó. Th i gian đi t ạ xu t phát t ỗ ạ si3,..., sik. T i m i thành ph  tàu s  d ng l ờ ở ấ ộ i xu t phát  M t ng ộ ế     a) Hãy tìm l ộ     b) Hãy tìm l

ố ườ  trình sao cho ng ớ ố ầ  trình v i s  l n chuy n tàu ít nh t. ớ

ữ ệ

ạ ượ

ư

D  li u vào l u trên text file v i tên TauHoa.Vao g m các đ i l ữ ệ

ư

ng n, m, s, t, d,   ờ   ồ ậ ij. D  li u ra l u trên text file v i tên TauHoa.Ra g m th i

ố ầ

ế

ố s  hành trình và ma tr n t ớ gian đ n d s m nh t và s  l n chuy n tàu ít nh t.

ố ề

ỗ ữ

ậ ố ủ

ầ ạ ở i

TL2/ M t toà nhà cao t ng có n thang máy. M i thang máy n i li n đúng 2 t ng v i nhau  nh ng t ng n m gi a 2 t ng này. V n t c c a các thang máy

ư

ắ ầ

ầ ộ ầ ỗ

ề ở ầ

ắ ầ ố

ậ ứ ạ

t ng th p và chúng cùng b t đ u di ầ   i chuy n xu ng t ng

i t ng trên, ngay l p t c l

ư ế i nh  th  ... ố

ầ ở ầ

ớ ầ ầ ứ ặ ạ i lên t ng trên, và c  l p l ấ ấ ầ ỉ

ể ấ ể

ờ ờ

và không d ng l là nh  nhau: 5 giây qua m t t ng.      Th i đi m b t đ u, m i thang máy đ u  ể chuy n lên t ng trên. Sau khi t ướ ồ ạ d i, r i l ủ    t ng 1 (t ng th p nh t) và mu n nhanh chóng lên t ng trên cùng c a        An đang  ế   ủ ầ toà nhà. Anh ta thay đ i thang máy ch  trên nh ng t ng chung c a 2 thang máy và n u ớ ầ   i t ng này thì vi c chuy n thang máy khi đó thang máy kia t ớ   ư coi nh  không t n th i gian. Hãy l p trình tính th i gian ít nh t đ  An có th  lên t i ầ t ng trên cùng c a toà nhà.

ạ i th i đi m này cũng t ố ủ ấ

ữ ệ

ươ

ng K, N cách nhau ít nh t m t d u cách,

182

D  li u vào c t trên text file v i tên Lift.In g m:         (cid:0)  Dòng đ u tiên ch a 2 s  nguyên d ố

ố ầ

ấ  N (cid:0)

K (cid:0)

ộ ấ  50000).

ế

(cid:0)

1000;    1 (cid:0)       (cid:0)  Trên m i m t N dòng ti p theo ghi 2 s  nguyên d ươ ầ

ả ộ

là s  t ng và s  thang máy c a toà nhà (2  ố ể  m t thang máy di chuy n gi a 2 t ng A, B (1

ộ ỗ d u cách) mô t

ộ   ng A, B (cách nhau m t  K).

A < B (cid:0)

ấ Chú ý:

(cid:0)

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

ư

nào khác nhau mà l

ầ ệ

ữ ệ ả

ỉ ộ

ữ ể i cùng di chuy n gi a 2 t ng nh  nhau. ồ ạ ả ả i nghi m.     — D  li u vào đ m b o luôn luôn t n t ồ          K t qu  ghi lên text file v i tên Lift.Ou g m: ch  m t dòng ghi th i gian ít ộ

ờ Ví d : Xem 2 b

ướ

ế ấ nh t mà An có th  di chuy n lên t ng trên cùng c a toà nhà.  ữ ệ d  li u d

i đây:

Lift1.Ou

45

Lift1.In  10   4    1   5

5   10  5   7  7   10

Lift2.In                    Lift2.Ou 20 5                     150

1 7 7 20 4   7   4   10           10  20

183     — Không có 2 thang máy

ỉ ồ

255) và n xâu ký t

có cùng đ  dài L ch  g m các

(cid:0)

(cid:0)

TL3/ Cho s  nguyên k (0 < k  ườ

ng (0 < n

ồ ạ

100) và (0 < L (cid:0) ấ

ộ  255) là S1, S2,..., Sn. đôi m t khác nhau.  ị i k v  trí khác nhau trong

ế

ị 1, S2,..., Sn. Ta g i p là v   min, p, L) = S.

ấ ữ ệ

ch  cái th Hãy tìm xâu Smin nh  nh t tho  mãn tính ch t sau: t n t ệ ị xâu Smin là các v  trí xu t hi n c a m t trong các xâu S ủ trí xu t hi n c a xâu S trong S D  li u vào c t trên  text file  ấ

ồ  :

ầ ế

i:

ứ ớ

ế

ủ ị ủ min n u giá tr  c a hàm Copy(S ớ v i tên  Str.In g m (cid:0)  Dòng đ u ghi n, L, k :                  (cid:0)  n dòng ti p theo, dòng th  i ghi xâu S K t qu  ghi lên text file v i tên   Str.Ou g mồ  :                                (cid:0)  Dòng đ u tiên ghi đ  dài nh  nh t: ỏ ấ   ộ ầ (cid:0)  Dòng th  2 ghi xâu S ả ề ứ min tho  đi u      ki n đ u bài (xem 2 file bên).

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

ế ự

ế i p trong xâu S

ệ t s  xu t hi n c a xâu S

min. M t ví d  c

u t

ướ

ghi 2 s  u, p cho bi th  cho d

i đây:

Str.In               Str.Ou

2  10  2            17 aaaaaaaxyz      aaaaaaaxyzabcdefg xyzabcdefg       1   1                          2   8

ậ ượ ố ự ng là m t s  nguyên (hay s  th c thì cũng ch ng  nh h ộ

ặ ạ

ế

c k  ô vuông. Các túi rác ế ưở ẳ ng gì đ n cách  ớ  ô góc trên cùng trái đ n góc du i

i m i ô vuông. M t robot đi t

ỗ ể

ỉ ậ ể

ượ

ế

ế

t code tìm m t chi n thu t đ  robot gom đ

ả c kh i

ộ ế TL4/ M t bãi t p k t rác hình ch  nh t đ ộ ố ố ượ có kh i l i bài toán!) đ t t gi ả ủ ậ cùng ph i c a bãi rác đ  gom rác theo lu t sau: robot ch  đi xu ng ho c sang ph i  ố ủ ạ theo các c nh c a ô vuông. Vi ấ ớ lu ng rác l n nh t.

184 (cid:0)  k dòng ti p theo, m i dòng   ụ ụ

ế

VIII­4. CÂY KHUNG (SPANNING TREE) & BÀI TOÁN TÌM CÂY  Ị KHUNG NG N NH T (SPANNING TREE MIN) TRÊN Đ  TH . Ôn m t chút lý thuy t:

ồ ị

ướ

ng, liên thông  G = {V, E} có N Đ NH

A) CÂY KHUNG LÀ GÌ?  Cho đ  th  vô h

N  (cid:0)   1 c nhạ   ( W  (cid:0)

V, F  (cid:0)

ọ   E) g i là

CÂY

ọ ồ ị ủ ồ ị

(N > 1). M i đ  th  con H = {W, F} có   KHUNG c a đ  th  G.

ồ ị

ồ ị

ấ ả

Ấ ủ ạ  c a nó là

B) CÂY KHUNG MIN LÀ GÌ? Cho đ  th  vô h Ố ướ ng có TR NG S  không âm, liên Ắ ỉ thông G = {V, E} có N đ nh (N > 1), cây khung NG N NH T (CKMIN) c a đ  th  G ổ là cây khung có t ng tr ng s  trên t

t c  các c nh

ấ . ỏ  nh  nh t

ướ

ng, liên thông và có tr ng s

ồ ấ ủ

C) BÀI TOÁN TÌM CKMIN:  Cho đ  th  G vô h không âm. Hãy tìm cây khung ng n nh t c a G.

ế

Đ n nay có 2 thu t toán gi

i bài này: thu t toán KRUSCAL & thu t toán PRIM.

ồ ị

Ặ ứ

ướ

ượ

Ậ 5­ CÀI Đ T THU T TOÁN KRUSCAL a) T  ch c Data: C u trúc c a đ  th  cho tr

c đ

ở c bi u di n b i danh sách li

ệ   t

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

i   đây   (các   s   cách ự ố

ướ ạ kê   c nh   d ộ nhau m t ký t

tr ng):

ố ạ

ố ỉ

9: s  đ nh; 14: s  c nh

9 14  (cid:0) 1 2 4 1 8 8 2 3 6 2 8 11 3 4 7 3 6 4 3 9 2 4 5 9 4 6 14 5 6 10 6 7 2 7 8 1 7 9 6 8 9 7

b) CODE: Program Krusal_Alg; Uses crt; Const fi='KRUSCAL.IN'; fo='KRUSCAL.OU'; ln=50; Type bg=Record      x,y:byte;      {x­ding dau, y­dinh cuoi cua canh}        c:integer;   {c la trong so tren cac canh cua do thi} End; Var m,t:longint; n,count:Integer;  {t­ de luu tong trong so cua CKmin}     g:text;                         {count­dem so canh cua CKmin}     a:Array[1..ln*ln DIV 2] of bg;     b:Array[1..ln] of integer;     line:string[4];

Procedure doc;      {ct con nhap du lieu vao ct} Var f:text; i:Integer; Begin      Assign(f,fi); Reset(f);

185

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Readln(f,n,m);      For i:=1 to m Do        Readln(f,a[i].x,a[i].y,a[i].c);      close(f); End;

Procedure Saptang; Var i,j:integer; c:bg; Begin      For i:=1 to m­1 do      For j:=i+1 to m do      If a[i].c>a[j].c then   {dung c lam bien trung gian luon}      Begin  c:=a[j];a[j]:=a[i]; a[i]:=c; End; End;

Function Root(x:integer):Integer;  {xac dinh dinh goc la dinh x cho cay} Var i:integer; Begin       i:=x;       While b[i]>0 Do i:=b[i];          Root:=i; End;

Procedure Hopnhat(x,y:integer);  {Hop nhat cac dinh o 2 mien biet lap} Var tg:integer; Begin     tg:=b[x]+b[y];     If b[x]>b[y] Then        Begin          b[x]:=y;          b[y]:=tg;        End     Else        Begin           b[y]:=x;           b[x]:=tg;        End; End;

Procedure Ck_crea;  {kien tao dan dan cay khung min}

186

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Var f:Text; i:longint;

x,y,t1,t2:Integer;

Begin      t:=0; count:=0;      Doc;      Saptang;      For i:=1 to n Do   b[i]:=­1;      For i:=1 to m Do         Begin             If count=n­1  Then Exit;                x:=a[i].x;                y:=a[i].y;                t1:=Root(x);                t2:=Root(y);

If t1<>t2 Then               Begin                  Hopnhat(t1,t2);                  Writeln(g,x,' ',y);                  Inc(count);                  t:=t+a[i].c;               End;          End; End;

Begin  clrscr;     Assign(g,fo);  Rewrite(g);     Ck_crea;  Writeln;     Writeln('Tap hop cac canh cua Cay_khung_min dang xet:');     {Write(g,t);}     Close(g);     Reset(g);          While Not SeekEof(g) Do              Begin                   Readln(g,line);                   Writeln(line);              End;     Writeln;     Writeln('Va tong trong so cua cay_khung_min nay=',t);     Readln

187

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

End.

ướ

ượ

Ậ Ặ 6) CÀI Đ T THU T TOÁN PRIM ổ ứ ữ ệ a­T  ch c d  li u: ồ C u trúc c a đ  th  cho tr

c đ

ở c bi u di n b i danh sách li

ạ t kê c nh d

ướ   i

đây:

ự ố

tr ng):

ố ỉ

ố ạ

9: s  đ nh; 14: s  c nh

ố ư và l u tren text file PRIM.IN (các s  trên m i dòng cách nhau m t ký t 9 14  (cid:0) 1 2 4 1 8 8 2 3 6 2 8 11 3 4 7 3 6 4 3 9 2 4 5 9 4 6 14 5 6 10 6 7 2 7 8 1 7 9 6 8 9 7

b­ CODE:

Program Prim_Algol; Uses crt; Const Ln=50; fi='PRIM.IN'; {fi=Tep luu data vao}              fo='Ra.kq';  { Tep ghi ket qua cua chuong trinh} Type m1=Array[1..Ln,1..Ln] of integer;          m2=Array[1..Ln] of integer; Var a:m1;   {mang ghi nho trong so cua do thi}     d:m2;   {mang ghi nho dinh da nap vao cay khung nho nhat}     d1,d2:m2;   {mang ghi nho cac canh cua cay khung nho nhat}     n,tong:Integer;

Procedure Doc; Var f:text; i,j,x:Integer; Begin

188

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Assign(f,fi); Reset(f);

Readln(f,n);

While Not SeekEof(f) Do        Begin             Readln(f,i,j,x);             a[i,j]:=x;             a[j,i]:=x;        End;     Close(f); End;

Procedure Timcanhmin(Var i,j:Integer); Var x,y,wmin:Integer; {wmin: trong so nho nhat} Begin      wmin:=Maxint;      For x:=1 to n Do         If d[x]=1 Then            For y:=1 to n Do              If d[y]=0 then                 If (a[x,y]>0) and (a[x,y]

Procedure TtPrim; Var i,j,k:Integer; Begin      For i:=1  to n Do d[i]:=0;         d[1]:=1;         For k:=1 to n­1 do         Begin               Timcanhmin(i,j);               d[j]:=1;  {danh dau dinh j da duoc nap vao cay khung}               d1[k]:=i; {luu dinh dau cua canh da nap vao cay khung}               d2[k]:=j; {luu dinh cuoi cua canh da nap vao cay khung}          End; End;

189

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

Procedure ghi; Var f:Text; i:integer; Begin     Assign(f,fo); Rewrite(f);     tong:=0;     For i:=1 to n­1 do     Begin         Writeln(f,d1[i],' ',d2[i]);         tong:=tong+a[d1[i],d2[i]];     End;

Writeln(f,'Tg trg_so=',tong);     Close(f); End;

Procedure Xem_kq; Var f:Text; line:string[12]; Begin     Writeln(#32:20,'KET QUA CHAY CHUONG TRINH:');     Writeln('Tap cac canh cua Ck_min va tong trong so cua no (dong cuoi):');     Writeln;     Assign(f,'Ra.kq'); Reset(f);     While Not SeekEof(f) Do       Begin           Readln(f,line);           Writeln(#32:7,line);       End;     close(f); End; Begin clrscr;       Doc;       TtPrim;       Ghi;       Xem_kq;       Readln;  End.

Ạ BÀI T  LUY N CHO CÁC B N (Th c ch t là tìm CKMIN)

190

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

ố ầ

ự   TL1/ M t thành ph  c n tr i nh a

ộ ạ

v  (d  thôi).

ồ ị

ầ ữ

ượ

ở ồ ị ạ ự ẽ ễ ố ủ     Tr ng s  c a ữ   ả ườ ng. C n ph i tr i nh a nh ng ấ   ự c tr i nh a gi a hai nút giao thông b t

ộ ng đi đ Ự

ể ẫ ƯỢ

ả Ắ

m ng giao thông có N nút giao thông cho b i đ  th  b n t ạ ể ễ các c nh đ  th  này bi u di n đ  dài các con đ ườ ườ con đ ng nào đ  v n có đ Ả Ộ ỳ k  mà Đ  DÀI Đ

C TR I NH A LÀ NG N NH T.

TL2/ Gi

ế ặ

ủ ồ ị ạ t code đ  sao cho chi phí thi

ể ữ ệ

ượ

ở ộ ố ỉ ả ử ạ ề ữ ệ  s  m ng truy n d  li u gi a các trung tâm máy tính     m t s  t nh mi n B c cho ể ố ở ồ ị ạ ự ẽ ị ọ  v . Tr ng s  ghi trên các c nh c a đ  th  này bi u th  CHI PHÍ xây b i đ  th  b n t   ề ữ ệ   ạ ế ề ữ ệ ườ ự t đ t m ng truy n d  li u ng truy n d  li u. Vi d ng đ ộ   Ấ ả ả Ấ là ÍT NH T mà v n đ m b o truy n d  li u đ c gi a 2 trung tâm B T K  thu c ơ ị ề m ng. (Đ n v  ti n chi phí: Tri u).

ệ ố

TL3/ Có n phòng làm vi c c a m t công ty đ

ơ ồ ố

ệ ủ ủ ố

ạ ữ

ộ ế

N u không có dây đi n n i gi a phòng i v i phòng j thì A[i, j] = 0. Hi n t

ố ế ượ c n i ti p v i nhau b ng h  th ng dây ễ ể đi n. S  đ  n i dây c a m ng đi n này bi u di n b i ma tr n A[i, j], trong đó A[i, j] là đ  dài dây đi n n i gi a phòng i v i phòng j. ớ ệ ư

ố ớ

ừ ầ ử ạ

ệ ạ   i n   i nh ng quá th a nên lãng phí. Hãy tìm   i cách n i đi n sao cho

ệ ng dây đi n n i t ệ ố ệ

ườ ấ ủ ề

phòng này đ u có đ ắ ổ t ng đ  dài ng n nh t c a h  th ng dây đi n c n s a l n phòng c a công ty đ u có đi n.

ủ ữ ệ

ố ấ

D  li u vào c t trên text file v i tên E_line.In. Dòng đ u tiên là s  phòng n; n   ự

ma tr n A[i, j], m i dòng n s  cách nhau ít nh t m t ký t

ấ ả ế ế dòng k  ti p mô t tr ng.ố

ế

ả ấ

K t qu  c t trên text file v i tên E_line.Ou mà dòng đ u là t ng đ  dài dây   ườ   ỗ ng

ổ ể ố i và vj bi u th  có đ

i (i = 1, 2, 3, ...)

ấ ữ ệ

ụ ể ủ

i v i phòng v ng h p c  th  c a bài toán này v i file vào và xu t d  li u cho

M t tr ướ

đi n dùng cho công ty; các dòng sau m i dòng ghi 2 s  u dây n i phòng u ườ ộ i đây:

d

E_line.In                               E_line.Ou

4                                            5

3   4          1   4        2   4

0    3    4    2                   3    0    3    2                   4    3    0    1                   2    2    1    0

= = = = = = = = = = = = = = = = = =

191

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

192

PH N IX.  Đ  TH  HAI

Ả Ố Ư Ự Ạ Ậ Ị

PHÍA Ặ

Ụ (ÁP D NG GI I VÀI BÀI TOÁN TÌM C P GHÉP C C Đ I VÀ L P L CH T I  U)

Ệ Ơ Ả Ộ Ể A­ÔN M T VÀI KHÁI NI M C  B N Đ  LÀM TOÁN

ồ ị ế 1/ Th  nào là đ  th  hai phía?

ỉ ỉ ỏ ậ ỗ

ạ ồ ợ ậ ạ ộ ề ệ ỏ ở ồ ị ồ ị ọ trên g i là đ  th  HAI PHÍA (đ  th  hai phía cũng ệ ậ Cho t p đ nh V1 và t p đ nh V2 th a mãn: V1 Giao V2 = R ng (a) V1 H p V2 = V (b)    và t p c nh E g m các c nh e = (v1, v2) mà ộ v1 Thu c V1, v2 Thu c V2 (c) ậ T p G = {V,E} v i V, E th a các đi u ki n a, b, c  ượ đ ớ c ký hi u là G{V1, V2, E}).

ề ặ ồ ị ạ 2/ Hai d ng bài toán v  c p ghép trên đ  th  hai phía:

ệ ặ ị c h t c n đ nh nghĩa khái ni m c p ghép: ố ạ ủ ự ặ ạ

ủ ặ 2.1) Tr ỉ Ta g i t p PAI g m các c nh thu c E và không có đ nh nào chung là c p ghép. S  c nh c a PAI là l c  ượ l ướ ế ầ ồ ọ ậ ng c a c p ghép và ký hi u ộ ệ (cid:0) PAI(cid:0) .

ề ỉ Ủ Ầ ặ ạ ọ (cid:0) PAI(cid:0)  =  N thì PAI g i là c p ghép Đ Y Đ . Hai d ng bài toán v   ề ế ầ ủ ệ ị 2.2) Ti p theo là đ nh nghĩa khái ni m c p ghép đ y đ : ế ậ N u t p V1 và V2 đ u có N đ nh và  ặ c p ghép:

ậ ự ượ ầ ủ ự ạ ặ ườ ợ ng |PAI| c c đ i. Bài toán tìm c p ghép đ y đ  là tr ng h p riêng ạ 2.3) D ng 1 Đây là bài toán tìm t p PAI có l c l ủ c a bài toán này.

Ặ ạ ặ Ọ Ắ Ổ Ấ ắ C C Đ I, viêt t ặ t: C p Ự Ạ Ọ ộ ậ ộ ạ Ặ Ị Ế ạ ể ả ơ ả ạ 2.4) D ng 2 (C P GHÉP C C Đ I) Ự Ạ Ố Ớ Tìm c p ghép có T NG TR NG S  L N NH T (G I T T LÀ C P GHÉP ộ ố ghép Max) trên các c nh thu c t p PAI. M t s  các bài toán X P L CH thu c d ng này. ậ Đ  gi i hai d ng bài toán trên ta có các thu t toán c  b n sau:

ồ ậ ề ồ ị ơ ả ự ử ể ặ ệ

ậ ậ ậ ậ ế ầ ị a­Thu t toán c  b n d a vào đ  th  hai phía, dây chuy n (lu ng) và s a nhãn đ  tìm c p ghép Max, b­Đ  quy – Quay lui, ộ ạ c­Quy ho ch đ ng, ế d­S p x p Topo, e­Thu t toán Jonson, f­Thu t toán Heristic, g­Thu t toán Hunggari, ả g­Thu t toán làm M n d n k t qu .

Ỉ Ụ Ệ ƯỚ Ố ể ạ ả Ề Ậ Ồ ụ Ế ể ả ầ ế ở t  ế Ộ   I ĐÂY CH  CÓ ĐI U KI N NÊU VÀI BÀI TOÁN ÁP D NG M T D S  TRONG CÁC THU T TOÁN TRÊN. (Các b n có th  tham kh o chi ti Ị quy n LÝ THUY T Đ  TH , NXB Giáo D c, 2012, Tác gi : Tr n Thông Qu ).

Ặ Ả Ậ I CÁC BÀI TOÁN C P GHÉP SAU:

(cid:0) ộ ớ ọ ồ ườ ố ứ ự ừ ế ắ ạ ơ B­L P TRÌNH GI 1/ Bài toán 1.  M t l p h c sinh g m N ng i (đánh s  th  t t 1 đ n N và N 1000) đi c m tr i tham gia trò ch i

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

193

ớ ặ ư ớ ố ng i m i em n  ghép c p v i m t em nam). Ng ớ ộ ữ ộ ổ ỗ ủ ữ ặ ườ ặ ượ ạ c l ộ ớ ấ

ồ ố ỗ ế ố ệ ủ ố ệ ủ ữ ộ ủ ặ ớ ả ế ồ ấ ủ ươ ứ ầ ặ ớ ổ ng là t ng đ  ăn ý l n nh t c a các c p ghép. ố ế ụ ụ ể ộ

ộ   ỗ nh  sau: m i em nam ghép c p v i m t ươ ộ ặ ữ em n  (và ng i ta dùng m t tham s  nguyên d ể ấ ầ w đ  đánh giá đ  ăn ý c a các c p ghép đó. Yêu c u tìm nh ng c p ghép cho t ng đ  ăn ý l n nh t. ồ ữ ệ D  li u vào c t trên text file v i tên Ghepcap.In g m: * Dòng 1 là s  N.ố ớ * Các dòng ti p theo m i dòng g m 3 s  x, y, w v i ý nghĩa : x là s  hi u c a nam sinh, y s  hi u c a n ạ sinh, w là đ  ăn ý c a 2 b n đã ghép c p v i nhau. ớ K t qu  ghi lên text file v i tên Ghepcap.Ou g m: ộ ộ ố * Dòng đ u ch a m t s  nguyên d ỗ * Các dòng ti p theo m i dòng ghi 3 s  x, y, w.  M t ví d  c  th  là: Ghepcap.In   4   1 2 2   1 3 1   4 2 3 4 3 1

Ghepcap.Ou 4 1 3 1 4 2 3

1) CODE1. (Phuong an 1: Dung de quy quay lui de tim cap ghep CUC DAI)  Program GhepNamNu; Uses crt; Const fi='Ghepcap.In'; fo='Ghepcap.Ou'; min=­10000; Var f:text; n:integer; Test,Free: array[1..100] of boolean; A: array[1..100,1..100] of integer; Trace,besttr: array[1..100] of integer; nho:integer;

Procedure Nhap; Var i,j1,j2,j3:integer; Begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do for j1:=1 to n do a[i,j1]:=min; for i:=1 to n do begin test[i]:=true; free[i]:=true; end; for i:=1 to n do Begin readln(f,j1,j2,j3); A[j1,j2]:=j3; A[j2,j1]:=j3; test[j2]:=false; End; close(f);

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

194

nho:=0; End;

Procedure Tichluy; Var tong, i:integer; Begin tong:=0; for i:=1 to n do if test[i] then tong:=tong+a[i,trace[i]]; if tong>nho then Begin nho:=tong; besttr:=trace; End; End;

Procedure Try(i:integer); {de quy quay lui} Var j, k:integer; ok:boolean; Begin if not free[i] then try(i+1) else for j:=1 to n do if i<>j then if free[j] then Begin free[j]:=false; free[i]:=false; trace[i]:=j; trace[j]:=i; ok:=true; for k:=1 to n do if free[k] then ok:=false; if ok then Tichluy else try(i+1); free[j]:=true; free[i]:=true; End End;

Procedure Xuat; Var i:integer; Begin Assign(f,fo); Rewrite(f); writeln(f,nho); for i:=1 to n do if test[i] then writeln(f,i,' ',besttr[i],' ',a[i,besttr[i]]); close(f); End;

Procedure Xem; Var f:text; line:string; Begin Assign(f,fo); Reset(f); Writeln(#32:12,'KET QUA PROGRAM:'); Writeln; While not (seekeof(f)) do

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

195

Begin Readln(f,line); Writeln(#32:7,line); End; Close(f); End; {Main Prog.} Begin clrscr; Nhap; Try(1); Xuat; Xem; Write('Done!'); Readln; End.

Ể Ậ Ặ

2) CODE2 (DÙNG THU T TOÁN KRUSCAL Đ  TÌM C P GHÉP MAX ) Program Ghepcap; Uses Crt; Const Const fi='Ghepcap.In'; fo='Ghepcap.Ou'; max=10000; Var Tree:array[1..100] of integer; canh:array[1..100,1..2] of integer; a:array[1..100,1..100] of integer; f:text; N:integer; trongso:integer; test: array[1..100] of boolean;

Procedure Nhap; Var i,j,u,v:integer; Begin assign(f,fi); reset(f); read(f,n); readln(f); for i:=1 to n do test[i]:=true; for i:=1 to n do for j:=1 to n do a[i,j]:=0; for i:=1 to n do begin readln(f,u,v,a[u,v]); test[v]:=false; a[v,u]:=a[u,v]; end; close(f); for i:=1 to n do tree[i]:=i;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

196

for i:=1 to n do for j:=1 to n do if a[i,j]=0 then if (test[i] and test[j]) then a[i,j]:=max else if (not test[i] and not test[j]) then a[i,j]:=­10000; trongso:=0; end;

Procedure Timmax(var u,v:integer); Var temp:integer; i,j:integer; max:integer; Begin max:=­maxint; for i:=1 to n­1 do for j:=i+1 to n do if tree[i]<>tree[j] then if max

Procedure Ghepcap(ok,u,v:integer); var i,tam:integer; Begin if a[u,v]<>max then trongso:=trongso+a[u,v]; canh[ok,1]:=u; canh[ok,2]:=v; tam:=tree[v]; for i:=1 to n do if tree[i]=tam then tree[i]:=tree[u]; end;

Procedure Creat; Var ok,u,v:integer; Begin for ok:=1 to n­1 do begin Timmax(u,v); Ghepcap(ok,u,v); end; end;

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

197

ượ nh  t ướ ắ c đánh s  th  t c hoa có s  th  t ọ  t  l n. Giá tr  th m m  khi c m bó hoa i vào l ố ứ ự ừ ỏ ớ ớ ố ứ ự ớ ị ẩ ấ i l n. C n c m k bó hoa vào n l ị ẩ ớ ế ằ ỗ ỹ ố   sao cho hoa có s ọ  j là v(i, j). Hãy   ỉ ượ ắ c c m vào  t r ng m i bó hoa ch  đ ỗ ọ ỉ ắ ộ ọ  hoa và k bó hoa đ ả ứ ứ ự ỏ  nh  ph i đ ng tr ắ ộ ộ ọ  và m i l ấ ữ ệ ồ ớ ố ớ ố ở ươ ố ỗ ị ẩ ể ộ ỹ ị ng v i s hàng i c t j bi u th  giá tr  th m m  bó hoa i ế ọ    j. ả ớ ị ẩ ầ ổ ỹ ớ ố ắ ị ọ ộ ườ j. M t tr ợ ụ ể ủ ng h p c  th  c a bài ả ở Procedure Print; Var i:integer; Begin Assign(f,fo); rewrite(f); writeln(f,trongso); for i:=1 to n­1 do if a[canh[i,1],canh[i,2]]<>max then writeln(f,canh[i,1]:2,canh[i,2]:2,a[canh[i,1],canh[i,2]]:2); close(f); end; {Main Prog.} Begin clrscr; Nhap; Creat; PRINT; Write('Done!'); ENd. 2/ Bài toán 2 ầ ắ Có n l ỹ th  t ổ tìm m t cách c m hoa sao cho t ng giá tr  th m m  là l n nh t. Bi m t l    ch  c m m t bó hoa. D  li u vào c t trên text file v i tên Camhoa.In g m : *Dòng 1: ghi 2 s  n và k. * k dòng ti p theo m i dòng ghi n s  nguyên d ắ c m vào l ồ ế K t qu  ghi lên text file v i tên Camhoa.Ou g m :   ấ   *Dòng đ u: In t ng giá tr  th m m  l n nh t: ể * k dòng ti p theo m i dòng ghi 2 s  i, j bi u th  bó hoa i c m vào l toán ghi ế ỗ  bên ph i các dòng này.

Camhoa.In   4 3   7 8 9 10   10 9 8 7   5 6 7 8

Camhoa.Ou 24 1 1 2 2 3 4

ể ả Ộ Ạ Đ  gi i bài này ta dùng QUY HO CH Đ NG

Ả Ậ Ằ ễ ờ ữ ệ ủ ặ ầ ể ể ệ ộ ộ hoa và yêu c u ghép c p (có 2 đi u ki n). Ta dùng Ữ Ự ọ ỹ ớ ể ư ổ ị ẩ ề ớ ề ắ ấ ọ Ễ a­ DI N T  THU T TOÁN B NG NGÔN NG  T  NHIÊN: D  li u c a bài toán có th  bi u di n nh ồ ị đ  th  2 phía: m t phía là k bó hoa, m t phía là n l ả m ng 2 chi u L[i, j] đ  l u t ng giá tr  th m m  l n nh t khi ghép (c m) bó hoa i v i (vào) l j. Bài toán

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

198

ả ả ố ứ ự ớ ả ướ ư ả ị c bó hoa có s  th  t l n, nên m ng L xác đ nh nh  sau: ặ

ầ yêu c u khi ghép ph i đ m b o: bó hoa ả ứ ố ứ ự  bé ph i đ ng tr có s  th  t ế * N u i > j thì không có cách ghép c p. ế * N u i = j thì L[i, j] = v[1, 1] + v[2, 2] + ... + v[i, i]. ế * N u i < j thì L[i, j] = Max(L[i—1,j —1] + v[i, j], L[i, j — 1]).

Ạ b­CODE (QUY HO CH Đ NG) Program CAMHOA;   Uses Crt; Const max=100; Var v:Array[1..max,1..max] of integer; L:Array[0..max,0..max] of longint; cap:Array[1..max] of integer; n, k:integer; f:text; Procedure Doc; Var i,j:integer; Begin Assign(f,'Bt2.In'); Reset(f); Readln(f,n,k); For i:=1 to k do For j:=1 to n do Read(f,v[i,j]); close(f); End;

Function Lonnhat(x,y:integer):integer; Begin If (x>y) Then Lonnhat:=x else Lonnhat:=y; End;

Function Thamymax(i:integer):integer; Var j, s:integer; Begin s:=0; For j:=1 to i do  s:=s+v[j,j]; thamymax:=s; End;

Procedure Xuly; Var i,j:Integer; Begin For i:=1 to max do For j:=1 to max do L[i,j]:=­maxint; For i:=1 to k do For j:=1 to n do If i=j Then L[i,j]:=ThamyMax(i) Else If i

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

199

Procedure Xuat; Var i,j,d:integer; Begin Assign(f,'Camhoa.ou'); Rewrite(f); Writeln(f,'Tong max cua do tham my:',L[k,n]); i:=k; j:=n; d:=0; While (i>0) And (j>0) do If (L[i,j]=L[i,j­1]) And (v[i,j]>0) Then Begin Cap[i]:=j­1; Dec(j); End Else Begin cap[i]:=j; dec(i); dec(j) End; For i:=1 to k do  Writeln(f,'Bo hoa thu ',i,' cam vao lo ',cap[i]); Close(f); End;

ả ầ ượ ế ẩ ỗ t, m i chi ti t ph i l n l t gia công trên hai máy A, B (A  ậ ị ể ờ ờ ữ ệ ấ ớ ồ ầ ố ế ả ớ Procedure Xem; Var f:text; line:string; Begin Assign(f,'Camhoa.ou'); Reset(f); Writeln(#32:13,'KET QUA PROGRAM:'); Writeln; While not (seekeof(f)) do Begin Readln(f,line); Writeln(#32:7,line); End; close(f); End; {Main Prog.} Begin clrscr; Doc; Xuly; Xuat; Xem; Write('Done!'); Readln; End. 3/Bài toán 3. M t s n ph m có N chi ti ế ộ ả ế ướ c, B sau). Th i gian đ  gia công chi ti tr t trên máy A là Ai, trên máy B là Bi (i = 1,2,...,N). Hãy l p l ch  ấ   ế ớ hoàn thành các chi ti t v i th i gian ít nh t. D  li u vào c t trên text file v i tên Bt3.In g m : ố *Dòng đ u tiên ghi s  n. ế *N dòng ti p theo, dòng i + 1 là s  ai và bi. ồ K t qu  ghi lên text file v i tên Bt3.Ou g m :

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

200

ầ ấ

t.ế ố ệ ứ ự ệ ệ ị ố ư ờ * Dòng đ u ghi th i gian ít nh t gia công các chi ti *Dòng th  hai ghi s  hi u các vi c đã th c hi n theo l ch t i  u.

Ví d :ụ    Bt3.In   5   3 3   4 3 6 2 5 7 6 3

Bt3.Ou 26 1 4 2 5 3

Ể Ả Ậ Đ  GI I BÀI NÀY TA DÙNG THU T TOÁN JONSON

Ư

Ả CODE THAM KH O (CH A TEST) Program Johnson_Algo ;  Uses Crt ; Const ln=100; f1=’Bt3.In’; fo=’Bt3.Ou’; Type m1=Array[1..2, 1..ln] of Real; kq=Array[1..ln] of Byte; mdx=Array[1..ln] of Boolean; Var a:m1; {a[1,j] luu thoi gian chi tiet j tren may A; A[2,j] luu thoi gian chi tiet j tren may B} resul:kq; {ket qua xep lich} dx:mdx; {danh dau chi tiet da lam} n :Byte ;  f :Text ;

ị ự Ầ Ạ ươ ọ ố làm (XEM L I PH N RECORD & FILE!)} ng trình, các con t

Procedure Nhap; Begin   {Đ c s  N và các giá tr  A[2,n] vào ch End ; Function ChitietMin(var may :Byte) :Byte ; Var Lmin:integer; chitiet:byte; Begin Lmin:=Maxint; For i:=1 to 2 Do For j:=n Downto 1 Do If Not dx[j] then If a[i,j]

ế

Th y Tr n Thông Qu

201

ự làm} End;

ự làm}

Procedure Johnson_algo; Var may, chitiet,dau,cuoi:byte; Begin FillChar(dx, sizeof(dx),False); dau:=0; cuoi:=n+1; Repeat chitiet:=chitiet(may); If may=1 then Begin Inc(dau); Resul[dau]:=chitiet; dx[chitiet]:=True; End; Until dau=cuoi­1; End; Procedure HienThi; Begin   {Ghi mang ket qua len file Bt4.Ou theo dung yeu cau o de ra. các con t Function max2(a,b:Real):Real; Begin   {Ham xac dinh so lon hon trong 2 so a, b cho truoc. Các con t End; Function Tinh; Var i,j :Byte; t1, t2:Real; Begin t1:=0; t2:=0; For i:=1 to n Do Begin t1:=t1+a[1, resul[i]]; t2:=max2(t1,t2)+a[2,resul[i]] ;  End ; Writeln(f, t2 :0 :0) ; End ; {Main Prog.} Begin Clrscr; Nhap; Johnson_algo; Assign(f,fo); Rewrite(f); Tinh; HienThi; Write(‘Done!’); Readln; End.

ượ ự ứ ệ ệ ờ

4/Bài toán 4 Có N vi c. Vi c th  i hoàn thành trong th i gian ti. Các vi c này đ ệ ề máy (có công su t nh  nhau và m i máy đ u có th  th c hi n đ

ệ ượ ấ ứ ệ ể ự ư ấ ỗ ỗ ệ c th c hi n trên M  ệ c b t c  vi c nào trong N vi c), m i

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

202

ệ ự ụ ệ ượ ờ ổ ệ ậ ị ệ ủ ố ồ ớ ấ ệ ữ ệ (cid:0) ố ầ (cid:0) ố ế ồ

ả ầ (cid:0) ố ệ ự ệ ổ i dòng i + 1 ghi s  hi u các vi c th c hi n trên máy i. ạ ụ ụ ể ủ ươ ứ ệ ớ ờ ộ ng  ng ớ

ộ   c th c hi n liên t c trên m t vi c đ ự ể ế máy cho đ n khi xong. Hãy l p l ch đ  các máy th c hi n đ  N vi c sao cho t ng th i gian hoàn thành  các vi c càng ít càng t t. D  li u vào c t trên text file v i tên Bt4.In g m:  Dòng đ u ghi 2 s  N, M.  Dòng 2 ghi N s  t1, t2,...,tN ớ K t qu  ghi lên text file v i tên Bt4.Ou g m: ệ (cid:0) ờ  Dòng đ u ghi t ng th i gian hoàn thành N vi c. ệ  M dòng sau: t M t ví d  c  th  c a bài toán là ta có 3 máy M1, M2, M3 và 6 vi c v i th i gian hoàn thành t là t1 = 2, t2 = 5, t3 = 8, t4 = 1, t5 = 5, t6 = 1 v i các file trên đây là: Bt4.In   6 3   2 5 8 1 5 1

Bt4.Ou 8 3 2 1 4 5 6

Ậ Ầ Ẽ Ể Ồ Ể Ậ Ể

ạ ậ Ậ ễ ồ ể ễ ể ự ẽ ể ữ ự ậ v  bi u đ  đ  d  hi u thu t toán h n) ờ ệ ệ ể ệ ạ ạ ượ ự ề ệ ệ ế ằ ự c hoàn thành, li n đó trên máy M3 th c hi n ti p vi c V4. Trong th i gian này 2 ệ ủ ẫ ề ờ ỗ ờ ươ ồ ộ BÀI NÀY DÙNG THU T TOÁN HEURISTIC (CÁC CON C N V  BI U Đ  Đ  HI U RÕ CÁC L P  LU N SAU) ơ  nhiên (hãy t a­Di n đ t thu t toán b ng ngôn ng  t *T i th i đi m t = 0, th c hi n vi c V2 trên máy M1, V5 trên máy M2 và V1, trên máy M3.   ờ *T i t = 2 vi c V1 đ ự máy M1 và M2 v n đang th c hi n công vi c c a mình ... *Ta th y th i gian hoàn thành c  6 vi c là 12 và các máy M1, M2 có quá nhi u th i gian nhàn r i.  Ph ấ ng án trên đây là m t ph ệ ả ệ ươ ng án t i.

ệ ệ ươ ướ ng án 2 d i đây: ầ ủ ử ộ ờ ả ờ ứ ự ấ ả ủ ệ ị ờ ệ ọ ng án P1 b n đ n v  th i gian (các b n hãy hình dung ấ ề   y vào các máy còn nhi u th i gian r nh nh t. ệ ở ươ ố ơ t h n nghi m c a   ph ạ ơ ớ ng án P1: M i vi c hoàn thành s m h n ph ả ạ ơ ng án P2 là 8. Nghi m này đã t ố ươ ấ ề ả ờ c 4 tháng — đó là kho ng th i gian ị ờ ể ủ ả ấ ả ủ ể ả Đ  c i thi n nghi m c a bài toán này ta th  m t ph ứ ự ả ệ ế  gi m d n c a th i gian + X p các vi c theo th  t ệ ầ ượ ế t x p các vi c theo th  t + L n l ệ ư ậ ờ Nh  v y th i gian hoàn thành c  6 vi c  ơ ươ ph ướ ế ế n u đ n v  th i gian là tháng thì k  ho ch s n xu t đã v  đích tr ấ ờ ấ r t đáng k  trong s n xu t) và th i gian r nh c a máy M1 là ít nh t.

Ư

DÙNG HEURISTIC METHOD b­ Code. (CH A TEST) Ues Crt; Cosnt ln=1000; fi=’Bt4.In]; fo=’Bt4.Ou’; Type m1=Array[1..ln] of Longint; Var t:m1; {t[i]: thoi gian lam viec i; i=1..n} id:m1; {id[i]: so hieu cua cong viec i}  phan cong may j lam viec i}(cid:0) p:m1; {p[i]:=j   n,m:Integer; {n: So luong cong viec ; m: so luong may} maxt:Longint {Thoi gian cua may co thoi gian da gia cong lon nhat} may:m1; {may[i]: Thoi gian da lam (da thuc hien gia cong) cua may i}

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

203

Procedure Nhap; Var i:Integer; Begin   {Doc cac data n,m vao mang t tu file Bt4.In roi lam lenh sau, } { con tu lam. } For i:=1 to n do id[i]:=i; End;

Procedure Sort(var a:m1); Var i, j, c:integer; Begin   {Sap xep giam mang t theo thoi gian va xep ca mang id. Vi de nen cac con tu lam}   End;

Function Tim_May_min:Integer; Begin   {Tim may co thoi gian lam nho nhat. Vi de nen cac con tu lam }   End;

Procedure Ghi; Var f: Text; i, j: Integer; sum: Longint; Begin Assign(f,fo); Rewrite(f); Writeln(f, maxt); For j:=1 to m Do Begin sum:=0; For i:=1 to n Do If p[i]:=j then Begin Writeln(f, id[i]:4) ; {In ra so hieu cua may i} sum:=sum+t[i]; End; Writeln(f,’ Tong thoi gian da lam cua may ‘, j ,’:’, sum); End; Close(f); End;

Procedure Phancong; Var i,j,Lj:Integer; Ok: Boolean; Begin FillChar(may, sizeof(may), 0); FillChar(p ,sizeof(p), 0); i:=0; maxt:=­maxint; For j:=1 to m do {giao m viec dau cho m may} Begin Inc(i); may[j]:=t[i]; p[i]:=j; If t[i]>maxt then maxt:=t[i];

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

204

End; Inc(i); While i<=n Do Begin  Ok:=False; For j:=1 to m do Begin If i>n then Break; If may[j]+t[i]<=maxt then Begin ok:=true; may[j]:=may[j]+t[i];  p[i]:=j; {Giao viec i cho may j}  Inc(i); End; End; If not ok then If i<=n then Begin j:=Tim_May_min ; may[j]:=may[j]+t[i]; p[i]:=j; {Giao viec moi cho may j da co thoi gian lam it nhat} If may[j]> maxt the maxt:=may[j]; End; End; End;

{ Main Prog.} Begin clrscr; Nhap; Sort(t); Phancong; Ghi; Write(‘Done!’); Readln; End.

Ạ Ự Ộ Ể Ệ M T VÀI BÀI Đ  CÁC B N T  LUY N

ộ ệ ế ấ ậ i nhu n là C[i, j]. Hãy tìm cách b  trí công nhân và máy sao cho không quá  ộ ẽ ạ ợ ộ ậ ớ ố ơ ể ổ ứ ề ỗ ợ i nhu n l n ề ả LT1. M t xí nghi p có N công nhân và dây chuy n s n xu t có M máy (M < N).. N u giao máy i cho  công nhân j làm thì s  đ t l ộ m t công nhân đ ng m t máy và m i máy không có nhi u h n m t công nhân đ  t ng l nh t.ấ

ộ ố ệ ậ ị ự ệ ả ệ ệ ướ ệ c m t s  vi c nào đó trong N vi c này. Hãy l p l ch th c hi n

ồ ầ ố ớ ươ ng N. ố ể ầ ố ố ế  b  ph n: đ u dòng là s  i, k  sau là các s  Ji1, Ji2,,..., Jis có ướ ệ ả ỗ LT2. Có N vi c, m i vi c i ph i làm tr ệ ủ đ  N vi c đã cho. ấ ữ ệ D  li u vào c t trên text file v i tên Lt2.In g m : * Dòng đ u ghi s  nguyên d ế * Các dòng k  sau ghi các s  bi u th  th  t nghĩa là vi c i ph i làm tr ị ứ ự ộ ậ ệ c các vi c Ji1, Ji2,..., Jis.

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

205

ả ầ ượ ượ ự ệ ộ ệ ớ ố ệ t đ c th c hi n.

ế K t qu  ghi lên text file v i tên Lt2.Ou ỉ ch  có m t dòng ghi s  hi u các vi c đã l n l Lt2.In   10   1 2 3 2 4 10 3 5 4 6 8

Lt2.Ou 1 2 7 9 4 6 3 5 8 10

ỗ ể ườ t ti n công ph i tr  cho ng ờ ượ ờ ề ệ ể ả ả ườ ế ề ế ị i làm thuê, th i gian đ  hoàn thành  ề ấ i làm thuê thu đ c nhi u ti n công nh t. ồ ệ ữ ệ ố ầ ươ ớ ng N. ố ệ ế ệ ể ờ ờ

ề ế ả ồ ớ ầ ấ ổ ớ ố ố ệ ế ể ệ ỗ ờ ề ệ ể ế ờ

ộ ữ ệ ả ế ệ ể ố ờ ệ ớ LT3. Có N vi c. V i m i vi c cho bi ệ ế vi c, th i đi m k t thúc vi c. Hãy x p l ch sao cho ng ấ D  li u vào c t trên text file v i tên Lt3.In g m : * Dòng đ u là s  nguyên d  ** N dòng sau, dòng i + 1 ghi 3 s : th i gian hoàn thành công vi c t, th i đi m k t thúc công vi c k và  ti n công tc. K t qu  ghi lên text file v i tên Lt3.Ou g m : ề * Dòng đ u là t ng ti n công l n nh t. ắ ầ   * Các dòng ti p theo m i dòng ghi 4 s : s  hi u công vi c i, th i đi m b t đ u ệ công vi c t1, th i đi m k t thúc công vi c t2, ti n công tc. ậ Thu t toán :   ế  * X p tăng b  d  li u theo khoá là th i đi m cu i cùng ph i k t thúc công vi c.

Lt3.In   10   1 4 89   5 5 86   4 11 83   5 7 84   1 2 25   3 11 61  6 11 33 4 7 28 3 10 1 5 14 71

Lt3.Ou 329 5 0 1 25 1 1 2 89 3 2 6 83 6 6 9 81 10 9 14 71

ế ệ ố ừ ầ ượ ố ự ệ ế ộ c b  trí th c hi n trên m t máy. Bi t:

ệ ố 1 đ n N c n đ ệ ả ế ệ ạ ủ ng ph t c a vi c i. ự ự ự ắ ầ ệ ệ ệ ậ ổ

LT4­ Có N vi c đánh s  t ể ờ * pi là th i gian đ  hoàn thành vi c i. ờ ể * di là th i đi m cu i cùng ph i k t thúc vi c i. ệ ố ưở * hi là h  s  th ị ệ ể ờ  ti). Th i đi m b t đ u th c hi n các vi c là 0, hãy l p trình t  th c hi n N vi c sao cho t ng giá tr   8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

206

ệ ưở ạ ủ ấ ả ng ph t c a t

ắ ớ i lúc k t thúc, không cho phép ng t quãng. ắ ầ  lúc b t đ u cho t ệ ể ờ ế ả ử ằ ự ể ừ ệ s  ti là th i đi m hoàn thành vi c i, khi ạ ữ ệ ầ

ố ố ố ố ế ả ớ ồ ươ ng N (N < 2001) ươ ng p1,...,pN. ươ ng d1,...,dN. ươ ng h1,...,hN. ồ ấ ượ ầ c. ạ ớ ệ ệ ố ng ph t l n nh t tìm đ ự ự  th c hi n các vi c.

ớ   t c  các vi c là l n th nh t.ấ (cid:0) M i vi c ph i th c hi n liên t c t ỗ ụ ừ ệ ả ệ ệ ư ờ Coi nh  th i gian chuy n t  vi c này sang vi c khác b ng 0. Gi ệ ị ưở ng, ph t vi c i là hix(di  đó giá tr  th ấ D  li u vào c t trên text file v i tên Bt8.In g m: *Dòng đ u ghi s  nguyên d * Dòng 2 ghi N s  nguyên d * Dòng 3 ghi N s  nguyên d * Dòng 4 ghi N s  nguyên d ớ K t qu  ghi lên text file v i tên Bt8.Ou g m : ị ưở * Dòng đ u ghi giá tr  th * Dòng 2 ghi N s  là trình t Ví d :ụ Test_1 Lt4.In   5   2 2 3 4 3   3 2 10 11 9 1 2 2 1 3

Lt4.Ou 6 2 5 3 1 4

Test_2 Lt4_2.In  4  1 2 3 4  3 2 1 3 1 2 1 2 Lt4_2.ou ­17 1 2 3 4

ử ề ủ ọ ế ầ M i ý ki n đóng góp g i v  MailBox c a th y là: quethongtran@yahoo.com

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

207

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

208

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

209

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

210

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

211

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

212

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

213

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

214

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

215

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

216

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

217

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

218

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

219

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

220

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

221

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

222

8 h 54 m                                                                                                                                         28/7/2017

ế

Th y Tr n Thông Qu

223

8 h 54 m                                                                                                                                         28/7/2017