UBND HUYỆN SÓC SƠN TRƯỜNG THCS TIÊN DƯỢC CHUYÊN ĐỀ BỒI DƯỠNG HỌC SINH GIỎI MÔN TIN HỌC – PHẦN LẬP TRÌNH Bài: TIẾT KIỆM BỘ NHỚ STACK TRONG KHAI BÁO BIẾN I – Yêu cầu: Kiến thức: - Biết kích thước dung lượng số kiểu liệu thường dùng; - Biết lợi ích việc tiết kiệm khai báo biến Kỹ năng: - Rè kỹ sử dụng ngôn ngữ lập trình Pascal - Thực việc khai náo đủ biến mà không thừa biến, không thừa rộng kiểu liệu - Phát triển tư tốt Thái độ: Nghiêm túc, xây dựng, tìm tòi, khám phá, phát huy sáng tạo II – Nội dung Hoạt động 1: Giới thiệu kích thước số kiểu dự liệu thường dùng Hoạt động thầy Nội dung Trong Pascal có số kiểu liệ thường dùng Integer, Real, Longint, String, … Trong trình viết chương trình ta không để ý đến kích thước kiểu liệu bời chưa phải toán lớn, toán cần nhiều biến Ta cần phải biết, mặc định Pascal nhớ Stack cấp cho 16384 byte Đã em gặp lỗi thông báo “structure too large” chưa? Đây thông báo “cấu trúc qua lớn” khai báo biến có tổng kích thước nhớ vượt cho phép nhớ Stack Làm để biết ta khai báo vượt Kích thước nhớ kiểu liệu Kích cho phép? Tên STT Riêng kiểu liêu String 256 byte, String[100] 101 byte Vậy kích thước khai báo string báo n tốn hết n+1 byte Mỗi biến hay thành phần biến dùng đến số lượng byte tương ứng Nếu khai báo: Var n,m: integer; dùng hết 8byte 10 11 kiểu Integer Byte Word Longint Sortint Real Single Double Char Boolean String Phạm vi giá trị thước (byte) -32768 32767 255 65535 -2147483648 2147483647 -128 127 2.9e-39 1.7e38 1.5e-45 3.4e38 5.0e-324 1.7e308 Kí tự True, False Xâu tối đa 255 kí tự 2 1 … 256 Var a:array[1 100] of real; dùng hết 100x6 = 600 byte - Ví dụ: Var a,b,c : Integer; Dùng hết 3x2 = byte Var a,b : Array[1 100] of longint; Dùng hết 2x100x6 = 1200 byte Var tb : string; ten: Array[1 50] of String[30]; Khi lập trình cần phải tiết dùng hết 256 + 50x31 = 1806 byte kiệm nhớ khai báo biến, đặc biệt cần thiết giải toán lớn có cần sử dụng nhiều biến Vậy làm ta tìm hiểu thêm qua toán cụ thể Hoạt động 2: Áp dụng Hoạt động thầy Bây tìm hiểu qua toán cụ thể xem nên tiết kiệm nhớ khái bái biến để viết chương trình giải toán - Khi viết chương trình xong để kiểm tra nghiệm chỉnh sửa lại chương trình thi ta hay dùng nghiệm có giá trị nhỏ để dễ nhẩm Thế cần ý đến điều kiện K lớn, phải thông báo giá trị F1000 - Theo công thức đệ quy dãy Fibo dễ nhận thấy K lớn Fk lớn Chắc chắn kiểu Integer không đủ để biểu diễn số lớn Có thể kiểu Longint chưa đủ Vậy cần phải sử dụng kiểu Int64 Free Pascal Như M số nguyên lớn nên M phải có kiểu Int64 Vậy chương trình viết nào? Nội dung Vận dụng Bài toán: Dãy số Fibonaci cho công thức F1 = F2 = 1, Fn = Fn-1 + Fn-2 (n≥3) a) Hãy tìm số Fibonaci thứ K (1≤K≤1000) b) Hãy tìm số Fibonaci lớn không vượt số M (1 Fk+1 không đưa thông báo kết Vậy chương trình hiệu chỉnh nào? - Như chương trình hoàn toàn thực Tuy nhiên ta lại thấy việc khai báo biến F mảng có nhiều 1000 phần tử (hầu chương trình klhai báo mảng rộng đến vậy), Fmax≤ M lại F1000 + trở lên giá trị F Và lại việc khai báo tốn nhiều bôn nhớ - Để ý thấy ta cần lấy giá trị F k giá trị nhỏ không cần Tuy nhiên ta lại cần có giá trị F i< Fk để tìm Fk Khi tìm Fk cần thêm Fk-1 để tính tiếp đến giá trị Fk+1 nên Fk-2 không cần dùng đến Như vậy, lần tìm số Fibo ta cần biẻt giá trị hai số trước Tóm lại lần tìm ta cần có ba biến để lưu giá trị số Fibo cần thiết Chương trình viết nào? End Program Fibonaci; Var i,K:integer; F:Array[1 1000] of longint; M:longint; Begin Write(' Nhap K = '); Readln(K); Write(' Nhap M = '); Readln(M); F[1] := 1; F[2] := 1; For i := to K F[i] := F[i-1] + F[i-2]; Writeln(' F',K,' = ',F[K]); i := 2; While F[i]