initial commit

This commit is contained in:
nihonium 2022-09-01 16:37:41 +03:00
commit 2369f801af
Signed by: nihonium
GPG key ID: 0251623741027CFC
76 changed files with 4273 additions and 0 deletions

View file

@ -0,0 +1,33 @@
#include <stdio.h>
/*
Здравствуйте, это первый файл семестра по языку C++ (для тех, кто знаком с языком C)
Язык C++ создан на основе языка C и одним из приоритетов C++ является обратная совместимость с C
Поэтому почти любая программа на языке C будет работать и на языке C++
Однако, нужно помнить, что это разные языки. В C++ было добавлено огромное количество новых возможностей,
что сделало C++ возможно самым объёмным и мощным языком программирования.
C++ содержит в себе во много раз больше всего, чем язык C и пройти его за один семестр не представляется возможным,
но мы пройдём ключевые части этого языка.
Для компиляции программ на C++ будем использовать компилятор g++.
Скомпилируйте эту программу вот так:
g++ 00hello.cpp
И запустите вот так (для Windows):
a.exe
И запустите вот так (для Linux):
./a.out
*/
int main()
{
printf("Hello World of C++\n");
}

View file

@ -0,0 +1,48 @@
#include <stdio.h>
/*
Пространства имён - namespace
Определяем переменные/структуры/функции внутри пространства имён.
Давайте назовём его mipt
Чтобы получить доступ к этим переменным/структурам/функциям
вне пространства имён, нужно добавить к имени название пространства имён и оператор ::
В данном случае нужно добавить mipt::
*/
namespace mipt
{
int a = 5;
float b = 1.2;
int square(int x)
{
return x * x;
}
}
int main()
{
printf("%i\n", mipt::square(4));
}
/*
Задание:
1) Скомпилируйте программу и запустите, что она напечатает?
2) Что будет, если забыть написать mipt:: у названия функции square?
3) Передайте в функцию mipt::square переменную a из пространства имён mipt
4) Напишите функцию float average(float x, float y), которая будет принимать 2 числа
и возвращать их среднее арифметическое.
Поместите эту функцию в пространство имён mipt и вызовите эту функцию из main
5) Напечатайте среднее арифметическое от a и b, используя функцию average
*/

View file

@ -0,0 +1,25 @@
#include <stdio.h>
namespace mipt
{
int a = 5;
float b = 1.2;
int square(int x)
{
return x * x;
}
float average(float x, float y)
{
return (x + y) / 2;
}
}
int main()
{
printf("%i\n", mipt::square(mipt::a));
printf("%f\n", mipt::average(mipt::a, mipt::b));
}

View file

@ -0,0 +1,24 @@
#include <stdio.h>
/*
В языке C при объявлении структуры struct Book создаётся тип по имени struct Book.
В языке C++ при объявлении структуры struct Book создаётся тип к которому
можно обращаться как по имени struct Book так и по имени Book
*/
struct Book
{
char title[50];
int pages;
float price;
};
int main()
{
struct Book a = {"Tom Sawyer", 280, 500};
Book b = {"War and Peace", 1200, 900};
}

View file

@ -0,0 +1,40 @@
#include <cstdio>
/*
Определяем переменные/структуры/функции внутри пространства имён mipt
Затем к ним можно будет доступиться используя префикс mipt::
*/
namespace mipt
{
struct Book
{
char title[50];
int pages;
float price;
};
void printBook(Book b)
{
printf("%s, pages: %d, price: %.2f\n", b.title, b.pages, b.price);
}
}
int main()
{
}
/*
Задание:
Структура Book и функция printBook определены в пространстве имён mipt
1) Создайте переменную типа структура Book и иницилизируйте
её значениями: "War and Peace", 1200, 900
2) Напечатайте созданную переменную с помощью функции printBook
*/

View file

@ -0,0 +1,36 @@
#include <cstdio>
namespace mipt
{
struct Book
{
char title[50];
int pages;
float price;
};
void printBook(Book b)
{
printf("%s, pages: %d, price: %.2f\n", b.title, b.pages, b.price);
}
}
int main()
{
mipt::Book b = {"War and Peace", 1200, 900};
mipt::printBook(b);
}
/*
Задание:
Структура Book и функция printBook определены в пространстве имён mipt
1) Создайте переменную типа структура Book и иницилизируйте
её значениями: "War and Peace", 1200, 900
2) Напечатайте созданную переменную с помощью функции printBook
*/

