Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 21:48   #1
Nikitos_
Пользователь
 
Регистрация: 30.05.2012
Сообщений: 32
Восклицание Почему то выводит только верхнюю строку массива(всего 4 строки)

Код:
Program fift;
uses crt,graph;
const
n=4;
var
bs:array [1..16] of integer;
as:array[1..n,1..n] of string;
gm,gd:integer;
i,j,vx,vy,l,ch:integer;

procedure Vivod;
var lx,ly:integer;
x,y:integer;
j1,i1:integer;
w1,h1:integer;
begin
w1:=30;
h1:=30;
for i1:=0 to 3 do
for j1:=0 to 3 do
begin
x:=235+j1*35;
y:=150+i1*35;
setFillStyle(1,8);
Bar(x,y,x+w1,y+h1);
end;
lx:=245;
ly:=162;
for i:=1 to 4 do
begin
for j:=1 to 4 do
begin
OutTextXY(lx,ly,as[i,j]);
lx:=lx+35;
end;
lx:=245;
ly:=ly+35;
end;
end;


procedure Tablo;

var b:integer;
k,z:integer;
begin
randomize;
For z:=1 to 16 do
begin
b:=random(15);
k:=1;
while k<>17 do
begin
if bs[k]=b then
begin
b:=random(17);
k:=1;
end
else k:=k+1;
end;
bs[z]:=b;
end;
z:=1;
for i:=1 to 4 do
begin
for j:=1 to 4 do
begin
case bs[z] of
1: as[i,j]:='1 ';
2: as[i,j]:='2 ';
3: as[i,j]:='3 ';
4: as[i,j]:='4 ';
5: as[i,j]:='5 ';
6: as[i,j]:='6 ';
7: as[i,j]:='7 ';
8: as[i,j]:='8 ';
9: as[i,j]:='9 ';
10: as[i,j]:='10';
11: as[i,j]:='11';
12: as[i,j]:='12';
13: as[i,j]:='13';
14: as[i,j]:='14';
15: as[i,j]:='15';
16: as[i,j]:='  ';
end;
z:=z+1;
end;
vivod;
end;
end;
BEGIN
gd:=detect;
initgraph(gm,gd,'c:\tp7.1\tp\bgi');
Tablo;
readln
end.
Nikitos_ вне форума Ответить с цитированием
Старый 04.06.2012, 06:01   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

1. У тебя вызов процедуры vivod стоит ВНУТРИ цикла по i, хотя должен быть за ним. Если бы ты нормально форматировал код отступами, ты бы это заметил.

Теперь слушай дальше..
Ты бы даже не заметил результат ошибки №1 (что поле на самом деле рисуется у тебя 4 раза, а не 1). Но тебе помешала ошибка №2 (а может, не помешала, а помогла выявить первую)).

2. Ты используешь ОДНИ И ТЕ ЖЕ переменные цикла в обеих процедурах. Таким образом, зайдя в процедуру vivod, не закончив цикл по i в процедуре Tablo, ты СБИВАЕШЬ цикл. НАСТОЯТЕЛЬНО рекомендую использовать только ЛОКАЛЬНЫЕ переменные для циклов (то есть, объявленные в той же процедуре/функции, где сам цикл).

А вообще, странные вещи ты делаешь...
Вот это:
Код:
  z:=1;
  for i:=1 to 4 do
  begin
    for j:=1 to 4 do
    begin
      case bs[z] of
        1: as[i,j]:='1 ';
        2: as[i,j]:='2 ';
        3: as[i,j]:='3 ';
        4: as[i,j]:='4 ';
        5: as[i,j]:='5 ';
        6: as[i,j]:='6 ';
        7: as[i,j]:='7 ';
        8: as[i,j]:='8 ';
        9: as[i,j]:='9 ';
        10: as[i,j]:='10';
        11: as[i,j]:='11';
        12: as[i,j]:='12';
        13: as[i,j]:='13';
        14: as[i,j]:='14';
        15: as[i,j]:='15';
        16: as[i,j]:='  ';
      end;
      z:=z+1;
    end;
  end;
можно заменить либо на это:
Код:
  for i:=1 to 4 do
    for j:=1 to 4 do
      if bs[i*4+j-4]=16 then
        as[i,j]:= '  '
      else
        Str(bs[i*4+j-4]:-2,as[i,j]);
