Skip to content

Commit

Permalink
switch to new structure
Browse files Browse the repository at this point in the history
  • Loading branch information
Maksim Litvinov committed Dec 27, 2023
1 parent c0cf578 commit ffe8217
Show file tree
Hide file tree
Showing 114 changed files with 2,574 additions and 0 deletions.
14 changes: 14 additions & 0 deletions modules/10-basics/10-first-program/ru/EXERCISE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Наберите в редакторе код из задания символ в символ и нажмите «Проверить».

```cpp
#include <iostream>

int main() {
//BEGIN
std::cout << "Hello, World!" << std::endl;
//END
return 0;
}
```

> Внимание: если вы напишете `heLLo, woRld!` вместо `Hello, World!`, то это будет считаться другим текстом, потому что заглавные и строчные буквы — это разные символы. Размер буквы называют *регистром*, и говорят: **регистр — важен!** Это касается почти всего в коде, поэтому привыкайте всегда обращать внимание на регистр.
20 changes: 20 additions & 0 deletions modules/10-basics/10-first-program/ru/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Изучать язык программирования, по традиции, начинают с программы 'Hello, World!'.

<pre class='hexlet-basics-output'>
Hello, World!
</pre>

В языке C++ эта программа будет выглядеть так:

```cpp
main() {
std::cout << "Hello, World!";
}
```

Текст `Hello, World!` появится на экране благодаря команде `std::cout <<`.
Такая команда выводит на экран информацию, которая указана после оператора << `'Hello, World!'`.
Оператор `<<` позволяет строить цепочки, например: `std::cout << "Hello, World!" << "\n";`
То есть теперь информация после _Hello, World!_ будет выводиться на экране на следующей строке.

То, что присутствует на экране помимо этой команды, нужно для работы любой программы на языке C++, мы разберём это позднее.
5 changes: 5 additions & 0 deletions modules/10-basics/10-first-program/ru/data.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: Первая программа на С++
tips:
- >-
Если в редакторе есть запись `// BEGIN` и `// END`, то код нужно писать
между этими строчками.
5 changes: 5 additions & 0 deletions modules/10-basics/20-comments/ru/EXERCISE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Выведете в консоль строку `Hello Jon Snow!`

В любом месте программы создайте однострочный комментарий с текстом: `You know nothing, Jon Snow!`.

Не забудьте добавить перевод строки с помощью функции `std::endl` или символа `\n`
42 changes: 42 additions & 0 deletions modules/10-basics/20-comments/ru/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@

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

```cpp
int main() {
// Удалить вывод в консоль перед запуском в продакшене
std::cout << "Hello World!";
return 0;
}
```

Комментарии в С++ бывают двух видов:
## Однострочные комментарии
_Однострочные комментарии_ начинаются с `//`. После этих двух символов может следовать любой текст, вся строчка не будет анализироваться и исполняться.
Комментарий может занимать всю строчку. Если одной строчки мало, то создаются несколько комментариев:

```cpp
// For Winterfell!
// For Lanisters!
```

Комментарий может находиться на строчке после какого-нибудь кода:

```cpp
int index { 0 }; // counter initialization
```
## Многострочные комментарии
_Многострочные комментарии_ начинаются с `/*` и заканчиваются на `*/`.
```cpp
/*
This program
prints a message
to the console
*/
int main() {
std::cout << "Hello World!" << std::endl;
return 0;
}
```

Такие комментарии, обычно, используют для документирования кода, например, функций.
1 change: 1 addition & 0 deletions modules/10-basics/20-comments/ru/data.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
name: Комментарии в С++
24 changes: 24 additions & 0 deletions modules/10-basics/30-statemets/ru/EXERCISE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Выведите на экран друг за другом три имени: *Robert*, *Stannis*, *Renly*. В результате на экране должно отобразиться:

<pre class='hexlet-basics-output'>
Robert
Stannis
Renly
</pre>

Для каждого имени можете используйте свой собственный вызов `std::cout <<`.

Вывод в поток `std::cout` не умеет самостоятельно делать перевод строки, по этому это надо указать явно управляющим символом "\n" или воспользоваться функцией `endl`.

```cpp
std::cout << "Mother of Dragons\n";
std::cout << "Mother of Dragons" << "\n";
std::cout << "Mother of Dragons" << std::endl;
```

Подсказка:
- С помощью оператора вставки `<<` можно выстраивать цепочки:

```cpp
std::cout << "Mother of Dragons\n" << "Dracarys!\n";
```
22 changes: 22 additions & 0 deletions modules/10-basics/30-statemets/ru/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
Инструкция — это команда для компьютера. Код на C++ — это набор инструкций, которые, обычно, отделяются друг от друга символом `;`. Вот пример кода с двумя инструкциями:

```cpp
std::cout << "Mother of Dragons\n";
std::cout << "Dracarys!\n";
```

При запуске этого кода на экран последовательно выводятся два предложения:

<pre class='hexlet-basics-output'>
Mother of Dragons
Dracarys!
</pre>

Почему это важно знать? Инструкция — это единица исполнения. Программа которая запускает код на C++, выполняет инструкции строго по очереди. И мы, как разработчики, должны понимать этот порядок и уметь мысленно разделять программу на независимые части, удобные для анализа.
Теоретически инструкции можно написать последовательно друг за другом без переноса на новую строчку:

```cpp
std::cout << "Mother of Dragons\n"; std::cout << "Dracarys!\n";
```

