Основы информатики Лекция. Стиль программирования. Отладка и тестирование Заикин Олег Сергеевич zaikin.all24.org [email protected] СТИЛЬ ПРОГРАММИРОВАНИЯ Стиль программирования 1. Вложенные операторы записываются с отступом вправо (клавиша Tab). Неправильно Правильно while ( x < 0 ) {cin >> x; if ( x < -10 ) cout << x << “ ”; } while ( x < 0 ) { cin >> x; if ( x < -10 ) cout << x << “ ”; } 3 Стиль программирования Допускается не использовать для оператора начала блока { отдельную строку. Правильно Тоже правильно while ( x < 0 ) { cin >> x; if ( x < -10 ) cout << x << “ ”; } while ( x < 0 ) { cin >> x; if ( x < -10 ) cout << x << “ ”; } Если в функции мало операторов, можно записать весь блок в одну строку. int sum( int a, int b ) { return a + b; } // суммирование 4 Стиль программирования 2. Использовать комментарии Однострочный комментарий начинается с пары символов //. При этом весь текст до конца текущей строки считается комментарием. В тексте комментария можно использовать любые символы. Sum := 0; // присваивание Sum начального значения for ( int i = 1; i <= n; i++ ) Sum := Sum + i; // добавляем к Sum числа от 1 до n 5 Стиль программирования Добавлять многострочный комментарий с текстом задания. int main() { /*Задание 1. Вариант 12. Входные данные – … Требуется – …*/ … } 6 Стиль программирования 3. Имена для объектов программы надо выбирать так, чтобы они наилучшим образом отражали назначение этих объектов. Неправильно Правильно x123 := 0; for ( int i = 1; i <= n; i++ ) x123 := x123 + i; Sum := 0; for ( int i = 1; i <= n; i++ ) Sum := Sum + i; 7 Стиль программирования 4. Программирование сверху вниз. В процессе разработки алгоритма и программы следует начинать с самой общей модели решения, постепенно уточняя ее до уровня отдельного блока и затем детально прорабатывая каждый блок. 8 ЧАСТО ВОЗНИКАЮЩИЕ ОШИБКИ ОТЛАДКА ПРОГРАММ Компиляция и компоновка Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке. Компиляция – трансляция программы с проблемноориентированного языка (файлы с исходным кодом) на машинно-ориентированный язык (объектные файлы). Компоновка – создание исполняемого файла (в Windows – exe-файла) по набору объектных файлов. 10 Microsoft Visual Studio C++ F7 компиляция F5 компиляция, компоновка, запуск программы Shift + F5 завершение программы Синтаксис и семантика Язык программирования определяется синтаксисом и семантикой. Синтаксис — правила формирования конструкций программ из символов. Семантика — разъяснение составных элементов и правил построения команд. Синтаксису языка противопоставляется его семантика. Синтаксис языка описывает «чистый» язык, в то же время семантика приписывает значения (действия) различным синтаксическим конструкциям. 12 Виды ошибок 1. Синтаксические ошибки Автоматически определяются до компиляции, если исходный текст нарушает правила синтаксиса. Компилятор не запускается, если в исходном коде программы есть синтаксические ошибки. 2. Семантические ошибки Программа откомпилирована но при выполнении делает что-то недопустимое. Например, деление на ноль. 3. Логические ошибки Ошибки проектирования и реализации программы. Т.е. исходный текст Вашей программы допустим и она что-то делает, но не то, что вы предполагали. 13 Синтаксические ошибки Сообщения о найденных синтаксических ошибках и предупреждениях отображаются в окне в нижней части редактора. 14 Синтаксические ошибки X : Undeclared identifier: идентификатор X не объявлен int main() { cin >> x; // ошибка } 15 Синтаксические ошибки Missing инструкция1 before indentifier идентификатор1 Не хватает инструкции1 перед идентификатором1. Пример. int a, b // ошибка cin >> a; syntax error : missing ';' before identifier 'cin' 16 Синтаксические ошибки cannot convert from ‘тип1' to ‘тип2' Невозможно преобразовать тип1 в тип2 int a; char *b; b = a; '=' : cannot convert from 'int' to 'char *' 17 Синтаксические ошибки end of file found before the left brace '{' at '.\main.cpp(6)' was matched Найден конец файла перед закрывающей }. int main() { for ( int i=0; i < 10; i++ ) { // нет закрывающей } cout << i << “ "; system("pause"); return 0; } Профилактика – стиль программирования (число { должно совпадать с числом } и т.д.) 18 Синтаксические ошибки ‘функция' : must return a value Функция должна возвращать значение int sum(int a, int b) // ошибка { int sum = a + b; } 19 Синтаксические ошибки function does not take число arguments Функция не может принять число аргументов. Ошибка возникает когда число аргументов не совпадает с числом параметров. Пример int sum(int a, int b){ return a+b; } … cout << sum(3, 4, 5); // ошибка. 3 аргумента, 2 параметра cout << sum(2); // ошибка. 1 аргумента , 2 параметра 20 Синтаксические предупреждения Программа может корректно работать и с предупреждениями. Признак хорошего стиля – исправлять все предупреждения в программе. uninitialized local variable ‘имя_переменной' used Использована неинициализированная переменная имя_переменной Пример. int main() { int x; cout << x; // предупреждение return 0; } 21 Виды ошибок 1. Синтаксические ошибки Автоматически определяются до компиляции, если исходный текст нарушает правила синтаксиса. Компилятор не запускается, если в исходном коде программы есть синтаксические ошибки. 2. Семантические ошибки Программа откомпилирована но при выполнении делает что-то недопустимое. Например, деление на ноль. 3. Логические ошибки Ошибки проектирования и реализации программы. Т.е. исходный текст Вашей программы допустим и она что-то делает, но не то, что вы предполагали. 22 Семантические ошибки Обращение к несуществующему элементу массива int arr[10]; for (i = 1; i <= 11; i++) arr[i] = 0; // ошибка при i == 11 23 Виды ошибок 1. Синтаксические ошибки Автоматически определяются до компиляции, если исходный текст нарушает правила синтаксиса. Компилятор не запускается, если в исходном коде программы есть синтаксические ошибки. 2. Семантические ошибки Программа откомпилирована но при выполнении делает что-то недопустимое. Например, деление на ноль. 3. Логические ошибки Ошибки проектирования и реализации программы. Т.е. исходный текст Вашей программы допустим и она что-то делает, но не то, что вы предполагали. 24 Логические ошибки Операторы, которые должны выполняться вместе, не объединяются в блок с помощью { } Без использования блока { } выполняется только первый оператор. Неправильно Правильно for (int i=0; i < n; i++) a = i * i; // n раз b = i + i; // 1 раз for (int i=0; i < n; i++) { a = i * i; // n раз b = i + i; // n раз } 25 Ошибки и исполняемый файл Если есть синтаксические ошибки, при нажатии на F5 (компиляция –> сборка -> запуск программы) будет запущен исполняемый файл последней безошибочной конфигурации. Поэтому надо всегда проверять, выдаются ли ошибки. Предупреждения – потенциальные семантические или логические ошибки, их тоже надо исправлять. 26 Примеры ошибок int main() { cout << “Hello world”; } for( unsigned int i=10; i >= 0; i-- ) cout << i; double div( double a, double b) { return a / b; } int *a = new[4]; int *b = a; delete[] a; delete[] b; ifstream file; file.open( “text.txt”, ios_base :: out ); file << “text”; 27 Выполнение по шагам Можно выполнить программу по шагам: каждый оператор по очереди. Для этого нужно создать точку прерывания в требуемой строке, Встретив точку прерывания, программа приостановит свою работу и временно передаст управление среде Visual Studio. Можно посмотреть значения всех переменных. Если требуется, выполняется переход между операторами. 28 Microsoft Visual Studio C++ F9 F10 установить/удалить точку останова переход к следующей инструкции в режиме отладки Две точки останова Отладка на тестовом примере При написании программы удобно отлаживать ее работоспособность на тестовом примере. 1. Временно закомментировать получение входных данных от пользователя. 2. Вбить тестовые входные данные, для которых известны корректные выходные данные. 3. После успешной отладки на тестовом примере закомментировать работу с тестовым примером, раскомментировать получение входных данных от пользователя. 4. Еще раз проверить работоспособность программы на тестовых входных данных (запросив у пользователя) 30 Отладка на тестовом примере Тестовая версия Рабочая версия int main() int main() { cout << “Enter 2 values”; cin >> a; cin >> b; cout << a mod b; } { /*cout << “Enter 2 values”; cin >> a; cin >> b;*/ a := 7; b:= 4; cout << a mod b; } 31