View file

@ -0,0 +1,60 @@
#include <stdio.h>
/*
Зачем вообще нужны пространства имён?
Представьте, что вы создаёте большую программу, исходный код который
содержит миллионы строк кода. Конечно, большая часть кода написана не вами,
так как вы используете библиотеки, написанные другими программистами.
Библиотекой можно назвать совокупность файлов исходного кода, нацеленных
на решение какой-либо задачи. Например, есть библиотека для работы с графикой
в которой содержатся функции/структуры/классы для работы с графикой.
Если вы подключаете несколько библиотек, то существует высокая вероятность,
что название чего-либо из одной библиотеки совпадёт с названием чего-то из другой библиотеки.
Это, конечно, приведёт к ошибке.
Чтобы этого избежать и используются пространства имён.
*/
namespace audio
{
int a = 10;
int calculate(int x)
{
return x + 1;
}
}
namespace graphics
{
int a = 20;
int calculate(int x)
{
return x * 2;
}
}
int main()
{
printf("%i\n", audio::a);
printf("%i\n", graphics::a);
printf("%i\n", graphics::calculate(audio::calculate(graphics::a)));
}
/*
Задание:
1) Что напечатает данная программа?
*/

View file

@ -0,0 +1,78 @@
#include <stdio.h>
/*
Если вам очень не хочется постоянно писать названия пространства имён,
то вы можете использовать ключевое слово using
using namespace audio;
Это говорит о том, что начиная с этой строки audio:: перед именами писать больше не нужно
Это, конечно, полностью уничтожают всю пользу, которую приносят пространства имён.
То есть в больших проектах могут возникнуть ошибки, связанные с одинаковыми именами.
Так что так лучше не делать, а если и делать, то только в маленьких программах.
*/
namespace audio
{
int a = 10;
int calculate(int x)
{
return x + 1;
}
}
namespace graphics
{
int a = 20;
int calculate(int x)
{
return x * 2;
}
}
namespace network
{
int b = 20;
int solve(int x)
{
return x * 2;
}
}
using namespace audio;
int main()
{
printf("%i\n", calculate(a));
}
/*
Задание:
1) Что напечатает данная программа?
2) Если заменить using namespace audio на using namespace graphics, то что напечатает программа?
3) Что если одновременно использовать пространство имён audio и пространство имён graphics?
using namespace audio;
using namespace graphics;
Приведёт ли это к ошибке и, если да, то почему?
4) Что если одновременно использовать пространство имён audio и пространство имён network?
using namespace audio;
using namespace network;
Приведёт ли это к ошибке и, если да, то почему?
*/

View file

@ -0,0 +1,65 @@
#include <iostream>
/*
Все переменные/функции/структуры/классы стандартной библиотеки языка C++ содержатся в пространстве имён std
Рассмотрим, например, глобальную переменную cout, определённую в библиотеке iostream в пространстве имён std.
К этой переменной можно применять оператор <<
cout << объект
В результате этой операции объект напечатается на экран (если он может напечататься)
Результат оператора << также является cout, поэтому можно применять << несколько раз:
Например это выражение: cout << "Hello " << "World" << "\n";
1) Сначала напечатается "Hello " и на место cout << "Hello " подставится cout
Получтся cout << "World" << "\n";
2) Потом напечатется "World" и на место cout << "World" подставится cout
Получтся cout << "\n";
3) В конце напечатается перенос строки
*/
int main()
{
std::cout << "Hello World\n";
std::cout << 5 << "\n";
int x = 10;
std::cout << 5 << "\n";
}
/*
Задачи:
1) Напечатайте на экран число 1.4, используя cout (количество печатаемых знаков после запятой неважно)
Обратите внимание, что при печати с cout не нужно указывать спецификатор типа как в printf.
cout сам понимает объект какого типа ему передаётся
2) Напечатайте фразу "I am x years old", только за место x нужно подставить значение
переменной x. В данной задаче получится "I am 10 years old". Используйте cout.
3) Напечатайте на экран числа от 1 до 20, разделённые пробелом. Используйте cout
4) Вместо \n для переноса строки можно использовать endl - специальный объект из
пространства имён std.
Если мы передаём его объекту cout через оператор << то печатается перенос строки
Замените все переносы строк с \n на endl
std::cout << 5 << "\n"; --> std::cout << 5 << std::endl;
На самом деле std::endl работает медленней, чем \n, так как он помимо печати делает flush
Поэтому, если важна скорость печати в буфер, то лучше использовать \n
5) Что будет если не написать std:: перед одним из cout?
6) Используйте using namespace std; и избавьтесь от надоедливых std:: перед cout и endl
*/

