Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 21.05.2015, 17:30   #1 (permalink)
boston1839
Новичок
 
Регистрация: 02.04.2015
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Паскаль. Многомерные массивы

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

Старый 21.05.2015, 17:30
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Не стоит делать поспешных действий, полистайте аналогичные проблемы

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

Старый 21.05.2015, 17:48   #2 (permalink)
MagentaTiger
Специалист
 
Аватар для MagentaTiger
 
Регистрация: 27.04.2015
Адрес: Москва
Сообщений: 1,423
Записей в дневнике: 4
Сказал(а) спасибо: 52
Поблагодарили 53 раз(а) в 16 сообщениях
Репутация: 18120
По умолчанию

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

Код:
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;
MagentaTiger вне форума   Ответить с цитированием
Старый 21.05.2015, 17:52   #3 (permalink)
boston1839
Новичок
 
Регистрация: 02.04.2015
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

эмм... многомерный массив же. в нём есть столбцы и строки
boston1839 вне форума   Ответить с цитированием
Старый 21.05.2015, 17:55   #4 (permalink)
MagentaTiger
Специалист
 
Аватар для MagentaTiger
 
Регистрация: 27.04.2015
Адрес: Москва
Сообщений: 1,423
Записей в дневнике: 4
Сказал(а) спасибо: 52
Поблагодарили 53 раз(а) в 16 сообщениях
Репутация: 18120
По умолчанию

Я наверное не совсем правильно задачу понял, раз в теме многомерные массивы ?
Опишите хотя бы тип массива. С одной стороны указано многомерные, ч другой стороны что то сказано про строки ?
т.е. это или A:array[1..10][1..X] of char; или может быть A:array[1..10] of string; ???
MagentaTiger вне форума   Ответить с цитированием
Старый 21.05.2015, 18:01   #5 (permalink)
boston1839
Новичок
 
Регистрация: 02.04.2015
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Извиняюсь. type matrix = array[0..n, 0..n] of integer;
boston1839 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 21.05.2015, 18:15   #6 (permalink)
MagentaTiger
Специалист
 
Аватар для MagentaTiger
 
Регистрация: 27.04.2015
Адрес: Москва
Сообщений: 1,423
Записей в дневнике: 4
Сказал(а) спасибо: 52
Поблагодарили 53 раз(а) в 16 сообщениях
Репутация: 18120
По умолчанию

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

Код:
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;
MagentaTiger вне форума   Ответить с цитированием
Старый 21.05.2015, 18:24   #7 (permalink)
boston1839
Новичок
 
Регистрация: 02.04.2015
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо вам
boston1839 вне форума   Ответить с цитированием
Старый 21.05.2015, 18:41   #8 (permalink)
boston1839
Новичок
 
Регистрация: 02.04.2015
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Попробовал сам написать код, но функция не хочет правильно работать. Можете помочь найти ошибку
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;
boston1839 вне форума   Ответить с цитированием
Старый 21.05.2015, 19:10   #9 (permalink)
MagentaTiger
Специалист
 
Аватар для MagentaTiger
 
Регистрация: 27.04.2015
Адрес: Москва
Сообщений: 1,423
Записей в дневнике: 4
Сказал(а) спасибо: 52
Поблагодарили 53 раз(а) в 16 сообщениях
Репутация: 18120
По умолчанию

Вам надо "вывалиться" из цикла при первом же не совпадении, а не прогонять цикл до конца, т.е. если переписать вашу функцию:
Код:
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, в данном случае это не принципиально.
MagentaTiger вне форума   Ответить с цитированием
Старый 21.05.2015, 19:19   #10 (permalink)
boston1839
Новичок
 
Регистрация: 02.04.2015
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Огромное спасибо!
boston1839 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.