© 2024 Ольшевский Андрей Георгиевич репетитор по программированию на С++ и других языках программирования, искусственному интеллекту, информатике, математике, физике, техническим дисциплинам по Скайп da.irk.ru

Сайт super-code.ru с полезными темами, которые вы можете сохранить бесплатно


Программирование на языке С++

Оглавление

1 Введение 4

2 Среда для выполнения программы на языке С++ 5

3 Самая простая программа на языке С++ 6

4 Комментарии 8

5 Обработка строк на русском языке 9

6 Типы данных 9

7 Переменные в языке С++ 14

7.1 Явное преобразование типов 15

Репетитор по С, С++

8 Неявное преобразование типов 16

9 Преобразование типов без потери информации 17

10 Арифметические операции, объединение строк 17

11 Инкремент и декремент 19

11.1 Инкремент 19

11.2 Декремент 20

12 Условный оператор if 21

12.1 Сокращенная конструкция оператора if 21

12.2 Логические выражения 22

12.3 Проверка на четность 22

12.4 Оператор if – else if 23

12.5 Оператор if - else 25

13 Циклы 27

13.1 Цикл for 27

13.2 Цикл while 30

13.3 Цикл do while 32

14 Операторы break и continue 34

15 Массивы 35

15.1 Одномерный массив 35

16 Сортировка одномерного массива по неубыванию и по невозрастанию 40

17 Динамический массив 44

18 Двумерный динамический массив 45

19 Функции в С++ 45

19.1 Передача параметров в функцию 48

20 Перегрузка функций в С++ 50

21 Функции. Параметры по умолчанию в С++ 51

22 Функция вычисления факториала 52

23 Ввод-вывод в файлы 53

23.1 Определение конца файла с помощью функции eof() 56

24 Стандартные функции 58

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

25 Преобразование типа сhar в тип wchar_t, чтобы затем преобразовать в тип String^ 58

26 Список использованных источников 58


1 Введение

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

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

Язык программирования позволяет отдавать команды, составлять программы, управляющие роботами, «общаться с роботами».

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

Язык программирования Си и Си-подобные языки являются лучшими языками программирования в настоящее время. Язык С++ и Си-подобные языки базируются на языке Си. Язык Си является базой и полностью входит в язык С++. Язык С++ создан как язык, развивающий Си в направлении объектно-ориентированного программирования. Существует множество Си-подобных языков, также базирующихся на языке Си и схожих с языком Си: С++, Java, JavaScript, php, C#, Objective-C и многие другие языки программирования, всего около 15-ти Си-подобных языков.

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

Приведем примеры из истории успешной постановки целей по написанию программ. Например, Билл Гейтс является родоначальником написания операционной системы Windows, написанной на языке С++. Билл Гейтс в настоящее время является одним из самых богатых людей в мире.

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

В среднем Билл Гейтс и Джефф Безос зарабатывали по 1 миллиону долларов в каждый час!

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

- для написания программ, работающих на компьютерах под управлением Windows или в операционной системе Linux;

- для программирования роботов;

- Web-программирование, например, Телеграмм написана на языке C++;

- для учебы, получения высоких баллов на ОГЭ, ЕГЭ и поступления на бюджет;

- участие и победы в олимпиадах по информатике;

- для развития интеллекта;

- для изучения английского языка.

2 Среда для выполнения программы на языке С++

В поисковике можно набрать запрос «С++ онлайн» и появится несколько ссылок на онлайн компиляторы языка С++. Например, на языке С++ вставьте программный код в поле ниже main.cpp на сайте https://www.onlinegdb.com/online_c++_compiler

и нажмите вверху зеленую кнопку Run. Ниже появится результат выполнения программы.

Microsoft Visual Studio можно скачать по ссылке https://visualstudio.microsoft.com/ru/

Версия Community может использоваться бесплатно.

3 Самая простая программа на языке С++

Простая исполняемая программа на языке С++, отображающая в консоли сообщение "Hello, World!":

#include <iostream>


int main()

{

std::cout << "Hello World!\n";

}

Строка

#include <iostream>

подключает библиотеку функций для ввода-вывода информации на экран. include [ɪnˈkluːd] — включать.

Перед именем функции main указан тип возвращаемого операционной системе значения, поэтому предполагается возврат операционной системе целого значения (int). Тип int – это сокращение от английского слова integer – целый. В стандарте C11 (2011 год) языка Си необходимо перед именем main указывать тип int, возвращающий операционной системе целое число, являющееся результатом работы программы.

Разберем состав этой простейшей программы, все элементы которой должны присутствовать в любой программе на языке С++. Главная или основная программа выполняется в первую очередь и носит имя main, написанное строчными (маленькими) буквами (main [meɪn] - главный). Язык С++ различает прописные (большие) и строчные (маленькие) буквы. В круглых скобках после имени главной программы main() могут перечисляться параметры, передаваемые в программу, но в данную программу параметры не передаются и в скобках ничего не указывается main().

В блоке между фигурными скобками { } можно написать код программы main. Данную программу можно откомпилировать и создать исполняемый exe файл (сокращение от английского execute [ˈeksɪkjuːt] - выполнять).

Если программа завершилась успешно, то операционной системе возвращается целое число 0. Если при выполнении программы возникли ошибки, то 0 операционной системе не возвращается и операционная система по возвращенному целому числу получает информацию о наличии ошибок в программе. В конце программы main можно указать возвращение целого значения 0 при помощи оператора return 0; return [rɪˈtɜːn] – вернуть в переводе с английского. Каждая команда, оператор (от английского operate - работать) на С++ завершается точкой с запятой (;). Добавим оператор return 0 в прежнюю программу:

#include <iostream>


int main()

{

std::cout << "Hello World!\n";

return 0;

}

Чтобы постоянно не писать std:: можно использовать стандартное пространство имен, добавив using namespace std; Получим простой программный код:

#include <iostream> //Для ввода, вывода

using namespace std;


int main()

{

cout << "Hello World!\n";

}

Название библиотеки iostream составлено следующим образом:

i — первая буква английского слова input [ˈɪnpʊt] — ввод;

o — первая буква английского слова output [ˈaʊtpʊt] — вывод

stream [striːm] — поток.

std:: указывает на использование стандартного пространства имен. Обычно в начале программы указывается строка:

using namespace std; // использование стандартного пространства имен

Можно перевести iostream как поток ввода вывода. Библиотека iostream подключается #include <iostream> содержит функции, предназначенные для ввода и вывода информации.

Название встроенной функции cout составлено следующим образом:

c — первая буква английского слова console [kənˈsəʊl] — консоль;

out — первые буквы английского слова output [ˈaʊtpʊt] — вывод.

В строке программного кода

cout << "Hello World!\n";

после встроенной функции cout два знака <<, указывающие направление передачи информации для отображения на консоли. Следом следует выводимое предложение Hello World! в кавычках. Далее в кавычках следуют служебные знаки \n, указывающие на то, что будет произведен перевод на следующую строку (в механической печатающей машинке этому соответствовал перевод каретки в начало следующей строки).

Перевод на следующую строку можно осуществить и при помощи команды endl:

#include <iostream>

using namespace std;


int main()

