Форум программистов, компьютерный форум, киберфорум
Fortran
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
1

Как избавится от GoTo

12.09.2013, 20:40. Показов 4114. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу несложную программку по расчету электрического узла. Язык Fortran. Первым блоком идет ввод данных, далее расчет и собственно вывод на экран, ничего сложного. Однако мне необходимо сделать проверку правильности введенных параметров. Т.е. если какой-либо исходный параметр не был введен и остался равным нулю или находится вне диапазона допустимых значений, то программа должна сообщить об этом. Это очень просто реализуется операторами IF и если один из параметров не корректен, то идет адресация к началу блока ввода данных через оператор GOTO.

Однако все программисты пишут, что оператор GOTO нужно забыть как страшный сон и стараться не использовать его вовсе. Вот и хочется привести алгоритм к нормальным требованиям. Блок схемка приведена на рисунке. Вопрос в том, как избежать использования оператора GOTO и в то же время выполнить требование к проверке и при необходимости повторному вводу данных? Какая должна быть блок схема и какой оператор применить?
Миниатюры
Как избавится от GoTo  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2013, 20:40
Ответы с готовыми решениями:

Избавится от Goto
Мне необходимо избавится от Goto, как это сделать? Procedure Dobav; Var c:Char; k,i,j,n:Integer;...

Превращение кода с goto в код без goto
Помогите переписать это код без goto и потери производительности.А то мне кажется написано...

Как избавится от переполнения?
Как избавится от переполнения? Данные на вычисление: bbuff = 24; abuff = 13; fun =7. Выводит...

Как избавится от ошибки
Привет, коллеги программеры! Пишу скринсейвер, похожий на тот, что в Windows называется...

35
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
12.09.2013, 21:24 2
Цитата Сообщение от WH Посмотреть сообщение
Однако все программисты пишут, что оператор GOTO нужно забыть как страшный сон и стараться не использовать его вовсе.
- а ты спроси: почему? И тебе будут лепетать что-то вроде: "программы с большим количеством Goto трудно понимать". Но разве:

1) Твоя программа так уж трудна?
2) У тебя много GoTo?

Ведь ответ на оба вопроса - твердое HET! А раз так - не комплексуй и смело используй GoTo! (Кстати, если бы GoTo был бы реально так плох, как долдонят пуристы, то разработчики компиляторов просто выкинули его из языка).

Все эти священные войны ведут обычно т.н. хелловордщики (т.е. "программисты", самая длинная программа которых - 13 строк). Забей на них!

Если же вопрос принципиальный, то твою программу легко реализовать без GoTo:

Псевдокод:

Fortran
1
2
3
4
5
    Do (бесконечный цикл)
        Читать данные
        Анализировать данные
        если все хорошо - выход из цикла
    EndDo
1
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
12.09.2013, 21:27  [ТС] 3
Несложна конечно программа, но просто самому интересно, любознательность так сказать. Фенкс
0
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
12.09.2013, 22:41 4
Бесконечный цикл не есть гуд. Лучше при невыполнении условия использовать оператор стоп и выдавать предупреждение где неверно и просьбу перезапустить программу.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
13.09.2013, 07:40 5
Цитата Сообщение от FixRoute Посмотреть сообщение
Бесконечный цикл не есть гуд.
- "Живая собака лучше мертвого льва". Применительно к программированию этот древний тезис означает, что хорошаю (good) программа - это работающая программа.

А совет за "совет" использовать stop в диалоговой программе пользователи поблагодарят... Непечатно.
0
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
13.09.2013, 07:59  [ТС] 6
Предупреждение и просьба ввести данные снова конечно будет. Иначе нет смысла делать возврат.

Такой еще вопрос, точнее три вопроса:

1. Можно ли при организации цикла через DO --- END DO сделать проверку сразу для нескольких вводных параметров в рамках одного цикла?

2. Можно ли при организации цикла через DO --- END DO, сделать проверку для каждого параметра по нескольким условиям (например неравенство нулю и расположение в определенной области значений)?

3. Нужно, что бы после выполнения программы можно было сделать ее повторное выполнение, в случае если результат не устроит. Опять же вопрос по GoTo. С его помощью это сделать просто, а как без него?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
13.09.2013, 08:08 7
Цитата Сообщение от WH Посмотреть сообщение
Можно ли
- да, конечно.И нужно. Входишь в цикл, вводишь все необходимое, проверяешь по полной программе. Если все устроило - выходишь из цикла. Если нет - повторный запрос (если программа диалоговая). Если пакетная - стоп.
0
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
13.09.2013, 19:43  [ТС] 8
А как вообще у фортрана дела со структурным построением алгоритмов, все ли для этого есть? А то многие на Си агитируют.

И подскажите плиз команды по очистке экрана и очистке оперативной памяти компа по завершении выполнения программы.
0
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
13.09.2013, 19:59 9
В visual фортране можно подключить модуль dflib если мне не изменяет память там есть функция
Fortran
1
call clearscreen(та область которую нужно очистить)
. Подробнее есть у О.В.Бартеньева VISUAL FORTRAN: НОВЫЕ ВОЗМОЖНОСТИ.

