![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
avp |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 7 Пол: Женский Репутация: ![]() ![]() ![]() |
В этой задаче при вводе всех одинаковых элементов она завершается. Что не верно? Помогите?
Код 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 |
![]()
Сообщение
#2
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
дай данные которые ты вводил. у меня например при вводе:
Цитата Найти минимальный элемент, встречающийся в массиве один раз Задайте число элементов в массиве <1..100) 5 Введите числа: 1: 1 2: 1 3: 1 4: 1 5: 1 Отбрасываем промежутчный минимальный элемент 1 Минимальный элемент равен 32767 (**сдерживает слезы от смеха - и так ясно что 32767 **) -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Altair |
![]()
Сообщение
#3
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
если по твоему заданию:
Цитата айти минимальный элемент, встречающийся в массиве один раз то вот тебе:
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
klem4 |
![]()
Сообщение
#4
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Впринципе еще можно вот так : Соритруем массив по возрастанию, а потом делаем примерно вот это :
вот вродебы не ошибся. Сообщение отредактировано: klem4 - 17.10.2005 9:44 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
hiv |
![]()
Сообщение
#5
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Цитата(klem4 @ 17.10.2005 10:43) вот вродебы не ошибся. А вот и ошибся! А где у тебя проверки на выход за пределы индекса массива X?-------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
klem4 |
![]()
Сообщение
#6
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Hiv
![]() Код i := 1; while (i<=n) and ... все на месте ;) :low: Сообщение отредактировано: klem4 - 17.10.2005 17:20 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Altair |
![]()
Сообщение
#7
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата Впринципе еще можно вот так : А теперь оцени сложность твоего и моего алгоритма.. ГРУБО - у меня 2 вложенных цикла,в каждом по ветвлению У тебя цикл уже для сортированного, а сортировка ... кхм, промолчу. ну разве что с быстрой может и выкарабкаешься на сравнимые скорости. При том - мойалгоритм еще и совершеннееможно реализовать,если сократить количество итераций до вида: for i:=1 ton-1 do, и поставив соотв. условия, которые надо додумать. ![]() -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
klem4 |
![]()
Сообщение
#8
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Код 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";'
|
Altair |
![]()
Сообщение
#9
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
ты читать будешь?
![]() Цитата если сократить количество итераций до вида: и поставив соотв. условия, которые надо додумать. Знаешь была задача в которой такой трюк с сокращением итераций казался неразрешимим, но решился... Неразрешимых задач нет, вернее может и есть но это явно не из той оперы! зы: но где же автор темы ? ![]() -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
avp |
![]()
Сообщение
#10
|
Группа: Пользователи Сообщений: 7 Пол: Женский Репутация: ![]() ![]() ![]() |
Большое спасибо за ответ!
Объясните почему при вводе всех одинаковых чисел выводится 32767. Какова теория этого ывода на экран (ну типа для тех кто в танке ![]() |
klem4 |
![]()
Сообщение
#11
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Потому что в коде 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";'
|
avp |
![]()
Сообщение
#12
|
Группа: Пользователи Сообщений: 7 Пол: Женский Репутация: ![]() ![]() ![]() |
поучительно, главное понятно! пасиба
|
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 4:36 |