Всем ку.. Изучая C# я забил на него, последнее что я помню, я остановился на циклах. Эту тему я создал, по больше части, для себя... Но было бы неплохо поделится с вами как я буду изучать C# или уже изучил 3-4 раза в неделю, я постараюсь оставлять комментарий с кратким описанием того, что я изучил. Так же я буду оставлять источники откуда я брал инфу. А пока краткий экскурс. Не интересный факт Языку C# в феврале 2023 года будет 11 лет На сегодня C# один из мощнейших ЯП (По инфе из инета он находится на 5 месте после Python, C, Java, C++) На данный момент на нём пишут от небольших приложений(парсеры, чекеры) до игр на движке Unity (Rust, SuperHOT, Genshin Impact) Текущей версией C# на 16.11.2022 является C# 11 вместе с .NET 7 Когда говорят C#, нередко имеют в виду технологии платформы .NET (Windows Forms, Xamarin, WPF). Фреймворк .NET представляет мощную платформу для создания приложений. Можно выделить несколько его основных черт: Поддержка нескольких языков. Основой платформы является общеязыковая среда исполнения Common Language Runtime (CLR) .NET поддерживает несколько языков: C#, Visual Basic .NET, C++, F# Кроссплатформенность Думаю тут ничего пояснять не надо, написал приложение и смог его запустить на - Windows, MacOS, Linux, Android, iOS, Tizen. Мощная библиотека классов. .NET представляет единую для всех поддерживаемых языков библиотеку классов. И какое бы приложение мы не собирались писать на C# - текстовый редактор, чат или сложный веб-сайт - так или иначе мы задействуем библиотеку классов .NET. Производительность Согласно ряду тестов веб-приложения на .NET 7 в ряде категорий сильно опережают веб-приложения, построенные с помощью других технологий. Приложения на .NET 7 в принципе отличаются высокой производительностью. Компиляция Так как C# компилируемый язык, и наш ПК не может его прочитать, файл формата CS, где записан наш код, проходит через компилятор и преобразуется в исполняемый файл, (это будет либо файл формата .dll или .exe) и уже после компиляции наш код на высокоуровневом языке, в нашем случае C#, преобразуется в низкоуровневый язык, например Assembler и машинный код (11010000101110101101000110000011). Низкоуровневые языки, проще говоря, язык cоответствующий программам процессора. Некоторые могут задаться вопросом - "А почему нельзя сразу учить язык Assembler". Я отвечу на ваш вопрос 2-мя картинками (Оба варианта деление 13 на 2) Язык Assembler Язык C# В 1 варианте 4 строчки а в C# всего 2, разница не такая уж и большая, скажите вы. Но представьте код в 100 строчек, и это я привёл пример с простейшей задачей. Я сам ещё не гуглил как выглядят условия или циклы на языке Assembler, но надеюсь суть вы уловили Среда разработки Visual Studio. Приложение Visual Studio включает в себя: редактор кода с подсветкой синтаксиса, с помощью которого мы будем писать наш код. И сборщик, с помощью которого мы сможешь исполнить наш код, и проверить его работоспособность. При изучении далее будут разобраны и другие возможности Visual Studio. Как установить Visual Studio - C# и .NET | Начало работы с Visual Studio. To be continued _______________________________________________________________________________________________________________________________ План которого я постараюсь придерживаться для достижения базового уровня.(План был взят из какого то платного курса) Когда я изучу ту или иную тему, рядом с ней будет стоять смайликПолучится ли у меня достичь всего что ниже до весны Готово Основы программирования Переменные Наименование переменных Типы переменных Арифметические операторы Логические операторы Конкатенация Интерполяция Конвертация Работа с консолью Инкремент и декремент Условные операторы и циклы Условный оператор If Логическое И и ИЛИ Условный оператор Swtich case Цикл while Цикл for Массивы Одномерные массивы Многомерные массивы Массив - ссылочный тип Расширение массива Строки - массив символов Перебор массива с Foreach Функции Функции Функции с возвращаемыми значениями Необязательные параметры ref и out Перегрузки Коллекции List Queue Stack Dictionary План ООП Что такое ООП Отношения Типизация Абстракция Инкапсуляция Полиморфизм Классы и объекты Поля и модификаторы доступа Методы Конструкторы Связь Has-a Наследование (Is-a) Свойства Проблема свойств и массивов Виртуальные методы Цикл обновления Интерфейсы= Абстрактные классы Статические члены Статический конструктор Структуры VS Класс Определение структур Хоть я только начал изучать C# могу посоветовать бесплатный курс - https://ulearn.me/ И сайт METANIT.COM Ограничение ответов в теме: Автор темы разрешил отвечать в теме только этим группам (и вышестоящим): Команда форума и Кураторы.
Karasu_san, это круто, я тоже изучаю с# и заставлять себя что-то изучать тяжело, но ты прикольно придумал удачи тебе
День 1. Переменные, наименование переменных, типы переменных. Переменная - область в оперативной памяти, которая имеет: 1 - Тип, 2 - Имя, 3 - Значение. (Ещё адрес) Значение переменной может быть изменено в ходе программы. Объявление переменной - её создание в тексте программы. Инициализация - присвоение переменной начального значения. // Cинтаксис объявления и инициализации переменной // Тип Имя_Переменной = значение; // int ammo = 30; int ammo; // Это объявление переменной ammo = 30; // Это инициализация переменной /* Объявить и инициализировать переменную можно в одной строке */ int ammo = 30; // Переменная была объявлена и инициализирована в одной строке /* Так же в 1 строке можно объявить сразу несколько переменных одного типа. */ int ammo = 30, health = 100; // 2 переменных одного типа, были объявлены и инициализированы в одной строке C# // Cинтаксис объявления и инициализации переменной // Тип Имя_Переменной = значение; // int ammo = 30; int ammo; // Это объявление переменной ammo = 30; // Это инициализация переменной /* Объявить и инициализировать переменную можно в одной строке */ int ammo = 30; // Переменная была объявлена и инициализирована в одной строке /* Так же в 1 строке можно объявить сразу несколько переменных одного типа. */ int ammo = 30, health = 100; // 2 переменных одного типа, были объявлены и инициализированы в одной строке Не интересный факт Переменной не существует в памяти, пока она не будет инициализирована. Наименование переменных Имя переменной может содержать любые цифры, буквы и символ подчеркивания. Первый символ в имени должен быть буквой или символом подчеркивания. В имени не должно быть знаков пунктуации и пробелов. Хочу добавить, привыкайте задавать имена переменных, отражающие суть того, что будет в них храниться. И лично для себя выбрать CamelCase. Например EnemyHealth - первые буквы слов написаны большими буквами, но наиболее распространённым является lowerCamelCase - то есть secondPlayerHealth Snake case. Например enemy_health Например Правильное указание имён переменных: int EnemyHealth = 200; int _PlayerHealth = 100; Не правильное указание имён: int 1playerhealth = 100; // Ошибка.. (Переменная не может начинаться с числа) Правильно будет - int FirstPlayerHealth = 100; int SecondPlayer Health = 100; //Ошибка.. (Пробел не допустим в наименовании переменной) Правильно будет - int SecondPlayerHealth = 100; или int SecondPlayer_Health = 100; Типы данных //Типы данных //Я выделю несколько основных типов данных //С полным списком можете ознакомиться тут - https://metanit.com/sharp/tutorial/2.1.php //bool - хранит значения true или false bool IsAlive = true; bool IsDead = false; //int - хранит целое число int ammo = 30; int health = 100; //string - хранит набор символов Unicode string name = "Akim"; //double - хранит число с плавающей точкой от ±5.0*10-324 до ±1.7*10308 double MoneyOnTheCard = 685.24; //float хранит число с плавающей точкой от -3.4*1038 до 3.4*1038 float MoneyOnTheCard = 685.24; C# //Типы данных //Я выделю несколько основных типов данных //С полным списком можете ознакомиться тут - https://metanit.com/sharp/tutorial/2.1.php //bool - хранит значения true или false bool IsAlive = true; bool IsDead = false; //int - хранит целое число int ammo = 30; int health = 100; //string - хранит набор символов Unicode string name = "Akim"; //double - хранит число с плавающей точкой от ±5.0*10-324 до ±1.7*10308 double MoneyOnTheCard = 685.24; //float хранит число с плавающей точкой от -3.4*1038 до 3.4*1038 float MoneyOnTheCard = 685.24;
Karasu_san, Case надо не выбирать а следовать майкрософтовским гайдам, где переменные записываются исключительно через camelCase (в терминологии Майкрософт camelCase это то что ты называешь lowerCamelCase, UpperCamelCase же принято называть PascalCase).
День 2. Арифметические операторы, Логические операторы, Конкатенация. Арифметические операторы нам известны ещё с уроков математики, это: (+ - / * ). Сложение, вычитание, умножение - работают как мы привыкли считать на математике, а вот с делением надо кое что уточнить. // Задам целочисленную переменную number1 и number2 int number1 = 5, number2 = 2; // Выводим в консоль 5/2 Console.WriteLine($"number1/number2"); C // Задам целочисленную переменную number1 и number2 int number1 = 5, number2 = 2; // Выводим в консоль 5/2 Console.WriteLine($"number1/number2"); На выходе мы получим цифру 2, так как мы делим два целочисленных числа, и у них не может быть дробной части. Для того, что бы получить в ответе 2.5, нам нужен тип данных с плавающей запятой, тип double или float //Есть 2 способа решить эту задачу // 1 Способ // Задаём переменные number1 и number2 с плавающей запятой. float otvet; int number1 = 5, number2 = 2; otvet = Convert.ToSingle(number1) / number2; // Здесь я в переменную типа float поместил 2 переменных типа int, одну из которых я конвертировал в float Convert.ToSingle(number1) Console.WriteLine(otvet); // В консоле мы получим 2,5 //2 Способ float number1 = 5, number2 = 2; float otvet = number1 / number2/ Console.WriteLine(otvet); // Так же получим 2,5 C //Есть 2 способа решить эту задачу // 1 Способ // Задаём переменные number1 и number2 с плавающей запятой. float otvet; int number1 = 5, number2 = 2; otvet = Convert.ToSingle(number1) / number2; // Здесь я в переменную типа float поместил 2 переменных типа int, одну из которых я конвертировал в float Convert.ToSingle(number1) Console.WriteLine(otvet); // В консоле мы получим 2,5 //2 Способ float number1 = 5, number2 = 2; float otvet = number1 / number2/ Console.WriteLine(otvet); // Так же получим 2,5 Оператор деление по модулю(остаток от деления) - % int number1 = 5, number2 = 2; Console.WriteLine(${number1 % number2}); //В ответе мы получим цифру 1 //Проще говоря 4 поделилось нацело, и вывелась цифра 1 //% - Остаток от целого деления C int number1 = 5, number2 = 2; Console.WriteLine(${number1 % number2}); //В ответе мы получим цифру 1 //Проще говоря 4 поделилось нацело, и вывелась цифра 1 //% - Остаток от целого деления Не полезная информация Есть ещё операторы += -= *= /= %= Они используются для того что бы работать с одной переменной. Допустим есть переменна candyNum int candyNum = 5; И мы хотим прибавить ещё 2 конфеты к переменной. Новичёк написал бы так: candyNum = candyNum + 2; А более менее знающий человек написал бы так: candyNum += 2; Приоритет у операторов такой же как и в математике из школы. Логические операторы Логические операторы так же могут быть известны вам со школы. Операторы ( ==, !=, >, <, >=, <=) == - Оператор сравнения != - Не равно > - Больше < - Меньше >= - Больше или равно <= - Меньше или равно Логические операторы возвращают булево true или false Пример bool a; Console.WriteLine(a = 5 == 3); // Консоль выведет False так как 5 не равняется 3 C# bool a; Console.WriteLine(a = 5 == 3); // Консоль выведет False так как 5 не равняется 3 Console.WriteLine(a = 5 == 5); // Консоль выведет True так как 5 равняется 5[/CODE] Console.WriteLine(a = 5 != 3); // Консоль выведет True так как 5 не равняется 3[/CODE] Console.WriteLine(a = 5 != 5); // Консоль выведет False так как 5 равняется 5[/CODE] Console.WriteLine(a = 5 > 3); // Консоль выведет True так как 3 меньше 5[/CODE] Console.WriteLine(a = 5 > 5); // Консоль выведет False так как 5 и 5 раны[/CODE] Console.WriteLine(a = 5 < 3); // Консоль выведет False так как 5 больше 3[/CODE] Console.WriteLine(a = 5 >= 3); // Консоль выведет True так как 5 больше или равно 3[/CODE] Console.WriteLine(a = 5 <= 5); // Консоль выведет True так как 5 меньше или равно 5[/CODE] Console.WriteLine(a = 5 <= 3); // Консоль выведет False так как 5 больше или равно 3[/CODE] Конкатенация Конкатенация строк, это почти тоже самое что и работать с числами Например string str1 = "Привет,", str2 = "Лолстим!"; string otvet = str1 + str2; Console.WriteLine(otvet); // Консоль выведет - Привет,Лолстим! Но допустим я хочу поставить пробел после запятой, для этого я могу написать так. string otvet = str1 + " " + str2; Console.WriteLine(otvet); // Консоль выведет - Привет, Лолстим! День 2 Конец Дз ещё крч вам, из какого то учебника Даны три целых числа: A, B, C. Проверить истинность высказывания: «Число B находится между числами A и C». Если будет не в падлу, в коментах завтра оставлю ответ.
День 3. Интерполяция, конвертация, работа с консолью, инкремент и декремент Интерполяция Соединять строки можно не только с помощью конкатенации, интерполяцию вы уже могли наблюдать в моём коде выше. Пример интерполяции [I]int age = 18; string name = Akim;[/I] //Только начавший изучение человек, не знающий что такое интерполяция, написал бы так Console.WriteLine("Ваше имя " + name + "." + " Ваш возраст " + age + "."); //Напишем тоже самое, но с использованием интерполяции. Console.WriteLine($"Ваше имя {name}. Ваш возраст {age}."); //Перед кавычками ставим доллар. Далее внутри кавычек нам нужны фигурные скобки {} внутри которых мы пишем имя переменной которую хотим вывести //Это куда удобнее и читабельнее чем в первом варианте C# [I]int age = 18; string name = Akim;[/I] //Только начавший изучение человек, не знающий что такое интерполяция, написал бы так Console.WriteLine("Ваше имя " + name + "." + " Ваш возраст " + age + "."); //Напишем тоже самое, но с использованием интерполяции. Console.WriteLine($"Ваше имя {name}. Ваш возраст {age}."); //Перед кавычками ставим доллар. Далее внутри кавычек нам нужны фигурные скобки {} внутри которых мы пишем имя переменной которую хотим вывести //Это куда удобнее и читабельнее чем в первом варианте Конвертация Конвертацию вы могли уже видеть в моём коде "День 2" Конвертация данных одна из важных тем которая нам пригодится. Например, c помощью конвертации мы можем из int сделать string или наоборот Допустим у нас есть переменная string со значением "17" и мы хотим конвертировать её в тип данных int string str = "17"; int number; //И для того что бы конвертировать строку в число нам нужно number = Convert.ToInt32(str); Console.WriteLine(number); //Выведет в консоль число 17 Console.WriteLine(number + 3); //Выведет в консоль число 20 C# string str = "17"; int number; //И для того что бы конвертировать строку в число нам нужно number = Convert.ToInt32(str); Console.WriteLine(number); //Выведет в консоль число 17 Console.WriteLine(number + 3); //Выведет в консоль число 20 Если вы попытаетесь прибавить число к переменной с типом string, вам вылезет ошибка Конвертацию всех данных я разбирать не буду, подробно прочитать о конвертации вы можете тут - https://learn.microsoft.com/ru-ru/dotnet/api/system.convert?view=net-7.0 Но я выделю ещё конвертацию в тип bool которая может иметь значения true или false. При конвертации будет возвращаться true, если значение f не равно нулю; в противном случае — false bool f = Convert.ToBoolean(0); Console.WriteLine(f); Работа с консолью Мы уже умеем выводить данные в консоль при помощи Console.WriteLine(); Но если мы хотим через консоль сами задавать значения переменным? Для этого используют Console.ReadLine(); string name; int age; Console.Write("Введите ваш ник"); name = Console.ReadLine(); Console.Write("Введите ваш возраст"); age = Console.ReadLine(); // Если вы сделаете так, то у вас будет ошибка. Так как при чтении, Console.ReadLine(); пытается преобразовать string в int; age = Convert.ToInt32(Console.ReadLine()); //Для того что бы присвоить переменной age типа int значение из консоли, нужно применить Convert.ToInt32 Console.WriteLine($"Ваш ник {name} ваш возраст {age}"); // Консоль выведет ваш ник и возраст которые вы ввели в консоль C# string name; int age; Console.Write("Введите ваш ник"); name = Console.ReadLine(); Console.Write("Введите ваш возраст"); age = Console.ReadLine(); // Если вы сделаете так, то у вас будет ошибка. Так как при чтении, Console.ReadLine(); пытается преобразовать string в int; age = Convert.ToInt32(Console.ReadLine()); //Для того что бы присвоить переменной age типа int значение из консоли, нужно применить Convert.ToInt32 Console.WriteLine($"Ваш ник {name} ваш возраст {age}"); // Консоль выведет ваш ник и возраст которые вы ввели в консоль Инкремент и декремент Допустим есть переменная int a = 0; и я хочу прибавить к ней единицу Для этого я использую инкремент a++; int a = 0; a++; Console.WriteLine(a); // Консоль выведет 1; Но а если я хочу вычесть единицу Для этого я использую декремент a--; int a = 0; a--; Console.WriteLine(a); // Консоль выведет -1; Так же у инкремента и декремента существует префиксная форма, до этого я использовал постфиксную форму инкремента и декремента ++a, --a В чём же их различие Постфиксная форма прибавляет единицу после того как с переменной что то сделали например int a = 0; Console.WriteLine(a++); // Вывод - 0 Console.WriteLine(a); // Вывод - 1 В этом примере переменная была объявлена, выведена первый раз, после чего инкремент прибавил к ней единицу, второй вывод имеет значение после того, как инкремент сработал В префиксной форме наоборот int a = 0; Console.WriteLine(++a); // Вывод - 1 Console.WriteLine(a); // Вывод - 1 В этом примере префиксный инкремент сразу прибавил единицу к переменной, не ожидая пока с ней произведут какое либо действие. C# int a = 0; a++; Console.WriteLine(a); // Консоль выведет 1; Но а если я хочу вычесть единицу Для этого я использую декремент a--; int a = 0; a--; Console.WriteLine(a); // Консоль выведет -1; Так же у инкремента и декремента существует префиксная форма, до этого я использовал постфиксную форму инкремента и декремента ++a, --a В чём же их различие Постфиксная форма прибавляет единицу после того как с переменной что то сделали например int a = 0; Console.WriteLine(a++); // Вывод - 0 Console.WriteLine(a); // Вывод - 1 В этом примере переменная была объявлена, выведена первый раз, после чего инкремент прибавил к ней единицу, второй вывод имеет значение после того, как инкремент сработал В префиксной форме наоборот int a = 0; Console.WriteLine(++a); // Вывод - 1 Console.WriteLine(a); // Вывод - 1 В этом примере префиксный инкремент сразу прибавил единицу к переменной, не ожидая пока с ней произведут какое либо действие. ВНИМАНИЕ У инкремента и декремент высший приоритет в арифметических операциях
Karasu_san, интерполяцию кстати затрагивают в основном в платных курсах, на бесплатных не так часто говорят, еще видел у знакомого на работе... заставляли писать без нее, чтоб больше времени тратил :DD коды понятные пока что, очень круто! если это увидят новички, то им будет легко)
День 4. Условный оператор If, Логическое И и ИЛИ, Условная конструкция Switch case Конструкция If - одна из базовых компонентов ЯП, который направляет работу программы по одному из путей, в зависимости от условий. синтаксис условной конструкции if if(условие выполнения) { //Блок кода, который будет выполнятся если условие == true } else { //Блок кода, который будет выполнятся если условие == false } else if(Условие) { // Блок кода, который будет выполнятся если условие конструкции if == false, проверяется условие конструкции if else } Пример int age; age = Convert.ToInt32(Console.ReadLine()); if(age >= 18) { Console.WriteLine("Добро пожаловать"); } else { Console.WriteLine($"Пшёл вон, приходи через {18 - age} лет"); } Ввод: 20 Вывод: Добро пожаловать Ввод: 13 Вывод: Пшёл вон, приходи через 5 лет C# int age; age = Convert.ToInt32(Console.ReadLine()); if(age >= 18) { Console.WriteLine("Добро пожаловать"); } else { Console.WriteLine($"Пшёл вон, приходи через {18 - age} лет"); } Ввод: 20 Вывод: Добро пожаловать Ввод: 13 Вывод: Пшёл вон, приходи через 5 лет Логическое И и ИЛИ ИЛИ - || // Возвращает true если хотя бы одно из условий верно, в обратном случае false И - && // Возвращает true когда оба условия верны, в обратном случае false Пример с использованием логического ИЛИ и И // Если у пользователя денег больше, чем 1000 или уровень больше 20, то открыть доступ // Иначе выгнать пользователя int money, level; Console.Write("Сколько у вас денег?"); money = Convert.ToInt32(Console.ReadLine()); Console.Write("Какой у вас уровень?"); level = Convert.ToInt32(Console.ReadLine()); if(money >= 1000 || level >= 20) // Вернёт true если хотя бы одно выражение верно { Console.WriteLine("Доступ открыт"); } else { Console.WriteLine("Пшёл вон"); } Ввод: 1263 23 Вывод: Доступ открыт Ввод: 2330 5 Вывод: Доступ открыт Ввод: 332 25 Вывод: Доступ открыт Ввод: 332 3 Вывод: Пшёл вон // Если у пользователя денег больше, чем 1000 и уровень больше 20, то открыть доступ // Иначе выгнать пользователя int money, level; Console.Write("Сколько у вас денег?"); money = Convert.ToInt32(Console.ReadLine()); Console.Write("Какой у вас уровень?"); level = Convert.ToInt32(Console.ReadLine()); if(money >= 1000 && level >= 20) // Вернёт true если оба выражения верны { Console.WriteLine("Доступ открыт"); } else { Console.WriteLine("Пшёл вон"); } Ввод: 1263 23 Вывод: Доступ открыт Ввод: 2330 5 Вывод: Пшёл вон Ввод: 332 25 Вывод: Пшёл вон Ввод: 332 3 Вывод: Пшёл вон C // Если у пользователя денег больше, чем 1000 или уровень больше 20, то открыть доступ // Иначе выгнать пользователя int money, level; Console.Write("Сколько у вас денег?"); money = Convert.ToInt32(Console.ReadLine()); Console.Write("Какой у вас уровень?"); level = Convert.ToInt32(Console.ReadLine()); if(money >= 1000 || level >= 20) // Вернёт true если хотя бы одно выражение верно { Console.WriteLine("Доступ открыт"); } else { Console.WriteLine("Пшёл вон"); } Ввод: 1263 23 Вывод: Доступ открыт Ввод: 2330 5 Вывод: Доступ открыт Ввод: 332 25 Вывод: Доступ открыт Ввод: 332 3 Вывод: Пшёл вон // Если у пользователя денег больше, чем 1000 и уровень больше 20, то открыть доступ // Иначе выгнать пользователя int money, level; Console.Write("Сколько у вас денег?"); money = Convert.ToInt32(Console.ReadLine()); Console.Write("Какой у вас уровень?"); level = Convert.ToInt32(Console.ReadLine()); if(money >= 1000 && level >= 20) // Вернёт true если оба выражения верны { Console.WriteLine("Доступ открыт"); } else { Console.WriteLine("Пшёл вон"); } Ввод: 1263 23 Вывод: Доступ открыт Ввод: 2330 5 Вывод: Пшёл вон Ввод: 332 25 Вывод: Пшёл вон Ввод: 332 3 Вывод: Пшёл вон Условный оператор swtich Конструкция swtich/case используется, когда необходимо, в зависимости от значения переменной или результата какой либо операции, выполнить блок кода. switch (Переменная или выражение) // Обычно здесь находиться переменная из которой берут значения и сравнивают его в дальнейшем { case Значение_1: // Блок кода выполняется, если Значение_1 == значению переменной break; case Значение_2: // Блок кода выполняется, если Значение_2 == значению переменной break; //... default: // Блок кода выполняется, если среди перечисленных значений в case нет подходящего break; } Пример использования swtich/case int weekDay; Console.Write("Введите день недели от 1 до 7 "); weekDay = Convert.ToInt32(Console.ReadLine()); switch (weekDay) { case 1: Console.WriteLine("Понедельник"); break; case 2: Console.WriteLine("Вторник"); break; case 3: Console.WriteLine("Среда"); break; case 4: Console.WriteLine("Четверг"); break; case 5: Console.WriteLine("Пятница"); break; case 6: Console.WriteLine("Суббота"); break; case 7: Console.WriteLine("Воскресенье"); break; default: Console.WriteLine("Введите число от 1 до 7"); break; } Ввод: 1 Вывод: Понедельник Ввод: 2 Вывод: Вторник ... Ввод: 7 Вывод: Воскресенье Ввод: 23 Вывод: Введите число от 1 до 7 C# int weekDay; Console.Write("Введите день недели от 1 до 7 "); weekDay = Convert.ToInt32(Console.ReadLine()); switch (weekDay) { case 1: Console.WriteLine("Понедельник"); break; case 2: Console.WriteLine("Вторник"); break; case 3: Console.WriteLine("Среда"); break; case 4: Console.WriteLine("Четверг"); break; case 5: Console.WriteLine("Пятница"); break; case 6: Console.WriteLine("Суббота"); break; case 7: Console.WriteLine("Воскресенье"); break; default: Console.WriteLine("Введите число от 1 до 7"); break; } Ввод: 1 Вывод: Понедельник Ввод: 2 Вывод: Вторник ... Ввод: 7 Вывод: Воскресенье Ввод: 23 Вывод: Введите число от 1 до 7 День 4 конец
Некоторые челы место свичей, if, else if юзают, их конечно можно использовать, но если вдруг понадобится расширять в будущем, if'ы очень не удобно расширять, и тупо так делать
Karasu_san, расширение конструкций if и switch в ооп языках уже признак говнокода с нарушением принципа открытости/закрытости.
День 5. Циклы While, For Циклы - конструкции, позволяющие в зависимости от условия, выполнить действие множество раз. Цикл While - цикл с условием, т.е цикл будет выполнятся пока условие == true Cинтаксис цикла While While(Условие) { Блок кода, который будет выполняться пока условие == true } Пример использования While int number = 0; while (number < 10) //Цикл будет выполняться пока number меньше 10; { number++; // Инкремент увеличивающий number на 1, без инкремента цикл будет длиться бесконечно, так как значение [I]переменной не изменяется Console.WriteLine(number); } Вывод 1 2 3 4 5 6 7 8 9 10 //Использование оператора break в цикле //Оператор break насильно прерывает цикл int number = 0; while (number < 10) //Цикл будет выполняться пока number меньше 10; { number++; // Инкремент увеличивающий number на 1, без инкремента цикл будет длиться бесконечно, так как значение переменной не изменяется Console.WriteLine(number); if (number == 6) { break; // Прервёт цикл, если значение number == 6 } } //Пример использования while для повторения программы string exitInput; bool exit = false; int age; while (!exit) { Console.Write("Введите ваш возраст - "); age = Convert.ToInt32(Console.ReadLine()); if (age >= 18) { Console.WriteLine("Добро пожаловать"); } else { Console.WriteLine("Пшёл вон"); } Console.Write("Желаете ли вы выйти из программы? - "); exitInput = Console.ReadLine(); if (exitInput == "Да" || exitInput == "да") { exit = true; } else if (exitInput == "Нет" || exitInput == "нет") { exit = false; } } C# int number = 0; while (number < 10) //Цикл будет выполняться пока number меньше 10; { number++; // Инкремент увеличивающий number на 1, без инкремента цикл будет длиться бесконечно, так как значение [I]переменной не изменяется Console.WriteLine(number); } Вывод 1 2 3 4 5 6 7 8 9 10 //Использование оператора break в цикле //Оператор break насильно прерывает цикл int number = 0; while (number < 10) //Цикл будет выполняться пока number меньше 10; { number++; // Инкремент увеличивающий number на 1, без инкремента цикл будет длиться бесконечно, так как значение переменной не изменяется Console.WriteLine(number); if (number == 6) { break; // Прервёт цикл, если значение number == 6 } } //Пример использования while для повторения программы string exitInput; bool exit = false; int age; while (!exit) { Console.Write("Введите ваш возраст - "); age = Convert.ToInt32(Console.ReadLine()); if (age >= 18) { Console.WriteLine("Добро пожаловать"); } else { Console.WriteLine("Пшёл вон"); } Console.Write("Желаете ли вы выйти из программы? - "); exitInput = Console.ReadLine(); if (exitInput == "Да" || exitInput == "да") { exit = true; } else if (exitInput == "Нет" || exitInput == "нет") { exit = false; } } Цикл For - отличается от цикла While тем, что for это цикл с параметром. Синтаксис цикла For for (объявление переменной; условие; правило изменения переменной) { // Блок кода, который будет выполняться пока условие == true } Пример использования For for(int i = 0; i < 10; i++) { Console.WriteLine(i); } Вывод 0 1 2 3 4 5 6 7 8 9 C# for(int i = 0; i < 10; i++) { Console.WriteLine(i); } Вывод 0 1 2 3 4 5 6 7 8 9 Если с циклом While понятно как он работает, то с циклом for нужно уточнить(Алгоритм по которому выполняется цикл For) 1. Инициализация переменной 2. Проверка условия 3. Выполнение первой итерации (Итерация - повторение какого либо действия) 4. Переход к блоку с изменением переменной (Там где стоит инкремент i++) 5. Проверка условия 6. Выполнение второй итерации 7. Переход к блоку с изменением переменной 8. Проверка условия 9. Выполнение второй итерации И так далее, пока условие не будет == false (Например когда переменная i cтанет больше 10) - из примера выше Когда использовать цикл for, а когда while? for используют когда есть чёткие границы выполнения цикла и чёткий шаг. Например выводить все чётные числа до 100 for (int i = 0, i <= 100; i+=2) { Console.WriteLine(i); } // Вывод всех чётных чисел от 0 до 100 включительно/ while используют когда непонятно сколько раз будет выполняться цикл, например в моём коде выше, где пользователь выбирает когда выйти из программы C# for (int i = 0, i <= 100; i+=2) { Console.WriteLine(i); } // Вывод всех чётных чисел от 0 до 100 включительно/ while используют когда непонятно сколько раз будет выполняться цикл, например в моём коде выше, где пользователь выбирает когда выйти из программы Конец дня 5.
День 6 Одномерные массивы (дополнительно Random) Массивы - набор элементов одного типа, объединённых одним именем. Одномерный массив - это фиксированное количество элементов одного и того же типа, объединенных общим именем, где каждый элемент имеет свой номер. Элементы в массивах нумеруются с 0, например если массив будет состоять из 5 элементов, то они будут иметь номера - 0,1,2,3,4 Объявление одномерного массива 1) тип[] имя_массива; В этом случае описывается ссылка на массив, которую можно будет использовать для адресации на уже существующий массив. 2) тип[] имя_массива = new тип[размер]; Тут тоже самое, но выделяется память под указанное количество элементов. int[] nums = new int[4]; Объявлен массив nums, который будет хранить данные типа int. С помощью операции new, выделяется память для 4 элементов массива: new int[4] (Число 4 еще называют длиной массива) При таком определении все элементы получают значение по умолчанию, которое предусмотрено для их типа. Для типа int значение по умолчанию - 0. Не интересный факт Элементы массива инициализируются значениями, которые приняты для того или иного типа: 1. Числовые типы - нулями 2. Строковый тип - пустыми строками 3. Cимволы - пробелами 4. Объекты ссылочных типов - null`ми Пример использования Одномерного массива. int[] nums = new int[5]; // На данный момент в массиве 5 нулей Console.WriteLine(nums); // Вывести в консоль весь массив таким образом не получиться // Можно использовать цикл for for (int i = 0; i < nums.Length; i++) // C помощью nums.Length можно получить длину массива. { Console.WriteLine(nums[i]); // C помощь nums[i] я обратился к индексу элементов, вместо i можно написать 0, и выведется первый элемент массива } // Вывод 0 0 0 0 0 // Так же с помощью индекса можно присвоить новое значение элементу в массиве int[] nums = new int[5]; nums[2] = 5; // Третьему элементу массива присвоена цифра 5 for (int i = 0; i < nums.Length; i++) { Console.WriteLine(nums[i]); } Вывод 0 0 5 0 0 C# int[] nums = new int[5]; // На данный момент в массиве 5 нулей Console.WriteLine(nums); // Вывести в консоль весь массив таким образом не получиться // Можно использовать цикл for for (int i = 0; i < nums.Length; i++) // C помощью nums.Length можно получить длину массива. { Console.WriteLine(nums[i]); // C помощь nums[i] я обратился к индексу элементов, вместо i можно написать 0, и выведется первый элемент массива } // Вывод 0 0 0 0 0 // Так же с помощью индекса можно присвоить новое значение элементу в массиве int[] nums = new int[5]; nums[2] = 5; // Третьему элементу массива присвоена цифра 5 for (int i = 0; i < nums.Length; i++) { Console.WriteLine(nums[i]); } Вывод 0 0 5 0 0 Заполнение массива рандомными числами. Так как я забыл написать о рандоме раньше, придётся написать тут пока не поздно. //Создание объекта для генерации чисел Random randomNum = new Random(); //Получить случайное целочисленное число int value = randomNum.Next(); // Рандомное число от 0 до 2147483647 хотя это и не uint, но генерирует начиная с нуля, если самому не указать диапозон int value2 = randomNum.Next(-2147483647, 2147483647); // Рандомное число от -2147483647 до 2147483647 int value3 = randomNum.Next(3, 20); // Рандомное число от 3 до 20 //Получить случайное число с плавающей запятой double doubleValue = randomNum.NextDouble(); // Рандомная дробная часть от 0,0 до 1,0 //Вывод полученного числа в консоль double result = value3 + doubleValue; Console.WriteLine(value); Console.WriteLine(value2); Console.WriteLine(value3); Console.WriteLine(doubleValue); Console.WriteLine(Math.Round(result, 2)); //Math.Round(переменная, сколько цифр после запятой оставить) Код //Создание объекта для генерации чисел Random randomNum = new Random(); //Получить случайное целочисленное число int value = randomNum.Next(); // Рандомное число от 0 до 2147483647 хотя это и не uint, но генерирует начиная с нуля, если самому не указать диапозон int value2 = randomNum.Next(-2147483647, 2147483647); // Рандомное число от -2147483647 до 2147483647 int value3 = randomNum.Next(3, 20); // Рандомное число от 3 до 20 //Получить случайное число с плавающей запятой double doubleValue = randomNum.NextDouble(); // Рандомная дробная часть от 0,0 до 1,0 //Вывод полученного числа в консоль double result = value3 + doubleValue; Console.WriteLine(value); Console.WriteLine(value2); Console.WriteLine(value3); Console.WriteLine(doubleValue); Console.WriteLine(Math.Round(result, 2)); //Math.Round(переменная, сколько цифр после запятой оставить) Вывод С рандомом разобрались, теперь можно и массив заполнить. int[] numbers = new int[10]; Random randomNum = new Random(); for (int i = 0; i < numbers.Length; i++) { numbers[i] = randomNum.Next(1, 20); Console.Write(numbers[i]); } //Так же можно заполнить массив ручками int[] numbers = {1, 2, 3, 4, 5, 6, 7, 9}; int[] numbers = new int[4] {1, 2, 3, 4}; int[] numbers = new int[4] {1, 2, 3, 4, 5, 6, 7}; //будет ошибка, так как массив имеет размер == 4 C# int[] numbers = new int[10]; Random randomNum = new Random(); for (int i = 0; i < numbers.Length; i++) { numbers[i] = randomNum.Next(1, 20); Console.Write(numbers[i]); } //Так же можно заполнить массив ручками int[] numbers = {1, 2, 3, 4, 5, 6, 7, 9}; int[] numbers = new int[4] {1, 2, 3, 4}; int[] numbers = new int[4] {1, 2, 3, 4, 5, 6, 7}; //будет ошибка, так как массив имеет размер == 4 Вывод
Karasu_san, и не стоит забывать, что массив может быть типом object и хранить любые значения. И было бы классно расписать чем оно отличается от типа var.
День 7 Многомерные массивы Многомерные массивы имеют более 1 измерения, чаще всего используют двумерные массивы, которые представляют собой таблицу(матрицу) Двумерные массивы имеют 2 индекса: 1 - Номер строки 2 - Номер столбца Можно сравнить с игрой "Морской бой" Но вместо букв цифры, и счёт начинается с нуля. Есть ещё 3-х мерный, 4-х мерный и т.д массив 3-х мерный массив это например куб, в котором не 2 координаты, а 3. 1 - номер по горизонтали (Строка) 2 - номер по вертикали (Столбец) 3 - номер в пространстве ( Хз как тут записать ) Объявление двухмерного массива 1 - тип[,] имя_массива; 2 - тип[,] имя_массива = new тип[размер1, размер2]; - размер1 - кол-во строк. размер2 - кол-во столбцов Сокращённая инициализация двумерного массива. 1 - тип[,] имя_массива = {{},{},{}}; 2 - тип[,] имя_массива = new тип[размер] {{},{},{}}; Пример создания двумерного массива int [,] array = {{0, 1, 2, 3},{0, 4, 5, 6},{0, 7, 8, 9}}; // Такой массив не удобно читать, можно написать немного удобней для чтения // Тот же самый двухмерный массив, но выстроенный как таблица int [,] array = { //Строки {0, 1, 2, 3}, //0 {0, 4, 5, 6}, //1 {0, 7, 8, 9}}; //2 //Столбцы 0 1 2 3 //В каждой строке обязательно должно быть одинаковое количество элементов/ //Иначе будет ошибка Console.WriteLine(array[2, 3]); // 2 - Строка 3 - Столбец Вывод:9 Console.WriteLine(array[1, 2]); Вывод:5 Console.WriteLine(array[0, 1]); Вывод:1 C# int [,] array = {{0, 1, 2, 3},{0, 4, 5, 6},{0, 7, 8, 9}}; // Такой массив не удобно читать, можно написать немного удобней для чтения // Тот же самый двухмерный массив, но выстроенный как таблица int [,] array = { //Строки {0, 1, 2, 3}, //0 {0, 4, 5, 6}, //1 {0, 7, 8, 9}}; //2 //Столбцы 0 1 2 3 //В каждой строке обязательно должно быть одинаковое количество элементов/ //Иначе будет ошибка Console.WriteLine(array[2, 3]); // 2 - Строка 3 - Столбец Вывод:9 Console.WriteLine(array[1, 2]); Вывод:5 Console.WriteLine(array[0, 1]); Вывод:1 Вывод двухмерного массива в консоль // Вывести двухмерный массив, как я это делал с одномерным массивом, не получится // Console.WriteLine(array.Length); выведет количество всех элементов в массиве array // Но с помощью метода GetLength можно получить размер определенного измерения. // При работе с двухмерным массивом, метод GetLength может принять значение 0 или 1 - Столбец или строку соответственно int [,] array = { {0, 1, 2, 3}, {0, 4, 5, 6}, {0, 7, 8, 9}}; Console.WriteLine(array.GetLength(0)); // - Выведет кол-во строк массива Console.WriteLine(array.GetLength(1)); // - Выведет кол-во столбцов массива for (int i = 0; i < array.GetLength(0); i++) // Этот цикл будет перебирать строки массива { for (int j = 0; j < array.GetLength(1); j++) // Этот цикл будет перебирать столбцы массива { Console.Write(array[i, j] + " "); // Выводит строки } Console.WriteLine(); // Переносит строку после выполнения вложенного цикла } Вывод: Вывод1 ниже в спойлере // Обратите внимание что вложенный цикл, не может иметь такое же имя переменной как и во внешнем цикле // И ещё расскажу как работает этот цикл со вложенным в него циклом // Пускай цикл с переменой i будет - A, цикл с переменной j - B // За 1 итерацию цикла A, проходит целый вложенный цикл B // Т.е цикл A выбирает строку, а цикл B перебирает столбцы этой строки // И пока цикл B не завершит перебор столбцов, вторая итерация цикла A не начнётся. C# // Вывести двухмерный массив, как я это делал с одномерным массивом, не получится // Console.WriteLine(array.Length); выведет количество всех элементов в массиве array // Но с помощью метода GetLength можно получить размер определенного измерения. // При работе с двухмерным массивом, метод GetLength может принять значение 0 или 1 - Столбец или строку соответственно int [,] array = { {0, 1, 2, 3}, {0, 4, 5, 6}, {0, 7, 8, 9}}; Console.WriteLine(array.GetLength(0)); // - Выведет кол-во строк массива Console.WriteLine(array.GetLength(1)); // - Выведет кол-во столбцов массива for (int i = 0; i < array.GetLength(0); i++) // Этот цикл будет перебирать строки массива { for (int j = 0; j < array.GetLength(1); j++) // Этот цикл будет перебирать столбцы массива { Console.Write(array[i, j] + " "); // Выводит строки } Console.WriteLine(); // Переносит строку после выполнения вложенного цикла } Вывод: Вывод1 ниже в спойлере // Обратите внимание что вложенный цикл, не может иметь такое же имя переменной как и во внешнем цикле // И ещё расскажу как работает этот цикл со вложенным в него циклом // Пускай цикл с переменой i будет - A, цикл с переменной j - B // За 1 итерацию цикла A, проходит целый вложенный цикл B // Т.е цикл A выбирает строку, а цикл B перебирает столбцы этой строки // И пока цикл B не завершит перебор столбцов, вторая итерация цикла A не начнётся. вывод1 Заполнение двухмерного массива рандомными числами int [,] array = new int[5, 5]; Random rand = new Random(); for (int i = 0; i < array.GetLength(0); i++) { for (int j = 0; j < array.GetLength(1); j++) { array[i, j] = rand.Next(0, 9); Console.Write(array[i, j] + " "); } Console.WriteLine(); } Вывод: Вывод2 ниже в спойлере C# int [,] array = new int[5, 5]; Random rand = new Random(); for (int i = 0; i < array.GetLength(0); i++) { for (int j = 0; j < array.GetLength(1); j++) { array[i, j] = rand.Next(0, 9); Console.Write(array[i, j] + " "); } Console.WriteLine(); } Вывод: Вывод2 ниже в спойлере Вывод2
Karasu_san, добавил в закладки, продолжай, братик, обязательно изучу твой материал на следующей недели!
День 8 Массив - ссылочный тип Объясню что это значит на примере. int[] array = new int[5]; int[] tempArray = new int[3]; array = tempArray; // Присваивание ссылки, то есть теперь array и tempArray ccылаются на одну и ту же область памяти. array[0] = 3; Console.WriteLine(array[0]); Console.WriteLine(tempArray[0]); Вывод 3 3 // Ещё проще говоря эти 2 массива работают только с одной областью памяти, а не создаётся ещё одна :finger_up: // Ещё дополню, область памяти на которую ссылался массив array, до присваивания к нему tempArray, стёрлась из памяти // Надеюсь понятно объяснил, а то 2 часа ночи щас :smart2011: C# int[] array = new int[5]; int[] tempArray = new int[3]; array = tempArray; // Присваивание ссылки, то есть теперь array и tempArray ccылаются на одну и ту же область памяти. array[0] = 3; Console.WriteLine(array[0]); Console.WriteLine(tempArray[0]); Вывод 3 3 // Ещё проще говоря эти 2 массива работают только с одной областью памяти, а не создаётся ещё одна :finger_up: // Ещё дополню, область памяти на которую ссылался массив array, до присваивания к нему tempArray, стёрлась из памяти // Надеюсь понятно объяснил, а то 2 часа ночи щас :smart2011: Расширение массива Объясню на примере int[] numbers = new int[5] { 1, 3, 5, 3, 5 }; Console.WriteLine(numbers.Length); // Вывод 5 int[] tempNumbers = new int[numbers.Length + 5]; // Массив tempNumbers состоит из длинны масива numbers и ещё + 5 Console.WriteLine(tempNumbers.Length); // Вывод 10 for (int i = 0; i < numbers.Length; i++) { Console.Write($"{numbers[i]}"); // Вывод элементов массива numbers - 13535 } Console.WriteLine(); for (int i = 0; i < tempNumbers.Length; i++) { Console.Write($"{tempNumbers[i]}"); // Вывод элементов массива tempNumbers, но все элементы массива получили значение по умолчанию - 0000000000 } Console.WriteLine(); for (int i = 0; i < numbers.Length; i++) { tempNumbers[i] = numbers[i]; // Переписываем значения из массива numbers в tempNumbers } Console.WriteLine(); for (int i = 0; i < tempNumbers.Length; i++) { Console.Write($"{tempNumbers[i]}"); // Вывод элементов массива tempNumbers - 1353500000 } C# int[] numbers = new int[5] { 1, 3, 5, 3, 5 }; Console.WriteLine(numbers.Length); // Вывод 5 int[] tempNumbers = new int[numbers.Length + 5]; // Массив tempNumbers состоит из длинны масива numbers и ещё + 5 Console.WriteLine(tempNumbers.Length); // Вывод 10 for (int i = 0; i < numbers.Length; i++) { Console.Write($"{numbers[i]}"); // Вывод элементов массива numbers - 13535 } Console.WriteLine(); for (int i = 0; i < tempNumbers.Length; i++) { Console.Write($"{tempNumbers[i]}"); // Вывод элементов массива tempNumbers, но все элементы массива получили значение по умолчанию - 0000000000 } Console.WriteLine(); for (int i = 0; i < numbers.Length; i++) { tempNumbers[i] = numbers[i]; // Переписываем значения из массива numbers в tempNumbers } Console.WriteLine(); for (int i = 0; i < tempNumbers.Length; i++) { Console.Write($"{tempNumbers[i]}"); // Вывод элементов массива tempNumbers - 1353500000 }
Karasu_san, Лучше сразу разобрать значимые типы и ссылочные. Почему массив ссылочный тип. Где хранятся ссылки и значения. Мне кажется так будет проще построить полную картину происходящего :)
День 8.1 Строки - массив символов, Перебор массива с Foreach Строки - массив символов Cтроки или же, например, тип string - это массив символов, к его элементам можно так же обратиться по индексу. string str = "lolzteam"; Console.WriteLine(str[1]); // Вывод: o C# string str = "lolzteam"; Console.WriteLine(str[1]); // Вывод: o Менять символы с помощью str[1] = 'j'; не получится так как string используется только для чтения. Перебор массива с Foreach Цикл foreach позволяет перебрать массив не используя индексы. Как я до этого перебирал массивы int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; for (int i = 0; i < nums.Length; i++) { Console.WriteLine(nums[i]); } C# int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; for (int i = 0; i < nums.Length; i++) { Console.WriteLine(nums[i]); } Разберём этот же массив но используя foreach Синтаксис foreach foreach(var item in collection) { } var - тип данных, с которым мы работаем item - переменная которую вы определяете в скобках collection - коллекция, то есть массив или строка(о чём я писал выше) int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; foreach (int number in nums) { Console.WriteLine(number); } C# int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; foreach (int number in nums) { Console.WriteLine(number); } Из массива nums берётся элемент и записывается в переменную number и выводиться в консоль.
Ну вот и прошла зимняя сессия, наступил новый год. Пора дальше учить C# Функции Набор каких то именованных данных блоков которые имеют какой то список данных на вход, и имеют что то на выход. Метод объявляется с использованием сигнатуры, которая состоит из: Модификатор доступа - откуда эту функцию можно будет вызвать Например - private - допускает доступ к функции только из содержащего её класса или структуры. - public - доступ в любом фрагменте кода, в рамках приложения. - protected - позволяет получить доступ из содержащего класса или из производных классов - internal - доступ из файлов внутри одной сборки - static - функция является статическим членом класса, а не членом экземпляра объекта Тип возвращаемого значения - используется для указания типа данных, возвращаемого значения. Если функция не возвращает значение, используйте void Имя функции - функция должна иметь имя, что бы можно было вызвать функцию в коде. Функции принято называть глаголом или глаголом с существительным, пример ниже Список аргументов - разделённый запятыми список агрументов, передаваемых в функцию. Пример функции static void sayHello() { Console.WriteLine("Hello, lolzteam"); } CSHARP static void sayHello() { Console.WriteLine("Hello, lolzteam"); } static - модификатор доступа void - так как функция ничего не возвращает, используется void sayHello - имя функции аргументы пусты, так как передавать в функцию нам нечего. static void sayHello() { Console.WriteLine("Hello, lolzteam"); } sayHello(); sayHello(); sayHello(); sayHello(); Console.ReadLine(); CSHARP static void sayHello() { Console.WriteLine("Hello, lolzteam"); } sayHello(); sayHello(); sayHello(); sayHello(); Console.ReadLine(); Вывод https://imgur.com/a/NQ4pvhc Пример использования функции из курса который я смотрю *Одно из главных предназначений функции - избавление от добирающегося кода static void Main(string[] args) { Console.WriteLine("Привет!"); Console.WriteLine("Ты здесь?"); writeError("Нет интернета!"); Console.WriteLine("Cтранно..."); writeError("Оплатите интернет!!!"); // В круглых скобках аргумент, который передаётся в функцию writeError } static void writeError(string text) // В круглых скобках указываются входные данные (параметры), в нашем случае text который задаётся программистом { ConsoleColor defaultColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(text); Console.ForegroundColor = defaultColor; } CSHARP static void Main(string[] args) { Console.WriteLine("Привет!"); Console.WriteLine("Ты здесь?"); writeError("Нет интернета!"); Console.WriteLine("Cтранно..."); writeError("Оплатите интернет!!!"); // В круглых скобках аргумент, который передаётся в функцию writeError } static void writeError(string text) // В круглых скобках указываются входные данные (параметры), в нашем случае text который задаётся программистом { ConsoleColor defaultColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(text); Console.ForegroundColor = defaultColor; } Важно - параметр это то, что функция хочет получить. А аргумент - то, что мы передаём функции Вывод https://imgur.com/a/l7saRSP Без функции код бы выглядел не очень static void Main(string[] args) { Console.WriteLine("Привет!"); Console.WriteLine("Ты здесь?"); ConsoleColor defaultColor = Console.ForegroundColor; // Дублирующийся код Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Нет интернета"); Console.ForegroundColor = defaultColor; Console.WriteLine("Странно..."); ConsoleColor defaultColor = Console.ForegroundColor; // Дублирующийся код Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Оплатите интернет!!!"); Console.ForegroundColor = defaultColor; } CSHARP static void Main(string[] args) { Console.WriteLine("Привет!"); Console.WriteLine("Ты здесь?"); ConsoleColor defaultColor = Console.ForegroundColor; // Дублирующийся код Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Нет интернета"); Console.ForegroundColor = defaultColor; Console.WriteLine("Странно..."); ConsoleColor defaultColor = Console.ForegroundColor; // Дублирующийся код Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Оплатите интернет!!!"); Console.ForegroundColor = defaultColor; } Возврат значений и return static void Main(string[] args) { int x = 3, y = 8, sum; sum = Sum(x, y); Console.WriteLine(sum); } static int Sum(int number1, int number2) { int sum; sum = number1 + number2; return sum; } CSHARP static void Main(string[] args) { int x = 3, y = 8, sum; sum = Sum(x, y); Console.WriteLine(sum); } static int Sum(int number1, int number2) { int sum; sum = number1 + number2; return sum; } Вывод https://imgur.com/a/L74SSuq Необязательные параметры Так же пример из курса который я смотрю static void Main(string[] args) { Console.WriteLine("Привет!"); Console.WriteLine("Ты здесь?"); writeError("Нет интернета!", ConsoleColor.Green, symbol: '@'); Console.WriteLine("Cтранно..."); writeError("Оплатите интернет!!!"); } static void writeError(string text, ConsoleColor color = ConsoleColor.Red, char symbol = '!') // { ConsoleColor defaultColor = Console.ForegroundColor; Console.ForegroundColor = color; Console.WriteLine(symbol + text); Console.ForegroundColor = defaultColor; } CSHARP static void writeError(string text, ConsoleColor color = ConsoleColor.Red, char symbol = '!') // { ConsoleColor defaultColor = Console.ForegroundColor; Console.ForegroundColor = color; Console.WriteLine(symbol + text); Console.ForegroundColor = defaultColor; } всё что идёт после string text, является необязательными параметрами, то есть если их не указывать в аргументе, они будут иметь значение по умолчанию указанное после = Вывод https://imgur.com/a/AoLCGes
Karasu_san, такс, хотел бы задать вопрос. Может и глупый, и ты говорил, но все же хотел бы, чтобы ты сказал. Изучения языка ты проходишь на основе платного курса или же просто с того курса и метанита, что ты оставил в конце статьи ? Просто ты немного замотивировал меня, своими стараниями и отчетами ахах
ref и out Например есть такой код internal class Program { static void Main(string[] args) { int sum = 0, x = 1, y = 5; Add(sum, x, y); Console.WriteLine(sum); } static void Add(int sum, int x, int y) { sum = x + y; } } CSHARP internal class Program { static void Main(string[] args) { int sum = 0, x = 1, y = 5; Add(sum, x, y); Console.WriteLine(sum); } static void Add(int sum, int x, int y) { sum = x + y; } } Вывод - 0 хотя по логике вроде должна быть цифра 6 Дело в том, что когда мы передаем что-то в функцию, то передаётся не переменные а из значения.(Можно сказать копируем их из места вывода в функцию) Если переменная хранит какое-то значение, то оно просто копируется. Поэтому, если мы хотим передать значение по ссылке, и менять то что нам нужно, существуют модификаторы ref и out. И уже с помощью них, мы передаём не значение переменной, а ссылку в памяти, где хранится значение переменной. ref - входные параметры out - выходные параметры internal class Program { static void Main(string[] args) { int sum = 0, x = 1, y = 5; Add(ref sum, x, y); Console.WriteLine(sum); } static void Add(ref int sum, int x, int y) { sum = x + y; } } CSHARP internal class Program { static void Main(string[] args) { int sum = 0, x = 1, y = 5; Add(ref sum, x, y); Console.WriteLine(sum); } static void Add(ref int sum, int x, int y) { sum = x + y; } } Перед параметром и аргументом пишем ref Вывод - 6 Так как в функцию передаётся не значение, а ссылка на область в памяти где хранится значение, с которой дальше функци будет оперировать. Если не инициализировать переменную sum (Как я писал где то выше) она не будет храниться в памяти и не будет ссылки на область памяти. internal class Program { static void Main(string[] args) { int sum, x = 1, y = 5 Add(out sum, x, y); Console.WriteLine(sum); } static void Add(out int sum, int x, int y) { sum = x + y; } } CSHARP internal class Program { static void Main(string[] args) { int sum, x = 1, y = 5 Add(out sum, x, y); Console.WriteLine(sum); } static void Add(out int sum, int x, int y) { sum = x + y; } } Модификатор out сам инициализирует переменную и возвращает ссылку на область памяти где она храниться, Вывод так же - 6 Так как из функции за один раз может вернуться только что то одно, но бывают (и будут) случаи когда из функции нужно вернуть 2 или более значение модификаторы ref и out - помогут с этим. Я мог тут что то плохо и не понятно написать, так что советую посмотерть это видео (Вас сразу перекинет на нужный фрагмент) - Там обсалютно всё тоже самое, но без моих тупых сокращений </3 Перегрузки Бывают случаи, напримере с массивами ниже вы увидите, когда одна функция "не может справиться" с тем что вы от неё хотите. А создавать функцию с именем Name2, Name3.... и дублировать код с небольшими изминениями - ГОВНОКОД Для это существует перегрузки, функция может иметь точно такое же имя, но обязана иметь другие сигнатуры - Тип возвращаемого значения и параметры если хоть что то из этого отличается - возникает перегрузка. class Program { static void Main(string[] args) { int[] array1 = new int[5]; int[,] array2 = new int[5, 5]; array1 = Resize(array1, 10); // array2 = Resize(array2, 10, 10); // Компилятор самостояльно понимает какую функцию здесь использовать. } static int[] Resize(int[] array, int size) // Ресайзит одномерные массивы { int[] tempArray = new int[size]; for (int i = 0; i < array.Length; i++) { tempArray[i] = array[i]; } array = tempArray; return array; } static int[,] Resize(int[,] array, int x, int y) // Ресайзит двумерные массивы { int[,] tempArray = new int[x, y]; for (int i = 0;i < array.GetLength(0); i++) { for (int j = 0;j < array.GetLength(0); j++) { tempArray[i, j] = array[i, j]; } } array = tempArray; return array; } } CSHARP class Program { static void Main(string[] args) { int[] array1 = new int[5]; int[,] array2 = new int[5, 5]; array1 = Resize(array1, 10); // array2 = Resize(array2, 10, 10); // Компилятор самостояльно понимает какую функцию здесь использовать. } static int[] Resize(int[] array, int size) // Ресайзит одномерные массивы { int[] tempArray = new int[size]; for (int i = 0; i < array.Length; i++) { tempArray[i] = array[i]; } array = tempArray; return array; } static int[,] Resize(int[,] array, int x, int y) // Ресайзит двумерные массивы { int[,] tempArray = new int[x, y]; for (int i = 0;i < array.GetLength(0); i++) { for (int j = 0;j < array.GetLength(0); j++) { tempArray[i, j] = array[i, j]; } } array = tempArray; return array; } } Вывод я показыать не буду(мне лень), скопируйте и проверьте сам :)
Коллекции - некий программный объект, который в себе хранит набор значение одного или нескольких типов. В коллекцию можно что то записывать, или что то извлекать из неё List List похож чем то на массив, но в отличии от листа, массив трудне расширять Объявление List List<тип_данных> имя = new List<тип_данных>(кол-во_элементов); // Обычно количество элементов не указывается Работа с List Присваивать и считывать значения из List`а можно так же как и в массиве - с помощью index Но удобство листа заключается в наличии методов. Add - добовляет объект в конец листа Clear - очищает весь лист AddRange - добавление в List какого либо диапозона чисел Count - длинна List`a Remove - удаляет из List`а первое повашееся число, равное числу, которое было указано в скобках RemoveAt - удаление объекта с помощью индекса IndexOf - находит в List`e первое повашееся число, равное числу, которое было указано в скобках и выводит его индекс Insert - вставляет число в List по индексу, перенося число, которое было до этого на этой позиции вправо на 1 List<int> numbers = new List<int>(); numbers.Add(5); numbers.Add(6); numbers.Add(7); numbers.Add(8); numbers.AddRange(new int[] {1, 2, 3, 5}); numbers.Insert(5, 15); // Добавит в List число 15 на позицию 5 - Вывод 5 6 7 8 1 15 2 3 5 numbers.RemoveAt(2); // Удалит 3 элемент с индексом 2, т.е цифру 7 - Вывод 5 6 8 1 15 2 3 5 numbers.Remove(5); // Удалит цифру 5 с индеком 0 - Вывод 6 8 1 15 2 3 5 for(int i = 0;i < numbers.Count ;i++) { Console.WriteLine(numbers[i]); } CSHARP List<int> numbers = new List<int>(); numbers.Add(5); numbers.Add(6); numbers.Add(7); numbers.Add(8); numbers.AddRange(new int[] {1, 2, 3, 5}); numbers.Insert(5, 15); // Добавит в List число 15 на позицию 5 - Вывод 5 6 7 8 1 15 2 3 5 numbers.RemoveAt(2); // Удалит 3 элемент с индексом 2, т.е цифру 7 - Вывод 5 6 8 1 15 2 3 5 numbers.Remove(5); // Удалит цифру 5 с индеком 0 - Вывод 6 8 1 15 2 3 5 for(int i = 0;i < numbers.Count ;i++) { Console.WriteLine(numbers[i]); } Вывод Queue (В переводе с английского - Очередь) Определённая коллекция работающая по алгоритму - первый вошёл, первый вышел Объявление очереди Queue<тип_данных> имя = new Queue<тип_данных>(); Работа с Queue Методы Queue Enqueue - добавляет элемент в Queue Dequeue - вытаскивает элемент из Queue Peek - получает элемент из Queue Queue<string> users = new Queue<string>(); users.Enqueue("Karasu"); users.Enqueue("Mori"); users.Enqueue("RaysMorgan"); users.Enqueue("RedBebril"); foreach (var connecting in users) { Console.WriteLine(connecting); // Вывод - Karasu Mori RaysMorgan RedBebril } Console.WriteLine("Первый в очереди на вход - " + users.Dequeue()); // Вывод - Первый в очереди на вход - Karasu Console.WriteLine("Следющий пользователь на очереди - " + users.Peek()); // Вывод - Первый в очереди на вход - Mori foreach (var connecting in users) { Console.WriteLine(connecting); // Вывод - Mori RaysMorgan RedBebril | Кarasu в очереди больше нет, так как Dequeue убрало его из очереди } CSHARP Queue<string> users = new Queue<string>(); users.Enqueue("Karasu"); users.Enqueue("Mori"); users.Enqueue("RaysMorgan"); users.Enqueue("RedBebril"); foreach (var connecting in users) { Console.WriteLine(connecting); // Вывод - Karasu Mori RaysMorgan RedBebril } Console.WriteLine("Первый в очереди на вход - " + users.Dequeue()); // Вывод - Первый в очереди на вход - Karasu Console.WriteLine("Следющий пользователь на очереди - " + users.Peek()); // Вывод - Первый в очереди на вход - Mori foreach (var connecting in users) { Console.WriteLine(connecting); // Вывод - Mori RaysMorgan RedBebril | Кarasu в очереди больше нет, так как Dequeue убрало его из очереди } Вывод Stack Stack чем то похож на Queue, но есть отличие - последний вошёл, первый вышел Объявление Stack Stack<тип_данных> имя = new Stack<тип_данных>(); Работа со Stack Методы Stack Push - добавляет числа в Stack Pop - извлекает и возвращает элемент Count - длинна Stack`a Peek - берёт последний элемент Stack`a Stack<int> numbers = new Stack<int>(); numbers.Push(0); numbers.Push(1); numbers.Push(2); numbers.Push(3); numbers.Push(4); numbers.Push(5); foreach (var number in numbers) { Console.WriteLine(number); // Вывод 5 4 3 2 1 0 - Прочитано последниее число и выведено первым } while (numbers.Count > 0) { Console.WriteLine(numbers.Pop()); // Вывод 5 4 3 2 1 0 - Прочитано последниее число и выведено первым } CSHARP Stack<int> numbers = new Stack<int>(); numbers.Push(0); numbers.Push(1); numbers.Push(2); numbers.Push(3); numbers.Push(4); numbers.Push(5); foreach (var number in numbers) { Console.WriteLine(number); // Вывод 5 4 3 2 1 0 - Прочитано последниее число и выведено первым } while (numbers.Count > 0) { Console.WriteLine(numbers.Pop()); // Вывод 5 4 3 2 1 0 - Прочитано последниее число и выведено первым } Вывод Dictionary - словарь Коллекция словарь, не похожа на предидущие. Словарь имеет 2 параметра - 1. Тип Ключа 2. Тип значения Объявление Dictionary Dictionary<тип_ключа, тип_значения> имя = new Dictionary<тип_ключа, тип_значения>(); Работа с Dictionary Методы Dictionary Add - добавляет элемент в словарь Clear - очищает словарь ContainsKey - проверяет наличие элемента с определённым ключем, и возвращает true если такой ключ присутствует ConstainsValue - проверяет наличие элемента с определнным значение, и возвращает true если такое значение присутствует Remove - удаляет элемент из словоря по ключу Dictionary<string, string> countries = new Dictionary<string, string>(); countries.Add("Россия", "Москва"); Console.WriteLine(countries["Россия"]); // Вывод - Москва if (countries.ContainsKey("Росси")) { Console.WriteLine(countries["Россия"]); // Вывод - | Ничего не выведиться так как мы проверили на наличие ключа, которого нет в нашем словаре } CSHARP Dictionary<string, string> countries = new Dictionary<string, string>(); countries.Add("Россия", "Москва"); Console.WriteLine(countries["Россия"]); // Вывод - Москва if (countries.ContainsKey("Росси")) { Console.WriteLine(countries["Россия"]); // Вывод - | Ничего не выведиться так как мы проверили на наличие ключа, которого нет в нашем словаре } Вывод Перебор словаря Dictionary<string, string> countries = new Dictionary<string, string>(); countries.Add("Россия", "Москва"); countries.Add("Беларусь", "Минск"); countries.Add("Япония", "Токио"); foreach (var city in countries) // Перебор по ключу и значению { Console.WriteLine($"Страна - {city.Key} Город - {city.Value}"); } Console.ReadLine(); foreach(var city in countries) // Перебор по значению { Console.WriteLine($"Город - {city.Value}"); } Console.ReadLine(); foreach (var country in countries) // Перебор по ключу { Console.WriteLine($"Город - {country.Key}"); } Console.ReadLine(); foreach (var country in countries.Keys) // Перебор по ключу Способ2 { Console.WriteLine("Страна " + country); } Console.ReadLine(); foreach (var city in countries.Values) // Перебор по значению Способ2 { Console.WriteLine("Город " + city); } Console.ReadLine(); foreach (var city in countries) // Просто перебор { Console.WriteLine(city); } Console.ReadLine(); CSHARP Dictionary<string, string> countries = new Dictionary<string, string>(); countries.Add("Россия", "Москва"); countries.Add("Беларусь", "Минск"); countries.Add("Япония", "Токио"); foreach (var city in countries) // Перебор по ключу и значению { Console.WriteLine($"Страна - {city.Key} Город - {city.Value}"); } Console.ReadLine(); foreach(var city in countries) // Перебор по значению { Console.WriteLine($"Город - {city.Value}"); } Console.ReadLine(); foreach (var country in countries) // Перебор по ключу { Console.WriteLine($"Город - {country.Key}"); } Console.ReadLine(); foreach (var country in countries.Keys) // Перебор по ключу Способ2 { Console.WriteLine("Страна " + country); } Console.ReadLine(); foreach (var city in countries.Values) // Перебор по значению Способ2 { Console.WriteLine("Город " + city); } Console.ReadLine(); foreach (var city in countries) // Просто перебор { Console.WriteLine(city); } Console.ReadLine(); Вывод
Ооп я тут писать не хочу, слишком впадлу, чуть позже, может быть, напишу о linq и еще о всякой фигне, которая может пригодится