Установка программного обеспечения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Установка программного обеспечения



Общие указания

 

Лабораторные работы по курсу «Алгоритмизация и программирование» выполняются после изучения теоретического материала.

Задачи выполнения лабораторных работ:

1) изучить методологию написания элементарных консольных программ на языке Си++;

2) получить навыки составления алгоритмов решения задач вычислительной математики;

3) получить навыки практического использования возможностей языка Си++ для решения задач вычислительной математики.

Лабораторный практикум состоит из 10 лабораторных работ, большинство из которых основаны на материале дисциплины «Высшая математика» излагаемом в первом семестре. Перед началом работы над лабораторными, студентам настоятельно рекомендуется просмотреть соответствующий раздел математики и приступать к работе только после того, как будет усвоен весь теоретический материал.

Внимание! Помимо электронного варианта конспекта лекций, студенты могут получить у преподавателя учебно-игровую программу «Си-бот». Используя данную программу, во время самостоятельной работы студенты смогут освоить азы программирования на примере управления роботом.

 

Установка программного обеспечения

 

Рассмотрим вопрос установки среды Microsoft Visual Cи++ версии 6.0.

Для установки – вставьте компакт-диск в CD-привод, запустите проводник, найдите на диске файл Setup.exe (рис. 1) и запустите его.

 

Рис. 1.

 

Перед вами должно появиться диалоговое окно, приведенное ниже на рис. 2. В данном диалоговом окне выбираем пункт Workstation Tools and Components и нажимаем кнопку Next.

 

Рис. 2.

 

Теперь появится окно, в котором вас будут убедительно просить чуть-чуть подождать, пока подготавливается установка Microsoft Visual Studio 6.0 ( рис. 3 ).

 

Рис. 3.

 

Далее следуйте подсказкам программы установки. На вопрос: "Какой тип инсталляции Вы хотите произвести?" выберите вариант Custom. В появившемся диалоговом окне установите "галочки" напротив следующих пунктов: Microsoft Visual C++ 6.0, ActiveX, Data Access, Enterprise Tools, Tools. В конечном итоге, окно выбора будет выглядеть примерно следующим образом (рис. 4):

 

Рис. 4.

 

Нажимаете кнопку Continue и ожидайте завершения процесса инсталляции.


ОСНОВНЫЕ БИБЛИОТЕКИ

 

Ниже приведен перечень основных библиотек используемых в данном лабораторном практикуме.

 

#include <iostream.h> // Подключение стандартной

// библиотеки ввода/вывода cout, cin

 

#include <fstream.h> // Библиотека функций для работы с файлами

ofstream OutFile("out.txt");

ifstream InFile("in.txt");

 

#include <stdio.h> // Подключение стандартной библиотеки

ввода/вывода printf

 

# include <stdlib.h> // Подключение библиотеки содержащей

// описание функций srand() и rand()

 

# include <time.h> // Подключение библиотеки содержащей

// описание функций работы с системными часами

srand((unsigned)time(NULL))

 

#include <math.h> // В случае использования математических функций

fabs(x), sqrt(x), pow(x,y), exp(x), sin(x), cos(x), tan(x),

asin(x), acos(x), atan(x),

 

#include <windows.h> // В случае использования функций и типов данных

// Windows

HANDLE, CreateFile(), WriteFile(), ReadFile(),

CloseHandle()

 


Лабораторная работа №1

 

Цель: Изучить технологию создания простых программ на Си++.

 

Задачи.

1. Освоить последовательность действий необходимых для написания кода программы, его компиляции и запуска на выполнение.

2. Изучить возможности языка Си++, позволяющие осуществлять элементарный вывод информации.

3. Получить навыки использования генератора случайных чисел.

 

Основные теоретические сведения

 

Создание проекта

 

Единственный способ выучить язык программирования – это писать на нем программы. Чтобы написать программу, вы должны где-то суметь создать текст программы, успешно его скомпилировать, загрузить, запустить на выполнение и разобраться, куда будет отправлен результат. Как только вы овладеете этим, все остальное окажется относительно просто.

Рассмотрим последовательность действий необходимых для создания проекта в среде Visual C++ 6.0.

Следует отметить, что со времен широкого использования операционной системы DOS компьютерные технологии совершили множество скачков на качественно новые уровни. Появились красочная графическая оболочка и эффекты трехмерности. Разработано множество стандартных библиотек классов и функций. Изменились сами подходы к программированию, а сам процесс разработки программного обеспечения (ПО) сегодня представляется отдельной технологией, включающей в себя множество этапов, начиная с разработки требований и заканчивая сопровождением.

Среда Microsoft Visual C++ 6.0 является мощным инструментом разработки современного ПО. В тоже время в ней сохранилась возможность создавать простые консольные приложения аналогичные тем, что писались под DOS.

Итак, для создания в Microsoft Visual C++ 6.0 самого простого типа проекта вам необходимо сделать следующие шаги.

Шаг 1. Запустите Visual C++. В меню выберите «File ► New ► Projects».

Шаг 2. В появившемся окне диалога (рис. 5) в поле Project name задайте имя проекта: First.

Шаг 3. Укажите в поле Location месторасположение папки с проектом. Среда Microsoft Visual C++ 6.0 автоматически создаст папку проекта.

Шаг 4. Выберите тип проекта Win32 Console Application и нажмите кнопку OK.

Шаг 5. Согласитесь с выбором An empty project, нажав Finish (рис. 6).

Шаг 6. Подтвердите выбор, нажав OK (в окне New project).

На этом шаге вы создали проект простого консольного приложения.

Шаг 7. В меню выберите File ► New ► Files. В появившемся окне диалога (рис. 7) выберите C++ Source File. Поставьте птичку «Add to project». В поле File name задайте имя main и нажмите кнопку OK.

После этого ваш экран примет вид представленный на рис. 8. В заголовке окна пишется имя проекта и, в квадратных скобках, текущий открытый файл. В нашем случае это «First» и «main.cpp».

Вертикальная область слева называется окном рабочего пространства (Workspace). Справа от него располагается окно редактора кода, в которое выводится содержимое текущего файла. В данный момент файл main.cpp пуст.

В дальнейшем мы будем очень часто пользоваться окном Workspace, так как оно позволят легко осуществлять навигацию по различным файлам проекта, а также функциям, классам и переменным.

 

Рис. 5.

 

Рис. 6.

 

Рис. 7.

 

Рис. 8.

 

Написание программного кода

 

Любая программа начинает свои вычисления с первой инструкции функции main. Обычно main для выполнения своей работы пользуется услугами других функций; одни из них пишутся самим программистом, а другие берутся готовыми из имеющихся в его расположении библиотек.

Традиционно, первой программой, которую пишут все, кто изучает программирование, является программа «Hello, world!» (Здравствуй, мир!). Ее код представлен в листинге 1. Все, что делает программа, это печатает на экране строку «Hello, world!».

 

Листинг 1

/*Ваша первая программа*/

 

#include <stdio.h> // Подключение стандартной библиотеки

 

void main(void) // Определение функции с именем main,

// не получающей никаких аргументов

{ // Инструкции main заключаются в фигурные скобки

printf(“Hello, world!\n”); // Функция main вызывает библиотечную функцию

// printf для печати заданной последовательности

// символов; \n – символ новой строки

}

 

 

Рассмотрим эту программу более подробно.

Прежде всего, вам необходимо обратить внимание на комментарии. В программе на языке Си++ комментарии используются для ее документирования. Комментарии начинаются с пары символов «/*» и завершаются парой символов «*/». Комментарии могут начинаться в любом месте программы, заканчиваться в любом месте и содержать любое число строк. Ниже приведены примеры комментариев.

 

/* Это однострочный комментарий */

 

/*

Компилятор языка Си

рассматривает все эти строки

как комментарий

*/

 

Вы можете также использовать пару символов «//» для комментирования одной строки.

В листинге 1 все комментарии выделены зеленым цветом.

Далее вам следует обратить внимание на подключение библиотек. Язык Си++ предлагает программисту огромный ассортимент различных функций. Это могут быть функции математические, для работы с графикой, для ввода или вывода информации и т.п. Все эти функции объединены во множество так называемых библиотек. Если вы намереваетесь использовать ту или иную функцию, то вам необходимо подключить к своей программе соответствующую библиотеку.

Подключение библиотеки производится следующей конструкцией:

 

#include <имя заголовочного файла>

 

