Cách dùng hàm fillchar trong pascal
Nêu vd
Nêu vd
Thủ tục này giúp chúng ta khởi tạo hoặc “lấp đầy” một vùng nhớ (thường là một biến mảng hoặc xâu ký tự) bằng một giá trị byte một cách nhanh chóng. Thay vì phải dùng vòng lặp FOR để gán giá trị cho từng phần tử, FillChar sẽ làm việc này hiệu quả hơn rất nhiều.
Chúng ta hãy cùng đi vào chi tiết nhé.
1. Cú pháp của thủ tục FillChar
Cú pháp chuẩn của thủ tục FillChar như sau:
FillChar( Tên_biến, Số_byte, Giá_trị );
Trong đó:
- Tên_biến (VarName): Là tên của biến mà chúng ta muốn điền dữ liệu vào. Đây là địa chỉ bắt đầu của vùng nhớ cần điền. Thông thường, chúng ta sẽ điền tên của một biến mảng hoặc xâu ký tự.
- Số_byte (Count): Là một số nguyên, chỉ định số lượng byte của vùng nhớ sẽ được điền. Để lấy được số byte chính xác của một biến, chúng ta thường dùng hàm SizeOf(Tên_biến).
- Giá_trị (Value): Là giá trị mà chúng ta muốn điền vào mỗi byte của vùng nhớ. Giá trị này có thể là một ký tự (ví dụ: ‘A’, ‘*’) hoặc một số (ví dụ: 0, 255).
2. Ví dụ minh họa chi tiết
Để các em dễ hình dung, chúng ta sẽ xét một bài toán quen thuộc: Khởi tạo tất cả các phần tử của một mảng số nguyên về giá trị 0.
Bài toán: Cho một mảng A có 100 phần tử kiểu số nguyên (integer). Hãy gán giá trị 0 cho tất cả các phần tử của mảng.
Bước 1: Cách làm thông thường dùng vòng lặp FOR
Trước khi dùng FillChar, chúng ta hãy nhớ lại cách làm cũ. Chúng ta sẽ dùng một vòng lặp FOR chạy từ đầu mảng đến cuối mảng và gán giá trị 0 cho từng phần tử.
Chương trình mẫu:
PROGRAM Khoi_Tao_Mang_FOR; USES Crt; VAR A: ARRAY[1..100] OF Integer; i: Integer; BEGIN ClrScr;
{ Gan gia tri 0 cho tung phan tu } FOR i := 1 TO 100 DO A[i] := 0;
{ In ra phan tu thu 50 de kiem tra } WriteLn('Phan tu A[50] co gia tri la: ', A[50]);
ReadLn; END.
Cách này hoàn toàn đúng, nhưng khi mảng có kích thước rất lớn (ví dụ hàng triệu phần tử), chương trình sẽ chạy chậm hơn.
Bước 2: Sử dụng thủ tục FillChar để tối ưu
Bây giờ, chúng ta sẽ áp dụng FillChar để giải quyết bài toán trên một cách hiệu quả hơn.
Xác định các tham số cho FillChar:
- Tên_biến: Biến mảng chúng ta cần khởi tạo là A.
- Số_byte: Chúng ta cần điền vào toàn bộ mảng A. Vì vậy, số byte cần điền chính là kích thước của cả mảng A. Ta sẽ dùng hàm SizeOf(A) để lấy giá trị này.
- Giá_trị: Chúng ta muốn gán giá trị 0 cho các phần tử, nên ta sẽ điền vào giá trị là số 0.
Câu lệnh hoàn chỉnh sẽ là: FillChar(A, SizeOf(A), 0);
Chương trình mẫu:
PROGRAM Khoi_Tao_Mang_FillChar; USES Crt; VAR A: ARRAY[1..100] OF Integer; BEGIN ClrScr;
{ Su dung FillChar de gan gia tri 0 cho toan bo mang } FillChar(A, SizeOf(A), 0);
{ In ra phan tu thu 50 de kiem tra } WriteLn('Phan tu A[50] co gia tri la: ', A[50]);
ReadLn; END.
Các em thấy không? Chỉ với một dòng lệnh duy nhất, chúng ta đã có thể khởi tạo toàn bộ mảng. Cách này vừa ngắn gọn, vừa chạy nhanh hơn rất nhiều so với dùng vòng lặp.
3. Một ví dụ khác với mảng ký tự
Giả sử chúng ta muốn khởi tạo một mảng 50 ký tự với toàn bộ là dấu cách (‘ ‘).
VAR MangKyTu: ARRAY[1..50] OF Char; BEGIN ... FillChar(MangKyTu, SizeOf(MangKyTu), ' '); ... END.
Lưu ý quan trọng cần nhớ:
- FillChar làm việc dựa trên đơn vị là byte. Đây là điểm cốt lõi các em phải nắm vững.
- Luôn ưu tiên dùng hàm SizeOf() để đảm bảo tính chính xác về kích thước vùng nhớ, tránh gây lỗi chương trình.
- FillChar là một thủ tục (Procedure), không phải là hàm (Function), vì nó thực hiện một hành động chứ không trả về giá trị nào.
Hy vọng qua bài giảng này, các em đã hiểu rõ cách sử dụng thủ tục FillChar. Đây là một công cụ rất mạnh để xử lý dữ liệu mảng và xâu, các em hãy luyện tập thường xuyên để sử dụng thành thạo nhé. Chúc các em học tốt
FillChar(a,SizeOf(a),<giá trị>);
trong đó a là mảng, thay vì phải gán từng mảng cùng một giá trị thì lệnh giúp tiết kiệm thời gian
Vd: mảng a0..an Fillchar(s,sizeof(a),’1′); –> a0=1, a1=1,…,an=1