![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] Pascal от новичка (ошибку не вижу) |
|
Разное - [решено] Pascal от новичка (ошибку не вижу)
|
![]() Новый участник Сообщения: 26 |
Здравствуйте!
Я только начала изучать Pascal. Дело очень интересное ![]() Но вот моя задача: Мне нужно составить простую программу на нахождение максимального и минимального значения из N введенных чисел. Вроде бы все сделала правильно. И ошибок компилятор не выдает. Но работает программа не совсем верно. Максимальное значение определяет безошибочно. Но минимальное значение находит верно лишь в том случае, если число отрицательное. Допустим из 5 введенных чисел: 1 2 -3 7 5 Программа правильно выдает: max=7 min=-3 Если ввести числа так: 1 2 3 4 5 То программа работает не правильно: max=5 min=0 Кстати, условие такое, что нужно использовать конструкцию repeat...until. Посмотрите, пожалуйста, мой код, наверное, что-то нужно добавить? {Программа для определения максимального и минимального значения из N введенных чисел} program max_i_min_iz_N; uses crt; var N,min,max,a,i,m:integer; BEGIN clrscr; repeat write('Введите любую цифру: '); readln(N); writeln(); write('Введите ',N,' чисел(-а) через пробел: '); i:=1; max:=0; min:=0; a:=0; m:=0; repeat read(a); if (a>max) then max:=a else max:=max; if (a<min) then min:=a else min:=min; i:=i+1; a:=0; until(i>N); writeln(); writeln('max=',max); writeln('min=',min); writeln(); writeln('Для продолжения программы нажмите цифру 1'); writeln('Для завершения программы нажмите цифру 2'); writeln(); readln(m); writeln(); until(m=2); END. |
|
Отправлено: 13:13, 02-12-2011 |
DOOMer Сообщения: 3254
|
Профиль | Отправить PM | Цитировать Именно.
Цитата lenaustkz84:
![]() |
|
------- Последний раз редактировалось CyberDaemon, 02-12-2011 в 15:06. Отправлено: 15:00, 02-12-2011 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Вот новый код. Теперь, наверное, точно все работает.
И для двойки. И для единицы. Вот как бы только написать его по-красивее? ![]() А то уж больно он мне не кажется таким, как надо. {Программа для определения максимального и минимального значения из N введенных чисел} program max_i_min_iz_N; uses crt; var N,min,max,a,b,c,i,m:integer; BEGIN clrscr; repeat write('Введите любую цифру: '); readln(N); writeln(); write('Введите ',N,' чисел(-а) через пробел: '); case N of 1 : begin read(a); max:=a; writeln(); writeln('max=',max); end; 2 : begin read(a,b); if (a>b) then begin max:=a; min:=b; end else begin max:=b; min:=a; end; writeln(); writeln('max=',max); writeln('min=',min); end; else begin read(a,b); if (a>b) then begin max:=a; min:=b; end else begin max:=b; min:=a; end; i:=3; repeat read(c); if(c>max) then max:=c else max:=max; if(c<min) then min:=c else min:=min; i:=i+1; c:=0; until(i>N); writeln(); writeln('max=',max); writeln('min=',min); end; {end else case} end; {end case} writeln(); writeln('Для продолжения программы нажмите цифру 1'); writeln('Для завершения программы нажмите цифру 2'); writeln(); readln(m); writeln(); until(m=2); END. |
Последний раз редактировалось lenaustkz84, 02-12-2011 в 15:33. Отправлено: 15:23, 02-12-2011 | #12 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать lenaustkz84,
Цитата lenaustkz84:
подожди, а здесь то что выполняется? ![]() i уже равно 3, хотя цифры вводить мы и не начинали. И как правильно указал CyberDaemon, min, max, еще не определены, а мы уже сравниваем с ними вводимое число. ---- Общая реплика: lenaustkz84, молодец, старайся, думай. ![]() ![]() Все что вверху, уже не в счет! Цитата lenaustkz84:
Попробуй переписать с использованием цикла for или чуть-исправить repeat until. |
||
------- Последний раз редактировалось lxa85, 02-12-2011 в 15:32. Отправлено: 15:24, 02-12-2011 | #13 |
![]() Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать CyberDaemon, загляну теперь в Ваше решение
![]() lxa85, как раз в том отрывке кода уже все работает. Только i:=3; потому что это уже третяя переменная, которую начинает сравнивать программа. А предыдущие две - это были сравнения 1 и 2. Если ставить i:=1; то нужно дописывать еще по два значения. Например, нужно найти max и min из 7 значений. Тогда приходиться вводить не 7, а 9 значений. Чтобы убрать эту ошибку, я присвоила переменной i значение 3. Ну вот, что-то такое постаралась объяснить ![]() CyberDaemon, по Вашему объяснению кажется все так просто ![]() Как же я сама не догадалась? Напишу программку заново ![]() lxa85, сейчас пишу по новому ![]() ![]() |
Отправлено: 15:25, 02-12-2011 | #14 |
![]() Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать CyberDaemon, lxa85, спасибо Вам за советы
![]() Вот заново написала код. Опять не слишком им довольна ![]() Но думаю, уже лучше, чем было. Не нравиться этот i:=2; Без этого условия приходиться вводить на одно значение больше. Как, по Вашему мнению, уже лучше? Или тоже сплошной монстр ![]() {Программа для определения максимального и минимального значения из N введенных чисел} program max_i_min_iz_N; uses crt; var N,min,max,a,i,m:integer; BEGIN clrscr; repeat i:=2; write('Введите любую цифру: '); readln(N); writeln(); write('Введите ',N,' чисел(-а) через пробел: '); read(a); max:=a; min:=a; repeat read(a); if(a>max)then max:=a else max:=max; if(a<min)then min:=a else min:=min; i:=i+1; until(i>N); writeln(); writeln('max=',max); writeln('min=',min); writeln(); writeln('Для продолжения программы нажмите цифру 1'); writeln('Для завершения программы нажмите цифру 2'); writeln(); readln(m); writeln(); until(m=2); END. И то, что программа работает во всех случаях... кроме одного... Если здесь ввести значение 1, то программа все равно ждет ввода еще одного значения. Наверное, потому, что у меня считывание переменной a все таки прописано в программе два раза? При этом я пробовала оставлять только одно считывание переменной двумя вариантами. Вариант 1 write('Введите любую цифру: '); readln(N); writeln(); write('Введите ',N,' чисел(-а) через пробел: '); i:=1; max:=a; min:=a; repeat read(a); if(a>max)then max:=a else max:=max; if(a<min)then min:=a else min:=min; i:=i+1; until(i>N); ![]() ![]() Вариант 2 write('Введите любую цифру: '); readln(N); writeln(); write('Введите ',N,' чисел(-а) через пробел: '); i:=1; read(a); max:=a; min:=a; repeat if(a>max)then max:=a else max:=max; if(a<min)then min:=a else min:=min; i:=i+1; until(i>N); В общем так вот... |
Последний раз редактировалось lenaustkz84, 03-12-2011 в 10:29. Отправлено: 10:20, 03-12-2011 | #15 |
![]() Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Вот еще по совету lxa85 попробовала написать код с применением FOR.
Что-то тоже не совсем правильно получается. Нужно вводить больше значений для сравнения, чем требуется. {Программа для определения максимального и минимального значения из N введенных чисел} program max_i_min_iz_N_for; uses crt; var N,min,max,a,i,m:integer; BEGIN clrscr; repeat write('Введите любую цифру: '); readln(N); writeln(); write('Введите ',N,' чисел(-а) через пробел: '); read(a); max:=a; min:=a; for i:=1 to N do begin readln(a); if(a>max)then max:=a else max:=max; if(a<min)then min:=a else min:=min; end; writeln(); writeln('max=',max); writeln('min=',min); writeln(); writeln('Для продолжения программы нажмите цифру 1'); writeln('Для завершения программы нажмите цифру 2'); writeln(); readln(m); writeln(); until(m=2); END. ![]() Я уже достала Вас своими вопросами и кодами, наверное. Но вообще стукаюсь глазами и не вижу, что делаю не так. Не сочтите за труд, подскажите, где я ошибаюсь. |
Отправлено: 14:59, 03-12-2011 | #16 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать lenaustkz84, а почему ты от case отказалась? Он был вполне не дурен и к месту.
Пусть код будет чуть длиннее, ничего страшного. В условиях про универсальную формулу ничего не сказано. Докажи пользу от использования case и ты будешь молодец. Дам тебе еще времени помучиться, а завтра напишу свой вариант решения. ![]() P.S. Защита от дурака: Ты уверена, что тебе введут положительную переменную N ? ![]() |
------- Отправлено: 15:42, 03-12-2011 | #17 |
![]() Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Вот и я думала тоже про отрицательное число N и про ноль.
Но "успокоила" себя тем, что никто и не подумает вводить такие цифры, ведь логично их не вводить. Но замечание Ваше учла ![]() И согласна. Все таки правильно поставить "защиту от дурака" ![]() Сначала хотела с while, но тогда нунжно дважды прописывать предложение ввода переменной N и ее считывание. Мне показалось это не удобным. Вот так было вначале: write('Введите любое положительное число: '); readln(N); writeln(); while (N<=0) do begin write('Введите любое положительное число: '); readln(N); writeln(); end; С repeat...until удобно оказалось это сделать. Ничего дважды прописывать не надо. lxa85, спасибо за совет ![]() Посижу еще над программкой, подумаю ![]() |
Отправлено: 20:48, 03-12-2011 | #18 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать Как и обещал, привожу вариант решения в моей доработке.
Решение разумеется Компилятора под руками нет, "на глаз" ошибок нет. P.S. у меня табуляция в notepad++ настроена на 4 пробела, звиняйте за длинные строки |
------- Отправлено: 21:15, 04-12-2011 | #19 |
![]() Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать lxa85, Благодарю!
Как говориться, сколько людей, столько мнений. Сколько программистов - столько и кодов ![]() Конечно, Ваша программа работает на все 100% ![]() Понравилось то, что Ваш код мне показался более компактным, чем мой. Ничего лишнего. Век живи, век учись ![]() По поводу моего окончательного кода, который получился в итоге. По Вашему примеру убрала лишний цикл repeat...until(); который был предназначен для проверки ввода положительного числа. Оставила прстую конструкцию if...else. Результат тот же, а лишнего ничего нет. Как говориться, все гениальное просто ![]() Все таки получилось оставить цикл repeat...until(); => просто условие использования именно этого цикла было у меня в задании. Получилось сделать красивенько i:=1; => мне просто так глаз радует, когда переменная i начинается именно с 1 ![]() Получилось убрать двойное считывание переменной a, т.е. раньше было дважды прописано readln(a); Теперь только один. Просто это двойное считывание переменной a часто выдавало не правильные результаты работы программы, что меня дико возмущало ![]() Ну и просто убрала то, что и так очевидно. Т.е. сократила на И еще добавила одно условие во внутреннем цикле repeat...until(); В этой строчке я нашла решение многих проблем ![]() Вот собственно мой код ![]() {Программа для определения максимального и минимального значения из N введенных чисел} program max_i_min_iz_N; uses crt; var N,min,max,a,i,m:integer; BEGIN clrscr; repeat write('Введите положительное число: '); readln(N); writeln(); if (N<=0) then writeln('Число ',N,' не положительное.') else begin write('Введите ',N,' число(-ла,-ел) через пробел: '); i:=1; repeat read(a); if (i=1) then begin max := a; min := a; end; if(a>max)then max:=a; if(a<min)then min:=a; i:=i+1; until(i>N); writeln(); writeln('max=',max); writeln('min=',min); end; {end else} writeln(); writeln('Для продолжения программы нажмите цифру 1'); writeln('Для завершения программы нажмите цифру 2'); writeln(); readln(m); writeln(); until(m=2); END. ![]() |
Отправлено: 20:10, 07-12-2011 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - Всё о TURBO PASCAL (обсуждение, помощь в написание программ, ошибки, Pascal ABC) | Loading | Программирование и базы данных | 41 | 20-05-2015 15:28 | |
C/C++ - F1 для новичка | SS3 | Программирование и базы данных | 5 | 24-01-2009 17:39 | |
О проблемах новичка | Direktor Finskogo Zaliva | Программное обеспечение Linux и FreeBSD | 2 | 29-03-2007 07:21 | |
не вижу сервера, но вижу соседнии компьютеры | DKolpakov | Сетевые технологии | 3 | 06-05-2005 14:43 | |
Обучите новичка | Micro | Железо в Linux | 45 | 15-04-2004 21:23 |
|