В нашем случае для использования функции printf() необходимо подключить библиотеку «stdio», что и делается в строке:

 

#include <stdio.h>

 

Следующая строка в листинге 1:

 

void main()

 

Это объявление функции main(). Тело этой функции заключено в фигурные скобки {} и состоит из вызова стандартной функции вывода printf().

Теперь давайте рассмотрим последовательность действий необходимых для ввода программного кода представленного в листинге 1, используя среду Visual C++ 6.0.

Внимание! Дальнейший алгоритм предполагает, что вы выполнили все необходимые действия по созданию проекта в среде Visual C++ 6.0.

Шаг 1. Убедитесь в том, что у вас открыт файл main.cpp (см. рис. 8). Если нет, то выберите в окне Workspace закладку FileView.

Шаг 2. В появившейся закладке (рис. 9) откройте папку Source Files и дважды щелкните на файле main.cpp.

 

Рис. 9.

 

Шаг 3. В появившемся справа окне редактора кода наберите код программы «Hello, world!». Комментарии можете не набирать.

 

Генератор случайных чисел

 

Многие задачи лабораторного практикума требуют ввода различных исходных данных. В случае, когда надо ввести одно два числа это можно осуществить вручную. Но если требуется ввести в качестве исходных данных большое количество чисел, например, матрицу, целесообразно использовать генератор случайных чисел.

Для работы с генератором случайных чисел Си++ предоставляет две функции: srand() и rand() описанные в библиотеке stdlib.

Перед началом работы генератор случайных чисел необходимо проинициализировать. Для этого надо вызвать функцию srand() с любым целым положительным аргументом.

Каждый вызов функции rand() позволяет получить целое случайное число в диапазоне от 0 до величины RAND_MAX. Численное значение этой величины нас не интересует. В листинге 5 представлен пример программы печатающей на экране два случайных числа.

 

Листинг 5

/*Программа вывода на экране двух случайных

чисел при постоянном аргументе функции srand ()*/

 

#include <iostream.h> // Подключение стандартной

// библиотеки ввода/вывода

# include <stdlib.h> // Подключение библиотеки содержащей

// описание функций srand() и rand()

 

void main(void)

{

srand (2); // Инициализация генератора

// Вывод на экран случайных чисел

cout << rand() << ‘\n’;

cout << rand() << ‘\n’;

}

 

 

Обратите внимание на то, что при каждом вызове программы (листинг 5) вы получаете одинаковую последовательность чисел. Это связано с тем, что мы инициализируем генератор случайных чисел одним и тем же числом srand(2). Если вы желаете получать каждый раз другую последовательность, то вам надо соответственно менять значение аргумента функции srand() при каждом новом запуске программы. Для этого можно, например, использовать системные часы. В листинге 6 представлен модифицированный вариант программы печатающей два случайных числа.

 

Листинг 6

/*Программа вывода на экране двух случайных

чисел при случайном аргументе функции srand ()*/

 

#include <iostream.h> // Подключение стандартной

// библиотеки ввода/вывода

# include <stdlib.h> // Подключение библиотеки содержащей

// описание функций srand() и rand()

# include <time.h> // Подключение библиотеки содержащей

// описание функций работы с системными часами

void main(void)

{

srand ((unsigned) time(NULL)); // Инициализация генератора

// Вывод на экран случайных чисел

cout << rand() << ‘\n’;

cout << rand() << ‘\n’;

}

 

 

Теперь при каждом вызове программы вы будете получать новую последовательность чисел.

 

 


Задание к лабораторной работе

 

Набрать, откомпилировать и запустить следующие программы:

 

Листинг 7

/*Вывод с использованием функции printf()*/

 

#include <stdio.h>

void main(void)

{

printf(“I love \” Algorithmization and programming!\”\n”);

}

 

 

Листинг 8

/*Вывод с использованием оператора <<*/

 

#include <iostream.h>

void main(void)

{

cout << “I love\n”;

cout << “\”Algorithmization and programming!”\n”);

}

 

 

Листинг 9

/*Форматированный вывод с использованием функции printf()

Программа выводит: фамилию, имя, группу и порядковый

номер по списку*/

 

#include <stdio.h>

void main(void)

{

printf(“I am %s\nGroup: %s\nOrder number: %d\n”, “Ivanov Ivan”, “TA-0113”, 1);

}

 

 

