Sáng tạo với thuật toán và lập trình trong pascal và C
TỦ SÁCH TRI THỨC DUY TÂN NGUYỄN XUÂN HUY SÁNG TẠO TRONG THUẬT TỐN VÀ LẬP TRÌNH với ngơn ngữ Pascal C++ Tập Tuyển toán Tin nâng cao cho học sinh sinh viên giỏi MỤC LỤC Lời nói đầu Chương Các thuật toán String 1.1 Xâu kí tự 1.2 Về tổ chức liệu vào/ra 1.3 Data 1.4 Xâu chung 1.5 Đoạn chung 1.6 Đoạn lặp 11 1.7 Từ điển 14 1.8 TEFI 17 1.9 E xiếc 20 Chương Xử lí dãy lệnh biểu thức 23 2.1 Val 23 2.2 Xâu thu gọn 26 2.3 Robot 29 2.4 Hàm nhiều biến 33 2.5 Files 38 2.6 Gen 44 2.7 Tối ưu hóa chương trình 44 2.8 Mức biểu thức 45 2.9 Tháp 46 2.10 Mi trang 46 2.11 Xếp thẻ 49 2.12 Xếp xe 50 Chương Cặp ghép 51 3.1 Chị Hằng 51 3.2 Domino 55 3.3 Thám hiểm 59 3.4 Show 64 3.5 Cặp ghép cực đại: Chị Hằng 70 Chương Các phép lật chuyển vị 75 4.1 Lật xâu 75 4.2 Lật số nguyên 76 4.3 Sân bay vũ trụ 77 4.4 Cân 81 4.5 Biprime 87 4.6 Chuyển bi 90 4.7 Lát 94 4.8 Test 103 4.9 Giải mã 105 Chương Luyện tập từ đề thi 110 5.1 Số nguyên tố độ cao 110 5.2 Số nguyên tố số bít 112 5.3 Cắt hình 112 5.4 Tổng nhỏ 115 5.5 Lò cò 119 5.6 Chuyển tin 127 5.7 Mã BW 130 5.8 Tam giác Pascal 134 5.9 Sơn mô hình 138 5.10 Nhúng mơ hình 141 5.11 Số sát sau nhị phân 144 5.12 Hàm f(n) 150 5.13 Hàm h(n) 151 5.14 Rhythm 151 5.15 Cóc 152 5.16 Trả tiền 154 5.17 Game 156 5.18 Robots 160 Lời nói đầu Theo yêu cầu bạn đọc, tập minh họa hai ngơn ngữ lập trình Pascal Dev-C++ Pascal ngơn ngữ lập trình mang tính sư phạm cao dùng để giảng dạy nhà trường phổ thông theo chương trình hành Dev-C++ mơi trường mã nguồn mở bạn sinh viên yêu thích thường chọn làm mơi trường lập trình đua tài quốc gia quốc tế Cả hai môi trường Free Pascal Dev-C++ cung cấp miễn phí Internet Chúng tơi hy vọng tiếp tục nhận ý kiến đóng góp quý báu bạn đọc gần xa nội dung hình thức trình bày sách Hà Nội, Mùa Xuân năm Dần 2010 Nguyễn Xuân Huy Chương Các thuật tốn String 1.1 Xâu kí tự Xâu kí tự dãy kí tự viết liền Các kí tự lấy từ bảng chữ cho trước, thông thường bảng mã ASCII Trong tốn tin, kí tự thường hiểu chữ viết HOA viết thường theo trật tự bố trí bảng chữ tiếng Anh chữ số Có thể hiểu xâu kí tự mảng chiều chứa kí tự Đơi lúc ta gọi vắn tắt xâu Hiểu theo nghĩa ta khai báo xâu kí tự sau: // Dev-C++ char x[1000]; char *y = new char[1000]; Cả hai khai báo tương đương x, y có dung lượng hay sức chứa tới 1000 kí tự với số từ đên 999 Các xâu kí tự C++ kết thúc kí tự (dấu) kết xâu '\0' Bạn cần chắn dấu kết xâu ln ln có mặt xâu bạn quản lý Một số hàm hệ thống C++ tự động dặt dấu kết xâu vào cuối xâu kí tự Nếu bạn tự viết hàm xử lí xâu bạn cần có thao tác tường minh đặt dấu kết xâu vào cuối xâu Nếu bạn khai báo xâu kí tự x gồm 1000 kí tự bạn phép ghi vào xâu tối đa 999 kí tự (gọi kí tự có nghĩa) Vị trí cuối x[999] phải dành để ghi dấu kết xâu '\0' Trong Pascal với xâu ngắn, có chiều dài khơng q 255 kí, tự bạn nên sử dụng kiểu string, thí dụ (* Pas *) var x: string[100]; Khai báo cho phép bạn sử dụng xâu x mảng gồm 101 phần tử, x: array[0 100] of char; Tuy nhiên, bạn cần nhớ phần tử x[0] hệ thống dành riêng để ghi chiều dài hành xâu Thí dụ, (* Pascal *) var x: string[100]; x := 'abc'; gán x[1] = 'a'; x[2] = 'b'; x[3] = 'c'; Riêng x[0] gán kí tự có mã ASCII 3: x[0] = #3 Như bạn sử dụng 100 kí tự có nghĩa Chièu dài hành khác với sức chứa Xâu x nói có sức chứa 100 bytes dành cho bạn, khơng tính byte x[0], cịn chiều dài hành Chiều dài hành tính C++ hàm strlen, Pascal hàm length Với xâu dài 255 kí tự bạn nên khai báo mảng, thí dụ (* Pascal *) var x: array[1 1000] of char; xử lí x mảng Trong C++ có kiểu liệu string dành riêng cho việc quản lý xâu Với kiểu bạn thực số hàm tiện ích cộng hai xâu x+y, gán trị x = y, … Thí dụ, // Dev-C++ int main(){ string x = "abc", y = x; cout