{

cout << "Hello World!" << endl;

}

Название встроенной функции cin составлено следующим образом:

c — первая буква английского слова console [kənˈsəʊl] — консоль;

inпервые буквы английского слова input [ˈɪnpʊt] — ввод.

4 Комментарии

Комментарии пишутся для людей, но компьютерная программа комментарии не читает и не отображает в результатах работы программы. Комментарии в Си-подобных программах, в том числе и в С++:

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

Многострочный комментарий:

/*

Многострочный

комментарий

*/

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

Программа ниже выполнится, но ничего не выведет на экран

#include <iostream>

using namespace std;


int main()

{

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

/*

Многострочный

комментарий

*/

return 0;

}

5 Обработка строк на русском языке

Русский язык. locale [ləʊˈkɑːl] - место действия, языковой стандарт. set [set] - ставить, поставить, установить, задать. all [ɔːl] – все. Russian [rʌʃn] - русский язык.

#include <iostream>

#include <locale.h> //для русского языка

using namespace std;


int main() {

setlocale(LC_ALL, "russian"); //для русского языка

cout << "Можно программировать строки на русском языке";

return 0;

}

6 Типы данных

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

Базовые типы в языке С++:

void – без значения (сокращение от английского слова void [vɔɪd] - пустота).

Целые базовые типы в языке С++:

char – символ (сокращение от английского слова character [ˈkærɪktə] - символ);

shortкороткое целое число (short [ʃɔːt] — короткий);

int – целое число (сокращение от английского слова integer [ˈɪntɪʤə] - целое число);

longдлинное целое число (long [lɒŋ] — длинный);

long longболее длинное целое число;

Например, объявим переменную a типа int:

int a;

После такого объявления переменная a захватывает произвольную информацию из памяти, поэтому если начать переменную a использовать в программе, то можно получить непредсказуемый результат. Или программа даже не запуститься с указанием на эту ошибку. Например, при запуске программы:

#include <iostream>

using namespace std;


int main() {

int a;

cout << a;

return 0;

}

Visual Studio выдает сообщение об ошике:

использована неинициализированная локальная переменная "a"

Поэтому перед использованием переменной, ее необходимо инициализировать (придать начальное значение), например, так:

int a = 73;

Целые типы без знаков (неотрицательные) способны хранить примерно в 2 раза большие значения положительных чисел, они имеют в начале слово

unsigned [ʌnˈsaɪnd] - без знака в переводе с английского.

unsigned char – символьный тип без знака;

unsigned shortкороткое целое число без знака;

unsigned int – целое число без знака;

unsigned longдлинное целое число без знака;

unsigned long long — более длинное целое число без знака;

Базовые типы с плавающей точкой в языке С++:

float – число с плавающей точкой одинарной точности (сокращение от английского слова float [fləʊt] - плавать);

double – число с плавающей точкой двойной точности (сокращение от английского слова double [dʌbl] - двойной);

long doubleболее длинное число, чем типа double.

Целые типы без знаков имеют в начале:

unsigned [ʌnˈsaɪnd] - без знака в переводе с английского.

Функция sizeof() позволяет определить размер типа данных в байтах. Для определения максимального значения переменной этого типа в байтах надо байты перевести в биты, умножив на 8, а затем 2 возвести в степень с показателем, равным полученному числу. Строка программного кода, позволяющая вывести максимальное значение переменной типа long long в байтах:

cout << pow(2,sizeof(long long)*8) << endl;

Программа:

#include <iostream> //Для ввода, вывода

#include <locale.h> //Для русского языка

#include <limits.h> //Для CHAR_MIN… или #include <climits>

#include <float.h> //Для FLT_MIN...

using namespace std;


int main()

{

setlocale(LC_ALL, "russian"); //для русского языка

cout << "Размеры переменных целого типа в байтах" << endl;

cout << "sizeof(char) = " << sizeof(char) << endl;

cout << "sizeof(short) = " << sizeof(short) << endl;

cout << "sizeof(int) = " << sizeof(int) << endl;

cout << "sizeof(long) = " << sizeof(long) << endl;

cout << "sizeof(long long) = " << sizeof(long long) << endl;

cout << "Размеры переменных целого типа без знака (unsigned) в байтах" << endl;

cout << "sizeof(unsigned char) = " << sizeof(unsigned char) << endl;

cout << "sizeof(unsigned short) = " << sizeof(unsigned short) << endl;

cout << "sizeof(unsigned int) = " << sizeof(unsigned int) << endl;

cout << "sizeof(unsigned long) = " << sizeof(unsigned long) << endl;

cout << "sizeof(unsigned long long) = " << sizeof(unsigned long long) << endl;

cout << "Размеры переменных вещественного типа с плавающей точкой в байтах\n";

cout << "sizeof(float) = " << sizeof(float) << endl;

cout << "sizeof(double) = " << sizeof(double) << endl;

cout << "sizeof(long double) = " << sizeof(long double) << endl;

cout << "Минимальные и максимальные значения переменных целого типа в байтах" << endl;

cout << "minimum char = " << CHAR_MIN << endl;

cout << "maximum char = " << CHAR_MAX << endl;

cout << "minimum short = " << SHRT_MIN << endl;

cout << "maximum short = " << SHRT_MAX << endl;

cout << "minimum int = " << INT_MIN << endl;

cout << "maximum int = " << INT_MAX << endl;

cout << "minimum long = " << LONG_MIN << endl;

cout << "maximum long = " << LONG_MAX << endl;

cout << "minimum long long = " << LLONG_MIN << endl;

cout << "maximum long long = " << LLONG_MAX << endl;

cout << "Максимальные значения переменных целого типа без знака в байтах\n";

cout << "maximum unsigned char = " << UCHAR_MAX << endl;

cout << "maximum unsigned short = " << USHRT_MAX << endl;

cout << "maximum unsigned int = " << UINT_MAX << endl;

cout << "maximum unsigned long = " << ULONG_MAX << endl;

cout << "maximum unsigned long long = " << ULLONG_MAX << endl;

cout << "Минимальные и максимальные положительные значения чисел с плавающей точкой в байтах\n";

cout << "minimum float = " << FLT_MIN << endl;

cout << "maximum float = " << FLT_MAX << endl;

cout << "minimum double = " << DBL_MIN << endl;

cout << "maximum double = " << DBL_MAX << endl;

cout << "minimum long double = " << LDBL_MIN << endl;

cout << "maximum long double = " << LDBL_MAX << endl;

cout << "Число типа double может быть больше числа типа float в "

<< DBL_MAX / FLT_MAX << " раз" << endl;

return 0;

}

Выведет:

Размеры переменных целого типа в байтах

sizeof(char) = 1

sizeof(short) = 2

sizeof(int) = 4

sizeof(long) = 4

sizeof(long long) = 8

Размеры переменных целого типа без знака (unsigned) в байтах

sizeof(unsigned char) = 1

sizeof(unsigned short) = 2

sizeof(unsigned int) = 4

sizeof(unsigned long) = 4

sizeof(unsigned long long) = 8

Размеры переменных вещественного типа с плавающей точкой в байтах

sizeof(float) = 4

sizeof(double) = 8

