Раздел 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() при вводе строки.

Наши рекомендации