Примечание! В программе представленной в листинге 9, каждый студент должен вписать свои данные.

 

Листинг 10

/*Ввод/вывод с использованием операторов << >>

программа ожидает ввода элементов матрицы 2х2,

а затем выводит матрицу на экран*/

 

#include <iostream.h>

void main(void)

{

int a, b, c, d;

cout << "Input elements\n";

cin >> a >> b >> c >> d;

cout << “Matrix 2x2\n”;

cout << a << ‘\t’ << b << ‘\n’;

cout << c << ‘\t’ << d << ‘\n’;

}

 

 

После запуска данной программы на экране появляется строка:

 

Input elements

 

Далее вам необходимо ввести четыре целых числа. Ввод очередного числа завершается нажатием клавиши Enter.

 

Листинг 11

/*Модифицированный вариант программы листинг 10.

Элементы матрицы формируются при помощи генератора

случайных чисел*/

 

#include <iostream.h>

# include <stdlib.h>

# include <time.h>

void main(void)

{

srand ((unsigned) time(NULL));

int a, b, c, d;

a = rand();

b = rand();

c = rand();

d = rand();

cout << “Matrix 2x2\n”;

cout << a << ‘\t’ << b << ‘\n’;

cout << c << ‘\t’ << d << ‘\n’;

}

 

 

В протоколе необходимо привести листинги всех набранных программ. Каждый листинг должны быть снабжен комментариями.


Контрольные вопросы

 

1) Вы хотите создать проект. Ваши действия?

2) Вы написали программу и хотите ее откомпилировать. К сожалению, программа содержит ошибки. Ваши действия?

3) Вы добились безошибочной компиляции вашей программы. Теперь вы хотите запустить ее и просмотреть результат ее работы. Ваши действия?

4) При помощи чего осуществляется ввод/вывод информации?

5) Зачем нужны библиотеки и как они подключаются к программе?

6) Вы хотите использовать в программе генератор случайных чисел. Ваши действия?

 


Лабораторная работа №2

 

Цель: Изучить возможности выполнения арифметических и логических вычислений с использованием языка Си++.

 

Задачи:

1) Разработать программу, решающую задачу из области арифметики.

2) Разработать программу, использующую разветвления.

3) Разработать программу, использующую цикл.

 

 

Допускается

Давать переменным имена i, n, j и т.п. если эти переменные используются в операторах циклов.

Давать переменным имена Temp, Buffer, String, Len и т.п. если их видимость не более 10 строк.

Рекомендуется

Длина имени переменной не более 30 символов;

Инициализация переменных при объявлении. Другими словами, после того как вы объявили любую переменную, рекомендуется ей присвоить какое-либо значение по умолчанию. Например, численным значениям присвоить 0.

 

Итак, пусть у нас есть целочисленная переменная с именем «nExample».

В языке Си++ Все переменные надо объявлять! Фактически, объявление – это резервирование места в памяти машины под конкретную переменную. Это необходимо потому, что иначе, если бы переменные вводились просто использованием имени переменной, и мы вдруг допустили бы ОПЕЧАТКУ, например:

 

nIdnex = 1;

 

вместо

 

nIndex = 1;

 

то у нас появилась бы лишняя переменная nIdnex, а ожидаемое действие не произошло бы. Такую ошибку найти чрезвычайно тяжело. Если же переменные необходимо объявлять, то необъявленные переменные будут выявлены еще на этапе компиляции программы.

Вот примеры объявления переменных различных типов.

 

Тип данных   Объявление
Целая переменная int nNum;
Вещественная переменная double dDigit;
Один символ char cSimbol;
Логическая переменная bool bKey;

 

В нашем случае переменную nExample необходимо объявить следующим образом:

 

int nExample;

 

Значение переменных можно изменять при помощи операции присваивания. В языке Си++ она обозначается знаком равенства. Например, запись

 

nExample = 10;

 

означает присвоить переменной nExample значение 10. Такая строчка является простейшим оператором. В конце операторов ставится точка с запятой.

Рассмотрим запись:

 

nExample = nExample + 3;

 

Это не уравнение. Если рассматривать эту строку как математическое уравнение, оно не имеет решения. На самом деле тут написано:

