# Лабораторная работа №1 (тема №4)

## Знакомство со средой программирования и структурой проекта. 

>Ссылка на скачивание и компоненты для устрановки описаны в [лекции](./t2l1#интегрированная-среда-программирования)

1. Запустите **Visual Stidio 2022** и выберите пункт _Создание проекта_

    ![](../img/04013.png)

1. Установите фильтры и найдите шаблон проекта _Консольное приложение (Макрософт)_

    >Обратите внимание, не .NET Framework, а просто .NET

    ![](../img/04014.png)

    В Настройках нового проекта введите название и запомните/поменяйте, если нужно, расположение проекта

    ![](../img/04015.png)

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

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

![](../img/lab4_01.png)

>В **Visual Studio** можно открыть окно консоли (на скриншоте оно снизу-слева). Открыть можно через меню _Вид - Консоль_ или комбинацией клавишь Ctrl+\`

В каталоге проекта есть директории `.vs`, `bin` и `obj`, которые содержат скомпилированную программу и настройки и, значит, сохранять эти каталоги в репозитории не нужно (добавить в `.gitignore`).

## Создание репозитория с ветками. 

Сначала создайте новый репозиторий и инициализируйте его в верхнем каталоге **oap_labs** (в котором находится файл `*.sln`). В **Visual Studio** есть каталог **решения** и в нём одноименный каталог **проекта** (в одном решении может быть несколько проектов)

Затем создайте в корне репозитория файл `.gitignore`, в который добавьте каталоги, которые не нужно сохранять в репозитории:

```.gitignore
*/bin/
*/obj/
.vs
```

Знак "*" перед названиями каталогов `bin` и `obj` обозначает "любой каталог", т.е. этот фильтр будет работать не зависимо от названия вашего проекта.

После того, как мы сохраним файл, будет видно, что перечисленные каталоги больше не отслеживаются GIT-ом:

![](../img/04017.png)

Создайте файл `readme.md` (в корне "решения") с описанием проекта.

Сохраните текущее состояние проекта в репозитории

Теперь создайте ветку *lab1* и переключитесь на неё:

```
git checkout -b lab4_1
```

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

## Составление программ линейной структуры.

Например, "вычислить периметр и площадь прямоугольного треугольника по длинам двух катетов" (размер катетов получить из консоли)

Мы ещё не проходили команды работы с консолью, поэтому приведу кусок кода с комментариями:

```cs
// команда Console.Write выводит текст в консоль
Console.Write("Input katet1: ");

// команда Console.ReadLine читает СТРОКУ из консоли
var katet1 = Console.ReadLine();

Console.Write("Input katet2: ");
var katet2 = Console.ReadLine();

// команда Math.Sqrt - квадратный корень
// Math.Pow - возведение в степень
// Convert.ToDouble - преобразует строку в число
var gipotenuza = Math.Sqrt(
    Math.Pow(
        Convert.ToDouble(katet1), 2) + 
    Math.Pow(
        Convert.ToDouble(katet2), 2));

// выводим результат
// знак $ перед строкой указывает, 
// что внутри строки в фигурных скобках названия переменных
Console.WriteLine(
    $"Gipotenuza = {gipotenuza}");

// читаем строку, чтобы консольное окно сразу не закрылось
Console.Write("Press ENTER to continue...");
Console.ReadLine();
```

В некоторых заданиях требуется ввести числа в одной строке (например, "2 2"), но т.к. функция **ReadLine** возвращает **строку**, то такая строка будет не валидным числом.

Для разбиения строки на подстроки можно воспользоваться методом **Split**. Этот метод делит строку на массив строк, используя переданный символ как разделитель строк:

```cs
var numbers = Console.ReadLine();
// numbers = "2 2"

var numberList = numbers.Split(' ');
// numberList = ["2","2"]

var katet1 = Convert.ToInt32(numberList[0]);
var katet2 = Convert.ToInt32(numberList[1]);
```

---

## Задание

1. Выполните задание, выданное преподавателем

    Задания берите с сайта [Школа программиста](https://acmp.ru/index.asp?main=tasks), из темы "Задачи для начинающих" 

    Чем больше решите, тем лучше, но желательно от 3 заданий (на "троечку")

1. Опубликуйте результаты в удаленном репозитории и скиньте ссылку преподавателю.

## Пример выполнения

> Задача: [A+B](https://acmp.ru/index.asp?main=task&id_task=1)
>
> Требуется сложить два целых числа А и В.
>
> Решение:
>
>```cs
>Console.Write(
>    "Введите два целых числа через пробел: ");
>var inputString = Console.ReadLine();
>var stringParts = inputString.Split(' ');
>Console.WriteLine(
>    Convert.ToInt32(stringParts[0]) + 
>    Convert.ToInt32(stringParts[1]));
>```
>
>Результат работы:
>
>```
>Введите два целых числа через пробел: 2 3
>5
>
>Process finished with exit code 0.
>```
