Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 39 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
39
Dung lượng
1,07 MB
Nội dung
Trang 46 CHƯƠN G : HÀM VÀ THỦ TỤC Mã chương: MH15-04 Mục tiêu : - Trình bày khái niệm hàm, thủ tục; - Trình bày qui tắc xây dụng hàm, thủ tục vận dụng thiết kế xây dựng chương trình; - Phân biệt cách sử dụng tham số, tham biến; - Sử dụng lệnh kết thúc lấy giá trị trả hàm - Thực thao tác an tồn với máy tính Nội dung : Khái niệm chương trình Mục tiêu: Trình bày khái niệm hàm, thủ tục Trong chương trình, có đoạn cần phải lập đi, lập lại nhiều lần chỗ khác Để tránh phải viết lại đoạn người ta thường phân chương trình thành nhiều module, module giải cơng việc đó, module chương trình (subprogram) Một tiện lợi khác việc sử dụng module ta dễ dàng kiểm tra tính đắn trước ráp nối vào chương trình Do việc xác định sai sót tiến hành điều chỉnh chương trình thuận lợi Trong Pascal chương trình viết dạng hàm (FUNCTION) thủ tục (PROCEDURE) Hàm thủ tục chương trình con, hàm khác thủ tục chỗ hàm trả giá trị cho lệnh gọi thơng qua tên hàm cịn thủ tục khơng Do ta dùng hàm thoả mãn yêu cầu sau : - Ta muốn nhận kết mà - Ta cần dùng tên chương trình (chứa kết đó) để viết biểu thức Nếu không thỏa hai yêu cầu ta dùng thủ tục Cấu trúc chương trình có sử dụng chương trình Mục tiêu: Trình bày cấu trúc chương trình có sử dụng chương trình Trong chương trình chương trình bố trí sau phần khai báo biến Cấu trúc tổng qt chương trình ngơn ngữ Pascal sau: PROGRAM tên_chương_trình; USES tên Unit (*Khai báo đơn vị chương trình cần thiết*) Trang 47 LABEL (*Khai báo nhãn*) CONST (*Khai báo hằng*) TYPE (*Định nghĩa kiểu liệu mới*) VAR (*Khai báo biến*) PROCEDURE Tên_CTC1 (danh sách tham số hình thức); Begin ………………… (*thân thủ tục thứ nhất*) End; PROCEDURE Tên_CTC2 (danh sách tham số hình thức); Begin ………………… (*thân thủ tục thứ hai*) End; FUNCTION Tên_Hàm1(danh sách tham số hình thức); Begin ………………… (*thân hàm thứ nhất*) End; FUNCTION Tên_Hàm2(danh sách tham số hình thức); Begin ………………… (*thân hàm thứ nhất*) End; ………………… BEGIN ………………… (*chương trình chính*) END Các hàm thủ tục ngơn ngữ lập trình Mục tiêu: Trình bày qui tắc xây dựng hàm, thủ tục vận dụng thiết kế xây dựng chương trình 3.1 Hàm 3.1.1 Cấu trúc hàm Hàm chương trình tính tốn trả cho ta giá trị kiểu vô hướng Cấu trúc hàm sau: FUNCTION [(:[;: ])]: ; (Header) [VAR :[;: ]] Khai báo Trang 48 biến cục có BEGIN Thân hàm END; Bảng 1.7 Cấu trúc hàm - Tên hàm danh biểu, phải tuân thủ theo qui tắc đặt danh biểu đề cập chương I - Một hàm khơng có có nhiều tham số Trong trường hợp có nhiều tham số có kiểu liệu ta viết chúng cách dấu , (phẩy) Ngược lại, tham số hình thức khác kiểu phải cách dấu ; (chấm phẩy) - KiểuKQ kiểu vơ hướng, phản ảnh kiểu giá trị mà hàm trả lại sau chạy xong Ví dụ, ta khai báo hàm sau: FUNCTION TEST(x,y:Integer; z:Real): Real; Đây hàm có tên TEST, với tham số, x y thuộc kiểu Integer, z thuộc kiểu real, hàm trả kết kiểu real - Trong hàm, ta sử dụng hằng, kiểu, biến dùng riêng nội hàm - Thông thường mục đích sử dụng hàm để lấy trị trả cần lưu ý gán kết cho tên hàm thân hàm 3.1.2 Phương pháp gọi hàm Lời gọi hàm chương trình đươch thực sau: Tên_hàm (danh sách tham số thực) 3.1.3 Ví dụ Ví dụ 1: Ta xây dựng hàm DT truyền tham số vào bán kính hình trịn, hàm trả diện tích hình trịn Program TinhDienTich; Uses Crt; VAR BanKinh: real; Ch: Char; { } Function DT(Radius:Real):Real; Begin DT := PI * Radius* Radius; End; Phép gán để trả giá trị cho tên hàm Trang 49 { } Begin Clrscr; Repeat Write(‘Nhập bán kính: ’); Readln(BanKinh); Writeln(‘Diện tích hinh tron tuong ung: ‘ ,DT(Bankinh):0:2); Writeln; Write(‘Tiếp tục (C/K)? ’); Repeat ch:=readkey; Until Upcase(ch) in [‘C’,’K’]; Until UpCase(Ch) = ‘K’; {Lưu ý: ‘K’ in hoa} End Ví dụ 2: Program TinhGiaithua; USES CRT; Var Num:longint; Ch:char; X,Y:byte; { -} Function GiaiThua(m: longint): longint; Var Tam, Dem:Longint; BEGIN IF (M=0); Writeln(M,’! = ’,GiaiThua(Num)); REPEAT Write(‘Tinh nua khong ? (C/K) :’); CH:=READKEY; Trang 50 UNTIL Upcase(Ch) in [‘C’,’K’]; Writeln(Ch); UNTIL Upcase(Ch)=’K’; Readln END 3.2 Thủ tục 3.2.1 Cấu trúc thủ tục Cấu trúc thủ tục sau: PROCEDURE (:[;: ]): ; (Header) [VAR :[;: ] Khai báo biến cục có BEGIN Thân thủ tục END; Bảng 1.8 Cấu trúc thủ tục Như cấu trúc thủ tục tương tự cấu trúc hàm Chỉ có hai điều khác: - Header khóa Procedure thay Function - Khơng có câu lệnh gán thân Procedure 3.2.2 Phương pháp gọi thủ tục Lời gọi thủ tục chương trình thực sau: Tên_thủ tục (danh sách tham số thực) 3.2.3 Ví dụ: Thủ tục INSO sau in số từ đến giá trị biến truyền vào Với n tham số thực tế, So tham số hình thức Program TEST; Trang 51 Var n: Integer; { -} Procedure INSO(So: Integer); Var i: Integer; Begin For i := to So Write( i:10 ); End; { Chương trình } Begin Write(‘Nhập số lớn không: ’); Readln(n); INSO( n ); Readln; End 3.3 Bài tập Nội dung - Cách thức xây dựng thủ tục chương trình - Việc gọi thủ tục thực chương trình - Cách thức xây dựng hàm chương trình - Việc gọi hàm thực chương trình - Cách truyền tham số cho hàm 3.3.1 Xây dựng thủ tục cho tập sau Bài 1: Tìm lỗi sai: Var i, a: integer; procedure thutuc1(int a); void main() { a:=4; for i:=0 to Ham1(a); } Procedure thutuc1(int a) { for i:=0 to writeln(‘a= ‘,a); } Bài 2: Viết thủ tục kiểm tra số nguyên n có phải số ngun tố hay khơng? Bài 3: Viết thủ tục kiểm tra số nguyên n có phải số phương hay khơng? (25=52, 16=42, 9=32; số 25, 16, số phương) Bài 4: Viết thủ tục tính n! (n số nguyên nhập vào từ bàn phím) Bài 5: Viết thủ tục tìm UCLN BCNN hai số nhập vào từ bàn phím Hướng dẫn Trang 52 Bài 1: Sinh viên tự làm Bài 2: Thuật toán: - Viết thủ tục Procedure ktra_ngto(int x): kiểm tra x có phải số nguyên tố hay không o Khai báo biến i, ktra o Cho biến đếm i chạy từ đến x Nếu x mod i = o Kiểm tra i=x x số nguyên tố, ngược lại x khơng phải số ngun tố - Chương trình chính: o Khai báo biến n, kq o Nhập số n o Gọi thủ tục với số giá trị n vừa nhập vào: ktra_ngto(n) Chương trình: Bài 5: Thuật toán: - Viết thủ tục Procedure USCLN(int a, int b): tìm ước số chung lớn hai số a b o Lấy trị tuyệt đối hai số a b o Chừng (a!=0 b!=0) làm Nếu a>b a=a-b Ngược lại, b=b-a o Nếu a = = b USCLN o Ngược lại, a USCLN - Viết thủ tục Procedure BSCNN(int a, int b): tìm bội số chung nhỏ hai số a b o BSCNN= (a*b)/USCLN(a,b) - Chương trình chính: o Khai báo biến a, b, US, BS o Nhập hai số a,b o Gọi thủ tục: USCLN(a, b) BSCNN(a, b) o Xuất BS, US hình 3.3.2 Xây dựng hàm cho tập sau: Bài 1: Viết hàm tính tổng chữ số số nguyên Viết chương trình nhập vào số nguyên, dùng hàm kiểm tra xem số có chia hết cho khơng (Một số chia hết cho tổng chữ số chia hết cho 3) Bài 2: Viết hàm tìm tất ước số số nguyên n (n nhập vào từ bàn phím) In ước số đếm có ước số Bài 3: Viết chương trình tính tổng sau: - S=1+x+x2+x3+…+xn Trang 53 - S= - x +x2- x3+ (-1)nx n - S=1+ 1/2!+…+1/n! Hướng dẫn Bài 1: Thuật toán: - Viết hàm (function) tong_cacchuso(int n): Tính tổng chữ số số nguyên n o Khai báo biến S, t o Gán S=0 o Chừng n>0 làm t=t%10 n=n/10 S=S+t o Hàm tong_cacchuso(int n) trả giá trị S - Chương trình chính: o Khai báo biến n, tong o Nhập số nguyên n từ bàn phím o Gọi hàm: tong = tong_cacchuso(n) Nếu tong%3= =0 n chia hết cho Chương trình: Bài 2: Thuật tốn: - Viết hàm (function) tim_uoc_so(int n): Tìm ước số số nguyên n o Khai báo biến i, count o Gán count=0; o Cho i chạy từ đến n Nếu n%i= = in i hình count=count+1 o Xuất count hình - Chương trình chính: o Khai báo biến n o Nhập số nguyên n từ bàn phím o Gọi hàm: tim_uoc_so(n) Chương trình: Bài 3a: Thuật toán: - Viết hàm (function) tong_luythua(int x, int n): Tìm ước số số nguyên n o Khai báo biến i, S o Gán S=1 o Cho i chạy từ đến n S=S+pow(x,i) Trang 54 o Hàm tong_luythua(int x, int n) trả giá trị S - Chương trình chính: o Khai báo biến x, n, tongS o Nhập số nguyên x, n từ bàn phím o Gọi hàm: tongS = tong_luythua(x, n) o Xuất tongS hình Chương trình: Sinh viên tự viết chương trình dựa thuật toán đưa Bài 3b: Sinh viên tự làm (tham khảo câu a) Bài 3c: Thuật toán: - Viết hàm (function) giai_thua(int n): Tính n giai thừa (n số nguyên dương) o Khai báo biến i, gth o Gán gth=1 o Cho i chạy từ đến n gth=gth*i o Hàm giai_thua(int n) trả giá trị gth - Chương trình chính: o Khai báo biến i, n, tong_gt o Gán tong_gt=0 o Nhập số nguyên n từ bàn phím o Cho i chạy từ đến n Gọi hàm: tong_gt = tong_gt+1/giai_thua(i) o Xuất tong_gt hình Chương trình: Sinh viên tự viết chương trình dựa thuật tốn đưa Tham trị tham biến Mục tiêu: Phân biệt cách sử dụng tham trị, tham biến; Các tham số chương trình liệu cần thiết nhập vào để xử lý phép toán chương trình sử dụng Các tham số gọi tham số hình thức, mang danh nghĩa đối số chương trình con, mặt chất liệu lại mang thơng tin biến chương trình Các tham số có loại: Tham biến Tham trị Các chương trình có nhiều loại tham số hình thức khác kiểu tham số hay kiểu liệu tham số 4.1 Tham biến Tham biến: Là loại tham số hình thức mà giá trị thay đổi phép xử lý tính tốn chương trình Có thể liệu nạp vào chương trình A, sau khỏi chương trình (kết sau thực chương trình con) lại mang kết B Tham biến tham số hình thức khai báo chương trình bắt buộc phải khai báo với từ kháo khai báo VAR Các chương trình có nhiều loại tham biến, Trang 55 cách khai báo tham biến giống hệt bạn khai báo biến chương trình 4.2 Tham trị Tham trị: Là loại tham số hình thức mà giá trị khơng thể thay đổi phép xử lý tính tốn chương trình Dữ liệu nạp vào chương trình A, sau khỏi chương trình (kết sau thực chương trình con) phải A Chính vậy, chương trình bạn khơng thể thực phép toán làm thay đổi giá trị tham trị, có máy báo lỗi.Tham trị tham số hình thức khai báo chương trình khơng bắt buộc phải khai báo với từ kháo khai báo VAR Các chương trình có nhiều loại tham trị, cách khai báo tham trị giống hệt bạn khai báo biến chương trình 4.3 Bài tập Trong chương trình đây, thủ tục TT có hai tham số a b : a tham số trị b tham số biến Hãy cho biết giá trị hai biến x, y chương trình trước sau gọi thủ tục TT: PROGRAM VIDU13_1; Var x, y: Integer; PROCEDURE TT( a : integer ; Var b:integer); Begin a:=a+6; b:=b+8; Writeln(‘a= ’, a); Writeln(‘b= ’, b); End; BEGIN x:=4; y:=7; TT(x,y); {14} Writeln(‘x= ’, x); {15} Writeln(‘y= ’, y); {16} Readln; END Chương trình sau nhập vào hai cạnh a, b hình chữ nhật sử dụng thủ tụcđể tính diện tích chu vi Viết chương trình hốn đổi giá trị hai số nguyên a,b Yêu cầu: Sử dụng theo hai cách sau: - Tham số hình thức tham trị Trang 70 Têntrườngk : Kiểudliệuk; End; Ví dụ 1: Ta định nghĩa kiểu KSVIEN sau: TYPE KSVIEN = RECORD Hoten:String[20]; Maso : String[8]; Toan, Ly, DTB: Real; End; Theo mơ tả trên, ta có kiểu liệu đặt tên KSVIEN có cấu trúc ghi gồm trường (thuộc tính) là: Tên trường Hoten Massso Toan Ly DiemTB Kiểu liệu String(20) String(8) Real Real Real Ý nghía Họ tên sinh viên Mã số sinh viên Điểm toán sinh viên Điểm lý sinh viên Điểm trung bình sinh viên Ví dụ 2: Ta mô tả thời gian kiểu KDATE có ba trường ngày , tháng, năm sau: TYPE KDATE = RECORD Ngay : 31; Thang : 12; Nam : Integer; End; Trang 71 Ví dụ 3: Ðể quản lý sách thư viện, ta xây dựng kiểu ghi KSACH sau: TYPE KSACH = RECORD Ma_so_sach: String[6]; Ten_doc_gia: String[20]; Nam_xban :Integer; Gia_tien: Real; Ngay_muon : KDATE; End; Kiểu KSACH ghi có trường mơ tả thuộc tính sách là: mã số sách, tên độc giả, năm xuất bản, gía tiền ngày mượn Ví dụ cho thấy ghi mơ tả lồng nhau: kiểu liệu trường ghi lại kiểu ghi khác định nghĩa trước Trong ghi KSACH, Ngay_muon trường có kiểu liệu ghi kiểu KDATE Mỗi đối tượng cần quản lý có nhiều trường, song tùy yêu cầu quản lý mà ta lựa chọn khai báo trường thật cần thiết Khai báo thừa hao phí nhớ, thiếu cơng tác quản lý khó khăn thiếu thơng tin Vì vậy, nên khai báo trường với số lượng đủ dùng 4.2 Sử dụng ghi Kiểu ghi sau định nghĩa dùng khai báo cho biến Ví dụ : Var X, Y, Z : KSVIEN; Trong KSVIEN ghi mô tả phần Trang 72 Theo khai báo này, X ,Y Z ba biến kiểu ghi KSVIEN, biến có trường Hoten, Maso, Toan, Ly DTB Ðể thâm nhập vào trường ghi ta viết tên biến kiểu ghi, sau dấu chấm ‘.’ tên trường, tức : Tênbiến Têntrường Các lệnh gán gía trị cho trường biến X : X.Hoten :=‘Nguyen Van An’; X.Maso :=‘1973208’; X.Toan :=8.0; X.Ly :=7.0; X.DTB :=(X.Toan+X.Ly)/2; Ðể nhập liệu cho trường Hoten biến Y, ta viết: Write(‘Nhap ho ten sinh vien Y : ‘); Readln(Y.Hoten); Sở dĩ phải viết tên biến ghi trước tên trường để xác định trường biến ghi Mỗi biến X, Y, Z có trường Hoten, nên viết Hoten thơi khơng biết Hoten ai: X, Y hay Z ? Còn viết X.Hoten rõ Hoten biến X Như vậy, trường biến ghi thâm nhập sử dụng biến bình thường X.Hoten biến kiểu String[20], X.Maso biến kiểu String[8], , X.DTB biến kiểu Real Ðối với ghi lồng nhau, cách truy xuất đến trường tương tự Ví dụ: Cho khai báo biến S kiểu KSACH: Var S : KSACH ; Ðể truy nhập đến trường Ngay, Thang, Nam Ngay_muon ta viết : S.Ngay_muon.Têntrường Trang 73 Chẳng hạn gán : S.Ngay_muon.Ngay := 2; S.Ngay_muon.Thang := 9; S.Ngay_muon.Nam := 1999; Hai biến ghi kiểu gán cho Lệnh : Y:=X; gán gía trị trường biến X cho trường tương ứng biến Y Vậy lệnh tương đương với khối lệnh sau : begin Y.Hoten :=X.Hoten; Y.Maso :=X.Maso; Y.Toan :=X.Toan; Y.Ly :=X.Ly; Y.DTB :=X.DTB; end; Các ghi so sánh khác nhau: Ví dụ: If X=Y then writeln(‘ X Y người ‘); If XY then writeln(‘ X khác Y ‘); Tuy nhiên khơng có phép so sánh = cho ghi Hai ghi hốn đổi gía trị cho theo nghĩa hốn đổi cặp gía trị trường tương ứng Giống biến đơn giản, để hoán đổi hai ghi X Y ta dùng ba lệnh: Z:=X; X:=Y; Y:=Z; Z biến trung gian kiểu ghi với X Y Trang 74 Ví dụ: Nếu biến X Y có trường tương ứng : X.Hoten =‘Nguyen Van An’ Y.Hoten =‘Tran Thi Nga’ X.Maso =‘1973208’ Y.Maso =‘1974564’ X.Toan =8.0 Y.Toan =5.0 X.Ly =7.0 Y.Ly =8.0 X.DTB =7.5 Y.DTB =6.5 sau hốn đổi, ta : X.Hoten =‘Tran Thi Nga’ Y.Hoten =‘Nguyen Van An’ X.Maso =‘1974564’ Y.Maso =‘1973208’ X.Toan =5.0 Y.Toan =8.0 X.Ly =8.0 Y.Ly =7.0 X.DTB =6.5 Y.DTB =7.5 4.3 Câu lệnh WITH Khi làm việc với nhiều trường biến ghi cách thâm nhập tỏ rườm rà phải viết nhiều lần tên biến trước tên trường Ðể đơn giản cách viết, Pascal đưa câu lệnh : WITH Tênbiến DO Lệnh; Tên biến thuộc kiểu ghi Nếu Lệnh có truy xuất đến trường Tên biến khơng cần phải viết Tên biến dấu chấm trước tên trường Ví dụ, thay viết: X.Hoten:= ‘Nguyen Van An’; ta viết : WITH X DO Hoten:= ‘Nguyen Van An’; Ðể in trường biến X lên hình, ta viết: WITH X DO Trang 75 Begin Writeln(‘ Họ tên :’ , Hoten); Writeln(‘ Mã số sinh viên :’ , Maso); Writeln(‘ Ðiểm Toán :’ , Toan: 4:1); Writeln(‘ Ðiểm Lý :’ , Ly: 4:1); Writeln(‘ Ðiểm trung bình : ‘ , DTB :4:1); End; Tất tên trường nằm khối begin end hiểu trường biến X (nếu không ghi rõ tên biến khác) Các lệnh sau gán gía trị cho trường biến S kiểu KSACH ghi lồng nhau: WITH S DO begin Ma_so_sach:=‘TH-435’; Ten_doc_gia:=‘Nguyen van Mai’; Nam_xban :=1999; Gia_tien:= 15000; WITH Ngay_muon DO begin Ngay:=2; Thang:=9; Nam:=1999; end; end; 4.4 Bản ghi có cấu trúc thay đổi Các kiểu Record trình bày kiểu Record cố định số phần cấu trúc cua Record cố định Bên cạnh Pascal cịn cho phép lập Record có phần cấu trúc thay đổi Trước hết, ta xét ví dụ sau: mục NhanSu, ta xét thêm trường NgheNghiep có nhiều trường hợp xảy ra, chẳng hạn: - Công nhân : Cần ghi rõ ngành ? Bậc thợ ? - Kỹ sư : Ngành ? Trình độ thực tế ? - Bác sĩ : Chuyên khoa ? - Cá biệt : Khơng ghi thêm ? Tuy ta lập Record gồm đầy đủ trường kể “cồng kềnh” (trong người thời điểm có ngành nghề) chiếm nhiều ô nhớ Trang 76 Tiếp theo ta lập bốn kiểu Record giống phần đầu (HoDem, Ten, NgaySinh, Luong, CoGiaDinh) khác phần cuối nghề nghiệp (NgheNghiep), tức có trường tương ứng với bốn nghề khác Cách làm “cồng kềnh” chương trình ta phải dùng đến bốn kiểu Record Ngơn ngữ Pascal cho phép lập Record có dạng sau để tiết kiệm ô nhớ cho phép linh hoạt sử dụng: Type Nghe = (CongNhan, KySu, BacSi, CaBiet); Nganh = (KhaiThac, CoKhi, CheBien, Nuoi, KinhTe); Khoa = (Noi, Ngoai, Nhi, Phu); NhanSu = Record HoDem: String[20]; Ten: String[7]; NgaySinh: Date; Luong: Real; CoGiaDinh: Boolean; CASE NgheNghiep: Nghe Of CongNhan: (NganhCN: Nganh; BacTho: Byte); KySu: (NganhKS: Nganh; TrinhDoTT: (Kem, TB, kha, Gioi)); BacSi: (ChuyenKhoa: Khoa); CaBiet: (); END; { Of Record } Var NV, NV1: NhanSu; Begin With NV Begin HoDem := ‘Vo Thanh’; Ten := ‘Chau’; NgheNghiep := CongNhan; NganhCN := CoKhi; BacTho := 3; End; With NV1 Begin HoDem := ‘Huynh Dinh’; Ten := ‘Can’; NgheNghiep := KySu; NganhKS := KinhTe; TrinhDoTT := Kha; End; END Trang 77 Giải thích : - HoDem, Ten, NgaySinh, CoGiaDinh thành phần cố định Record NhanSu - NganhCN, NganhKS, BacTho, TrinhDoTT, ChuyenKhoa thành phần thay đổi Record NhanSu - Trong khai báo kiểu Record, có thành phần thay đổi phải đặt sau thành phần cố định phép có trường thay đổi - Phần thay đôi nằm sau danh sách bắt đầu câu lệnh CASE (Phần thay đổi lại chứa Record khác có kiểu cấu trúc thay đổi) Lưu ý : - Phần thay đổi trường gọi trường đánh dấu (Tag Field) đặt câu lệnh CASE (Ví dụ NgheNghiep) Ứng với giá trị trường đánh dấu, ta có biến dạng Record với danh sách trường tương ứng đặt sau nhãn lệnh CASE toàn danh sách phải đặt hai dấu ngoặc đơn () rỗng trường hợp CaBiet ví dụ - Trường mô tả phải kiểu đơn giản (Byte, Integer, Word, LongInt, Real, Double, Char, Boolean) - Tất tên biến phần thay đổi bắt buột phải khác Theo ví dụ trên, Nganh hai trường hợp NgheNghiep CongNhan KySu ký hiệu hai tên khác là: NganhCN NganhKS 4.5 Bài tập Bài 1: Viết chương trình thực phép cộng số phức Bài 2: Viết chương trình quản lý điểm thi Tốt nghiệp sinh viên với môn thi: Cơ sở chuyên ngành Nội dung công việc quản lý bao gồm: Nhập điểm cho sinh viên In danh sách sinh viên hình Thống kê số lượng sinh viên thi đậu In hình hình danh sách sinh viên bị thi lại Bài 3: Viết chương trình quản lý sách thư viện gồm trường sau: Mã số sách, Nhan đề, Tên Tác giả, Nhà Xuất bản, Năm xuất a/ Nhập vào kho sách thư viện (gồm tất trường) b/ In hình tất sách có thư viện c/ Tìm sách có mã số nhập vào từ bàn phím Nếu tìm thấy in hình thơng tin đầy đủ sách đó, ngược lại thơng báo khơng tìm thấy Trang 78 d/ Tìm in hình tất sách có tác giả nhập vào từ bàn phím e/ Lọc sách xuất năm Trang 79 CHƯƠNG : D Ữ LIỆU K IỂU CHUỖI Mã chương: MH15-06 Nội dung chính: Chuỗi (String) kiểu liệu có cấu trúc dùng để xử lý chuỗi ký tự Kiểu String có nhiều điểm tương tự kiểu mảng (Array) có điểm khác là: số ký tự biến kiểu chuỗi thay đổ cịn số phần tử kiểu mảng ln cố định Mục tiêu: - Trình bày khái niệm liệu kiểu chuỗi kí tự ; - Biết sử dụng liệu kiểu chuỗi chương trình ; - Áp dụng phép tốn chuỗi ; Khai báo phép toán Mục tiêu: Biết khai báo sử dụng phép toán chuỗi 1.1 Khai báo kiểu chuỗi VAR Tên_Biến:String[n]; Trong đó: n số ký tự tối đa có chuỗi Chiều dài tối đa chuỗi 255 Nếu phần khai báo không ghi [n] chuỗi có độ dài mặc định 255 Ví dụ: Var HoTen:String[30]; { HoTen chứa tối đa 30 ký tự } St:String; { St chứa tối đa 255 ký tự } Với St chuỗi, để ký tự thứ i St ta viết St[i] Các St[i] có kiểu Char Ví dụ: St := ‘ABCD’; lệnh Write(St[4]) in ký tự ‘D’ Cấu trúc String sau: Trong nhớ chiếm số Byte số ký tự tối đa, cộng với byte (tại vị trí s[0]) chứa ký tự mà mã thập phân ASCII ký tự cho biết chuỗi có độ dài Chẳng hạn biến HoTen bên gán giá trị: HoTen:=‘Nguyen Van An’; Khi đó, độ dài chuỗi 13, độ dài cực đại cho phép 30 khai báo Sau cấu trúc chuỗi HoTen: Chr(13) N G u y E N Chú ý: * ký tự không xác định 1.2 Các phép toán chuỗi V a 10 11 12 13 n A n … * 30 … * Trang 80 1.3 Phép gán Biến:= Biểu_thức; Đại lương bên phải lệnh phải đặt hai dấu nháy đơn chuỗi dạng Ta sử dụng dấu cộng (+) để ghép chuỗi gán Ví dụ: HoTen:=‘Nguyen Van‘+‘ An‘; 1.4 Phép nối chuỗi Ký hiệu dấu + Ví dụ: ‘Turbo’+‘ Pascal‘= ‘Turbo Pascal‘ 1.5 Các phép toán so sánh Khi so sánh hai chuỗi, ký tự hai chuỗi so sánh cặp từ trái qua phải theo giá trị bảng mã ASCII Ví dụ: Nếu so sánh: ‘ABC’=‘ABC’ có giá trị True ‘ABC’=‘AB’ có giá trị False ‘ABCD’‘AD’ có giá trị False Nhập in chuỗi Mục tiêu: Biết cách nhập in chuỗi Muốn in chuỗi ký tự ta dùng lệnh Write(St) Writeln(St) Lệnh Readln(St) đọc ký tự cho chuỗi St với độ dài thực số ký tự gõ vào từ bàn phím Nếu ta gõ ln mà khơng nhập cho ký tự St chuỗi rỗng Các thủ tục hàm làm việc với chuỗi Mục tiêu: Vận dụng thủ tục hàm xử lý chuỗi 3.1 Các thủ tục 3.1.1 Insert(Obj, St, Pos) Chèn vào chuỗi ký tự St chuỗi ký tự Obj kể từ vị trí Pos Ví dụ: St:=‘Thh’; Insert(‘an’,St,3); Writeln(‘Xau ky tu sau chen them la: ‘,St); {Sẽ ‘Thanh’} 3.1.2 Delete(St, Pos, Num) Xóa bỏ chuỗi ký tự St vị trí thứ Pos số ký tự Num Ví dụ: St:=‘Truong Hoc’; Trang 81 Delete(St,4,6); Writeln(‘Xau ky tu sau xoa bot la: ‘,St); {Sẽ ‘Truc’} 3.1.3 Thủ tục Str(Value, St) Sẽ biến đổi giá trị số nguyên số thực Value thành dãy ký tự biểu diễn số Cách biểu diễn St qui định qui cách Value Ví dụ: i:=1234; Str(i:5,St); {ta St = ‘1234’ có ký tự} x:=123.5678901; Str(x:10:5,St); {ta St = ‘ 123.56789’} 3.1.4 Thủ tục Val(St, Var1, Code): Sẽ biến đổi chuỗi ký tự St (biểu diễn số nguyên hay số thực) thành số nguyên hay số thực chứa Var1 Với: Code số nguyên để phát lỗi: Code = tức phép biến đổi Nếu St không biểu diễn số nguyên hay số thực Code nhận giá trị vị trí ký tự sai chuỗi St (Code 0) Ví dụ: X biến thực, St = ‘123.56’, Result biến nguyên Val(St, X, Result); Kết qủa: X = 123.56 Result = X biến nguyên, St = ‘123’, Result biến nguyên Val(St, X, Result); Kết qủa: X = 123 Result = X biến thực, St = ‘123.56A’, Result biến nguyên Val(St, X, Result); {St biểu diễn không đúng} Kết qủa: X không xác định Result = 3.2 Các hàm 3.2.1 Hàm Lenght(St) Kết qủa nhận độ dài chuỗi ký tự St Ta tự viết lại hàm Length sau: Function Length(St: String): Byte; Begin Length := Ord(St[0]); End; 3.2.2 Hàm Copy(St, Pos, Size) Trang 82 Sao chép chuỗi lý tự St vị trí Pos nhận Size ký tự Ví dụ: St = ‘ABCDEF’ lệnh Copy(St, 3, 2) = ‘CD’ Copy(St, 4, 10) cho ta ‘DEF Ghi chú: - Nếu Pos + Num > Length(St) hàm trả ký tự chuỗi St - Nếu Pos > Length(St) hàm Copy trả cho ta chuỗi rỗng 3.2.3 Hàm Concat(St1, St2, , Stn) Hàm dùng để ghép tất chuỗi ký tự St1, St2, , Stn thành chuỗi theo thứ tự đối số cung cấp cho hàm Ghi chú: - Số lượng đối hàm Concat phải >= - Nếu tổng số chiều dài chuỗi >255 máy báo lỗi - Có thể dùng phép cộng (+) để ghép chuỗi ký tự Ví dụ: St:=Concat(St1,St2+’N’); 3.2.4 Hàm Pos(St1, St2) Hàm trả số nguyên biểu diễn vị trí St1 gặp chuỗi St2 Nếu khơng tìm thấy Pos=0 Trong đó: St1, St2 biểu thức chuỗi ký tự Ví dụ: St:=‘ABCDEFGBCD’ Pos(‘DE’,St)=4, Pos(‘BCD’,St)=2, Pos(‘XY’,St) = Bài tập Câu Viết thủ tục để kiểm tra nhập chuỗi ký tự số nguyên S, tính tổng chữ số chuỗi S, đảo chuỗi Câu Viết chương trình đổi ký tự chữ hoa chữ thường Câu viết chương trình cắt ký tự trống bên trái chuỗi ký tự Câu Viết chương trình cắt ký tự trống bên phải chuỗi ký tự Câu Viết chương trình cắt ký tự trống chuỗi ký tự Câu Viết chương trình kiểm tra chuỗi nhập vào từ bàn phím có đối xứng hay khơng Ví dụ: - Chuỗi ‘ABCDCBA’ đối xứng - Chuỗi ‘ABCDABC’ khơng đối xứng Câu Viết chương trình đếm số lần xuất ký tự chuỗi Câu Viết chương trình nhập vào chuỗi từ bàn phím, tách chuỗi gồm n ký tự từ ví trí định Trang 83 Câu Viết chương trình nhập vào câu ca dao, tục ngữ Hãy đếm xem câu có từ Trang 84 TÀI LIỆU THAM KHẢO [1] Qch Tuấn Ngọc Ngơn ngữ lập trình Pascal NXB Thống kê - năm 2001 [2] Hoàng Hồng Lập trình Turbo Pascal 7.0 NXB Thống kê - năm 2007 [3] Bùi Thế Tâm Turbo Pascal 7.0 NXB Giao thông vận tải - năm 2006 [4] Nguyễn Đình Tê Borland Pascal 7.0 NXB Lao động xã hội – năm 2007 [5] Vũ Đức Khánh Kỹ lập trình Pascal NXB Văn hóa thơng tin – năm 2010 [6] Nhiều tác giả Giáo trình Turbo Pascal NXB Giao thông vận tải - năm 2007 ... chương trình 4.2 Tham trị Tham trị: Là loại tham số hình thức mà giá trị thay đổi phép xử lý tính tốn chương trình Dữ liệu nạp vào chương trình A, sau khỏi chương trình (kết sau thực chương trình. .. trình có tầm tác dụng thân chương trình chương trình Biến khơng có tác dụng chương trình cấp khác chương trình chương trình khác Điều có nghĩa chương trình chương trình mẹ có nhiều biến trùng tên,... Các chương trình có nhiều loại tham trị, cách khai báo tham trị giống hệt bạn khai báo biến chương trình 4.3 Bài tập Trong chương trình đây, thủ tục TT có hai tham số a b : a tham số trị b tham