На каком фортране пишите? В f77 динамического распределения памяти, в F95 освобождение выделенной под локальный размещаемый массив памяти происходит автоматически при выходе из процедуры.
0
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
13.09.2013, 21:05  [ТС] 10
А черт его знает на каком, я только начал изучать, одновременно с написанием несложной программы.
gfortran --version
GNU Fortran (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING
Добавлено через 52 минуты
Такая интерсная вещь, пишу в 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
При выполнении программы при вводе значения "B" равного например 0,2 снова поступает запрос на ввод значения "B", хотя цикл должен завершиться, а на экран должно быть выведено значение "B=0,20000000". Если я ввожу единицу, то срабатывает нормально, выводит B= 1.00000000. Не пойму в чем дело. Интересно то, что я не сразу на это обратил внимание, вроде бы сперва заработало. Что-то видимо с оператором IF, но что? Может быть значения границ в условии IF нужно указывать как-то иначе?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
13.09.2013, 21:17 11
Не советую сравнивать переменные типа real с нулем (на равно/не равно). Лучше так:

Fortran
1
    if (B>-5 .and. B<5 .and. abs(B) <= 1.0E-8) exit
1
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
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от WH Посмотреть сообщение
А как вообще у фортрана дела со структурным построением алгоритмов, все ли для этого есть? А то многие на Си агитируют.
это смотря что будешь писать
ФорТран(Формула Транслятор) был изобретен для обработки формул, для математики короче, и у него за это время появилось куча программ, библиотек именно для математики, переписывать это на Си никто не будет
если писать всякие игрушки лучше Си если расчеты то фортран, их можно и объединить, один модуль на одном языке другой на другом
есть еще куча языков, и у каждого своя ниша
если бы изобрели "универсальный язык" который подходит ко всем задачам,то его бы все и использовали про остальные забыли бы

Добавлено через 2 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
Не советую сравнивать переменные типа real с нулем
ну с нулем то может и проканает( зависит как плавающие представлены) а вот с конкретным значением точно нет
например 1/3 нельзя ведь представить, ни в машинном ни в человечьем языке, конечной дробью

Добавлено через 6 минут
Цитата Сообщение от Catstail Посмотреть сообщение
if (B>-5 .and. B<5 .and. abs(B) <= 1.0E-8) exit
Цитата Сообщение от WH Посмотреть сообщение
if (B>-5 .and. B<5 .and. B/=0) exit
может лучше написать так
Fortran
1
 if (abs(B)>0 .and. abs(B)<5.0) exit
3
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 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,2, то снова запрашивается ввод параметра "В". Если ввести 2, то цикл останавливается. И далее самое потрясающее - новый запуск программы, без всякого редактирования начнает работать нормально, т.е. ввожу 0,2 и программа останавливается, высвечивая результат. Это какая-то хрень, я сдаюсь.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
14.09.2013, 17:57 15
Цитата Сообщение от WH Посмотреть сообщение
. Если ввести например 0,2, то снова запрашивается ввод параметра "В". Если ввести 2, то цикл останавливается.
а ты при вводе числа точку и запятую не путаешь случайно
фортран и то и другое схавает а результат будет разный
например 0,2 для него будет два числа 0 и 2
а 0.2 ноль целых две десятых
1
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
14.09.2013, 18:48  [ТС] 16
Не знаю, попробую. я ввожу с цифровой клавиатуры, справа, там же кнопочка запятой или точки, не знаю уже, та, что под тройкой. Но все равно как 2 раза программа может срабатывать по разному при введении одного и того же теми же клавишами? Я не понимаю, бред какой-то. А с другой стороны значит надо еще одно условие проверки делать, что бы пользователь потом правильно вводил?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
14.09.2013, 18:52 17
Цитата Сообщение от WH Посмотреть сообщение
А с другой стороны значит надо еще одно условие проверки делать, что бы пользователь потом правильно вводил?
я с Фортраном давно не работал,подсказать не могу,просто вспомнил его знаменитый косяк
говорят у американцев спутник не туда улетел, когда вместо точки запятую поставили
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
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
14.09.2013, 18:54  [ТС] 19
Да, что то похоже на это. Клавиша что под тройкой в одной раскладке клавиатуры как запятая, а в другой как точка. Понаблюдаю еще. Но как пользователю работать? Это же не объяснишь?
1
21 / 19 / 4
Регистрация: 26.08.2013
Сообщений: 172
14.09.2013, 18:55 20
Под linux есть не коммерческая версия от интела на офф сайте. Не долюбливаю я gfortran.

Добавлено через 1 минуту
Цитата Сообщение от WH Посмотреть сообщение
Да, что то похоже на это. Клавиша что под тройкой в одной раскладке клавиатуры как запятая, а в другой как точка. Понаблюдаю еще. Но как пользователю работать? Это же не объяснишь?
По умолчанию ставить eng раскладку).
0
14.09.2013, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2013, 18:55
Помогаю со студенческими работами здесь

Rusearcher.com как избавится
Здравствуйте захожу в хром, настройки, поиск, и у меня стоит &quot; &gt;( по умолчанию) &gt; rusearcher &quot;...

Как избавится от livesearch.me
Где- то подхватил такой вирус как livesearch.me . Подскажите что делать? P.S. Пробовал удалять в...

Как избавится от livesearch.me
При запуске google появилась страница livesearch.me, прочитал похожие темы - понял, что не так...

Как избавится от предупреждения?
Всем привет. Поставил арч, из пользователей только рут. Знаю так не принято, но в данном случае...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru