|
Я это делаю Персональное меню Голосование Поиск по сайту Реклама Статистика |
Вот пример программы без единого GOTO, наваянной на языке Си.
Сколько времени Вам потребуется, чтобы понять смысл фигурирующего здесь цикла
Отмечу достаточно типичное неумение пользоваться логическими выражениями и незнание приоритетов логических операций: А вот эквивалентная функция, полученная тождественными преобразованиями:
Здесь сразу видно, что делает эта функция: она ищет последнее вхождение
элемента
Оператор А теперь представьте себе, что вам нужно модифицировать эту программу под новую задачу: очевидно, что во втором случае это сделать не только намного легче, но и минимален риск внести при исправлении ошибку. Именно в этом и заключается цель применения структурного программирования. Впрочем, польза от механического исключения GOTO есть: по крайней мере, так можно доказать, что без GOTO можно обойтись в любых программах. Если подумать, второй вариант функции можно было бы упростить. Хорошо ли так писать, или плохо, я не знаю. Видимо, оптимальным было бы использование некоторой комбинации.
Кстати, в первом варианте программы содержится ошибка. Она делает не совсем то, что от нее требуется. Раз уж со смыслом я Вам помог, то попробуйте теперь отыскать и исправить эту ошибку. Смотрите также
Прототип этого примера: Последняя модификация: 13.11.05 19:52 Обсуждение статьи в форумеНе проходите мимо! Оставьте Ваш комментарий в форуме! >>> 07.04.12 12:26 Gro В обеих модифицированных функциях допускается модификация массива нулевой длины, что является ошибкой. Переменная k является излишней. if ( n > 0 ) ++a[ i ]; Заменив for на более наглядный while, получаем if ( n > 0 ) while( i && ( a[ i ] != b ) ) ++a[ i ]; Более эффективная реализация использует указатель на элемент массива int* p; if ( n > 0 ) ++( *p ); или, с while вместо for int* p; if ( n > 0 ) while( ++( *p ); Даём переменным осмысленные имена и получаем эффективный удобочитаемый код (не забываем, что это C, а не C++) void some_function( int* pnAr, int nElCount, int nVal ) if ( nElCount > 0 ) while( ++( *pnEl ); При перепечатке ссылка на автора обязательна. Gromolyak (dima@amsd.com, gromolyak@bk.ru) Просмотреть все комментарии в режиме форума. Всего комментариев: 1
|