Помощь - Поиск - Пользователи - Календарь
Полная версия: выписать элементы, которые не входят в массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
redeezko
Задача: пусть дан одномерный массив размерностью n, и Min-наименьшее, а Max-наибольшее из них. Получите в порядке возрастания все числа из интервала (min,max), которые не входят в данный массив.
Вот что я написал:
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;
const n=5;
type u=array [1..n] of integer;
var x:u;
   i,min,max,v,k,j,a:integer;
begin
  v:=0;
  writeln('vvedite massiv');
  for i:=1 to n do read(x[i]);
  for i:=1 to n do
      begin
        k:=i;
        for j:=i+1 to n do
            if x[j]<x[k] then k:=j;
        v:=x[i];
        x[i]:=x[k];
        x[k]:=v;
      end;
  min:=x[1];
  max:=x[n];
  while min<max do
        begin
           min:=min+1;
             if x[i]<>min then
               write(min,' ');
                 i:=i+1;
        end;
  readln;
  readln;
end.

Но почему то у меня выводятся ВСЕ числа из данного интервала, кто знает подскажите где ошибка
Unconnected
Может, так?

function prov(x:byte;mas:array of byte;n:byte):boolean;
var i:byte;
begin
  prov:=false;
  for i:=1 to n do if (mas[i]=x) then begin
                                        prov:=true;
                                        break;
                                      end;
end;

var min,max,i,n:byte;
    mas:array[1..255] of byte;
begin
  randomize;
  writeln('Vvedite razmer massiva');
  readln(n);
  for i:=1 to n do mas[i]:=random(50)+1;
  min:=mas[1];max:=mas[1];
  for i:=2 to n do if min>mas[i] then min:=mas[i];
  for i:=2 to n do if max<mas[i] then max:=mas[i];
  for i:=min to max do if not(prov(i,mas,n)) then writeln(i);
  readln;
end.

redeezko
Спасибо большое что откликнулись, но мы функции не изучали еще. Мне желательно просто подсказать какие изменения нужно внести в мой код
Unconnected
Тогда можно так:

var min,max,i,i2,n:byte;
    mas:array[1..255] of byte;
    d:boolean;
begin
  randomize;
  writeln('Vvedite razmer massiva');
  readln(n);
  for i:=1 to n do mas[i]:=random(50)+1;
  min:=mas[1];max:=mas[1];
  for i:=2 to n do if min>mas[i] then min:=mas[i];
  for i:=2 to n do if max<mas[i] then max:=mas[i];
  for i:=min to max do
  begin
    d:=false;
    for i2:=1 to n do if (mas[i2]=i) then begin
                                           d:=true;
                                           break;
                                         end;
    if not(d) then writeln(i);
  end;
  readln;
end.

Lapp
Unconnected,
1. зачем делать в трех циклах то, что можно сделать в одном?
2. зачем приучать новичка к break там, где все легко делается через while/repeat?

Короче, redeezko, вот я начал с твоей проги, но потом вынужден был уйти.. smile.gif
uses
  SysUtils;
const
  n= 20;
type
  u=array [1..n] of integer;
var
  x: u;
  i,j,min,max,r: integer;

begin
  r:=n;
  min:=r;
  max:=-r;
  for i:=1 to n do begin
    x[i]:=Random(r)-Random(r);
    if min>x[i] then min:=x[i];
    if max<x[i] then max:=x[i]
  end;
  for i:=min+1 to max-1 do begin
    j:=1;
    while (j<=n)and(i<>x[j]) do Inc(j);
    if j>n then WriteLn(i)
  end
end.

Спрашивай, что неясно.
redeezko
Lapp спасибо большое! во всем разобрался, помогло очень!
Unconnected
Lapp, а мне вот просто интересно, зачем было объявлять u=array [1..n] of integer;, а потом x:u, если можно было просто объявить массив?)
Lapp
Цитата(Unconnected @ 21.11.2009 11:11) *
Lapp, а мне вот просто интересно, зачем было объявлять u=array [1..n] of integer;, а потом x:u, если можно было просто объявить массив?)

В данном случае - незачем. Только если в расчете на будущее расширение - например, передачу массива в процедуру.. Но я оставил просто потому, что это был хоть какой-то элемент, который оставлял сходство с первоначальной программой, и при этом - не ошибка! ))

Кто их знает, может они типы недавно проходили и отрабатывают.. ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.