1 | |
Как избавится от GoTo12.09.2013, 20:40. Показов 4114. Ответов 35
Метки нет (Все метки)
Пишу несложную программку по расчету электрического узла. Язык Fortran. Первым блоком идет ввод данных, далее расчет и собственно вывод на экран, ничего сложного. Однако мне необходимо сделать проверку правильности введенных параметров. Т.е. если какой-либо исходный параметр не был введен и остался равным нулю или находится вне диапазона допустимых значений, то программа должна сообщить об этом. Это очень просто реализуется операторами IF и если один из параметров не корректен, то идет адресация к началу блока ввода данных через оператор GOTO.
Однако все программисты пишут, что оператор GOTO нужно забыть как страшный сон и стараться не использовать его вовсе. Вот и хочется привести алгоритм к нормальным требованиям. Блок схемка приведена на рисунке. Вопрос в том, как избежать использования оператора GOTO и в то же время выполнить требование к проверке и при необходимости повторному вводу данных? Какая должна быть блок схема и какой оператор применить?
0
|
12.09.2013, 20:40 | |
Ответы с готовыми решениями:
35
Избавится от Goto Превращение кода с goto в код без goto Как избавится от переполнения? Как избавится от ошибки |
Модератор
|
||||||
12.09.2013, 21:24 | 2 | |||||
- а ты спроси: почему? И тебе будут лепетать что-то вроде: "программы с большим количеством Goto трудно понимать". Но разве:
1) Твоя программа так уж трудна? 2) У тебя много GoTo? Ведь ответ на оба вопроса - твердое HET! А раз так - не комплексуй и смело используй GoTo! (Кстати, если бы GoTo был бы реально так плох, как долдонят пуристы, то разработчики компиляторов просто выкинули его из языка). Все эти священные войны ведут обычно т.н. хелловордщики (т.е. "программисты", самая длинная программа которых - 13 строк). Забей на них! Если же вопрос принципиальный, то твою программу легко реализовать без GoTo: Псевдокод:
1
|
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
|
|
12.09.2013, 22:41 | 4 |
Бесконечный цикл не есть гуд. Лучше при невыполнении условия использовать оператор стоп и выдавать предупреждение где неверно и просьбу перезапустить программу.
0
|
Модератор
|
|
13.09.2013, 07:40 | 5 |
- "Живая собака лучше мертвого льва". Применительно к программированию этот древний тезис означает, что хорошаю (good) программа - это работающая программа.
А совет за "совет" использовать stop в диалоговой программе пользователи поблагодарят... Непечатно.
0
|
13.09.2013, 07:59 [ТС] | 6 |
Предупреждение и просьба ввести данные снова конечно будет. Иначе нет смысла делать возврат.
Такой еще вопрос, точнее три вопроса: 1. Можно ли при организации цикла через DO --- END DO сделать проверку сразу для нескольких вводных параметров в рамках одного цикла? 2. Можно ли при организации цикла через DO --- END DO, сделать проверку для каждого параметра по нескольким условиям (например неравенство нулю и расположение в определенной области значений)? 3. Нужно, что бы после выполнения программы можно было сделать ее повторное выполнение, в случае если результат не устроит. Опять же вопрос по GoTo. С его помощью это сделать просто, а как без него?
0
|
Модератор
|
|
13.09.2013, 08:08 | 7 |
- да, конечно.И нужно. Входишь в цикл, вводишь все необходимое, проверяешь по полной программе. Если все устроило - выходишь из цикла. Если нет - повторный запрос (если программа диалоговая). Если пакетная - стоп.
0
|
13.09.2013, 19:43 [ТС] | 8 |
А как вообще у фортрана дела со структурным построением алгоритмов, все ли для этого есть? А то многие на Си агитируют.
И подскажите плиз команды по очистке экрана и очистке оперативной памяти компа по завершении выполнения программы.
0
|
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
|
||||||
13.09.2013, 19:59 | 9 | |||||
В visual фортране можно подключить модуль dflib если мне не изменяет память там есть функция
На каком фортране пишите? В f77 динамического распределения памяти, в F95 освобождение выделенной под локальный размещаемый массив памяти происходит автоматически при выходе из процедуры.
0
|
13.09.2013, 21:05 [ТС] | 10 |
А черт его знает на каком, я только начал изучать, одновременно с написанием несложной программы.
Такая интерсная вещь, пишу в geany, вот как пример код блока ввода данных с провекой результата ввода значения "В". Код
program usl real B do write(*,*) "Введите B"; read (*,*) B ! Значение B должно быть задано в промежтке между -5 и 5 и не равно нулю if (B>-5 .and. B<5 .and. B/=0) exit end do write(*,*) "B= ", B end
0
|
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
|
|
13.09.2013, 21:20 | 12 |
Вообще лучше написать 5.0 в условии, одна из болячек фортрана это преобразование типов не всегда корректно срабатывает.
upd Intel(R) Visual Fortran Compiler XE 12.0.1.127 [IA-32] работает и в первоначальном виде кооректно.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
13.09.2013, 21:32 | 13 | |||||
Сообщение было отмечено как решение
Решение
это смотря что будешь писать
ФорТран(Формула Транслятор) был изобретен для обработки формул, для математики короче, и у него за это время появилось куча программ, библиотек именно для математики, переписывать это на Си никто не будет если писать всякие игрушки лучше Си если расчеты то фортран, их можно и объединить, один модуль на одном языке другой на другом есть еще куча языков, и у каждого своя ниша если бы изобрели "универсальный язык" который подходит ко всем задачам,то его бы все и использовали про остальные забыли бы Добавлено через 2 минуты ну с нулем то может и проканает( зависит как плавающие представлены) а вот с конкретным значением точно нет например 1/3 нельзя ведь представить, ни в машинном ни в человечьем языке, конечной дробью Добавлено через 6 минут может лучше написать так
3
|
14.09.2013, 17:17 [ТС] | 14 |
Пробовал и 5.0 писать и abs(B), не помогает. Вот такой вариант уже написал, что бы не было целых чисел, а real сравнивался с real-ом.
Код
program usl real A, B, C, D do write(*,*) "Введите B"; read (*,*) B ! Значение B должно быть задано в промежтке между -5 и 5 и не равно нулю A=-5; C=5; D=0 if (B > A .and. B < C .and. B /=D) exit end do write(*,*) "B= ", B end
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
14.09.2013, 17:57 | 15 |
а ты при вводе числа точку и запятую не путаешь случайно
фортран и то и другое схавает а результат будет разный например 0,2 для него будет два числа 0 и 2 а 0.2 ноль целых две десятых
1
|
14.09.2013, 18:48 [ТС] | 16 |
Не знаю, попробую. я ввожу с цифровой клавиатуры, справа, там же кнопочка запятой или точки, не знаю уже, та, что под тройкой. Но все равно как 2 раза программа может срабатывать по разному при введении одного и того же теми же клавишами? Я не понимаю, бред какой-то. А с другой стороны значит надо еще одно условие проверки делать, что бы пользователь потом правильно вводил?
0
|
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
|
|
14.09.2013, 18:53 | 18 |
Под тройкой десятичная точка находится. Не нужно еще условий городить достаточно в описании пояснить что разделитель точка.
И все таки под какой стандарт пишете? У меня срабатывает без косяков все примеры приведенные выше. Стандарт f90, свободный формат, компилятор Intel(R) Visual Fortran Compiler XE 12.0.1.127 [IA-32].
0
|
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
|
|
14.09.2013, 18:55 | 20 |
Под linux есть не коммерческая версия от интела на офф сайте. Не долюбливаю я gfortran.
Добавлено через 1 минуту По умолчанию ставить eng раскладку).
0
|
14.09.2013, 18:55 | |
14.09.2013, 18:55 | |
Помогаю со студенческими работами здесь
20
Rusearcher.com как избавится Как избавится от livesearch.me Как избавится от livesearch.me Как избавится от предупреждения? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |