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