IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Программа завершает работу при выполнении
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Женский

Репутация: -  0  +


В этой задаче при вводе всех одинаковых элементов она завершается. Что не верно? Помогите?
Код

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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 11)
сообщение
Сообщение #2


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


дай данные которые ты вводил. у меня например при вводе:
Цитата
Найти минимальный элемент, встречающийся в массиве один раз
Задайте число элементов в массиве <1..100) 5
Введите числа:
  1: 1
  2: 1
  3: 1
  4: 1
  5: 1
Отбрасываем промежутчный минимальный элемент 1
Минимальный элемент равен 32767

(**сдерживает слезы от смеха - и так ясно что 32767 **)


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


если по твоему заданию:
Цитата
айти минимальный элемент, встречающийся в массиве один раз

то вот тебе:

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.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Впринципе еще можно вот так : Соритруем массив по возрастанию, а потом делаем примерно вот это :


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);



вот вродебы не ошибся.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


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


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Hiv smile.gif)))))

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

все на месте ;) :low:

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
Впринципе еще можно вот так :

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

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


rolleyes.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Код
for i:=1 ton-1 do
          for j:=i+1 to n


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

в случае скажем 1112333 программа выдаст не 2, а 1


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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

Знаешь была задача в которой такой трюк с сокращением итераций казался неразрешимим, но решился...
Неразрешимых задач нет, вернее может и есть но это явно не из той оперы!
зы: но где же автор темы ?smile.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 7
Пол: Женский

Репутация: -  0  +


Большое спасибо за ответ!
Объясните почему при вводе всех одинаковых чисел выводится 32767. Какова теория этого ывода на экран (ну типа для тех кто в танке smile.gif )
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Потому что в коде Altaira есть следующий момент, перед просмотром массива переменной minelem присваивается значение MaxInt, (паскалевская константа, которая равна 32767), далее при проходе по массиву в во втором цикле всегда выполнится условие (a[i]=a[j]) and (i<>j) это ведет к тому что переменная С всегда к выходу из этого цикла будет иметь значение TRUE, соответственноникогда не выполнится if c=false then minelem:=a[i]; и minelem будет хранить в себе значение MaxInt до победного конца ;)

:smoke:


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 7
Пол: Женский

Репутация: -  0  +


поучительно, главное понятно! пасиба
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.11.2025 5:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name