Результат на экране будет таким же, но на практике такой подход считается плохим.
11 changes: 11 additions & 0 deletions modules/10-basics/30-statemets/ru/data.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: Инструкции (Statements)
tips:
- >
[Функция
endl](https://learn.microsoft.com/ru-ru/cpp/standard-library/ostream-functions?view=msvc-170#endl)
[Что такое
поток](https://learn.microsoft.com/ru-ru/cpp/standard-library/what-a-stream-is?view=msvc-170)
[Использование printf в современном
С++](https://learn.microsoft.com/ru-ru/archive/msdn-magazine/2015/march/windows-with-c-using-printf-with-modern-c)
5 changes: 5 additions & 0 deletions modules/10-basics/40-program-structure/ru/EXERCISE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
В этом упражнение мы сново потренируемся выводом в консоль, только теперь вы напишите функцию `main` самостоятельно.

Не забудьте подключить библиотеку для ввода/вывода.

Выведете в консоль фразу Hello, Code Basics!
63 changes: 63 additions & 0 deletions modules/10-basics/40-program-structure/ru/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
Давайте посмотрим на листинг программы из прошлого урока.

```cpp
#include <iostream>

int main() {
std::cout << "Mother of Dragons\n";
std::cout << "Dracarys!\n";
return 0;
}
```

В верхней части листинга мы видим такую запись:

```cpp
#include <iostream>
```

`#include` - это директива препроцессора, с помощью неё мы подключаем заголовочные файлы различных библиотек. В данном случае мы подключили `iostream` - библиотека для организации ввода/вывода.

Далее идет определение функции main. В С++ любая программа начинается с функции `main` - это её входная точка.

Функция может принимать аргументы, например, если это консольное приложение, то это будут аргументы командной строки:

```cpp
int main (int argc, char *argv[]) {
// some code
}
```
или же быть без аргументов:
```cpp
int main() {
// some code
}
```

Тело функции обрамлено фигурными скобками, внутри идет набор инструкций, которые выполняет функция, каждая инструкция должна оканчиваться точкой с запятой ;.

## Код возврата

Когда наша программа завершает свою работу, операционной системе важно понимать как отработала программа: успешно или нет. Рассмотрим минимальное определение функции `main`:

```cpp
int main() {
return 0;
}
```

Обратите внимание на `return` - это инструкция возврата из функции(подробнее о возвращаемых значениях мы познакомимся в уроках про функции).

Стандарт C++ определяет значение только трех кодов состояния: `0`, `EXIT_SUCCESS` и `EXIT_FAILURE`. `0` и `EXIT_SUCCESS` означают, что программа выполнена успешно. `EXIT_FAILURE` означает, что программа не была успешно выполнена. `EXIT_SUCCESS` и `EXIT_FAILURE` определены в заголовочном файле `<cstdlib>`:

```cpp
#include <cstdlib>

int main() {
return EXIT_SUCCESS // эквивалентно 0
}
```

Если вы хотите максимизировать портируемость, вы должны использовать только `0` или `EXIT_SUCCESS`.
5 changes: 5 additions & 0 deletions modules/10-basics/40-program-structure/ru/data.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: Структура программы в С++
tips:
- >
[Директива
#include](https://learn.microsoft.com/ru-ru/cpp/preprocessor/hash-include-directive-c-cpp?view=msvc-170)
7 changes: 7 additions & 0 deletions modules/10-basics/50-testing/ru/EXERCISE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Просто тренировка. Выведите на экран число 420262531.

<pre class='hexlet-basics-output'>
420262531
</pre>

Поэкспериментируйте с выводом. Передайте туда другое число или строку. Посмотрите на ответ системы, попробуйте его перевести и понять.
24 changes: 24 additions & 0 deletions modules/10-basics/50-testing/ru/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Наш сайт автоматически проверяет ваши решения. Как это работает?

В самом простом случае система просто запускает ваш код и смотрит на то, что вывелось на экран. А потом сверяет с тем, что мы «ожидали» по заданию.

В следующих, более сложных уроках вы будете писать методы — некие мини-программы, принимающие информацию из внешнего мира и производящие какие-то операции. Проверка ваших решений в таких случаях выглядит немного сложнее: система запускает ваше решение и передаёт какую-то информацию. Система также знает — «ожидает» — какой именно ответ должен вернуть правильный метод при таких входных данных.

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

Вот простой пример: помните задание из 1го упражнения, где вам надо было вывести на экран "Hello, World!"?. Допустим, вы допустили небольшую опечатку. Система ответит примерно так:

<pre class='hexlet-basics-output'>
Assertion `result == expected` failed in test.cpp line 26:
Expected: "Hello, World" to be: "Hello, World!"
</pre>

Читать это следует так: в ответе ожидалось строка с "Hello, World!" (первая строчка после двойного '='), но в вместо него пришла строка "Hello, World". Строки отличаются символом под номером 12. В данном примере пропущен восклицательный знак.

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

Однако, если вы уверены в ошибке или нашли какую-то неточность, то вы всегда можете указать на нее. В конце каждой теории есть ссылка на содержимое урока на гитхабе (этот проект полностью открытый!). Перейдя туда, вы можете написать issue, посмотреть содержимое тестов (там видно, как вызывается ваш код) и даже отправить pullrequest. Если для вас это пока темный лес, то подключитесь в наше сообщество [Telegram Hexlet](https://t.me/hexletcommunity/12), там в канале Волонтеры мы всегда поможем.

Кроме наших тестов, будет крайне полезно экспериментировать с кодом в вашем собственном консольном приложении. [Установите Visual Studio](https://visualstudio.microsoft.com/ru/downloads/) и попробуйте создать [простое консольное приложение](https://learn.microsoft.com/ru-ru/cpp/build/vscpp-step-1-create?view=msvc-170). Оцените мощь IDE, которая может сама автодополнять выражения и подчеркивать места с ошибками.

Если вы используете Linux, то у вас уже установлен компилятор g++ и вы можете скомпилировать программу с помощью него, а код набирать в любом текстовом редакторе, например [VScode](https://code.visualstudio.com/).
13 changes: 13 additions & 0 deletions modules/10-basics/50-testing/ru/data.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Как мы проверяем ваши решения
definitions:
- name: Тесты
description: >
специальный код, проверяющий программы на корректность, сверяя правильный
результат с реальным.
tips:
- |
[g++](https://gcc.gnu.org/onlinedocs)
- |
[TDD](https://ru.wikipedia.org/wiki/Разработка_через_тестирование)
- |
[Сообщество Хекслета в Telegram](https://t.me/hexletcommunity/12)
1 change: 1 addition & 0 deletions modules/10-basics/60-syntax-error/ru/EXERCISE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Это задание не связано с уроком напрямую. Но будет полезным потренироваться с выводом на экран. Выведите на экран *What Is Dead May Never Die*.
Loading

0 comments on commit ffe8217

Please sign in to comment.