Всем ку.. Изучая 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, Не все переменные принято писать через lowerCamelCase, например "глобальные" переменные, константы пишут через UpperCamelCase.
День 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 и еще о всякой фигне, которая может пригодится