Опубликован: 10.12.2015 | Доступ: свободный | Студентов: 605 / 89 | Длительность: 07:10:00
Лекция 1:

Структура программы

Лекция 1 || Лекция 2 >
Аннотация: Введение

Язык программирования С++ был разработан на основе языка Си Бьярном Страуструпом (Bjarne Stroustrup) и вышел за пределы его исследовательской группы в начале 80-х годов. Чрезвычайная гибкость и большие возможности языка С++ обусловили применение его в самых разных областях информатики: от программирования баз данных до создания приложений, работающих с INTERNET, при изучении данного курса студенты будут создавать консольные приложения.

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

Для работы можно выбрать любой из доступных компиляторов С++ (автор использовал Tizen SDK for Linux, программы также работают и на MS Visual Studio 2015). В качестве платформы рекомендуется использовать компьютер классом не ниже Pentium.

Структура программы

Программу на языке С++ можно представить как совокупность одного или нескольких модулей — самостоятельно компилируемых файлов. Такой файл обычно содержит директивы препроцессора, а также одну или несколько функций, которые состоят из операторов языка С++. С другой стороны, программу на языке С++ можно рассматривать как совокупность следующих элементов: директив препроцессора, указаний компилятору, объявлений и определений.

специфицируют действия препроцессора по преобразованию текста программы перед компиляцией. Указания компилятору —это специальные инструкции, которым компилятор языка С++ следует во время компиляции.

Объявление переменной задает ее имя и атрибуты, а объявление функции — ее имя, тип возвращаемого значения и атрибуты ее формальных параметров.

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

Объявление типа позволяет программисту создавать собственный тип данных — точнее присвоить свое имя некоторому базовому или составному типу языка С++, что во многих случаях позволяет повысить читаемость программы. Для типа понятия объявления и определения совпадают.

Исходный файл не обязательно должен содержать выполняемые операторы. Традиционно в программах на языке С++ используются два типа файлов: файлы реализации, имеющие расширение .сpp, и заголовочные файлы (файлы интерфейса), имеющие расширение .h. В заголовочных файлах обычно располагаются именованные константы, макроопределения и объявления, а в файлах реализации — определения переменных и функций. Заголовочные файлы подключаются посредством директивы препроцессора #include.

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

Комментарии и пробелы

При составлении программы важную роль играет детальное документирование программы (степень детальности никогда не бывает излишней). Существует два способа документирования программы. Первый способ заключается во включении комментариев в текст программы. Например, символы /* открывают комментарий, а символы */ - закрывают его.

/* Комментарий — часть текста программы, предназначенная для краткой характеристики выполняемых действий или поясняющая назначение данных, которая игнорируется компилятором. */

Символы // открывают комментарий, заканчивающийся в конце той же строки.

int count; //эта переменная служит для

//подсчета числа символов в строке

Во втором случае осмысленные имена даются идентификаторам.

double radius;
int weight;
double Simpson_Integral (double delta);

Идентификаторы

