Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа завершает работу при выполнении
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
avp
В этой задаче при вводе всех одинаковых элементов она завершается. Что не верно? Помогите?
Код

const
 MaxSize=100;
var
 A: array[1..MaxSize] of integer; {Массив элементов}
 I,
 MinElem,  {Минимальный искомый элемент}
 MinElemN,    {Сколько раз встретился этот элемент}
 GranElem,    {Граничный минимальный элемент.
 Требуется в случае если в первом поиске ElemN>1}
 MaxN: integer;  {Количество элементов в массиве A}

begin
{Ввод массива}
writeln('Найти минимальный элемент, встречающийся в массиве один раз');
repeat
 write('Задайте число элементов в массиве <1..',MaxSize,') ');
 readln(MaxN);
 if (MaxN <= 0) or (MaxN > MaxSize) then
 writeln('Вы ошиблись! Повторите!');
until (MaxN > 0) and (MaxN <= MaxSize);
for  I := 1 to MaxN do
 begin
 writeln('Введите числа:');
 for i := 1 to MaxN do
  begin
   write(i:4,': ');
   readln(A[i]);
  end;
    {Первоначальный поиск находит минимальный элемент MinElem. Здесь же проверка,
    однократно ли он встречается в массиве.
    Если элемент встречается неоднократно, повторный поиск.
    Теперь в поиске участвуют только элементы большие, чем GranElem с учетом знака}
    MinElem:=A[1];
    for i:=2 to MaxN do
    if A[i]<MinElem then
    MinElem:=A[i];
    for i:=1 to MaxN do
 if A[i]=MinElem then
 MinElemN:=MinElemN+1;
    {Вывод результата если минимальный элемент только однажды}
    if MinElemN>1 then
 begin {если с первого раза не нашли}
 {Пока "как бы минимальный" элемент встречается более одного раза, повторяем.}
 while MinElemN > 1  do
  begin
   writeln('Отбрасываем промежутчный минимальный элемент ',MinElem);
   MinElemN:=0;
   GranElem:=MinElem;
   MinElem:=MAXINT;
   {"Двойные" элементы не участвуют в поиск, они отсекаются условием  A[i]>GranElem }
   for i:=1 to MaxN do
   if (A[i]<MinElem) and (A[i]>GranElem) then
   MinElem:=A[i];
   for i:=1 to MaxN do
   if A[i]=MinElem then
   MinElemN:=MinElemN+1;
  end; {while}
    end; {Для условия "если с первого раза не нашли"}
    writeln('Минимальный элемент равен ',MinElem);
    readln;
 end;
end.
Altair
дай данные которые ты вводил. у меня например при вводе:
Цитата
Найти минимальный элемент, встречающийся в массиве один раз
Задайте число элементов в массиве <1..100) 5
Введите числа:
  1: 1
  2: 1
  3: 1
  4: 1
  5: 1
Отбрасываем промежутчный минимальный элемент 1
Минимальный элемент равен 32767

(**сдерживает слезы от смеха - и так ясно что 32767 **)
Altair
если по твоему заданию:
Цитата
айти минимальный элемент, встречающийся в массиве один раз

то вот тебе:

vvar
 A:ARRAY[1..100] of integer;
 minelem,n,i,j:integer;
 c:boolean;
begin
 write ('kol-vo elem:'); readln(n);
 for i:=1 to n do begin write('a[',i,']='); readln(a[i]) end;
 minelem:=maxint;
 for i:=1 to n do  begin
  if a[i]<minelem then begin
   c:=false;
   for j:=1 to n do  begin if (a[i]=a[j]) and (i<>j) then c:=true; end;
   if c=false then minelem:=a[i];
  end;
 end;
 writeln(minelem);
end.
klem4
Впринципе еще можно вот так : Соритруем массив по возрастанию, а потом делаем примерно вот это :


i := 1;
while (i<=n) and ((x[i]=x[succ(i)])or(x[i]=x[pred(i)])) do
 inc(i);

if i>n then
 writeln('No')
else writeln('N MIN =', i);



вот вродебы не ошибся.
hiv
Цитата(klem4 @ 17.10.2005 10:43)
вот вродебы не ошибся.
А вот и ошибся! А где у тебя проверки на выход за пределы индекса массива X?
klem4
Hiv smile.gif)))))

Код
i := 1;
while (i<=n) and ...

все на месте ;) :low:
Altair
Цитата
Впринципе еще можно вот так :

А теперь оцени сложность твоего и моего алгоритма..
ГРУБО - у меня 2 вложенных цикла,в каждом по ветвлению
У тебя цикл уже для сортированного, а сортировка ... кхм, промолчу.
ну разве что с быстрой может и выкарабкаешься на сравнимые скорости.

При том - мойалгоритм еще и совершеннееможно реализовать,если сократить количество итераций до вида:
for i:=1 ton-1 do
 for j:=i+1 to n
,
и поставив соотв. условия, которые надо додумать.


rolleyes.gif
klem4
Код
for i:=1 ton-1 do
          for j:=i+1 to n


а вот так нельзя мне кажется:no:

в случае скажем 1112333 программа выдаст не 2, а 1
Altair
ты читать будешь? smile.gif
Цитата
если сократить количество итераций до вида:
и поставив соотв. условия, которые надо додумать.

Знаешь была задача в которой такой трюк с сокращением итераций казался неразрешимим, но решился...
Неразрешимых задач нет, вернее может и есть но это явно не из той оперы!
зы: но где же автор темы ?smile.gif
avp
Большое спасибо за ответ!
Объясните почему при вводе всех одинаковых чисел выводится 32767. Какова теория этого ывода на экран (ну типа для тех кто в танке smile.gif )
klem4
Потому что в коде Altaira есть следующий момент, перед просмотром массива переменной minelem присваивается значение MaxInt, (паскалевская константа, которая равна 32767), далее при проходе по массиву в во втором цикле всегда выполнится условие (a[i]=a[j]) and (i<>j) это ведет к тому что переменная С всегда к выходу из этого цикла будет иметь значение TRUE, соответственноникогда не выполнится if c=false then minelem:=a[i]; и minelem будет хранить в себе значение MaxInt до победного конца ;)

:smoke:
avp
поучительно, главное понятно! пасиба
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.