Bài giảng Ngôn ngữ lập trình Pascal - Nguyễn Ánh

ViӃtăchѭѫngătrìnhăchoăngѭӡiăsӱădụngănhұpădanhăsáchăthíăsinhăthiătuyӇnăvƠoălӟpă 10,ăgӗmăhӑăvƠătên,ăđiӇmăcácămônăthiătoán,ălý,ăanhăvĕn,ăđӃnăchừngănƠoănhұpăhӑătênă thíăsinhălƠăxơuărổngăthìăkӃtăthúc.ăDanhăsáchăthíăsinhălѭuăvƠoăcácăbiӃnăđӝngăcӫaămӝtă danhăsáchăliênăkӃtăquҧnălýăbӣiăbiӃnătrӓăL.ăSauăđóăchoăhiӇnăthӏădanhăsáchăthíăsinhălênă mƠnăhình.ăTừădanhăsáchăđƣăcóăhƣyăhoánăđổiăcácăbҧnăghiătrongăcácăbiӃnăđӝngăsaoăchoă khiăduyӋtădanhăsáchătaăđѭӧcătổngăđiӇmăcӫaăthíăsinhăđѭӧcăxӃpătheoăthӭătựăgiҧmădầnă cӫaătổngăđiӇm. USES CRT; TYPE DSTHISINH = ^THISINH; THISINH = Record Ten : String[30]; T,L,AV:Real; Tiep : DSTHISINH; End; VAR L:DSTHISINH; Max:Word; PROCEDURE Wait; Begin Writeln; Write('An phim bat ky de tiep tuc'); Repeat Until Keypressed; End; PROCEDURE HienThiDS(L:DSTHISINH); Var p:DSTHISINH; Begin

pdf125 trang | Chia sẻ: dntpro1256 | Lượt xem: 688 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Ngôn ngữ lập trình Pascal - Nguyễn Ánh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ănghĩaăkiӇuătaădùngăcúăphápăsau: TYPE TenKieu = FILE OF KiểuPhầnTử ; TrongăđóăăTenKieuăădoăngѭӡiăsӱădụngăđặtăvƠăăKiӇuPhầnTӱăălƠămӝtătrongăcácă kiӇuăđƣăbiӃtă(Integer,ăByte,ăWord,ăReal,ăChar,ăString,ăRecord)ăhoặcă lƠăkiӇuăconătrӓă sӁăđѭӧcăđӅăcұpăđӃnăӣăchѭѫngăsau. KhiăđƣăđӏnhănghĩaăkiӇuăthìătaăcóăthӇăkhaiăbáoăbiӃnănhѭăsau: VAR Danh sách các biến : TênKiểu ; HayăcóăthӇăkhaiăbáoătrụcătiӃpănhѭăsau: VAR Danh sách các biến : FILE OF KiểuPhần Tử ; TrongădanhăsáchăcácăbiӃnăthìăgiӳaăhaiăbiӃnăđѭӧcăđặtăcáchănhauămӝtădҩuăphẩy. Ví dụ: TYPE FNGUYEN = FILE OF Integer; VAR f, g : FNGUYEN; HayăcóăthӇăkhaiăbáoătrựcătiӃp: VAR f, g : FILE OF Integer; KhiăđóăăfăvƠăgăăđѭӧcăgӑiălƠăcácăbiӃnăfile. 8.1.2. Tập tin dạng vĕn bản (Text): 92 KiӇuă tұpă tină dҥngă vĕnă bҧnă đѭӧcă TurboăPascală quiă đӏnhă sẵnă lƠă TEXTă (đӗngă nghĩaăvӟiăFILEăăOFăăCHAR).ăVìăvұyăӣăđơyăkhôngăcầnăđӏnhănghĩaăkiӇuămƠăchỉăcầnă khaiăbáoăbiӃnătұpătinădҥngăvĕnăbҧnănhѭăsau: VAR Danh sách các biến : TEXT; Ví dụ: VAR f, g, h : TEXT ; 8.1.3. Tập tin không định kiểu: KhiăkhaiăbáoăcácăbiӃnăcóăkiӇuătұpătinăkhôngăđӏnhăkiӇuăthìătaăkhaiăbáoănhѭăsau: VAR DanhăsáchăbiӃnăă:ăăFILE; Víădụ:ăă VAR f, g, h : FILE; KhiăđóăchúngătaăchỉăcóăthӇăthaoătácăvұtălýătrênătұpătinăđѭӧcăgánătênăchoăchúngă nhѭăđổiătênătұpătin,ăxoáătұpătin,....ăvƠăchỉăcóăthӇătruyăxuҩtădӳăliӋuăchӭaătrong chúng theoătừngăkhӕi. 8.2. Mӝt số thӫ tục vƠ hƠm chuҭn. Cácă thӫă tụcă vƠă hƠmă chuẩnă đѭӧcă nêuă ӣă đơyă đѭӧcă dùngă chungă choă cҧă tұpă tină đӏnhăkiӇuăvƠătұpătinădҥngăvĕnăbҧn. 8.2.1. Gán tên file cho biến file: Thӫătục ASSIGN (BiӃnFile, TênFile); Trongăđó: BiӃnFileăălƠămӝtăbiӇnăkiӇuătұpătinăđӏnhăkiӇuăhayătұpătinădҥngăvĕnăbҧn. TênFileăălƠămӝtăxơuăkíătựăthӇăhiӋnătênăcӫaătұpătin,ăcóăthӇăcóăcҧăđѭӡngădүn. Ý nghĩa:ă Thӫă tụcă nƠyă nhằmă gánă tênă cӫaă mӝtă tұpă tină ӣă trênă đĩaă choă biӃnă BiӃnFileăđangălѭuăgiӳăӣăbӝănhӟătrong. Víădụ: ASSIGN (f, ‘SOLIEU.DAT’); ASSIGN (g, ‘C:\TP\PRO\BAITAP.PAS’); .............. WRITE(‘Cho tên file: ‘); READLN(St); ASSIGN (h, St); 8.2.2. Tạo và mở một file mới để ghi dữ liệu: Thӫătục REWRITE(BiӃnFile); Ý nghĩa:ăThӫătụcănƠyănhằmătҥo mӟiămӝtătұpătinătrênăđĩaăvӟiăkíchăthӭcăbanăđầuă lƠă0ăbyteă(doădӳăliӋuăchӭaăbênătrongănóălƠătrӕng),ăcóătênăđƣăgánăchoăBiӃnFileăbӣiăthӫă tụcăASSIGN trѭӟcăđóăvƠătұpătinăđóăđѭӧcămӣăraăđӇăsẵnăsƠngăchoăphépăghiădӳăliӋuăvƠoă tұpătin. 93 NӃuăTênFileăđƣăgánăchoăBiӃnFileăkhôngăcóăđѭӡngădүnăthìătұpătinăsӁăđѭӧcătҥoă tҥiăthѭămụcăhiӋnăhƠnh,ănӃuăcóăđѭӡngădүnăthìătұpătinăsӁăđѭӧcătҥoătҥiăthѭămụcăđѭӧcăchỉă raătheoăđѭӡngădүn. NӃuătrênăđĩa,ătҥiăthѭămụcănѫiătҥoăraătұpătinămӟiăđƣătӗnătҥiătұpătinătrùngătênăthìă tұpătinăcũăbӏăxoáăsҥchăvƠăthayăvƠoăđóălƠătұpătinămӟiăvӟiăkíchăthѭӟcăbanăđầuălƠă0ăbyteă (tӭcădӳăliӋuăchӭăbênătrongănóălƠătrӕng). 8.2.3. Mở một file đã có trên đĩa: Thӫătục RESET(BiӃnFile); Ý nghĩa:ăThӫătụcănƠyănhằmămӣămӝtătұpătinătrênăđĩaătҥiăthѭămụcăhiӋnăhƠnhăhayă thѭămụcătheoăđѭӡngădүnăđƣăchỉăra,ăcóătênăđƣăgánăchoăBiӃnFileătrѭӟcăđóăđӇăsẵnăsƠngă truyăxuҩtădӳăliӋuăcӫaătұpătin. NӃuătҥiăthѭămụcămӣătұpătinăkhôngăcóătұpătinăcóătênăđƣăgánăchoăBiӃnFileătӭcălƠă gặpălỗiăxuҩtănhұpă(I/OăError),ăthìăchѭѫngătrìnhăsӁăthoátăra. NӃuătұpătinăđѭӧc mӣălƠădҥngăvĕnăbҧnăthìăchỉăcóăthӇăđӑcădӳăliӋuătừătұpătinăra,ă cònănӃuătұpătinălƠădҥngăđӏnhăkiӇuăthìăcóăthӇătruyăxuҩtădӳăliӋuăbằngăcáchăđӑcădӳăliӋuă từătұpătinăhayăghiădӳăliӋuăvƠoătұpătin. 8.2.4. Đóng file: Thӫătục CLOSE(BiӃnFile); Ý nghĩa:ă Thӫă tụcă nƠyă nhằmă đóngă mӝtă tұpă tină đƣă đѭӧcă mӣă bӣiă thӫă tụcă REWRITE(BiӃnFile)ă hayăRESET(BiӃnFile)ă cóă tênă đƣă gánă choă BiӃnFileă trѭӟcă đó.ă ThaoătácănƠyăhӃtăsӭcăcầnăthiӃtăkhiăkhôngă lƠmăviӋcăvӟiătұpătinănӳaăđӇătránhămҩtădӳă liӋuăcӫaătұpătin. Chú ý:ăăĐӇătránhăviӋcăchѭѫngătrìnhăsӁ bӏăthoátăraăkhiăgặpălỗiăxuҩtănhұpăchúngă taăcóăthӇăkiӇmătraăxemătұpătinăsӁămӣăcóătӗnătҥiătrênăđĩaăkhôngăbӣiăhƠmăcӫaăngѭӡiăsӱă dụngăđѭӧcăxơyădựngănhѭăsau: FUNCTION FileExists(TênFile : STRING) : BOOLEAN ; VAR f : FILE; Begin { $I- } ASSIGN(f, TênFile); RESET(f); CLOSE(f); { $I+ } FileExists := (IOResult = 0); End; HƠmăFileExistsăsӁătrҧăvӅăgiáătrӏăTrueănӃuătұpătinăcầnămӣăcóătrênăđĩa,ăngѭӧcălҥiă choăgiáătrӏăFalse. 94 TrongăhƠmătrên,ăchỉăthӏădӏchă{ă$I- }ăđӇătắtăviӋcăkiӇmătraălỗiăxuҩt nhұpădӳăliӋu,ă tӭcălƠăchѭѫngătrìnhăsӁăkhôngăthoátăraăkhiăgặpălỗiăI/OăError,ăsauăđóătrҧălҥiămặcăđӏnhălƠă cóăkiӇmătraăbӣiăchỉăthӏădӏchă{ă$I+ă}.ăCònăhƠmăchuẩnăIOResultăsӁătrҧăvӅăgiáătrӏă0ăkhiă khôngăcóălỗiăxuҩtănhұpătӭcălƠămӣătұpătinăđѭӧc,ăngѭӧcălҥiănhұnăgiáătriăkhácă0ăthӇăhiӋnă mƣălỗi. 8.2.5. Đổi tên một file: Thӫătục RENAME(BiӃnFile, TênMӟi); Ý nghĩa:ăThӫătụcănƠyănhằmăđổiătênăcӫaătұpătinăđƣăgánăchoăBiӃnFileăbӣiăthӫătụcă ASSIGN trѭӟcăđóă thƠnhăTênMӟiă (TênMӟiăchỉăcóă tênă tұpă tinămƠăkhôngăcóăđѭӡngă dүn)ăvƠăthӫăthục chỉăđѭӧcăgӑiăkhiătұpătinăchѭaăđѭӧcămӣ. Ví dụ:ăăGiҧăsӱătҥiăthѭămụcăhiӋnăhƠnhăcóătұpătinăvӟiătênăSOLIEU.DAT,ăđӇăđổiă thƠnhătênămӟiălƠăLUUTRU.DATătaăthựcăhiӋnăđoҥnăchѭѫngătrìnhăsau: VAR f : FILE; ............ ASSIGN(f, ‘ SOLIEU.DAT ‘); RENAME(f, ‘ LUUTRU.DAT ‘); ............ 8.2.6. Xoá bỏ một file: Thӫătục ERASE(BiӃnFile); Ý nghĩa:ăThӫătụcănƠyănhằmăxoáăraăkhӓiăđĩaămӝtătұpătinăcóătênăđƣăđѭӧcăgánăchoă BiӃnFileăbӣiăthӫătụcăASSIGN trѭӟcăđó,ăthӫătụcănƠyăchỉăđѭӧcăthựcăhiӋnăkhiătұpătină chѭaăđѭӧcămӣ. Ví dụ:ăăGiҧăsӱătҥiăthѭămụcăhiӋnăhƠnhăcóătұpătinăvӟiătênăSOLIEU.DAT,ăđӇăxoáă tұpătinănầyăkhӓiăđĩaătaăthựcăhiӋnăđoҥnăchѭѫngătrìnhăsau: VAR f : FILE ; ............ ASSIGN(f, ‘SOLIEU.DAT’); ERASE(f); ............ 8.3. Tұp tin định kiӇu 8.3.1. Cách tổ chức lưu trữ của tập tin định kiểu: TұpătinăđӏnhăkiӇuălѭuătrӳăcácăphầnătӱăcóăcùngăkiӇuălƠăăKiӇuPhầnTӱ.ăCácăphầnă tӱăđѭӧcălѭuătrӳăkӃătiӃpănhauăvƠăcuӕiăcùngălƠădҩuăhiӋuăkӃtăthúcăfileă(EOF).ăSӕăphầnă tӱăcӫaătұpătinăđѭӧcăgӑiălƠăđӝădƠiăcӫaăfile.ăCácăphầnătӱ cӫaătұpătinălầnălѭӧcăđѭӧcăgánă sӕăhiӋuătheoăquiăđӏnhălƠă0,ă1,ă2,....ă(nhѭăvұyăphầnătӱăthӭăănăcӫaătұpătinăđѭӧcăgánăsӕă hiӋuălƠăăn-1). KhiăthaoătácăvӟiătұpătinăthìăchúngătaăchỉăcóăthӇăghiădӳăliӋuăvƠoămӝtăphầnătӱănƠoă đóăhoặcăđӑcădӳă liӋuătҥiămӝtăphầnă tӱănƠoăđóăcӫaătұpătin.ăӢăđơyăchúngătaăđѭaăthêmă 95 mӝtăkháiăniӋmălƠă“cӱaăsӕăfile”.ăTҥiămӝtăthӡiăđiӇmăcӱaăsổăfileăđӏnhăvӏăvƠoămӝtăphầnă tӱănƠoăđóăcӫaătұpătin.ăKhiăđӑcădӳă liӋuătừătұpătinăhoặcăghiădӳă liӋuăvƠoătұpătină luônă luônăđѭӧcăthựcăhiӋnătҥiăphầnătӱămƠăcӱaăsổăfileăđangăđӏnhăvӏ. Minhăhoҥ: 0 1 2 3 4 .. .. .. n-1 EOF 8.3.2. Các thủ tục và hàm chuẩn: Khiăthaoătácăvӟiătұpătinăthìătұpătinăđóăphҧiăđѭӧcămӣă(bӣiăthӫătụcăREWRITE hay RESET).ăNӃuămӣăbӣiăthӫătụcăREWRITE thìăchỉăcóăthӇăghiădӳăliӋuăvƠoătұpătin,ăcònă nӃu mӣăbӣiăthӫătụcăRESET thìăbanăđầuăcӱaăsổăfileăđӏnhăvӏăӣăphầnătӱăđầuătiênăcóăsӕă hiӋuă0,ăkhiăđóătaăcóăthӇăghiădӳăliӋuăvƠoătұpătinăvƠăđӑcădӳăliӋuătừătұpătinăra. NgoƠiăcácăthӫătụcăvƠăhƠmăchuẩnăđѭӧcădùngăchungăchoăcácăkiӇuătұpătin,ăsauăđơyă lƠămӝtăsӕăthӫătụcăvƠ hƠmăchuẩnăchỉăliênăquanăđӃnătұpătinăđӏnhăkiӇu: Hàm FILESIZE(BiӃnFile); GiáătrӏătrҧăvӅăcӫaăhƠmălƠăkíchăthѭӟcăcӫaătұpătinăcóătênăđƣăgánăchoăBiӃnFileătӭcă lƠăsӕăphầnătӱăthựcăcóătrongătұpătin.ăNhѭăvұyăcácăphầnătӱăcӫaătұpătină lầnă lѭӧcăđѭӧcă đánhăsӕăhiӋuătừă0ăđӃnăFILESIZE(BiӃnFile)-1. Hàm FILEPOS(BiӃnFile); GiáătrӏătrҧăvӅăcӫaăhƠmălƠăsӕăhiӋuăcӫaăphầnătӱămƠăcӱaăsổăfileăđangăđӏnhăvӏăcӫaă tұpătinăcóătênăđƣăgánăchoăBiӃnFileăđangăđѭӧcămӣ. Hàm EOF(BiӃnFile); GiáătrӏătrҧăvӅăcӫaăhƠmălƠăTrueănӃuăcӱaăsổăfileăcӫaătұpătinăđangămӣăcóătênăđƣăgánă choăBiӃnFileăđangăӣăvӏătríădҩuăhiӋuăkӃtăthúcăfile.ăNgѭӧcălҥiăthìăgiáătrӏătrҧăvӅăcӫaăhƠmă là False. Thӫătục SEEK(BiӃnFile,ăk); ThӫătụcănƠyănhằmăđѭaăcӱaăsổăfileăđӃnăđӏnhăvӏăvƠoăphầnătӱăcóăsӕăhiӋuăkăcӫaătұpă tinăcóătênăđƣăgánăchoăBiӃnFileăđangăđѭӧcămӣ. Thӫătục READ(BiӃnFile,ăBiến); TrongăđóăBiến cóăkiӇuă lƠăKiểuPhầnTử cӫaătұpătin.ăThӫătụcănầyănhằmăđӑcădӳă liӋuătҥiăphầnătӱămƠăcӱaăsổăfileăđangăđӏnhăvӏăcӫaătұpătinăcóătênăđƣăgánăchoăBiӃnFileă đangăđѭӧcămӣăbӣiăthӫătụcăRESET,ădӳăliӋuăđӑcăraăđѭӧcălѭuăvƠoăBiӃn.ăKhiăđӑcăxongă thìăcӱaăsổăfileătựăđӝngăđӏnhăvӏăvƠoăphầnătӱătiӃpătheoăcӫaătұpătin. Thӫătục WRITE(BiӃnFile,ăBiӇuThӭc); TrongăđóăBiӇuăthӭcă(cóăthӇălƠăhằng,ăbiӃn,ăbiӇuăthӭcăhayălӡiăgӑiăhƠm)ăcóăkiӇuălƠă KiӇuPhầnTӱăcӫaătұpătin.ăThӫătụcănƠyănhằmăghiăgiáătrӏăcóăđѭӧcăcӫaăBiӇuThӭcăvƠoă phầnă tӱămƠăcӱaăsổă fileăđangăđӏnhă vӏăcӫaă tұpă tinăcóă tênă đƣăgánăchoăBiӃnFileăđangă 96 đѭӧcămӣăbӣiăthӫătụcăRESET hay REWRITE.ăKhiăghiăxongăthìăcӱaăsổăfileătựăđӝngă đӏnhăvӏăvƠoăphầnătӱătiӃpătheo. 8.3.3. Các ví dụ: Ví dụ 1: ViӃtăchѭѫngă trìnhă tҥoămӝtă tұpă tinămӟiăcóă tênăSOLIEU.DATă tҥiă thѭă mụcăhiӋnăhƠnhădӇăthựcăhiӋnăcácăcôngăviӋcăsau: Choămáyălҩyăngүuănhiênămӝtăsӕănguyênădѭѫngăbéăhѫnă100,ănӃuăsӕăđóăkhácă0ă thìăghiăvƠoătұpătinăsauăđóălặpălҥi,ănӃuăsӕăđóăbằngă0ăthìădừng. ĐӑcădƣyăsӕăđangălѭuătrongătұpătinăvƠăghiălênămƠnăhình. SắpăxӃpăcácăsӕălѭuătrongăcácăphầnătӱăcӫaătұpătinăsaoăchoăkhiăđӑcătuầnătựătừătұpăă tinăthìătaăđѭӧcădƣyăsӕăkhôngăgiҧm.ăSauăđóăghiădƣyămӟiălênămƠnăhình. Chúăý:ăkhôngăđѭӧcăsӱădụngăbiӃnăkiӇuămҧng. Hướng dẫn: Ta cầnăxơyădựngăcácăchѭѫngătrìnhăconănhằmăthựcăhiӋnăcácăcôngă viӋcăsau: Thӫătục TaoFile choăphépălҩyăngүuănhiênăcácăsӕăbéăhѫnă100ărӗiăghiăvƠoă tұpătinăSOLIEU.DATăchoăđӃnăsӕălҩyăđѭӧcălƠăsӕă0ăthìăkӃtăthúc. Thӫă tục XepThuTu sắpăxӃpă lҥiădƣyă theoă thӭă tựăkhôngăgiҧmăđangă lѭuăgiӳă trênătұpătin. Thӫătục DocFile choăhiӋnădƣyăsӕăđangălѭuăgiӳătrênătұpătinăraămƠnăhình. ChѭѫngătrìnhăđѭӧcăthӇăhiӋnănhѭăsau: USES CRT; TYPE FNGUYEN = FILE OF WORD; VAR f:FNGUYEN; PROCEDURE TaoFile(St:STRING); VAR f:FNGUYEN; N:WORD; Begin Assign(f,St); Rewrite(f); Randomize; Repeat N:=Random(100); If N0 Then Write(f,N); Until N=0; Close(f); End; PROCEDURE DocFile(St:STRING); VAR f:FNGUYEN; N:WORD; Begin Assign(f,St); Reset(f); While NOT Eof(f) DO 97 Begin Read(f,N); Write(N:4); End; Close(f); End; PROCEDURE XepThuTu(St:STRING); VAR f:FNGUYEN; N,i,j,a,b:WORD; Begin Assign(f,St); Reset(f); N:=Filesize(f); For i:=0 To N-2 Do Begin Seek(f,i); Read(f,a); For j:=i+1 To N-1 Do Begin Seek(f,j); Read(f,b); IF a>b THEN Begin Seek(f,i); Write(f,b); Seek(f,j); Write(f,a); a:=b; End; End; End; Close(f); End; BEGIN Clrscr; TaoFile(‘SOLIEU.DAT’); DocFile(‘SOLIEU.DAT’); Writeln; XepThuTu(‘SOLIEU.DAT’); DocFile(‘SOLIEU.DAT’); Readln; END. Ví dụ 2: ĐӇăquҧnălýăkӃtăquҧăthiătuyӇnăvƠoălӟpă10ăcӫaăhӑcăsinhăphổăthôngămỗiă thíăsinhăcầnălѭuăgiӳăcácăthôngătinăsau:ăsӕăbáoădanh,ăhӑăvƠătênă(theoăkiӇuăViӋtăNamă nhѭngăkhôngăcóădҩu),ăđiӇmă thiăcácămônă toán,ă lý,ăhoá.ăYêuăcầuă viӃtăchѭѫngă trìnhă thựcăhiӋnăcácăchӭcănĕngăsau: 98 Mӣămӝtă tұpă tină mӟiă cóă tênăHOCSINH.DATăđӇă nhұpă hӑă tênă thíă sinhă vƠă cácă điӇmătoán,ă lý,ăhoáăcӫaăthíăsinhăđó.ăViӋcănhұpăđѭӧcă lұpă lҥiăđӃnăchừngănƠoănhұpăhӑă tênăthíăsinhălƠăxơuărổngăthìăkӃtăthúcă(chѭaăđánhăsӕăbáoădanh). SắpăxӃpătheoăthӭătựăalphabetăcӫaădanhăsáchăcóătrênătұpă tină(theoăquiăcáchăѭuă tiênă theoă tênă sauă đóă đӃnă hӑă vƠă chӳă lót),ă sauă đóă đánhă sӕă báoă danhă thӭă tựă theoă sӕă nguyên 1, 2, 3,..... HiӇnă thӏă danhă sáchă thíă sinhă lênă mƠnă hìnhă kèmă theoă điӇmă cácă mônă vƠă tổngă điӇm. HiӇnăthӏădanhăsáchăthíăsinhătrúngătuyӇnălênămƠnăhìnhăkèmătheoăđiӇmăcácămônă vƠătổngăđiӇm.ăThíăsinhătrúngătuyӇnănӃuătổngătừă20ătrӣălênăvƠăkhôngăcóămônănƠoăcóă điӇmădѭӟiă2. Hướng dẫn: TaăcầnăxơyădựngăcácăchѭѫngătrìnhăconănhằmăthựcăhiӋnăcácăcôngă viӋcăsau: Thӫ tụcăTaoFile choăphépăngѭӡiă sӱădụngă nhұpăhӑă tênă thíă sinh,ă xơuă nhұpă vƠoătựăđӝngăđѭӧcăđổiăthƠnhă inăhoaăbӣiăthӫătụcăInHoa. TҥmăthӡiăsӕăbáoădanhăđӅuă đѭӧcăgánăbằng 0. Thӫă tục XepThuTu sắpă xӃpă lҥiă danhă sáchă theoă thӭă tựă alphabet.ă Dựaă vƠoă hàm DaoNguoc đӇăđҧoăphầnătênălênătrѭӟc,ăsauăđóăđӃnăhӑăvƠăchӳălótănhằmăphụcăvụă choăviӋcăsoăsánhăhaiăxơuăhӑătênătheoăkiӇuăcӫaăPascal. Thӫătục HienDanhSach choăhiӇnăthӏădanhăsáchătoƠn bӝăcùngăkӃtăquҧăđiӇm. Thӫătục DSTrungTuyen choăhiӇnă thӏălênămƠnăhìnhădanhăsáchătrúngătuyӇnă đúngăvӟiătiêuăchuẩnăđƣăđӅăra. ChѭѫngătrìnhăđѭӧcăthӇăhiӋnănhѭăsau: USES CRT; TYPE STR30 = String[30]; HOCSINH = Record SBD:Word; Ten : STR30; T, L, H : Real; End; FHOCSINH = FILE OF HOCSINH; VAR f:FHOCSINH; PROCEDURE InHoa(VAR S:STR30); VAR i:Word; Begin For i:=1 To Length(s) Do s[i]:=Upcase(S[i]); End; PROCEDURE TaoFile(St:STRING); VAR f:FHOCSINH; Hs:HocSinh; HoTen:STR30; N:Word; Begin 99 Assign(f,St); Rewrite(f); N:=1; REPEAT Writeln(‘Nhap ho ten hoc sinh thu‘,N,’:‘); Readln(HoTen); InHoa(HoTen); If HoTen ‘’ Then With Hs Do Begin SBD:=0; Ten:=HoTen; Write(‘Diemtoan: ‘); Readln(T); Write(‘Diem ly: ‘); Readln(L); Write(‘Diem hoa: ‘); Readln(H); Write(f,Hs); N:=N+1; End; UNTIL HoTen=’’; CLOSE(f); End; FUNCTION DaoTen(Ten:STR30):STR30; VAR s:STR30; Begin S:=’’; While Ten[Length(Ten)]#32 Do Begin S:=Ten[Length(Ten)]+S; Delete(Ten,Length(Ten),1); End; While Ten[Length(Ten)]=#32 Do Delete(Ten,Length(Ten),1); DaoTen:=S+#32+Ten; End; PROCEDURE XepThuTu(St:STRING); VAR f:FHOCSINH; N,i,j:WORD; hs1,hs2:HOCSINH; Begin Assign(f,St); Reset(f); N:=Filesize(f); 100 For i:=0 To N-2 Do Begin Seek(f,i); Read(f,hs1); For j:=i+1 To N-1 Do Begin Seek(f,j); Read(f,hs2); If DaoTen(hs1.Ten)>DaoTen(hs2.Ten) Then Begin Seek(f,i); Write(f,hs2); Seek(f,j); Write(f,hs1); hs1:=hs2; End; End; End; N:=1; Seek(f,0); While Not Eof(f) Do Begin Read(f,hs1); hs1.SBD:=N; Seek(f,N-1); Write(f,hs1); N:=N+1; End; Close(f); End; PROCEDURE HienDanhSach(St:STRING); VAR f:FHOCSINH; hs:HOCSINH; Begin Assign(f,St); Reset(f); While Not Eof(f) Do Begin Read(f,hs); With hs Do Writeln(SBD,Ten,T,L,H,T+L+H); End; CLOSE(f); End; FUNCTION KiemTra(hs:HOCSINH):Boolean; Begin With hs Do If (T>=2)and(L>=2)and(H>=2)and(T+L+H>=20) Then KiemTra:=True Else KiemTra:=False; End; 101 PROCEDURE DSTrungTuyen(St:STRING); VAR f:FHOCSINH; hs:HOCSINH; Begin Assign(f,St); Reset(f); While Not Eof(f) Do Begin Read(f,hs); If KiemTra(hs) Then With hs Do Begin Writeln(SBD,Ten,T:8:2,L:8:2,H:8:2,T+L+H:8:2); End; CLOSE(f); End; BEGIN CLRSCR; TaoFile(‘HOCSINH.DAT’); XepThuTu(‘HOCSINH.DAT’); HienDanhSach(‘HOCSINH.DAT’); writeln; DSTrungTruyen(‘HOCSINH.DAT’); Readln; END. 8.4. Tұp tin vĕn bҧn 8.4.1. Cách tổ chức lưu trữ: Nhѭă đƣă nóiă ӣă trên,ă tұpă tină dҥngă vĕnă bҧnă chínhă lƠă tұpă tină đӏnhă kiӇuă vӟiă KiểuPhầnTử lƠăkiӇu CHAR (FILE OF CHAR),ăcóănghĩaămỗiăphầnătӱăcӫaătұpătinălƠă mӝtăkíătựăđѭӧcălѭuătrӳăkӃătiӃpănhauădѭӟiădҥngămƣăASCII.ăVìăvұyătaăcóăthӇădùngălӋnhă TYPEăcӫaăDOSăhayătҩtăcҧăcácăphầnămӅmăsoҥnăthҧoăđӇăđӑcădӳăliӋuăcӫaătұpătinănƠy. KhiăđӑcădӳăliӋuătừătұpătinăhayăghi dӳăliӋuăvƠoătұpătinăthìădӳăliӋuăđóăcóăthӇăcóă kiӇuădӳăliӋuăsӕ,ăkíătựăhayăxơuăkíătự.ăTrongăsӕăcácăkíătựăđѭӧcăghiăvƠoătұpătinăcóăhaiăkíă tựăcầnăđѭӧcăquanătơmăđặcăbiӋtăđóălƠăkíătựătrӣăvӅăđầuădòng(cóămƣăASCIIă13)ăvƠăkíătựă xuӕngădòngă(cóămƣăASCIIă10),ăđiӅuănƠyăsӁăđѭӧcătrìnhăbƠyărõăӣăcácă thӫătụcăchuẩnă đӑcădӳăliӋuătừătұpătinăvƠăghiădӳăliӋuăvƠoătұpătin. 8.4.2. Các thủ tục và hàm chuẩn: NgoƠiăcácăthӫătụcăvƠăhƠmăchuẩnăđѭӧcădùngăchungăchoăcácăkiӇuătұpătin,ăsauăđơyă lƠămӝtăsӕăthӫătụcăvƠăhƠmăchuẩnăchỉăliênăquanăđӃnătұpătinădҥngăvĕnăbҧn: Thӫătục APPEND (f); 102 Ý nghĩa:ăThӫătụcănƠyăđѭӧcădùngăđӇămӣătұpătinăcóătênăđƣăđѭӧcăgánăchoăbiӃnăfileă bӣiăthӫătục ASSIGN trѭӟcăđó.ăKhiătұpătinăđѭӧcămӣăthìăcӫaăsổăfileăđӏnhăvӏăӣăvӏătríă kӃtăthúcăcӫaătұpătin,ătừăđóătaăchỉăcóăthӇătuầnătựăghiăthêmădӳăliӋuăvƠoăcuӕiătұpătin. Thӫătục READ (f, BiӃn1, BiӃn2,...., BiӃnNă); READLN (f, BiӃn1, BiӃn2,...., BiӃnNă); Ý nghĩa:ăBiӃn1, BiӃn2,...., BiӃnNă(vӟiăN0) lƠăcácăbiӃnăcóăkiӇuădӳăliӋuăsӕ,ăkíă tự,ălôgicăhayăxơuăkíătự.ăCácăthӫătụcătrênăđѭӧcădùngăđӇăđӑcădӳăliӋuătừăvӏătríăcӫaăsổăfileă cӫaătұpătinăđƣăđѭӧcăgánătênăchoăbiӃnăfileăfăăđangăđѭӧcămӣăbӣiăthӫătục RESET. Cách đӑcăphụăthuӝcăvƠoăkiӇuădӳăliӋuăcӫaăcácăbiӃn. TuỳăthuӝcăkiӇuăcӫaăbiӃnămƠăcóănhӳngăcáchăđӑcăkhácănhauănhѭăsau: Nếu Biến có kiểu số:ă ăKhiăđóăcácăsӕăđѭӧcăghiătrênătұpătină lầnă lѭӧtăvƠăgiӳaăhaiăsӕăă phҧiăcáchănhauăítănhҩtămӝtăkíătựătrắng.ăMỗiălầnăđӑcăxongămӝtăsӕăbӣiăthӫătục READ thìăcӱaăsổăfileătựăđӝngăđӏnhăvӏătҥiăvӏătríăsӕătiӃpătheo.ăNӃuăđóălƠăsӕăcuӕiăcùngăcӫaădòngă thìăkhiăđӑcăxongăcӱaăsổăfileăsӁăđӏnhăvӏătҥiăsӕăӣăđầuădòngătiӃpătheo.ăMỗiălầnăđӑcăxongă mӝtăsӕăbӣiăthӫătục READLN thìăcӱaăsổăfileătựăđӝngăđӏnhăvӏătҥiăvӏătríăsӕăӣăđầuădòngă tiӃpătheo. Ví dụ 1: Giҧă sӱă tҥiă thѭă mụcă hiӋnă hƠnhă cóă tұpă tină dҥngă vĕnă bҧnă vӟiă tênă SOLIEU.DATăchӭaădƣyăcácăsӕănguyênăđѭӧc ghiătrênăhaiădòngănhѭăsau: -15 -4 30 -22 101 24 -23 452 Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; n:Integer; BEGIN Assign(f,'SOLIEU.DAT'); Reset(f); While Not Eof(f) Do Begin Read(f,n); Write(n:5); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭăsau: -15 -4 30 -22 101 15 24 -23 452 Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; n:Integer; BEGIN Assign(f,'SOLIEU.DAT'); 103 Reset(f); While Not Eof(f) Do Begin Readln(f,n); Write(n:5); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭăsau: -15 15 Chúăýărằngătrѭӡngăhӧpăđầuădùngăthӫătục READ vƠătrѭӡngăhӧpăsauădùngăthӫă tụcăREADLN. Ví dụ 2: Giҧă sӱă tҥiă thѭă mụcă hiӋnă hƠnhă cóă tұpă tină dҥngă vĕnă bҧnă vӟiă tênă SOLIEU.DATăchӭaădƣyăcácăsӕănguyênăđѭӧcăghiătrênăhaiădòngănhѭăsau: 5.0000000000E-01 1.123 1.5000000000E+00 1.12321 2.0000000000E+00 15.5 Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; x:Real; BEGIN Assign(f,'SOLIEU.DAT'); Reset(f); While Not Eof(f) Do Begin Read(f,x); Writeln(x); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭăsau: 5.0000000000E-01 1.1230000000E+00 1.5000000000E+00 1.1232100000E+00 2.0000000000E+00 1.5500000000E+01 Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; x:Real; BEGIN Assign(f,'SOLIEU.DAT'); Reset(f); 104 While Not Eof(f) Do Begin Readln(f,x); Writeln(x:5:3); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭăsau: 5.000 1.123 Chúăýărằngătrѭӡngăhӧpăđầuădùngăthӫătục READ vƠătrѭӡngăhӧp sauădùngăthӫă tụcăREADLN. Nếu biến có kiểu kí tự:ăăăKhiăđóănӃuăđӑcăbӣiăthӫătục READ thìăkíătựătҥiăcӫaăsổă fileăcӫaătұpătină sӁăđѭӧcăđӑcăvƠă lѭuăvƠoăBiӃn,ăsauăkhiăđӑcăxongăcӫaăsổăfileătựăđӝngă chuyӇnăsangăkíătựătiӃpătheo.ăCácăkíătựătrӣăvӅăđầuădòngă(#13)ăvƠăkí tựăxuӕngădòngă (#10)ăvүnăđѭӧcăđӑcăbìnhăđẳngă nhѭăcácăkíă tựăkhác.ăNӃuăđӑcăbӣiă thӫă tục READLN thìăkíătựătҥiăcӫaăsổăfileăcӫaătұpătinăsӁăđѭӧcăđӑcăvƠălѭuăvƠoăBiӃn,ăsauăkhiăđӑcăxongăcӱaă sổăfileătựăđӝngăchuyӇnăsangăkíătựăđầuădòngătiӃpătheo. Ví dụ : Giҧă sӱă tҥiă thѭ mụcă hiӋnă hƠnhă cóă tұpă tină dҥngă vĕnă bҧnă vӟiă tênă VANBAN.TXTăchӭaăcácădòngăvĕnăbҧnănhѭăsau: aaa bb cc d ee e fgh aa Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; ch:Char; BEGIN Assign(f,'VANBAN.TXT'); Reset(f); While Not Eof(f) Do Begin Read(f,ch); Write(ch); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭăsau: aaa bb cc d ee e fgh aa 105 Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; ch:Char; BEGIN Assign(f,'VANBAN.TXT'); Reset(f); While Not Eof(f) Do Begin Readln(f,ch); Write(ch); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭăsau: adf ChúăýărằngătrѭӡngăhӧpăđầuădùngăthӫătụcăREADăvƠătrѭӡngăhӧpăsauădùngăthӫă tụcăREADLN. NӃuăbiӃnăcóăkiӇuăxơuăkíătự:ăăGiҧăsӱăBiӃnăkiӇuăxơuăkíătựăcóăđӝădƠiătӕiăđaă lƠănă (tӭcăcóăkiӇuăString[n]).ăKhiăđóănӃuăđӑcăbӣiăthӫătụcăREADăthìăbắtăđầuătҥiăvӏătríăcӫaăsổă fileăcӫaătұpătinăsӁăđѭӧcăđӑcămӝtăxơuăcóăđúngănăkíătựăvƠă lѭuăvƠoăBiӃn,ăsauăkhiăđӑcă xongăcӫaăsổăfileătựăđӝngăchuyӇnăsangăkíătựătiӃpătheo.ăNӃuăđӑcăchѭaăđӫănăkíătự thìăđƣă gặpăcặpăkíătựăă#13ăvƠă#10ăthìăcũngăxemănhѭăđӑcăxongănӃuăcӭătiӃpătụcăđӑcăthìăchỉăđӑcă xơuărổng,ăkhôngăbaoăgiӡăcӱaăsổăfileăcóăthӇăđѭaăđӃnăsauăcặpăkíătựăă#13ăvƠă#10ă(tӭcălƠă vӏătríăđầuătiênăcӫaădòngătiӃpătheo).ăNӃuăđӑcăbӣiăthӫătụcăREADLNăthìăbắtăđầuătҥi vӏă tríăcӫaăsổăfileăcӫaătұpătinăsӁăđѭӧcăđӑcămӝtăxơuăcóăđúngănăkíătựăvƠălѭuăvƠoăBiӃn,ănӃuă đӑcăchѭaăđӫănăkíătựăthìăđƣăgặpăcặpăkíătựăă#13ăvƠă#10ăthìăcũngăxemănhѭăđӑcăxong.ăSauă khiăđӑcăxongăcӫaăsổăfileătựăđӝngăchuyӇnăsangăvӏătríăcӫaăkíătựăđӭngăsauăcặpăkíătựăă#13 vƠă#10ă(tӭcălƠăđѭaăđӃnăvӏătríăđầuătiênăcӫaădòngătiӃpătheo). Víă dụă :ă Giҧă sӱă tҥiă thѭă mụcă hiӋnă hƠnhă cóă tұpă tină dҥngă vĕnă bҧnă vӟiă tênă VANBAN.TXTăchӭaăcácădòngăvĕnăbҧnănhѭăsau: aaaaabbbbbcc dddeefff gghhhkkkkk ChúăýărằngăӣăđơyăsauămỗiădòngăđӅuăcóăcặpăkíătựăă#13ăvƠă#10 Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; s:String[5]; I:Integer; BEGIN Assign(f,'VANBAN.TXT'); Reset(f); For I:=1 To 5 Do 106 Begin Read(f,s); Writeln('**',s); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭ sau: **aaaaa **bbbbb **cc ** ** NhѭăvұyăthӇăhiӋnăkhiăđӑcă5ălầnăthìăhaiălầnăđầuătiênăđӑcăđӫă5ăkíătựăchoăxơuăs,ălầnă thӭăbaăđӑcăđѭӧcă2ăkíătựăchoăxơuăsăvƠăhaiălầnăcuӕiăchỉăđӑcăđѭӧcăxơuărổngă(nhѭăvұyă đӑcăbӣiăthӫătụcăREADăkhôngălƠmăchoăcӱaăsổăfileăvѭӧtăquaăđѭӧcăcặpăkíătựăă#13ăvƠă #10). Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; s:String[5]; I:Integer; BEGIN Assign(f,'VANBAN.TXT'); Reset(f); While Not Eof(f) Do Begin Readln(f,s); Writeln(s); End; Close(f); END. ThìăsӁăchoăkӃtăquҧătrênămƠnăhìnhănhѭăsau: aaaaa dddee gghhh ChúăýărằngănӃuăthayăkiӇuăString[5]ăbӣiăkiӇuăString[n]ăvӟiăn>=12ăhoặcăbӣiăkiӇuă StringăthìăkӃtăquҧătrênămƠnăhìnhăsӁăchoănhѭăsau: aaaaabbbbbcc dddeefff gghhhkkkkk Thӫătục WRITE (f, BiӇuThӭc) WRITELN (f, BiӇuThӭc) 107 Ýănghĩa:ăăCácăthӫăătụcănƠyăđѭӧcăsӱădụngăđӇăghiăgiáătrӏăcӫaăBiӇuThӭcă(cóăkiӇuă dӳăliӋuăsӕ,ăkíătự,ălogicăhayăxơuăkíătự)ăvƠoătұpătinăbắtăđầuătҥiăvӏătríăcӱaăsổăfileăcӫaătұpă tinăcóătênăđƣăđѭӧcăgánăchoăbiӃnăfileăfăbӣiăthӫătụcăASSIGNăvƠăđƣăđѭӧcămӣăbӣiăthӫ tụcăREWRITEăhoặcăAPPENDătrѭӟcăđó.ăNӃuăsӱădụngă thӫă tụcăWRITEă thìăkhiăghiă xongă cӱaă sổă fileă sӁă đӏnhă vӏă đӏnhă vӏă ӣă vӏă tríă kӃă tiӃp,ă cònă nӃuă sӱă dụngă thӫă tụcă WRITELNăthìăsauăkhiăghiăxongăsӁătựăđӝngăghiăthêmăcặpăkíătựăă#13ăvƠă#10ăvƠăcӱaăsổă fileăđӏnhăvӏătҥiăvӏătríăkӃătiӃpăsauăđó. Víă dụă :ă Giҧă sӱă tҥiă thѭă mụcă hiӋnă hƠnhă cóă tұpă tină dҥngă vĕnă bҧnă vӟiă tênă VANBAN.TXTăchӭaăcácădòngăvĕnăbҧnănhѭăsau: Aaaaa bbb cc Dddee fff ChúăýărằngăӣăđơyăsauămỗiădòngăđӅuăcóăcặpăkíătựăă#13ăvƠă#10 Khiăchҥyăchѭѫngătrình USES CRT; VAR f :TEXT; s:String[5]; I:Integer; BEGIN Assign(f,'VANBAN.TXT'); Append(f); Write(f,'AAAA BBB'); Writeln(f,'CC EEEE'); Writeln(f,'MMMMM NN PPP'); I:=230; s:='TTTTT'; Write(I:5, s:8); Close(f); END. Thìănӝiădungăcӫaătұpătinăsauăkhiăghiăthêm là: Aaaaa bbb cc Dddee fff AAAA BBBCC EEEE MMMMM NN PPP ((230(((TTTTT (Chúăý:ăӣădòngăcuӕiăcùngădùngă(đӇăthӇăhiӋnăkíătựătrắng) Hàm EOLN (f) Ýănghĩa:ăGiҧă sӱă tұpă tinăđƣăđѭӧcăgánă tênăchoă biӃnă fileă făvƠăđangămӣ.ăKhiăđóă hƠmătrҧăvӅăgiáătrӏăTrueănӃuătҥiăthӡiăđiӇmăgӑiăhƠmăcӱaăsổăfileăđangăӣăvӏătríăcӫaăcặpăkíă tựăă#13ăvƠăă#10ă(kíătựătrӣăvӅăđầuădòngăvƠăkӃtăthúcădòng)ăcӫaădòngăvĕnăbҧnăhiӋnătҥi.ă Ngѭӧcălҥi,ăhƠmătrҧăvӅăgiáătrӏăFalse. Hàm EOF (f) 108 Ýănghĩa:ăGiҧăsӱătұpătinăđƣăđѭӧcăgánătênăchoăbiӃnăfileăfăvƠăđangămӣ.ăKhiăđóătrҧă vӅăgiáătrӏăTrueănӃuătҥiăthӡiăđiӇmăgӑiăhƠmăcӱaăsổăfileăđangăӣăphầnătӱăchӭaădҩuăhiӋuă kӃtăthúcăfile.ăNgѭӧcălҥi,ăhƠmătrҧăvӅăgiáătrӏăFalse. BÀI TҰP CHѬѪNG 8. Tұp tin định kiӇu 1. ViӃtăchѭѫngătrìnhăthựcăhiӋnăcácăcôngăviӋcăsau,ămỗiăcôngăviӋcăđѭӧcăviӃtăbӣiămӝtă chѭѫngătrìnhăcon,ăsauăđóăxơyădựngămenuăđӇăchӑnălựaăcácăcôngăviӋcănƠy: Choămáyă lầnă lѭӧtă lҩyăngүuănhiênăcácăsӕănguyênădѭѫngă(mỗiăsӕă<500)ăvƠălѭuă vƠoămӝtătұpătinăđӏnhăkiӇu.ăNӃuăsӕăngүuănhiênălҩyăđѭӧcălƠăsӕă0ăthìăkӃtăthúc. BổăsungăvƠoăcuӕiătұpătinămӝtăsӕănguyênădѭѫng. Hoánăđổiăcácăsӕă lѭuătrongăcácăphầnătӱăcӫaătұpătinăsaoăchoăkhiăđӑcădӳăliӋuătừă tұpătinătaăđѭӧcădƣyăsӕăkhôngăgiҧm. NӃuătrongătұpătinăcóăhaiăsӕăgiӕngănhauă thìă loҥiăbӓăbӟtămӝtăsӕăsaoăchoăcácăsӕă cònălҥiătrongătұpătinăkhácănhauătừng đôiămӝt. HiӇnăthӏălênămƠnăhìnhădƣuăsӕăcóăđѭӧcătrongătұpătin. 2. ĐӇăquҧnălýăđiӇmăhӑcătұpăcӫaăhӑcăsinhăphổăthông,ămỗiămônăhӑcăngѭӡiătaăcầnăquҧnă lý các thông tin sau: ĐiӇmăkiӇmătraămiӋngăcóăhӋăsӕă1,ăgӗmă1ăcӝtăđiӇm. ĐiӇmăkiӇmătraă15ăphútăcóăhӋăsӕă1,ăgӗmă2 cӝtăđiӇm. ĐiӇmăkiӇmătraă1ătiӃtăcóăhӋăsӕă2,ăgӗmă2ăcӝtăđiӇm. ĐiӇmăthiăhӑcăkỳ,ăgӗmă1ăcӝtăđiӇm.ă NgѭӡiătaăquiăđӏnhăcáchătínhăđiӇmăcuӕiăhӑcăkỳănhѭăsau: ĐiӇmătrungăbìnhăkiӇmătraă(TBKT)ălƠăđiӇmătrungăbìnhăcӫaăcácăđiӇmăkiӇmătra. ĐiӇmătrungăbìnhămônă(TBM)ă=ă(2*TBKTă+ăĐiӇmăthiăhӑcăkỳ) / 2. HƣyătổăchӭcăkiӇuădӳăliӋuăbҧnăghiătѭѫngăӭngăvƠăviӃtăchѭѫngătrìnhăthựcăhiӋnăcácă côngăviӋcăsau,ămỗiăcôngăviӋcăđѭӧcăviӃtătrongămӝtăchѭѫngătrìnhăcon,ăsauăđóătổăchӭcă mӝtămenuăđӇăchӑnălựaăcácăcôngăviӋcănƠy: Nhұpădanhăsáchăhӑcăsinh vƠăcácăcӝtăđiӇmă(khiănƠoănhұpăhӑătênăcӫaăhӑcăsinhălƠă xơuărổngăthìăkӃtăthúc). BổăsungăthêmăhӑătênăvƠăcácăcӝtăđiӇmăcӫaămӝtăhӑcăsinhămӟi. SắpăxӃpălҥiăcácăbҧnăghiătrongătұpătinătheoăthӭătựăalphabetăcӫaăhӑătênăhӑcăsinh. HiӇnăthӏădanhăsáchăhӑcăsinhăcùngăcácăcӝtăđiӇmăvƠăđiӇmăTBM. ThôngăbáoălênămƠnăhìnhăvƠăinăraăgiҩyădanhăhӑcăsinhăphҧiăthiălҥiămônăhӑcănƠy. 3. ĐӇăquҧnălýăđiӇmămônăhӑcăcӫaăhӑcăsinhăphổăthôngănhѭătrongăbƠiă2)ăcóămӝtănhѭӧcă điӇmălƠăyêuăcầuăsӕăcӝtăđiӇmăcӫaăcácăhӑcăsinhăphҧiăgiӕngănhau,ănhѭngăthựcătӃăsӕăcӝtă 109 điӇmăkiӇmătraăthӇăkhácănhau,ăvíădụăkiӇmătraămiӋng.ăĐӇăkhắcăphụcăđiӅuănƠyătaăkhôngă dùngăkiӇuăbҧnăghiămƠătổăchӭcălѭuătrӳălҥiănhѭăsau:ăMỗiăhӑcăsinhăđѭӧcălѭuătrongămӝtă phầnătӱăcӫaătұpătinăđӏnhăkiӇuămƠăkiӇuăphầnătӱălƠăString,ătheoădҥngăsau: Le Van Anh M5P10M7P8T10H9 Vӟiăýănghĩaănhѭăsau: HӑătênăcӫaăhӑcăsinhălƠ:ăăLeăVanăAnh CóăhaiăcӝtăđiӇmămiӋngălƠ:ăă5ăvƠă7ă(cóăkíătựăMăkèmătrѭӟc) CóăhaiăcӝtăđiӇmă15ăphútălƠ:ăă10ăvƠă8ă(cóăkíătựăPăkèmătrѭӟc) CóămӝtăcӝtăđiӇmă1ătiӃtălƠ:ăă10ă(cóăkíătựăTăkèmătrѭӟc) CӝtăđiӇmăthiăhӑcăkỳălƠ:ăă9ă(cóăkíătựăHăkèmătrѭӟc) Hƣyă viӃtăchѭѫngă trìnhă thựcăhiӋnăcácăcôngă viӋcă sau,ămỗiăcôngă viӋcăđѭӧcăviӃtă trongămӝtăchѭѫngă trìnhăcon,ă sauăđóă tổăchӭcămӝtămenuăđӇăchӑnă lựaă cácăcôngă viӋcă này: Nhұpădanhăsáchăhӑcăsinh. BổăsungăthêmăhӑăvƠătênămӝtăhӑcăsinhămӟi. NhұpăđiӇmăchoătҩtăcҧăhoặcămӝtăhӑcăsinhănƠoăđó. KiӇmătraăxemăhӑcăsinhănƠoăchѭaăđӫăcácă loҥiăcӝtăđiӇmă(đӫătҩtăcҧăcácăloҥiăcӝtă điӇmălƠăphҧiăcóăcácăloҥiăđiӇmăkiӇmătraămiӋng,ă15ăphút,ă1ătiӃtăvƠăthiăhӑcăkỳ).ăNӃuăhӑcă sinhănƠoăthiӃuăthìăthôngăbáoălênămƠnăhìnhăvƠăloҥiăcӝtăđiӇmămƠăhӑcăsinhăđóăthiӃu. BổăsungăthêmămӝtăcӝtăđiӇmănƠoăđóăchoămӝtăhӑcăsinhănƠoăđó. ThôngăbáoădanhăsáchălênămƠnăhìnhăcùngăđiӇmăTBMăđӕiăvӟiăcácăhӑcăsinhăđầyă đӫăcácăloҥiăcӝtăđiӇm.ăNӃuăhӑcăsinhănƠoăthiӃuăloҥiăcӝtăđiӇmăthìăkhôngătổngăkӃtăđiӇmă TBMămƠăchỉăthôngăbáoăloҥiăcӝtăđiӇmăcònăthiӃu. Tұp tin vĕn bҧn. 1. Xơyădựngăthӫătụcăđӑcămӝtătұpătinădҥngăvĕnăbҧn,ăvӟiătênătұpătinăđѭӧcănhұpătừăbƠnă phím,ăsauăđóăthôngăbáoălênămƠnăhìnhăsӕădòngăvƠăsӕătừăcóătrongătұpătinăđóă(cóăkiӇmă traăsựătӗnătҥiăcӫaătұpătin). 2. ViӃtăchѭѫngătrìnhăchoăngѭӡiăsӱădụngănhұpătừăbƠnăphímămӝtădƣyăcácăsӕănguyênă dѭѫng,ăchừngănƠoăsӕănhұpăvƠoălƠăsӕă0ăthìăkӃtăthúc.ăDƣyăsӕănhұpăvƠoăđѭӧcălѭuătrongă mӝtătұpătinădҥngăvĕnăbҧn,ăgiӳaăhaiăsӕăđặtăcáchănhauăítănhҩtămӝtăkíătựătrắng.ăTênăcӫa tұpătinăđѭӧcăngѭӡiăsӱădụngănhұpăvƠoătừăbƠnăphím. 3. Giҧăsӱăcóămӝtă tұpă tinădҥngă vĕnă bҧn,ă lѭuădƣyăcácă sӕă nguyênă dѭѫng,ă trênă nhiӅuă dòngă vƠămỗiădòngă lѭuăđúngă10ăsӕ,ăgiӳaăhaiă sӕăcáchă nhauă ítă nhҩtămӝtăkíă tựă trắngă (dòngăcuӕiăcùngăcóăthӇăítăhѫnă10ăsӕ).ăViӃtăchѭѫngătrìnhăđӑcădƣyăsӕătừătұpătin,ătênătұpă tinăđѭӧcănhұpăvƠoătừăbƠnăphím,ăsauăđóăthôngăbáoălênămƠnăhìnhătrongătұpătinăcóăbaoă nhiêuăsӕăchẵn. 110 4. ViӃtăchѭѫngătrìnhăđӇăsaoăchépămӝtătұpătinădҥngăvĕnăbҧnăđƣăcóătrênăđĩaăthƠnhămӝtă tұpătinămӟi.ăTênătұpătinăcũăvƠămӟiăđѭӧcănhұpătừăbƠnăphím. 5. ViӃtăchѭѫngătrìnhăđӑcămӝtătұpătinădҥngăvĕnăbҧnăđƣăcóătrênăđĩa.ăSauăđổiătҩtăcҧăcácă kíătựăđầuătừăthƠnhăinăhoa,ăcònăcácăkíătựăkhácăthƠnhăinăthѭӡng. 6. LƠmălҥiăbƠiătұpă3)ăvӟiăcҩuătrúcălѭuătrӳăkhácănhѭăsau: ӢăđơyăxơuăchӭaăhӑătênăvƠăcácăcӝtăđiӇmăcӫaămӝtăhӑcăsinhă(cóăkiӇuăString)ăsӁă khôngălѭuăӣăphầnătӱăcӫaămӝtătұpătinăđӏnhăkiӇuămƠălѭuătrênămỗiădòngăcӫaămӝtătұpătină dҥngăvĕnăbҧn. 111 CHѬѪNG 9. KIӆU CON TRӒ (POINTER) Mở đầu : - Cácă biӃnă thuӝcăkiӇuădӳă liӋu đƣăhӑcă nhѭă integer,ă real,ămҧng,ă tұpăhӧp,ăbҧnă ghiăgӑiă lƠăcácăbiӃnă tĩnhăvìăchúngăđѭӧcăxácăđӏnhărõărƠngăkhiăkhaiăbáoăvƠăsauăđóă đѭӧcădùngă thôngăquaă tênăcӫaăchúng.ă Thӡiăgiană tӗnă tҥiă cӫaă biӃnă tĩnhăcũngă lƠă thӡiă gianătӗnătҥiăcӫaăkhӕiăchѭѫngătrìnhăcóăchӭaăkhaiăbáoăcácăbiӃnănƠy.ăDoăđóănӃuăchѭѫngă trình sӱădụngămӝtăsӕălѭӧngălӟnăcácăbiӃnătĩnhăthìăsӁăkhôngăđӫăbӝănhӟ. - ĐӇătránhălƣngăphíăbӝănhӟ TurboăPascalăchoăphépădùngăbiӃnăđӝngă(dynamică variable).ăCácăbiӃnănƠyăđѭӧcă lѭuătrӳătrongăvùngăHeap,ăkhiăcầnăchúngăcóăthӇăđѭӧcă tҥoă raăđӇăchӭaădӳă liӋu,ăkhiăkhôngăcầnă cóă thӇăxóaăchúngăđiăđӇăgiҧiăphóngă bӝă nhӟ.ă BiӃnăđӝngăkhôngăcóătênăvƠăquҧnălý biӃnăđӝngănƠyălƠăbiӃnăconătrӓă. Mục tiêu: HӑcăxongăchѭѫngănƠyăSinhăviênă - HiӇuăđѭӧcăkiӇuăconătrӓ,ăbiӃtăđѭӧcăcáchăđӏnhănghĩaăkiӇuăconătrӓăvƠăcáchăkhaiă báoăbiӃnăconătrӓ. - BiӃtăcáchăkhӣiătҥoăvƠăloҥiăbӓămӝtăbiӃnăđӝng. - BiӃtăđѭӧcămӝtăsӕăthaoătácătrênăbiӃnăconătrӓăvƠăbiӃnăđӝng.ă 9.1. Mở đầu. 9.1.1 Phân chia bộ nhớ trong: Bӝă nhӟă trongă (RAM)ă đѭӧcă cҩuă tҥoă bằngă cácămҥchă FLIPFLOPă (mỗiămҥchă đѭӧcăgӑiălƠă1ăbít)ămôătҧăđѭӧcăhaiătrҥngăthái.ăMỗiăthanhăghiă(REGISTER)ăđѭӧcăcҩuă tҥoăbằngă16ămҥchăFLIPFLOPănӕiătiӃpănhau,ătrongăđóă8ămҥchăđầuătҥoăthƠnhămӝtăôă nhӟăgӑiălƠăByteăthҩpăvƠă8ămҥchăsauătҥoăthƠnhămӝtăôănhӟăgӑiălƠăbyteăcao. Mỗiăôănhӟăđѭӧcăxácăđӏnhăbӣiămӝtăđӏaăchỉă(adress).ăViӋcăxácăđӏnhăđӏaăchỉăăchoă cácăôănhӟăđѭӧcăthựcăhiӋnănhѭăsau: Tұpăhӧpă65535ăôănhӟătҥoăthƠnhămӝtăSEGMENT,ămỗiăSEGMENTăđӅuăđѭӧcă đánhăsӕăgӑiălƠăđӏaăchỉăcӫaăSEGMENTăđó. TrongămỗiăSEGMENT,ămỗiăôănhӟăđӅuăđѭӧcăđánhăsӕăgӑiălƠăđӏaăchỉătѭѫngăđӕiă hayăđӏaăchỉăOFFSETăcӫaăôănhӟăđó. Nhѭ vұyămỗiăôănhӟăđѭӧcăxácăđӏnhăbӣiăhaiăđӏaăchỉ,ăđóălƠăđӏaăchỉăSEGMENTăvƠă đӏaăchỉăOFFSET.ăHaiăđӏaăchỉănƠyđѭӧcăviӃtădѭӟiădҥngăcѫăsӕă16ă(HEXA)ăvӟiăcúăphápă nhѭăsau: ă:ă Víădụ:ăMӝtăôănhӟănằmătrongăSegmentăthӭănhҩtăvƠăvӏătríăcӫănóătrongăsegmentă nƠyălƠă13,ăsӁăcóăđӏaăchỉălƠăă$0001:$000C SauăđơyălƠăcácăhƠmăxácăđӏnhăđӏaăchỉăSEGMENTăvƠăđӏaăchỉăOFFSETăcӫaămӝtă BiӃn,ăđӅuăcóăkiӇuăcӫaăgiáătrӏătrҧăvӅăcӫaăhƠmălƠăWORD: 112 SEG() OFS() Khiă chҥyămӝtă chѭѫngă trìnhă viӃtă bằngă Pascală thìă bӝă nhӟă trongă (RAM)ă đѭӧcă chiaăthƠnhănĕmăvùngănhѭăsau: VùngăPROGRAMăSegmentăPREFIX,ăchiӃmă256ă byteăđӇă lѭuăgiӳăđӏaăchỉăcӫaă cácăvùngăkhác,ăcácăbiӃn,ăcácăhƠm,ăcácăthӫătục. VùngăCODEăSegment,ăgӗmăcóăhaiăphần: MAINăCODEăSegment:ăVùngăchӭaăđoҥnămƣăcӫaăchѭѫngătrìnhăchính. UNITăCODEăSegment:ăVùngăchӭaăđoҥnămƣăcӫaăcácăđѫnăvӏăchѭѫngătrình. VùngăDATAăSegmentădùngăđӇălѭuăcácăbiӃnăchungăcӫaăchѭѫngătrình. VùngăSTACKăSegmentădùngăđӇăchӭaătҥmăthӡiăcácăprocedure. VùngăHEAPădùngăđӇălѭuăgiӳăcácăbiӃnăđӝng. Đӏa chỉăcӫaăôănhӟăđầuătiênăcӫaămỗiăvùngăđѭӧcăgӑiălƠăđӏaăchỉăcӫaăvùngăđó.ăCácă hƠmăCSEG,ăDSEG,ăSSEGăcóăgiáătrӏătrҧăvӅăcӫaăhƠmăkiӇuăWORDălầnălѭӧtălƠăđӏaăchỉă cӫaăvùngăCODEăSegment,ăDATAăSegment,ăSTACKăSegment.ă 9.1.2. Biến con trỏ và biến động: BiӃnăconătrӓălƠămӝtăbiӃnăđѭӧcăđặtătênăvƠăđѭӧcăkhaiăbáoăsauătừăkhoáăVAR,ăcóă kiӇuăconătrӓăvƠăđѭӧcălѭuăgiӳătrongăvùngănhӟăDataăSegment.ăGiáătrӏăđѭӧcălѭuăgiӳăӣă biӃnăconătrӓă lƠăđӏaăchỉăcӫaămӝtăbiӃnăđӝngătrongăvùngăHEAPăhayămӝtăbiӃnănƠoăđóă trong DATA Segment. BiӃnăđӝngălƠămӝtăloҥiăbiӃnăkhôngăcóătên,ăđóălƠămӝtăvùngănhӟăvӟiăkíchăthѭӟcăcӕă đӏnhăđѭӧcălѭuăgiӳătrongăvùngăHEAPăvƠăđӏaăchỉăcӫaănóăđѭӧcălѭuăgiӳăӣămӝtăbiӃnăconă trӓănƠoăđóă(cònăgӑiălƠăđѭӧcăquҧnălýăbӣiămӝtăbiӃnăconătrӓ).ăKhiăcần,ăchúngătaăcóăthӇă tҥoăraămӝtăbiӃnăđӝngă(cònăgӑiălƠăxinăcҩpăphátămӝtăbiӃnăđӝng),ăkhiăkhôngăcầnătaăcóă thӇăxoáăđiăđӇătrҧălҥiăvùngănhӟăchoăHEAP. Nhѭăvұy,ăbiӃnăđӝngămuӕnătӗnătҥiăthìăphҧiăcóăbiӃnăconătrӓăquҧnălýăđӏaăchỉăcӫaă nó. ĐӇăphơnăbiӋtăvӟiăbiӃnăđӝng,ăcácăbiӃnăcóătênăđѭӧcăkhaiăbáoăsauătừăkhóaăVARă sӁăđѭӧcăgӑiălƠăcácăbiӃnătĩnh.ăNhѭăvұy,ăbiӃnăconătrӓăcũngălƠăbiӃnătĩnh. 9.2. KiӇu con trӓ 9.2.1. Định nghĩa kiểu và khai báo biến: ĐӏnhănghĩaăkiӇu: KiӇuăconătrӓăđѭӧcăđӏnhănghĩaătheoăcúăpháp: TYPE TênKiểuConTrỏ = ; ӢăđơyăKiӇuPhầnTӱălƠătênăcӫaăkiӇuădӳăliӋuăchӭaătrongăbiӃnăđӝngămƠăbiӃnăconă trӓătrӓătӟi. 113 KhaiăbáoăbiӃn: CóăhaiăcáchăkhaiăbáoăbiӃnăconătrӓ:ă KhaiăbáoăvӟiăkiӇuăconătrӓăđƣăđѭӧcăđӏnhănghĩa: VAR p, q : TênKiểuConTrỏ; khaiăbáoătrựcătiӃp: VAR p, q : ; Víădụ: TYPE TRO_NGUYEN = ^ Integer; VAR p,q : TRO_NGUYEN ; HayăcóăthӇăkhaiăbáoătrựcătiӃpănhѭăsau : VAR p, q : ^Integer ; Khiăđó,ăpăvƠăqălƠăcácăbiӃnăconătrӓ,ăquҧnălýăđӏaăchỉăcӫaăcácăbiӃnăđӝngăchӭaădӳă liӋuălƠăsӕănguyênă(cóăkíchăthѭӟcălƠă2ăbyte). Ngoài ra, TurboăPascalăchoăphépătaăkhaiăbáoăcácăbiӃnăconătrӓăkhôngăđӏnhăkiӇuă vӟiăkiӇuăchuẩnăđƣăđѭӧcăđӏnhănghĩaălƠăPOINTER.ăCácăbiӃnăconătrӓăloҥiănƠyăchỉăđѭӧcă sӱădụngăđӇăquҧnăđӏaăchỉăcӫaătҩtăcҧăcácăloҥiăbiӃnăđӝngă(khôngăphơnăbiӋtăkiӇuăcӫaădӳă liӋuăchӭaătrongăbiӃnăđӝngăđó),ătaăkhôngăthӇătruyăcұpădӳăliӋuătҥiăcácăbiӃnăđӝngăthôngă quaăbiӃnăconătrӓăloҥiănƠy.ăĐӇăkhaiăbáoăbiӃnăloҥiănƠyătaădùngăcúăphápănhѭăsau: VAR p, q : POINTER ; 9.2.2. Khởi tạo và loại bỏ biến động: GiҧăsӱăpălƠămӝtăbiӃnăconătrӓăđƣăđѭӧcăkhaiăbáo,ăkhiăđó: ĐӇăxinăcҩpăphátămӝtăbiӃnăđӝngătrongăvùngăHEAP,ăcóăđӏaăchỉăđѭӧcăquҧnălýăbӣiă biӃnăconătrӓăpăvƠăkíchăthѭӟcăcӫaăbiӃnăđӝngădoăpăquiăđӏnh,ătaădùng: Thӫătục NEW(p); ĐӇăloҥiăbӓăbiӃnăđӝng,ăcóăđӏaăchỉăđangăquҧnă lýăbӣiăbiӃnăconătrӓăpăvƠăđƣăđѭӧcă tҥoăraătrѭӟcăđóăbӣiăthӫătụcăNEW,ătaădùng: Thӫătục DISPOSE(p); ĐӇălҩyăkíchăthѭӟcăcӫaăbiӃnăđӝng,ătaădùng: Hàm SIZEOF(p^); CóăgiáătrӏătrҧăvӅăcӫaăhƠmălƠăkíchăthѭӟcăcӫaăbiӃnăđӝngămƠăbiӃnătrӓăconăpătrӓătӟiă (đѫnăvӏătínhălƠăbyte). Víădụ: VAR p : ^Integer ; s : ^String ; ThìăgiáătrӏăcӫaăSIZEOF(p^)ăsӁă lƠă2ăbyteăvƠăgiáătrӏăcӫaăSIZEOF(s^)ăsӁă lƠă256ă byte. ĐӇăxinăcҩpăphátămӝtăbiӃnăđӝngătrongăvùngăHEAP,ăcóăđӏaăchỉăđѭӧcăquҧnălýăbӣiăbiӃnă conătrӓăpăvƠăkíchăthѭӟcăcӫaăbiӃnăđӝngălƠăSizeă(cóăkiӇuăWord),ătaădùng: 114 Thӫătục GETMEM(p, Size); ĐӇăloҥiăbӓăbiӃnăđӝngăcóăkíchăthѭӟcălƠăSizeătrongăvùngăHEAP,ăcóăđӏaăchỉăđangă quҧnălýăbӣiăpăvƠăđƣăđѭӧcătҥoăraătrѭӟcăđóăbӣiăthӫătụcăGETMEM,ătaădùng: Thӫătục: FREEMEM(p, Size); Chúă ý:ă ă Cácă thӫă tụcă DISPOSEă vƠă FREEMEMă ӣă trênă chỉă cóă tácă dụngă giҧiă phóngămӝtăbiӃnăđӝngăđangăđѭӧcăquҧnă lýăbӣiăbiӃnă trӓăp.ăCóăthӇăsӱădụngămӝtăbiӃnă conătrӓăđӇătҥoătaănhiӅuăbiӃnăđӝng,ăTurboăPascalăchoăphépăđánhădҩuăcácăbiӃnăđӝngăđóă vƠăthựcăhiӋnăgiҧiăphóngăcùngămӝtălần.ăCụăthӇănhѭăsau: KӇă từă thӡiă điӇmă nƠy,ă cácă biӃnă đӝngă đѭӧcă tҥoă raă bӣiă thӫă tụcă NEW(p)ă hayă GETMEM(p,Size)đӅuăđѭӧcăđánhădҩu,ătaădùng: Thӫătục MARK (p); ĐӇă giҧiă phóngă tҩtă cҧă cácă biӃnă đӝngă đƣă đѭӧcă khӣiă tҥoă bӣiă NEW(p)hayă GETMEM(p,Size)kӇătừăkhiăđƣăđѭӧcăđánhădҩuăbӣiăthӫătụcăMARK(p), ta dùng: Thӫătục RELEASE(p) ; Ví dụ:ăă VAR p : POINTER; p1, p2, p3 : ^Integer ; .............. ; NEW(p1) ; MARK(p) ; NEW(p2) ; NEW(p3) ; RELEASE(p) ; {ăKӇătừăđơy,ăcácăbiӃnăđӝngăđѭӧcăkhӣiătҥoăsauăthӫătụcăMARK(p)ăđӅuăđѭӧcăgiҧiă phóng.ăCụă thӇă lƠăcácă biӃnăđӝngăđang đѭӧcăquҧnă lýă bӣiăp2ă vƠăp3.ăCònă biӃnăđӝngă đangăquҧnălýăbӣiăp1ăvүnătӗnătҥiă} .............. ; 9.2.3. Các thao tác với biến con trỏ và biến động: PhépălҩyăđӏaăchỉăcӫaămӝtăbiӃnătĩnh:ăăSӱădụngătoánătӱă@, đӇălҩyăđӏaăchỉăcӫaăbiӃnă tĩnhăxăgánăchoăbiӃnăconătrӓ pătaăcóăthӇăthựcăhiӋnănhѭăsau: p := @ x ; Phépăgán:ăăTaăcóăthӇăthựcăhiӋnăphépăgánă(giáătrӏălƠăđӏaăchỉăcӫaăbiӃnăđӝng)ăđӕiă vӟiăhaiăbiӃnăconătrӓăcóăcùngăkiӇuăvӟiănhauăhayămӝtăbiӃnăconătrӓăcóăkiӇuăvƠămӝtăbiӃnă conătrӓăkhôngăđӏnhăkiӇuăchoănhau.ăCụăthӇălƠ: Víădụătaăcóăkhaiăbáo : VAR p, q : ^Integer ; 115 ConătrӓăpăvƠăqătrӓăđӃnăbiӃnăđӝngăchӭaădӳăliӋuăkiӇuăIntegerănênăcóăthӇăgánăchoă nhau : p := q ; KhiăđóăgiáătrӏăđӏaăchỉăcӫaăbiӃnăđӝngăđangăđѭӧcăquҧnălýăbӣiăqăsӁăđѭӧcăgánăchoă p.ăTӭcălƠătҥiăthӡiăđiӇmănƠyăcҧăpăvƠăqăđӅuătrӓăđӃnăcùngămӝtăbiӃnăđӝng. Conătrӓărổng:ăăTurboăPascalăquiăđӏnhămӝtăhằngăđӏaăchỉăkhôngălƠăNIL,ăkhiăconă trӓăkhôngăcóănhiӋmăvụăquҧnălýămӝtăbiӃnăđӝngănƠoăthìătaăgánăchoănóăđӏaăchỉăkhông: P := NIL ; VƠăkhiăđóătaănóiăpălƠăconătrӓărổng.ăNILăcóăthӇăgánăchoăbҩtăcӭăconătrӓăloҥiănƠo. TruyăcұpădӳăliӋuătҥiăbiӃnăđӝng:ăGiҧăsӱăpălƠămӝtăbiӃnăconătrӓ,ăđangătrӓătӟiămӝtă biӃnăđӝngănƠoăđó.ăNhѭăđƣătrìnhăbƠyăӣătrênălƠăbiӃnăđӝngăkhôngăcóătên,ăӣăđơyăTurboă PascalăchoăphépătruyăcұpădӳăliӋuătҥiăbiӃnăđӝngănƠyăbӣiăkíăphápăp^.ăNhѭăvұyătaăcóăthӇă hiӇuăp^ănhѭălƠătênăcӫaăbiӃnăđӝngămƠăbiӃnăconătrӓăpăđangătrӓătӟi.ăDoăđóăp^ăsӁăcóăkiӇuă dӳă liӋuă lƠăKiӇuPhầnTӱăcӫaă biӃnăconă trӓăpă vƠăcácăphépă toánă thaoă tácăđѭӧcă trênăp^ă chínhălƠăcácăphépătoánăcóăđѭӧcătrênăkiӇuădӳăliӋuălƠăKiӇuPhầnTӱ. Víădụ: VAR p : ^Integer ; m, n : Integer ; Khiăđóăp^ăsӁăcóăkiӇuădӳăliӋuălƠăInteger.ăNhѭăvұyăcácăcơuălӋnhăsauăđӅuăhӧpălӋ: .............. ; New(p) ; Readln(p^) ; {nhұnămӝtăsӕănguyênănhұpătừăbƠnăphímăchoăbiӃnăđӝngăđangătrӓăbӣiăp} Write(p^) ; {viӃtă raă mƠnă hìnhă giáă trӏă cӫaă sӕă nguyên đangă lѭuă giӳă tҥiă biӃnă đӝngă đangătrӓăbӣiăp} n := 20 ; m := 2 * p^ + n ; .............. ; TYPE HocSinh = RECORD Ten : String[30] ; T, L, H : Real ; END; VAR p, q : ^HocSinh ; hs : HocSinh ; Khiăđóăp^,ăq^ăsӁăcóăkiӇuăHocSinhă(kiӇuăbҧnăghi).ăNhѭăvұyătaăcóăthӇăthaoătácă vӟiăp^,ăq^ănhѭălƠăcácăbiӃnăcóăkiӇuăbҧnăghiăvӟiăbӕnătrѭӡngă lƠ:ăTen,ăT,ăL,ăH.ăDoăđóă cácăcơuălӋnhăsauăđӅuăhӧpălӋ: 116 .............. ; New(p) ; Write(‘Nhập họ tên: ‘); Readln(p^.Ten); Write(‘Nhập điểm toán: ‘); Readln(p^.T); Write(‘Nhập điểm lý: ‘); Readln(p^.L); Write(‘Nhập điểm hoá: ‘); Readln(p^.H); .............. ; HoặcălƠ .............. ; New(p) ; With p^ Do Begin Write(‘Nhập họ tên: ‘); Readln(Ten); Write(‘Nhập điểm toán: ‘); Readln(T); Write(‘Nhập điểm lý: ‘); Readln(L); Write(‘Nhập điểm hoá: ‘); Readln(H); End; .............. ; HoặcălƠ .............. ; With hs Do Begin Write(‘Nhập họ tên: ‘); Readln(Ten); Write(‘Nhập điểm toán: ‘); Readln(T); Write(‘Nhập điểm lý: ‘); Readln(L); Write(‘Nhập điểm hoá: ‘); Readln(H); End; New(p) ; p^ := hs ; .............. ; Chúăý:ăăNӃuăpălƠăconătrӓăkhôngăđӏnhăkiӇuă (p : Pointer) thìăpăchỉăcóănhiӋmăvụă lѭuăgiӳăđӏaăchỉăcӫaăbiӃnăđӝngănƠoăđóăchӭăkhôngăthӇăthôngăquaănóăđӇătruyăcұpădӳăliӋuă tҥiăbiӃnăđӝngămƠănóătrӓătӟiăđѭӧc,ătӭcălƠăkhôngăthӇăthaoătácăvӟiăp^. 9.2.4. Một số hàm chuẩn khác: Hàm ADDR(Biến); GiáătrӏătrҧăvӅăcӫaăhƠmălƠăđӏaăchỉ cӫaăBiӃnă(giӕngănhѭăsӱădụngătoánătӱă@) Hàm PTR(seg, ofs : Word); GiáătrӏătrҧăvӅăcӫaăhƠmălƠăđӏaăchỉăcӫaăvùngănhӟăcóăđӏaăchỉăSegmentăvƠăOffsetălầnă lѭӧtălƠăsegăvƠăofs. 117 BiӃn Đӝng 5 BiӃn Đӝng 4 BiӃn Đӝng 3 BiӃn Đӝng 2 BiӃn Đӝng 1 Ví dụ:ăăModeămƠnăhìnhăđѭӧcăđặtătrongăvùngănhӟăcóăđӏaăchỉăSegmentăvƠăOffsetă là $0000:$0449.ăKhiăđóăđӇă lҩyăgiáătrӏăcӫaăModeămƠnăhìnhătaăcóăthӇă thựcăhiӋnănhѭă sau: VAR p : ^Byte ; ........................................ ; p := PTR($0000, $0449); Writeln(„ Mode màn hình là: „, p^) ; .............. ; Hàm MEMAVAIL; GiáătrӏătrҧăvӅăcӫaăhƠmă(cóăkiӇuăLongInt)ălƠăkíchăthѭӟcătӕiăđaăcӫaăvùngăHEAP. Hàm MAXAVAIL; GiáătrӏătrҧăvӅăcӫaăhƠmă(cóăkiӇuăLongInt)ă lƠăkíchăthѭӟcăcònă lҥiăchѭaăcҩpăphátă cӫaăvùngăHEAP. 9.2.5. Ví dụ áp dụng: Giҧă sӱă cóămӝtă kiӇuă bҧnă ghiă vӟiă kháă nhiӅuă trѭӡng,ă tổngă kích thѭӟcă cӫaămӝtă biӃnăcóăkiӇuăbҧnăghiănƠyălƠăKă(bytes).ăNӃuătaătổăchӭcămҧngăcóăNăphầnătӱăđӇălѭuăcácă bҧnăghiă trênă thìăkíchă thѭӟcăcӫaămҧngă phҧiă lƠăN*Kă(bytes).ăNhѭă vұyă nӃuăsӱădụngă khôngăhӃtăcácăphầnă tӱăcӫaămҧngă thìă sӁă lƣngăphíă bӝă nhӟă rҩtă nhiӅuăkhiăKăkháă lӟn.ă Ngѭӧcălҥi,ănӃuăchӑnăNăbéăhѫnăthìătrongăquáătrìnhăxӱălýăcóăthӇăkhôngăcònăchổăđӇălѭuă thêmăbҧnăghiămӟi.ăVìăvұyătaătổăchӭcămӝtămҧngăgӗmăNăphầnătӱăđӇălѭuăcácăconătrӓă (mỗiăphầnătӱăchỉăchiӃmă2ăbytes)ătrӓăđӃnăcácăbiӃnăđӝngăcóăkiӇuăbҧnăghiăӣătrên.ăNhѭă vұyăkhiănƠoăcầnălѭuătrӳăthìăxinăcҩpăphátăbiӃnăđӝngăđӇălѭuătrӳăbҧnăghi,ăkhiănƠoăkhôngă cầnăthìăgiҧiăphóngăbiӃnăđӝngăđó.ăRõărƠngăbằngăcáchănƠyăchúngătaătiӃtăkiӋmăđѭӧcăbӝă nhӟ. MҧngăchӭaăNăconătrӓ 1 2 3 4 5 6 N-1 N --- --- VӟiăhìnhăminhăhoҥănhѭătrênăchoăthҩyătaătổăchӭcăđѭӧcămӝtădanhăsáchăcácăbiӃnă đӝngăđѭӧcăquҧnălýăbӣiămҧngăcácăconătrӓ. MӝtătínhătoánănhӓăchoătaăthҩyăsựătiӃtăkiӋmăđѭӧcăbӝănhӟănhѭăđƣănêuăӣătrên: 118 GiҧăsӱăN=100,ămỗiăbҧnăghi cóăkíchăthѭӟcă20ăbytes. NӃuătổăchӭcămҧngăchӭaăcácăbҧnăghiăthìăphҧiămҩt:ă100*20=2000ăbytes.ăNhѭngă thựcătӃăchỉăcóă5ăbҧnăghi,ăchiӃmă5*20=100ăbytes.ăNhѭăvұyăsӕăbyteădƠnhăchổănhѭngă khôngăsӱădụngălƠ:ă2000-100=1900 bytes. NӃuătổăchӭcămҧngăconătrӓăđӇăquҧnălýădanhăsáchăthìătҥiăthӡiăđiӇmănầyăsӕălѭӧngă bytesăđƣăchiӃmădụngă lƠ:ă100*2ă+ă5*20ă=ă300ă bytes,ă thựcăsựăsӕăbytesă lƣngăphíă lƠ:ă 95*2=190ăbytesă(doă95ăphầnătӱăchӭaăconătrӓăcӫaămҧngăchѭaăsӱădụng). TaăxétăvíădụăcụăthӇăsau: ViӃtăchѭѫngătrìnhăchoăngѭӡiăsӱădụngănhұpădanhăsáchăthíăsinhăthiătuyӇnăvƠoălӟpă 10,ăgӗmăhӑăvƠătên,ăđiӇmăcácămônăthiătoán,ălý,ăanhăvĕn.ăSӕălѭӧngăthíăsinhădoăngѭӡiă sӱădụngănhұpătừăbƠnăphímă(sӕăthíăsinhăbéăhѫnăhoặcăbằngă1000).ăDanhăsáchăthíăsinhă lѭuăvƠoăcácăbiӃnăđӝngăđѭӧcăquҧnă lýăbӣiămҧngăcácăconătrӓ.ăYêuăcầuăsắpăxӃpădanhă sáchătheoăthӭătựăgiҧmădầnăcӫaătổngăđiӇmăvƠăhiӇnăthӏădanhăsáchăđóălênămƠnăhình. USES crt; TYPE THISINH = Record Ten:String[30]; T,L,AV:Real; End; MANG_CONTRO=Array[1..1000] Of ^THISINH; VAR p:MANG_CONTRO; Max:Word; PROCEDURE Wait; Begin Writeln; Write(‘An phim bat ky de tiep tuc’); Repeat Until Keypressed; End; PROCEDURE HienThiDS; Var i:Word; Begin For i:=1 To Max Do writeln(i,’. ‘,p[i]^.Ten); Writeln; End; PROCEDURE NhapDS(Var Max:Word; Var p:MANG_CONTRO); Var i:Word; Begin Write(‘Nhap so thi sinh: ‘); Readln(Max); For i:=1 To Max Do Begin 119 New(p[i]); With p[i]^ Do Begin Write(i,’. Ho va ten: ‘); Readln(Ten); Write(‘Diem Toan: ‘); Readln(T); Write(‘Diem Ly: ‘); Readln(L); Write(‘Diem Anh van: ‘); Readln(AV); Writeln; End; End; Writeln(‘Da nhap xong danh sach’); End; PROCEDURE XepThuTu(Max:Word; Var p:MANG_CONTRO); Var i,j:Word; q:POINTER; A,B:Real; Begin Write(‘Dang xep thu tu giam dan theo tong diem’); For i:=1 To Max-1 Do For j:=i+1 To Max Do Begin A:= p[i]^.T+p[i]^.L+p[i]^.AV; B := p[j]^.T+p[j]^.L+p[j]^.AV ; If A < B Then Begin q:=p[i]; p[i]:=p[j]; p[j]:=q; Writeln(‘Da xep thu tu xong’); End; End; End; BEGIN NhapDS(Max,p); HienThiDS; Wait; XepThuTu(Max,p); HienThiDS; Wait; END. 9.3. Danh sách liên kӃt. 9.3.1. Khái niệm về danh sách liên kết: DanhăsáchăliênăkӃtălƠămӝtătұpăhӧpăcóăthӭătựăcácăbiӃnăđӝng.ăMỗiăbiӃnăđӝngăcóă kiӇuădӳăliӋuăbҧnăghi,ăcóătӕiăthiӇuăhaiătrѭӡng,ămӝtătrѭӡngăhoặcănhiӅuătrѭӡngădùngăđӇă lѭuădӳăliӋuăvƠăcóămӝtătrѭӡngă(dҥngăconătrӓ)ăđӇălѭuăđӏaăchỉăcӫaăbiӃnăđӝngăsauănóă(trӓă 120 đӃnăbiӃnăđӝngăsauănó).ăBiӃnăđӝngăđầuătiênăđѭӧcăquҧnă lýăbӣiămӝtăconătrӓăLăvƠăconă trӓăchӭaătrongăbiӃnăđӝngăsauăcùngălƠăconătrӓărỗng.ăKhiăđó,ătaăgӑiăđơyălƠădanhăsáchă liênăkӃtăL.ă Quiăѭӟcăthêm:ătaăgӑiădanhăsáchălƠădanhăsáchărổngăănӃuădanhăsáchăđóăkhôngăcóă biӃnăđӝngănƠo.ăNӃuăLălƠădanhăsáchărỗngăthìăLălѭuăđӏaăchỉărỗng,ătӭcălƠăL=NIL. Minhăhoҥănhѭăsau: L Nhѭăvұyăkhiă sӱădụngădanhăsáchă liênăkӃtă taăvүnă tiӃtăkiӋmăđѭӧcăbӝă nhӟă nhiӅuă hѫnăsoăvӟiăcáchătổăchӭcămҧngăchӭaăconătrӓăđӇăquҧnălýădanhăsáchănhѭăđƣătrìnhăbƠyăӣă trên.ăCụă thӇă lƠă tiӃtă kiӋmă thêmăđѭӧcă vùngă nhӟă trongămҧngă chӭaă cácă conă trӓă chѭaă đѭӧcăsӱădụng.ă 9.3.2. Cách định nghĩa kiểu cho các nút (biến động): TrongăTurboăPascalăngѭӡiătaăkhaiăbáoăkiӇuădӳăliӋuăchoăcácănútătheoăcúăphápă nhѭăsau: TYPE KiểuConTrỏ : ; KiểuBảnGhi = RECORD TênTrường1 : ; TênTrường2 : ; .................. TênTrườngN : ; ConTrỏ : KiểuConTrỏ ; END ; Trongăđó,ăKiӇuConTrӓăđӇăkhaiă báoăcácăbiӃnăconă trӓăquҧnă lýăđӏaăchỉăcӫaăcácă nút.ăKiӇuBҧnGhiăđӇăkhai báoăcácănútă(biӃnăđӝng).ăĐӇăminhăhӑa,ătaăđѭaăraăcácăvíădụă sau: Ví dụ 1:ăĐӇăxơyădựngădanhăsáchă liênăkӃtăchӭaăcácănút,ămỗiănútăchӭaămӝtăsӕă nguyênădѭѫng,ătaăđӏnhănghĩaăcácăkiӇuăsau: TYPE TRO = ^NUT; NUT = Record So : Word; Tiep : TRO; End; Ví dụ 2:ăĐӇăxơyădựngădanhăsáchăliênăkӃtăchӭaăcácănút,ămỗiănútăchӭaăhӑăvƠătên,ă điӇmăcácămônăthiătoán,ălý,ăanhăvĕnăcӫaămӝtăthíăsinh,ătaăđӏnhănghĩaăcácăkiӇuăsau: TYPE DSTHISINH = ^THISINH; THISINH = Record Ten : String[30]; 121 T,L,AV:Real; Tiep : DSTHISINH; End; Hay là TYPE DULIEU = Record Ten : String[30]; T,L,AV:Real; End; DSTHISINH = ^THISINH; THISINH = Record DL : DULIEU; Tiep : DSTHISINH; End; 9.3.3. Các Ví dụ: ViӃtăchѭѫngătrìnhăchoămáyă lҩyăngүuănhiênămӝtădƣyăgӗmăNăsӕănguyênădѭѫngă (NăđѭӧcănhұpătừăbƠnăphímăvƠămỗiăsӕăcӫaădƣyă<ă500).ăDƣyăsӕăđѭӧcălѭuătrongăcácănútă cӫaămӝtădanhăsáchăliênăkӃt.ăTrҧălӡiătrênămƠnăhình,ădƣyăsӕăcóăbaoănhiêuăsӕăchẵn. USES CRT; TYPE TRO = ^NUT; NUT = Record So : Word; Tiep : TRO; End; VAR L : TRO; PROCEDURE TaoDanhSach(Var L:TRO); Var p,M:TRO; N,i:Word; Begin Write('Nhap N= '); Readln(N); Randomize; L := Nil; For i:=1 To N Do Begin New(p); p^.so := Random(500); p^.Tiep := Nil; If L=Nil Then L:=p Else M^.Tiep := p; M := p; End; End; FUNCTION SoChan(L:TRO):Word; Var p:TRO; dem:Word; Begin 122 Dem := 0; P := L; While pNil Do Begin If p^.So mod 2 0 Then dem:=dem+1; P:=p^.Tiep; End; Sochan:=dem; End; BEGIN TaoDanhSach(L); Write('So luong so chan la: ',SoChan(L)); Readln END. ViӃtăchѭѫngătrìnhăchoăngѭӡiăsӱădụngănhұpădanhăsáchăthíăsinhăthiătuyӇnăvƠoălӟpă 10,ăgӗmăhӑăvƠătên,ăđiӇmăcácămônăthiătoán,ălý,ăanhăvĕn,ăđӃnăchừngănƠoănhұpăhӑătênă thíăsinhălƠăxơuărổngăthìăkӃtăthúc.ăDanhăsáchăthíăsinhălѭuăvƠoăcácăbiӃnăđӝngăcӫaămӝtă danhăsáchăliênăkӃtăquҧnălýăbӣiăbiӃnătrӓăL.ăSauăđóăchoăhiӇnăthӏădanhăsáchăthíăsinhălênă mƠnăhình.ăTừădanhăsáchăđƣăcóăhƣyăhoánăđổiăcácăbҧnăghiătrongăcácăbiӃnăđӝngăsaoăchoă khiăduyӋtădanhăsáchătaăđѭӧcătổngăđiӇmăcӫaăthíăsinhăđѭӧcăxӃpătheoăthӭătựăgiҧmădầnă cӫaătổngăđiӇm. USES CRT; TYPE DSTHISINH = ^THISINH; THISINH = Record Ten : String[30]; T,L,AV:Real; Tiep : DSTHISINH; End; VAR L:DSTHISINH; Max:Word; PROCEDURE Wait; Begin Writeln; Write('An phim bat ky de tiep tuc'); Repeat Until Keypressed; End; PROCEDURE HienThiDS(L:DSTHISINH); Var p:DSTHISINH; Begin 123 P:=L; While pNIL DO Begin Writeln(i,'. ',p^.Ten); P:=P^.Tiep; End; Writeln; End; PROCEDURE NhapDS(Var L:DSTHISINH); Var M,p:DSTHISINH; St:String; Begin L:=NIL; Write('Nhap so thi sinh: '); Repeat Write('Ho va ten: '); Readln(st); If st" Then Begin New(p); With p^ Do Begin Ten:=st; Write('Diem Toan:'); Readln(T); Write('Diem Ly: '); Readln(L); Write('Diem Anh van:'); Readln(AV); If L=NIL Then L:=p Else M:=p; M:=p; End; End; Until st="; Writeln('Da nhap xong danh sach'); End; PROCEDURE XepThuTu(Max:Word; Var p:MANG_CONTRO); Var i,j:Word; q:POINTER; A,B:Real; Begin Write('Dang xep thu tu giam dan theo tong diem'); For i:=1 To Max-1 Do For j:=i+1 To Max Do Begin A:= p[i]^.T + p[i]^.L + p[i]^.AV; B:= p[j]^.T + p[j]^.L + p[j]^.AV; If A < B Then Begin 124 q:=p[i]; p[i]:=p[j]; p[j]:=q; End; End; Writeln('Da xep thu tu xong'); End; BEGIN NhapDS(Max,p); HienThiDS; Wait; END. BÀI TҰP CHѬѪNG 9 1. Giҧă sӱă trênă đĩa,ă tҥiă thѭă mụcă hiӋnă thӡiă cóă tұpă tină dҥngă vĕnă bҧnă vӟiă tênă DAYSO.DATăchӭaădƣyăsӕă nguyên,ăgiӳaăhaiă sӕăcáchă nhauă ítă nhҩtămӝtăkíă tựă trắng.ă ViӃtăchѭѫngătrìnhăthựcăhiӋnăcácăcôngăviӋcăsau: ĐӑcădƣyăsӕăvƠălѭuăvƠoămӝtădanhăsáchăliênăkӃt,ămỗiănútăchӭaămӝtăsӕănguyên. TrênădanhăsáchănӃuăcóăhaiănútăchӭaăsӕănguyênăbằngănhauăthìăloҥiăbӓăbӟtămӝtă nútăchoăđӃnăkhiătrênădanhăsáchăchỉăcònăcácăsӕănguyênăkhácănhauătừngăđôiămӝt. Trênăcѫăsӣădƣyăsӕăđƣăcó đѭӧcăsauăkhiăloҥiăbӓănhѭăcơuăb),ăhƣyăhoánăđổiăsӕălѭuă trongăcácănútăđӇădanhăsáchălѭuădƣyăsӕătheoăthӭătựătĕngădần. ChoănhұpătừăbƠnăphímănӝtăsӕănguyênăN,ănӃuăNăchѭaăđѭӧcălѭuăӣănútănƠoăthìătìmă vӏătríăđӇăchènăvƠoămӝtănútămӟiăchӭaăNăsaoăchoădƣyăsӕălѭuătrongădanhăsáchăvҩnăbҧoă đҧmătheoăthӭătựătĕngădần. HiӇnăthӏădƣyăsӕăcóătrongădanhăsáchălênămƠnăhình. 2. ĐӇăxӱălýăsӕănguyênă lӟnă(víădụă536523472378239)ăngѭӡiătaătổăchӭcăcҩuătrúcădӳă liӋuănhѭăsau:ăMỗiăsӕănguyênăđѭӧcălѭuătrongămӝtădanhăsáchăliênăkӃt,ămỗiănútălѭuămӝtă chӳă sӕă cӫaă sӕă nguyênă đó,ă đѭӧcă lѭuă theoă chiӅuă ngѭӧcă cӫaă sӕă nguyênă (tӭcă chӳă sӕă hƠngăđѫnăvӏă lѭuăӣănútăđầuătiên,ăcácănútătiӃpătheoă lƠăchӳăsӕăhƠngăchục,ăhƠngătrĕm,ă hàng ngàn...) HƣyăviӃtăchѭѫngătrìnhăthựcăhiӋnăcácăcôngăviӋcăsau: NhұpătừăbƠnăphímămӝtăsӕănguyênălӟn. HiӇnăthӏămӝtăsӕănguyênălӟnălênămƠnăhình. Cӝng,ătrừ,ănhơn,ăchiaăhaiăsӕănguyênălӟn. Mỗiăcôngă viӋcăđѭӧcă viӃtă trongămӝtăchѭѫngă trìnhăconă vƠăxơyădựngămenuă đӇă ngѭӡiăsӱădụngăchӑnăcôngăviӋc. TÀI LIӊU THAM KHҦO [1]ăHӗăSĩăĐƠm,ăTrầnăVĕnăĐҥo,ăTin học 11, NXB Gíáoădục,ă2007 125 [2]ăQuáchăTuҩnăNgӑc,ăNgôn ngữ lập tnh Pascal - Tập 1 & 2,ăNĕmă1994 [3]ăĐỗăNgӑcăPhѭѫng,ăGiáo trình Pascal - Tập 1 & 2,ăTrѭӡngăTinăhӑcă&ăNgoҥiăngӳă TPăHӗăChíăMinh.

Các file đính kèm theo tài liệu này:

  • pdfbg_ngon_ngu_lap_trinh_pascal_646_2042661.pdf
Tài liệu liên quan