Помощь - Поиск - Пользователи - Календарь
Полная версия: Логическая функция
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SeRGuS
Описать логическую функцию, проверяющую упорядочены ли по возрастанию или убыванию элементы массива.

Проверьте где я допустил ошибку.

Код

uses crt;
const n=5;
type mass= array[1..n] of integer;
var a:mass;
   i:integer;
   p: boolean;

function yp(a:mass):boolean;
var i: integer;
    p:boolean;
begin
 p:=false;
  for  i:=1 to n-1 do
   if (a[i] > a[i+1]) or (a[i] < a[i+1]) then p:=true;
 yp:=p;
end;

begin
clrscr;
for i:=1 to n do begin
    write ('a[',i,']=');
    read (a[i]); end;

if yp(a) then writeln('упоряд.')
      else writeln('не упоряд.');
end.

xds
Цитата
Код
if (a[i] > a[i+1]) or (a[i] < a[i+1]) then p:=true;

Надо проверять условия возрастания/убывания отдельно:

Код

{ ... }
p1 := True;
p2 := True;
for i := 1 to n - 1 do
 begin
   p1 := p1 and (a[i] > a[i + 1]);
   p2 := p2 and (a[i] < a[i + 1]);
 end;
yp := p1 or p2;
{ ... }
SHnur
Я бы сделал что-то вроде такого.
Код


uses crt;
const n=5;
type mass= array[1..n] of integer;
var a:mass;
  i:integer;

function MintoMax(a:mass):boolean;
var i: integer;
   p:boolean;
begin
 p:=false;
 for  i:=1 to n-1 do
  if (a[i] < a[i+1]) then p:=true
  else begin
  p:=false;
  exit;
  end;

  MinToMax:=p;
end;

function MaxToMIn(a:mass):boolean;
var i: integer;
   p:boolean;
begin
p:=false;
 for  i:=1 to n-1 do
  if (a[i] > a[i+1]) then p:=true
  else begin
  p := false;
  exit;
  end;
  MaxToMIn:=p;
end;

begin
clrscr;
for i:=1 to n do begin
   write ('a[',i,']=');
   read (a[i]); end;

if (mintomax(a) or maxtomin(a)) then writeln('упоряд.')
     else writeln('не упоряд.');
end.
Altair
И не работает. smile.gif
Код
yp:=p;

заменить на
Код
MixnoMax:=p;

кстати может все-таки MinToMax ? smile.gif
SHnur
Вот так smile.gif
а там ведь главное принцип smile.gif) Просто лень было Паскаль пускать для теста ..
xds
Можно и так... Только если совсем-совсем одну функцию надо... ;) :D
SHnur
xds , конечно .. так как у тебя , намного проще ;)
xds
Не факт (не для всех проще). Встречал много людей, которые очень удивлялись, увидев присвоение логической переменной результата логического же выражения smile.gif
SHnur
помоему ещё чаше люди удивляются применению логичиских операторов к численым значениям ;))
у меня самого долго в голове не уеладывалось "как ?" ;)
Altair
SHnur,
А работает-то не правильно smile.gif
вот "текстовый скришот":
Цитата
a[1]=1
a[2]=3
a[3]=2
a[4]=5
a[5]=6
упоряд.


smile.gif

так что в алгоритме ошибка.
xds
В котором?
SHnur
Oleg_Z , так точно должно работать ! Проверь ;)
Altair
Цитата(SHnur @ 16.01.05 15:22)
Я бы сделал что-то вроде такого.
Код


uses crt;
const n=5;
type mass= array[1..n] of integer;
var a:mass;
  i:integer;

function MintoMax(a:mass):boolean;
var i: integer;
   p:boolean;
begin
 p:=false;
 for  i:=1 to n-1 do
  if (a[i] < a[i+1]) then p:=true
  else begin
  p:=false;
  exit;
  end;

  MinToMax:=p;
end;

function MaxToMIn(a:mass):boolean;
var i: integer;
   p:boolean;
begin
p:=false;
 for  i:=1 to n-1 do
  if (a[i] > a[i+1]) then p:=true
  else begin
  p := false;
  exit;
  end;
  MaxToMIn:=p;
end;

begin
clrscr;
for i:=1 to n do begin
   write ('a[',i,']=');
   read (a[i]); end;

if (mintomax(a) or maxtomin(a)) then writeln('упоряд.')
     else writeln('не упоряд.');
end.

вот результат.
Цитата
a[1]=1
a[2]=3
a[3]=2
a[4]=5
a[5]=6
упоряд.


НЕ РАБОТАЕТ!
SHnur
Oleg_Z , я отредактировал его ! Посмотри заново !

Код

uses crt;
const n=5;
type mass= array[1..n] of integer;
var a:mass;
 i:integer;

function MintoMax(a:mass):boolean;
var i: integer;
  p:boolean;
begin
p:=false;
for  i:=1 to n-1 do
 if (a[i] < a[i+1]) then p:=true
 else begin
    MinToMax:=false;
    exit;
 end;

 MinToMax:=p;
end;

function MaxToMIn(a:mass):boolean;
var i: integer;
  p:boolean;
begin
p:=false;
for  i:=1 to n-1 do
 if (a[i] > a[i+1]) then p:=true
 else begin
 MaxToMIn := false;
 exit;
 end;
 MaxToMIn:=p;
end;

begin
clrscr;
for i:=1 to n do begin
  write ('a[',i,']=');
  read (a[i]); end;

  writeln( (mintomax(a) or maxtomin(a)));
  readkey;
end.
Altair
так хорошо smile.gif
SHnur
Oleg_Z , я думал просто , что exit выходит только из цикла а не из всей функции ... оэтому не хотело работать ;)

Индюк тоже думал, да в суп попал smile.gif проверять надо!
volvo
Цитата(SHnur @ 16.01.05 14:34)
Просто лень было Паскаль пускать для теста ..

Вот и напрасно. В следующий раз читай правила, я ведь просил проверять программы перед тем, как их постить.


Согласен, я сейчас вынесу это в основные правила!
SHnur
ОК ! Без проверки небуду кидать ! :p2:
APAL
Цитата
думал просто , что exit выходит только из цикла а не из всей функции ...

Break; - прерывает цикл, а exit; выходит из подпрограмм
SHnur
APAL , спасибо за информацию !

а в HELP залезть было слабо?
Break -Прерывает операторы циклов For, While или Repeat.
Exit - Немедленно выходит из текущего блока программы.
Halt - Останавливает выполнение программы и выходит в операционную систему.
xds
Олежка, уж очень агрессивно ты отреагировал... Поспокойнее :D

да нееее, я просто смайлы забываю smile.gif
ЗЫ: все, пофлеймили и хватит smile.gif
SHnur
Oleg_Z , если честно то я и не спрашивал , и не искал инфу про Exit, Break и Halt ... Цель другая была ... А рас уж мне пояснили , то я решил поблагодарить !
Я смотрю , что лучше тут меньше говорить ... а то каждый всё по своему понимает ... sad.gif

нееее, ты не прав! просто 100 раз подумай, проверь, а потом запость smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.