Раздел 4. Тестирование программных модулей.
06.06.2016 – 4.1. Анализ структуры программы на языке C++. Проект. 4.2. Определение основ прикладного программирования с использованием языка С++. 4.3. Размещение программы и данных в памяти.4.4. Создание структуры исполняемого модуля.
4.1. Анализ структуры программы на языке C++:
Так выглядит структура простейшей программы на языке C, так же как и C++:
#include <avr/io.h> /* заголовок */
int main(void) /* главная функция: начало программы */
{ /* открывающая скобка в начале программы */
оператор программы;
оператор программы;
...
оператор программы;
} /* закрывающая скобка в конце программы */
Строка #include <avr/io.h> является заголовком. В заголовках содержится информация для компилятора об общих требованиях программы. В данном случае компилятору указывается, что нужно включить информацию, содержащуюся в файле io.h.
Любая программа на языке Си состоит из одной или более функций, причём ровно одна из них обязательно должна называться "main" ("главная"). Программа всегда начинает выполняться с главной функции main.
Идущая следом открывающая фигурная скобка { отмечает начало последовательности операторов, образующих тело функции. Закрывающая фигурная скобка } отмечает конец последовательности операторов, образующих тело функции. На этой скобке выполнение функции завершается.
Калькулятор, разработанный на С++:
#include <iostream>
#include <math.h>
#include <windows.h>
#include <iomanip>
using namespace std;
bool done = 0; //контролирует завершение работы программы
bool ShowMenu(); //показ меню
void Error(); //сообщение об ошибке
void Sum(); //сложение
void Sub(); //вычитание
void Mul(); //умножение
void Div(); //деление
void Sqrt(); //квадратный корень
void Radical(); //корень любой степени
void Power(); //возведение в степень
int main()
{
setlocale (LC_ALL, "Russian"); //подключаем великий и могучий русский язык в консоль
while (!done) //главный цикл программы, работает, пока пользователю
//не надоест
{
done = ShowMenu();
}
return 0;
}
bool ShowMenu()
{
short menu;
//символ "\n" - то же самое, что и endl, даже лучше
cout << "1. Сложение\n2. Вычитание\n3. Умножение\n4. Деление5. Квадратный корень\n";
cout << "6. Корень любой степени\n7. Возведение в степень\n8. Выход\n";
cin >> menu;
if (menu == 1)
Sum();
else if (menu == 2)
Sub;
else if (menu == 3)
Mul();
else if (menu == 4)
Div();
else if (menu == 5)
Sqrt();
else if (menu == 6)
Radical();
else if (menu == 7)
Power();
else if (menu == 8)
return true;
else
Error();
return false;
}
void Error()
{
cout << "Ой, кажется, вы что-то не так ввели. Попробуйте еще раз!\n";
}
void Sum()
{
int number;
cout << "Введите количество слагаемых: ";
cin >> number;
double * s = new double [number];
double answer = 0;
for (int i = 0; i < number; i++)
{
cout << "Введите " << i + 1 << " слагаемое: ";
cin >> s[i];
answer += s[i];
}
for (int i = 0; i < number - 1; i++)
cout << setprecision(8) << s[i] << " + ";
cout << setprecision(8) << s[number - 1] << " = " << setprecision(8) << answer << endl;
delete[]s;
}
void Sub()
{
double a, b;
cout << "Введите уменьшаемое: ";
cin >> a;
cout << "Введите вычитаемое: ";
cin >> b;
cout << a << " - " << b << " = " << setprecision(8) << a - b << endl;
}
void Mul()
{
int number;
cout << "Введите количество множителей: ";
cin >> number;
double * s = new double [number];
double answer = 1;
for (int i = 0; i < number; i++)
{
cout << "Введите " << i + 1 << " множитель: ";
cin >> s[i];
answer *= s[i];
}
for (int i = 0; i < number - 1; i++)
cout << setprecision(8) << s[i] << " * ";
cout << setprecision(8) << s[number - 1] << " = " << setprecision(8) << answer << endl;
delete[]s;
}
void Div()
{
double a, b;
cout << "Введите делимое: ";
cin >> a;
cout << "Введите делитель: ";
cin >> b;
cout << a << " / " << b << " = " << setprecision(8) << a / b << endl;
}
void Sqrt()
{
double a;
cout << "Введите число, из которого надо извлечь квадратный корень: ";
cin >> a;
cout << "sqrt(" << a << ") = " << sqrt (a) << endl;
}
void Radical()
{
double a, b;
cout << "Введите число, из которого надо извлечь корень: ";
cin >> a;
cout << "Корень какой степени надо извлечь? ";
cin >> b;
cout << "Корень " << b << " степени из числа " << a << " равен " << pow (a, 1 / b) << endl;
}
void Power()
{
double a, b;
cout << "Введите основание степпени: ";
cin >> a;
cout << "Введите показатель степпени: ";
cin >> b;
cout << a << "^" << b << " = " << pow (a, b) << endl;
}
4.2.Определение основ прикладного программирования с использованием языка С++.
Поскольку С++ является надмножеством С, то большинство программ на языке С являются также программами и на языке С++. (Имеется несколько небольших различий между С и С++, благодаря которым некоторые типы программ на языке С не будут компилироваться компилятором языка С++. Можно писать программы на С++, которые выглядят в точности как программы на языке С, но в таком случае не будут использоваться преимущества, предоставляемые С++-программистам. Кроме того, большинство программистов, пишущих на языке С++, используют стиль и некоторые особенности написания программ, которые присущи только С++. Поскольку важно использовать весь потенциал С++, то в этом разделе мы обсудим некоторые из таких особенностей, прежде чем перейти к собственно С++. Начнем с примера. Рассмотрим программу на языке С++:
#include <iostream.h>
#include <stdio.h>
int main()
{
int i ;
char str [80] ;
cout << "I like Borland C++.\n"; // однострочный комментарий
/* также можно использовать С-комментарии */
printf ("You can use printf(), but, most С++ programs don' t. \n");
// ввод числа с помощью >>
cout << "Enter a number: ";
cin >> i;
// вывод числа с помощью <<
cout << "Your number is " << i << "\n";
// чтение строки
cout << "Enter a string: ";
cin >>str;
// вывод
cout << str;
return 0;
}
Как можно видеть, эта программа выглядит совершенно отлично от обычной программы на языке С. Заголовочный файл iostream.h определен С++ и предназначен для поддержки операций ввода/вывода. Включение заголовочного файла stdio.h обусловлено использованием функции printf(). Если используются операции ввода/вывода собственно языка С++, то необходимости в этом файле нет.
Одной из особенностей, на которую стоит обратить внимание, служит объявление функции main() Int main() вместо
int main(void) , которое используют программы на языке С. Причина этого, заключается в том, что в языке С++ пустой список параметров эквивалентен спецификатору void. Это означает, что оба типа объявления функции равноправны в рамках языка С++. В С++ использование зарезервированного слова void для обозначения пустого списка параметров является допустимым, но рассматривается как излишество. Поскольку оно не является необходимым, далее в наших программах мы не будем использовать слово void для обозначения пустого списка параметров.
Следующая строка кода содержит несколько особенностей языка С++:
cout << "I like Borland C++.\n"; // однострочный комментарий
Оператор
cout << "I like Borland C++.\n"; выводит на экран «I like Borland С++.», после чего следует переход на следующую строку и возврат каретки. В С++ роль оператора << значительно расширена. Он продолжает выполнять роль оператора побитового сдвига влево, но используется также как оператор вывода данных в случае, если записан в указанной в примере форме. Слово cout представляет собой идентификатор, соответствующий экрану. Так же как и С, язык С++ поддерживает перенаправление ввода/ вывода, но, чтобы избежать дискуссий на эту тему, мы можем принять, что cout ссылается на экран. Можно использовать cout и оператор << для вывода данных любого встроенного типа, а также для вывода строк символов.
Важно отметить, что можно продолжать пользоваться функцией printf() (что проиллюстрировано в записанной выше программе) или любой другой функцией ввода/вывода языка С, но большинство программистов находят, что использование cout<< более соответствуют духу С++. В общем случае программы на языке С++ могут использовать любые функции, поддерживаемые Borland С++, включая и те, что определены языком С. Однако, в тех случаях, когда С++ предлагает альтернативный подход, ему следует отдавать предпочтение перед использованием функций языка С, хотя и нет правил, предписывающих это.
В предыдущей строке кода комментарии С++ следовали за выражением для вывода данных. В С++ комментарии определяются двумя способами. Комментарии языка С сохраняют свое значение и в С++. Однако в С++ можно также определить комментарии размером в одну строку, используя //. Когда комментарии начинаются с //, все, что следует за этими знаками, игнорируется компилятором до конца строки. Обычно при включении многострочных комментариев используют нотацию С, а однострочных — С++.
Далее программа выводит запрос-подсказку пользователю, чтобы он ввел число. Число читается с клавиатуры, используя следующую инструкцию:
cin >> i;
В С++ оператор >> сохраняет свое значение сдвига вправо, но если он используется как показано выше, то служит оператором ввода числа с клавиатуры и записи его в переменную i. Идентификатор cin ссылается на клавиатуру. В общем случае можно использовать cin >> для загрузки переменных любого базового типа или строки.
Хотя в программе это и не проиллюстрировано, можно свободно использовать любую функцию С для ввода данных, например, функцию scanf(), вместо cin >>. Однако, как и в случае с cout, подавляющее большинство программистов находят использование cin >> в большей мере соответствующим духу С++.
Рассмотрим другую интересную строку программы:
cout<< "Your number is " << i << "\n";
Этот код выводит на экран следующую фразу (предполагается, что значением i служит 100):
Your number is 100 после которой идет перевод каретки и переход на новую строку. В общем случае можно выполнять столько операций вывода <<, сколько надо.
Остальная часть программы демонстрирует, как можно прочитать и вывести строку, используя cin >> и cout <<. При вводе строки cin >> прекращает чтение, как только встречает специальный символ. Это аналогично тому, что делает стандартная функция scanf() при вводе строки.