initial commit
This commit is contained in:
commit
2369f801af
76 changed files with 4273 additions and 0 deletions
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
*/
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
|
@ -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};
|
||||
}
|
||||
|
|
@ -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
|
||||
*/
|
||||
|
|
@ -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
|
||||
*/
|
||||
|
|
@ -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) Что напечатает данная программа?
|
||||
*/
|
||||
|
|
@ -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;
|
||||
|
||||
Приведёт ли это к ошибке и, если да, то почему?
|
||||
*/
|
||||
|
|
@ -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
|
||||
|
||||
*/
|
||||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
*/
|
||||
|
|
@ -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>
|
||||
|
||||
*/
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
float a, b;
|
||||
std::cin >> a >> b;
|
||||
std::cout << sqrt(a * b);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
Что теперь напечатает программа? Объясните результат.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
Что теперь напечатает программа? Объясните результат.
|
||||
*/
|
||||
|
||||
|
||||
Reference in a new issue