Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Двумерныйе масиивы

Автор: fly 4.05.2007 0:30

Помогите разобраься с задачкой.Условие такое:
Вводиться массив чисел MxM.Определить,сколько в нём пар одинаковых соседних элементов.
Пример:
Вводим массив размером 4x4
1 2 3 4
1 3 4 5
5 2 2 3
9 2 6 5

Ответ:3

Вот коешто написал:

Код

var
     A:array[1..100,1..100] of integer;
     n,b,i,j:integer;
begin
writeln('vv razmer massiva');
readln(n);
for i:=1 to n do
writeln('vvodite',n,'chisel');
for i:=0 to n-1 do begin
    for j:=0 to n-1 do begin
        Write('...');
    Readln(a[i,j]);
    end;
b:=0;
for i:=1 to n-1 do
begin
if a[i,1]=a[i,2] then b:=b+1;
if a[i,1]=a[i+1,2] then b:=b+1;
if a[i,1]=a[i+1,1] then b:=b+1;
for j:=2 to n-1 do
  begin
  if a[i,j]=a[i,j+1] then b:=b+1;
  if a[i,j]=a[i+1,j] then b:=b+1;
  if a[i,j]=a[i+1,j+1] then b:=b+1;
  if a[i,j]=a[i+1,j-1] then b:=b+1;
  end;
if a[i,n]=a[i+1,n] then b:=b+1;
if a[i,n]=a[i+1,n-1] then b:=b+1;
end;
for i:=1 to n-1 do
if a[n,i]=a[n,i+1] then b:=b+1
end;
writeln(b);
readln;
end.


Но почемуто когда вводишь такой массив:
1 2 3 4
1 3 4 5
5 2 2 3
9 2 6 5

Ответ получается 42,а должно быть 3.
Что неправильно в моём тексте?

Автор: klem4 4.05.2007 1:02

count := 0;
for i := 1 to m do
for j := 1 to m do begin
if (succ(j) <= m) and (x[i, j] = x[i, succ(j)]) then inc(count);
if (succ(i) <= m) and (x[i, j] = x[succ(i), j]) then inc(count);
end;

Автор: мисс_граффити 4.05.2007 1:04

ну, во-первых, ты считаешь и диагональные пары.
во-вторых, пары считаются по 2 раза.

Автор: fly 5.05.2007 1:27

Когда вводишь такой массив:
1 2 3 4
1 3 4 5
5 2 2 3
9 2 6 5

Ответ получается 24,я должно быть 3.Никак не пойму где ошибка.Вот мой текст

Код

var
     A:array[1..100,1..100] of integer;
     n,i,j:integer;
     count:integer;
begin
writeln('vv razmer massiva');
readln(n);
for i:=1 to n do
writeln('vvodite',n,'chisel');
for i:=0 to n-1 do begin
    for j:=0 to n-1 do begin
        Write('...');
    Readln(a[i,j]);
    end;
count := 0;
  for i := 1 to n do
   for j := 1 to n do begin
     if (succ(j) <= n) and (a[i, j] = a[i, succ(j)]) then inc(count);
     if (succ(i) <= n) and (a[i, j] = a[succ(i), j]) then inc(count);
   end;
   writeln(count);
   readln;
   end;
end.

Где у меня ошибка?

Автор: volvo 5.05.2007 5:19

Цитата
Никак не пойму где ошибка
При вводе данных... Почему ты записываешь информацию с 0-го индекса, хотя выше написано, что матрица индексируется с 1? Вот эти нули (в последнем столбце и последней строке) и делают тебе проблему...

Автор: fly 5.05.2007 20:42

volvo Если записывать информацию с 1 индекса то получается вот что:

Указываем размер массива 4x4
Начинаем ввод значений массива:

1 2 3 4
1 3 4 5
5 2 2 3
Но после ввода третьей строки прога пишёт ответ 19.Тоесть до ввода последней строки дело не доходит.
Кто нибуть знает в чём может быть проблема?

Автор: мисс_граффити 5.05.2007 20:54

for i:=1 to n do begin
for j:=1 to n do begin

а не до n-1

Автор: volvo 5.05.2007 20:58

Ха... Так у тебя структура программы нарушена... Смотри внимательно, что я поменял...

var
A:array[1..100,1..100] of integer;
n,i,j:integer;
count:integer;
begin
writeln('vv razmer massiva');
readln(n);
for i:=1 to n do
writeln('vvodite',n,'chisel');
for i:=1 to n do begin { <--- !!! }
for j:=1 to n do begin
Write('...');
Readln(a[i,j]);
end;
end; { <--- End переносится сюда }

count := 0;
for i := 1 to n do
for j := 1 to n do begin
if (succ(j) <= n) and (a[i, j] = a[i, succ(j)]) then inc(count);
if (succ(i) <= n) and (a[i, j] = a[succ(i), j]) then inc(count);
end;
writeln(count);
readln;
end.

(У тебя были неправильно вложенные циклы. Турбо-Паскаль на это внимания не обращает, но это есть ошибка...)

Автор: fly 5.05.2007 22:09

volvo Всёравно прога работает неправильно.
Если указываешь размер массива 4x4 то после ввода четвёртой строки ввод не прекращается,приходится вводить ещё 12 строк .Если указать размер массива 2x2,то приходится вводить не 2 строки а 4.

Автор: klem4 5.05.2007 22:13

ввод не по строкам а по элементам, сделай подсказку в цикле и все будет тебе понятно

or i:=1 to n do
writeln('vvodite',n,'chisel');
for i:=1 to n do begin { <--- !!! }
for j:=1 to n do begin
write('x[', i, ',', j, '] = '); { <---------------------------------------- }
Readln(a[i,j]);
end;
end;

Автор: volvo 5.05.2007 22:14

fly, я перед тем как запостить - проверил на твоем примере... Так что в следующий раз - уточняй, что "прога у меня работает неправильно."

А вводишь 16 строк - потому что ReadLN ... И потом... Ты изначально спрашивал что? Почему выдается неправильный ответ? Тебе не кажется, что проблема организации ВВОДА данных - это уже другая проблема?

Автор: fly 5.05.2007 22:31

Ну дык я вначале и спросил про неправыльный ответ,а потом про ввод данных.
С здачкой разобрался)))
Спасибо за помощь)))