Идентификаторы – это имена, которыми обозначаются переменные, константы, типы, функции и метки. Идентификаторы состоят из букв латинского алфавита, цифр и могут содержать символ подчеркивания, они могут иметь произвольное число символов, но значащими будут только первые 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. Вещественные константы всегда содержат десятичную точку и/или либо обоззначение показателя степени Е (или е) — научная нотация.
  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>
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.85, 246.5, 246.8125,  247.125, 247.4375, 247.75, 248.0625, 248.375, 248.6875, 249},
{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, 19.43, 19.4325, 19.435, 19.4375, 19.44, 19.4425, 19.445, 19.4475, 19.45},
{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.68375, 8.6775, 8.67125, 8.665, 8.65875, 8.6525, 8.64625, 8.64},
{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, 5.83125, 5.8225,   5.81375, 5.805, 5.79625, 5.7875, 5.77875, 5.77},
{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, 4.5825, 4.57375,   4.565, 4.55625, 4.5475, 4.53875, 4.53},
{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, 3.89, 3.88, 3.87, 3.86, 3.85, 3.84},
{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.47, 3.46, 3.45, 3.44, 3.43, 3.42, 3.41},
{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.18, 3.17, 3.16, 3.15, 3.14,   3.13, 3.12},
{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, 2.97, 2.96, 2.95, 2.94, 2.93,  2.92, 2.91, 2.9},
{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, 2.81, 2.8, 2.79, 2.78, 2.77, 2.76, 2.75, 2.74},
{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.68875, 2.6775, 2.66625, 2.655,   2.64375, 2.6325, 2.62125, 2.61},
{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.5875, 2.575, 2.5625, 2.55, 2.5375,  2.525, 2.5125, 2.5},
{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.49875, 2.4875, 2.47625,   2.465, 2.45375, 2.4425, 2.43125, 2.42},
{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, 2.42875, 2.4175, 2.40625, 2.395,   2.38375, 2.3725, 2.36125, 2.35},
{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, 2.3775, 2.365, 2.3525, 2.34,  2.3275, 2.315, 2.3025, 2.29},
{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, 2.31875, 2.3075, 2.29625,  2.285, 2.27375, 2.2625, 2.25125, 2.24},
{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, 2.2775, 2.265, 2.2525, 2.24, 2.2275,  2.215, 2.2025, 2.19},
{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, 2.2375, 2.225, 2.2125,  2.2, 2.1875, 2.175, 2.1625, 2.15},
{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.1975, 2.185, 2.1725,  2.16, 2.1475, 2.135, 2.1225, 2.11},
{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.1675, 2.155, 2.1425,  2.13, 2.1175, 2.105, 2.0925, 2.08},
{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.1375, 2.125, 2.1125,  2.1, 2.0875, 2.075, 2.0625, 2.05},
{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.1175, 2.105, 2.0925,  2.08, 2.0675, 2.055, 2.0425, 2.03},
{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.09625, 2.0825, 2.06875, 2.055,  2.04125, 2.0275, 2.01375, 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, 2.07625, 2.0625, 2.04875, 2.035,  2.02125, 2.0075, 1.99375, 1.98}
};

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

Знаки операций

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

[] () . -> ++ --
& * + - ~ !
sizeof / % << >> <
> <= >= == != ^
| && || ?: = =*
/= %= += -= <<= >>=
&= ^= |= , # ##

Дополнительно к перечисленным в Си++ введены:

:: .* ->* new delete typeid

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

i++; //Знак ++ - это унарная операция инкремента

c=a*b; //Знак * - обозначает умножение операндов

//(бинарная операция).

Рассмотрим некоторые наиболее часто встречающиеся при решении задач операции.

Унарные операции
& операция получения адреса операнда;
* операция обращения по адресу (double *a=&b);
- унарный минус - изменяет знак арифметического операнда;
+ унарный плюс (введен для симметрии с унарным минусом);
++ увеличение на единицу (инкремент или автоувеличение)
-- уменьшение на единицу (декремент или автоуменьшение)
sizeof операция вычисления размера (в байтах) для объекта того типа, который имеет операнд. Разрешены два формата операции: sizeof унарное выражение и sizeof(тип).

Бинарные операции

Таблица 3.2.
Аддитивные операции
+ бинарный плюс (сложение арифметических операндов) 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 присваивается значение a*3.5.

//==========================================================
// Name        : First.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {

	double a;//Объявляем переменную a в формате
	         //с плавающей запятой двойной точности
	a=12.3;  //Присваиваем переменной a значение 12.3

	double b=a*3.5;

	/*
	объявляем переменную b и одновременно инициализируем ее значением a*3.5
	*/
	cout << "a =" <<a<<", b = "<<b<< endl;

	return 0;
}
a =12.3, b = 43.05

Рассмотрим нашу первую программу поподробнее. В начале программы расположены комментарии, отделенные значками // и /* */. Далее следует главная функция (main). С функциями подробно мы познакомимся чуть позже, а сейчас отметим, что слово void означает, что функция не возвращает ни какого значения, а пустые скобки ( ) говорят нам о том, что функция не получает значений извне. После названия функции следует тело функции, заключенное в фигурные скобки {} Переменные, инициализированные до функции main являются глобальными, т.е. они доступны во всех частях программы.

Для того, чтобы вывести результат на экран мы должны подключить стандартную библиотеку ввода вывода iostream.h (input-output stream поток ввода-вывода).

