МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Белорусский национальный технический университет Кафедра «Тепловые электрические станции» ИНФОРМАТИКА Практикум Часть 1 Минск БНТУ 2017 1 МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Белорусский национальный технический университет Кафедра «Тепловые электрические станции» ИНФОРМАТИКА Практикум по программированию на языке С++ для студентов специальностей 1-43 01 04 «Тепловые электрические станции», 1-43 01 08 «Паротурбинные установки атомных электрических станций» В 2 частях Часть 1 Рекомендовано учебно-методическим объединением по образованию в области энергетики и энергетического оборудования Минск БНТУ 2017 2 УДК 004(076.5) ББК 32.97я7 И74 Составители : Л. А. Тарасевич, Е. В. Пронкевич, В. А. Романко, С. М. Денисов Рецензенты : кафедра электроники Белорусского государственного университета информатики и радиоэлектроники (зав. кафедрой, канд. техн. наук, доцент С. М. Сацук); канд. физ.-мат. наук кафедры ПАСТ Государственного учреждения образования «Командно-инженерный институт» Министерства по чрезвычайным ситуациям Республики Беларусь Т. М. Мартыненко Информатика : практикум по программированию на языке С++ для студентов специальностей 1-43 01 04 «Тепловые электрические станции», 1-43 01 08 «Паротурбинные установки атомных электри- ческих станций» : в 2 ч. Ч. 1 / сост. : Л. А. Тарасевич [и др.]. – Минск : БНТУ, 2017. – 110 с. ISBN 978-985-550-854-1 (Ч. 1). В практикуме приведены краткие теоретические сведения по основам программирования на алгоритмическом языке С++, варианты заданий к каждой лабораторной работе, контрольные вопросы. УДК 004(076.5) ББК 32.97я7 ISBN 978-985-550-854-1 (Ч. 1) © Белорусский национальный ISBN 978-985-550-855-8 технический университет, 2017 И74 3 Содержание ВВЕДЕНИЕ ............................................................................................. 4 Лабораторная работа № 1. ВЫЧИСЛЕНИЕ ФУНКЦИИ .................... 5 Лабораторная работа № 2. ВЫЧИСЛЕНИЕ ПО УСЛОВИЮ .......... 34 Лабораторная работа № 3. ОПЕРАТОР SWITCH ............................. 46 Лабораторная работа № 4. ЦИКЛИЧЕСКИЕ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ .................................................. 53 Лабораторная работа № 5. ВЫЧИСЛЕНИЕ КОНЕЧНЫХ СУММ ............................................................................ 65 Лабораторная работа № 6. ОДНОМЕРНЫЕ МАССИВЫ ................ 69 Лабораторная работа № 7. ДВУМЕРНЫЕ МАССИВЫ ................... 75 Лабораторная работа № 8. ПОДПРОГРАММЫ ................................ 78 Лабораторная работа № 9. ФАЙЛЫ ................................................... 82 Лабораторная работа № 10. MICROSOFT WORD И EXCEL ........... 87 Лабораторная работа № 11. ПРОГРАММА MATHCAD ................ 102 СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ ........................... 110 4 ВВЕДЕНИЕ Данный практикум написан в рамках изучения курса информа- тики студентами технических специальностей. С++ – это новый язык, основанный на Си, который в свою очередь дополняет большинство современных языков программирования. С++ – компилируемый язык программирования общего назначе- ния, сочетает свойства как высокоуровневых, так и низкоуровневых языков программирования. Был создан в начале 1980-x годов сотрудником фирмы Bell labo- ratories – Бьёрном Страуструпом. C++ включает все операторы и средства языка Си, добавив не- сколько новых. Преимущество данного языка программирования в том, что он позволяет разрабатывать сложные программы за счет более модульного подхода. Кроме того, С++ является языком объ- ектно-ориентированного программирования. 5 Лабораторная работа № 1 ВЫЧИСЛЕНИЕ ФУНКЦИИ Цель работы: – приобрести практические навыки составления линейных про- грамм на языке С++; – представить алгоритм решения задачи в виде блок-схемы. Теоретические сведения Правила написания программ При написании программы на языке С++ следует соблюдать ни- жепредставленные правила. 1. Операторы при записи алгоритма должны располагаться по- следовательно слева направо и сверху вниз. Порядок чтения может изменяться при помощи специальных операторов (см. ниже). 2. Все константы, типы, переменные и функции должны быть объявлены до их первого использования в любом месте программы. 3. При объявлении и использовании констант, типов, перемен- ных и функций необходимо помнить, что в языке C++ прописное и строчное написание одной и той же буквы считается различными символами. 4. Каждый оператор заканчивается точкой с запятой (исключе- ния см. ниже), поэтому в одной строке можно располагать несколь- ко операторов или один оператор можно располагать на нескольких строках (не разбивая идентификаторы). 5. Для удобства разработки можно использовать комментарии, которые не обрабатываются компилятором и служат для улучшения читабельности программы. Комментарием считается все, заключен- ное в скобки /* … */ или расположенное правее //. 6. Если необходимо объединить несколько операторов, то ис- пользуется составной оператор. Составным оператором считается все, заключенное в фигурные скобки { … }. 6 Алфавит языка С++ В языке С++ используются наборы символов: 1) прописные (A, B, C, … , Y, Z) и строчные (a, b, c, … , y, z) бук- вы латинского алфавита; 2) арабские цифры от 0 до 9; 3) специальные символы. Специальные символы позволяют задавать операторы и знаки операций. Некоторые из них представлены в табл. 1.1. Таблица 1.1 Символ Операция + Сложение – Вычитание * Умножение / Деление % Деление по модулю (остаток от де-ления) ++ Увеличение на единицу -- Уменьшение на единицу = Присваивание *= Умножение с присваиванием /= Деление с присваиванием %= Деление по модулю (остаток от де-ления) с присваиванием += Сложение с присваиванием –= Вычитание с присваиванием && Логическое И | | Логическое ИЛИ ! Логическое отрицание = = Сравнение на равенство > Сравнение на больше > = Сравнение на больше или равно < Сравнение на меньше < = Сравнение на меньше или равно ! = Сравнение на не равно >> Сдвиг вправо << Сдвиг влево 7 Все объекты (переменные, массивы и т. д.), с которыми работает программа в С++, необходимо декларировать. При декларировании объекты можно инициализировать (задать начальные значения). Пример 1.1. int j=10, m=3; float c=–1.3, l=–10.23, n При декларировании объектов в языке С++ используются их идентификаторы, которые могут включать цифры (0...9), латинские прописные (A...Z) и строчные (a...z) буквы, символ подчеркивания _. Первый символ идентификатора не может быть цифрой. Принято ис- пользовать в идентификаторах переменных строчные буквы, а в име- нованных константах – прописные. Пример 1.2. const float Pi=3.1415926; float Pi=3.14 Идентификаторы Идентификаторы – это слова, которые используются как имена переменных, функций, типов данных. Они состоят из букв, цифр, подчеркиваний и не могут начинаться с цифры. Длина их произ- вольна. Прописные и строчные буквы различаются. Для разделения идентификаторов служат пробелы, табуляции, «на новую строку», «на новую страницу». Комментарии – однострочные: //; – многострочные: /*…*/. Комментарии не могут быть вложенными. 8 Типы данных В языке С++ существуют типы данных, представленные в табл. 1.2. Таблица 1.2 Тип Длина в байтах Диапазон char 8 –128..127 int 16 –32768..32767 float 32 3.4*10–38..3.4*1038 double 64 1.7*10–308..1.7*10308 Есть тип данных, который обозначает пустое значение: void. Он используется для двух целей: – определения функций, которые не возвращают значения; – создания родовых (generic) указателей, то есть указателей на выделенную программой память. В дальнейшем этот указатель мо- жет быть преобразован в другой тип. Для более точного выбора типов данных используются модифи- каторы типов: – модификаторы знака: signed – со знаком; unsigned – без знака; – модификаторы длины: short – короткие; long – длинные. С типом char используются только модификаторы знака. signed char (=char) –128..127 unsigned char 0..255 А с типом integer используются как модификаторы знака, так и модификаторы длины. short int 8 или 16 Со знаком short signed short int signed short 9 unsigned short int 8 или 16 Без знака unsigned short signed int 16 Со знаком signed int unsigned int 16 Без знака unsigned long int 32 или 16 –2 147 483 648..2 147 483 647long signed long int signed long C типом float модификаторы не работают. С типом double используется только модификатор long. Long double 80 3.4*10–4932..3.4*104932 Константы Константами называются неизменяемые величины в програм- ме. Они могут быть четырех типов: – целые (десятичное, восьмиричное или шестнадцатиричное це- лое число); – с плавающей точкой (десятичное число, представляемое в виде действительной величины с фиксированной или плавающей точкой); – символьные (символы, заключенные в одинарые скобки … ’или, если это строка, – в двойные " … "); – перечисляемые (некая последовательность имен, которая авто- матически нумеруется, начиная с 0). Для улучшения читабельности программ константами им можно давать имена. Пример 1.3. const M=5; // Константа целого типа const float Pi2=3.14/2; // Константа действительного типа char const *Name="Alex"; // Указатель на строковую константу 10 Переменные Переменными называются идентификаторы, значения которых мо- гут меняться в процессе выполнения программы. Переменная может объявляться отдельным оператором до ее первого использования. Синтаксис: <тип> <список идентификаторов>; Пример 1.4. float d; int i, j, k; или внутри операторов: for (int i=0, i<3, i++) Операторы Арифметические операторы В табл. 1.3 приведен список арифметических операторов языка C++. Операторы +, –, * и / выполняются точно так же, как и в боль- шинстве языков программирования. Их можно применять практи- чески к любым встроенным типам данных. Если оператор / приме- няется к целому числу или символу, дробная часть отбрасывается. Например, 5/2 равно 2. Таблица 1.3 Оператор Действие – Вычитание, а также унарный минус + Сложение * Умножение / Деление % Деление по модулю -- Декрементация ++ Инкрементация 11 Оператор деления по модулю %, как и в других языках програм- мирования, возвращает остаток целочисленного деления. Однако этот оператор нельзя применять к числам с плавающей точкой. Унарный минус умножает свой операнд на –1. Иными словами, он меняет знак операнда на противоположный. В языке C++ есть два полезных оператора, которыми не облада- ют некоторые другие языки. Это операторы инкрементации и де- крементации ++ и --. Оператор ++ добавляет 1 к своему операнду, а оператор -- вычитает ее. х = х + 1; ++x; Операторы инкрементации и декрементации имеют две формы: префиксную (++x) и постфиксную (x++). Однако между ними суще- ствует важное отличие, когда они используются внутри выражений. Если используется префиксная форма, операторы инкрементации и декрементации возвращают значению операнда после изменения, а если постфиксная – до. Пример 1.5. int x=10; y=++x; // y=11; y=x++; // y=10 Операторы сравнения и логические операторы В термине оператор сравнения слово «сравнение» относится к зна- чениям операндов. В термине логический оператор слово «логиче- ский» относится к способу, которым устанавливаются эти отноше- ния. Поскольку операторы сравнения и логические операторы тесно связаны друг с другом, рассмотрим их вместе. В основе и операторов сравнения, и логических операторов лежат понятия «истина» и «ложь». В языке С++ истинным считается любое значение, не равное нулю. Ложное значение всегда равно 0. Выраже- ния, использующие операторы сравнения и логические операторы, возвращают 0, если результат ложен, и 1, если результат истинен. 12 Операторы сравнения и логические операторы приведены в табл. 1.4. Таблица 1.4 Оператор Обозначения в математике Действие Операторы сравнения > > Больше >= ≥ Больше или равно < < Меньше <= ≤ Меньше или равно == = Равно != ≠ Не равно Логические операторы &&  И ||  ИЛИ ! ¬ НЕ Оператор присваивания Оператор присваивания (=) не обязан стоять в отдельной строке и может входить в более крупные выражения. Составные операторы присваивания объединяют логические и арифметические операторы с оператором присваивания (табл. 1.5, 1.6). Таблица 1.5 Арифметические + присваивание += x+=y // x=x+y –= x–=y // x=x–y *= x*=y // x=x*y /= x/=y // x=x/y %= x%=y // x=x%y 13 Таблица 1.6 Побитовые + присваивание <<= x<<=y // x=x<>= x>>=y // x=x>>y &= x &=y // x=x&y ^= x^=y // x=x^y |= x|=y // x=x|y Математические функции В С++ определены в заголовочном файле функции, выполняющие некоторые часто используемые математические за- дачи. Например, нахождение корня, возведение в степень, sin(), cos() и многие другие. В табл. 1.7 показаны основные математиче- ские функции, прототипы которых содержатся в заголовочном фай- ле . Пример 1.6. Найти синус и косинус А. #include // библиотека ввода-вывода #include // математическая библиотека using namespace std; int main() { double a, b, c; // переменные типа double cout << «Input A=»; cin>>a; //ввод а b=cos(a); //присваивание значений c=sin(a); // cout << “Cos A=” <=x ceil(x) Наибольшее целое, которое <=x floor(x) Графический способ представления алгоритмов К графическому способу относят блок-схемы, представленные в табл. 1.8. 15 Таблица 1.8 Блоки для схемы Обозначения блоков Начало и конец алгоритма (для функций «Вход», «Выход») Блок обработки. Внутри блока записывают- ся формулы, обозначения и функции Блок условия. Внутри блока записываются условия выбора направления действия алго- ритма Блок предопределенного процесса (функция/ подпрограмма) Блок ввода информации Блок цикла с известным количеством повторений Соединительный блок Алгоритмы бывают линейные, разветвляющиеся и циклические. Линейный алгоритм не содержит логических условий, имеет од- ну ветвь обработки и изображается линейной последовательностью связанных друг с другом блоков. Условное изображение линейного алгоритма представлено на рис. 1.1. 16 Рис. 1.1. Условное изображение линейного алгоритма Пример 1.7. Составить блок-схему вычисления φ( ),z x y = f(x), где φ, f – известные функции, при заданном значении переменной x (рис. 1.2). Рис. 1.2. Блок-схема вычислений z = (х), y = f(x) х y = f(х) z = (х) z Начало Конец 17 Пример 1.8. Составить блок-схему нахождения корней квадрат- ного уравнения. Коэффициенты квадратного уравнения ввести с кла- виатуры (рис. 1.3). Рис. 1.3. Блок-схема нахождения корней квадратного уравнения 18 Циклический алгоритм содержит один или несколько циклов. Цикл – это многократно повторяемая часть алгоритма. Цикл, не содержащий внутри себя других циклов, называют про- стым. Если он содержит внутри себя другие циклы или разветвле- ния, то цикл называют сложным или вложенным. Любой цикл ха- рактеризуется одной или несколькими переменными, называемыми параметрами цикла, от анализа значений которых зависит выполне- ние цикла. Параметр цикла – переменная, принимающая при каждом вхож- дении в цикл новое значение. Условное изображение циклического алгоритма представлено на рис. 1.4. Рис. 1.4. Блок-схема циклического алгоритма Пример 1.9. Составить блок-схему нахождения суммы N первых целых чисел от 0 до N – 1 (рис. 1.5). Исходные файлы представляют собой текстовые файлы с расши- рением .срр. Исполняемые файлы имеют расширение .ехе и могут запускаться как из компилятора, так и непосредственно в режиме MS DOS. Программы, исполняемые с помощью компилятора Microsoft или из MS DOS, не требуют никакого дополнительного редактирования. 19 Рис. 1.5. Блок-схема для примера 1.9 Первая программа Структура программы Рассмотрим первый, самый простой, пример программы на С++ под названием FIRST. Соответствующий файл исходного кода на- зывается FIRST.СРР. Программа выводит сообщение на экран. 20 Пример 1.10. #include using namespace std; int main() { cout «"моя первая программа\n"; return 0; } Несмотря на свой небольшой размер, этот пример демонстриру- ет типичную структуру программы на С++. Рассмотрим эту струк- туру в деталях. Тело функции Тело функции заключено в фигурные скобки, которые играют ту же роль, что и ключевые слова BEGIN и END, встречающиеся в не- которых других языках программирования: они определяют грани- цы блока операторов программы. Фигурные скобки, обрамляющие тело функции, обязательны. В нашем примере тело функции состо- ит всего лишь из двух операторов: один из них начинается словом cout, другой – return. Разумеется, функция может включать в себя и большее число операторов. Функция main() Когда программа на языке С++ запускается на выполнение, пер- вым исполняемым оператором становится первый оператор функ- ции main() (по крайней мере, это справедливо для консольных про- грамм). Программа может состоять из множества функций, классов и прочих элементов, но при ее запуске управление всегда передает- ся функции main(). Если в программе не содержится функции с име- нем main(), то при попытке запустить такую программу будет выве- дено сообщение об ошибке. В большинстве программ, написанных на С++, реальные дейст- вия сводятся к вызову функцией main() методов различных объек- тов. Кроме того, функция main() может вызывать другие, независи- мые функции. 21 Заголовочные файлы IOSTREAM является примером заголовочного (или включаемо- го) файла. Файл IOSTREAM содержит описания, необходимые для работы с переменной cout и операцией «. Без них компилятору не будет известно, что значит имя cout, а употребление операции « бу- дет воспринято как некорректное. Директива using Директива using namespace std; означает, что все определенные ниже имена в программе будут относиться к пространству имен с именем std. Различные элементы программы описаны с использо- ванием пространства имен std, например переменная cout. Если не использовать директиву using, то к этим элементам программы при- дется каждый раз добавлять имя std: std::cout « "У каждой эпохи свой язык\n"; Для того чтобы не дописывать std:: каждый раз перед именем переменной, используется директива using. Комментарии Комментарии являются важной частью любой программы. Они по- могают разобраться в действиях программы как разработчику, так и любому другому человеку, читающему код. Компилятор игнори- рует все, что помечено в программе как комментарий, поэтому ком- ментарии не включаются в содержимое исполняемого файла и ни- как не влияют на ход исполнения программы. Функция стандартного вывода printf() Функция printf() – функция форматированного вывода. Это озна- чает, что в параметрах функции необходимо указать формат дан- ных, которые будут выводиться. Он указывается спецификатором формата, начинающегося с символа %, за которым следует код фор- мата (табл. 1.9). 22 Таблица 1.9 Спецификаторы формата Обозначения %с Символ %d Целое десятичное число %i Целое десятичное число %e Десятичное число в виде x.xx e+xx %E Десятичное число в виде x.xx E+xx %f Десятичное число с плавающей запятой xx.xxxx %F Десятичное число с плавающей запятой xx.xxxx %g %f или %e, что короче %G %F или %E, что короче %o Восьмеричное число %s Строка символов %u Беззнаковое десятичное число %x Шестнадцатеричное число %X Шестнадцатеричное число %% Символ % %p Указатель %n Указатель В спецификаторе формата после символа % может быть указана точность (число цифр после запятой). Точность задается следую- щим образом: %.n<код формата>. Где n – число цифр после запя- той, а <код формата> – один из кодов, приведенных выше. Например, если у нас есть переменная x=10.3563 типа float и хо- тим вывести ее значение с точностью до трех цифр после запятой, то необходимо написать: printf("Переменная x = %.3f",x); Результат: Переменная x=10.356 Также можно указать минимальную ширину поля, отводимого для печати. Если строка или число больше указанной ширины поля, то строка или число печатается полностью. 23 Например, если написать: printf("%5d", 20); то результат будет следующим: 20 Обратите внимание на то, что число 20 напечаталось не с самого начала строки. Если вы хотите, чтобы неиспользованные места поля заполнялись нулями, то нужно поставить перед шириной поля сим- вол 0. printf("%05d", 20); Результат: 00020 Кроме спецификаторов формата данных в управляющей строке могут находиться управляющие символы (табл. 1.10). Таблица 1.10 Спецификаторы формата Обозначения \f Новая страница, перевод страницы \n Новая строка, перевод строки \r Возврат каретки \t Горизонтальная табуляция \v Вертикальная табуляция \" Двойная кавычка \' Апостроф \\ Обратная косая черта \0 Нулевой символ, нулевой байт \a Сигнал \N Восьмеричная константа \xN Шестнадцатеричная константа \? Знак вопроса Чаще всего используется символ \n. С помощью этого управляю- щего символа можно переходить на новую строку. 24 Пример 1.11. #include void main(void) { int a, b, c; // Объявление переменных a, b, c a=5; b=6; c=9; printf("a=%d, b=%d, c=%d", a, b, c); } Результат работы программы: a=5, b=6, c=9 Пример 1.12. #include void main(void) { float x, y, z; x=10.5; y=130.67; z=54; printf("Координаты объекта: x:%.2f, y:%.2f, z:%.2f", x, y, z); } Результат работы программы: Координаты объекта: x:10.50, y:130.67, z:54.00 Пример 1.13. #include void main() { int x; x=5; printf("x=%d", x*2); } 25 Результат работы программы: x=10 Пример 1.14. #include void main(void) { printf("\"Текст в кавычках\""); printf("\nСодержание кислорода: 100%%"); } Результат работы программы: "Текст в кавычках" Содержание кислорода: 100% Пример 1.15. #include void main(void) { char ch1, ch2, ch3; ch1='A'; ch2='B'; ch3='C'; printf("%c%c%c", ch1, ch2, ch3); } Результат работы программы: ABC Пример 1.16. #include void main(void) { char *str="Моя строка."; printf("Это %s", str); } 26 Результат работы программы: Моя строка. Пример 1.17. #include void main(void) { printf("Здравствуйте!\n"); // После печати будет переход на новую строку – \n printf("Меня зовут Павел."); // Это будет напечатано на новой строке } Результат работы программы: Здравствуйте! Меня зовут Павел. Функция стандартного ввода scanf() Функция scanf() – функция форматированного ввода. С ее помо- щью можно вводить данные со стандартного устройства ввода (кла- виатуры). Вводимыми данными могут быть целые числа, числа с пла- вающей запятой, символы, строки и указатели. Управляющая строка содержит три вида символов: специфика- торы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа % (табл. 1.11). Таблица 1.11 Спецификаторы формата Обозначения %c Чтение символа %d Чтение десятичного целого %i Чтение десятичного целого %e Чтение числа типа float (плавающая запятая) %h Чтение short int %o Чтение восьмеричного числа %s Чтение строки 27 Окончание табл. 1.11 Спецификаторы формата Обозначения %x Чтение шестнадцатеричного числа %p Чтение указателя %n Чтение указателя в увеличенном формате При вводе строки с помощью функции scanf() (спецификатор фор- мата %s), строка вводится до первого пробела! char str[80]; // массив на 80 символов scanf("%s", str); То есть если вводить строку «Привет мир!» с использованием функции scanf(), то после ввода результирующая строка, которая бу- дет храниться в массиве str будет состоять из одного слова «Привет». Для ввода данных с помощью функции scanf() в качестве парамет- ров ей нужно передавать адреса переменных, а не сами переменные. Чтобы получить адрес переменной, нужно поставить перед именем переменной знак & (амперсанд), который означает взятие адреса. Адрес, который получаем с помощью & – это адрес в памяти компьютера, где храниться значение переменной. Давайте рассмотрим пример программы, который показывает нам как использовать &. Пример 1.18. #include void main(void) { int x; printf("Введите переменную x:"); scanf("%d", &x); printf("Переменная x=%d", x); } 28 Пример 1.19. scanf("%d%*c%d", &i, &j); При вводе 50 + 20 присвоит переменной i значение 50, перемен- ной j – значение 20, а символ + будет прочитан и проигнорирован. В команде формата может быть указана наибольшая ширина по- ля, которая подлежит считыванию. scanf("%5s", str); Указывает необходимость прочитать из потока ввода первые пять символов. При вводе 1234567890ABC массив str будет содер- жать только 12345, остальные символы будут проигнорированы. Разделители: пробел, символ табуляции и символ новой строки – при вводе символа воспринимаются, как и все другие символы. Одной из особенностей функции scanf() является возможность за- дания множества поиска (scanset). Оно определяет набор символов, с которыми будут сравниваться читаемые функцией scanf() символы. Функция scanf() читает символы до тех пор, пока они встречаются в множестве поиска. Как только символ, который введен, не встре- тился в множестве поиска, функция scanf() переходит к следующему спецификатору формата. Множество поиска определяется списком символов, заключенных в квадратные скобки. Перед открывающей скобкой ставиться знак %. Давайте рассмотрим это на примере. Пример 1.20. #include void main(void) { char str1[10], str2[10]; scanf("%[0123456789]%s", str1, str2); printf("\n%s\n%s", str1, str2); } Введем набор символов: 12345abcdefg456 29 На экране программа выдаст: 12345 abcdefg456 При задании множества поиска можно также использовать сим- вол «дефис» для задания промежутков, а также максимальную ши- рину поля ввода. scanf("%10[A–Z1–5]", str1); Можно также определить символы, которые не входят в множе- ство поиска. Перед первым из этих символов ставиться знак ^. Мно- жество символов различает строчные и прописные буквы. При использовании функции scanf() в качестве параметров ей нужно передавать адреса переменных. Выше был написан код: char str[80]; // массив на 80 символов scanf("%s", str); Обратите внимание на то, что перед str не стоит символ &. Это сде- лано потому, что str является массивом, а имя массива – str является указателем на первый элемент массива. Поэтому знак & не ставится. Пример 1.21. Эта программа выводит на экран запрос «Сколько вам лет?:» и ждет ввода данных. Если, например, ввести число 20, то програм- ма выведет строку «Вам 20 лет.» При вызове функции scanf() перед переменной age поставили знак &, так как функции scanf() нужны адреса переменных. Функция scanf() запишет введенное значение по указанному адресу. В нашем случае введенное значение 20 будет записано по адресу переменной age. #include void main(void) { int age; printf("\nСколько вам лет?:"); 30 scanf("%d", &age); printf("Вам %d лет.", age); } Пример 1.22. Программа калькулятор. Этот калькулятор может только скла- дывать числа. При вводе 100 + 34 программа выдаст результат: 100 + 34 = 134. #include void main(void) { int x, y; printf("\nКалькулятор:"); scanf("%d+%d", &x, &y); printf("\n%d+%d=%d", x, y, x+y); } Пример 1.23. Этот пример показывает, как установить ширину поля считыва- ния. В нашем случае ширина поля равна пяти символам. Если вве- сти строку с большим количеством символов, то все символы после пятого будут отброшены. Обратите внимание на вызов функции scanf(). Знак & не стоит перед именем массива name, так как имя массива name является адресом первого элемента массива. #include void main(void) { char name[5]; printf("\nВведите ваш логин (не более 5 символов):"); scanf("%5s", name); printf("\nВы ввели %s", name); } 31 Пример 1.24. Последний пример в этой статье показывает, как можно исполь- зовать множество поиска. После запуска программы введите число от 2 до 5. #include void main(void) { char bal; printf("Ваша оценка 2, 3, 4, 5:"); scanf("%[2345]", &bal); printf("\nОценка %c", bal); } Пример 1.25. Вычислить 2 31 1 * (1 ) 1 * 2 3          y y y x y xx eh y x x y tgz , при x = 2,444, y = 0,00869, z = –130, дожно быть получено –0,49871. Текст программы может иметь нижепредставленный вид: #include #include #include #define x 2.444 #define y 0.00869 #define z –130.0 void main(void) { double rezult, dop, a, b, c; clrscr( ); /* ОЧИСТКА ЭКРАНА */ dop=fabs(y–x); a=pow(x, y+1)+exp(y–1); b=1+x*fabs(y–tan(z)); 32 c=0.5*pow(dop, 2)–pow(dop, 3)/3; rezult=a/b*(1+dop)+c; printf("\a\n ОТВЕТ: rezult=%lf, Press any key...", rezult); getch( ); /* ЗАДЕРЖКА ДО НАЖАТИЯ ЛЮБОЙ КЛАВИШИ */ } Варианты заданий Номер варианта Выражение Исходные данные 1   ln( ) sin( )   x x ya y x e x, y 2 2( ) (cos( ) )    b c y x x c y c, x, y 3 3arctg( ) 0,5 5 ( ) xy b x y c x e x y     b, x, y 4 tg( ) ln( ) arctg( )    x ye zd x y x x, y, z 5 3 2(cos( ) sin( )) ln ( ) tg( )  x ye xyz z x, y, z 6 3 2 2 sin ( ) ( )       x y z yf y x e y z y x x, y, z 7 3 2 2 1 cos( ) arcsin( ) 2 (1 )    x x yg x y e y x y x, y 8 32 4 (ln( ) 1) 22 2 2 3     yx z xh x, y, z 9   3 21 sin ( ) 5       y x j y z x, y, z 10 2ln ( ( )4     yk y x x z x x, y, z 33 Номер варианта Выражение Исходные данные 11 2 0,10,5 3cos( )     yzl x x y e xy x, y, z 12 3tg( ) 1 (lg( ) cos( ) )     xm e x y xy x x, y 13 2 3 lg( ) 2 ln( )     x yx ep y x y x, y 14 2 3 lg( ) 2 ln( )     x yx ep y x y x, y 15 4 2 2 212 3 4 5 6 lg ( )     q x x x x z x, z 16 2 2sin 1   a ax zn e n, x, z 17 2 2 2cos ln   b q t x b x b, z, x 18 2 3 3 3 2 3 sin ( )   t z aq t e z, a, t Контрольные вопросы 1. Как описываются константы и переменные? 2. Назвать стандартные типы данных. 3. Описать процедуру стандартного ввода-вывода. 4. Назвать составные части программы на языке С++. 5. Изобразить схематически блок-схему линейного алгоритма. 34 Лабораторная работа № 2 ВЫЧИСЛЕНИЕ ПО УСЛОВИЮ Цель: – изучить оператор if при решении задач на языке С++; – представить алгоритм решения задачи в виде блок-схемы с ис- пользованием структуры ветвления. Теоретические сведения Условный оператор if Оператор if является наиболее простым из операторов ветвлений. Общий вид записи: if <условие> <оператор>; Следующая программа (IFDEMО) иллюстрирует применение опе- ратора if. // ifdemo.cpp // применение оператора if #include using namespace std; int main () { int x; cout « "Введите число:"; cin » x; if (x>100 ) cout « "Это число больше, чем 100\n "; return 0; } За ключевым словом if следует условие ветвления, заключенное в круглые скобки. 35 Результат: Введите число: 200 Это число больше, чем 100 Если вводимое число окажется не превосходящим 100, то про- грамма завершится, не напечатав вторую строку. Графическая интерпретация оператора В блок-схемах короткому условному оператору соответствует структура ЕСЛИ–ТО (рис. 2.1). Рис. 2.1. Блок-схема для оператора ЕСЛИ–ТО Отметим, что данная структура имеет один вход и один выход. Словесная формулировка: «Если условие истинно, то выполнять Действие 1». Несколько операторов в теле if Как и для циклов, тело ветвления if может состоять как из одно- го оператора, что было продемонстрировано в программе IFDEMО, условие Действие 1 да нет 36 так и из нескольких операторов, заключенных в фигурные скобки. Пример, иллюстрирующий использование блока операторов в теле if, называется IF2 и приводится ниже. Пример 2.1. // if2.срр // использование нескольких операторов в теле цикла if finclude using namespace std; int main() { int x; cout « "Введите число: "; cin » x; if( x>100 ) { cout « "Число " « x; cout « " больше, чем 100\n"; } return 0; } Результат работы программы IF2: Введите число: 12345 Число 12345 больше, чем 100 If внутри циклов Циклы и ветвления можно использовать совместно. Можно по- мещать ветвления внутрь цикла и наоборот, использовать вложенные ветвления и вложенные циклы. В следующем примере под названием PRIME ветвление if находится внутри цикла for. Программа опреде- ляет, является ли вводимое число простым или нет (простым называ- ется число, которое делится только на единицу и на само себя; при- меры простых чисел: 2, 3, 5, 7, 11, 13 и 17). 37 Пример 2.2. // prime.срр // применение цикла if для определения простых чисел #include using namespace std; #include //для exit() int main() { unsigned long n, j; cout « "Введите число:"; cin » n; // ввод проверяемого числа for(j=2; j<=n/2; j++) // деление на целые числа. if (n%j==0)// начиная с 2; если остаток нулевой, то число не простое { cout « "Число не простое: делится на " « j « endl; exit(0); // выход из программы } cout « "Число является простым\n"; return 0; } В этом примере вводим значение, которое присваивается пере- менной n. Затем программа при помощи цикла for делит число n на все числа от 2 до n/2. Делителем является переменная j, служа- щая счетчиком цикла. Если число n разделится без остатка на какое- либо из значений j, то оно не будет простым. Условием того, что одно число делится на другое без остатка, является равенство остат- ка от деления нулю. Поэтому в условии для if участвует операция остатка от деления %. Если число оказывается не простым, то вы- водим соответствующее сообщение и выходим из программы. В этом примере тело цикла не заключено в фигурные скобки. Это объясняется тем, что оператор if и операторы тела ветвления на самом деле являются одним оператором. Чтобы улучшить читае- мость кода, можно добавить фигурные скобки, но это не является обязательным для правильной работы компилятора. 38 Функция exit() Когда программа PRIME получает число, не являющееся прос- тым, она завершается, поскольку нет необходимости несколько раз проверять, является число простым или нет. Библиотечная функция exit() производит немедленный выход из программы независимо от того, в каком месте она находится. Эта функция не возвращает зна- чения. Ее единственный аргумент (в нашем случае 0) возвращается вызывающему окружению после того, как программа завершается. Как правило, возвращаемое значение 0 говорит об успешном завер- шении программы; ненулевые значения сигнализируют об ошибках. Оператор if...else Общий вид записи: if <условие> <оператор 1>; else <оператор 2>; Графическая интерпретация оператора В блок-схемах полному условному оператору соответствует струк- тура ЕСЛИ–ТО–ИНАЧЕ (рис. 2.2). Рис. 2.2. Блок-схема для оператора ЕСЛИ–ТО–ИНАЧЕ условие Действие 1 Действие 2 да нет 39 Отметим, что и данная структура имеет один вход и один выход. Словесная формулировка данной структуры: «Если значение вы- ражения истинно, выполняется <действие 1>, если ложно – <дей- ствие 2>». Замечание. Оператор 1 и оператор 2 входят в конструкцию пол- ного условного оператора как единственные (простые). Если воз- никает необходимость выполнить в ветвях несколько операторов, то их заключают в операторные скобки. Такие операторы называ- ются составными. Запись оператора if c составным оператором имеет нижепредставленный вид. if <условие> { <оператор 1>; …………………………. <оператор n>; } else { <оператор 1>; …………………………. <оператор m>; } Вложенная структура условных операторов Структура называется вложенной, если после if используются вновь условные операторы. Число вложений может быть произволь- ным. При этом справедливо: служебное слово ELSE всегда отно- сится к ближайшему выше слову if. If <условие> If <условие> <оператор>; <оператор>; 40 Условная операция Существует распространенная в программировании ситуация: переменной необходимо присвоить одно значение, в случае выпол- нения некоторого условия, и другое значение, в случае невыполне- ния этого условия. В следующем фрагменте переменной min при- сваивается наименьшее из значений alpha и beta с помощью кон- струкции if...else: if (alpha < beta) min = alpha; else min = beta; Подобные действия на практике оказались настолько распро- страненными, что была специально разработана условная операция, выполняющая эти действия. Она записывается с помощью двух знаков и использует три oпeранда. Является единственной опера- цией в С++, использующей более двух операндов. С помощью условной операции можно записать предыдущий фрагмент следу- ющим образом: min = (alpha < beta) ? alpha : beta; Правая часть оператора представляет собой условное выра- жение: (alpha < beta) ? alpha : beta // условное выражение Знак вопроса ? и двоеточие : обозначают условную операцию. Условие, стоящее перед знаком вопроса (alpha < beta), является ус- ловием проверки. Это условие, вместе с переменными alpha и beta, составляет тройку операндов условной операции. Если значение проверяемого условия истинно, то условное вы- ражение становится равным значению alpha; в противном случае, оно становится равным beta (рис. 2.3). 41 Рис. 2.3. Исполнение условного оператора Операторы перехода В языке С++ существует несколько операторов перехода: break, continue, goto. Оператор break производит выход из цикла. Следующим опера- тором, исполняемым после break, будет являться первый оператор, находящийся вне данного цикла (рис. 2.4). Рис. 2.4. Исполнение оператора break 42 Оператор break производит выход из цикла. Тем не менее, могут возникнуть и такие ситуации, когда необходимо при определенном условии не выходить из цикла, а досрочно возвращаться в его начало. Именно таким эффектом обладает применение оператора continue (строго говоря, continue делает переход на завершающую фигур- ную скобку цикла, откуда производится обычный переход в начало тела цикла). Синтаксис оператора goto следующий: вставить метку перед тем оператором программы, на который намечается сделать переход. После метки всегда ставится двоеточие. Имя метки, перед которой расположено ключевое слово goto, совершит переход на тот опера- тор, который помечен данной меткой. Следующий фрагмент кода иллюстрирует применение goto: goto 1: // операторы 1:// сюда передается управление оператором goto Варианты заданий Номер варианта Выражение Исходные данные 1 2( ) , 0 2( ) , 0 2( ) 1, 0           x y xy xy a x y xy xy x y xy x, y 2 2 3 2 3 2 ln( ) ( ) , 0 ln ( ) , 0 ( ), 0 0, 0            x y x y x y x y x y x y b x y x y x, y 3 2 2 2 2 sin( ), 0 ( ) cos( ), 0 ( ) tg( ), 0              x y x x y c x y x x y y x x x y x, y 43 Номер варианта Выражение Исходные данные 4 3 3 3 ( ) arctg( ), ( ) arctg( ), ( ) 0,5,           x y x x y d y x x y x y x y x x, y 5 , нечетное, 0 , четное, 0 2 , иначе      i a i a ie a i a ia i, a 6 2 , 0,5 10 , 0,1 0,5 2 , иначе       a be ab g a b ab x a, b, x 7 2 arctg( ), arctg( ), ( ) ,        x y x y h x y x y x y x y x, y 8 3 sin(5 3 ), 1 cos(5 3 , ,         k m k k m j k m k k m k k m k, m 9 3 2 3 3 , , 3 ( ) ,         k p k p l k p k p k p k p k, p 10 ln( ), 10 , 10 , 10        f q f q fq k e fq f q fq f, q 44 Номер варианта Выражение Исходные данные 11 3 3 ln 2 , sin 2 , arctg5 , cos lg            x ax b x a b x y a x b a b x x a b x b x ax a, b, x 12 2 2 3 ln lg , 2 0 tg( ) , 2 0 arctg(2 0,5) , 2 0                  ax bx e a b a b y ax b b x a b x a bx a b a, b, x 13 3 2 2 2 3 1,4 2 2 5 2 2 cos(4 0,2), 10 ln(2 4) sin( ) , 10 tg4 , 10 sin0,5                  x x ax e b x a b x x y b x a e a b x x x a b x x a, b, x 14 2 3 10 3 3 sin cos , 65 1 ln , 65 ( ) cos(3 0,5) , 65 lg sin( )                    a bxa x x e bx a y ax b x bx a x b x bx a x a a b a, b, x 15 29 2 2 2 2 2 2 3 2 2 2 ln , sin 74arctg6 , sin 2,3 tg , sin               xx e x a b ax b axy x x a b b x x ax b x x a b a, b, x 45 Номер варианта Выражение Исходные данные 16 3 2 3 3 3 2 3 sin ln , при , при cos lg , при bz x z z ax y e x z ax z b x z ax        x, z, a, b 17 3 35 2 3 5 3 sin , при sin , при sin ln cos , при sin az q x z z q b a q e z q a z z q         q, x, z, a 18 3 25 2 3 5 cos , при ln lg( ) , при ln tg , при lnxz a y y b c x w y y b y e y b         а, y, x, z, b Контрольные вопросы 1. Формат записи оператора if. 2. Формат записи с вложенным оператором if. 3. Как работает оператор if? 4. В чем отличие короткой и полной формы записи оператора if? 5. Изобразить схематически блок-схему разветвляющего алго- ритма. 46 Лабораторная работа № 3 ОПЕРАТОР SWITCH Цель: – изучить оператор switch при решении задач на языке C++; – представить алгоритм решения задачи в виде блок-схемы с ис- пользованием структуры ветвления. Теоретические сведения В языке C++ предусмотрен оператор многовариантного ветвления switch, который последовательно сравнивает значение выражения со списком целых чисел или символьных констант. Если обнаруживается совпадение, выполняется оператор, связанный с соответствующей константой. Оператор switch имеет нижепредставленный вид. switch (выражение) { case константа 1: последовательность операторов break; case константа 2: последовательность операторов break; case константа3: последовательность операторов break; … default: последовательность операторов } Значением выражения должен быть символ или целое число. Например, выражения, результатом которых является число с пла- вающей точкой, не допускаются. Значение выражения последова- тельно сравнивается с константами, указанными в операторах case. Если обнаруживается совпадение, выполняется последовательность 47 операторов, связанных с данным оператором case, пока не встретит- ся оператор break или не будет достигнут конец оператора switch. Если значение выражения не совпадает ни с одной из констант, вы- полняется оператор default. Этот раздел оператора switch является необязательным. Если он не предусмотрен, в отсутствие совпадений не будет выполнен ни один оператор. На практике количество раз- делов case в операторе switch следует ограничивать, поскольку оно влияет на эффективность программы. Оператор case используется только внутри switch. Оператор break относится к группе операторов перехода. Его мож- но использовать как в операторе switch, так и в циклах. Когда поток управления достигает оператора break, программа выполняет пере- ход к оператору, следующему за оператором switch. Следует знать три важных свойства оператора switch. 1. Оператор switch отличается от оператора if тем, что значение его выражения сравнивается исключительно с константами, в то вре- мя как в операторе if можно выполнять какие угодно сравнения или вычислять любые логические выражения. 2. Две константы в разных разделах case не могут иметь одина- ковых значений, за исключением случая, когда один оператор switch вложен в другой. 3. Если в операторе switch используются символьные константы, они автоматически преобразовываются в целочисленные. Оператор switch часто используется для обработки команд, вве- денных с клавиатуры, например, при выборе пунктов меню. С формальной точки зрения наличие оператора break внутри опе- ратора switch не обязательно. Этот оператор прерывает выполнение последовательности операторов, связанных с соответствующей кон- стантой. Если его пропустить, будут выполнены все последующие операторы case, пока не встретится следующий оператор break либо не будет достигнут конец оператора switch. Графическая интерпретация оператора Switch В блок-схемах оператору switch соответствует структура ВЫБОР (рис. 3.1, 3.2). 48 Рис. 3.1. Исполнение конструкции switch Рис. 3.2. Пример конструкции switch 49 Варианты заданий Номер варианта Выражение Исходные данные 1 2 2 2 ( ) , 1 ( ) , 12 ( ) 1, 100 x y xy k a x y xy k x y k           x, y, k 2 2 3 2 3 2 ln( ) ( ) , 1..5 ln ( ) , 6..8 ( ), 9..12 0, иначе x y x y a x y x y a b x y a           x, y, a 3 2 2 2 2 sin( ), 10, 12, 23 ( ) cos( ), 14, 18, 24 ( ) tg( ), 100, 120, 235 x y x b c x y x b y x x b           x, y, b 4 3 3 3 ( ) arctg( ), 1..10 ( ) arctg( ), 12..34 ( ) 0,5, иначе x y x z d y x x z y x          x, y, z 5 , 1,2,3 , 5,6,7 2 , иначе i a l ie a l ia    i, a, l 6 2 , 1 , 12 2 , иначе a be s g a b s x     a, b, x, s 50 Номер варианта Выражение Исходные данные 7 2 arctg( ), 1 arctg( ), 12, 23, 56 ( ) , иначе x y n h x y n x y       x, y, n 8 3 sin(5 3 ), 5..10 cos(5 3 , 11..20 , иначе k m k a j k m k a k      k, m, a 9 3 2 3 3 , 12 , 34 ( ) , 89 k p b l k p b k p b        k, p, b 10 ln( ), 1..23 , 34..89 , 90..123 f q f q h k e h f q h        f, q, h 11 3 3 ln 2 , 12..15 sin 2 , 46..50 arctg5 , иначе cos lg x ax b x m y a x b m x b x ax        a, b, x, m 12 2 2 3 ln lg , 123..126 tg( ) , 236..238 arctg(2 0,5) , 1000 ax bx e a b t y ax b b x t x a bx t               a, b, x, t 51 Номер варианта Выражение Исходные данные 13 3 2 3 1,4 5 cos(4 0,2), 1 ln(2 4) sin( ) , 56 tg4 , 123 sin 0,5 x x ax e b x z x y b x a e z x x z x               a, b, x, z 14 2 3 10 1 3 3 sin cos , 12, 45, 78 1 ln , 456 ( ) cos(3 0,5) , иначе lg sin( ) a bxa x x e y z ax b x y x b x x a a b                a, b, x, y 15 3 2 3 2 sin ln , 12..34 , 35..40 cos lg , иначе bz x z а d e x a z b x       x, z, a, b 16 29 2 2 3 2 ln , 34..40 7arctg6 , 57..60 2,3 tg , иначе xx e s ax b axy x s b x x ax b x           a, b, x, s 52 Номер варианта Выражение Исходные данные 17 3 35 5 3 sin , 2..5 , 6..9 ln cos , иначе az q x z b d a q e b a z        q, x, z, a, b 18 3 25 2 3 5 cos , 1 lg( ) , 12, 45, 89 tg , иначеxz a y d l x z y d y e        а, y, x, z, d Контрольные вопросы 1. Формат записи оператора switch. 2. Как работает оператор switch? 2. В чем отличие оператора switch от if? 3. Типы селектора. 53 Лабораторная работа № 4 ЦИКЛИЧЕСКИЕ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ Цель работы: изучить виды операторов цикла при решении за- дач на языке С++. Теоретические сведения В языке C++, как и во всех других современных языках програм- мирования, операторы цикла предназначены для выполнения повто- ряющихся инструкций пока действует определенное правило. Это ус- ловие может быть как задано заранее (в цикле for), так и меняться во время выполнения цикла (в операторах while и do-while). Цикл for В том или ином виде цикл for есть во всех процедурных языках программирования. Однако в языке C++ он обеспечивает особенно высокую гибкость и эффективность. Общий вид оператора for таков: for (инициализация; условие; приращение) тело Цикл for имеет много вариантов. Однако наиболее общая форма этого оператора работает следующим образом. Сначала выполня- ется инициализация – оператор присваивания, который задает на- чальное значение счетчика цикла. Перед каждым шагом проверяет- ся условие, представляющее собой условное выражение. Цикл вы- полняется до тех пор, пока значение этого выражения остается ис- тинным. Приращение изменяет значение счетчика цикла при оче- редном его выполнении. Эти разделы оператора отделяются друг от друга точкой с запятой. Как только условие цикла станет ложным, программа прекратит его выполнение и перейдет к следующему оператору. В следующем примере цикл for выводит на экран числа от 1 до 100. 54 Пример 4.1. #include void main() { int x; // определение счетчика цикла for (x=1; x<=100; x++) // счетчик меняется от 1 до 100 printf("%d", x); // значение х выводится на экран } Сначала переменной х присваивается число 1, а затем она срав- нивается с числом 100. Поскольку ее значение меньше либо равно 100, вызывается функция printf(). Затем переменная х увеличивается на единицу, и условие цикла проверяется вновь. Как только ее зна- чение превысит число 100, выполнение цикла прекратится. В дан- ном случае переменная х является счетчиком цикла, который изме- няется и проверяется на каждой итерации. Рассмотрим пример цикла for, тело которого состоит из несколь- ких операторов. Пример 4.2. for (x=100; х!=65; х–=5) { z=х*х; printf("Квадрат числа %d равен %f\n", x, z); } Возведение числа х в квадрат и вызов функции printf() выполня- ются до тех пор, пока значение переменной х не станет равным 65. Обратите внимание на то, что в этом цикле счетчик уменьшается: сначала ему присваивается число 100, а затем на каждой итерации из него вычитается число 5. В цикле for проверка условия выполняется перед каждой итера- цией. Иными словами, если условие цикла с самого начала является ложным, его тело не будет выполнено ни разу. Рассмотрим пример. 55 Пример 4.3. х=10; for (y=10; y!=х; ++y) { printf("%d", y); } printf("%d", y); /*Это единственный вызов функции printf(), который выполняется в данном фрагменте */ Этот цикл никогда не будет выполнен, поскольку значения пе- ременных х и у при входе в цикл равны. Следовательно, условие цикла является ложным, и ни тело цикла, ни приращение счетчика выполняться не будут. Таким образом, значение переменной у оста- нется равным 10, и именно оно будет выведено на экран. Пример 4.4. Табуляции функции sin(x) на интервале [0; 1]. #include #include const int N=10; void main() { double a=0, b=1, h=(b–a)/N, x; int i; printf(" X Y\n"); for (i=0; i<=N; i++) { x=a+i*h; printf("%4.2f%9.5f\n", x, sin(x)); } } Варианты цикла for Оператор for имеет несколько вариантов, повышающих его гиб- кость и эффективность. Наиболее распространенным является вариант, в котором исполь- зуется оператор последовательного выполнения («запятая»), что 56 позволяет применять несколько счетчиков цикла одновременно. Напомним, что оператор последовательного выполнения связывает между собой несколько операторов, вынуждая их выполняться друг за другом. Например, переменные х и у являются счетчиками при- веденного ниже цикла. Их инициализация выполняется в одном и том же разделе цикла. Пример 4.5. for(x=0, y=0; х+у<10; ++х) { y=getchar(); y= y–'0'; /* Вычесть из переменной y ASCII-код нуля */ } Как видим, два оператора инициализации разделены запятой. При каждой итерации значение переменной х увеличивается на еди- ницу, а переменная у вводится с клавиатуры. Несмотря на это, пе- ременная у должна иметь какое-то начальное значение, иначе перед первой итерацией цикла условие может оказаться ложным. Условное выражение не обязательно связано с проверкой счет- чика цикла. В качестве условия цикла может использоваться любой допустимый оператор сравнения или логический оператор. Это поз- воляет задавать несколько условий цикла одновременно. Рассмотрим программу, которая ждет от пользователя нажатия клавиши . Пользователю дается пять попыток. Пример 4.6. #include void main() { char c; int num; printf("Нажмите клавишу Esc\n"); for (num=1, c=0; num<= 5 && c !=27; num++) { printf("\tпопытка %d: ", num); 57 c=getch(); printf("\n"); } if (c==27) printf("Вы нажали Esc с %d попытки!\n",--num); else printf("Вы так и не нажали Esc!\n"); } Каждый из трех разделов цикла for может состоять из любых до- пустимых выражений. Эти выражения могут быть никак не связаны с предназначением разделов. Учитывая вышесказанное, рассмотрим пример. Пример 4.7. #include void main() { int t, S=0; for (printf("Введите число: "); scanf("%d",&t), t; printf("\t еще: ")) S+=t; printf("Сумма чисел равна %d\n", S); } Обратите внимание на цикл for в функции. В разделе инициали- зации выводится сообщение, предлагающее пользователю ввести число. В разделе условия программа ждет ввод числа и возвращает это число. Таким образом, условием завершения цикла будет ввод числа 0, которое интерпретируется компилятором как ложь. В раз- деле приращения счетчика выводится приглашение к вводу следу- ющего числа. В теле цикла вычисляется сумма введенных чисел. Другая интересная особенность цикла for заключается в том, что его разделы можно пропускать. Каждый из его разделов является необязательным. Например, цикл, приведенный ниже, выполняется до тех пор, пока пользователь не введет число 123. fоr (х=0; х!=123;) scanf("%d", &х); 58 Обратите внимание на то, что раздел приращения счетчика в дан- ном цикле for отсутствует. Это значит, что при каждой итерации значение переменной х сравнивается с числом 123 и никакие дейст- вия с ней больше не выполняются. Однако, если пользователь вве- дет с клавиатуры число 123, условие цикла станет ложным, и про- грамма прекратит его выполнение. Счетчик можно инициализировать вне цикла for. Этим способом пользуются, когда начальное значение счетчика является результа- том сложных вычислений, как в примере. Пример 4.8. ch=getch (); /* Считать символ */ if (ch>='0' && ch<='9') x=ch–'0'; else х=10; for (; x<10;) { printf ("%d", x); ++х; } Здесь раздел инициализации оставлен пустым, а переменная х инициализируется до входа в цикл. Бесконечный цикл Хотя в качестве бесконечного можно использовать любой цикл, традиционно для этой цели применяется оператор for. Поскольку все разделы оператора for являются необязательными, его легко сделать бесконечным, не задав никакого условного выражения. for( ; ; ) printf ("Этот цикл выполняется бесконечно.\n"); Если условное выражение не указано, оно считается истинным. Разумеется, в этом случае можно по-прежнему выполнять инициа- лизацию и приращение счетчика, однако программисты на языке C++ в качестве бесконечного цикла чаще всего используют конст- рукцию for ( ; ; ). 59 На самом деле конструкция for( ; ; ) не гарантирует бесконечное выполнение цикла, поскольку его тело может содержать оператор break, приводящий к немедленному выходу. В этом случае про- грамма передаст управление следующему оператору, находящемуся за пределами тела цикла for, как показано ниже. Пример 4.9. #include #include void main() { double a=6, b=3; char ch; int sign; for ( ; ; ) { printf("Введите операцию (+ - * /): "); ch=getch(); sign=ch=='+' || ch=='-' || ch=='*' || ch=='/'; if (ch==27) break; if (sign) { printf("%f %c %f = ", a, ch, b); switch (ch) { case '+' : printf("%f", a+b); break; case '-' : printf("%f", a–b); break; case '*' : printf("%f", a*b); break; case '/' : printf("%f", a/b); break; } } printf("\n"); } Цикл while В языке C++ существует два вида цикла while: – цикл while c предусловием; – цикл while с постусловием. 60 Цикл while с предусловием Цикл while с предусловием позволяет выполнить одну и ту же последовательность действий пока проверяемое условие истинно. При этом условие записывается до тела цикла и проверяется до вы- полнения тела цикла. При выполнении цикла while сначала проверяется условие. Если оно ложно, то цикл не выполняется и управление передается на сле- дующую инструкцию после тела цикла while. Если условие истин- но, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, ра- бота цикла завершится и управление передастся следующей инст- рукции после цикла. Синтаксис цикла while c предусловием. while (условие) { блок инструкций } Пример 4.10. Следующий фрагмент программы напечатает на эк- ран квадраты всех целых чисел от 1 до 10: int i=1; while (i<=10) { cout< #include const int N=10; void main() { double a=0, b=1, h=(b–a)/N, x; int i = 0; printf(" X Y\n"); while (i<=N) { x=a+i*h; printf("%4.2f%9.5f\n", x, sin(x)); i++; } } Варианты заданий 1. Составить таблицу значений функции при хн < х < хк с шагом h вещественного типа. 2. Выполнить задания двумя способами: – с использованием оператора for; – с использованием оператора while. Номер варианта Выражение Исходные данные 1   ln( ) sin( )x x ya y x e   хн < х < хк, у = const 2 2( )(cos( ) )b c y x x c y    хн < х < хк, у, с = const 3 3arctg( ) 0,5 5 ( ) xy b x y c x e x y     хн < х < хк, у, b = const 63 Номер варианта Выражение Исходные данные 4 tg( ) ln( ) arctg( ) x ye zd x y x    хн < х < хк, у, z = const 5 3 2(cos( ) sin( )) ln ( ) tg( ) x ye xyz z   хн < х < хк, у, z = const 6 3 2 2 sin ( ) ( ) x y z yf y x e y z y x       хн < х < хк, у, z = const 7 3 2 2 1 cos( ) arcsin( ) 2 (1 )x x yg x y e y x y     хн < х < хк, у = const 8 32 4 (ln( ) 1) 22 2 2 3 yx z xh     хн < х < хк, у, z = const 9   3 21 sin ( ) 5 y x j y z       хн < х < хк, у, z = const 10 2ln ( ( )4 yk y x x z x     хн < х < хк, у, z = const 11 2 0,10,5 3cos( ) yzl x x y e xy     хн < х < хк, у, z = const 12 3tg( ) 1(lg( ) cos( ) )xm e x y xy x     хн < х < хк, у = const 13 2 3 lg( ) 2 ln( )     x yx ep y x y хн < х < хк, у = const 14 2 3 lg( ) 2 ln( )     x yx ep y x y хн < х < хк, у = const 15 4 2 2 212 3 4 5 6 lg ( )     q x x x x z хн < х < хк, z = const 64 Номер варианта Выражение Исходные данные 16 2 2sin 1 a ax zl e   хн < х < хк, a, z = const 17 2 2cos ln b q t x b x   хн < х < хк, b, z = const 18 2 3 3 2 3 sin ( )   t z aq t e tн < t < tк, a, z = const Контрольные вопросы 1. Формат записи оператора for. 2. Формат записи оператора while. 3. Составить блок-схему циклического алгоритма для всех опера- торов цикла. 65 Лабораторная работа № 5 ВЫЧИСЛЕНИЕ КОНЕЧНЫХ СУММ Цель работы: – изучить вложенные структуры операторов повтора (циклов) при вычислении конечных сумм; – представить алгоритм решения задачи в виде блок-схемы. Теоретические сведения Оператор цикла часто применяется для суммирования значений некоторой последовательности чисел или значений функции при из- вестном числе операций суммирования. Напомним некоторые опре- деления, связанные с расчетом суммы последовательности. Сумма членов последовательности величин a1, a2, a3, ... , aN назы- вается конечной суммой SN = a1 + a2 + a3 + ... + aN. Для некоторых последовательностей известны формулы расчета конечных сумм, например: при aN = aN–1 + d SN = (a1 + aN)  N / 2 – арифметическая прогрессия; при aN = aN–1q; SN = (a1 – aNq) / (1 – q) – геометрическая прогрессия, где d и q – постоянные числа. Здесь N-й член последовательности выражается через (N – 1)-й член. Такие зависимости называются реккурентными. Конечная сумма последовательности может быть неизвестна, то- гда для ее расчета применяется алгоритм суммирования членов по- следовательности в цикле от 1 до N. Пример 5.1. Составить блок-схему (рис. 5.1) вычисления суммы вида 3 5 2 1 1... ( 1) , 3! 5! (2 1)! m mx x xx m       , .x R m N  66 Рис. 5.1. Блок-схема для примера 5.1 Варианты заданий Вычислить конечные суммы. Номер варианта Сумма Диапазон n 1 2 2ln3 ln 3 ln 31 ... 1! 2! !     n nx x x n 0,1 1 x 10 2 ! cos... !2 2coscos n nxxx  π 9π 5 5  x 10 67 Номер варианта Сумма Диапазон n 3 3 2 1 ... ( 1) 3! (2 1)!       n nx xx n 0,1 1 x 10 4 2 1 ... 1! 2! !     nx x x n 1 2 x 10 5 π πcos cos 4 41 ... 1! !    n n x x n 0,1 1 x 15 6 2 2 1 ... ( 1) 2! (2 )!     n nx x n 0,1 1 x 10 7 cos cos1 ... 1! !   x nx n 0,1 1 x 10 8 2 2 2 11 3 ... !    nnx x n 0,1 1 x 10 9 2 2 1 ... 2! (2 )!    nx x n 0,1 1 x 10 10 2 (2 )1 ... 1! !    nx x n 0,1 1 x 10 11 2 11 2 ... 2! ! 2         nx n x n 0,1 1 x 10 12 2 2 23 2 11 ... ( 1) 2! (2 )!     n nnx x n 0,1 1 x 15 13    22 4 2(2 ) (2 ) ... ( 1) 2! 4! 2 !      n n xx x n 0,1 1 x 15 14 ... ( 1) 1! 2! !      nx x x n 0,1 1 x 15 15 ... 2! 4! 6! 2 !     x x x xe e e e n 2 4 x 10 68 Номер варианта Сумма Диапазон n 16  3 ... 1 2! 3! !       n nx x xx n 10 20 x 10 17 2 4 2sin sin sin1 ... 3! 5! (2 1)!      nx x x n π 3π 2 2  x 10 18 2 4 2 1 ... 3! 5! (2 1)!      nx x x n 0,1 1 x 10 Контрольные вопросы 1. Что такое конечные суммы? 2. Как осуществляется ввод-вывод конечных сумм? 3. Составить блок-схему для вычисления конечных сумм. 69 Лабораторная работа № 6 ОДНОМЕРНЫЕ МАССИВЫ Цель работы: – приобрести навыки составления программы на языке С++ с ис- пользованием одномерных массивов; – представить алгоритм решения задачи в виде блок-схемы. Теоретические сведения Массивы Массив (array) – это совокупность переменных, имеющих одина- ковый тип и объединенных под одним именем. Доступ к отдельно- му элементу массива осуществляется с помощью индекса. Согласно правилам языка C++ все массивы состоят из смежных ячеек памяти. Младший адрес соответствует первому элементу массива, а стар- ший – последнему. Массивы могут быть одномерными и многомерными. Наиболее распространенным массивом является строка, завершающаяся нуле- вым байтом. Она представляет собой обычный массив символов, последним элементом которого является нулевой байт. Массивы и указатели тесно связаны между собой. Трудно опи- сывать массивы, не упоминая указатели, и наоборот. Декларация одномерных массивов Объявление одномерного массива представлено ниже. тип имя_переменной [размер] Как и другие переменные, массив должен объявляться явно, что- бы компилятор мог выделить для него память. Здесь тип объявляет базовый тип массива, т. е. тип его элементов, а размер определяет, сколько элементов содержится в массиве. Вид объявления массива с именем balance, имеющего тип double и состоящего из 100 эле- ментов, ниже. double balance[100]; 70 Доступ к элементу массива осуществляется с помощью имени массива и индекса. Для этого индекс элемента указывается в квад- ратных скобках после имени массива. Например, оператор, приве- денный ниже, присваивает третьему элементу массива balance зна- чение 12.23. balance[3] = 12.23; Индекс первого элемента любого массива в языке C++ равен нулю. Следовательно, оператор char p[10]; объявляет массив сим- волов, состоящий из 10 элементов – от р[0] до р[9]. Пример 6.1. Следующая программа заполняет целочисленный мас- сив числами от 0 до 99. #include void main() { int x[100]; /* Объявление целочисленного массива, состоящего из 100 элементов */ int t; /* Заполнение массива числами от 0 до 99 */ for(t=0; t<100; ++t) x[t]=t; /* Вывод на экран элементов массива х */ for(t=0; t<100; ++t) printf("%d ", x[t]); } Объем памяти, необходимый для хранения массива, зависит от его типа и размера. Размер одномерного массива в байтах вычисля- ется по формуле количество_байт = sizeof(тип)  количество_элементов. В языке C++ не предусмотрена проверка выхода индекса масси- ва за пределы допустимого диапазона. Иными словами, во время 71 выполнения программы можно по ошибке выйти за пределы памя- ти, отведенной для массива, и записать данные в соседние ячейки, в которых могут храниться другие переменные и даже программ- ный код. Ответственность за предотвращение подобных ошибок ле- жит на программисте. Например, фрагмент программы, приведенный ниже, будет ском- пилирован без ошибок, однако во время выполнения программы ин- декс массива выйдет за пределы допустимого диапазона. int count[10], i; /* Выход индекса массива за пределы диапазона */ for(i=0; i<100; i++) count[i] = i; По существу, одномерный массив представляет собой список пе- ременных, имеющих одинаковый тип и хранящихся в смежных ячей- ках памяти в порядке возрастания их индексов. Ниже показано как хранится в памяти массив а, начинающийся с адреса 1000 и объявленный с помощью оператора char а[7]. Элемент a[0] a[1] a[2] a[3] a[4] a[5] a[6] Адрес 1000 1001 1002 1003 1004 1005 1006 Инициализация массива В языке C++ допускается инициализация массивов при их объ- явлении. Общий вид инициализации массива не отличается от ини- циализации обычных переменных. тип имя_массива[размер1]...[размерN]={список_значений}. Список_значений представляет собой список констант, разделен- ных запятыми. Тип констант должен быть совместимым с типом мас- сива. Первая константа присваивается первому элементу массива, вто- рая – второму и т. д. Обратите внимание на то, что после закрываю- щейся фигурной скобки } обязательно должна стоять точка с запятой. 72 Рассмотрим пример, в котором целочисленный массив, состоя- щий из 10 элементов, инициализируется числами от 1 до 10. int i[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Здесь элементу i[0] присваивается значение 1, а элементу i[9] – число 10. Символьные массивы можно инициализировать строковы- ми константами. char имя_массива[размер] = "строка"; Например, следующий фрагмент инициализирует массив str стро- кой «Я изучаю C». char str[10]="Я изучаю C"; Это же можно переписать иначе. char str[10]={'Я', ' ', 'и', 'з', 'у', 'ч', 'а','ю',' ', 'С', '\0'}; Поскольку строки завершаются нулевым байтом, размер массива должен быть достаточным, поэтому размер массива str равен 11, хо- тя строка «Я изучаю C» состоит из 10 символов. Если массив ини- циализируется строковой константой, компилятор автоматически до- бавляет нулевой байт. Инициализация безразмерного массива При инициализации сообщений об ошибках, каждое из которых хранится в одномерном массиве, необходимо подсчитать точное ко- личество символов в каждом сообщении. char e1[18]="Ошибка при чтении"; char е2[24]="Невозможно открыть файл"; Компилятор может сам определить размер массива. Для этого не нужно указывать размер массива. char e1[]="Ошибка при чтении"; char е2[]="Невозможно открыть файл"; 73 Такой массив называется безразмерным. Инициализация безраз- мерных массивов, в данном случае, позволяет изменять сообщения, не заботясь о размере массивов. Пример 6.2. Нахождение суммы элементов массива int a[9]={34, –3, 44, 16, 53, –55, 1, –21, 2}; int i, Sum=0; for (i=0; i<9; i++) Sum+=a[i]; Варианты заданий 1. Найти наименьший из положительных элементов массива (Х1, Х2, …, Х14). 2. Записать в массив Y десять первых положительных элементов массива (Х1, Х2, …, Х20). 3. Вычислить сумму элементов массива (А1, А2, …, А12), стоя- щих на четных местах. 4. Подсчитать количество положительных и отрицательных эле- ментов в массиве (А1, А2, …, А15). Нулевые элементы не считать. 5. Для целочисленного массива (В1, В2, …, В10) определить, яв- ляется ли сумма его элементов четным числом, и вывести на печать «Да» или «Нет». 6. Записать +1 вместо максимального элемента массива (Х1, Х2, …, Х12), а – 1 вместо минимального. 7. Переписать положительные элементы массива (Х1, Х2, …, Х20) подряд в массив Y. 8. Определить разность между наибольшим и наименьшим эле- ментами массива (Y1, Y2, …, Y20). 9. Все элементы массива (А1, А2, …, А20) уменьшить на величи- ну среднего арифметического этих элементов. 10. Массив (Х1, Х2, …, Х20) разбить на два массива: массив по- ложительных элементов и массив отрицательных элементов. Ноль относить к положительным элементам. 11. Переписать элементы массива (Х1, Х2, …, Х20) в обратном порядке. 74 12. Подсчитать сумму элементов массива (А1, А2, …, А12), стоя- щих на четных местах, и сумму элементов того же массива, стоя- щих на нечетных местах. 13. Вывести на печать номера элементов (Y1, Y2, …, Y15), удо- влетворяющих условию 0 < Yi < 1. 14. В массе (А1, А2, …, А15) поменять местами минимальный и максимальный элементы. 15. Дан массив (D1, D2, …, D15). Найти произведение элементов с четными номерами и сумму с нечетными номерами. 16. В массиве (F1, F2, …, F10) найти сумму элементов с номера- ми, кратными трем. 17. В массиве (A1, A2, …, A20) найти количество элементов, рав- ных X. 18. Из вектора (A1, A2, …, A15) получить вектор (B1, B2, …, B5), очередная компонента которого равна среднему арифметическому очередной тройки компонент вектора А. Контрольные вопросы 1. Что такое массив? 2. Какие существуют варианты инициализации массива? 3. Как вычислить объем памяти, необходимый для хранения массива? 75 Лабораторная работа № 7 ДВУМЕРНЫЕ МАССИВЫ Цель работы: – ознакомиться с возможностями использования двумерных мас- сивов в языке С++; – представить алгоритм решения задач с двумерными массивами в виде блок-схемы. Теоретические сведения Сходно математическим аналогам – матрицам – массивы могут иметь два и более измерений. Двумерные массивы предназначены для лаконичной замены нескольких одномерных массивов, в част- ности, в тех ситуациях, когда это действие логически напрашивает- ся (к примеру, при описании координатной зависимости функции от аргумента). Описание двумерного массива в программе аналогично описанию одномерного массива. Отличие заключается лишь в добавлении до- полнительной размерности, взятой в квадратные скобки (собственно, второго измерения). Int main() { Double array [range1][range2]; В вышеприведенном примере в квадратные скобки заключены раз- мерности описываемого массива. При использовании компилятора от Borland данные величины должны быть константами, использо- вание переменных недопустимо! Для заполнения массива можно использовать метод последова- тельного или произвольного присваивания ячейкам требуемых зна- чений (по аналогии с одномерными массивами) или присвоить ячей- кам массива значения вручную. Int main() { Double array [range1][range2]= { 76 {a1, a2, a3, a4}, {b1, b2, b3, b4}, {c1, c2, c3, c4}, {d1, d2, d3, d4} }; В данном примере соответствующим элементам массива присва- иваются задаваемые разработчиком значения. Для более надежной работы двумерных массивов в компиляторе Borland рекомендуется придерживаться правил. 1. Нежелательно начинать использование массива с нулевой строки. Несмотря на то, что С++ позволяет использовать эту строку, компилятор не всегда корректно работает с памятью, в результате чего программа выполняется неправильно. 2. При описании массива заданной величины задавать по одной дополнительной строке и столбцу. Их следует оставить пустыми; в случае их отсутствия возможны конфликты переменных на гра- ницах массива. Варианты заданий 1. Из матрицы A(35) построить матрицу В, поменяв местами строки и столбцы. 2. Дана матрица H(45). Найти номер строки, имеющей макси- мальную сумму элементов. 3. Дана матрица С(55). Вывести на экран элементы главной диагонали и найти сумму их квадратов. 4. Дана матрица G(45). Определить координаты ее минималь- ного элемента и сам элемент, вывести их на экран. 5. В матрице А(43) поменять местами строку, содержащую мак- симальный элемент массива, со строкой, содержащей минимальный элемент. 6. Вычислить и вывести на экран разность между произведением элементов главной диагонали и элементов побочной диагонали мат- рицы В(55). 7. Вычислить сумму элементов под главной диагональю квадрат- ной матрицы E(55). 77 8. Определить минимальный элемент в каждом из столбцов матри- цы С(46) и вывести на экран номера строк, в которых они находятся. 9. Вычислить сумму элементов строки и столбца матрицы D(45), на пересечении которых находится минимальный элемент матрицы. 10. В матрице X(55) найти сумму квадратов элементов, распо- ложенных выше главной диагонали. 11. Описать переменную и присвоить ей значение наибольшего из элементов матрицы А(55), расположенных на главной диагона- ли и выше ее. 12. В матрице С(45) определить все положительные элементы, их сумму вывести на экран. 13. Заполнить одномерный массив элементами главной диагона- ли матрицы R(55), вывести его на экран. 14. Определить и вывести на экран максимальный и минималь- ный элементы матрицы В(44). 15. Определить и вывести на экран минимальный положитель- ный и максимальный отрицательный элементы матрицы М(54). Контрольные вопросы 1. Для чего применяется двумерный массив и в чем заключается его взаимосвязь с одномерным массивом? 2. Как описать в программе двумерный массив? 3. Как заполнить двумерный массив данными? 4. Какие основные элементы блок-схемы программы двумерного массива? 5. Что такое главная диагональ двумерного массива? 78 Лабораторная работа № 8 ПОДПРОГРАММЫ Цель работы: ознакомиться с возможностями использования под- программ в языке С++, их назначением и особенностями. Теоретические сведения При создании сложных программ довольно часто бывает необхо- димо выполнять один и тот же набор операций несколько раз. Если писать код линейно, то в этом случае он получится с большим коли- чеством одинаковых строк. Альтернативой такому неудобному под- ходу является использование подпрограмм – специальных функций, которым можно задать определенный набор операций, и в случае необходимости его выполнения достаточно сослаться в основном коде программы на функцию и задать требуемый набор входящих и исходящих переменных. В результате длина кода программы су- щественно сокращается, повышается его читабельность. Алгоритм описания подпрограммы не покажется новым для пользо- вателей, уже создавших несколько программ на языке С++. В процессе создания программы всегда фигурирует примерно следующая строка. Int main() { Подобным образом подготавливаем тело программы для ком- пилятора. В скобочках можно указывать дополнительные парамет- ры, что может быть полезно при создании более сложных программ. Подпрограмма описывается абсолютно аналогичным образом. Разберем на примере. Int func(char, int); // объявление функции Int func(char ch, int chis) // тело функции { Cout< // файловый ввод/вывод #include #include 84 Using namespace std; Int main () { Char ch=‘G’; Int j=44; String str=‘File1’; Ofstream outfile (“file1.txt”); // создание файла Outfile <>ch>>j>>str1>>str2>>str; Cout << ch<+<=>). Если уравнение приведено к стандартному виду, то достаточно будет в этот маркер вписать лишь его левую часть. При этом выра- жение будет приравнено к нулю автоматически. Также в левый маркер можно внести и имя функции – в этом случае будут найдены выражения, определяющие ее нули. Форма записи уравнения через функцию удобна в том случае, если оно имеет большую длину. 2. В правый маркер внесите переменную, относительно которой должно быть решено уравнение, как это показано на рис. 11.5. Ответ оператор solve возвращает в виде выражения (численного или буквенного), которое вполне можно использовать в дальнейших вычислениях. Если решений имеется несколько, то возвращается содержащий их вектор. Рис. 11.5. Символьное решение уравнения с использованием панели инструментов Symbolic 109 При символьном решении уравнений нет особой разницы, сколько переменных содержит уравнение. Ответ ищется в виде вы- ражения, и поэтому для системы неважно, будет ли оно содержать буквенные или численные элементы. Исходя из этого, можно найти корни как уравнения нескольких переменных, так и уравнения с параметрами или буквенными коэффициентами. Во втором случае, чтобы решить уравнение в символьном виде, нужно ввести уравнение (знак <=> следует брать с панели Boolean), выделить переменную, выбрать команду solve из подменю Symbol- ics → Variable, как это показано на рис. 11.6. Рис. 11.6. Символьное решение уравнения с использованием подменю Variable Контрольные вопросы 1. Как MathCAD реализует вычисления? 2. Как вычислить интеграл и производную в системе MathCAD? 3. Опишите порядок действий при решении уравнений с помо- щью функции root. 4. Как в MathCAD получить результат решения уравнения? 5. Порядок действий при построении графика функции в MathCAD. 110 СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 1. Павловская, Т. А. C/C++. Программирование на языке высоко- го уровня : учебник для студентов вузов, обучающихся по направ- лению «Информатика и вычислительная техника» / Т. А. Павлов- ская. – СПб. : Питер, 2006. – 460 с. 2. Объектно-ориентированное программирование в С++ / Р. Ла- форе ; пер. с англ. А. Кузнецова, М. Назарова, В. Шрага. – 4-е изд. – СПб. : Питер, 2005. – 924 с. 3. Круглински, Д. Дж. Программирование на Microsoft Visual C++6.0 = Programming Microsoft Visual C++6.0 : пер. с англ. / Д. Дж. Круглински, Скотт Уингоу, Джордж Шеферд. – – 5-е изд. – М. ; СПб. : Русская редакция : Питер, 2003. – 819 с. 4. Грегори, Кэйт. Использование Visual C++.NET : Специальное издание : пер. с англ. / К. Грегори ; под ред. Г. П. Петриковца. – М. : Издательский дом «Вильямс», 2003. – 784 с. 5. Горбачев, А. Г. Microsoft Excel. Работайте с электронными таблицами в 10 раз быстрее / А. Г. Горбачев, Д. В. Котлеев. – М. : Издательский дом «ДМК-пресс», 2007. – 96 с.: ил. 6. Макаров, Е. Г. Mathcad. Учебный курс / Е. Г. Макаров. – Пи- тер, 2009. 111 Учебное издание ИНФОРМАТИКА Практикум по программированию на языке С++ для студентов специальностей 1-43 01 04 «Тепловые электрические станции», 1-43 01 08 «Паротурбинные установки атомных электрических станций» В 2 частях Часть 1 Составители : ТАРАСЕВИЧ Леонид Александрович ПРОНКЕВИЧ Елена Васильевна РОМАНКО Виктория Александровна ДЕНИСОВ Сергей Михайлович Редактор Т. В. Грищенкова Компьютерная верстка Н. А. Школьниковой Подписано в печать 30.03.2017. Формат 6084 1/16. Бумага офсетная. Ризография. Усл. печ. л. 6,45. Уч.-изд. л. 5,05. Тираж 100. Заказ 596. Издатель и полиграфическое исполнение: Белорусский национальный технический университет. Свидетельство о государственной регистрации издателя, изготовителя, распространителя печатных изданий № 1/173 от 12.02.2014. Пр. Независимости, 65. 220013, г. Минск.