1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài tập pasal nâng cao

14 409 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

Đọc kỹ đề, tìm hiểu các khái niệm trong đề. Phải hiểu thật rõ nội dung bài toán. Xác định các điều kiện đã cho: Bao gồm các điều kiện đã cho cụ thể được nêu trong đề bài và cả các điều kiện không nêu cụ thể (thường là các điều kiện sẳn có của các đối tượng tham gia trong bài toán). Các mối liên hệ của các đối tượng trong bài tooán.

Chủ đề Phân tích tìm lời giải cho toán lập trình Pascal Xác định toán Đọc kỹ đề, tìm hiểu khái niệm đề Phải hiểu thật rõ nội dung toán Xác định điều kiện cho: Bao gồm điều kiện cho cụ thể nêu đề điều kiện không nêu cụ thể (thường điều kiện sẳn có đối tượng tham gia toán) Các mối liên hệ đối tượng tooán Xác định kết cần thu được: Xác định rõ yêu cầu toán, kiểu trả kết quả: số, văn có/không (đúng/sai), quy cách xuất kết quả, … điều thường rõ yêu cầu toán, trường hợp không có, phải tự tổ chức cho việc xuất kết Xác định đại lượng trực tiếp tham gia toán Các đại lượng thường nêu cụ thể đề bài; đại lượng tham gia gián tiếp, đại lượng trung gian, đại lượng dùng làm dấu hiệu điều khiển cấu trúc rẽ nhánh, lặp, … Xây dựng thuật toán tổ chức liệu Đây bước chủ yếu lập trình Việc tìm giải thuật đắn hiệu để giải toán công việc đơn giản, đòi hỏi phân tích kỹ toán cho Bên cạnh số thuật toán mà người lập trình thiếu như: tích lũy, xếp, tìm kiếm, … người lập trình cần phải trang bị số mô hình thuộc lĩnh vực khác như: đồ thị, tổ hợp, hình học, tối ưu, quy hoạch, … nhằm hỗ trợ cho việc định hướng lời giải Trước bắt tay vào xây dựng thuật toán, ta phải trả lời câu hỏi: “Bài toán hay phần toán giải chưa? Nếu giải cách giải nào?” Giải toán nhiều cách chọn lựa cách làm mà máy tính thực Máy tính có khả tính toán khả phân tích, suy luận logic Do người lập trình phải làm công việc này, sau biến đổi thao tác suy luận, phân tích thành cấu trúc điều khiển để máy tính thực Viết chương trình Sau có thuật toán ta bắt tay vào xây dựng chương trình Việc viết chương trình thường dựa phương pháp Top − Down, xây dựng từ tổng thể đến chi tiết Để xây dựng khối tương ứng cần phải vận dụng kỹ thuật tổ chức chương trình con, đặc biệt lưu ý đến việc tổ chức tham số Việc tổ chức tốt khối giúp chương trình sáng sủa, ý đồ thuật toán thể rõ ràng, dễ tìm lỗi đặc biệt dễ mở rộng phát triển chương trình Trong trình thiết kế chương trình con, cần nhận diện chương trình có tính chất thường xuyên (gọi thường trình) để lưu trử chúng lại thành thư viện nhằm phục vụ lâu dài Kiểm chứng chương trình Sau chương trình chạy ta cần chạy thử ví dụ cụ thể để kiểm chứng kết Ta thường ý đến hai yếu tố: tính đắn tính hiệu Trong trình người lập trình tìm sửa lỗi logic, cú pháp để chương trình chạy cách hoàn hảo xác Chủ đề Phương pháp vét cạn – thử sai Phương pháp thực hiện: Gọi S tập tìm kiếm, x đối tượng cần tìm thỏa điều kiện K Duyệt qua tập S (∀x ∈ S) Nếu x thỏa K Ghi nhận x, không bỏ qua Hết; Ví dụ Nhập vào từ bàn phím số tự nhiên N, viết chương trình viết chương trình cho biết phân tích số N thành tổng hai hay nhiều số tự nhiên liên tiếp hay không? Trường hợp có thể tất cách biểu diễn N Hướng dẫn: − Hãy giải toán vài số cụ thể, ví dụ với 8, 15, 21 − Ta thấy N phân tích thành tổng số tự nhiên liên tiếp số hạng tổng không lớn N DIV , ta kiểm tra tổng số tự nhiên liên tiếp 1, 2, …, đến N DIV cho tổng lớn N dừng, không cộng tiếp Nếu tổng N ghi nhận tổng xuất hình Ví dụ Cho biểu thức: ((((1 ? 2) ? 3) ? 4) ? 5) ? Hãy tìm tất cách thay dấu ? dấu phép tính +, −, *, /, biểu thức cho biểu thức có giá trị 30 Ví dụ: ((((1 + 2) − 3) / 4) + 5) * = 30 Hướng dẫn: − Ta thấy cần kiểm tra 54 = 625 trường hợp biểu thức − Để thực điều này, ta xây dựng hàm F(a, b, t) để tính giá trị a t b với pt[t] bốn phép tính +, −, *, / Program Dien_phep_toan; Const pt : Array[1 4] of char = ('+', '−', '*', '/'); Var t1, t2, t3, t4, t5 : Integer; Function F(a, b : Real; t : Integer) : Real; Begin Case t of : F := a + b; : F := a − b; : F := a * b; : F := a / b; End; End; − Lúc ta cần sử dụng vòng lặp để kiểm tra biểu thức F(F(F(F(1, 2, t1), 3, t2), 4, t3), 5, t4), 6, t5) = 30 Nếu giá trị t1, t2, t3, t4, t5 thỏa điều kiện ta xuất dấu phép toán tương ứng với số t1, t2, t3, t4, t5: pt[t1], pt[t2], pt[t3], pt[t4], pt[t5], tức là: Writeln('((((1', pt[t1], '2)', pt[t2], '3)', pt[t3], '4)', pt[t4], '5)', pt[t5], '6 = 30'); Ví dụ Tìm cách điền chữ số khác {1, 2, 3, 4, 5, 6, 7, 8, 9} vào bảng vuông kích thước 3x3 sau: a a' a'' b b' b'' c c' c'' Sao cho: Hướng dẫn: − Theo đề ta thấy tập S chứa số cần tìm từ 123 đến 333 For i:=123 to 333 Begin j:= * i; k:= * i; Kiểm tra số i, j, k; End; Trong thao tác kiểm tra i, j, k nghĩa kiểm tra số i, j, k có chứa đủ chữa số {1, 2, 3, 4, 5, 6, 7, 8, 9} không Procedure Kiemtra(i, j, k : Integer); Var x : Array[1 9] of Integer; Begin x[1]:=i mod 10; x[2]:=(i div 10) mod 10; x[3]:=i div 100; x[4]:=j mod 10; x[5]:=(j div 10) mod 10; x[6]:=j div 100; x[7]:=k mod 10; x[8]:=(k div 10) mod 10; x[9]:=k div 100; if ([x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9]]=[1,2,3,4,5,6,7,8,9]) then Begin writeln(x[3],' ',x[2],' ',x[1]); writeln(x[6],' ',x[5],' ',x[4]); writeln(x[9],' ',x[8],' ',x[7]); writeln; end; end; Chủ đề Tìm kiếm, xếp mảng Dữ liệu kiểu mảng 1.1 Chuyển mảng hai chiều vào mảng chiều Để chuyển giá trị phần tử mảng hai chiều A(M, N) vào mảng chiều B(M*N) ta dùng công thức sau: 1.2 Chuyển mảng chiều vào mảng hai chiều Để chuyển giá trị mảng chiều B[M*N] vào mảng hai chiều A[M, N] ta dùng công thức: Các toán tìm kiếm 2.1 Bài toán Cho dãy gồm n ghi R[1 n] Mỗi ghi R[i] (1 ≤ i ≤ n) tương ứng với khóa K[i] Hãy tìm ghi có giá trị khóa X cho trước X gọi khóa tìm kiếm Kết việc tìm kiếm : + Tìm ghi có khóa tương ứng X, lúc phép tìm kiếm thành công Hoặc + Không tìm ghi có khóa tương ứng X, lúc phép tìm kiếm thất bại 2.2.Phương pháp tìm kiếm Bắt đầu từ ghi đầu tiên, so sánh khóa tìm kiếm với khóa tương ứng ghi danh sách, tìm thấy ghi mong muốn duyệt hết danh sách mà không thấy 2.3.Phương pháp tìm kiếm nhị phân Phương pháp tìm kiếm nhị phân áp dụng dãy khóa thứ tự Tức là: K[1] ≤ K[2] ≤ ≤ K[n] * Thuật toán Giả sử cần tìm X đoạn K[L R] (L ≤ R), trước hết ta xét khóa nằm đoạn K[Mid] với Mid = (L + R) div + Nếu X > K[Mid] nghĩa đoạn K[L Mid] chứa toàn khóa < X ta tiến hành tìm kiếm X đoạn K[Mid+1 R] + Nếu X < K[Mid] nghĩa đoạn K[Mid R] chứa toàn khóa > X ta tiến hành tìm kiếm X đoạn K[L Mid - 1] + Nếu K[Mid] = X tìm kiếm thành công (kết thúc trình tìm kiếm) Quá trình tìm kiếm thất bại bước đoạn tìm kiếm rỗng tức L > R Các toán xếp 3.1.Phương pháp đổi chổ trực tiếp − Ý tưởng phương pháp tên gọi Ta thực duyệt cặp phần tử mảng, cặp chưa thứ tự cần có đổi chỗ hai phần tử cho Lặp lại việc mảng thứ tự 3.1.1 Mô tả + Bước 1: Bắt đầu từ đầu mút phải a[n], xét cặp phần tử cạnh a[n], a[n−1], đổi chỗ chúng cho sai thứ tự Nếu đứng thứ tự Tiến thêm trái mội vị trí, nghĩa xét cặp a[n−1], a[n−2] Lặp lại phép kiểm tra đổi chỗ tới mút trái Sau bước phần tử nhỏ vị trí + Bước i: Bắt đầu từ đầu mút phải a[n] Xét cặp phần tử cạnh a[n], a[n−1], đổi chỗ chúng cho sai thứ tự Tiến thêm trái mội vị trí, lặp lại phép kiểm tra đổi chỗ tới vị trí i Sau bước phần tử nhỏ thứ i vị trí i Dãy a[1], a[2], a[i] thứ tự Sau n bước lặp trên, mảng xếp xong Nếu viết mảng theo chiều đứng thành cột lên phần tử mảng giống bọt nước nhẹ phải dần lên, nặng phải chìm dần xuống mức trọng lượng Vì lẽ mà phương pháp có tên gọi xếp kiểu bọt (Bubble sort) Bảng trình bày diễn biến qua bước việc xếp mảng ban đầu gồm số, xếp theo chiều dọc từ xuống cột Kết xếp sau bước 1,2,3,4 viết cột 3.1.2 Ví dụ minh họa Ví dụ: Viết chương trình nhập vào dãy n số nguyên A = {a 1, a2, …, an} in dãy theo thứ tự từ bé đến lớn (n ≤ 100) * Chương trình: Program Xep_be_lon_1; Uses CRT; Var A : ARRAY[1 100] of Integer; i,j,n,temp : Integer; Begin Clrscr; Write('Nhap vao dai cua day: '); Readln(n); For i := to n Begin Write('a[', i, '] = '); Readln(a[i]); End; For i:=2 to n-1 Begin For j:= n downto i if a[j-1] > a[j] then Begin temp:=a[j-1]; a[j-1]:=a[j]; a[j]:=temp; End; End; Writeln('Ket qua sap xep tu be den lon la:'); For i := to n Write(a[i], ' '); Readln; End 3.2 Phương pháp chèn trực tiếp − Ý tưởng: Phương pháp giống người chơi nhặt quân chia chèn vào chỗ phần cầm tay Cụ thể là: xuất phát từ đầu dãy nguồn, lấy dần phần tử chèn vào chỗ dãy đích Để tiết kiệm chỗ, ta không bố trí dãy đích nơi khác mà xếp vào phần bỏ trống đầu dãy nguồn, lấy dần phần tử Như dãy đích dãy nguồn liền nhau, cộng lại chiếm n chỗ 3.2.1 Mô tả + Bước xuất phát: + Bước 1: Rút phần tử a[1] từ dãy nguồn xếp vào dãy đích Vì dãy đích có phần tử a [1] nên vị trí theo thứ tự cần xếp + Bước thứ i: Rút phần tử x = a[i] từ dãy nguồn chèn vào dãy đích cho chỗ dãy đích a[1] đến a[i−1] Dãy đích gồm i phần tử xếp thứ tự + Bước thứ n: Lặp hết dãy nguồn, tức i = n, mảng xếp xong Bảng trình bày diễn biến trình xếp mảng gồm số theo thuật giải chèn trực tiếp mô tả Dấu vạch chéo vách ngăn dãy đích bên trái dãy nguồn bên phải Thao tác “Rút phần tử x = a[i] từ dãy nguồn chèn vào dãy đích cho chỗ dãy đích a[1] đến a[i−1]” sau: So sánh x với phần tử kề sát bên trái a[i−1], x bé dồn a[i −1] sang phải phép gán a[i] := a[i−1] Tiến dần bên trái Lặp lại công việc x lớn phần tử bên trái dừng x tiến đến vị trí 3.2.2 Ví dụ minh họa Ví dụ: Viết chương trình nhập vào dãy n số nguyên A = {a 1, a2, …, an} in dãy theo thứ tự từ bé đến lớn (n ≤ 100) * Chương trình: Program Xep_be_lon_2; Uses CRT; Var A : ARRAY[1 100] of Integer; i,j,n,x : Integer; Begin Clrscr; Write('Nhap vao dai cua day: '); Readln(n); For i := to n Begin Write('a[', i, '] = '); Readln(a[i]); End; For i:=2 to n Begin x:= a[i]; j:= i-1; While (x < a[j]) AND (j > 0) Begin a[j+1]:= a[j]; j:= j-1; End; a[j+1]:= x; End; Writeln('Ket qua sap xep tu be den lon la:'); For i := to n Write(a[i], ' '); Readln; End 3.3 Phương pháp chọn trực tiếp − Ý tưởng: Phương pháp giống lại toàn quân theo thứ tự cách rải rộng mặt bàn nhặt dần từ thấp trở lên Cụ thể là: chọn phần tử nhỏ dãy nguồn, xếp vào vị trí dãy đích Đây phần tử thứ phần tử cuối dãy đích Chọn phần tử nhỏ dãy nguồn lại, phần tử nhỏ thứ hai, xếp vào vị tri thứ hai vị trí cuối dãy đích vào lúc Lặp lại việc hết dãy nguồn Để tiết kiệm chỗ, ta xếp dãy đích dãy nguồn liền mảng, giống phương pháp trước Do đó, bước thứ i, thao tác "xếp vào cuối dãy đích" "đổi chỗ cho a[i]" 3.3.1 Mô tả + Xuất phát: + Bước 1: Chọn phần tử nhỏ dãy nguồn đổi chỗ với a[1] + Bước i: Chọn phần tử nhỏ dãy nguồn a[i], a[i+1], …, a[n] đổi chổ với a[i] Lặp hết dãy nguồn, i = n So sánh với phương pháp chèn: − Phương pháp chèn lấy phần tử dãy nguồn lại, chèn vào chỗ dãy đích Làm việc với dãy đích − Phương pháp chọn lấy phần tử nhỏ dãy nguồn lại xếp vào cuối dãy đích Làm việc với dãy nguồn Bảng trình bày diễn biến trình xếp mảng gồm số theo thuật giải chọn trực tiếp mô tả Dấu vạch chéo vách ngăn dãy đích bên trái dãy nguồn bên phải 3.3.2 Ví dụ minh họa Ví dụ: Viết chương trình nhập vào dãy n số nguyên A = {a 1, a2, …, an} in dãy theo thứ tự từ bé đến lớn (n ≤ 100) * Chương trình: Program Xep_be_lon_2; Uses CRT; Var A : ARRAY[1 100] of Integer; i,j,k,n,Min : Integer; Begin Clrscr; Write('Nhap vao dai cua day: '); Readln(n); For i := to n Begin Write('a[', i, '] = '); Readln(a[i]); End; For i := to n−1 Begin Min := a[i]; k := i; For j := i+1 to n If Min > a[j] then Begin Min := a[j]; k := j; End; a[k] := a[i]; a[i] := Min; End; Writeln('Ket qua sap xep tu be den lon la:'); For i := to n Write(a[i], ' '); Readln; End Ví dụ Nhập từ bàn phím N số nguyên dương Sắp xếp lại dãy cách đưa số lẽ lên đầu dãy, số chẳn phía cuối dãy Hướng dẫn: − Dùng biến kt để điều khiển việc dừng vòng lặp Khởi đầu kt = true Dùng vòng lặp, chừng kt True làm: Kt = False Dùng vòng lặp cho i chạy từ đến n-1 (a[i] chẳn) (a[i+1] lẽ) đổi chỗ a[i] a[i+1] cho nhau, kt = True Kết thúc vòng lặp; Ví dụ Cho dãy số thực A số nguyên dương K Xét xem dãy A có k số dương đứng cạnh hay không? Hướng dẫn: − Dùng biến d để đếm k số dương đứng cạnh − Dùng biến dk để đếm số dương vừa đọc đứng cạnh Khởi đầu: d=0 , dk=0 Dùng vòng lặp cho i chạy từ đến n a[i] > dk = dk+1 dk >= k tăng d = d + ngược lại (tức a[i] ≤ 0) dk = Kết thúc vòng lặp; Nếu d > trả lời “có” Ngược lại trả lời “ không” Ví dụ Cho dãy số thực A số nguyên K ≥ Xét xem dãy A có K số đứng cạnh lập thành cấp số cộng hay không? Hướng dẫn: − Dùng biến d để đếm k số đứng cạnh tạo thành cấp số cộng − Dùng biến dk để đếm số vừa đọc đứng cạnh có tính chất: với số đứng kề sau lập thành cấp số cộng Khởi đầu: d=0 , dk=0 Dùng vòng lặp cho i chạy từ đến n − a[i], a[i+1] a[i+2] tạo thành cấp số cộng dk = dk+1 dk >= k tăng d = d + ngược lại dk = Kết thúc vòng lặp; Nếu d > trả lời “có” Ngược lại trả lời “ không” Ví dụ Nhập vào dãy A= {a1, a2, …, an} gồm N số nguyên Sắp xếp lại dãy gồm phần tử khác (các phần tử giống giữ lại một) theo thứ tự tăng dần Hướng dẫn: − Đầu tiên, ta xóa bỏ phần tử giống vòng lặp: i := 1; While i < n Begin For j := i + to n If a[j] = a[i] then Begin n := n − 1; For k := j to n a[k] := a[k + 1]; i := i − 1; End; i := i + 1; End; − Tiếp theo ta xếp dãy theo thứ tự tăng dần Chủ đề Xử lý FILE Tệp văn Khai báo Tệp văn Ngôn ngữ lập trình Pascal hiểu theo nghĩa chuẩn, liệu lưu trữ dạng ký tự bảng mã ASCII Các ký tự liên kết thành dòng, dấu hết dòng ghi nhận cặp ký tự điểu khiển có mã 13 (ký tự trở đầu dòng - CR) ký tự có mã 10 (ký tự xuống dòng - LF) Không có quy định chiều dài dòng cho tệp văn Ngôn ngữ lập trình Pascal dùng tên chuẩn Text đặt cho kiểu tệp văn Nên cú pháp khai báo biến tệp văn sau: VAR Tên_biến_tệp : TEXT; Các thao tác Các bước thao tác tệp văn đại thể giống tệp định kiểu  Đầu tiên cần đăng ký biến tệp văn (f) với tên tệp đĩa (name) thủ tục: Assign(f, name);  Sau mở tệp thủ tục ReSet(f) có, để chuẩn bị đọc mở tệp thủ tục ReWrite(f) định tạo mới, để chuẩn bị ghi Chú ý + Sau Reset(f) đọc sau Rewrite(f) ghi + Mỗi lần đọc ghi xong trỏ lại định vị đến vị trí Việc định vị tiến hành nhờ thao tác đọc ghi  Đọc, ghi vào tệp: Việc đọc liệu từ tệp văn nhờ thủ tục Read(f, var1, var2,…), Readln(f, var1, var2,…) var1, var2, biến thuộc kiểu char, string, real, integer Sự khác Read Readln Readln đọc hết dòng để định vị đến dòng (các liệu thừa có bị bỏ qua) Read không Việc ghi kiệu tệp văn giống việc đưa chúng hình nhờ thủ tục Write(f, exp1, exp2,…), Writeln(f, exp1, exp2,…) exp1, exp2, biểu thức thuộc kiểu char, string, real, integer Thủ tục Writeln ghi thêm cặp ký tự xuống dòng sau ghi giá trị biểu thức  Sau thao tác xong cần đóng tệp thủ tục Close(f ) để đảm bảo an toàn liệu * Một số hàm, thủ tục làm việc với tệp: + Thủ tục Append(Biến_tệp); Chức năng: Dùng để mở văn chuẩn bị ghi nối tiếp Sau mở tệp thủ tục Append, phép thực thao tác ghi vào tệp + Hàm EOF(Biến_tệp); Chức năng: Trả TRUE cuối tệp, ngược lại trả FALSE + Hàm SeekEOF(Biến_tệp); Chức năng: Trả TRUE cuối tệp (bỏ qua dấu cách, tab, dấu xuống dòng trước điểm hết tệp), ngược lại trả FALSE + Hàm EOL(Biến_tệp); Chức năng: Trả TRUE cuối dòng, ngược lại trả FALSE + Hàm SeekEOL(Biến_tệp); Chức năng: Trả TRUE cuối hàng (bỏ qua dấu cách, tab trước điểm hết dòng), ngược lại trả FALSE Ví dụ Cho dãy số nguyên A số nguyên dương K Xét xem dãy A có k số dương đứng cạnh hay không? Dữ liệu vào từ file DAYVAO.TXT gồm dòng: + Dòng thứ ghi số n + Dòng thứ ghi số k + Dòng thứ ghi số dãy A, số cách dấu cách Kết ghi file DAYRA.TXT: ghi số đầu Nếu dãy ghi số VD: DAYVAO.TXT DAYRA.TXT -2 -6 Ví dụ Viết chương trình nhập vào dãy A= {a1, a2, …, an} gồm N số nguyên đưa cặp số có hiệu chia hết cho + Dữ liệu vào từ file CHIA3VAO.TXT gồm hai dòng − Dòng thứ ghi số N, số phần tử dãy A − Dòng thứ hai ghi phần tử dãy A, phần tử cách dấu cách + Kết ghi file CHIA3RA.TXT − Dòng thứ ghi số cặp thỏa điều kiện − Các dòng tiếp theo, dòng ghi cặp thỏa mãn Ví dụ: CHIA3VAO.TXT CHIA3RA.TXT 23759 25 39 Ví dụ Cho dãy số nguyên A gồm N số Hãy dãy tăng dài gồm phần tử liên tiếp (ít phần tử) mảng Dữ liệu vảo từ file DAYTANG.INP gồm dòng: + Dòng thứ ghi số n + Dòng thứ ghi số dãy A, số cách dấu cách Kết ghi file DAYTANG.OUT: ghi số đầu cuối dãy tìm Nếu dãy ghi số VD: DAYTANG.INP DAYTANG.OUT 21367359 Hướng dẫn: Begin d:=0; c:=0; i:=0; Repeat Inc(i); While (A[i]>A[i+1]) and (i

Ngày đăng: 17/10/2016, 14:33

Xem thêm: Bài tập pasal nâng cao

TỪ KHÓA LIÊN QUAN

Mục lục

    1. Xác định bài toán

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

TÀI LIỆU LIÊN QUAN

w