Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Паскаль. Многомерные массивы (http://www.tehnari.ru/f41/t102623/)

boston1839 21.05.2015 17:30

Паскаль. Многомерные массивы
 
Помогите пожалуйста.
Напишите логическую функцию TEST(A, k), принимающую значение True, если k-я строка массива совпадает с k+1 (при k=10 совпадает с 1-й строкой).

MagentaTiger 21.05.2015 17:48

и чему вас в школе учат :( бедолаги как жить то будете ?
строка массива ? наверное имеется ввиду ЭЛЕМЕНТ массива ?

Код:

function TEST(A:array[1..10] of integer,k:Integer):Boolean;
begin
 Result:=false;
 if k>10 then exit;
 if ((k=10) AND (A[10]=a[1])) OR ((k<10) AND (A[k]=a[k+1])) then Result:=true;
end;


boston1839 21.05.2015 17:52

эмм... многомерный массив же. в нём есть столбцы и строки

MagentaTiger 21.05.2015 17:55

Я наверное не совсем правильно задачу понял, раз в теме многомерные массивы ?
Опишите хотя бы тип массива. С одной стороны указано многомерные, ч другой стороны что то сказано про строки ?
т.е. это или A:array[1..10][1..X] of char; или может быть A:array[1..10] of string; ???

boston1839 21.05.2015 18:01

Извиняюсь. type matrix = array[0..n, 0..n] of integer;

MagentaTiger 21.05.2015 18:15

обычно в паскале размерность массивов с единицы начинают (если вам все же надо с нуля, то код надо будет переписать, учитывая что длина массива получится на единицу больше)

Код:

const
HEIGHT_MATRIX=10, {первая размерность массива }
WIDTH_MATRIX=10; {это длина строки будет, вторая размерность массива }


function TEST(A:array[1..HEIGHT_MATRIX][1..WIDTH_MATRIX] of Integer;k:Integer):Boolean;
{* функция сравнения одномерных массивов.
Сравниваем только на равенство *}
  function cmpmatrix(s,d:array [1..WIDTH_MATRIX] of Integer):Boolen;
  var i:Integer;
  begin
      Result:=true;
      for i:=1 to WIDTH_MATRIX do
        if s[i]<>d[i] then
            begin
              Result:=false;
              break;
            end;
  end;
 
begin
 Result:=false;
 if k>HEIGHT_MATRIX then exit; {* что бы не вылететь за размерность массива *}

  {* тут я подозреваю что вместо 10 нужно HEIGHT_MATRIX,
  но в условии четко сказано про число 10 :),
  при HEIGHT_MATRIX=10 это не существенно *}
  if ((k=10) AND cmpmatrix(A[10],A[1])) OR ((k<>10) AND cmpmatrix(A[k],a[k+1]))     
    then Result:=true;
end;


boston1839 21.05.2015 18:24

спасибо вам

boston1839 21.05.2015 18:41

Попробовал сам написать код, но функция не хочет правильно работать. Можете помочь найти ошибку
function Test(A: matrix;k:integer):boolean;
var i:integer;
begin
if k=n then
for i:=1 to n do
if A[k,i]=A[1,i] then Test:=true
else Test:=false;
if k<>n then
for i:=1 to n do
if A[k,i]=A[k+1,i] then Test:=true
else Test:=false;
end;

MagentaTiger 21.05.2015 19:10

Вам надо "вывалиться" из цикла при первом же не совпадении, а не прогонять цикл до конца, т.е. если переписать вашу функцию:
Код:

function Test(A: matrix;k:integer):boolean;
var i:integer;
begin
Test:=true;
if k=n then
  for i:=1 to n do
    if A[k,i]<>A[1,i] then
      begin
        Test:=false;
          exit; {* сразу выйдем из функции, дальше смысла проверять нет *}
      end;
// if k<>n then это заменим на else
else
  for i:=1 to n do
      if A[k,i]<>A[k+1,i] then
          begin
              Test:=false;
              exit; {* сразу выйдем из функции, дальше смысла проверять нет *}
          end;
end;

вместо exit, можно использовать break, в данном случае это не принципиально.

boston1839 21.05.2015 19:19

Огромное спасибо!


Часовой пояс GMT +4, время: 07:59.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.