sizeof(long double) = 8

Минимальные и максимальные значения переменных целого типа в байтах

minimum char = -128

maximum char = 127

minimum short = -32768

maximum short = 32767

minimum int = -2147483648

maximum int = 2147483647

minimum long = -2147483648

maximum long = 2147483647

minimum long long = -9223372036854775808

maximum long long = 9223372036854775807

Максимальные значения переменных целого типа без знака в байтах

maximum unsigned char = 255

maximum unsigned short = 65535

maximum unsigned int = 4294967295

maximum unsigned long = 4294967295

maximum unsigned long long = 18446744073709551615

Минимальные и максимальные положительные значения чисел с плавающей точкой в байтах

minimum float = 1.17549e-38

maximum float = 3.40282e+38

minimum double = 2.22507e-308

maximum double = 1.79769e+308

minimum long double = 2.22507e-308

maximum long double = 1.79769e+308

Число типа double может быть больше числа типа float в 5.28295e+269 раз

7 Переменные в языке С++

Переменные в программе на языке С++ обязательно начинаются с латинской буквы, знака нижнего подчеркивания _, которые могут быть единственными. Переменные могут содержать не на первом месте цифры. Например, переменная a или a_, или a5_, или _a, или даже _, но переменную в виде нижнего подчеркивания _ желательно не использовать в качестве переменной в виде единственного символа _. Принято считать, что переменная, начинающаяся с нижнего подчеркивания _ является локальной, а не глобальной переменной. На первом месте не может стоять цифра в имени переменной, например, 3a, так как эта ошибка не позволит даже запустить программу.

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

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

Для объявления целочисленной переменной iS используется оператор:

int iS;

Объявление целочисленных переменных iS и n производится перечислением через запятую после объявления типа int:

int iS, n;

Объявление целочисленных переменных iS, _ и n с их одновременной инициализацией:

int iS = 0, _ = 7, n = 1;

В результате выполнения программы

#include <iostream>

using namespace std;


int main()

{

int a_ = 7, a5_ = 3, _a = 5, _ = 8;

cout << a_ << a5_ << _a << _;

return 0;

}

на экран будет выведено 7358.

7.1 Явное преобразование типов

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

Если объявлена целочисленная переменная a

int a;

то преобразуем переменную b в целочисленный тип явно и присвоим полученное значение целой переменной a

a = (int) b;

Если объявлена переменная a типа float

float a;

то преобразуем переменную b явно в число с плавающей точкой одинарной точности и присвоим полученное значение переменной a типа float

a = (float) b;

Если объявлена переменная a типа double

double a;

то преобразуем переменную b явно в число с плавающей точкой двойной точности и присвоим полученное значение переменной a типа double

a = (double) b;

8 Неявное преобразование типов

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

#include <iostream>

using namespace std;

int main()
{
int a, b;
double c;
a = b = c = 0.5;
cout << a << endl; // a = 0
cout << b << endl; // b = 0
cout << c << endl; // c = 0.5

return 0;
}

9 Преобразование типов без потери информации

Без потери информации происходит явное и неявное преобразование типов в направлении типов, требующих больший объем памяти в следующих последовательностях преобразований.

Для целых типов:

char → short → int → long → long long

Для целых типов без знаков:

unsigned char → unsigned short → unsigned int → unsigned long →

unsigned long long

Для вещественных чисел с плавающей точкой:

float → double → long double

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

10 Арифметические операции, объединение строк

Арифметические операции на С++ подобны математическим арифметическим операциям:

#include <iostream>

using namespace std;


int main() {

int a = 3, b = 8, c;

c = a + b;

cout << c; // выведет 11

return 0;

}

Программный код с математическими операциями:

#include <iostream>

using namespace std;


int main()

{

int a, b;

a = 3;

b = 2;

a = a + b; // в памяти a = 5

a = a - b; // в памяти a = 3

a = a * b; // в памяти a = 6

a = a / b; // в памяти a = 3

cout << a; // выведет 3

return 0;

}

Остаток от деления получается в результате использования оператора %, например:

int a, b;

a = 3;

b = 2;

a = a % b; // в памяти a = 1

Объединение строк (string concatenation [strɪŋ kɒnkætɪˈneɪʃn] - конкатенация строк) в С++ как и во многих языках программирования осуществляется при помощи +

#include <iostream>

using namespace std;


int main()

{

string a, b; //string [strɪŋ] - строка

a = "string";

b = "concatenation";//concatenation [kɒnkætɪˈneɪʃn] - сцепление

a = a + " " + b; //Объединяются 3 строки: a, строка ' ', b

cout << a; //выведет: string concatenation

return 0;

}

Действия, указанные выше можно записать короче равносильными действиями

a += b; //Действие равносильно a = a + b;

a -= b; //Действие равносильно a = a - b;

a *= b; //Действие равносильно a = a * b;

a /= b; //Действие равносильно a = a / b;

a = "String";

a += " concatenation";//Равносильно a = "Объединение" + " строк";

Вышеприведенную программу напишем в сокращенном виде в части арифметических операций:

#include <iostream>

using namespace std;


int main() {

int a, b;

a = 3;

b = 2;

a += b; // в памяти a = 5

a -= b; // в памяти a = 3

a *= b; // в памяти a = 6

a /= b; // в памяти a = 3

cout << a; // выведет 3

return 0;

}

Вышеприведенное объединение строк также запишем короче

#include <iostream>

using namespace std;


int main() {

string a, b; //string [strɪŋ] - строка

a = "String";

b = "concatenation";//concatenation [kɒnkætɪˈneɪʃn] - сцепление

a += " " + b; //Объединяются 3 строки: a, строка ' ', b

cout << a; //выведет: String concatenation

return 0;

}

11 Инкремент и декремент

11.1 Инкремент

Инкремент увеличивает переменную на 1, например:

a++;

++a;

Если в выражении ++ после переменной a++ (постфиксная форма), то переменная a сначала используется в этом выражении, а потом сразу после этого выражения, значение переменной a увеличивается на 1. Например

#include <iostream>

using namespace std;


int main() {

int a = 4;

cout << "a++ = " << a++ << endl; //Выведет: a++ = 4

cout << "a = " << a; //Выведет: a = 5

return 0;

}

Если в выражении ++ перед переменной ++a (префиксная форма), то переменная сразу в выражении увеличивается на 1. Например:

int a = 4;

cout << "++a = " << ++a << endl; //Выведет: ++a = 5

cout << "a = " << a; //Выведет: a = 5

Одновременное использование постфиксной и префиксной форм инкремента:

int a = 4;

cout << "a++ = " << a++ << endl; //Выведет: a++ = 4

cout << "a = " << a << endl; //Выведет: a = 5

cout << "++a = " << ++a << endl; //Выведет: ++a = 6

cout << "a = " << a; //Выведет: a = 6

11.2 Декремент

Декремент уменьшает переменную на 1, например:

a--;

--a;

Если в выражении -- после переменной a-- (постфиксная форма), то переменная a сначала используется в этом выражении, а потом сразу после этого выражения, значение переменной a уменьшается на 1. Например

#include <iostream>

using namespace std;


int main() {

int a = 4;

cout << "a-- = " << a-- << endl; //Выведет: a-- = 4

cout << "a = " << a; //Выведет: a = 3

return 0;

}

Если в выражении -- перед переменной --a (префиксная форма), то переменная сразу в выражении уменьшается на 1. Например:

int a = 4;

cout << "--a = " << --a << endl; //Выведет: --a = 3

cout << "a = " << a; //Выведет: a = 3

Одновременное использование постфиксной и префиксной форм декремента:

int a = 4;

cout << "a-- = " << a-- << endl; //Выведет: a-- = 4

cout << "a = " << a << endl; //Выведет: a = 3

cout << "--a = " << --a << endl; //Выведет: --a = 2

cout << "a = " << a; //Выведет: a = 2

12 Условный оператор if

Оператор if относится к операторам ветвления, позволяющим заложить какую-то логику в программу, например, в области искусственного интеллекта. То есть научить компьютер мыслить!

12.1 Сокращенная конструкция оператора if

Оператор if проверяет истинность логического выражения в скобках и в случае истинности логического выражения выполняется блок операторов в фигурных скобках после оператора if. if [ɪf] – если в переводе с английского.

Синтаксис сокращенного вида оператора if

if (логическое выражение)

{

блок операторов;

выполняемых при истинности;

логического выражения;

}

Если в результате истинности логического выражения необходимо выполнить один оператор, то фигурные скобки можно не ставить

if (логическое выражение)

оператор при истинности логического выражения;

Единственный оператор можно записать в одной строке с if

if (логическое выражение) оператор;

Ниже примеры к приведенным выше описаниям сокращенного вида оператора if

Синтаксис сокращенного вида оператора if

if (true)

{

cout << "Данное сообщение будет выведено всегда, ";

cout << "true значит Истина при проверке выражения";

}

Если в результате истинности логического выражения необходимо выполнить один оператор, то фигурные скобки можно не ставить

if (1)

cout << "Сообщит всегда, так как 1 значит true";

Единственный оператор можно записать в одной строке с if

if (0) cout << "0 значит Ложь или false, поэтому не сообщит";

12.2 Логические выражения

Возможные логические выражения, которые могут быть в условии, например, оператора if (логическое выражение). В логических выражениях могут использоваться операции сравнения

a == b Два знака == позволяют проверить равенство a и b

a != b a не равно b

a < b a меньше b

a > b a больше b

a <= b a меньше или равно b

a >= b a больше или равно b

12.3 Проверка на четность

int n = 4;

if (n % 2 == 0) cout << n << " четно";

Проверка на нечетность

if (n % 2 != 0) cout << n << " нечетно";

или проверка на нечетность

if (n % 2 == 1) cout << n << " нечетно";

Например, программа

#include <iostream>

using namespace std;


int main() {

int n = 4;

//Проверка на четность

if (n % 2 == 0) cout << n << " четное число" << endl;

//Проверка на нечетность

if (n % 2 != 0) cout << n << " нечетное число" << endl;

//или проверка на нечетность

if (n % 2 == 1) cout << n << " нечетное число" << endl;

return 0;

}

выведет: 4 четное число.

А программа

#include <iostream>

using namespace std;


int main() {

int n = 7;

//Проверка на четность

if (n % 2 == 0) cout << n << " четное число" << endl;

//Проверка на нечетность

if (n % 2 != 0) cout << n << " нечетное число" << endl;

//или проверка на нечетность

if (n % 2 == 1) cout << n << " нечетное число" << endl;

return 0;

}

выведет дважды:

7 нечетное число

7 нечетное число

12.4 Оператор if – else if

Оператор if проверяет истинность логического выражения в скобках и в случае истинности этого логического выражения выполняется блок операторов после оператора if, а операторы else if игнорируются. В переводе с английского else [els] – иначе, else if – иначе, если.

Если логическое выражение после if ложно, то проверяется следующее после else if логическое выражение, в случае истинности которого выполняется блок операторов после оператора else if.

Синтаксис оператора if – else if

if (логическое_выражение_if) {

блок операторов, выполняемых

при истинности логического выражения

}

else if (логическое_выражение_else_if) {

блок операторов, выполняемых

при ложности логическое_выражение_if, но

истинности логическое_выражение_else_if

}

Единственный оператор можно записать в одной строке с if или else if

if (логическое_выражение) оператор;

else if (логическое_выражение) оператор;

Примеры:

#include <iostream>

#include <locale.h> // для русского языка

using namespace std;


int main() {

setlocale(LC_ALL, "russian");


short a = 4;

if (a) cout << "Выведет, так как a > 0 считается истиной";

else if (a > 3) cout << "if истинно и else if пропустит";


return 0;

}

Ниже примеры к приведенным выше описаниям оператора if-elif

if (0) {

cout << "Данное сообщение не будет выведено, ";

cout << "так как 0 значит Ложь или false";

}

else if (100) {

cout << "Данное сообщение будет выведено, ";

cout << "так как 100 > 0 значит Истина или true";

}

12.5 Оператор if - else

Оператор if-else проверяет истинность логического выражения и в случае истинности логического выражения выполняется блок операторов в фигурных скобках после оператора if. Если логическое выражение ложно, то выполняется блок операторов после else.

Синтаксис оператора if-else

if (логическое выражение)

{

блок операторов,

выполняемых при истинности логического выражения;

}

else

{

блок операторов,

выполняемых при ложности логического выражения;

}

Если в результате истинности или ложности логического выражения необходимо выполнить один оператор, то фигурные скобки можно не ставить

if (логическое выражение)

единственный оператор при истинности логического выражения;

else

единственный оператор при ложности логического выражения;

Единственный оператор можно записать в одной строке с if или else

if (логическое выражение) один оператор при истинности;

else один оператор при ложности логического выражения;

Ниже примеры к приведенным выше описаниям оператора if-else

#include <iostream>

#include <locale.h> //для русского языка

using namespace std;


int main() {

setlocale(LC_ALL, "russian"); //для русского языка

if (1)

{

cout << "Данное сообщение будет выведено всегда, ";

cout << "так как 1 значит true [truː] - истина";

}

else

{

cout << "Данное сообщение никогда не появится, ";

cout << "так как 1 значит true [truː] - истина";

}

return 0;

}

При ложности логического выражения:

#include <iostream>

#include <locale.h> //для русского языка

using namespace std;


int main() {

setlocale(LC_ALL, "russian"); //для русского языка


int number = 23;

if (number == 27)

{

cout << "Данное сообщение не будет выведено, ";

cout << "так как number не равно 27";

}

else

{

cout << "Данное сообщение появится, ";

cout << "так как ложно логическое выражение";

}


return 0;

}

Если в результате истинности логического выражения необходимо выполнить один оператор, то фигурные скобки можно не ставить

if (1)

cout << "Всегда сообщит, так как 1 значит true";

else

cout << "Данное сообщение никогда не появится!";

Единственный оператор можно записать в одной строке с if:

#include <iostream>

#include <locale.h> //для русского языка

using namespace std;


int main() {

setlocale(LC_ALL, "russian"); //для русского языка


int number = 23;

if (number > 27) cout << "Данное сообщение не будет выведено";

else cout << "Данное сообщение появится";


return 0;

}

