Lập trình Pascal - P2

20 368 2
Tài liệu đã được kiểm tra trùng lặp
Lập trình Pascal - P2

Đ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

Lê Minh Hoàng 2 Nội dung bài học Kiểu liệt kê và kiểu đoạn con Kiểu dữ liệu có cấu trúc: Mảng Mảng 1 chiều Mảng 2 chiều Mảng nhiều chiều Mảng động Một số bài toán 3 Khai báo kiểu Cú pháp khai báo kiểu do người lập trình định nghĩa type TypeIndentifier = TypeDeclaration; TypeIdentifier là tên kiểu do người lập trình tự đặt TypeDeclaration là mô tả kiểu dữ liệu theo cú pháp của từng kiểu. Về thứ tự, FPC không ràng buộc về thứ tự khai báo hằng, biến, kiểu. Tuy nhiên nếu không gặp khó khăn gì, khai báo kiểu (type) nên đặt sau khai báo hằng (const) và trước khai báo biến (var) Ví dụ: Khai báo kiểu đoạn con và kiểu liệt kê type TMyIntType = 1 200; TDayOfWeek = (Mon, Tue, Wed, Thu, Fri, Sat, Sun); 4 Kiểu liệt kê (Enumerated Type) type TypeIdentifier = (Id1, Id2, ., IdN); Trong đó TypeIdentifier là tên kiểu, Id1 N là các tên liệt kê các hằng trong kiểu đó. Công dụng: Dùng tên gợi nhớ thay vì mã hóa các hằng đó thành hằng số Ví dụ type TDOW = (Mon, Tue, Wed, Thu, Fri, Sat, Sun); var DOW: TDOW; Khi đó ta có thể viết những lệnh sau trong phần thân chương trình DOW := Tue; WriteLn(Ord(DOW)); //In ra số 1 DOW := TDOW(2); //DOW := Wed Hàm Ord(hằng kiểu liệt kê) cho ta số thứ tự của hằng đó trong kiểu (hằng đầu tiên có số thứ tự 0) Ép kiểu: Tên kiểu liệt kê(Số thứ tự): Cho ta biết hằng mang số thứ tự tương ứng Không được nhập/in ra trực tiếp hằng/biến kiểu liệt kê. Tự học: Đọc thêm ở đây 5 Kiểu đoạn con (Sub-range type) type TypeIdentifier = LowestValue HighestValue; TypeIdentifier là tên kiểu đoạn con, LowestValue và HighestValue là hai hằng thuộc cùng một kiểu đơn giản có thứ tự đã được định nghĩa trước Ví dụ: type TDOW = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); TWorkingDay = Mon Fri; TCapitalAlphabet = 'A' 'Z'; var WD: TWorkingDay; Letter: TCaptitalAlphabet; Khi đó ta có thể gán các giá trị Mon, Tue, Wed, Thu, Fri cho biến WD, gán các ký tự là chữ cái in hoa cho biến Letter. Hàm Ord(Giá trị kiểu đoạn con) sẽ trả về số thứ tự trong kiểu cơ sở. WD := Mon; WriteLn(Ord(WD)); //Vẫn in ra số 1 Tự học: Đọc thêm ở đây. 6 Định nghĩa mảng Mảng (array) là một tập hợp các phần tử: Cùng kiểu Có thứ tự Lưu trữ liên tục trong bộ nhớ Việc truy cập phần tử mảng được thực hiện thông qua tên mảng và chỉ số. Khai báo mảng trong Pascal. Có 2 cách: Khai báo kiểu mảng và biến mảng Khai báo trực tiếp biến mảng. 7 Mảng 1 chiều Mảng 1 chiều thường để lưu giá trị của các dãy. Trong toán học ta viết, a 1 , a 2 , …, a n Trong Pascal ta viết a[1], a[2], …, a[n]. Khai báo kiểu mảng một chiều type ArrayType = array[IndexType] of ElementType; ArrayType là tên kiểu mảng do người lập trình đặt, IndexType là tên kiểu chỉ số, ElementType là tên kiểu phần tử. Kiểu chỉ số phải là kiểu đơn giản, có thứ tự, Ví dụ type T = array[1 10000] of Integer; var a: T; b: array['A' 'Z'] of Boolean; a là một mảng có 10000 phần tử số nguyên: a[1], a[2], ., a[10000] b là một mảng có 26 phần tử kiểu logic: b['A'], b['B'], ., b['Z']. Ở đây dùng cách khai báo trực tiếp, không qua định nghĩa kiểu 8 Nhập/xuất mảng một chiều Không thể nhập trực tiếp một mảng, phải nhập giá trị từng phần tử Mảng luôn phải khai báo số phần tử đủ lớn để chương trình có thể thực hiện được trong mọi trường hợp, trên thực tế số phần tử có thể ít hơn số lượng khai báo Ví dụ: Nhập vào một số nguyên dương n và các số nguyên a 1 , a 2 , ., a n . In ra dãy a 1 n theo thứ tự ngược lại Để nhập các phần tử a 1 n , ta phải nhập lần lượt a 1 , a 2 , .,a n , như vậy với mọi chỉ số i chạy từ 1 tới n, ta phải nhập a i . ⇒ Cách thông dụng nhất là sử dụng vòng lặp for. Để xuất các phần tử a n 1 , với mọi chỉ số i từ n về 1, ta phải xuất a i ⇒ Cách đơn giản nhất là sử dụng vòng lặp for. 9 Ví dụ: Nhập xuất mảng program ArrayExample; const max = 10000; var a: array[1 max] of Integer; n, i: Integer; begin Write('n = '); ReadLn(n); for i := 1 to n do begin Write('a[', i, ']='); ReadLn(a[i]); end; for i := n downto 1 do Write(a[i], ', '); end. Giao diện nhập/xuất n = 5 ↵ a[1] = 1↵ a[2] = 4↵ a[3] = 2↵ a[4] = 3↵ a[5] = 5↵ 5, 3, 2, 4, 1, 10 Bài tập 1 Nhập vào số nguyên dương n ≤ 10000 và các số nguyên a 1 , a 2 , ., a n . Cho biết mảng a 1 n có bao nhiêu số nguyên tố và chúng xuất hiện ở những vị trí nào trong mảng Ví dụ n = 10 a = (1, 3, 5, 7, 9, 11, 13, 15, 17, 19) Có 7 số nguyên tố: a[2], a[3], a[4], a[6], a[7], a[9], a[10]. Cách làm Khởi tạo count := 0 Với mỗi i chạy từ 1 tới n, kiểm tra a[i] có phải số nguyên tố hay không, nếu có thì thông báo dãy a có số nguyên tố tại ví trí i và tăng biến count lên 1 Cuối cùng là in ra thông báo có count số nguyên tố [...]... cách chèn a[i] vào dãy a[1 i-1] để được dãy a[1 i] đã sắp Bước n: Xét a[n], tìm cách chèn a[n] vào dãy a[1 n-1] để được dãy a[1 n] đã được sắp 16 Bài tập 4: InsertionSort (tiếp) Bài toán chèn: a[1 i-1] đã sắp: a[1] ≤ a[2] ≤ … ≤ a[i-1] Cần chèn giá trị temp=a[i] vào dãy a[1 i-1] để được dãy a[1 i] đã sắp Thuật toán chèn: xét chỉ số j chạy từ i - 1 ngược về đầu dãy, Nếu gặp phần... := i - 1; while (j > 0) and (a[j] > temp) do begin a[j + 1] := a[j]; j := j - 1 end; a[j + 1] := temp; 1 2 3 4 5 11 33 55 77 99 j j j j j 6 22 17 Bài tập 4: InsertionSort (tiếp) Mô hình thuật toán InsertionSort for i := 2 to n do begin temp := a[i]; j := i - 1; while (j > 0) and (a[j] > temp) do begin a[j + 1] := a[j]; j := j – 1; end; a[j + 1] := temp; end; Hãy tự viết chương trình Thử chương trình. .. có dãy ban đầu đã được sắp, nếu không thì đặt h := h div 2 và lặp lại Hãy tự viết chương trình và thử kiểm tra tốc độ ShellSort với một dãy số ngẫu nhiên… 19 Bài tập 6 (**): Chia kẹo Cho n gói kẹo đánh số từ 1 đến n, gói kẹo thứ i có a[i] viên kẹo Giả thiết 2 ≤ n ≤ 200 và 1 ≤ a[i] ≤ 200 với ∀i: 1 ≤ i ≤ n Hãy lập trình nhập vào số n và các số a[1 n], tìm cách chia các gói kẹo làm 2 nhóm sao cho độ chênh... and (a[j] > temp) do begin a[j + 1] := a[j]; j := j – 1; end; a[j + 1] := temp; end; Hãy tự viết chương trình Thử chương trình với 100000 giá trị ngẫu nhiên cho mảng A Thử chương trình với A = 1, 2, …, 100000 Thử chương trình với A = 100000, 99999, …, 1 Đánh giá trường hợp tốt nhất và xấu nhất của InsertionSort 18 Bài tập 5 (*) ShellSort ShellSort: là thuật toán đề xuất bởi D.L.Shell (1959), có tốc... n]}, đảo giá trị cho a[2] Bước i: Chọn phần tử nhỏ nhất trong các phần tử {a[i n]}, đảo giá trị cho a[i] Bước n – 1: Chọn phần tử nhỏ nhất trong 2 phần tử {a[n-1], a[n]}, đảo giá trị cho a[n-1] 14 Bài tập 3: SelectionSort (tiếp) Mô hình thuật toán SelectionSort for i := 1 to n – 1 do //Làm n – 1 bước begin //Tìm jmin là chỉ số pt nhỏ nhất trong tập {a[i n]} . pháp khai báo kiểu do người lập trình định nghĩa type TypeIndentifier = TypeDeclaration; TypeIdentifier là tên kiểu do người lập trình tự đặt TypeDeclaration. InsertionSort (tiếp) Bài toán chèn: a[1 i-1] đã sắp: a[1] ≤ a[2] ≤ … ≤ a[i-1]. Cần chèn giá trị temp=a[i] vào dãy a[1 i-1] để được dãy a[1 i] đã sắp. Thuật

Ngày đăng: 06/07/2013, 01:27

Tài liệu cùng người dùng

Tài liệu liên quan