Помощь - Поиск - Пользователи - Календарь
Полная версия: выписать элементы, которые не входят в массив
Форум «Всё о Паскале» > 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®-Random®;
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, если можно было просто объявить массив?)

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

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