1) «взять значение переменной nExample»;

2) «прибавить к нему 3»;

3) «положить новое значение в переменную nExample».

В правой части значение переменной может встречаться несколько раз:

 

nResult = nExample*nExample - nExample + 1;

 

Тут есть две переменные:

nResult – для результата;

nExample – уже имеющая некоторое значение.

Рассмотрим примеры использования переменных других типов. Предположим в вашей программе необходимо рассчитать скорость объекта. Напомним, что скорость есть расстояние, деленное на время. Пусть скорость, расстояние и время выражаются вещественными числами. Тогда следует поступить следующим образом.

Объявим переменные скорость, расстояние и время:

 

double dSpeed, dDistance, dTime;

 

Проведем начальную инициализацию:

 

dDistance = 3.5;

dTime = 1.3;

 

А теперь произведем собственно расчет:

 

dSpeed = dDistance / dTime;

 

Арифметические операторы

 

Стандарт ANSI для языка Си++ определяет более 40 операторов. С помощью арифметических операторов +, -, *, /, % вы можете выполнять простые арифметические операции, которые обычно выполняются и в других языках программирования.

 

 

Оператор   Краткое описание
+ Суммирует два операнда
- Вычитает из первого операнда второй
* Умножает два арифметических операнда
/ Делит первый арифметический операнд на второй
% Оператор взятия модуля, определяет остаток от деления первого целочисленного операнда на второй

 

Все арифметические операторы являются бинарными, т.е. они всегда работают с двумя операндами. Операторы + и – имеют одинаковый приоритет, который ниже приоритета операторов *, / и %. Арифметические операции одного приоритетного уровня выполняются слева направо. Вы можете изменить порядок выполнения операторов с помощью скобок.

Внимание! В языке Си++ для операции деления существует следующее правило:

Если делимое и делитель являются целыми числами, то результат деления также будет целым числом.

Это означает, что в результате выполнения строки:

 

double dResult = 3 / 2;

 

переменная dResult будет иметь значение 1.

Есть различные способы получить вещественный результат деления. Можно делимое или делитель задать как вещественные числа, например:

 

double dResult = 3. / 2;

 

либо:

 

double dResult = 3 / 2.;

 

Можно также произвести прямое преобразование типов. Это означает, что вы можете указать, что переменную одного типа следует рассматривать как переменную другого типа, например, запись:

 

double dResult = double(3) / 2;

 

означает, что целое число 3 следует рассматривать как вещественное число 3.00.

Следующие записи операции деления эквивалентны предыдущей.

 

double dResult = (double) 3 / 2;

double dResult = 3 / double(2);

double dResult = 3 / (double) 2;

 

Математические функции

 

В случае использования математических функций вам необходимо подключить библиотеку math, т.е. добавить в начале вашей программы строку:

 

#include <math.h>

 

В данной лабораторной работе вы будете пользоваться следующими математическими функциями.

Функция fabs(x) вычисляет абсолютное значение x, то есть определяет модуль |x|.

Прототип:

double fabs(double x);

Пример использования:

 

cout << fabs(5);

Вывод:

 

cout << fabs(-5);

Вывод:

cout << fabs(-3.2 / 2);

Вывод:

1.6

 

cout << fabs((6 – 10) / 2);

Вывод:

 

Функция sqrt(x) возвращает квадратный корень аргумента х.

Прототип:

double sqrt(double x);

Ограничения:

Аргумент должен быть положительным числом.

Пример использования:

 

cout << sqrt(4);

Вывод:

 

Функция pow(x, y) возводит х в степень у.

Прототип:

double pow(double x, double y);

Ограничения:

Нельзя возводить 0 в отрицательную степень.

Пример использования:

 

cout << pow(2, 3);

Вывод:

 

Функция exp(x) возводит число е в степень x.

Прототип:

double exp(double x);

Пример использования:

 

double x = 2.302585093, y;

y = exp(x);

printf("exp(%g) = %g\n", x, y);

Вывод:

10.000000

 

Функции sin(x), cos(x), tan(x) соответственно рассчитывают синус, косинус и тангенс x.

Прототип:

double sin(double x);

double cos(double x);

double tan(double x);

Примечание:

Аргумент функций измеряется в радианах.

Пример использования:

 