либо на это:
Код:
const
  Stones: array[1..16] of string[2]=
    ('1 ','2 ','3 ','4 ','5 ','6 ','7 ','8 ','9 ','10','11','12','13','14','15','  ');
.....
  for i:=1 to 4 do
    for j:=1 to 4 do as[i,j]:= Stones[bs[i*4+j-4]];
либо на еще что-то в этом же роде.
А вообще этот твой as совсем не нужен..
Успехов тебе.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 04.06.2012, 11:59   #3
Nikitos_
Пользователь
 
Регистрация: 30.05.2012
Сообщений: 32
По умолчанию

можешь посмотреть в чём щас ошибка
Код:
Program fift;
uses crt,graph;
const
n=4;
var
a:array[1..n,1..n] of integer;
gm,gd,gh,vx,vy,l,i,j,n1,b:integer;
o:char;
strok, stolb:integer;
ch:char;

procedure  zastavka;
 begin
 end;
procedure kvadrat(x,y,c,k:integer) ;
var i,j:integer;
begin
for i:=0 to k-1 do
for j:=0 to k-1 do
rectangle(x,y,x+i*c+c,y+j*c+c);
end;


procedure massiv;
var
i,j,k: integer;
s: set of byte;
begin
s:=[];
randomize;
for i:=1 to n do   begin
for j:=1 to n do begin
repeat
k:=random(16)+1;
until not (k in s );
a[i,j]:=k; s:=s+[k];

end ;
end;
end;

Procedure pusto ;
begin
for i:=1 to 4 do
begin
for j:=1 to 4 do
begin
if a[i,j] = 16 Then
begin
Strok:=i;
Stolb:=J
end;
end;
end;
end;


procedure dvig;
begin
ch:=readkey;
end;
procedure Zamena;
begin
dvig;
if ch=#75 then
begin
if stolb<>0 then
begin
a[strok,stolb]:=a[strok,stolb+1];
a[strok,stolb+1]:=16;
stolb:=stolb+1;

end;
end;
if ch=#72 then
begin
if strok<>4 then
begin
a[strok,stolb]:=a[strok+1,stolb];
a[strok+1,stolb]:=16;
strok:=strok+1;

end;
end;
if ch=#77 then
begin
if stolb<>1 then
begin
a[strok,stolb]:=a[strok,stolb-1];
a[strok,stolb-1]:=16;
stolb:=stolb-1;

end;
end;
if ch=#80 then
begin
if strok<>1 then
begin
a[strok,stolb]:=a[strok-1,stolb];
a[strok-1,stolb]:=16;
strok:=strok-1;

end;
end;

end;

procedure odin (x,y,h:integer);
var i,j,d:integer;
ds:string;
begin
for i:=0 to 4-1 do
for j:=0 to 4-1   do    begin
d:=a[i+1,j+1];
str(d,ds);



if d<16 then
outtextXY (x+h div 2+h*j,y+h div 2+h*i, ds);
end;
end;

BEGIN
gd:=detect;
Initgraph(gm,gd,'C:\TP7.1\TP\BGI');
vx:=250;
vy:=200;
l:=60;
gh:=4;
massiv;
kvadrat(vx,vy,l,gh);
odin(vx,vy,l) ;
pusto;
dvig;
zamena;
closegraph;
readln
end.
Nikitos_ вне форума Ответить с цитированием
Старый 04.06.2012, 13:15   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Никитос, научись наконец разговаривать..
Не сказал КАКАЯ ошибка - я и смотреть не буду.
И повторяю еще раз: форматируй код.
Вот почему я должен твой код запустить, чтоб узнать, какая ошибка, а потом сформатить, чтоб разобраться? Все можно было бы просто посмотреть без компа. не говоря уж о том, что в сформатированном коде ты и сам легко нашел бы ошибки.. Я тебе что - форматилка-запускалка?
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 04.06.2012, 15:08   #5
Nikitos_
Пользователь
 
Регистрация: 30.05.2012
Сообщений: 32
По умолчанию

