Решение вычислительных задач на языке С++
Покупка
Новинка
Тематика:
Программирование на C и C++
Издательство:
ИНТУИТ
Автор:
Богданов Марат Робертович
Год издания: 2016
Кол-во страниц: 168
Дополнительно
Целью курса является развитие у слушателей навыков решения распространенных задач вычислительной математики. Слушатели познакомятся с основными синтаксическими конструкциями языка C++.
Данный курс расчитан на студентов, обладающих начальными навыками программирования. Основной нашей целью является помочь студенту решать задачи вычислительной математики, составляя для этого программы на языке С++. В связи с тем, что язык С++ на современном этапе своего развития чрезвычайно усложнился и получил много новых возможностей (для полного изучения языка требуется несколько лет), ограниченный объем курса позволит познакомить студентов лишь с базовыми понятиями языка. При этом неизбежны определенные упрощения. Для желающих самостоятельно изучать С++ предлагается список дополнительной литературы. В рамках
курса предлагается решение таких задач, как линейная и нелинейная регрессия, численное дифференцирование и интегрирование, численное решение алгебраических и дифференциальных уравнений, работа с матрицами. Рассматриваются такие распространенные алгоритмы, как различные методы сортировки, работа со структурами и так далее. Для работы можно выбрать любой из доступных компиляторов С++ (автор использовал Tizen SDK for Linux, программы также работают и на MS Visual Studio 2015). В качестве платформы рекомендуется использовать компьютер классом не ниже Pentium.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Решение вычислительных задач на языке С++ 2-е издание, исправленное Богданов М.Р. Национальный Открытый Университет “ИНТУИТ” 2016 2
Решение вычислительных задач на языке С++/ М.Р. Богданов - М.: Национальный Открытый Университет “ИНТУИТ”, 2016 Целью курса является развитие у слушателей навыков решения распространенных задач вычислительной математики. Слушатели познакомятся с основными синтаксическими конструкциями языка C++. Данный курс расчитан на студентов, обладающих начальными навыками программирования. Основной нашей целью является помочь студенту решать задачи вычислительной математики, составляя для этого программы на языке С++. В связи с тем, что язык С++ на современном этапе своего развития чрезвычайно усложнился и получил много новых возможностей (для полного изучения языка требуется несколько лет), ограниченный объем курса позволит познакомить студентов лишь с базовыми понятиями языка. При этом неизбежны определенные упрощения. Для желающих самостоятельно изучать С++ предлагается список дополнительной литературы. В рамках курса предлагается решение таких задач, как линейная и нелинейная регрессия, численное дифференцирование и интегрирование, численное решение алгебраических и дифференциальных уравнений, работа с матрицами. Рассматриваются такие распространенные алгоритмы, как различные методы сортировки, работа со структурами и так далее. Для работы можно выбрать любой из доступных компиляторов С++ (автор использовал Tizen SDK for Linux, программы также работают и на MS Visual Studio 2015). В качестве платформы рекомендуется использовать компьютер классом не ниже Pentium. (c) ООО “ИНТУИТ.РУ”, 2015-2016 (c) Богданов М.Р., 2015-2016 3
Структура программы Введение Язык программирования С++ был разработан на основе языка Си Бьярном Страуструпом (Bjarne Stroustrup) и вышел за пределы его исследовательской группы в начале 80-х годов. Чрезвычайная гибкость и большие возможности языка С++ обусловили применение его в самых разных областях информатики: от программирования баз данных до создания приложений, работающих с INTERNET, при изучении данного курса студенты будут создавать консольные приложения. Данный курс рассчитан на студентов, обладающих начальными навыками программирования. Основной нашей целью является помочь студенту решать задачи вычислительной математики, составляя для этого программы на языке С++. В связи с тем, что язык С++ на современном этапе своего развития чрезвычайно усложнился и получил много новых возможностей (для полного изучения языка требуется несколько лет), ограниченный объем курса позволит познакомить студентов лишь с базовыми понятиями языка. При этом неизбежны определенные упрощения. Для желающих самостоятельно изучать С++ предлагается список дополнительной литературы. Для работы можно выбрать любой из доступных компиляторов С++ (автор использовал Tizen SDK for Linux, программы также работают и на MS Visual Studio 2015). В качестве платформы рекомендуется использовать компьютер классом не ниже Pentium. Структура программы Программу на языке С++ можно представить как совокупность одного или нескольких модулей — самостоятельно компилируемых файлов. Такой файл обычно содержит директивы препроцессора, а также одну или несколько функций, которые состоят из операторов языка С++. С другой стороны, программу на языке С++ можно рассматривать как совокупность следующих элементов: директив препроцессора, указаний компилятору, объявлений и определений. специфицируют действия препроцессора по преобразованию текста программы перед компиляцией. Указания компилятору —это специальные инструкции, которым компилятор языка С++ следует во время компиляции. Объявление переменной задает ее имя и атрибуты, а объявление функции — ее имя, тип возвращаемого значения и атрибуты ее формальных параметров. Определение переменной приводит к выделению для нее памяти и задает ее начальное значение (явно или неявно). Определение функции специфицирует тело функции, которое представляет собой составной оператор (блок), содержащий определения переменных и операторы. Объявление типа позволяет программисту создавать собственный тип данных — точнее присвоить свое имя некоторому базовому или составному типу языка С++, что 4
во многих случаях позволяет повысить читаемость программы. Для типа понятия объявления и определения совпадают. Исходный файл не обязательно должен содержать выполняемые операторы. Традиционно в программах на языке С++ используются два типа файлов: файлы реализации, имеющие расширение .сpp, и заголовочные файлы (файлы интерфейса), имеющие расширение .h. В заголовочных файлах обычно располагаются именованные константы, макроопределения и объявления, а в файлах реализации — определения переменных и функций. Заголовочные файлы подключаются посредством директивы препроцессора #include. Отличительной особенностью языка С++ является то, что в нем нет ни одного встроенного оператора для выполнения ввода/вывода, динамического распределения памяти, управления процессами и т. п., однако в его системное окружение входит библиотека стандартных функций, в которых реализованы подобные и многие другие действия. Вынос этих функций в библиотеку позволяет отделить особенности архитектуры конкретного компьютера и соглашений операционной системы от реализации собственно языка, сделать программу максимально независимой от деталей реализации операционной среды. Комментарии и пробелы При составлении программы важную роль играет детальное документирование программы (степень детальности никогда не бывает излишней). Существует два способа документирования программы. Первый способ заключается во включении комментариев в текст программы. Например, символы /* открывают комментарий, а символы */ - закрывают его. /* Комментарий — часть текста программы, предназначенная для краткой характеристики выполняемых действий или поясняющая назначение данных, которая игнорируется компилятором. */ Символы // открывают комментарий, заканчивающийся в конце той же строки. int count; //эта переменная служит для //подсчета числа символов в строке Во втором случае осмысленные имена даются идентификаторам. double radius; int weight; double Simpson_Integral (double delta); Идентификаторы 5
Идентификаторы – это имена, которыми обозначаются переменные, константы, типы, функции и метки. Идентификаторы состоят из букв латинского алфавита, цифр и могут содержать символ подчеркивания, они могут иметь произвольное число символов, но значащими будут только первые 31 символ. Идентификаторы не должны совпадать с ключевыми словами, имеющими значение для компилятора С++. Ключевые слова языка С++ auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Как уже говорилось выше, желательно, чтобы идентификаторы имели осмысленные имена. Константы Константы — это лексемы, представляющие собой фиксированные числовые или символьные значения. В языке С++ имеется четыре типа констант: целые, вещественные, символьные и перечисляемого типа. Целые числа. Обозначаются int (обычная точность), либо long (двойная точность), для небольших целых чисел используется тип short. Первая цифра варьирует от 1 до 9, следующие - от 0 до 9. int i; i=1256; long m=12121121254554; Вещественные числа. Вещественные константы, называемые также константами с плавающей точкой, представляют собой числа по основанию 10 и хорошо всем знакомы еще со школы. С точки зрения языка С++ отметим два наиболее существенных различия между целыми и вещественными константами: 1. Вещественные константы всегда содержат десятичную точку и/или либо 6
обоззначение показателя степени Е (или е) — научная нотация. 2. Вещественные числа могут начинаться с цифры 0, однако всегда интерпретируются как значения по основанию 10. Обозначаются либо float (обычная точность), либо double (двойная точность), если требуется еще большая точность, используют long double. float e=2.71; float e=2.71; Константы символьного типа — это отдельные символы, такие, как F, ?, 4 и строки (или массивы символов), например “О сколько нам открытий чудных готовит просвещенья дух!”. Символьные константы обозначаются char. char bukva=‘m’; char slovo[40]=“Informatika - eto zdorovo!”; Из примера видно, что отдельные символы заключаются в апострофы, а массивы символов - в кавычки. Константы перечисляемого типа представляют собой идентификаторы, определенные с помощью объявления типа enum, которые служат в качестве мнемонических имен, повышаемых читаемость программы. enum {zero, one, two, three}; Помимо приведенных выше типов используются также: пустой тип (void), булевый тип, и тип данных указатель. Константой может быть, в известном смысле, и массив. Если перед именем массива поставить слово const, то его элементы станут неизменными (константными). На практике часто бывает необходимо производить выборку из таблиц (двумерных массивов), задавая номер строки и столбца. Ниже приводится программа, в которой имеется таблица Фишера, пользователь указывает номер строки и столбца и получает значение F-критерия на пересечении этих значений. //========================================================== // Name : Fisher.cpp // Author : Marat // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //========================================================== #include <iostream> 7
using namespace std; const double Fisher[24][24]={ {161.4, 199.5, 215.7, 224.6, 230.2, 234, 236.45, 238.9, 240.15, 241.4, 242.65, 243.9, 244.55, 245.2, 245. {18.51, 19.0, 19.16, 19.25, 19.3, 19.33, 19.35, 19.37, 19.38, 19.39, 19.4, 19.41, 19.415, 19.42, 19.425, 1 {10.13, 9.55, 9.28, 9.12, 9.01, 8.94, 8.89, 8.84, 8.8150, 8.79, 8.765, 8.74, 8.7275, 8.715, 8.7025, 8.69, 8.6 {7.71, 6.94, 6.59, 6.39, 6.26, 6.16, 6.100, 6.04, 6.0075, 5.975, 5.9425, 5.91, 5.8925, 5.875, 5.8575, 5.84, {6.61, 5.79, 5.41, 5.19, 5.05, 4.95, 4.885, 4.82, 4.7850, 4.750, 4.7150, 4.68, 4.66, 4.64, 4.62, 4.6, 4.59125 {5.99, 5.14, 4.76, 4.53, 4.39, 4.28, 4.215, 4.15, 4.1125, 4.075, 4.0375, 4, 3.98, 3.96, 3.94, 3.92, 3.91, 3.9, {5.59, 4.74, 4.35, 4.12, 3.97, 3.87, 3.800, 3.73, 3.6900, 3.650, 3.6100, 3.57, 3.55, 3.53, 3.51, 3.49, 3.48, 3 {5.32, 4.46, 4.07, 3.84, 3.69, 3.58, 3.510, 3.44, 3.4000, 3.360, 3.3200, 3.28, 3.26, 3.24, 3.22, 3.2, 3.19, 3 {5.12, 4.26, 3.86, 3.63, 3.48, 3.37, 3.300, 3.23, 3.1900, 3.150, 3.1100, 3.07, 3.0475, 3.025, 3.0025, 2.98, {4.96, 4.10, 3.71, 3.48, 3.33, 3.22, 3.145, 3.07, 3.0300, 2.990, 2.9500, 2.91, 2.8875, 2.865, 2.8425, 2.82, {4.84, 3.98, 3.59, 3.36, 3.20, 3.09, 3.020, 2.95, 2.9100, 2.870, 2.8300, 2.79, 2.7675, 2.745, 2.7225, 2.7, 2 {4.75, 3.88, 3.49, 3.26, 3.11, 3.00, 2.925, 2.85, 2.8100, 2.770, 2.7300, 2.69, 2.6675, 2.645, 2.6225, 2.6, 2 {4.67, 3.80, 3.41, 3.18, 3.02, 2.92, 2.845, 2.77, 2.7275, 2.685, 2.6425, 2.6, 2.5775, 2.555, 2.5325, 2.51, 2 {4.60, 3.74, 3.34, 3.11, 2.96, 2.85, 2.775, 2.70, 2.6575, 2.615, 2.5725, 2.53, 2.5075, 2.485, 2.4625, 2.44, {4.54, 3.68, 3.29, 3.06, 2.90, 2.79, 2.715, 2.64, 2.6000, 2.560, 2.5200, 2.48, 2.4575, 2.435, 2.4125, 2.39, {4.49, 3.63, 3.24, 3.01, 2.85, 2.74, 2.665, 2.59, 2.5475, 2.505, 2.4625, 2.42, 2.3975, 2.375, 2.3525, 2.33, {4.45, 3.59, 3.20, 2.96, 2.81, 2.70, 2.625, 2.55, 2.5075, 2.465, 2.4225, 2.38, 2.3575, 2.335, 2.3125, 2.29, {4.41, 3.55, 3.16, 2.93, 2.77, 2.66, 2.585, 2.51, 2.4675, 2.425, 2.3825, 2.34, 2.3175, 2.295, 2.2725, 2.25, {4.38, 3.52, 3.13, 2.90, 2.74, 2.63, 2.555, 2.48, 2.4375, 2.395, 2.3525, 2.31, 2.285, 2.26, 2.235, 2.21, 2.19 {4.35, 3.49, 3.10, 2.87, 2.71, 2.60, 2.525, 2.45, 2.4075, 2.365, 2.3225, 2.28, 2.255, 2.23, 2.205, 2.18, 2.16 {4.32, 3.47, 3.07, 2.84, 2.68, 2.57, 2.495, 2.42, 2.3775, 2.335, 2.2925, 2.25, 2.225, 2.2, 2.175, 2.15, 2.137 {4.30, 3.44, 3.05, 2.82, 2.66, 2.55, 2.475, 2.40, 2.3575, 2.315, 2.2725, 2.23, 2.205, 2.18, 2.155, 2.13, 2.11 {4.28, 3.42, 3.03, 2.80, 2.64, 2.53, 2.455, 2.38, 2.3350, 2.290, 2.2450, 2.2, 2.1775, 2.155, 2.1325, 2.11, 2 {4.26, 3.40, 3.01, 2.78, 2.62, 2.51, 2.435, 2.36, 2.3150, 2.270, 2.2250, 2.18, 2.1575, 2.135, 2.1125, 2.09, }; int main() { int n,m; cout<<"\nEnter raw, please "; cin>>n; cout<<"\nEnter column, please "; cin>>m; double a=Fisher[n-1][m-1]; cout<<"\nFisher ["<<n<<"]["<<m<<"]= "<<a<<endl; return 0; } Enter raw, please 5 Enter column, please 6 Fisher[5][6]=4.95 Знаки операций 8
Знаки операций обеспечивают формирование и последующее вычисление выражении. Выражение есть правило для получения значения. Один и тот же знак операции может употребляться в различных выражениях и по-разному интерпретироваться в зависимости от контекста. Для изображения операции в большинстве случаев используется несколько символов. В стандарте языка Си определены следующие знаки операций: [] () . -> ++ — & * + ~ ! sizeof / % << >> < > <= >= == != ^ | && || ?: = =* /= %= += -= <<= >>= &= ^= |= , # ## Дополнительно к перечисленным в Си++ введены: :: .* ->* new delete typeid Если при записи выражения используется один операнд, такую операцию называют унарной, если два операнда – бинарной. i++; //Знак ++ - это унарная операция инкремента c=a*b; //Знак * - обозначает умножение операндов //(бинарная операция). Рассмотрим некоторые наиболее часто встречающиеся при решении задач операции. Унарные операции & операция получения адреса операнда; * операция обращения по адресу (double *a=&b); унарный минус - изменяет знак арифметического операнда; + унарный плюс (введен для симметрии с унарным минусом); ++ увеличение на единицу (инкремент или автоувеличение) — уменьшение на единицу (декремент или автоуменьшение) sizeof операция вычисления размера (в байтах) для объекта того типа, который имеет операнд. Разрешены два формата операции: sizeof унарное выражение и sizeof(тип). Бинарные операции Таблица 3.2. Аддитивные операции 9
+ бинарный плюс (сложение арифметических операндов) a+b бинарный минус (вычитание арифметических операндов) a-b Мультипликативные операции * умножение операндов (a*b) / деление операндов. При целочисленных операндах абсолютное значение результата округляется до целого. Например, 20/3 равно 6, -20/3 равняется –6, (-20)/3 равно -6, 20/(-3) равно -6 % получение остатка от деления целочисленных операндов (деление по модулю) 10%3=1 Логические бинарные операции && конъюнкция (И) if (a<b && c>b) d=6 (Если а меньше b, и с больше b, то d=6) || дизъюнкция (ИЛИ) if (a<b || c>b) d=6 (Если а меньше b, или с больше b, то d=6) Операции отношения (сравнения) < меньше, чем; a<b > больше, чем; a>b <= меньше или равно; a<=b >= больше или равно; a>=b == равно, a==b != не равно; a!=b (a не равно b ) Операции присваивания. = присвоить значение выражения-операнда из правой части операнду левой части: p=10.3-2*х *= присвоить операнду левой части произведение значений обоих операндов: Р*=2 эквивалентно р=р*2 /= присвоить операнду левой части частное от деления значения левого операнда на значение правого: p/=2.2 - d эквивалентно p= p/(2.2 - d) %= присвоить операнду левой части остаток от деления целочисленного значения левого операнда на целочисленное значение правого операнда: N%=3 эквивалентно N=N%3 += присвоить операнду левой части сумму значений обоих операндов: A+=B эквивалентно А=А+B -= присвоить операнду левой части разность значений левого и правого операндов: х-=4.3-z эквивалентно х=х-(4.3-z) Операторы Под операторами подразумеваются определенные языковые конструкции, которые определяют действия и порядок этих действий в программе. Среди операторов выделяют последовательно выполняемые и управляющие операторы. Последовательно выполняемые операторы. Каждый оператор (кроме for) заканчивается точкой с запятой. Составим первую программу, в которой переменной a будет присвоено значение 12.3, а переменной b 10