Еще пример, в котором 0 просто для наглядности:

if (0) cout << "0 значит false [fɔːls] - ложь, сообщения не будет";

else cout << "Логическое выражение ложно, всегда выведет!";

13 Циклы

Циклы позволяют повторять (итерировать) какой-то набор инструкций заданное или бесконечное число раз (итераций)!

13.1 Цикл for

for [fɔː] - для, в течение в переводе с английского. Синтаксис цикла for:

for (ИНИЦИАЛИЗАЦИЯ; УСЛОВИЕ; ИЗМЕНЕНИЕ)

{

код цикла из одного;

или нескольких операторов;

}

где ИНИЦИАЛИЗАЦИЯ перед входом в цикл начальных значений управляющих переменных цикла (счетчика);

УСЛОВИЕ — логическое выражение, проверяемое на истинность всякий раз для итерации цикла; если логическое выражение ложно, то цикл не начинается или прекращается;

ИЗМЕНЕНИЕ — инкремент или декремент счетчика (управляющих переменных) после очередной итерацией цикла, за которой вновь проверяется истинность УСЛОВИЯ.

Если программный код цикла содержит лишь один оператор, то фигурные скобки {} для выделения блока операторов могут отсутствовать

for (ИНИЦИАЛИЗАЦИЯ; УСЛОВИЕ; ИЗМЕНЕНИЕ)

код цикла из одного оператора;

Единственный оператор может быть в одной строке с for

for (ИНИЦИАЛИЗАЦИЯ; УСЛОВИЕ; ИЗМЕНЕНИЕ) оператор;

Пример цикла for, в котором тип управляющей переменной цикла объявляется непосредственно в круглых скобках цикла for

#include <iostream>

using namespace std;


int main() {

for (int i = 0; i < 10; i++)

cout << i; //Выведет: 0123456789

return 0;

}

Этот цикл выполняется в следующей последовательности:

1. Объявляется целочисленная управляющая переменная цикла i, которая инициализируется значением 0.

2. 0 < 10, поэтому происходит одна итерация цикла.

3. После выполнения инструкции цикла (cout << i;) управляющая переменная цикла i увеличивается на 1.

4. 1 < 10, поэтому происходит очередная итерация цикла и т.д.

5. Как только i становится равным 10 выполнение цикла прекращается.

Пример этого цикла for в двух строках

for (int i = 0; i < 10; i++)

cout << i; //Выведет: 0123456789

Тип управляющей переменной цикла можно объявить выше цикла for

#include <iostream>

using namespace std;


int main() {

int i;

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

cout << i; //Выведет: 0123456789

return 0;

}

Бесконечный цикл for

for (;;)

{

Блок бесконечно выполняемых операторов;

}

Пример бесконечного цикла:

#include <iostream>

using namespace std;


int main() {

//infinitely [ˈɪnfɪnɪtlɪ] - бесконечно

for (;;) cout << "infinitely\n";

return 0;

}

Прерывание бесконечного цикла for зачастую осуществляется с помощью оператора прерывания всех циклов break после проверки условия if

for (;;)

{

Блок выполняемых операторов;

if (условие) break;

}

Пример бесконечного цикла for

int i = 0;

for (;;)

{

cout << i; //Выведет: 0123456789

i++;

if (i == 10) break;

}

Еще пример бесконечного цикла for

#include <iostream>

using namespace std;


int main() {

int i = 0;

for (;;)

{

cout << i << " ";

i++;

if (i == 100) break;

}

return 0;

}

Будет выведено в одну строку:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

13.2 Цикл while

Цикл while (в переводе с английского «пока») имеет общий вид

while (условное выражение)

{

код цикла;

}

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

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

while (условное выражение) инструкция;

Пример цикла while

#include <iostream>

using namespace std;


int main() {

int i = 0;

while (i < 10)

{

cout << i; //Выведет: 0123456789

i++;

}

return 0;

}

Бесконечный цикл while, если выражение истинно или вместо выражения написать 1, или true [truː] - истина

while (true)

{

Блок бесконечно выполняемых операторов;

}

Прерывание бесконечного цикла while зачастую осуществляется с помощью оператора прерывания всех циклов break после проверки условия if

while (1)

{

Блок выполняемых операторов;

if (условие) break;

}

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

#include <iostream>

using namespace std;


int main() {

int i = 0;

while (true)

{

cout << i++; //Выведет: 0123456789

if (i == 10) break;

}

return 0;

}

Еще пример бесконечного цикла for

int i = 0;

while (true)

{

cout << i++ << " ";

if (i > 100) break;

}

Будет выведено:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

13.3 Цикл do while

Цикл do-while сразу выполняется хотя бы 1 раз и после цикла проверяется условие. Если проверка истинности выражения цикла while происходит до выполнения тела цикла, то в цикле do-while эта проверка осуществляется сразу после выполнения кода цикла. Цикл do-while имеет общий вид:

do

{

код цикла;

} while (условное выражение);

Цикл do-while можно записать в одну строку:

do { код цикла; } while (условное выражение);

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

Пример цикла do while

#include <iostream>

using namespace std;


int main()

{

int i = 0;

do

{

cout << i++; //Выведет: 0123456789

} while (i < 10);

}

При единственном операторе фигурные скобки можно исключить:

do

программный код цикла;

while (условное выражение);

Например:

int i = 0;

do

cout << i++; //Выведет: 0123456789

while (i < 10);

Даже такое возможно:

do код цикла; while (условное выражение);

Например:

#include <iostream>

using namespace std;

int main() {

int i = 0;

do cout << i++; while (i < 10); //Выведет: 0123456789

}

Бесконечный цикл do while:

do

{

Блок бесконечно выполняемых операторов;

} while (true);

Прерывание бесконечного цикла do while зачастую осуществляется с помощью оператора прерывания всех циклов break после проверки условия if

do

{

Блок выполняемых операторов;

if (условие) break;

} while (true);

Пример бесконечного цикла do while

int i = 0;

do

{

cout << i++; //Выведет: 0123456789

if (i == 10) break;

} while (true);

Еще пример бесконечного цикла do while

int i = 0;

do

{

cout << i++ << " ";

if (i > 25) break;

} while (true);

Будет выведено:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

14 Операторы break и continue

Оператор break позволяет выйти из операторов цикла for, while, do-while и переключателя switch. В переводе с английского break [breɪk] — разрыв. Данный оператор дает возможность немедленного выхода из самого внутреннего цикла или переключателя.

Например, цикл:

#include <iostream>

using namespace std;

int main() {

int i = 0;

do {

cout << i++; break; //Выведет: 0

} while (i < 10);

}

Оператор continue вызывает преждевременное завершение выполнения кода цикла с принудительным переходом к следующему шагу итерации цикла. Для циклов while и do-while это означает немедленный переход к проверке условия, а для цикла for – переход к шагу ИЗМЕНЕНИЕ значений управляющих переменных и принудительная очередная итерация цикла. Оператор continue действует на самый внутренний цикл.

15 Массивы

Массив — это набор данных одного типа с одним именем. array [əˈreɪ] — массив. Массивы позволяют автоматизировать обработку данных одного типа.

