Форум программистов, компьютерный форум CyberForum.ru

не использовать do/while ? бред ! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В матрице удалить строки с элементами на главной диагонали, превышающими заданную величину http://www.cyberforum.ru/cpp-beginners/thread2772.html
В матрице удалить строки с элементами на главной диагонали, превышающими заданную величину, а затем в качестве первой вставить строку из максимальных элементов соответствующих столбцов.(Для размещения массивов следует использовать динамическую память).
C++ Поиск строк Здраствуйте, подскажите какие есть реализации или как это сделать примерно. Задача в поиске строк в файле, можно воспользоватся регулярными выражениями или алгоритмами типа бойра-Мура, но файл нельзя считать полностью, как првило, поэтому нужна адаптированная реализация которая может получать строку для поиска по частям. Вот что с сделал с БМ, недостаток в том, что если искомая строка входит в... http://www.cyberforum.ru/cpp-beginners/thread2768.html
C++ Не могу сделать exe
При компиляций моего пректа exe не создаётся.Выдаёт ошибки,которые я не знаю как исправить...http://dump.ru/files/g/g2067785368/ Программа должна выполнять функцию Надо ввести значение переменной pr с помощью клавиатуры.А другая переменная f определяется случайным значением В конце программы выдает текст типа "Переменная pr равна(значение,заданное вами) и f равна(случайное значение).Помогите...
Где можно скачать программу, чтобы начать учиться работать в С++? C++
собственно ногами не пинать...вопрос полного нуля в этой области , но подскажите где можно скачать программу для того что бы начать учиться работать в С++... может выразился сумбурно...но за рание спасибо:)
C++ Где можно скачать элекронные книги, конспекты и тд? http://www.cyberforum.ru/cpp-beginners/thread2715.html
Уважаеммые формчане, нужна помощь по основам программирования на С, ищу ссылки где можно скачать элекронные книги, конспекты и тд и тп. ничего сложного и желательно кратко. заренее благодарен
C++ Помогите с курсовой на тему! Отражение движущегося случайным образом шарика от геометрических фигур статично располагающихся в комнате (треугольник, квадрат, круг) с использованием библиотеки функций OPENGL. подробнее

Показать сообщение отдельно
igor_nf
118 / 12 / 1
Регистрация: 21.08.2007
Сообщений: 222
27.08.2007, 19:02
it (0)
По всей видимости опечатка, т.к. нужно it = 0

Теперь к делу:
C++
1
2
3
4
5
int major[4], it (0);
do {
    major[it] = 1;
    ++it;
} while ( it < 4 );
Плохой код. Для таких дел есть цикл for():
C++
1
for( it = 0; it < 4 && (major[it] = 1); ++it );
Результат тот же, но повышается удобочитаемость, т.к. все операторы инициализации и вся управляющая информация локализована в одном месте. Конечно, код, инициализирующий четыре элемента массива достаточно удобочитаем и при использовании цикла do - while, ну а если он разрастётся в что-то серьёзное? Проблема цикла do в том, что программист, увидев блок операторов цикла, не знает условий, при которых цикл должен закончиться(ну если цикл не 4 строчки, как в нашем случае). Это затрудняет читаемость кода.

Теперь конкретно ко времени исполнения программы(ну, предварительно, заставим исполняться этот код 10000000 раз):
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main( void ) {
 
int i = 0;
int major[4];
int j = 0;
do {
 
do {
    major[i++] = 1;
        } while ( i < 4 );
++j;
        } while( j < 10000000 );
Такой код исполняется у меня на системе 0.200 сек

Теперь мой вариант(результат тот же):
C++
1
2
3
4
5
6
7
8
9
10
int main( void ) {
 
int j = 0;
int major[4], i = 0;
 
for( ; j < 10000000; ++j ) {
 
    for( ; i < 4 && ( major[i] = 1 ); ++i );
        
}
Такой код исполняется 0.040сек, т.е. в 5 раз быстрее. (Надо сказать, что если инициализацию переменных поместить в заголовки for(), код выполняется 0.250сек - что вполне логично - в цикле лишние присваивания). Тест проводился на компиляторе gcc-4.1.2 с уровнем оптимизации 0.

Что, касается цикла while, то всё вышесказанное применимо и к нему, т.к. его отличие лишь в том, что условие проверяется сразу => цикл может быть не выполнен ни разу.

Что касается if () do {} while() - вообще глупо и неоптимально, т.к. сразу в таком коде
C++
1
2
3
4
5
6
if ( it < 4 ) {
    do {
        major[it] = 1;
        ++it;
    } while ( it < 4 );
};
налицо избыточность - двойная проверка.

Резюмируя вышесказанное, применение цикла for() выгоднее в данных случаях и с точки зрения быстродействия, и с точки зрения удобочитаемости.

Что касается статьи, то автор скорее всего хотел сказать, что в программировании нечасто встречаются ситуации, в которых использование циклов do-while является самым оптимальным решением. Но это не значит, что их нельзя использовать!

P.S. Ну всё, что я тут нагородил, конечно, результат моих собственных изысканий и не является аксиомой.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru