MP_L3.ppt
- Количество слайдов: 26
Методы программирования Хуторова Ольга Германовна Лекция 3
Темы лекции n С++ q q Структурное программирование Стиль программирования, облегчающий отладку, написание документации, модернизацию ПО
Принципы структурного программирования n n n Пошаговая детализация разработки ПО 3 структуры (следование, условие, цикл) Модульность
Следование Самый обычный вид оператора - оператор выражение. a = b*3+c; cout << "go go go"; Для лучшего понимания и структурирования программы в строке – один оператор
Пустой оператор n n Простейшей формой оператора является пустой оператор: ; Пустая строка – не путать с пустым оператором
Блоки n Блок - это список операторов, заключенный в фигурные скобки: { a=b+2; b++; }
Следование и модульность Блок 1 Блок 2 Блок 3
Пустая строка n Может разделять блоки n Подпрограмма (блок) должна помещаться на экране
Комментарии n n // /* */ tree t; node = postorder_first( t ); while( node ) node = postorder_successor( t ); // дерево // исходный узел // есть еще узлы? // следующий узел-родитель
Форматирование и документация n n Пишите программу с учетом сопровождения Начинайте с комментариев Комментарии должны быть предложениями Комментарий должен предоставлять только нужную для сопровождения информацию ++x; // увеличить x – такой комментарий не нужен
Комментарии должны быть в блоках // Вот блочный комментарий, описывающий последующий блок // программы. // 1. Этот комментарий описывает, что происходит в строке с меткой 1 // // 2. Этот комментарий описывает, что происходит в строке // с меткой 2 // // В точке 1 алгоритм устанавливается на. . . // here_is_the_code(); while( some_condition ) { this_code_is_rather_obscure(); /* 1 */ } more_stuff_here(); while( some_condition ) { this_code_is_also_obscure(); /* 2 */ }
Следование и модульность n Используйте штриховую линию для зрительного разделения подпрограмм //----------------------------Или //====================== //ОПИСЫВАЮЩИЙ ТЕКСТ //======================
Комментарии должны быть выровнены вертикально /* Первая строка, * вторая строка, * третья строка. */ // Первая строка, // вторая строка, // третья строка.
Используйте аккуратные столбцы везде, где можно int x; // Опишите, что делает x. int (*pfi)(); // Опишите, что делает pfi. const char *the_variable; // Опишите, что делает the_variable. int z; // Опишите, что делает z. x = 10; // Здесь идет комментарий. the_variable = x; // Здесь второй комментарий. z = x; // A здесь третий. int x; int ( *pfi )(); int z; const char *the_variable; x = 10; the_variable = x; z = x; // Опишите, что делает x. // Опишите, что делает pfi. // Опишите, что делает z. // Опишите, что делает // the_variable. // Здесь идет комментарий. // Здесь второй комментарий. // A здесь третий.
Помечайте конец длинного составного оператора чем-нибудь, имеющим смысл while( a < b ) { for( i = 10; --1 >= 0; ) { f( i ); } // for } // while( a < b ) { for( i = 10; --1 >= 0; ) { f( i ); …. . } // for ( i = 10; --1 >= 0; ) } // while ( a < b )
Операторы if Программа в примере осуществляет преобразование дюймов в сантиметры и сантиметров в дюймы; #include main() { const float fac = 2. 54; float x, in, cm; char ch = 0; cout << "введите длину: "; cin>> x >> ch; if (ch == 'i') { // inch - дюймы in = x; cm = x*fac; } else if (ch == 'c') // cm - сантиметры in = x/fac; cm = x; } else in = cm = 0; cout << in << " in=" << cm << " cmn"; } Заметьте, что условие в операторе if должно быть заключено в круглые скобки. n
Условные операторы выделяются абзацными отступами if( by_land ) one(); else two(); а не так: if( by_land ) one() else two();
Используйте скобки, если в условном операторе имеется более, чем одна строка if( something() ) { */ Какой-либо комментарий */ или операторы somethig_else(); }
Операторы switch Оператор switch производит сопоставление значения с множеством констант. switch (ch) { case 'i': in = x; cm = x*fac; break; case 'c': in = x/fac; cm = x; break; default: in = cm = 0; break; } n Операторы break применяются для выхода из оператора switch. n Константы в вариантах case должны быть различными, и если проверяемое значение не совпадает ни с одной из констант, выбирается вариант default. n Программисту не обязательно предусматривать default. n
Оптимальное использование switch n Оператор switch всегда должен иметь предложение с ключевым словом default для ситуации по умолчанию, особенно если эта ситуация не должна возникать: f( int i ) // переменная i должна иметь значение 1 или 2. { switch( i ) { case 1: сделать_нечто(); break; case 2: сделать_нечто_другое(); break; default: fprintf(stderr, "Внутренняя ошибка в f(): неверное значение i (%d)", i ); exit( -1 ); } }
Оператор while n Рассмотрим копирование строки, когда заданы указатель p на ее первый символ и указатель q на целевую строку. По соглашению строка оканчивается символом с целым значением 0. while (p != 0) { *q = *p; q = q+1; p = p+1; } *q = 0; // скопировать символ // завершающий символ 0 скопирован не был Следующее после while условие должно быть заключено в круглые скобки. Условие вычисляется, и если его значение не ноль, выполняется непосредственно следующий за ним оператор. Можно использовать операцию ++ для непосредственного указания увеличения, и проверка упростится: while (*p) *q++ = *p++; *q = 0; Копирование символа можно делать тогда же, когда производится проверка условия: while (*q++ = *p++) ; Поскольку вся работа выполняется в условии, не требуется ни одного оператора. Чтобы указать на это, используется пустой оператор.
Избегайте циклов do/while n Цикл do/while опасен в принципе, так как вы обязательно выполняете его тело хотя бы один раз. Следовательно, вы должны проверить условия завершения до входа в этот цикл. if( !проверить_нечто ) return ERROR; do { начинка(); } while( проверить_нечто ); n Вам гораздо лучше сделать так: while( проверить_нечто ) начинка();
Оператор for n копирование десяти элементов одного вектора в другой: for (int i=0; i<10; i++) q[i]="p[i]; " n эквивалентно int i = 0; while (i<10) { q[i]="p[i]; " i++; } n эквивалентно int I; for (i=0; i<10; i++) q[i]="p[i]; "
Оператор for( i = max; --i >= 0; ) ; или: for( i = 0; i < max; ++i ) ;
Отступы и табуляция. Структура программы должна быть видна n for (счетчик ) { … while (условие) { … if (условие) { … } } }
Список литературы n n Х. Дейтел, П. Дейтел Как программировать на С++ Бьярн Страустрап, Введение в язык С++