double pi = 3.1415926535;

double x;

x = tan(pi / 4);

printf("tan(%g) = %g\n", pi/4, x);

Вывод:

tan(0.785398) = 1.000000

 

Функции asin(x), acos(x), atan(x) соответственно рассчитывают арксинус, арккосинус и арктангенс x.

Прототип:

double asin(double x);

double acos(double x);

double atan(double x);

Пример использования:

 

double x, y;

cout << "Enter a real number between -1 and 1: ";

cin >> x;

y = asin(x);

printf("Arcsine of %g = %g\n", x, y);

y = acos(x);

printf("Arccosine of %g = %g\n", x, y);

Вывод:

Enter a real number between -1 and 1:.32696

Arcsine of 0.326960 = 0.333085

Arccosine of 0.326960 = 1.237711

 

Оператор if

Оператор if-else используется для принятия решения. Рассмотрим схему оператора:

if (условие)

{

операторы 1;

}

else

{

операторы 2;

}

 

Фигурные скобки в каждой ветви можно опустить, если оператор только один. Ветвь else не обязательна.

Сначала вычисляется условие (точнее, условное выражение), и, если оно истинно (т.е. отлично от нуля), выполняются операторы 1. Если условие ложно (т.е. его значение равно нулю) и существует else-связь, то выполняются операторы 2.

В языке Си++ существуют следующие условные операторы:

 

Оператор Проверяемое условие
> Больше
>= Больше либо равно
< Меньше
<= Меньше либо равно
== Равно
!= Не равно

 

Обратите внимание на условный оператор ==. Не путайте его с оператором присваивания =. Так, например, запись:

 

if (a = 2)

b = a;

 

означает вовсе не «если переменная а равна 2, то присвоить переменной b значение переменной а». На самом деле эта запись читается так: «если результат выполнения операции присваивания а = 2 есть истина, то присвоить переменной b значение переменной а». Так как результат выполнения операции присвоения всегда истина, в приведенном примере независимо от текущего значения переменной а всегда будет выполняться строка b = a. Если же вы хотите проверить условие не равно ли значение переменной а двум, то оператор if следует записать следующим образом:

 

if (a == 2)

b = a;

 

Ниже приведены примеры использования оператора if:

 

int a = 1;

int b = 2;

if (a > b)

cout << a;

else

cout << b;

Вывод:

 

int a = 2;

if (a == 0)

cout << “inf”;

else

cout << 1. / a;

Вывод:

0.5

 

В вышеприведенном примере начальные условия фиксированы, и результат программы всегда будет одним и тем же. Давайте результат сделаем более разнообразным: каждый раз при запуске программы будем вводить любое число, а программа пусть его выводит и сообщает положительное это число или отрицательное.

Разберем на примере листинга 12, как определиться со знаком числа с помощью конструкция if-else.

 

Листинг 12

/*Ваше число положительное или отрицательное? */

 

#include <iostream.h>

void main(void)

{

int a;

cout << "Vvedite luboe chislo:\n";

cin >> a;

if (a>=0)

{

cout << "Vawe chislo " << a << " polozitelnoe\n";

}

else

{

cout << "Vawe chislo " << a << " otricatelnoe\n";

}

}

 

 

Например, введем 96. Сначала программа проверит первую часть условия после if. Если а (т.е. ваше число 96) ≥ 0 (а оно больше нуля), значит на экран будет выведено: Vawe chislo 96 polozitelnoe. Но если вы введете при запуске программы число -96, то первое условие -96 ≥ 0 не выполнится и программа перейдет во вторую часть условия после else и выполнит ее оператор, то есть выведет вам на экран: Vawe chislo -96 otricatelnoe.

В листинге 13 приведен пример использования оператора if для реализации простейшего калькулятора.

 

Листинг 13

/*Калькулятор с оператором if*/

 

#include <math.h>

#include <iostream.h>

void main(void)

{

double dNumber1, dNumber2;

char cOperator;

 

cout << "Calculation:\n";

cout << "Input: number_1 operator number_2\n";

 

cin >> dNumber1 >> cOperator >> dNumber2;

 

if (cOperator == '+') cout << "= " << dNumber1 + dNumber2 << '\n';

else if (cOperator == '-') cout << "= " << dNumber1 - dNumber2 << '\n';

else if (cOperator == '*') cout << "= " << dNumber1 * dNumber2 << '\n';

else if (cOperator == '/') cout << "= " << dNumber1 / dNumber2 << '\n';

else cout << "Unknown operator\n\n";

}

 

 