Эта библиотека дает нам возможность как вводить числа с помощью оператора cin (c in - ввод в Си), так и выводить их с помощью оператора cout (c out - вывод из Си).

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

//==========================================================
// Name        : input_output.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	int a;
	cout<<"\nInput integer number, a = ";
	cin>>a;
	double b=a/4;
	cout<<"\nb = "<<b<<endl;
	return 0;
}

После запуска программы появляется сообщение:

Input integer number, a = 9
b = 2

Синтаксис оператора ввода виден из примера, приведенного в программе: сначала пишется cin, затем правые двойные угловые скобки >>, после чего указывается переменная которую нужно ввести, далее – точка с запятой.

Рассмотрим использование оператора вывода. В начале пишется слово cout, затем левые двойные угловые скобки <<. Если после скобок указать переменну, например, так: cout<<a; то программа выведет на экран значение этой переменной. Если после выражения cout<< поместить фразу в кавычках, на экране появится данное сообщение: cout<<"Hi! My name is Marat!"; Если мы хотим, чтобы фраза начиналась с новой строки, после кавычек должны вставить \n: cout<<"\nWhat is your name?"; Для того, чтобы после сообщения курсор перешел на следующую строку, в конце операторы вывода пишется <<endl; (cout<<"\nHow old are you?"<<endl;). В одной строке можно разместить несколько сообщений, для этого их нужно разделить левыми угловыми скобками.

//==========================================================
// Name        : Name.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
/*Директива препроцессора (для ввода-вывода)*/
using namespace std;

int main() {
	char name[]="Marat";
	//Строка в виде массива символов
	cout<<"\nMy name is "<<name<<endl;
	return 0;
}
My name is Marat

Познакомимся поближе с операторами присваивания

//==========================================================
// Name        : statments.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
/*В этой программе вы поближе познакомитесь с работой операторов присваивания*/
#include <iostream>
using namespace std;

//Определим две переменные
//Т.к. они стоят перед главной функцией,
//значит они доступны во всех частях программы,
//(эти переменные - глобальные)
double e =2.7182818284590452354;
double pi=3.1415926535897932385;

int main() {

	cout<<"\ne =  "<<e;
	cout<<"\npi = "<<pi;

	double a=e+pi;//Объявляем переменную a и
	              //присваиваем ему сумму pi и e
	cout<<"\ne + pi = "<<a;

	double b=pi; //Инициализируем переменную
	             //b значением pi
	cout<<"\nb = "<<b;

	b*=e;         //То же самое, что b=b*e
	cout<<"\nb*=e,  "<<"b = "<<b;

	b=pi;
	b/=e;         //То же самое, что b=b/e
	cout<<"\nb/=e,  "<<"b = "<<b;

	//Определим два целых числа
	int x=15;
	int y=2;
	cout<<"\nx = "<<x<<", y = "<<y;
	//Найдем остаток от деления
	x%=y;         //То же самое, что x=x%y
	cout<<"\nx%=y,  "<<"x = "<<x;

	//Найдем частное от целочисленного деления
	x=15;
	x/=y;
	cout<<"\nx/=y,  "<<"x = "<<x;

	b=pi;
	b+=e; //То же самое, что b=b+e
	cout<<"\nb+=e,  "<<"b = "<<b;

	b=pi;
	b-=e; //То же самое, что b=b-e
	cout<<"\nb-=e,  "<<"b = "<<b;
	/*Запятая в качестве операции. Несколько выражений, разделенных запятыми, вычисляются последовательно слева направо */
	int d;
	cout<<"\nExpression of d=4, d*2 is "<<(d=4,d*2);
	cout<<", d is "<<d;
	cout<<"\n"<<endl;
	return 0;
}
e  = 2.71828
pi = 3.14159
e + pi = 8.85987
b  = 3.14159
b*=e, b=8.53973
b/=e, b=1.15573
x=15, y=2
x%=y, x=1
x/=y, x=7
b+=e, b=8.85987
b-=e, b=0.423311
Expression of d=4, d*2 is 8, d is 4
Лекция 1 || Лекция 2 >
Зося Ковалева
Зося Ковалева

Хочу получить удостоверение. Сколько стоит оплата?