При запуске программы не выдаётся никаких ошибок , просто появляется табло, заполненное массивом от 1 до 16(рандомом), а после того как я хочу начать движение цифр кнопками(вверх,вниз,влево,вправо) ничего не происходит, вот я и немогу понять в чём ошибка((
Код:
Program fift;
uses crt,graph;
const
n=4;
var
a:array[1..n,1..n] of integer;
gm,gd,gh,vx,vy,l,i,j,n1,b:integer;
o:char;
strok, stolb:integer;
ch:char;

procedure  zastavka;
 begin
 end;
procedure kvadrat(x,y,c,k:integer) ;
var i,j:integer;
begin
for i:=0 to k-1 do
for j:=0 to k-1 do
rectangle(x,y,x+i*c+c,y+j*c+c);
end;


procedure massiv;
var
i,j,k: integer;
s: set of byte;
begin
s:=[];
randomize;
for i:=1 to n do   begin
for j:=1 to n do begin
repeat
k:=random(16)+1;
until not (k in s );
a[i,j]:=k; s:=s+[k];


end ;
end;
end;

Procedure pusto ;
begin
for i:=1 to 4 do
begin
for j:=1 to 4 do
begin
if a[i,j] = 16 Then
begin
Strok:=i;
Stolb:=J
end;
end;
end;
end;



procedure Zamena;
begin
ch:=readkey;
if ch=#75 then
begin
if stolb<>4 then
begin
a[strok,stolb]:=a[strok,stolb+1];
a[strok,stolb+1]:=16;
stolb:=stolb+1;

end;
end;
if ch=#72 then
begin
if strok<>4 then
begin
a[strok,stolb]:=a[strok+1,stolb];
a[strok+1,stolb]:=16;
strok:=strok+1;

end;
end;
if ch=#77 then
begin
if stolb<>1 then
begin
a[strok,stolb]:=a[strok,stolb-1];
a[strok,stolb-1]:=16;
stolb:=stolb-1;

end;
end;
if ch=#80 then
begin
if strok<>1 then
begin
a[strok,stolb]:=a[strok-1,stolb];
a[strok-1,stolb]:=16;
strok:=strok-1;

end;
end;
end;

procedure odin (x,y,h:integer);
var i,j,d:integer;
ds:string;
begin
for i:=0 to 4-1 do
for j:=0 to 4-1   do    begin
d:=a[i+1,j+1];
str(d,ds);



if d<16 then
outtextXY (x+h div 2+h*j,y+h div 2+h*i, ds);
end;
end;

BEGIN
gd:=detect;
Initgraph(gm,gd,'C:\TP7.1\TP\BGI');
vx:=250;
vy:=200;
l:=60;
gh:=4;
massiv;
kvadrat(vx,vy,l,gh);
odin(vx,vy,l) ;
pusto;
zamena;

readln
end.
Nikitos_ вне форума Ответить с цитированием
Старый 04.06.2012, 19:00   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Ваш отформатированный код:
Код:
program fift;

uses
  crt, graph;

const
  n = 4;

var
  a: array[1..n, 1..n] of integer;
  gm, gd, gh, vx, vy, l, i, j, n1, b: integer;
  o: char;
  strok, stolb: integer;
  ch: char;

procedure  zastavka;
begin
end;

procedure kvadrat(x, y, c, k: integer) ;
var
  i, j: integer;
begin
  for i := 0 to k - 1 do
    for j := 0 to k - 1 do
      rectangle(x, y, x + i * c + c, y + j * c + c);
end;

procedure massiv;
var
  i, j, k: integer;
  s: set of byte;
begin
  s := [];
  randomize;
  for i := 1 to n do   
  begin
    for j := 1 to n do 
    begin
      repeat
        k := random(16) + 1;
      until not (k in s );
      a[i, j] := k; s := s + [k];     
    end;
  end;
end;

procedure pusto ;
begin
  for i := 1 to 4 do
  begin
    for j := 1 to 4 do
    begin
      if a[i, j] = 16 Then
      begin
        Strok := i;
        Stolb := J
      end;
    end;
  end;
end;

procedure Zamena;
begin
  ch := readkey;
  if ch = #75 then
  begin
    if stolb <> 4 then
    begin
      a[strok, stolb] := a[strok, stolb + 1];
      a[strok, stolb + 1] := 16;
      stolb := stolb + 1;  
    end;
  end;
  if ch = #72 then
  begin
    if strok <> 4 then
    begin
      a[strok, stolb] := a[strok + 1, stolb];
      a[strok + 1, stolb] := 16;
      strok := strok + 1;    
    end;
  end;
  if ch = #77 then
  begin
    if stolb <> 1 then
    begin
      a[strok, stolb] := a[strok, stolb - 1];
      a[strok, stolb - 1] := 16;
      stolb := stolb - 1;   
    end;
  end;
  if ch = #80 then
  begin
    if strok <> 1 then
    begin
      a[strok, stolb] := a[strok - 1, stolb];
      a[strok - 1, stolb] := 16;
      strok := strok - 1;    
    end;
  end;
end;

procedure odin(x, y, h: integer);
var
  i, j, d: integer;
  ds: string;
begin
  for i := 0 to 4 - 1 do
    for j := 0 to 4 - 1   do    
    begin
      d := a[i + 1, j + 1];
      str(d, ds);     
      if d < 16 then
        outtextXY(x + h div 2 + h * j, y + h div 2 + h * i, ds);
    end;
end;

begin
  gd := detect;
  Initgraph(gm, gd, 'C:\TP7.1\TP\BGI');
  vx := 250;
  vy := 200;
  l := 60;
  gh := 4;
  massiv;
  kvadrat(vx, vy, l, gh);
  odin(vx, vy, l);
  pusto;
  zamena;  
  readln
end.
Установите Pascal ABC или Delphi 7, чтобы нормально форматировать код.
Как уже отмечал TinMan, в не форматированном коде невозможно разобраться.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 04.06.2012, 19:44   #7
Nikitos_
Пользователь
 
Регистрация: 30.05.2012
Сообщений: 32
По умолчанию

Спасибо за форматирование, а теперь кто нибудь может подсказать в чём ошибка
Nikitos_ вне форума Ответить с цитированием
Старый 05.06.2012, 10:29   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Спасибо за форматирование, а теперь кто нибудь может подсказать в чём ошибка
клавиши управления курсором имеют одну хитрость - они возвращают ДВОЙНОЙ код. сначала возвращается НОЛЬ, а потом уже код..
попробуйте так:
Код:
procedure Zamena;
begin
  ch := readkey;
  if ch = #0 then begin
    ch := readkey;
    if ch = #75 then
    begin
      if stolb <> 4 then
      begin
        a[strok, stolb] := a[strok, stolb + 1];
        a[strok, stolb + 1] := 16;
        stolb := stolb + 1;
      end;
    end;
    if ch = #72 then
    begin
      if strok <> 4 then
      begin
        a[strok, stolb] := a[strok + 1, stolb];
        a[strok + 1, stolb] := 16;
        strok := strok + 1;
      end;
    end;
    if ch = #77 then
    begin
      if stolb <> 1 then
      begin
        a[strok, stolb] := a[strok, stolb - 1];
        a[strok, stolb - 1] := 16;
        stolb := stolb - 1;
      end;
    end;
    if ch = #80 then
    begin
      if strok <> 1 then
      begin
        a[strok, stolb] := a[strok - 1, stolb];
        a[strok - 1, stolb] := 16;
        strok := strok - 1;
      end;
    end;
  end;
end;
p.s. вашу программу я НЕ ПРОВЕРЯЛ!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.06.2012, 14:46   #9
Nikitos_
Пользователь
 
Регистрация: 30.05.2012
Сообщений: 32
По умолчанию

всё равно не работает, может у кого-нибудь есть ещё какие нибудь идеи?
Nikitos_ вне форума Ответить с цитированием
Старый 05.06.2012, 21:18   #10
Nikitos_
Пользователь
 
Регистрация: 30.05.2012
Сообщений: 32
По умолчанию

Спасибо конечно всем за "помощь" очень помогли!!!!
Nikitos_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа FredPerry Паскаль, Turbo Pascal, PascalABC.NET 1 26.05.2012 08:17
функция получае на вход строку чисел, выводит строку символов DellOleg Microsoft Office Access 2 18.02.2012 11:17
Почему выводит строку 2 раза?!?!?! Dasharnb777 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 17.11.2010 11:06
printf выводит только два %s(строки) Mal4ishnik PHP 1 13.10.2009 00:01
passthru выводит только одну строку motorway PHP 5 07.07.2009 21:27