1. Trang chủ
  2. » Cao đẳng - Đại học

Giao trinh Pascal Ninh Hoa

32 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Trong thủ tục, các tham số giá trị thường là các biến để chứa dữ liệu đưa vào thủ tục; các tham số biến là các biến mà kết quả tính toán của thủ tục sẽ chứa vào đó khi ra khỏi thủ tục, t[r]

(1)NHỮNG ĐIỀU LƯU Ý Cần ý thức điều này: Máy tính làm tính toán nhanh, làm số phép toán đơn giản Con người tính toán chậm nhiều so với máy tính biết cách giải bài toán phức tạp cách kết hợp nhiều bài toán đơn giản Vậy, muốn lập trình giải bài toán phức tạp nhanh người phải suy nghĩ để hướng dẫn cho máy tính giải chuổi các bài toán đơn giản Ví dụ: Máy tính biết phép tính cộng, phép chia và làm nhanh, không biết tính trung bình cộng số là làm nào Để làm điều này người phải hướng dẫn cho máy tính là lấy tổng số chia cho Và máy tính hiểu người không phải nói “lấy tổng số chia cho 3” mà phải viết chương trình qui định sẵn Ngôn ngữ lập trình pascal qui định viết chương trình nào? học em biết điều này Mỗi chương trình mà em viết có thể xem là phần mềm tí hon Khi viết chương trình cần theo các bước sau: Phân tích bài toán: Dữ liệu vào là gì? Dữ liệu là gì? Dữ liệu nhập vào có kiểm tra hay không? Tính toán nào? Dùng thuật toán gì? Viết sơ đồ thuật toán, các bước đi, phép toán giấy nháp Có cách làm nào khác tối ưu hay không? Viết chương trình vào máy tính Kiểm tra lại chính tả, duyệt lại chương trình suy nghĩ mình Chạy chương trình, thử nghiệm với liệu nhỏ sau đó là các liệu có giá trị đặc biệt, đến liệu lớn Cải tiến lại chương trình Chú ý lưu giữ chương trình cũ trước cải tiến Lưu giữ chương trình đúng qui cách, bảo đảm sau này chương trình có thể chạy lại lần đã thử nghiệm thành công Những chi tiết cuối cùng vừa cải tiến không thành công, phải loại bỏ khỏi chương trình Học thuộc lòng tất nội dung trên! (2) CHƯƠNG I NHỮNG KIẾN THỨC CƠ BẢN Ngôn ngữ lập trình a Lập trình là gì ? Lập trình là các thao tác đưa ý nghĩ người theo trình tự có hệ thống vào máy tính, yêu cầu máy tính thực b Ngôn ngữ lập trình Là các phần mềm mà nhờ đó các kỹ thuật viên mô lại các thao tác trên ngôn ngữ đó thông qua các qui tắc qui ước mà ngôn ngữ đề Ngôn ngữ lập trình có chức chuyển toàn chương trình sang mã máy để máy tính có thể thực và đưa kết Bài toán tin học và cách giải a Bài toán tin học là gì? Bài toán Tin học không dùng để bài toán cụ thể, mà lớp các bài toán cụ thể thuộc cùng loại Một bài toán tin học cấu tạo hai yếu tố sau: + Thông tin vào (Input): Là các thông tin ta có + Thông tin (Output): Là các thông tin cần tìm câu trả lời cần thiết Ví dụ: Để giải bài toán tính diện tích tam giác công thức S=a*h/2 + Thông tin vào: Là cạnh đáy a và đường cao h + Thông tin : Là diện tích tam giác S là dòng thông báo liệu không hợp lệ b Thuật toán (algorithm) Thuật toán là quá trình gồm dãy hữu hạn các thao tác đơn giản xếp theo trình tự xác định cho theo đó từ Input bài toán ta tìm Output khẳng định không có Output bài toán đòi hỏi Chỉ quá trình có khả chuyển giao máy tính thực Ví dụ: Trở lại bài toán tính diện tích tam giác, thuật toán sau: + Bước 1: Cho giá trị cạnh đáy a và đường cao h + Bước 2: Kiểm tra - Nếu a>0 và h>0 thì tính diện tích theo công thức S=a*h/2 và xuống bước - Ngược lại thông báo liệu không hợp lệ và quay bước + Bước 3: In diện tích S c Mô tả thuật toán qua sơ đồ Để mô tả cách trực quan thuật toán người ta dùng sơ đồ khối Qua sơ đồ khối người lập trình có thể quan sát các bước thuật toán dòng thông tin hình thành và biến đổi quá trình thuật toán làm việc Việc thể thuật toán người ta qui ước dùng các khối sau để thể - Thể bắt đầu và kết thúc chương trình - Thể việc nhập, xuất liệu - Chứa các công thức, câu lệnh tính toán - Chứa các biểu thức điều kiện, và để rẽ nhánh chương trình - Dùng để gọi chương trình Dẫn hướng chương trình và nối các khối thuật toán với Cấu trúc chương trình pascal Một chương trình Pascal bao gồm các thành phần sau: (3) Phần 1: Tên chương trình Luôn bắt đầu từ khoá Program PROGRAM Tên_chương_trinh; Phần 2: Khai báo USES Tên_các_Unit; {Khai báo thư viện dùng chương trình} CONST Các hằng;{Khai báo sử dụng chương trình} TYPE Các_kiểu_dữ_liêu_mới;{Khai báo kiểu liệu mới} VAR Các_biến;{Dùng để khai báo biến sử dụng chương trình} PROCEDURE Các_thủ_tục;{Khai báo các thủ tục} FUNCTION Các_hàm; {Khai báo các hàm} Phần 3: Thân chương trình BEGIN {Bắt đầu chương trình} { Các câu lệnh } END {Kết thúc chương trình} Ví dụ: Trở lại bài toán tính diện tích tam giác, chương trình viết sau: PROGRAM Tinh_Dien_Tich_Tam_giac; USES CRT; VAR s,a,h:real; BEGIN {Bắt đầu chương trình} Clrscr; Repeat Write(‘Nhap canh day:’);Readln(a); Write(‘Nhap chieu cao:’);Readln(h); Until (a>0)and(h>0); S:=a*h/2; Write(‘Dien tich tam giac la:’,s:6:2); Readln; END {Kết thúc chương trình} Các bước soạn thảo và chạy chương trình Pascal Bước 1: Khởi động Pascal Tệp để chạy chương trình Pascal là tệp TURBO.EXE Muốn khởi động Pascal ta phải chạy tệp này Bước 2: Soạn thảo chương trình Sau chương trình Pascal khởi động, ta tiến hành soạn thảo chương trình theo cấu trúc phần Sau soạn thảo xong ta ấn phím F2 để ghi văn chương trình vào máy Nếu muốn mở chương trình đã có máy ta dùng phím F3 Bước 3: Biên dịch và chạy chương trình Khi hoàn tất chương trình ta ấn phím F9 để dịch chương trình, Pascal thông báo cho ta lỗi cú pháp chương trình có, tiến hành sửa chữa các lỗi cho chương trình hoàn chỉnh Khi chương trình đã biên dịch xong ta ấn tổ hợp phím CTRL + F9 để chạy chương trình Bước 4: Thoát khỏi Pascal Để thoát khỏi Pascal ta ấn tổ hợp phím ALT + X Kiến thức cần nắm vững: (học thuộc lòng và vận dụng được) - c Mô tả thuật toán qua sơ đồ - Cấu trúc chương trình pascal - Các bước soạn thảo và chạy chương trình Pascal Bài tập: (4) CHƯƠNG II CÁC KHÁI NIỆM CƠ BẢN I Một số qui ước ngôn ngữ Bộ kí tự Turbo Pascal xây dựng với kí tự sau: - Các chữ cái: 26 chữ cái hoa (A,B, ,Z) 26 chữ thường (a,b, z) - Các chữ số thập phân: 0,1,2,3,4,5,6,7,8,9 - Các dấu toán học thông dụng: + - * / > >= < <= = ( ) - Dấu gạch nối _ - Các kí hiệu đặc biệt: ; {} [ ] : % & @ $ # ^ ! ‘ “ ? Từ khoá (Key word) Từ khoá là các từ dành riêng cho Turbo Pascal, từ có chức định Khi sử dụng phải dùng đúng với cú pháp Một số từ khoá: BEGIN END PROCEDURE FUNCTION PROGRAM CONST VAR TYPE IF THEN FOR vvv Tên hay danh hiệu (Indentifier) Tên là dãy kí tự tạo thành từ các chữ cái, chữ số và dấu gạch nối Tên thường dùng để đặt tên cho các đại lượng chương trình tên biến, hằng, tên kiểu liệu vv Kí tự đầu tiên tên không là chữ số.Tên có độ dài tuỳ ý có 63 kí tự đầu tiên là có ý nghĩa, tên không trùng với tên từ khoá * Tên chuẩn: là tên Turbo Pascal định nghĩa trước dùng các hàm, hằng, biến, thủ tục thư viện turbo Pascal * Tên người lập trình đặt: Đặt tuỳ ý phải tuân thủ theo nguyên tắc Pascal tên biến, tên chương trình, tên kiểu liệu Dòng chú thích Trong quá trình soạn thảo chương trình để làm sáng tỏ đoạn chương trình, dòng lệnh cụ thể công việc nào đó, người lập trình thường đưa thêm vào chương trình dòng chú thích, lời giải thích để là sáng tỏ vấn đề cần nêu Dòng chú thích đặt hai dấu ngoặc sau {} Ví dụ: PROGRAM TG; {Khai báo tên chương trình tính diện tích tam giác} Dấu chấm phẩy Dấu chấm phẩy “ ; ” thường nằm sau các câu lệnh nhằm ngăn cách các câu lệnh với nhau, không nên hiểu dấu “ ; ” dùng để kết thúc câu lệnh II Các kiểu liệu Kiểu logic (Boolean) - Chỉ có hai giá trị: TRUE (đúng), FALSE (sai) - Quy ước: FALSE < TRUE - Các phép toán: AND, OR, XOR, NOT - Tác dụng các phép toán thể qua bảng: P TRUE TRUE FALSE FALSE Q TRUE FALSE TRUE FALSE NOT P FALSE FALSE TRUE TRUE P AND Q TRUE FALSE FALSE FALSE Trong đó P và Q là hai giá trị kiểu Boolean Kiểu số nguyên - Có năm kiểu số nguyên tổng kết qua bảng sau: P OR Q TRUE TRUE TRUE FALSE P XOR Q FALSE TRUE TRUE FALSE (5) Tên Miền giá trị Yêu cầu nhớ Shortint -128 đến 127 bytes Integer -32768 đến 32767 bytes Longint - 2147483648 đến 2147483647 bytes Byte đến 255 byte Word đến 65535 bytes - Các phép tính: + cộng / chia trừ DIV chia lấy phần nguyên * nhân MOD chia lấy số dư hai số nguyên Ví dụ: 5/2=2.50 DIV 2=2 MOD 2=1 Chú ý: - Khi viết các số nguyên phải tuân theo các quy định: không có khoảng trống các số, dấu + hay - (nếu có) phải đặt trướcchữ số đầu tiên, không sử dụng dấu chấm thập phân - Khi thực các phép tính trên số nguyên, phải thận trọng xem các phép toán đó có cho kết vượt quá phạm vi biểu diễn số nguyên hay không Ví dụ khai báo a, b là liệu kiểu Integer Khi đó hai câu lệnh sau: a:=80; b:=(a*1245)Div 200; cho kết sai vì a*1245 = 99600 vượt quá phạm vi Integer Kiểu số thực - Có năm kiểu số thực, tổng kết qua bảng sau: Tên Phạm vi biểu diễn Yêu cầu nhớ Single 1.5*10-45 đến 3.4*1038 bytes -39 38 Real 2.9*10 đến 1.7*10 bytes Double 5.0*10-324 đến 1.7*10308 bytes -4932 4932 Extended 3.4*10 đến 1.1*10 10 bytes Comp -9.2*1018 đến 9.2*1018 bytes Các giá trị thực biểu diễn theo hai cách: dạng dấu phẩy tĩnh và dạng dấu phẩy động - Cách viết số thực theo dạng dấu phẩy tĩnh: viết dạng thập phân bình thường Ví dụ: 2.25, 5.0, -25.56812, 0.0256 - Cách viết số thực theo dạng dấu phẩy động: số tách thành hai phần là định trị và bậc Phần định trị là số nguyên hay số thực viết dạng dấu phẩy tĩnh Phần bậc là số nguyên Hai phần cách chữ E hay e Ví dụ: 123.456E-4 : biểu diễn số 0.0123456 0.12E+5 : biểu diễn số 12000.0 -52.4e2 : biểu diễn số –5240.0 Các ký tự biểu diễn số thực phải viết liền - Các phép toán số thực: + (cộng), - (trừ), * (nhân), / (chia) Không tồn các phép toán DIV, MOD cho kiểu số thực Kiểu kí tự (Char) - Một giá trị kiểu Char chiếm byte và biểu diễn ký tự thông qua bảng mã ASCII Mã ký tự chính là số ký tự nó bảng mã ví dụ: mã (hay số thứ tự) A là 65 Có tất 256 ký tự đánh số từ 0255 Vậy có 256 giá trị kiểu Char Trong bảng mã ASCII các ký tự từ 031 là các ký tự điều khiển không in và dùng để điều khiển quá trình vào trên các thiết bị ngoại vi Ví dụ: Khi máy nhận ký tự có mã là (Beep) nó phát tiếng chuông (6) - Để biểu diễn ký tự có thể dùng cách: Đặt ký tự dấu nháy đơn, dùng hàm Chr(n), dùng #n( đó n là mã ký tự cần biểu diễn) Ví dụ: Để biểu diễn ký tự A ta có thể dùng cách: ‘A’, Chr(65), #65 - Kiểu ký tự có phép toán so sánh, so sánh dựa vào mã ký tự Ví dụ: ‘A’ < ’a’ (vì 65 < 97) - Hàm Upcase(ch): cho ký tự hoa tương ứng với ký tự ch Ví dụ: Upcase(‘a’) = ‘A’ và Upcase(‘B’)= ‘B’ Kiểu xâu kí tự (String) Một giá trị kiểu String là ký tự đặt dầu nháy đơn Số ký tự dãy không quá 255 ký tự Xâu không có ký tự nào gọi là xâu rỗng Ví dụ: ‘Ho va Ten’ là xâu gồm ký tự ‘’ đây là xâu rỗng III Khai báo hằng, biến, biểu thức câu lệnh Khai báo Hằng là đại lượng có giá trị xác định và không thay đổi suốt quá trình chương trình thực Hằng khai báo từ khoá CONST sau: CONST Tên = giá trị hằng; Hay CONST Tên = biểu thức hằng; Ví dụ: CONST Max = 150; {hằng nguyên} L = False; {hằng logic} A = (5*4)/3; {hằng thực } Ch = ‘Y’; {hằng ký tự} Chúng ta sử dụng các để chương trình rõ ràng và dễ sửa đổi Khai báo biến Biến (variable) là đại lượng mà trị nó có thể thay đổi thực chương trình Biến là tên vùng nhớ lưu trữ liệu, biến phải thuộc kiểu liệu định Vùng nhớ biến kiểu Integer chứa các giá trị Integer Biến khai báo từ khoá VAR sau: VAR Tên biến: Kiểu liệu biến; Nhiều biến có cùng kiểu có thể khai báo cùng cách viết tên các biến đặt cách dấu phẩy Ví dụ: VAR x,y,z:Real; chon:Char; Thoat:Boolean; i,j:integer; ten:String[7]; Chú ý: - Biến String khai báo tối đa là: String[255] Một biến String cấp số byte độ dài nó cộng thêm Byte đầu tiên dùng để ghi số ký tự lưu trữ, byte còn lại chứa ký tự - Có thể vừa khai báo vừa khởi đầu (gán giá trị) cho các biến theo cách sau: Const x = 25.0; Y:Real = -5.26; Ho_ten:String[25]=’Lê Hung’; Trong ví dụ trên chú ý phân biệt x và y: x là thực, y là biến thực Trong chương trình có thể thay đổi giá trị y mà không thay đổi giá trị x Biểu thức (7) Một biểu thức tạo các phép toán và các toán hạng dùng để thể công thức toán học Toán hạng có thể là hằng, hàm, biến Ví dụ: Sau có khai báo: Const Max = 120; Var x: Integer; Ta có thể viết biểu thức sau: 5+ Max * Exp(x); đó + và * là hai phép toán, các số 5, Max, Exp(x) là các toán hạng Chú ý: Một hằng, biến, hàm xem là biểu thức, đó là biểu thức đơn giản Các phép toán biểu thức xếp theo thứ tự ưu tiên sau: - Các phép toán ngôi ưu tiên thứ nhất: dấu dương (+), dấu âm (-), phép phủ định (not) - Các phép toán nhân chia: phép nhân (*), phép chia (/), lấy phần nguyên (div), lấy phần dư (mod), phép và (and) - Các phép cộng trừ: cộng (+), trừ (-), phép (or) - Các phép so sánh: <, <=, >, >=, =, <> Chú ý: - Biểu thức ngoặc có thực trước xét đến các phép toán cạnh dấu ngoặc - Nếu cùng thứ tự ưu tiên thì toán tử thực từ trái qua phải Ví dụ: a) 3+5*3=18, (3+5)*3=24, 5/2*3=7.5 b) (5+2>4) and not (true or (5-3=8)) − b+ √ d a c) (-b+sqrt(d))/2*a có nghĩa là Câu lệnh Dưới phần khai báo liệu là phần lệnh chương trình Phần này xác định các công việc mà chương trình phải thực để xử lý các liệu đã khai báo Câu lệnh chia làm hai loại: - Câu lệnh đơn giản: Lệnh gán ( := ) Lệnh Nhập – Xuất ( READ, WRITE ) - Câu lệnh có cấu trúc: Lệnh ghép ( BEGIN… END ) Lệnh lựa chọn (IF, CASE) Lệnh lặp (FOR, REPEAT, WHILE) Câu lệnh gán Lệnh gán dùng để gán giá trị biểu thức cho biến Lệnh gán có dạng: Biến:= biểu thức; Sự thực hiện: đầu tiên máy tính trị biểu thức vế phải sau đó nó gán giá trị tính cho biến vế trái Chú ý: - Vế trái phép gán và có thể là biến mà thôi Ví dụ viết x+y:=7 là sai vì vế trái phép gán là biểu thức không phải là biến - Kiểu biểu thức phải trùng với kiểu biến, trừ trường hợp biến thực có thể nhận giá trị nguyên Ví dụ: Sau đã khai báo: Var c1, c2: char; i,j: integer; x,y: real; thì có thể thực các phép gán sau: c1:= ‘B’; c2:=chr(7); i:= (23+6)*2 mod 3; (8) j:= round(20/3); x:=0.5; y:=1; Lệnh in liệu màn hình Lệnh này cho phép chương trình in lên màn hình các liệu, kết hay các thông báo cần thiết Cú pháp: WRITE ( Biểu thức 1, , Biểu thức thứ n ); (1) WRITELN( Biểu thức 1, , Biểu thức thứ n); (2) WRITELN; (3) Dạng (1): in lên màn hình giá trị các biểu thức vị trí hành trỏ theo thứ tự viết lệnh và sau lệnh này trỏ vị trí sau giá trị biểu thức thứ n Dạng (2): in lên màn hình giá trị các biểu thức vị trí hành trỏ theo thứ tự viết lệnh và sau đó đưa trỏ đầu dòng Dạng (3): đưa trỏ đầu dòng Ví dụ: Var A,B: Byte; BEGIN A:=2; B:=4; Write( ‘ Day la ket qua cua phep nhan A voi B:’,A*B); Writeln(‘******’); Write(‘ ‘); END Kết trên màn hình sau chạy chương trình: Day la ket qua cua phep nhan A voi B: ****** Có hai dạng viết thủ tục WRITE và WRITELN là viết có quy cách và viết không có quy cách Chúng xét cụ thể với kiểu liệu a)Ví dụ dạng viết không quy cách: USES Crt; Var I: Integer; R: Real; Ch: Char; B: Boolean; BEGIN I:= 123; R:=123.456; Ch:=’D’; B:=2<5; Writeln(I); {1} Writeln(R) {2} Writeln(3.14) {3} Writeln(20*2.5) {4} Writeln; Writeln(Ch); {5} Writeln(B); {6} Writeln(#7); {7} END Cách viết không quy cách lề theo bên trái - Số nguyên viết với số chỗ đúng số chữ số gán vào, kể từ vị trí bên trái Lệnh {1} in ra: 123 - Số thực viết với trình tự sau: dấu cách, số phần nguyên, dấu chấm, 10 chỗ phần thập phân, chữ E, dấu phần mũ, hai số biểu diễn giá trị phần mũ Các lệnh {2}, {3},{4} in các số 1.2345600000E+02, 3.1400000000E+00, 5.0000000000E+01 - Kiểu ký tự in bình thường, ký tự chiếm chỗ Lệnh {5} in ra: D - Kiểu Boolean viết từ TRUE hay FALSE Lệnh {6} in ra: TRUE - Lệnh {7}: chuông kêu b) Ví dụ dạng viết có quy cách (9) Var I: integer; R: Real; Ch: Char; B: Boolean; BEGIN I:=123; R:=123.456; Ch:=’D’; B:=2<5; Z:=543621.342; Writeln(I:8); {1} Writeln(-23564:8); {2} Writeln(R:12:6); {3} Writeln(35.123456789:12:6); {4} Writeln(R:12); {5} Writeln(Ch:5); {6} Writeln(‘ABC’:5); {7} Writeln(B:7); {8} Writeln(Z:1:2); {9} END Cách viết có quy cách theo lề phải, thừa chỗ thì phần bên trái bỏ trắng - Lệnh {1}, {2} dành ký tự trên màn hình để in các số nguyên - Lệnh{3},{4} dành 12 ký tự trên màn hình để in các số thực với số lẻ phần thập phân, kết in 123.456000, 35.123457 ( phần thập phân > chỗ nên làm tròn) - Lệnh {5} in giá trị R với số chỗ 12 dạng mũ: 1.23456E+02 - Lệnh {6}, {7} dành chỗ để in chữ D và xâu ký tự ABC - Lệnh {8} dành ký tự để in TRUE - Trong lệnh in số thực Write(Z:m:n) m<n thì số thực Z in với n số lẻ, còn số chỗ trên màn hình thì tuỳ vào độ dài số Z, máy dành đủ chỗ để in số Z Lệnh {9} in ra: 543621.34 Trong trường hợp m > n , độ dài số lớn m thì số bị cắt Chú ý: Vì dấu ‘ dùng để đánh dấu ký tự, đó muốn viết nó ta viết hai lần dấu ‘ Ví dụ: Write(‘ Dung quen toi!’); Sẽ cho kết qua trên màn hình: Dung quen toi! Lệnh nhập liệu READLN(Biến 1, ., Biến thứ n); (1) READLN; (2) Dạng (1): Khi thực lệnh này, máy tính dừng lại đợi người sử dụng dưa vào (từ bàn phím) đủ n liệu cho n biến tương ứng Dạng (2): dùng để tạm dừng chương trình, muốn chạy tiếp thì nhấn Enter Chú ý: - Các biến đây thuộc kiểu nguyên, thực, ký tự hay xâu ký tự Do đó có thể nạp từ bàn phím các giá trị số và ký tự Sẽ là ý đồ sai ta định nạp vào giá trị TRUE hay FALSE cho biến Boolean - Dữ liệu gõ vào từ bàn phím tương ứng với biến 1, biến 2,…., biến thứ n và tách riêng hay vài dấu cách Sau liệu vào ta ấn phím Enter để máy thực lệnh Các liệu vào phải phù hợp với kiểu tương ứng Một số hàm Turbo Pascal SQRT(x): Hàm bậc hai x SQR(x): Hàm bình phương số nguyên hay thực ABS(x): Hàm trị tuyệt đối x TRUNC(x): Cắt bỏ phần lẻ thập phân x có ROUND(x):Cho số nguyên gần x ORD(ch): Cho số thứ tự ký tự ch bảng mã CHR(n): Trả ký tự có số thứ tự n bảng mã ODD(n): Cho kết true n lẻ, False ngược lại BÀI TẬP (10) (11) CHƯƠNG III CẤU TRÚC ĐIỀU KIỆN I Câu lệnh ghép Lệnh ghép là nhóm lệnh đặt hai từ khoá BEGIN và END; nhằm thực công việc nào đó Lệnh ghép thường xuất các cấu trúc chương trình câu lệnh điều kiện, cấu trúc lặp Khi thực kệnh ghép thực câu lệnh theo thứ tự từ trên xuống Dạng tổng quát lệnh ghép: BEGIN <Câu lệnh 1>; <Câu lệnh 2>; <Câu lệnh 3>; <Câu lệnh n>; END; II Câu lệnh điều kiện IF THEN a Câu lệnh điều kiện có hai dạng sau: Câu lệnh điều kiện thiếu: IF <Điều kiện logic> THEN <Công việc>; Câu lệnh điều kiện đủ: IF <Điều kiện logic> THEN <Công việc1> ELSE <Công việc 2>; b Hoạt động: Khi gặp lệnh này chương trình kiểm tra điều kiện logic, điều kiện logic là đúng thực <công việc 1> và bỏ qua <công việc 2>, sai thực <công việc 2> và bỏ qua <công việc 1> Trong đó <công việc1>, <công việc 2> có thể là câu lệnh ghép c Sơ đồ thuật toán cho câu lệnh điều kiện đủ: Đ Công việc Điều Kiện logic S Công việc d Một số ví dụ Ví dụ 1: Viết chương trình giải và biện luận phương trình bậc ax+b=0 Bước 1: Phân tích bài toán Để giả phương trinh bậc ẩn trước hết ta cần thông tin sau: - Biết hệ số a và b - Sau đó kiểm tra điều kiện phương trình + Nếu a= Nếu b=0 thì phương trình vô số nghiệm Ngược lại b<>0 thì phương trình vô nghiệm (12) + Ngược lại a<>0 thì phương trình có nghiệm x=-b/a Bước 2: Sơ đồ thuật toán BEGIN Nhập a,b a=0 Đ b=0 S PT vô nghiệm S PT có nghiệm -b/a Đ PT vô số nghiệm Bước 3: Chương trình Program PT_bac_nhat; Var a,b: real; BEGIN Write('Nhap vao he so a=');Readln(a); Write('Nhap vao he so b=');Readln(b); IF a=0 THEN IF b=0 THEN Writeln('Phuong trinh vo so nghiem') ELSE Writeln('Phuong trinh vo nghiem) ELSE Writeln('Phuong trinh co nghiem x=',-b/a:6:2); Readln; END Ví dụ 2: Tìm số lớn ba số nhập vào từ bàn phím Bạn đọc tự thực lại các bước và bước Bước 3: Chương trình Program so_lon_nhat; Var a,b,c,max:real; BEGIN Write('Nhap so a=');Readln(a); Write('Nhap so b=');Readln(b); Write('Nhap so c=');Readln(c); Max:=a; IF Max<b then max:=b; IF Max<c then max:=c; Writeln('So lon nhat ba so la:',max:6:2); Readln; END III Câu lệnh lựa chọn a Cấu trúc lệnh CASE <biểu thức > OF Tập 1: <công việc 1>; Tập 2: <công việc 2>; Tập n-1: <công việc n-1>; END (13) Tập n: <công việc n>; ELSE <Công việc n+1>; END; - Tập bao gồm các cụ thể các đoạn hằng: ví dụ 3:<công việc>; 10:<công việc>;{tập là tập các số nguyên từ đến 10} ‘a’ ’z’:<công việc> ;{tập là tập các kí tự từ a đến z} - Giá trị biểu thức và giá trị các tập phải có cùng kiểu và phải là kiểu vô hướng đếm (như nguyên, logic, kí tự, liệt kê) b Hoạt động: Khi gặp lệnh này chương trình lấy giá trị biểu thức đem so sánh với giá trị chứa các tập hằng, giá trị biểu thức trùng với giá trị chứa các tập thì thực công việc tương ứng với tập đó và bỏ qua tất các công việc khác Nếu trường hợp không có giá trị tập nào trùng với giá trị biểu thức thì thực <công việc n+1>, trường hợp không có ELSE thì chương trình thoát khỏi cấu trúc này và thực các công việc sau cấu trúc c Một số ví dụ: Ví dụ 1: Nhập vào số từ đến in màn hình số đó chữ, ví dụ nhập vào số in màn hình “số hai” * Chương trình Program Vidu; Var a: integer; Begin Write('Nhap vao so a=');readln(a); CASE a OF 1:Writeln('so la so mot'); 2:Writeln('so la so hai'); 3:Writeln('so la so ba'); 4:Writeln('so la so bon'); 5:Writeln('so la so nam'); end; Readln; End Ví dụ 2: Viết chương trình nhập vào điểm kiểm tra học sinh từ bàn phím (điểm là số nguyên từ đến 10), in màn hình kết xếp loại học sinh đó * Chương trình Program Vidu; Var a: integer; Begin Write('Nhap vao diem cua hoc sinh=');readln(a); CASE a OF 4:Writeln('Ban xep loai yeu'); 5,6:Writeln('Ban xep loai trung binh'); 7,8:Writeln('Ban xep loai kha'); 9,10:Writeln('Ban xep loai gioi'); end; Readln; End (14) BÀI TẬP 11- Lập trình giải phương trình bậc hai ax2 + bx +c = với a, b, c nhập từ bàn phím 12- Tính số ngày tháng, năm cho trước theo thuật giải : - Nếu là tháng 4,6,9,11 thì số ngày là 30 - Nếu là tháng 1,3,5,7,8,10,12 thì số ngày là 31 - Nếu là tháng + Nếu số năm chia hết cho thì tháng có 29 ngày, còn lại tháng có 28 ngày 13: Cho ba số thực a,b,c Kiểm tra xem bất đẳng thức sau xem có đúng không ? a < b <c (15) 14: Cho ba số thực x, y, z hãy thay tất các số âm bình phương nó 15: Với số thực a,b,c,d Nếu a  b  c  d thì thay số d; Nếu a >b>c>d thì các số không thay đổi , ngược lại thay số bình phương nó 16: Cho hai số thực x và y x và y âm thì thay mỗ số trị tuyệt đối chúng Nếu hai số âm thì tăng số lên 0.5 Nếu hai số không âm và không có số nào thuộc khoảng [1,2] thì thay số 10 lần chính nó các trường hợp ngược lại hai số không thay đổi 17: Cho số tự nhiên n (n <= 1000) a/ Số tự nhiên n có bao nhiêu chữ số b/ Tìm tổng các chữ số n c/ Tìm chữ số cuối cùng n d/ Tìm chữ số đầu tiên n e/ Với n>=10 Hãy tìm chữ số hàng chục n (16) CHƯƠNG IV CẤU TRÚC LẶP Trong thực tế lập trình có số bài toán dùng các cấu trúc thông thường dài Ví dụ bài toán in màn hình các số nguyên từ 100 thì người lập trình phải dùng đến 100 câu lệnh Write (Writeln) tức là thực lại câu lệnh đó 99 lần tính tổng n số nguyên ta thường phải thực phép cộng hai số nguyên n-1 lần Vậy tượng công việc nào đó thực thực lại nhiều lần chương trình thì người ta gọi là lặp Nếu trường hợp số lần thực công việc biết trước là bao nhiều lần người ta gọi là lặp xác định (hay lặp có số lần xác định) Nếu trường hợp số lần thực công việc không biết trước mà dừng công việc gặp điều kiện nào đó, gọi là lặp không xác định Để giải các bài toán lặp Pascal đưa cho chúng ta số cấu trúc lặp sau: I Vòng lặp xác định FOR a Cấu trúc Vòng lặp FOR có hai dạng: Dạng một: (FOR dạng tiến) FOR <biến điều khiển>:=giá trị đầu TO <giá trị cuối> DO <Công việc>; Dạng hai: (FOR dạng lùi) FOR <biến điều khiển>:=giá trị cuối DOWNTO <giá trị đầu> DO <Công việc>; Chú ý: Kiểu <biến điều khiển>, giá trị đầu, giá trị cuối phải có cùng kiểu giá trị và phải là kiểu vô hướng đếm Người ta thường đặt tên cho biến điều khiển là i, j, k b Hoạt động * Hoạt động vòng FOR dạng tiến: Ban đầu biến điều khiển nhận giá trị đầu sau đó kiểm tra giá trị biến điều khiển với giá trị cuối Nếu giá trị biến điều khiển <= giá trị cuối thì thực công việc sau DO, sau thực công việc xong, quay trở đầu vòng lặp tăng giá trị biến điều khiển lên đơn vị và tiếp tục so sánh với giá trị cuối, quá trình tiếp tục giá trị biến điều khiển lớn giá trị cuối thì thoát khỏi vòng lặp * Hoạt động vòng FOR dạng lùi: Ban đầu biến điều khiển nhận giá trị cuối sau đó kiểm tra giá trị biến điều khiển với giá trị đầu Nếu giá trị biến điều khiển >= giá trị đầu thì thực công việc sau DO, sau thực công việc xong, quay trở đầu vòng lặp tăng giá trị biến điều khiển lên đơn vị và tiếp tục so sánh với giá trị đầu, quá trình tiếp tục giá trị biến điều khiển nhỏ giá trị đầu thì thoát khỏi vòng lặp c Sơ đồ thuật toán Giả sử biến điều khiển là i * Sơ đổ thuật toán vòng FOR dạng tiến i:=giá trị đầu Đ i<=giá trị cuối Công việc i:=i+1 Công việc i:=i -1 S * Sơ đổ thuật toán vòng FOR dạng lùi i:=giá trị cuối i >=giá trị đầu S Đ (17) d Một số ví dụ Ví dụ 1: Tìm tất các ước số số nguyên n cho trước Phân tích bài toán: Dữ liệu vào là số nguyên n nhập từ bàn phím Dữ liệu là tất các ước số số nguyên n Một số i gọi là ước số n n chia cho số đó không dư, tức là n mod i=0 Ta xây dựng vòng lặp từ tới n và kiểm tra tất các số nguyên khoảng đó xem số nào thoả mãn điều kiện trên thì in màn hình Thuật toán và sơ đồ - Bắt đầu - Nhập số nguyên n - Trong vòng lặp với i chạy từ đến n, kiểm tra n mod i=0 thì in i màn hình - Kết thúc BEGIN Nhập n i:=1 i:=i+1 Đ i<=n N mod i=0 S END Chương trình: Program Timuocso; Var I,n:integer; Begin Write(' Nhap vao n=');Readln(n); For i:=1 to n If n mod i=0 then Write(i:8); Readln; End Ví dụ 2:Tính tổng bình phương các số lẻ từ tới n Bạn đọc tự phân tích và đưa thuật toán Chương trình: Program tongbp; Var I,n:integer; Tong:integer; Begin Write(' Nhap n=');readln(n); Tong:=0; For i:=1 to n If odd(i) then S Đ In i (18) Tong:=tong +sqr(i); Writeln(' tong lap phuong la :',tong); Readln; End Tóm lại: Câu lệnh For dùng để giải các bài toán có giải thuật vét cạn (xét tất các trường hợp trường hợp nào đúng thì lấy) Ví dụ: In các số chẵn từ n đến m Ý tưởng: cho biến i chạy từ n đến m i chẳn thì in CT: For i:=n to m If i mod =0 then write(i:5); Hàm BREAK; đây là hàm đặc biệt dành cho các vòng lặp nó có tác dụng dừng và thoát khỏi vòng lặp Nếu biết cách sử dụng nó, bài toán trở nên đơn giản nhiều Ví dụ: Bài toán dùng để in ước chung lớn a và b for i:= a-1 downto If (a mod i=0)and(b mod i=0) then Begin Writeln(i); Break; {Khi viết giá trị i đầu tiên (chính là ƯCLN) thì thoát khỏi vòng lặp} End; MỘT SỐ BÀI TẬP CÓ SỬ DỤNG CÂU LỆNH FOR Nhập vào số nguyên và in tất ước số lẻ nó? Nhập vào hai số nguyên in tất các ước chung chúng? Nhập vào hai số nguyên tìm ước chung lớn và bội chung nhỏ chúng? Nhập vào số nguyên dương n và in ước số lẻ lớn nó Ví dụ: n=60; in 15 Lập trình tính tổng n số Tính tổng S = + + + .+ n (với n nhập từ bàn phím) Hãy in mã ASCII các kí tự từ ‘A’ đến ‘Z’ và từ ’a’ đến ‘z’ Lập chương trình tìm tất các số nguyên có chữ số mà tổng các chữ số đó 20 và lấy số đó chia cho thì dư Viết chương trình nhập vào số tự nhiên N thông báo lên màn hình số đó có phải là số nguyên tố hay không Ý tưởng: N là số nguyên tố N không có ước số nào từ  N div Từ định nghĩa này ta đưa giải thuật: - Đếm số ước số N từ  N div lưu vào biến d - Nếu d=0 thì N là số nguyên tố 10 Viết chương trình tìm các số có chữ số abc cho: abc = a3 + b3 + c3 Ý tưởng: Dùng phương pháp vét cạn Ta biết rằng: a có thể có giá trị từ 19 (vì a là số hàng trăm), b,c có thể có giá trị từ 09 Ta dùng vòng lặp FOR lồng để duyệt qua tất các trường hợp a,b,c Ứng với abc, ta kiểm tra: Nếu 100.a + 10.b + c = a + b3 + c3 thì in abc đó 11 Ta định nghĩa số hoàn hảo là số tổng các ước số nó mà không kể chính nó Ví dụ 28=1+2+4+7+14 Viết chương trình tìm số hoàn hảo không lớn số n cho trước 12 VCT vẽ các hình: a Chữ nhật đặc Hình chữ nhật: nhập chiều dài và chiều rộng, Tam giác: nhập chiều cao; vẽ các hình trên với ký tự “*”; có thể làm thành bài riêng biệt làm chung chương trình có lựa chọn ) (19) b c d e f Chữ nhật rỗng Tam giác cân đặc Tam giác cân rỗng Tam giác vuông đặc Tam giác vuông rỗng II Vòng lặp không xác định (Repeat Until và While Do) a Vòng lặp Repeat Until Cú pháp: Repeat <Công việc>; Until <Biểu thức logic>; Hoạt động Khi gặp vòng lặp này chương trình thực công việc, sau thực xong kiểm tra biểu thức logic Nếu biểu thức logic sai, quay trở đầu vòng lặp thực công việc lần thứ hai, sau đó lại kiểm tra biểu thức logic, quá trình tiếp tục biểu thức logic là đúng thì thoát khỏi vòng lặp Sơ đồ thuật toán công việc BT logic S Đ b Vòng lặp While Do Cú pháp: While <BT logic> Do <Công việc>; Hoạt động: Khi gặp vòng lặp này chương trình kiểm tra biểu thức logic Nếu biểu thức logic đúng thực công việc, sau thực công việc xong quay trở đầu vòng lặp kiểm tra biểu thức logic, quá trình tiếp tục biểu thức logic là sai thì thoát khỏi vòng lặp Sơ đồ thuật toán: BT logic S d Một số ví dụ Đ Công việc (20) Ví dụ 1: Nhập vào dãy số tính tổng dãy số đó, việc tính tổng dừng lại nhập vào số Phân tích bài toán: - Một dãy số đây ta không thể xác định số lượng các số hạng dãy cách cụ thể mà thực công việc nhập số hạng dãy lặp lặp lại nhập vào số thì dừng lại Cụ thể sau: - Dùng biến a để chứa tạm thời giá trị số hạng nhập vào - Mỗi lần nhập số thông qua biến a Cụ thể dùng lệnh Writeln(‘Nhap vao a=’);Readln(a); - Sau đó lấy giá trị số nhập cộng thêm giá trị đã có biến Tong, kết đưa vào biến Tong Cụ thể là thực lệnh Tong:=Tong+a; - Sau tính tổng xong kiểm tra xem số a nhập vào có không hay không Nếu a=0 thì kết thúc công việc nhập và tính tổng Ngược lại (a<>0) lại thực toàn công việc trên lần Vậy với bài toán trên ta dùng cấu trúc lặp không xác định cụ thể là vòng lặp Repeat Nếu dùng vòng lặp While thì phải kiểm tra a trước tính tổng Sơ đồ thuật toán dùng vòng lặp Repeat BEGIN tong:=0 Nhập a Tong:=Tong+a a=0 Đ S In tong END Chương trình dùng vòng lặp Repeat Program Vi_du1; Var a,tong:real; Begin tong:=0; Repeat Write('nhap vao so a=');readln(a); Tong:=tong+a; Until a=0; Writeln('Tong cua day so la:',tong:6:2); readln End Sơ dồ thuật toán dùng vòng lặp While Do (21) BEGIN tong:=0 Nhập a a<>0 S Đ Tong:=Tong+a Nhập a In tong END Chương trình dùng vòng lặp While Do Program Vi_du1; Var a,tong:real; Begin tong:=0; Write('nhap vao so a=');readln(a); While a<>0 Begin Tong:=tong+a; Write('nhap vao so a=');readln(a); end; Writeln('Tong cua day so la:',tong:6:2); readln End Ví dụ 2: Tìm UCLN hai số nguyên a và b theo thuật toán - Nếu a>b thì thay a=a-b Ngược lại b:=b-a Quá trình lặp lại a= b thì dừng lại Bạn đọc tự vẽ sơ đồ Chương trình Program USCLN; Var a,b:integer; Begin Write(' Nhap vao so a=');readln(a); Write(' Nhap vao so b=');readln(b); While a<>b If a>b then a:=a-b Else b:=b-a; Writeln('USCLN la:',a); Readln End (22) Trong vòng lặp Repeat until công việc thực ít lần Trong vòng lặp while có thể công việc không thực lần nào Lưu ý: Vòng lặp repeat thì máy lặp lại ít là lần Ta thường dùng vòng lặp repeat để giới hạn liệu nhập vào Ví dụ nhập điểm học sinh Repeat Write(‘Nhap diem tu den 10:’); Readln(d) Until (0<=d)and(d<=10) BÀI TẬP Bài : Lập trình tính tổng cuả n số dùng vòng lặp While Bài : Lập trình tính tổng nhiều số nhập từ bàn phím (trừ số 0) Nếu gõ số thì dừng tính và thông báo kết tính màn hình Bài 3: Lập chương trình nhập vào các số nguyên gặp số Tính tổng các số dương , đếm xem có bao nhiêu số âm , trung bình cộng các số lẻ đưa kết màn hình Baì 4: Lập trình nhập vào hai số nguyên , tìm ước số chung lớn hai số đó Trong chương trình có kiểm tra xem số đó có lớn và nhắc nhở nhập lại thoả mãn Bài 5: Viết chương trình in lên màn hình các thông tin sau: a Các số có hai chữ số đó số hàng chục nhận giá trị từ đến , chữ số hàng đơn vị nhận giá trị từ đến b Tổng các chữ số có hai chữ số c Tích các số chẵn chữ số Bài 6: Viết chương trình nhập vào số tự nhiên từ bàn phím và in màn hình các số các chữ số lẻ có mặt số đớ Ví dụ nhập 3456, in số có hai chữ số lẻ (23) CHƯƠNG IV KIỂU VÔ HƯỚNG LIỆT KÊ , KIỂU ĐOẠN CON DỮ LIỆU CÓ CẤU TRÚC : KIỂU MẢNG I Định nghĩa kiểu liệu Trong quá trình lập trình có biến ta không thể xác định kiểu liệu nó Pascal cung cấp cho ta các kiểu liệu sở (real, integer, string, char, boolean) đã có sẵn Còn để sử lý các bài toán phức tạp hơn, chúng ta phải tự định nghĩa kiểu liệu dựa trên năm kiểu sở Để định nghĩa kiểu liệu mới, phần khai báo sau từ khoá TYPE ta định nghĩa thêm các kiểu liệu cần dùng để sau đó ta có thể sử dụng kiểu liệu này dùng kiểu liệu sở Ví dụ: Ta định nghĩa liệu kiểu màu sắc gồm màu Đo, xanh, vàng sau: TYPE Mausac=(do, xanh, vang); Var Mau:mausac; II Kiểu vô hướng liệt kê (Enumerated Scalar type) Một kiểu liệu thuộc kiểu vô hướng có thể định nghĩa là tập hợp các giá trị xếp theo thứ tự tự nhiên Một biến khai báo là kiểu vô hướng nào đó có thể nhận giá trị tập hợp các giá trị đó Ví dụ: các ngày tuần định nghĩa là kiểu liệt kê Type Ngay=(hai, ba, bon, nam, sau, bay, chunhat); Var Thu: ngay; Viết màn hình giá trị kiểu liệt kê Ta không thể dùng trực tiếp lệnh Write Writeln để in màn hình các biến có kiểu thuộc các kiểu sở Mà ta phải dùng thủ thuật sau: Giả sử muốn in thứ hai màn hình IF thu=hai then Write('Hai'); Đọc vào kiểu liệt kê Tương tự in ta không thể đọc vào cách trực tiếp lệnh readln mà phải làm sau: đọc số thứ tự giá trị biến vô hướng biến đổi kiểu liệu thêm Type Ngay=(hai, ba, bon, nam, sau, bay, chunhat); Var Thu: ngay; I:integer; BEGIN Readln(i); Thu:=ngay(i); END *Hàm thứ tự ORD(x) Hàm này cho ta số thứ tự x kiểu vô hướng đếm , thực chất là hàm biến đổi giá trị kiểu vô hướng đếm sang gia strị kiểu số nguyên Ví dụ: ORD(ba)=1 là đúng vì ba có số thứ tự là Ngược lại Ngay(4) cho ta kết là sau III Kiểu khoảng (Sub-range Type) (24) Ta thấy có nhiều trường hợp biến có thể lấy giá trị khoảng xác định giá trị giới hạn và giá trị giới hạn trên thuộc kiểu vô hướng đếm nào đó Cách định nghĩa kiểu khoảng con: TYPE Tên kiểu=hằng cận cận trên; Ví dụ: Tuổi thọ người từ đến 100 đó ta có thể định nghĩa sau: TYPE Tuoitho=0 100; Var Tuoi:tuoitho; IV Dữ liệu kiểu mảng Định nghĩa: Mảng là tập hợp hữu hạn các phần tử có cùng kiểu Số phần tử mảng xác định từ định nghĩa mảng Mỗi phần tử mảng truy nhập trực tiếp thông qua tên mảng cùng với số mảng đặt hai ngoặc vuông[] Định nghĩa kiểu mảng và khai báo TYPE Kiểu_mảng=array[miền số1, miền số ] of kiểu_phần_tử; Var Tên_biến_mảng:Kiểu_mảng; Hoặc có thể khai báo trực tiếp Var Ten_biến_mảng:array[miền số1, miền số ] of kiểu_phần_tử; Ví dụ: Để lưu trữ điểm 50 học sinh lớp học ta dùng mảng sau TYPE Hoc_sinh:array [1 60] of real; Var Diem:hoc_sinh; Hoặc: Var Diem: array[1 60] of real; Truy nhập phần tử mảng Được thực thông qua tên mảng và số mảng Giả sử để nhập điểm cho học sinh thứ i ta dùng lệnh Readln(diem[i]); Muốn in điểm học sinh thứ i màn hình ta dùng lệnh Write(diem[i]) writeln(diem[i]); Chú ý: Nếu có miền số mảng thì mảng đó gọi là mảng chiều Nếu có hai miền số mảng thì mảng đó gọi là mảng chiều (ma trận là mảng hai chiều) Nếu nhiều miền số mảng thì mảng đó gọi là mảng nhiều chiều Giả sử ta có ma trận biểu diễn mảng: Ma trận: 7 Khai báo: TYPE Mang:array[1 3,1 4] of integer; Var A:mang; (25) Hoặc Var A:array[1 3,1 4] of integer; để truy nhập tới phần tử hàng cột thì ta viết sau: a[2,3] Một số ví dụ mảng Ví dụ mảng chiều Ví dụ 1: Nhập vào mảng các số nguyên In màn hình số lớn dãy và vị trí nó Program VD1; Uses CRT; Var a:array[1 100] of Integer; i, max, n:Integer; BEGIN Write(‘ Nap vao so phan tu cua mang n=’);readln(n); For i:=1 to n Begin Write(‘ Nhap vao phan tu thu a[‘,i,’]=’); readln(a[i]); end; max:=a[1]; For i:=2 to n If max<a[i] then max:=a[i]; For i:=1 to n If max=a[i] then Writeln(‘ so lon nhat’,max,’nam o vi tri’,i); Readln; END Ví dụ 2: Nhập vào mảng các số nguyên Sắp xếp mảng theo thứ tự tăng dần Program VD2; Uses CRT; Var a:array[1 100] of Integer; i, j, n,tg:Integer; BEGIN Write(‘ Nap vao so phan tu cua mang n=’);readln(n); For i:=1 to n Begin Write(‘ Nhap vao phan tu thu a[‘,i,’]=’); readln(a[i]); end; For i:=1 to n-1 For j:=i+1 to n if a[i]>a[j] then Begin tg:=a[i]; a[i]:=a[j]; a[j]:=tg; end; For i:=1 to n Write(a[i]:6); Readln; (26) END Ví dụ 3: Nhập vào mảng các số nguyên In màn hình phần tử âm đầu tiên Program VD3; Uses CRT; Var a:array[1 100] of Integer; i, n:Integer; BEGIN Write(‘ Nap vao so phan tu cua mang n=’);readln(n); For i:=1 to n Begin Write(‘ Nhap vao phan tu thu a[‘,i,’]=’); readln(a[i]); end; For i:=1 to n If a[i]<0 then Begin Writeln(‘Phan tu am dau tien la:’,a[i]); break; End; Readln; End Ví dụ 4: Nhập vào mảng các số nguyên In màn hình phần tử dương cuối cùng Program VD4; Uses CRT; Var a:array[1 100] of Integer; i, n:Integer; BEGIN Write(‘ Nap vao so phan tu cua mang n=’);readln(n); For i:=1 to n Begin Write(‘ Nhap vao phan tu thu a[‘,i,’]=’); readln(a[i]); end; For i:=n downto If a[i]>0 then Begin Writeln(‘phan tu duong cuoi cung la:’,a[i]); Break; end; Readln; End Ví dụ 5: Nhập vào mảng các số nguyên Xoá phần tử thứ k mảng Program VD5; Uses CRT; Var a:array[1 100] of Integer; i,k, n:Integer; BEGIN Write(‘ Nap vao so phan tu cua mang n=’);readln(n); (27) For i:=1 to n Begin Write(‘ Nhap vao phan tu thu a[‘,i,’]=’); readln(a[i]); end; Repeat Write(‘Nhap vao vi tri can loai bo k=’); readln(k); Until (k>=1) and (k<=n); For i:=k to n-1 a[i]:=a[i+1]; For i:=1 to n-1 Begin Writeln(‘Day sau laoi bo phan tu thu’, k,’ la:’); Write(a[i]:6); End; readln; END Ví dụ 6: Nhập vào mảng các số nguyên Nhập vào số nguyên, hãy chèn số nguyên đó vào vị trí thứ k mảng Program VD5; Uses CRT; Var a:array[1 100] of Integer; i,k, n:Integer; BEGIN Write(‘ Nap vao so phan tu cua mang n=’);readln(n); For i:=1 to n Begin Write(‘ Nhap vao phan tu thu a[‘,i,’]=’); readln(a[i]); end; Repeat Write(‘Nhap vao vi tri can loai bo k=’); readln(k); Until (k>=1) and (k<=n); Write(‘ Nhap vao so b=’); readln(b); For i:=n+1 downto k+1 a[i]:=a[i-1]; a[k]:=b; For i:=1 to n+1 Begin Writeln(‘Day sau chen them so’,b,’ vao vi tri thu’, k,’ la:’); Write(a[i]:6); End; readln; END BÀI TẬP VỀ MẢNG MẢNG CHIỀU (28) CHƯƠNG VI: CHƯƠNG TRÌNH CON HÀM VÀ THỦ TỤC Trong quá trình viết chương trình có đoạn chương trình thực công việc nào đó xuất nhiều lần Để tránh viết lại đoạn chương trình này, ta chuyển đoạn chương trình thành chương trình con, lần cần thì gọi nó Chương trình thường viết nhằm thực công việc Người sử dụng chương trình cần biết tên chương trình và truyền đầy đủ số liệu cho các tham số là chương trình có thể thực mà không cần biết thuật toán và các phép sử lý thân chương trình Khi lập trình, người lập trình thường phân bổ bài toán nhiều công việc cụ thể, công việc cụ thể viết dạng chương trình Cách viết này giúp cho người lập trình nhìn chương trình cách thoáng đạt, dễ quản lý và gỡ rối đồng thời tiết kiệm tối đa nhớ Ví dụ: Để tính tổng hai số nguyên, người lập trình viết chương trình với tên là TONG(a,b), avà b là hai tham số đại diện cho hai số nguyên Khi muôn stinh stổng hai số và ta việc gọi chương trình sau: TONG(6,7) là ta có kết là 11 Chương trình Pascal chia làm hai loại: + Loại 1: Hàm + Loại 2: Thủ tục Hàm Cấu trúc hàm có dạng: FUNCTION Ten_ham(Tham số 1; Tham số 2, ): kiểu trả về; Var Khai báo các biến cục sử dụng hàm; Begin các lệnh tính toán; Ten_ham:=giá trị hàm nhận; End; Lời gọi hàm: Ten_ham(danh sách các tham số thực sự) Ví dụ: Lập trình tính tổng diện tích hai hình tam giác Viết hàm tính diện tích hình tam giác Program tam_giac; Var a1,h1,a2,h2 ,tong: real; Function dientich(a,h:real):real; Begin dientich:=a*h/2; end; BEGIN Write(‘ Nhap vao canh day cho tam giac a1=’);Readln(a1); Write(‘ Nhap vao canh day cho tam giac h1=’);Readln(h1); Write(‘ Nhap vao canh day cho tam giac a2=’);Readln(a2); Write(‘ Nhap vao canh day cho tam giac a2=’);Readln(h2); tong:=dientich(a1,h1)+dientich(a2,h2); Writeln(‘tong dien tich hai hinh la:’,Tong:8:2); Readln; END Thủ tục Cấu trúc thủ tục có dạng: PROCEDURE Ten_thu_tuc(Tham so 1:kiểu;Tham số 2: Kiểu; .;Var Tham số k: kiểu; Var tham số (k+1); ); Var Khai báo các biến cục bộ; Begin (29) Các lệnh tính toán; End; Lời gọi thủ tục: Ten_thu_tuc(Danh sách các tham số thực sự); Ví dụ:Viết thủ tục đổi chỗ hai số Sau đó dùng để viết chương trình xếp ba số a, b, c theo thứ tự tăng dần Program sapxep; Var a,b,c:integer; {**********************************************} Procedure doicho(Var a:integer;var b:integer); Var tg:integer; Begin tg:=a; a:=b; b:=tg; end; {Chuong trinh chinh} BEGIN Write(‘ Nhap vao a=’);Readln(a); Write(‘ Nhap vao b=’);Readln(b); Write(‘ Nhap vao c=’);Readln(c); if a>b then doicho(a,b); if a>c then doicho(a,c); if b>c then doicho(b,c); Writeln(‘ket qua la:’,a,b,c); readln; END Sự khác thủ tục và hàm Sự khác hàm và thủ tục: hàm cho giá trị thông qua tên hàm và hàm có thể tham gia vào các biểu thức tính toán, thủ tục không cho giá trị nào Trong thân hàm có giá trị gán cho tên hàm Các tham số khác sau tên hàm và tên thủ tục gọi là các tham số hình thức (hay còn gọi là đối) Trong thủ tục, các tham số hình thức có các loại: các tham số khai báo sau chữ Var gọi là tham số biến, các tham số khai báo không có chữ Var gọi là tham số giá trị Trong hàm có tham số giá trị Tham số thực là các tham số dùng lời gọi hàm hay thủ tục Danh sách các tham số thực lời gọi phải tương ứng với danh sách các tham số hình thức khai báo chương trình và chúng phải tương ứng kiểu Trong thủ tục, các tham số giá trị thường là các biến để chứa liệu đưa vào thủ tục; các tham số biến là các biến mà kết tính toán thủ tục chứa vào đó khỏi thủ tục, ta có thể dùng chúng để tính toán tiếp Biến toàn cục biến cục Biến toàn cục là biến khai báo đầu chương trình chính, tồn suốt thời gian làm việc chương trình Có thể sử dụng và làm thay đổi giá trị biến toàn cục nhờ các câu lệnh chương trình chính tất các chương trình Biến cục là biến khai báo đầu chương trình Chúng cấp phát nhớ chương trình gọi tới và bị xoá máy khỏi chương trình Biến cục có giá trị chương trình và tất các chương trình khác nằm chương trình này (30) Nếu tên biến cục chương trình trùng với tên biến toàn cục thì máy không bị nhầm lẫn, máy dùng hai ô nhớ khác để lưu trữ hai biến, khỏi chương trình biến cục bị xoá Khi gặp lời gọi tới chương trình con, máy thực các bước sau:  Cấp phát nhớ cho các đối, các biến cục  Truyền giá trị các tham số thực cho các tham số giá trị tương ứng, truyền địa các tham số thực ứng với tham số biến cho các tham số biến thủ tục  Thực các lệnh chương trình con, thực chương trình con, các biến cục và các tham số giá trị có thể bị biến đổi không ảnh hưởng tới các biến bên ngoài Trái lại thay đổi tham số biến chương trình kéo theo thay đổi tham số thực tương ứng (vì có truyền theo địa chỉ) Do đó, khỏi chương trình con, các tham số thực ứng với tham số biến giữ giá trị chương trình tạo  Thực xong các lệnh chương trình con, máy giải phóng các đối và các biến cục bộ, trở nơi gọi chương trình Lấy kết thực chương trình con: là hàm thì lấy kết tên hàm, là thủ tục thì lấy kết tham số thực ứng với tham số biến Khi cần lấy giá trị từ chương trình thì ta lập Function, cần lấy từ hai giá trị trở lên từ chương trình không lấy giá trị nào thì ta phải lập Procedure Một số ví dụ hàm Ví dụ 1: Viết hàm tính tổng các số chẵn từ a đến b (a, b nguyên) Bước 1: Phân tích thuật toán - Nhập vào hai số a và b - Khởi động biến t:=0 - Dùng vòng lặp với biến điều khiển là i chạy từ a b, quá trình chạy kiểm tra xem i chẵn (i mod 2=0) thì cộng i thêm vào tổng (t:=t+i) - Kết thúc Bước 2: Sơ đồ thuật toán (bạn đọc tự viết) Bước 3: Văn chương trình Program tinhtong; Var a,b:integer; {**************************************************} Function tong(a,b:integer):integer; Var i,t:integer; Begin t:=0; For i:=a to b If i mod 2=0 then t:=t+i; tong:=t; BEGIN Write(‘Nhap a=’);Readln(a); Write(‘Nhap b=’);Readln(b); Writeln(‘Tong cua cac so chan doan a va b la tong=’,tong(a,b)); Readln; END Ví dụ 2: (31) CHƯƠNG V KIỂU XÂU KÝ TỰ Xâu ký tự là kiểu liệu có cấu trúc dùng để xử lý các xâu ký tự Xâu ký tự giống kiểu mảng có điểm khác như: Số phần tử mảng phải xác định khai báo, xâu ký tự có thể thay đổi số lượng các ký tự xâu Khai báo kiểu xâu Var Tên_bien:String[n]; Trong đó: - N là ký tự cực đại có thể xâu - Chiều dài tối đa xâu là 255 - Nếu khai bao ta viết: Var ten_bien:String; thì pascal ngầm hiểu là độ dài xâu là 255 Ví dụ: Giả sử để lưu trữ Họ tên người ta khai báo sau: Var ten:string[25]; {Họ tên có thể chứa tối đa 25 ký tự} - Giả sử ta có xâu ST=’ Thanh hai phong’ Để ký tự thứ i xâu trên ta viêt theo cách sau: Tên_xâu[số thứ tự ký tự xâu] theo trên ta viết ST[i], ST[5] =’h’ Cấu trúc xâu ký tự Trong nhớ xâu chiếm số byte số ký tự cực chứa các ký tự xâu cộng thêm byte đầu tiên chứa ký tự mà mã ASCII ký tự này là số ký tự có xâu ký tự Ví dụ: VAR st:string[25]; và ST:=’ HAI PHONG’; Khi đó độ dài xâu là ký tự mặc dù độ dài cực đại xâu là 255 ký tự và cấu trúc xâu ST sau: chr(9) H A I P H O N G * 10 11 12 13 14 15 16 * * * * * * * 255 * Ký tự * biểudiễn ký tự không xác định Nhập và in xâu ký tự Muốn in xâu ký tự ST ngoài màn hình ta dùng lệnh Write(st) Writeln(st) Để đọc các ký tự cho xâu st với độ dài thực là số ký tự gõ vào từ bàn phím ta dùng lệnh Readln(ST); Ví dụ: Nhập vào họ và tên người và in họ tên người đó màn hình Program xau; Var ho_ten:string[25]; BEGIN Write(‘nhap vao ho ten:’);readln(ST); Writeln(ST); readln; END Các phép toán trên xâu ký tự - Phép nối xâu ‘Hai’ + ‘phong’=’Haiphong’ (32) - Các phép toán so sánh: Khi co hai xâu, các ký tự so sánh cặp từ trái qua phải theo giá trị bảng mã ASCII Nếu hai xâu có độ dài khác song số ký tự giống đến độ dài xâu ngắn thì xâu có độ dài ngắn coi là bé Ví dụ: ‘ABC’=’ABC’ có giá trị là true ‘ABC’=’AB’ có giá trị là FALSE ‘ABCD’>’ABEF’ có giá trị là True - Xâu ký tự tham gia vào các phép gán Các thủ tục và hàm trên xâu ký tự *Các thủ tục a DELETE(ST,Pos,Num): St: Biến kiểu String Num: Số ký tự cần xoá Pos: Vị trí bắt đầu xoá Thủ tục này dùng để xoá số ký tự là Num vị trí Pos Ví dụ: Nếu St:=’ Hai phong’ DELETE(st,3,2) cho kết st=’Haphong’ (33)

Ngày đăng: 10/09/2021, 15:02

Xem thêm:

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w