Bảng nhảy



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 bta 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 xy. 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