• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Паскаль. Многомерные массивы

boston1839

Ученик
Регистрация
2 Апр 2015
Сообщения
10
Реакции
0
Баллы
0
Паскаль. Многомерные массивы

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

Код:
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;
 
эмм... многомерный массив же. в нём есть столбцы и строки
 
Я наверное не совсем правильно задачу понял, раз в теме многомерные массивы ?
Опишите хотя бы тип массива. С одной стороны указано многомерные, ч другой стороны что то сказано про строки ?
т.е. это или A:array[1..10][1..X] of char; или может быть A:array[1..10] of string; ???
 
Извиняюсь. type matrix = array[0..n, 0..n] of integer;
 
обычно в паскале размерность массивов с единицы начинают (если вам все же надо с нуля, то код надо будет переписать, учитывая что длина массива получится на единицу больше)

Код:
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;
 
Попробовал сам написать код, но функция не хочет правильно работать. Можете помочь найти ошибку
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;
 
Вам надо "вывалиться" из цикла при первом же не совпадении, а не прогонять цикл до конца, т.е. если переписать вашу функцию:
Код:
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, в данном случае это не принципиально.
 
Уважаемые коллеги, вообще-то эта задачка решается в одну строку:
Код:
Function Test(A:Matrix; k:Byte):Boolean;
begin
 Test:=((k<10) and (A[k]=A[k+1])) or ((k=10) and (A[k]=A[1]));
end;
Всё! Потому что - не забываем! - двумерный массив в Паскале допускает интерпретацию, как "массив одномерных массивов", причем каждый одномерный массив - это строка матрицы.
 
Уважаемые коллеги, вообще-то эта задачка решается в одну строку:
Вы что то путаете коллега :) В данной постановке задачи подразумевается, что все элементы в строке К, равны всем элементам в строке К+1 (или для вырожденного случая при K=10 элементам в строке 1), в Вашем же примере при
Код:
  type Matrix = array[1..10,1..10] of Integer;
пример даже не скомпилиться, ругнется на несовместимость типов
 
Вы что то путаете коллега
Да, виноват - поторопился. Не учел, что операция проверки на равенство одномерных массивов некорректна. Казалось, что допустимо. Ан нет. Вы правы.
 
Назад
Сверху