Несмотря на то, что программа в листинге 13 достаточно компактна, не рекомендуется оформлять программный код подобным образом. Одними из критериев оценки качества программного кода является удобочитаемость и понятность. С точки зрения этих критериев, условные операторы из листинга 13 следовало бы оформить следующим образом:

 

if (cOperator == '+')

{

cout << "= " << dNumber1 + dNumber2 << '\n';

}

else if (cOperator == '-')

{

cout << "= " << dNumber1 - dNumber2 << '\n';

}

else if (cOperator == '*')

{

cout << "= " << dNumber1 * dNumber2 << '\n';

}

else if (cOperator == '/')

{

cout << "= " << dNumber1 / dNumber2 << '\n';

}

else cout << "Unknown operator\n\n";

 

Вы можете возразить, что объем программного кода увеличился более чем в 3 раза. Это верно. Но в свою очередь возросла понятность программы. Теперь гораздо легче отследить ее логику и, в случае необходимости, найти ошибку.

 

Логические операторы

 

Язык Си++ располагает тремя логическими операторами: И, ИЛИ и НЕ.

Логические операторы И и ИЛИ являются бинарными. В отличие от них логический оператор НЕ является унарным и результат присваивает своему же операнду. Значения операндов интерпретируются как логические 0 и 1.

 

Оператор Назначение
&& оператор логического И
|| оператор логического ИЛИ
! оператор логического НЕ

 

В рамках данного лабораторного практикума логические операторы используются совместно с оператором if для построения сложных условий. Примеры использования логических операторов приведены ниже.

 

if ((x > 0) && (x < 1)) // Если 0 < х < 1

{ … // (то есть, если x > 0 И x < 1)

}

 

if (!(x > 0)) // Если х <= 0

{ … // (то есть, если x НЕ > 0)

}

 

if ((x > 0) || (y > 0)) // Если 0 < х ИЛИ 0 < у

{ …

}

 

Оператор switch

 

Оператор switch используется для выбора одного из многих путей. Он проверяет, совпадает ли значение переменной с одним из значений, входящих в некоторое множество целых констант, и выполняет соответствующую этому значению ветвь программы:

 

switch (переменная)

{

case константа1:

{

операторы;

}

break;

case константа2:

{

операторы;

}

break;

default: операторы;

}

Каждая ветвь case помечена одной или несколькими целочисленными константами. Вычисления начинаются с той ветви case, в которой константа совпадает со значением переменной. Константы всех ветвей case должны отличаться друг от друга. Если выяснилось, что ни одна из констант не подходит, то выполняется ветвь, помеченная словом default, если таковая имеется, в противном случае ничего не делается. Ветви case и default можно располагать в любом порядке.

В листинге 13 была приведена программа-калькулятор, использующая оператор if. Теперь рассмотрим вариант этой программы с переключателем switch:

 

Листинг 14

/*Калькулятор с оператором switch*/

 

#include <math.h>

#include <iostream.h>

void main(void)

{

double dNumber1, dNumber2;

char cOperator;

 

cout << "Calculation:\n";

cout << "Input: number_1 operator number_2\n";

 

cin >> dNumber1 >> cOperator >> dNumber2;

 

switch (cOperator)

{

case '+': cout << "= " << dNumber1 + dNumber2 << '\n'; break;

case '-': cout << "= " << dNumber1 - dNumber2 << '\n'; break;

case '*': cout << "= " << dNumber1 * dNumber2 << '\n'; break;

case '/': cout << "= " << dNumber1 / dNumber2 << '\n'; break;

 

default: cout << "Unknown operator" << '\n'; break;

}

}

 

 

Инструкция break вызывает немедленный выход из переключателя switch. Поскольку выбор ветви case реализуется как переход на метку, то после выполнения одной ветви case, если ничего не предпринять, программа провалится вниз на следующую ветвь. Инструкции break и return – наиболее распространенные средства выхода из переключателя. Инструкция break используется также для принудительного выхода из циклов while и for.

"Сквозное" выполнение ветвей case вызывает смешанные чувства. С одной стороны, это хорошо, поскольку позволяет несколько ветвей case объединить в одну. Но с другой – это означает, что в конце почти каждой ветви придется ставить break, чтобы избежать перехода к следующей. Последовательный проход по ветвям – вещь ненадежная, это чревато ошибками, особенно при изменении программы. За исключением случая с несколькими метками для одного вычисления, старайтесь по возможности реже пользоваться сквозным проходом, но если уж вы его применяете, обязательно комментируйте эти особые места.

Добрый вам совет: даже в конце последней ветви (после default в нашем примере) помещайте инструкцию break, хотя с точки зрения логики в ней нет никакой необходимости. Но эта маленькая предосторожность спасет вас, когда однажды вам потребуется добавить в конец еще одну ветвь case.

 

Цикл while

 

Цикл while (до тех пор, пока истинно) оформляется следующим образом:

 

while(условие)

{

тело цикла;

}

 

Данная конструкция является циклом потому, что тело цикла будет выполняться множество раз, до тех пор, пока будет истинным условие. Чтобы цикл закончился, в его теле должна изменяться какая-либо переменная, от значения которой зависит истинность условия повторений.

Ниже приведены варианты организации циклов с использованием оператора while:

 

int a;

while(1) // Пример бесконечного цикла

{

a = a + 1;

}

 

int a = 1;

while(a < 10)

{

a = a + 1;

}

 

А теперь вспомните листинг 12, в котором вы определяли знак числа. Вам приходилось для каждого нового числа каждый раз запускать программу, что согласитесь неудобно. Гораздо лучшее решение – предоставить оператору возможность управлять выходом из программы. Это легко реализовать, поместив операторы тела функции main (листинг 12) в тело бесконечного цикла while (листинг 15). При этом возникает возможность определять знаки любых ваших чисел столько раз, сколько вы пожелаете. Для выхода из цикла используется специальный оператор break, который будет выполнен, в случае, если оператор введет число 0.

 

Листинг 15

/*Определение знаков чисел с использованием цикла while*/

 

#include <iostream.h>

void main(void)

{

while(true)

{

int a;

cout << "Vvedite luboe chislo ili 0 dlya vihoda:\n";

cin >> a;

if (a > 0)

{

cout << "Vawe chislo " << a << " polozitelnoe\n";

}

if (a < 0)

{

cout << "Vawe chislo " << a << " otricatelnoe\n";

}

if (a == 0)

{

break;

}

}

}

 

 

Цикл for

 

Этот цикл является просто иной записью одного из вариантов цикла while, то есть это его частный случай. Он служит обычно для выполнения определенного действия несколько раз, не «пока истинно условие», а «выполнить N раз».

У такого цикла есть «переменная цикла» и «счетчик повторений».

Рассмотрим цикл while и аналогичный ему цикл for.

 

int i;

i = 0; // Начальная инициализация

while (i < b)

{

тело_цикла;

i = i + 1; // Увеличение счетчика цикла

}

 

int i;

for (i = 0; i < b; i++)

{

тело_цикла;

}

 

Это два совершенно идентичных цикла по переменной i. Тело каждого цикла выполняется b раз, при этом переменная i изменяется от 0 до (b – 1).

Прежде всего, обратите внимание на наличие трех групп в заголовке цикла for(;;). Они разделены точкой с запятой. В первой группе заголовка могут быть перечислены через запятую операторы, которые следует выполнить до входа в цикл, то есть один раз. Это своего рода инициализация цикла. Во второй части указывается условие продолжения цикла. В третьей группе перечисляются операторы, выполняемые в конце цикла. После заголовка следует тело цикла.

Следует не пожалеть времени и хорошо запомнить последовательность выполнения операторов при реализации цикла:

Шаг 1. Один раз выполняются операторы первой части заголовка.

Шаг 2. Проводится проверка условия (вторая часть заголовка) и выход из цикла в случае его нарушения

Шаг 3. Выполняются операторы тела цикла.

Шаг 4. Выполняются операторы третьей части заголовка.

Шаг 5. Переход к шагу 2.

Тело цикла может быть игнорировано (не выполнено ни разу), если условие нарушено при первом же входе в цикл.



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 369; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.105.31 (0.533 с.)