Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
294,13 KB
Nội dung
Lập trình bằng Turbo Pascal 2.2.2: Xử lí khi gõ các phím khác. 2.1.1.Tính chiều di, chiều rộng. 2.1.2.Vẽ khung hình chữ nhật với mu nền. 2.1.3. Viết lần lợt tên các mục chọn. 2.1.4. Lm nổi bật một mục chọn mặc định. 2.1: Vẽ bảng chọn ban đầu 2.2.1: Xử lí khi gõ mũi tên lên, xuống 2.2.2: Xử lí khi gõ các phím khác 2.2: Xử lí gõ phím Hình 11.7: Chi tiết mức 3 các công việc 2.1 v 2.2 Đến đây ta thấy hầu nh mọi công việc đã đủ đơn giản. Phần duy nhất cần lm chi tiết thêm l mô đun 2.2.1 - xử lí khi gõ các phím mũi tên Up, Down. 7.2.4 Chi tiết mức 4. Nếu kí hiệu i l số thứ tự của mục chọn hiện hnh thì công việc 2.2.1 (xử lí khi gõ phím mũi tên Up, Down) cần thực hiện l nh sau. 2.2.1.1: Lm chìm mục chọn i cũ tức l hiển thị mục chọn i bằng mu nền bình thờng 2.2.1.2: Cập nhật lại mục chọn i mới. - Gán i:= i + 1 / i:= i - 1 tuỳ theo gõ Up, Down. - Chú ý "xoay vòng tròn" khi: gõ phím mữi tên Up khi đang ở mục chọn đỉnh bảng (i=0) hay gõ mũi tên Down khi đang ở mục chọn đáy bảng (i = số mục chọn -1). Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 161 Lập trình bằng Turbo Pascal 2.2.1.3: Lm nổi bật mục chọn i mới. Hiển thị mục chọn i bằng mu chọn. 2.2.1: Xử lí khi gõ mũi tên lên, xuống 2.2.1.1. Lm chìm mục chọn cũ 2.2.1.2. Cập nhật mục chọn mới 2.2.1.3.Lm nổi mục chọn mới Hình 11.7: chi tiết mức 4 công việc 2.2.1 Tóm lại, sau bốn bớc chi tiết dần, các công việc đã trở thnh đơn giản. Việc triển khai viết chơng trình sử dụng Turbo Pascal hay một ngôn ngữ lập trình no đó chỉ đơn thuần l chuyển từng công việc thnh các câu lệnh tơng ứng một cách máy móc. 7.3 Chơng trình chi tiết. Dới đây l chơng trình tạo bảng chọn nhận đợc sau khi triển khai sơ đồ trên thnh các câu lệnh Turbo Pascal. uses crt; const max_SoMucChon = 8; {số mục chọn tối đa} type mang_string = array[0 max_SoMucChon-1] of string; var Ten_Muc_Chon: mang_string; {mảng các tên muc chọn} So_Muc_Chon: word; {số mục chọn} Mau_nen, Mau_Chon: byte; Chon: integer; {danh so tu 0 (SoMucChon - 1),ESC = -1} Procedure NhapThamSoBangChon; {phần nhập dữ liệu} begin So_Muc_Chon:=3; Ten_Muc_Chon[0]:=' muc chon 1 '; Ten_Muc_Chon[1]:=' muc chon 2 '; Ten_Muc_Chon[2]:=' thoat '; End; Procedure KiemTraHoatDong; {kiểm tra các thao tác sử dụng bảng chọn} begin; case Chon of Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 162 Lập trình bằng Turbo Pascal 0: begin clrscr; gotoXY(1,1); writeln('ban da chon:', Chon); end; 1: begin clrscr; gotoXY(5,5); writeln('ban da chon:', Chon); end; 2: begin clrscr; gotoXY(10,10); writeln('ban da chon:', Chon); end; -1: begin clrscr; gotoXY(20,20); writeln('ban da chon thoat !'); end; end; {case} end; function BangChon(x,y,SoMucChon:word;TenMucChon: mang_string; MauNen,MauChon: byte): integer; {vẽ bảng chọn, xử lý thao tác chọn} const esc=#27; {các phím để chọn} enter =#13; up = #72 ; down = #80; var rong: word; {chiều rộng bảng = tên mục chọn di nhất} i: integer; {thứ tự mục chọn hiện tại} procedure LamNoiMucChon(i: integer); {lm nổi bật mục chọn} begin TextBackGround(MauChon); gotoXY(1,i+1); ClrEol; write(TenMucChon[i]); end; procedure LamChimMucChon(i:integer); {thôi lm nổi} begin TextBackGround(MauNen); gotoXY(1,i+1); clreol; write(TenMucChon[i]); end; procedure VeBangChon; var i: integer; begin {tinh chieu rong} rong:=length(TenMucChon[0]); for i:=1 to SoMucChon -1 do if rong < length(TenMucChon[i]) then rong:= length(TenMucChon[i]); window(x,y,x+rong,y+SoMucChon); Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 163 Lập trình bằng Turbo Pascal TextBackGround(MauNen); clrscr; for i:=0 to SoMucChon -1 do writeln(TenMucChon[i]); {mặc định trờng hợp đầu tiên đợc chọn} LamNoiMucChon(0); end; procedure XuLiGoPhim; var i: integer; gophim: char; begin i:=0; {mặc định ban đầu l mục chọn thứ nhất} repeat if keyPressed then begin gophim:=readkey; if gophim=#0 then gophim:=readkey; case gophim of enter: begin BangChon:= i; exit end; esc : begin BangChon:=-1; exit end; up: begin {xoa hight light} LamChimMucChon(i); i:= ((i+SoMucChon) -1) mod SoMucChon; LamNoiMucChon(i); BangChon:=i; end; down: begin LamChimMucChon(i); i:=(i+1) mod SoMucChon; LamNoiMucChon(i); BangChon:=i; end; else ; {gõ các phím khác sẽ không có tác dụng gì} end; {case} end; until (gophim=enter) or (gophim=esc); end; begin {function BangChon} VeBangChon; XuLiGoPhim; {trả lại chế độ mn hình mặc định} Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 164 Lập trình bằng Turbo Pascal textMode (lastMode); end; {function BangChon} BEGIN NhapThamSoBangChon; Chon:= BangChon(10,5,So_Muc_Chon,Ten_Muc_Chon,Blue,Red); KiemTraHoatDong; Readln; END. 7.4 Chuyển thành Unit bảng chọn. Chuyển chơng trình con tạo bảng chọn đã xây dựng trong tiết trớc thnh một Unit v đặt vo th viện các Unit chuẩn của Turbo Pascal để sử dụng sau ny. Để một chơng trình khác có thể sử dụng đợc hm tạo bảng chọn, phần giao diện phải cung cấp mẫu hm BangChon v các dữ liệu đầu vo nh vị trí, số mục chọn, mảng các tên mục chọn v bộ mu (mu nền bình thờng v mu khi đợc chọn). Nhận thấy rằng các tham số nói trên đều đã có trong danh sách tham số của hm bảng chọn. Các kiểu dữ liệu word, byte l các kiểu chuẩn đã đợc định nghĩa sẵn. Chỉ có kiểu mang_string mảng các xâu kí tự không phải l một kiểu chuẩn nên phải khai báo nó trong phần giao diện, sau từ khoá Interface. Phần triển khai chi tiết của Unit không có gì khác hơn l thực hiện chi tiết hm bảng chọn nh đã viết trong ví dụ ở tiết 3. Tóm lại, tệp BgChon.pas có nội dung nh sau. Unit BgChon; INTERFACE type mang_string = array[0 7] of string; function BangChon(x,y,SoMucChon:word;TenMucChon:mang_string; MauNen,MauChon: byte): integer; IMPLEMENTATION uses crt; function BangChon(x,y,SoMucChon:word;TenMucChon: mang_string; MauNen,MauChon: byte): integer; const esc=#27; enter =#13; up = #72 ; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 165 Lập trình bằng Turbo Pascal down = #80; var rong: word; {chieu rong bang = nhan muc chon dai nhat} i: integer; {thu tu muc chon hien tai} procedure LamNoiMucChon(i: integer); {lam noi bat muc chon} begin end; procedure LamChimMucChon(i:integer); {thoi lam noi} begin end; procedure VeBangChon; var i: integer; begin end; procedure XuLiGoPhim; var i: integer; gophim: char; begin end; begin {function BangChon} end; {function BangChon} END. {Unit BgChon} Biên dịch tệp BgChon.pas thnh tệp BgChon.tpu v đặt vo th mục các Units chuẩn của Turbo Pascal nh đã hớng dẫn ở trên. Bây giờ có thể kiểm tra thử hoạt động của bảng chọn bằng một chơng trình ngắn gọn nh sau. program testUnitBgChon; uses crt, BgChon; var SoMC: word; TenMC: Mang_String; Chon: integer; Procedure NhapThamSoBangChon; Procedure KiemTraHoatDong; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 166 Lập trình bằng Turbo Pascal BEGIN NhapThamSoBangChon; Chon:= BangChon(10,5,SoMC,TenMC,Blue,Red); KiemTraHoatDong; Readln; END. 8. Một chơng trình ứng dụng. Bi toán: Xây dựng chơng trình quản lí hồ sơ của sinh viên. Chơng trình cần có các chức năng tạo tệp dữ liệu mới, mở tệp dữ liệu đã có, liệt kê ton bộ danh sách, tìm kiếm thông tin về một sinh viên no đó, thêm một sinh viên (vo cuối) danh sách. Cha xét đến việc sửa đổi thông tin, xoá tên một sinh viên khỏi danh sách hay sắp xếp danh sách theo môt trật tự no đó khi thêm vo. 8.1 Phân tích thiết kế 8.1.1 8.1.2 Cấu trúc dữ liệu. Các mục dữ liệu trong hồ sơ của một sinh viên tổ chức thnh một bản ghi. Một danh sách sinh viên ghi lại trên đĩa sẽ l một tệp các bản ghi. Kiểu dữ liệu hồ sơ sinh viên v tệp các hồ sơ sẽ dùng trong chơng trình có thể đợc khai báo nh sau. Type HoSo= Record maso:integer; hoten:String[20]; namsinh:string[2]; end; Var TepHoSo:File of HoSo; Chi tiết bớc 1 Chơng trình gồm hai phần, phần giao diện l một bảng chọn v phần xử lí các yêu cầu của ngời sử dụng. Ta đã xây dựng Unit lm bảng chọn nên bây giờ chỉ cần gọi ra sử dụng. Dới đây sẽ phân tích chi tiết phần xử lí các yêu cầu. Rõ rng cần chia ra 4 mô đun thực hiện 4 chức năng công việc chính nh đặc tả ở trên. 1 - Mở tệp mới hoặc tệp đã có trên đĩa. - Đầu vo: tên tệp cần mở - Đầu ra: tệp đợc mở ra sẵn sng để đọc ra hoặc săn sng để viết vo nếu l tạo tệp mới. Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 167 Lập trình bằng Turbo Pascal 2 - Liệt kê nội dung ton bộ các bản ghi trong tệp. - Đầu vo: tệp đã mở sẵn sng. - Đầu ra: hiển thị ton bộ nội dung các bản ghi có trong tệp ra mn hình. 3 - Tìm kiếm: tìm một bản ghi cụ thể, hiển thị kết quả tìm kiếm lên mn hình. - Đầu vo: tệp đã mở sẵn sng, mã số của sinh viên cần tìm gõ từ bn phím. - Đầu ra: hiển thị nội dung bản ghi tìm thấy hoặc thông báo không tìm thấy. 4- Thêm một bản ghi vo cuối tệp. - Đầu vo: tệp đã mở sẵn sng, mã số của sinh viên v các thông tin khác nhập từ bn phím - Đầu ra: nếu sinh viên cha có trong danh sách thì bản ghi mới đợc thêm vo cuối tệp. Giả sử tên của 4 thủ tục thực hiện các công việc tơng ứng l Mở tệp, Liệt kê, Tìm kiếm, Thêm. Ta có thể viết ngay chơng trình chính, chỉ bao gồm một số lời gọi các mô đun chơng trình con nh dới đây. Chơng trình sử dụng lại chơng trình con lm bảng chọn m ta đã chuyển thnh Unit. BEGIN { chơng trình chính } Clrscr; repeat chon:= BangChon(60,15,SoMC,TenMC,Blue, Red) + 1; case chon of 0:exit; 1:MoTep; 2:LietKe; 3:TimKiem 4:Them; else ; end; until chon = SoMC; END. 8.1.3 Các bớc chi tiết tiếp theo 1- Mở tệp: Chi tiết hơn về các công việc nh sau. 1.1 - Nhập tên tệp cần mở 1.2 - Kiểm tra có tệp trên đĩa hay cha 1.3 - Xử lí khi đã có tệp: mở ra để đọc v thông báo thnh công. Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 168 Lập trình bằng Turbo Pascal 1.4 - Xử lí khi cha có tệp: 1.4.1 - Kiểm tra xem ngời dùng muốn tạo tệp dữ liệu mới hay gõ nhầm tên. 1.4.2 - Trờng hợp 1, tạo tệp mới v thông báo thnh công 1.4.3 - Trờng hợp 2, thoát ra, cho phép lm lại. 2- Liệt kê ton bộ danh sách. Chi tiết các công việc nh sau. 2.1 - Trình by phần tiêu đề để hiển thị danh sách. 2.2 - Đa cửa sổ tệp về đầu tệp. 2.3 - Đọc bản ghi vo biến trung gian v viết ra mn hình. 2.4 - Dịch xuống bản ghi tiếp. 2.5 - Kiểm tra hết tệp, đóng tệp v kết thúc. 3. Tìm kiếm. Các bớc công việc 3.1 - Nhập mã số cần tìm. 3.2 - Tiến hnh tìm kiếm. 3.2.1- Đa cửa sổ tệp về đầu tệp. 3.2.2 - Đọc từng bản ghi vo biến trung gian. 3.2.3 - So sánh với mã số cần tìm 3.2.4 - Dừng khi đã thấy hoặc hết tệp. 3.3 - Hiển thị kết quả. 3.3.1 - Trờng hợp tìm thấy, hiển thị nội dung biến trung gian. 3.3.2 - Trờng hợp không tìm thấy, hiển thị thông báo. 3.4 - Hỏi lại ngời dùng có cần tìm kiếm tiếp hay không. 3.5 - Xử lí tuỳ theo yêu cầu của ngời sử dụng. 3.5.1 - Có: lặp lại việc tìm kiếm 3.5.2 - Không: kết thúc 3.6 - Đóng tệp v kết thúc 4. Thêm hồ sơ mới. Các bớc chi tiết. 4.1 - Nhập mã số cần thêm. 4.2 - Tìm kiếm: gọi thủ tục tìm kiếm ở trên. 4.3 - Xử lí kết quả tìm kiếm 4.3.1 Trờng hợp đã có hiển thị thông báo 4.3.2 Trờng hợp cha có, thêm vo cuối danh sách. 4.3.2.1 Nhập dữ liệu vo biến trung gian 4.3.2.2. Đa cửa sổ tệp về cuối tệp. 4.3.2.3 Viết nội dung của bản ghi trung gian vo tệp. 4.4 - Hỏi lại xem có tiếp tục bổ xung hồ sơ mới không. Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 169 Lập trình bằng Turbo Pascal 4.5 - Xử lí câu trả lời: 4.5.1 Có: lặp lại từ 4.1 4.5.2 Không: sang bớc tiếp theo. 4.6 - Đóng tệp v kết thúc. 8.2 Triển khai chi tiết chơng trình. Dới đây l các mô đun chơng trình con thực hiện 4 chức năng công việc chính nh đã phân tích. 1. Thủ tục Mở tệp procedure MoTep; const Enter = #13; var tenfile: String[32]; begin clrscr; Write(' Cho ten tep '); Readln(tenfile); Assign(TepHoSo,tenfile); {$I-} reset(TepHoSo); {$I+} if ioresult <> 0 then {không có tệp no trùng tên } begin Writeln(' Ban muon tao tep moi ? Enter=Yes '); if ReadKey = Enter then Rewrite(ds) else exit; end; close(ds); Writeln(' Tep da san sang !'); end; 2. Thủ tục Liệt kê procedure LietKe; var i:integer; begin clrscr; reset(TepHoSo); i:=0; writeln(' DANH SACH SINH VIEN '); writeln; writeln(' '); writeln('|TT |MASO | HO TEN |NAM SINH|'); writeln(' '); while not eof(TepHoSo) do begin Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 170 [...]... ĐHQG H nội 174 Lập trình bằng Turbo Pascal 6 Viết thủ tục đệ quy in các phần tử mảng theo thứ tự xuôi, theo thứ tự ngợc 7 Liệt kê mọi hoán vị của n phần tử dùng thuật giải đệ quy 8 Viết thủ tục đệ quy tìm nghiệm bằng phơng pháp chia đôi dần của phơng trình y = exp(x) + sin x - 2 = 0 trên đoạn [0,1] Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 175 Lập trình bằng Turbo Pascal Chơng 12 Con trỏ v cấu trúc dữ... Chơng trình có các chơng trình con: NhapDuLieu, PhanLoai, DiemTB, XetLenLơp Cho trớc chơng trình chính nh sau NhapDuLieu; {thủ tục nhập dữ liệu} PhanLoai (4,6,8); {kém:0 4; trung bình:5,6; khá 7, 8; giỏi: 9,10} Writeln(' Điểm trung bình cả lơp: ', DiemTB); Writeln(' Danh sach học sinh đợc lên lớp '); XetLenLơp 5 Viết hm đệ quy tính số Fibonaci Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 174 Lập trình bằng Turbo. .. 2:LietKe; 3:TimPhanTu; 4:ThemPhanTu; else ; end; until chon = SoMC; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 173 Lập trình bằng Turbo Pascal END Câu hỏi v bi tập 1 Nguyên tắc chung khi thiết kế chi tiết dần từng bớc l gì 2 Các mô đun trong một chơng trình liên kết với nhau bằng cách no 3 Sơ đồ cấu trúc chong trình khác gì với lu đồ thuật giải 4 Khi no thì có thể v cần dùng thuật giải đệ quy 5 So sánh thuật giải... chính l để đáp ứng đòi hỏi trên Nó mang lại khả năng sử dụng bộ nhớ linh hoạt v mềm dẻo hơn, tuy nhiên cũng yêu cầu ngời lập trình phải lm việc nhiều hơn, có trình độ cao hơn Khái niệm biến động đi đôi với biến con trỏ Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 176 Lập trình bằng Turbo Pascal 1.2 Định nghĩa và khai báo 1.2.1 Biến con trỏ Biến con trỏ (Pointer variable) l loại biến đặc biệt, chiếm 2 byte... tiếp phần vùng nhớ đã lu giữ mã của chơng trình stack segment Chơng cha trình v các dùng biến tĩnh Vùng điạ chỉ thấp đã dùng Heap segment đã dùng cha dùng Vùng địa chỉ cao Hình 12.2: Tổ chức bộ nhớ khi thực hiện môt chơng trình Vùng Heap l vùng nhớ dnh để cấp cho các biến động bằng thủ tục New Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 182 Lập trình bằng Turbo Pascal Con trỏ Heap luôn trỏ vo ô nhớ đầu... Type, tên kiểu con trỏ, dấu bằng, dấu mũ, kiểu dữ liệu trỏ tới Type kiểu con trỏ = ^ kiểu dữ liệu ; Var biến con trỏ : kiểu con trỏ ; hoặc Var biến con trỏ : ^ kiểu dữ liêu ; Ví dụ 1: Type RealPtr = ^ Real; Var a,b, kq: RealPtr; hoặc Var a,b, kq: ^ Real; Ví dụ 2: Type Sv = Record Ho_dem: string[24]; Ten: string[8]; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 177 Lập trình bằng Turbo Pascal diemm_tb: real; end;... chơng trình hay chơng trình con thì phải khai báo Sau khi đã khai báo, tức l đã đăng kí tên v kiểu dữ liệu của biến ở đầu chơng trình, chơng trình con thì ta có thể yên tâm sử dụng m không cần phải lm thêm bất cứ viêc no khác Mọi công việc về quản lí các biến sẽ do trình biên dịch v hệ điều hnh đảm nhiệm Chúng sẽ đợc cấp phát vùng nhớ khi bắt đầu chơng trình, chơng trình con v đợc giải phóng khi chơng trình, ... thông tin về phần tử no đó trong danh sách; Duyệt qua mọi phần tử ,v.v Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 1 87 Lập trình bằng Turbo Pascal 1.2 Danh sách biểu diễn bằng cấu trúc mảng Theo mô tả các đặc trng của danh sách ở trên, dễ thấy rằng ta có thể triển khai xây dựng một danh sách bằng cấu trúc mảng Để thể hiện đợc kích thớc thay đổi của danh sách cần xét kèm thêm một biến để ghi số phần tử hiện... con trỏ ny trỏ đến một địa chỉ cụ thể no đó bằng các cách nh sau 1- Gán trực tiếp địa chỉ của một biến tĩnh cho con trỏ cùng kiểu dữ liệu, dùng toán tử lấy địa chỉ @ Lệnh gán ny lm cho biến con trỏ sẽ trỏ đến biến đó: biến con trỏ = @ biến tĩnh ; Ví dụ Var i: Integer; ip: ^Integer; ip:= @ a ; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 178 Lập trình bằng Turbo Pascal 2- Dùng các thủ tục New hoặc GetMem... Hoá, Viện CNTT - ĐHQG H nội 184 Lập trình bằng Turbo Pascal 2 Phân biệt biến tĩnh v biến động Các biến tĩnh đợc cấp phát vùng nhớ khi no Các bién động đợc cấp phát vùng nhớ bằng cách no 3 Câu lênh GetMem khác với New ở điểm no Nó có thể dùng để cấp phát vùng nhớ cho các biến động kiểu gì Có thể dùng FreeMem để giải phóng vùng nhớ cấp phát bởi New hay không 4 Trong một chơng trình có các khai báo v câu . yêu cầu ngời lập trình phải lm việc nhiều hơn, có trình độ cao hơn. Khái niệm biến động đi đôi với biến con trỏ Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 176 Lập trình bằng Turbo Pascal 1.2. đệ quy tìm nghiệm bằng phơng pháp chia đôi dần của phơng trình y = exp(x) + sin x - 2 = 0 trên đoạn [0,1]. Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 175 Lập trình bằng Turbo Pascal Chơng 12. néi 173 Lập trình bằng Turbo Pascal END. Câu hỏi v bi tập 1. Nguyên tắc chung khi thiết kế chi tiết dần từng bớc l gì. 2. Các mô đun trong một chơng trình liên kết với nhau bằng