![]() |
Pascal от новичка (ошибку не вижу)
Здравствуйте!
Я только начала изучать Pascal. Дело очень интересное:) Но вот моя задача: Мне нужно составить простую программу на нахождение максимального и минимального значения из N введенных чисел. Вроде бы все сделала правильно. И ошибок компилятор не выдает. Но работает программа не совсем верно. Максимальное значение определяет безошибочно. Но минимальное значение находит верно лишь в том случае, если число отрицательное. Допустим из 5 введенных чисел: 1 2 -3 7 5 Программа правильно выдает: max=7 min=-3 Если ввести числа так: 1 2 3 4 5 То программа работает не правильно: max=5 min=0 Кстати, условие такое, что нужно использовать конструкцию repeat...until. Посмотрите, пожалуйста, мой код, наверное, что-то нужно добавить? Код:
{Программа для определения максимального и минимального значения из N введенных чисел} |
Цитата:
-1 -2 -3 -4 -5? ;) Ошибка тут: Код:
max:=0; min:=0; |
lenaustkz84, ошибка в изначальном присвоении min:=0. у тебя выходит 0 всегда меньше положительного числа, т. е. условие a<min при положительном а никогда не выполнится.
и для решения этой задачи лучше использовать массивы |
Цитата:
|
|
Все верно, простым убиранием обнуления преременных задачу не решить.
Думай, думай! 1) -1 -2 -3 -4 2) 1 2 3 4 3) 1 1 2 2 |
CyberDaemon, imho удобней
|
CyberDaemon, ну вот я так и сделала уже.
Добавила еще две переменных. Но мне код не совсем нравиться. Хотелось как-то в одной ячейке записывать и значения сравнивать с max и min. Не хотелось еще задействовать две штуки дополнительно. Хотя может и нормальный код... Я еще мало в этом разбираюсь :) Код:
{Программа для определения максимального и минимального значения С вводом любых значений, и положительных, и отрицательных. |
Hector, это если с введенными числами ещё что-то надо делать, то да. А если задача просто найти максиминимум - тогда самое простое - это обрабатывать введённое число сразу после ввода и больше его не хранить. А то вдруг с размерностью массива не угадаешь :)
lenaustkz84, маньячно :) И как отработает прога, если в ответ на "write('Введите любую цифру: '); readln(N); writeln();" ввести "1"? |
Ммм... ёлки-палки... только обрадовалась...
Если ввести 1, то... приходиться ввоить 3 значения, из которых программа без ошибки выбирает min и max. То есть работает не с одним значением, как это нужно, а с тремя. Это, наверное, потому что я задала i:=3; Или нет. Наверное, потому что у меня изначально должно сравниваться 3 переменных, иначе программа не работает. Кстати, для двойки такая же проблема. Наверное, я сейчас добавлю отдельные операторы именно для значения 1 и 2. Только, даже если будет работать, вообще муть какая-то получиться, наверное... :o |
Именно.
Цитата:
|
Вот новый код. Теперь, наверное, точно все работает.
И для двойки. И для единицы. Вот как бы только написать его по-красивее? :) А то уж больно он мне не кажется таким, как надо. Код:
{Программа для определения максимального и минимального значения |
lenaustkz84,
Цитата:
подожди, а здесь то что выполняется? :) Почему условия выхода из цикла такие странные? i уже равно 3, хотя цифры вводить мы и не начинали. И как правильно указал CyberDaemon, min, max, еще не определены, а мы уже сравниваем с ними вводимое число. ---- Общая реплика: lenaustkz84, молодец, старайся, думай. :) Такие темы приятно читать и приятно помогать. :) Все что вверху, уже не в счет! Цитата:
Попробуй переписать с использованием цикла for или чуть-исправить repeat until. |
CyberDaemon, загляну теперь в Ваше решение :)
lxa85, как раз в том отрывке кода уже все работает. Только i:=3; потому что это уже третяя переменная, которую начинает сравнивать программа. А предыдущие две - это были сравнения 1 и 2. Если ставить i:=1; то нужно дописывать еще по два значения. Например, нужно найти max и min из 7 значений. Тогда приходиться вводить не 7, а 9 значений. Чтобы убрать эту ошибку, я присвоила переменной i значение 3. Ну вот, что-то такое постаралась объяснить :) CyberDaemon, по Вашему объяснению кажется все так просто :) Как же я сама не догадалась? Напишу программку заново :) lxa85, сейчас пишу по новому :) Покажу, что получилось :) |
CyberDaemon, lxa85, спасибо Вам за советы :)
Вот заново написала код. Опять не слишком им довольна :not-me: Но думаю, уже лучше, чем было. Не нравиться этот i:=2; Без этого условия приходиться вводить на одно значение больше. Как, по Вашему мнению, уже лучше? Или тоже сплошной монстр :) Код:
{Программа для определения максимального и минимального И то, что программа работает во всех случаях... кроме одного... Если здесь Код:
write('Введите ',N,' чисел(-а) через пробел: '); read(a); Наверное, потому, что у меня считывание переменной a все таки прописано в программе два раза? При этом я пробовала оставлять только одно считывание переменной двумя вариантами. Вариант 1 Код:
write('Введите любую цифру: '); readln(N); writeln(); ![]() Вариант 2 Код:
write('Введите любую цифру: '); readln(N); writeln(); В общем так вот... |
Вот еще по совету lxa85 попробовала написать код с применением FOR.
Что-то тоже не совсем правильно получается. Нужно вводить больше значений для сравнения, чем требуется. Код:
{Программа для определения максимального ![]() Я уже достала Вас своими вопросами и кодами, наверное. Но вообще стукаюсь глазами и не вижу, что делаю не так. Не сочтите за труд, подскажите, где я ошибаюсь. |
lenaustkz84, а почему ты от case отказалась? Он был вполне не дурен и к месту.
Пусть код будет чуть длиннее, ничего страшного. В условиях про универсальную формулу ничего не сказано. Докажи пользу от использования case и ты будешь молодец. Дам тебе еще времени помучиться, а завтра напишу свой вариант решения. :) P.S. Защита от дурака: Ты уверена, что тебе введут положительную переменную N ? :modesty: |
Вот и я думала тоже про отрицательное число N и про ноль.
Но "успокоила" себя тем, что никто и не подумает вводить такие цифры, ведь логично их не вводить. Но замечание Ваше учла:) И согласна. Все таки правильно поставить "защиту от дурака" :) Сначала хотела с while, но тогда нунжно дважды прописывать предложение ввода переменной N и ее считывание. Мне показалось это не удобным. Вот так было вначале: Код:
write('Введите любое положительное число: '); readln(N); writeln(); Код:
repeat lxa85, спасибо за совет :) Посижу еще над программкой, подумаю :) |
Как и обещал, привожу вариант решения в моей доработке.
Решение разумеется Компилятора под руками нет, "на глаз" ошибок нет. P.S. у меня табуляция в notepad++ настроена на 4 пробела, звиняйте за длинные строки |
lxa85, Благодарю!
Как говориться, сколько людей, столько мнений. Сколько программистов - столько и кодов :) Конечно, Ваша программа работает на все 100% :) Понравилось то, что Ваш код мне показался более компактным, чем мой. Ничего лишнего. Век живи, век учись :) По поводу моего окончательного кода, который получился в итоге. По Вашему примеру убрала лишний цикл repeat...until(); который был предназначен для проверки ввода положительного числа. Оставила прстую конструкцию if...else. Результат тот же, а лишнего ничего нет. Как говориться, все гениальное просто :) Все таки получилось оставить цикл repeat...until(); => просто условие использования именно этого цикла было у меня в задании. Получилось сделать красивенько i:=1; => мне просто так глаз радует, когда переменная i начинается именно с 1 :) Получилось убрать двойное считывание переменной a, т.е. раньше было дважды прописано readln(a); Теперь только один. Просто это двойное считывание переменной a часто выдавало не правильные результаты работы программы, что меня дико возмущало :o Ну и просто убрала то, что и так очевидно. Т.е. сократила Код:
if(a>max)then max:=a else max:=max; Код:
if(a>max)then max:=a; Код:
if (i=1) then begin max := a; min := a; end; Вот собственно мой код :) Код:
{Программа для определения максимального и минимального |
Время: 07:59. |
Время: 07:59.
© OSzone.net 2001-