Bảng nhảy, gia sư tin học tại nhà, dạy kèm tin học tại hà nội.
Bảng nhảy bước b, bậc k là một
tấm bảng có đặc tính kì lạ sau đây: nếu bạn viết lần lượt lên bảng n số nguyên
thì sau khi viết số thứ i, số thứ (i –
b) đã viết trước đó sẽ được tăng thêm k
đơn vị mà ta gọi là nhảy số.
Với
mỗi cặp số nguyên dương b và k cho trước hãy lập trình để biến màn hình máy
tính của bạn thành một bảng nhảy sau đó thử viết lên tấm bảng đó để nhận được
dãy N số tự nhiên đầu tiên 1 2 ... N với mỗi N cho trước.
Thí dụ, để thu được dãy số 1 2 ... 10 trên bảng nhảy bước b = 3 bậc k = 6 bạn cần viết dãy số sau:
-5 -4
-3 -2 -1 0 1 8 9 10
Gợi ý
Với mỗi bước b
ta cần lưu lại b giá trị nạp trước đó
trong đoạn a[0..b-1] của mảng a đồng thời
với vị trí hiển thị trên màn hình của các giá trị đó trong các mảng tương ứng x và y. Ta sử dụng số học đồng dư cho việc lưu trữ này, cụ thể là khi
cần nạp phần tử thứ i trước hết ta
nạp vào một biến đệm z. Sau đó ta
tăng phần tử a[i mod b] thêm k đơn vị và
tìm đến cột x[i mod b], dòng y[i mod b] để cập nhật lại giá trị này. Cuối cùng ta chuyển giá trị z vào a[i mod b]. Nói cách khác ta xử lí vùng đệm a[0..(b - 1)] theo nguyên tắc vòng tròn. Các chi tiết xử lí màn hình
trong trường hợp chuyển dòng và cuộn màn hình khi thao tác ở dòng cuối màn hình
là đơn giản và được chỉ rõ trong chương trình
(* Pascal
*)
uses crt;
const
MN = 50;
d = 6; {chieu dai
cua moi so}
ML = 12; {so luong
tren mot dong}
LIM = d*ML; BL = #32;
W = 500; {kich
thuoc toi da cua bang nhay}
var
a: array [0..MN] of integer; {vung dem}
{toa do con tro man hinh}
x, y: array [0..MN] of byte;
{-------------------------------
Viet n
so tren bang nhay bac k buoc b
---------------------------------}
procedure
BangNhay(b,k,n: integer);
var i, j, z, t: integer;
xx, yy: byte; {vi tri con tro}
begin
textattr
:= 7; clrscr;
writeln('Bang
nhay bac ',k,' buoc ',b);
writeln('
gom ',n,' so');
writeln('Bat
dau nap day ',n,' so.');
writeln('Sau
moi so bam ENTER');
xx:=
wherex; yy:= wherey;
for i := 0 to n-1 do
begin
gotoxy(xx,yy); readln(z); {nap 1 so}
if i < b then t := i
else
begin
t:= i
MOD b;
for j:=
1 to 5 do
begin
{sua lai so truoc do b buoc}
gotoxy(x[t],y[t]); write(BL:d);
gotoxy(x[t],y[t]); write(a[t]);
delay(W);
gotoxy(x[t],y[t]); write(BL:d);
gotoxy(x[t],y[t]); write(a[t]+k);
delay(W);
end;
end;
x[t]
:= xx; y[t]:= yy;
a[t]
:= z; xx:= xx + d;
if xx
> LIM then
begin
xx:= 1;
if yy
< 24 then inc(yy)
else
begin
gotoxy(1,25); writeln;
for j := 0 to b do dec(y[j]);
end;
end;
end;
gotoxy(xx,yy); write(' KET ');
readln;
end;
BEGIN
BangNhay(3,6,10);
(* Loi
giai: -5 -4 -3 -2 -1 0 1 8 9 10 *)
END.
Không có nhận xét nào:
Đăng nhận xét