15.1 Одномерный массив

Объявление одномерного массива производится следующим образом:

тип_данных_массива имя_массива [длина_массива];

Например

int array[5];

Данный массив содержит 5 элементов, заполненных случайными значениями из ячеек памяти (мусором). Тип_данных_массива - int, имя_массива - array, длина_массива - 5.

Если объявлен массив без инициализации элементов массива, то такая программа запустится, но будет давать непредсказуемые результаты:

#include <iostream>

using namespace std;


int main() {

int a[3];

cout << a[0];

return 0;

}

Инициализация (задание начальных значений) элементов массива из 5 элементов может осуществляться следующим образом:

int array[5] = { 7, 2, 8, 5, 9 };

Массив начинается с 0 элемента. Значения элементов заданного выше массива следующие:

array[0] = 7

array[1] = 2

array[2] = 8

array[3] = 5

array[4] = 9

Получается ровно 5 элементов массива от 0 до 4. Индексы элементов массива заданы в квадратных скобках. Значение элемента массива хранится под именем массива с определенным индексом. Например, элемент массива с индексом 0 хранится в array[0] и равен 7 (array[0] = 7). А элемент массива с индексом 3 хранится в array[3] и равен 5 (array[3] = 5).

Распечатаем значения элементов массива при помощи следующей программы:

#include <iostream>

using namespace std;


int main()

{

int array[5] = { 7, 2, 8, 5, 9 };

for (int i = 0; i < 5; i++)

cout << array[i] << endl; //Вывод i-го элемента массива

}

Программа выведет:

7

2

8

5

9

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

int array[5] = { 7, 2, 8, 5, 9 };

for (int i = 0; i < 5; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

Программа выведет:

array[0] = 7;

array[1] = 2;

array[2] = 8;

array[3] = 5;

array[4] = 9;

Инициализировать массив из примера выше можно было и следующим образом:

int array[5];

array[0] = 7;

array[1] = 2;

array[2] = 8;

array[3] = 5;

array[4] = 9;

for (int i = 0; i < 5; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

Программа выведет то же самое!

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

int array[3] = { 0 };

Распечатаем значения элементов массива с помощью кода:

int array[3] = { 0 };

for (int i = 0; i < 3; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

Программа выведет:

array[0] = 0;

array[1] = 0;

array[2] = 0;

Если массив никак не инициализировать:

#include <iostream>

using namespace std;


int main() {

int array[3];

for (int i = 0; i < 3; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

return 0;

}

то массив заполнится случайными значениями из памяти:

array[0] = -858993460;

array[1] = -858993460;

array[2] = -858993460;

Если такой массив использовать в дальнейшем в программе, то программа будет выдавать непредсказуемые результаты всякий раз. Такая случайная неоднозначность опасна!

Зададим изначально (инициализируем) лишь 2 элемента массива размером 3 и распечатаем значения элементов этого массива с помощью кода:

int array[3] = { 8, 3 };

for (int i = 0; i < 3; i++)

cout << "array[" << i << "] = " << array[i] << endl;

Программа обнулит не заданный элемента массива и выведет:

array[0] = 8

array[1] = 3

array[2] = 0

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

int array[] = { 7, 2, 8, 5, 9 };

этот массив будет иметь размер 5.

Распечатаем значения элементов этого массива с помощью кода:

int array[] = { 7, 2, 8, 5, 9 };

for (int i = 0; i < 5; i++)

cout << "array[" << i << "] = " << array[i] << endl;

Программа выведет:

array[0] = 7

array[1] = 2

array[2] = 8

array[3] = 5

array[4] = 9

Для получения значения размера массива можно воспользоваться такой инструкцией

int size_array = sizeof(array) / sizeof(array[0]);

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

Размер всего массива в байтах выдает sizeof(array), а размер одного нулевого элемента массива в байтах выдает sizeof(array[0]). Если разделить размер всего массива в байтах на размер одного элемента массива в байтах, то получим количество элементов или размер массива.

Если для заданного массива вывести размер нулевого элемента массива в байтах в коде

int array[] = { 7, 2, 8, 5, 9 };

//размер нулевого элемента массива в байтах

cout << "sizeof(array[0]) = " << sizeof(array[0]) << endl;

то программа выведет:

sizeof(array[0]) = 4

Это указывает на то, что размер одного элемента массива типа int равен 4 байтам.

Если для заданного массива вывести размер нулевого элемента массива в байтах, размер всего массива в байтах и количество элементов массива в коде

int array[] = { 7, 2, 8, 5, 9 };

//размер нулевого элемента массива в байтах

cout << "sizeof(array[0]) = " << sizeof(array[0]) << endl;

//размер всего массива в байтах

cout << "sizeof(array) = " << sizeof(array) << endl;

//количество элементов массива или размер массива

int size_array = sizeof(array) / sizeof(array[0]);

cout << "size_array = " << size_array << endl;

то программа выведет:

sizeof(array[0]) = 4

sizeof(array) = 20

size_array = 5

Это указывает на то, что размер одного элемента массива типа int равен 4 байтам, а размер массива из 5 элементов равен ровно

5*4 байта = 20 байт.

Следующая программа выведет лишь размер массива, равный 5

int array[] = { 7, 2, 8, 5, 9 };

int size_array = sizeof(array) / sizeof(array[0]);

cout << "size_array = " << size_array << endl;

Выведет:

size_array = 5

Таким образом, размер массива можно задавать автоматически, например, для использования в цикле:

int array[] = { 3, 7, 2, 8, 5, 9 };

int size_array = sizeof(array) / sizeof(array[0]);

cout << "size_array = " << size_array << endl;

for (int i = 0; i < size_array; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

Данная программа выведет размер и содержимое массива:

size_array = 6

array[0] = 3;

array[1] = 7;

array[2] = 2;

array[3] = 8;

array[4] = 5;

array[5] = 9;

16 Сортировка одномерного массива по неубыванию и по невозрастанию

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

#include <algorithm>

Для сортировки всего одномерного массива array по неубыванию (возрастанию) при обращении к стандартной функции сортировки передаются следующие параметры:

sort(массив, массив + длина_массива);

Программный код:

sort(array, array + size_array);

Для сортировки массива array по неубыванию требуется 2 строки кода

int size_array = sizeof(array) / sizeof(array[0]);

sort(array, array + size_array);

Следующий программный код производит сортировку массива по неубыванию (возрастанию):

#include <iostream> //Для ввода, вывода

#include <algorithm> //Для сортировки массива

using namespace std; //Использовать стандартное пространство имен


int main()

{

//Объявление и инициализация массива

int array[] = { 7, 2, 8, 5, 9, 2, 5 };


//Определение размера массива

int size_array = sizeof(array) / sizeof(array[0]);

//Сортировка по неубыванию (возрастанию)

sort(array, array + size_array);


//Массив, отсортирован по неубыванию (возрастанию)

cout << "Array, sorted by non-decreasing (ascending):" << endl;

for (int i = 0; i < size_array; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

}

Программа выведет отсортированный массив:

Array, sorted by non-decreasing (ascending):

array[0] = 2;

array[1] = 2;

array[2] = 5;

array[3] = 5;

array[4] = 7;

array[5] = 8;

array[6] = 9;

Следующий программный код производит сортировку массива по невозрастанию (убыванию):

#include <iostream> //Для ввода, вывода

#include <algorithm> //Для сортировки массива

using namespace std;


int main()

{

//Объявление и инициализация массива

int array[] = { 7, 2, 8, 5, 9, 2, 5 };


//Определение размера массива

int size_array = sizeof(array) / sizeof(array[0]);

//Сортировка по неубыванию (возрастанию)

sort(array, array + size_array);


//Сортировка по невозрастанию (убыванию)

int temp; // temporary - временный

for (int i = 0, j = size_array - 1; i < j; i++, j--) {

// Замена элементов массива между собой

temp = array[i];

array[i] = array[j];

array[j] = temp;

}

//Массив, отсортирован по невозрастанию (убыванию)

cout << "Array, sorted in ascending (descending) order:" << endl;

for (int i = 0; i < size_array; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

return 0;

}

Программа выведет отсортированный массив:

Array, sorted in ascending (descending) order:

array[0] = 9;

array[1] = 8;

array[2] = 7;

array[3] = 5;

array[4] = 5;

array[5] = 2;

array[6] = 2;

Следующий программный код производит сортировку массива по неубыванию (возрастанию) и по невозрастанию (убыванию) с печатью промежуточных значений:

#include <iostream>

#include <algorithm>

using namespace std;


int main()

{

int array[] = { 7, 2, 8, 5, 9 };

int size_array = sizeof(array) / sizeof(array[0]);

cout << "size_array = " << size_array << endl;

cout << "array:" << endl;

for (int i = 0; i < size_array; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

//Сортировка по не убыванию (возрастанию)

sort(array, array + size_array);

//Массив, отсортирован по возрастанию

cout << "Array, sorted in ascending order:" << endl;

for (int i = 0; i < size_array; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

//Сортировка по убыванию

int temp; // temporary - временный

for (int i = 0, j = size_array - 1; i < j; i++, j--) {

// Замена элементов массива между собой

temp = array[i];

array[i] = array[j];

array[j] = temp;

}

//Массив, отсортирован по убыванию

cout << "Array, sorted in descending order:" << endl;

for (int i = 0; i < size_array; i++)

cout << "array[" << i << "] = " << array[i] << ";" << endl;

return 0;

}

Программа выведет исходный и отсортированный массив:

size_array = 5

array:

array[0] = 7;

array[1] = 2;

array[2] = 8;

array[3] = 5;

array[4] = 9;

Array, sorted in ascending order:

array[0] = 2;

array[1] = 5;

array[2] = 7;

array[3] = 8;

array[4] = 9;

Array, sorted in descending order:

array[0] = 9;

array[1] = 8;

array[2] = 7;

array[3] = 5;

array[4] = 2;

17 Динамический массив

Шаг 1 с одним динамическим массивом

#include <iostream>

#include <climits>

using namespace std;


int main() {

int size_array, max_array = INT_MIN;

cin >> size_array;

int* array = new int[size_array];

if (array == NULL) {

cout << "No memory\n";

return 1;

}

for (int i = 0; i < size_array; i++) {

array[i] = (int)(rand());

cout << "array[" << i << "] = " << array[i] << endl;

if (max_array < array[i]) max_array = array[i];

}

delete[] array; //Освобождаем память

cout << max_array << endl;

return 0;

}

18 Двумерный динамический массив

Многомерные массивы хорошо описаны в [1].

Зададим 10 динамических массивов

#include <iostream>

#include <climits>

using namespace std;


int main()

{

srand(time(0)); // генерация случайных чисел

int size_array[10], max_array[10];

for (int i = 0; i < 10; i++) max_array[i] = INT_MIN;

// Задание двумерного динамического массива

int** array = new int*[10];

for (int i = 0; i < 10; i++) {

cin >> size_array[i];

array[i] = new int[size_array[i]];

}

if (array == NULL) {

cout << "No memory\n";

return 1;

}

for (int i = 0; i < 10; i++)

for (int j = 0; j < size_array[i]; j++) {

array[i][j] = (int)(rand());

if (max_array[i] < array[i][j]) max_array[i] = array[i][j];

cout << "array[" << i << "][" << j << "]=" << array[i][j] << endl;

}

// удаление двумерного динамического массива

for (int i = 0; i < 10; i++)

delete[] array[i];

for (int i = 0; i < 10; i++) cout << max_array[i] << endl;

return 0;

}

19 Функции в С++

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

тип_возвращаемого_значения имя_функции(передаваемые параметры)

{

код, выполняемый в функции;

return возвращаемое_значение;

}


int main()

{

имя_функции(передаваемые параметры);

return 0;

}

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

#include <iostream>

using namespace std;


int main() {

function1(); //Вызов метода function1 без параметров

}


void function1() {

cout << "function1";

}

Функция выше main запустится:

#include <iostream>

using namespace std;


void function1() {

cout << "function1";

}


int main() {

function1(); //Вызов метода function1 без параметров

}

и выведет:

function1

Возврат значения return [rɪˈtɜːn] — вернуть.

#include <iostream>

using namespace std;


void function1() { // void указывает на то, что функция ничего не возвращает

cout << "function1";

}


//string указывает на возврат значения типа string

string function2() {

return "function2"; // возвращаемое значение типа string

}


int main() {

function1();

cout << endl;

cout << function2();

}

Возврат целого значения

#include <iostream>

using namespace std;


void function1() {

cout << "function1" << endl;

}


string function2() {

return "function2";

}


int function3() {//int указывает на возврат значения типа int

return 3;

}


int main() {

function1();

cout << function2() << " " << function3();

}

19.1 Передача параметров в функцию

Параметр — это значение, передаваемое в функцию, которое заключается в скобки после имени функции.

Пример функции с передачей параметра:

#include <iostream>

using namespace std;


int name_function(int a)

{

return 2 * a;

}


int main() {


cout << name_function(3); //выведет 6

return 0;

}

В function3 передается параметр:

#include <iostream>

using namespace std;


void function1() {

cout << "function1" << endl;

}


string function2() {

return "function2";

}


int function3(int number) {

return number + 3;

}


int main() {

function1();

cout << function2() << " " << function3(5);

}

Выведет в консоль:

function1

function2 8

Передача в функцию нескольких параметров:

#include <iostream>

using namespace std;


int sum(int number1, int number2) {

return number1 + number2;

}


int difference(int number1, int number2) {

return number1 - number2;

}


int main() {

int number1, number2 = 5;

number1 = 7;

cout << sum(number1, number2) << endl;

cout << difference(number1, number2);

}

Выведет в консоль:

12

2

Возврат степени:

#include <iostream>

using namespace std;


int sum(int number1, int number2) {

return number1 + number2;

}


int difference(int number1, int number2) {

return number1 - number2;

}


int multiplication(int number1, int number2) {

return number1 * number2;

}


double degree(int number1, int number2) {

return pow(number1, number2);

}


int main() {

int number1, number2 = 5;

number1 = 7;

cout << sum(number1, number2) << endl;

cout << difference(number1, number2) << endl;

cout << multiplication(number1, number2) << endl;

cout << degree(2, 4);

}

Выведет в консоль:

12

2

35

16.0

20 Перегрузка функций в С++

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

Ниже показан пример работающей программы с перегрузкой функций на С++:

#include <iostream>

using namespace std;


double degree(int number1, int number2) {

return pow(number1, number2);

}


double degree(double number1, double number2){

return pow(number1, number2);

}


int main() {

cout << degree(2, 4) << endl;

cout << degree(2.7, 4.8) << endl;

}

Выведет:

16.0

117.638

Ниже показан пример работающей программы в С++ с прототипами функций до main и самими этими функциями после main:

#include <iostream>

using namespace std;


//Прототипы функций

int Function(int parameter); //Прототип целочисленной версии функции

double Function(double parameter);//Вещественное число двойной точности


int main()

{

//Вызываем функцию Function с параметрами разного типа

cout << "Function(8.9) = " << Function(8.9) << endl; //Выведет: Function(8.9) = 8.9

cout << "Function(7) = " << Function(7) << endl; //Выведет: Function(7) = 7

return 0;

}


//Сами функции

int Function(int parameter) //Целочисленная версия функции

{

return parameter;

}


double Function(double parameter)

{

return parameter;

}

Программа выведет:

Function(8.9) = 8.9

Function(7) = 7

21 Функции. Параметры по умолчанию в С++

Параметр по умолчанию — это значение параметра, которое он приобретает в случае, если при обращении к функции этот параметр не передается. Значение параметра по умолчанию присваивается в прототипе функции или в объявлении функции, дублирование в них присваивания параметра по умолчанию не допускается. Пример

#include <iostream>

using namespace std;


int Function(int parameter = 5); //Прототип функции


int main()

{

//Вызываем функцию Function с пустым списком аргументов

cout << "Function()=" << Function() << endl; //Выведет: Function()=5

cout << "Function(7)=" << Function(7); //Выведет: Function(7)=7

return 0;

}


int Function(int parameter)

{

return parameter;

}

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

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

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

22 Функция вычисления факториала

Оформим вычисление факториала в виде отдельной функции

#include <iostream>

using namespace std;


int factorial(int n) {

int factorial = 1;

for (int i = 1; i <= n; i++) {

factorial *= i; //factorial = factorial * i

//if (n > 1) cout << i;

//if (i != n) cout << "*";

}

return factorial;

}


int main() {

int N, i = 1;

double S = 0.0;

cin >> N;


/*

cout << factorial(N);

return 0;

for (i = 0; i <= N; i++) {

cout << i << "! = ";

if (i < 2) cout << factorial(i) << endl;

else cout << " = " + factorial(i) << endl;

}

return 0;

*/


while (i <= N) {

S += 1.0 / (double)factorial(i);

i++;

}

cout << S;

return 0;

}

23 Ввод-вывод в файлы

Вывод в предварительно созданный пустой текстовый файл test.txt строки "Hello, World!":

#include <fstream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

stream << "Hello, World!";

stream.close();

return 0;

}

Выведет в этот файл:

Hello, World!

Можно предварительно создать и инициализировать строковую переменную string s = "Hello, World!":

#include <fstream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

string s = "Hello, World!";

stream << s;

stream.close();

return 0;

}

Выведет в этот файл:

Hello, World!

Ввод из файла одного символа в переменную типа char:

#include <fstream>

#include <iostream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

char с;

stream >> с;

stream.close();

cout << с;

return 0;

}

Выведет в консоль единственный символ:

H

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

#include <fstream>

#include <iostream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

string s;

stream >> s;

stream.close();

cout << s;

return 0;

}

Выведет в консоль:

Hello,

Ввод из файла в массив типа char также производит считывание лишь до пробела или конца строки, если нет пробелов:

#include <fstream>

#include <iostream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

char s[70];

stream >> s;

stream.close();

cout << s;

return 0;

}

Выведет в консоль:

Hello,

Можно предварительно создать и инициализировать целые переменные int number1 = 1, number2 = 2, которые затем записать в файл:

#include <fstream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

int number1 = 1, number2 = 2;

stream << number1 << " " << number2;

stream.close();

return 0;

}

Выведет в файл:

1 2

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

#include <fstream>

#include <iostream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

int number1, number2;

stream >> number1 >> number2;

stream.close();

cout << number1 << " " << number2 << endl;

return 0;

}

Выведет в консоль:

1 2

23.1 Определение конца файла с помощью функции eof()

Конец файла определяется с помощью встроенной функции eof(), которая при обнаружении конца файла принимает значение 1, в противном случае имеет значение 0, то есть конец файла еще не достигнут! Функция eof() названа по первым буквам фразы на английском языке end of file [end ɔv faɪl] - конец файла. Например, если достигнут или не достигнут конец файла stream, то следующая строка выведет 1 или 0 соответственно:

cout << stream.eof() << endl;

Например, чтобы прервать чтение файлового потока stream в бесконечном цикле при достижении конца файла достаточно разместить условие stream.eof() и цикл прервется при stream.eof() равном 1, то есть, если ранее в программе достигнут конец файла:

if (stream.eof()) break;

Программа ниже считывает и распечатывает каждый символ в файле, но прерывается при достижении конца файла:

#include <fstream>

#include <iostream>

using namespace std;


int main()

{

fstream stream;

stream.open("C:\\3\\folder_EGE\\test.txt");

char c;

while (1)

{

stream >> c;

if (stream.eof()) break;

cout << c;

}

stream.close();

return 0;

}

Выведет: Hello,World! То есть пробелы пропускает!

При попытке считывания конца файла в инструкции

stream >> c;

никакой символ, соответствующий концу файла, не будет считан!

24 Стандартные функции

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

Возведение числа Left в степень Right осуществляется функцией pow(Left, Right) и в результате получаем число типа double.

Если показатель степени 1/2 = 0.5, то происходит извлечение квадратного корня из числа Left с параметрами функции pow(Left, 0.5).

25 Преобразование типа сhar в тип wchar_t, чтобы затем преобразовать в тип String^

Ссылка [2] содержит описание этой темы.

Пример преобразования одного символа:

char c = '2';

wchar_t wct = c;

String^ S_Date_previous = System::Convert::ToString(wct);

Console::WriteLine(S_Date_previous);

Выведет: 2.

Пример преобразования массива

char c = Date[0][t_previous];

wchar_t wct = c;

String^ S_Date_previous = gcnew String(System::Convert::ToString(wct));

for (int ij = 1; ij < Date_size; ij++) {

c = Date[ij][t_previous];

wct = c;

S_Date_previous += System::Convert::ToString(wct);

}

26 Список использованных источников

1. Многомерные массивы в C++ — практическое пособие https://code-live.ru/post/cpp-array-tutorial-part-2/ (Дата доступа 02.01.2023).

2. Практическое руководство. Преобразование различных типов строк. https://docs.microsoft.com/ru-ru/cpp/text/how-to-convert-between-various-string-types?view=msvc-170 (Дата доступа 02.01.2023).



© 03.01.2023 Ольшевский Андрей Георгиевич e-mail: da.irk.ru@mail.ru