View file

@ -0,0 +1,16 @@
#include <iostream>
using namespace std;
int main()
{
cout << 1.4 << endl;
int x = 10;
cout << "I am " << x << " years old" << endl;
for (int i = 1; i <= 20; ++i)
cout << i << " ";
cout << endl;
}

View file

@ -0,0 +1,32 @@
#include <iostream>
/*
В пространстве имён std очень много разных имён. Если мы добавим их всех, используя
using namespace std;
то это может привести к проблеме.
Одно из имён из std может совпасть с названием нашего объекта и это может привести к ошибке.
Так что лучше такую возможность не использовать.
Но можно добавить только одно имя так:
using std::cout;
Начиная с этого момента можно писать просто cout.
Но для всех остальных объектов из std вы должны продолжать писать std::
*/
using std::cout;
int main()
{
cout << "Hello World" << std::endl;
cout << 5 << std::endl;
}
/*
Задачи:
1) Добавить endl в нашу область видимости, также как и cout
*/

View file

@ -0,0 +1,41 @@
#include <iostream>
/*
Счтиывание из стандартного входа
Рассмотрим глобальную переменную cin, определённую в библиотеке iostream в пространстве имён std.
К этой переменной можно применять оператор >>
cin >> объект
В результате этой операции объект считается с экрана (если он может быть считан)
Результат оператора >> также является cin, поэтому можно применять >> несколько раз:
Например это выражение: cin >> a >> b;
1) Сначала считается переменная a и на место cin >> a подставится cin
Получтся cin >> b;
2) Потом считается переменная b
*/
int main()
{
int a, b;
std::cin >> a >> b;
std::cout << a + b;
}
/*
Задачи:
1) Что напечатает данная программа, если на вход передать числа 10 и 20?
2) Напишите программу, которая будет считывать два вещественных числа и печатать их среднее геометрическое
Функция корня sqrt есть в библиотеке <cmath>
*/

View file

@ -0,0 +1,10 @@
#include <iostream>
#include <cmath>
int main()
{
float a, b;
std::cin >> a >> b;
std::cout << sqrt(a * b);
}

View file

@ -0,0 +1,42 @@
#include <stdio.h>
#include <math.h>
/*
Язык C++ обратно совместим с языком C. То есть почти любая программа на C будет работать на C++
Эта программа будет работать.
Обратите внимания, для имён, пришедших из языка C использовать std:: не обязательно
Программа работает, несмотря на то, что мы используем библиотечные
функции printf и sqrt без указания пространства имён std.
*/
int main()
{
printf("%f", sqrt(3));
}
/* Задача:
1) Что напечатает данная программа?
2) Использование библиотечных функций без std опасно, так как может привести к ошибкам,
связанных с совпадением имён. Помните, что большая программа может иметь миллионы
строк кода и совпадение ваших имен и библиотечных имён очень вероятно.
Напишите следующую функцию перед функцией main
int sqrt(int x)
{
return x + 1;
}
Что теперь напечатает программа? Объясните результат.
*/

View file

@ -0,0 +1,37 @@
#include <cstdio>
#include <cmath>
/*
Желательно всё равно использовать std даже для имён пришедших из языка C
Также были изменены названия библиотек:
stdio.h --> cstdio
math.h --> cmath
cmath означает, что это библиотека языка C под названием math, поэтому и cmath
Они почти не отличаются от предыдущих, но при программировании на C++
желательно использовать именно эти библиотеки.
*/
int main()
{
std::printf("%f", std::sqrt(3));
}
/* Задача:
1) Что напечатает данная программа?
2) Напишите следующую функцию перед функцией main
int sqrt(int x)
{
return x + 1;
}
Что теперь напечатает программа? Объясните результат.
*/