Знак доллара в си шарп
С# для новичков: развеиваем мифы и пишем простого чат-бота
Рассказываем о С#, даём полезные советы и делаем первые шаги в программировании.
Что такое С#
С# (произносится «си шарп») — это современный язык программирования, созданный компанией Microsoft. На нём можно писать программы любой сложности для любых платформ и операционных систем.
C# устроен так, чтобы программист мог писать меньше кода. Для этого в языке много «магических конструкций» и «синтаксического сахара» — способов выразить идею лаконично.
Это кроссплатформенный язык, то есть ваша программа будет работать не только в той операционной системе, в которой она написана, но и в других.
Мария Грегуш
В бэкграунде — программирование, французский язык, академическое рисование, капоэйра. Сейчас учит финский. Любит путешествия и Балтийское море.
Мифы о работе в С#
C# может казаться страшным и сложным, но на самом деле его совсем не стоит бояться. Давайте посмотрим на главные мифы о нём.
- Чтобы стать C#-разработчиком, надо учиться долгие годы. Это очень популярный миф, но на самом деле достаточно нескольких месяцев, и вы уже можете работать junior-разработчиком .
- Чтобы быть C#-разработчиком, надо разбираться в высшей математике. Это стереотип не только о конкретном языке, но и о программировании в целом. В реальности программисты 99% времени не используют математику — за исключением некоторых областей, прямо с ней связанных. Если вы делаете веб-сайты, создаете мобильные приложения, видеоигры — математика вам не понадобится.
- C# — это что-то сверхсложное. Как мы уже сказали, этот язык создавался так, чтобы в нём было удобно работать. Поэтому любой хорошо написанный код читается и понимается так же легко, как текст на английском языке.
Стартовая позиция в программировании. Специалист, который имеет небольшой опыт работы с каким-то языком и выполняет простую работу с перспективой роста.
Почему же стоит учить C#
- Этот язык популярен и быстро развивается.
- Разработчики C# востребованы.
- С ним удобно работать, легко читать код.
- C# и связанные с ним технологии можно освоить за несколько месяцев.
Что разрабатывают на С#
- Десктопные приложения.
- Серверные приложения и веб-сайты.
- Мобильные приложения.
- Консольные приложения и утилиты.
- Универсальные приложения для десктопов, планшетов, смартфонов.
Этот язык создавался специально для разработки под Windows, так что с программами под эту операционную систему у вас не будет проблем. Это касается и Windows Phone, для которого C# — основной язык разработки. Но это не значит, что вы можете писать только для Windows, — C# замечательно работает и с другими операционными системами.
Как эффективнее работать с C#
Для эффективной работы полезно знать о дополнительных инструментах. Вот некоторые из них:
- WPF(Windows Presentation Foundation) поможет легко и быстро создать интерфейс для любых экранов, уменьшает количество кода, отображающего интерфейс.
- Xamarin — фреймворк для разработки кроссплатформенных приложений для Windows Phone, Android и iOS. То есть вы напишете один код, и он сразу будет работать на всех основных платформах.
- ASP.NET помогает просто и быстро связать серверный код с клиентским в серверных приложениях и веб-разработке.
- Entity Framework — один из лучших фреймворков для работы с базами данных. Позволяет работать с данными как с объектами.
- LINQ(Language Integrated Query) — мини-язык запросов, встроенный в C# и позволяющий легко выбирать, фильтровать, сортировать и группировать любые данные из любых источников: баз данных, массивов, структур, файлов и так далее.
- Visual Studio — среда разработки, созданная специально для языка C#.
Писать код в среде разработки удобно. У неё много плюсов, например:
- подскажет, если в коде есть ошибка;
- имеет встроенную справку на случай, если вы что-то забыли;
- генерирует часть кода за вас (дополнит названия функций, шаблонные структуры).
Пишем чат-бота
Теперь пора перейти к практике. Сегодня мы будем работать в онлайн-среде ideone. Серьезные программы в онлайн-средах не пишутся, но для обучения и практики это самое то!
Итак, откроем сайт ideone. Слева будет окошко для кода. Возможно, что по умолчанию там будет выбран другой язык — тогда просто нажмите на его название и выберите C#.
Самые первые слова любого программиста — «Привет, мир!» (Hello, World!), поэтому и мы начнём с них. Хотя не совсем: мы позволили себе заменить «мир» на «Скиллбокс» 😉 Чтобы отобразить наше сообщение, используем команду Console.WriteLine (). Свой текст напишем в скобках и не забудем поставить кавычки. Вот так:
Чтобы запустить свой код и протестировать, работает ли он, нажмём зелёную кнопку RUN в углу.
Чтобы общаться с нашим будущим чат-ботом, нам надо научить его читать — то есть сделать так, чтобы мы могли задавать информацию, с которой он будет работать. Для этого мы используем команду Console.ReadLine (). Она прочитает текст, который написал пользователь.
Давайте уже напишем начало: пусть чат-бот здоровается, а потом читает наше сообщение:
Прочитать-то он прочитает, но память у бота короткая — надо, чтобы он это сообщение запомнил. Для этого сохраним его в переменную — назовём её, например, text. Вместо Console.ReadLine () напишем вот так:
Пусть бот уточняет, что именно мы ему сказали, — вдруг мы забудем. Сделаем мы это той же командой Console.WriteLine (), только в этот раз мы не знаем заранее, что надо будет написать, поэтому используем переменную. Чтобы вставить переменную в текст, обозначим её фигурными скобками, а перед кавычками напишем знак доллара, вот так:
Важно!
Не забывайте ставить точку с запятой в конце каждой строчки!
Чтобы задать свой input, запустите программу, а потом нажмите кнопку edit слева вверху над кодом.
Снизу откроется окошко с надписью input над ним. То, что вы там напишете, программа использует при следующем запуске.
Сейчас наш чат-бот умеет здороваться и может повторить, что мы ему написали. Давайте научим его реагировать на то, что мы пишем. Для этого нам понадобится конструкция if — она проверяет, соблюдено ли условие, и решает, что делать дальше. На новой строке напишем if и в круглых скобках напишем условие. Пусть в ответ на «Привет» бот отвечает «Здарова!». Мы можем написать вот так:
У нашего решения есть несколько проблем. Первая: если мы напишем весь свой текст маленькими или большими буквами, программа его не опознает. Что с этим делать? Добавим команду ToLower (), которая заменит все буквы на маленькие, и текст, с которым мы сравниваем сообщение пользователя, тоже перепишем маленькими буквами, вот так:
А что, если мы напишем «Привет, как дела?»? Наш бот никак не отреагирует. Чтобы это исправить, используем функцию Contains (), которая проверит, есть ли нужная строка в нашем вводе.
Можем разнообразить словарный запас нашего бота, добавив ещё условий:
Теперь, если мы напишем «Привет! Как тебя зовут? Как дела?», наш бот напишет ответ на все фразы по очереди.
Важно!
Если бы вы писали более сложного «настоящего» бота или другую программу, вы бы не копировали один и тот же код много раз, а использовали файл, базу данных или что-то другое. Когда одна и та же часть повторяется много раз, код неудобно читать и тяжело исправлять.
А что, если мы хотим получать не только такие ответы, но и меняющуюся информацию? Например, нам интересно, какой сегодня день. Если бы мы написали сегодняшнюю дату в такую же конструкцию, как выше, то или нам пришлось бы переписывать код каждый день, или наша программа сразу бы устарела. Нам поможет функция DateTime. Спросим у неё, какая сейчас (Now) дата, переведём это в строку нужного формата (ToString («dd.MM.yyyy»)) и всё это сохраним в переменную date. Вот так это выглядит:
И напоследок ещё одна важная тема.
Конструкция if часто идет в паре с else. Else описывает, что сделать в том случае, если условие из if не выполнится.
Используется else после if — но мы уже не пишем условие, а только действие в фигурных скобках. Вот пример этой конструкции:
Теперь, если мы напишем сообщение боту без слова «привет», он обидится и будет ругаться.
Для первого раза всё! Это были основы основ C#. Вы уже знаете, как отобразить текст (и не только), работать с информацией от пользователя, искать в тексте фразы, и попробовали работать с конструкцией if-else, которая очень важна. Из этих «кирпичиков» можно смело начинать строить!
Если же вас интересует более глубокое погружение в C# и вы хотите научиться работать с этим языком уверенно и профессионально, можно записаться на наш курс «Профессия C#-разработчик».
Курс
Профессия С#-разработчик
130 часов — и вы научитесь писать программы на языке, созданном Microsoft. Вы создадите 5 проектов для портфолио, даже если до этого никогда не программировали. После обучения — гарантированное трудоустройство.
Форматированный вывод в C#
Значит, дело было так. Я писал программу на C#, в которой обрабатывалась матрица вещественных чисел, а затем выводилась в консоль. И все бы ничего, однако возникла одна проблема — вывод матрицы был просто ужасен, в том плане, что каждый элемент содержал разное количество символов, да и к тому же, количество символов, я Вам скажу, было немало. Решение данной проблемы я стал искать в Интернете. И вот, спустя некоторое время и посетив несколько сайтов, я нашел замечательную статью, под названием «String Format for Double [C#]» на сайте csharp-examples.net. Так как этот сайт полностью на английском языке, и мне очень понравилась эта статья, то я решил ее перевести.
Начнем!
В следующих примерах показано, как переводить вещественные числа в строку в C#. Для этого Вы можете использовать статический метод String.Format или методы экземпляров double.ToString и float.ToString.
Цифры после точки
В этом примере демонстрируется перевод вещественного числа в строку с фиксированным числом десятичных знаков. Например, для двух знаков используется шаблон «0.00». Если вещественное число содержит менее десятичных знаков, то оставшиеся позиции справа заполняются нулями, если же число знаков больше — производится округление.
Для получения строки с переменным количеством знаков используется символ «#». Чтобы на выходе получить строку, в которой количество десятичных знаков будет не более двух, используйте шаблон «0.##».
Цифры перед точкой
Если на выходе нужно получить строку, в которой число знаков перед точкой будет не менее заданного числа, используйте шаблон, в котором указывается столько нулей перед точкой, сколько символов должно быть минимально.
Разделитель тысяч
Чтобы в строках явно отделять тысячи, к обычному шаблону слева добавляется «0,» (ноль с запятой). К примеру, шаблон «0,0.0» позволяет получить строку, в которой явно отделяются тысячи, а число символов после точки будет не более одного.
Ведущие Нули
Вещественные числа, не превосходящие единицы по абсолютному значению, можно форматировать двумя способами:
- с ведущими нулями
- без ведущих нулей
Случай с ведущими нулями — самый обычный. Для него используются те же шаблоны, что описаны выше.
Чтобы получать строки без ведущих нулей, используется символ «#» перед точкой. Например, по шаблону «#.0» получим строки вида «.5», «123.5».
Выравнивание с помощью пробелов
Для выравнивания числа по правому краю используется запятая перед двоеточием. То есть, ставится запятая, а следом идет число, которое указывает, сколько пробелов должно быть. Пример: «0,10:0.0″.
Для выравнивания по левому краю, шаблон будет таким же, за исключением того, что число пробелов должно быть указано со знаком минуса.
P.S. Этот способ можно использовать только с помощью метода String.Format
Пользовательское форматирование отрицательных чисел и нулей
Если Вам необходимо получить строки в своем стиле форматирования, используйте точку с запятой для разделения шаблона на три части. Первая часть отвечает за форматирование положительных чисел, вторая — отрицательных, третья — нулей. Если Вы пропустите последнюю часть, то нули будут отформатированы так же, как и положительные числа.
Некоторые забавные примеры
Как Вы могли заметить в предыдущем примере, Вы можете вставить любой текст в шаблон, например, «my text 0.0″. Вы даже можете вставить текст между нулями: «aaa.bbb0″.
Небольшое мое дополнение к статье
В зависимости от локали (языкового стандарта программы), выводимые символы могут отличаться. Например, вместо точек выводятся запятые и т.д. К слову, у меня вместо десятичной точки выводится запятая, а вместо тысячного разделителя — пробел.
10 фич в C#, о которых вы определённо должны узнать и начать их использовать
- Переводы, 15 декабря 2016 в 2:28
Если вы только начали изучение C# или же решили расширить свои знания, мы нашли для вас 10 фич, знание которых позволит вам избежать ошибок, писать более понятный код и сохранить кучу времени.
1. async / await
Использование паттернов async / await позволяет разблокировать UI / текущий поток во время выполнения блочных операторов. Паттерны async / await позволяют коду продолжить выполнение, даже если что-то блокирует его выполнение (например, веб-запрос).
2. Инициализаторы объектов / массивов / коллекций
Данный пример может быть особенно полезен в юнит-тестировании, но в других случаях лучше использовать конструкторы.
3. Лямбды, предикаты, делегаты и замыкания
Эти фичи просто незаменимы во многих случаях: например, при использовании LINQ. Поэтому рекомендуем вам убедиться, что вы действительно понимаете, когда и как их использовать.
4. ?? (Оператор объединения с NULL)
x ?? y — возвращает x , если значение отличается от null ; в противном случае возвращает y .
Может быть несколько операторов .
?? также может быть использован для перевода типов null в не null :
5. $”” (Интерполяция строк) — C# 6
Фича в C# 6 позволяет эффективно и элегантно собирать строки:
6. ?.(определяет null) — C# 6
x?.y — доступ к членам, определяемый условием null . Возвращает значение null , если левый операнд имеет значение null .
Больше никаких NullReferenceExceptions!
7. Выражение nameof — C# 6
Может показаться, что выражение nameof не особо полезно, но это не так. При использовании автоматических инструментов рефакторинга (например, ReSharper) иногда может потребоваться обратиться к аргументу метода по его имени:
Вот, как это должно быть:
8. Инициализаторы свойств (property) — C# 6
Инициализаторы свойств позволяют задавать начальные значения для свойств:
Польза их использования заключается в том, что вы не можете объявить setter, тем самым делая свойства неизменяемыми. Инициализаторы свойств хорошо работают в связке с синтаксисом первичного конструктора в C# 6.
9. Операторы as и is
Is — совместимость типов. Возвращает значение true, если вычисленный левый операнд может быть приведен к типу, указанному в правом операнде (статический тип).
As — преобразование типов. Возвращает левый операнд, приведенный к типу, заданному правым операндом (статический тип), но as возвращает null , где (T)x вызывает исключение.
10. Ключевое слово yield
Ключевое слово yield позволяет заполнить интерфейс IEnumerable объектами (items). Следующий пример вернет все степени двойки от 2 до 2 в степени 8 (то есть 2, 4, 8, 16, 32, 128, 256):
В правильных руках yield — очень мощная вещь. Оно позволяет с легкостью генерировать последовательность объектов, то есть системе не придется перечислять всю коллекцию целиком — это может быть сделано по требованию.
Ввод-вывод в Си
Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.
Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции
- printf() — для вывода информации
- scanf() — для ввода информации.
Вывод информации
Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.
Общая форма записи функции printf() :
СтрокаФорматов состоит из следующих элементов:
- управляющих символов;
- текста, представленного для непосредственного вывода;
- форматов, предназначенных для вывода значений переменных различных типов.
Объекты могут отсутствовать.
Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘’ перед ним.
Основные управляющие символы:
- ‘n’ — перевод строки;
- ‘t’ — горизонтальная табуляция;
- ‘v’ — вертикальная табуляция;
- ‘b’ — возврат на символ;
- ‘r’ — возврат на начало строки;
- ‘a’ — звуковой сигнал.
Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:
- %d — целое число типа int со знаком в десятичной системе счисления;
- %u — целое число типа unsigned int ;
- %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
- %o — целое число типа int со знаком в восьмеричной системе счисления;
- %hd — целое число типа short со знаком в десятичной системе счисления;
- %hu — целое число типа unsigned short ;
- %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
- %ld — целое число типа long int со знаком в десятичной системе счисления;
- %lu — целое число типа unsigned long int ;
- %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
- %f — вещественный формат (числа с плавающей точкой типа float );
- %lf — вещественный формат двойной точности (числа с плавающей точкой типа double );
- %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
- %c — символьный формат;
- %s — строковый формат.
Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа % . После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си
Результат работы программы
Тот же самый код может быть представлен с использованием одного вызова printf :
Табличный вывод
При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:
В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.
Ввод информации
Функция форматированного ввода данных с клавиатуры scanf() выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf( ) :
Строка форматов аналогична функции printf() .
Для формирования адреса переменной используется символ амперсанд ‘&’ :
адрес = &объект
Строка форматов и список аргументов для функции обязательны.
Результат работы программы:
Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку
Другой вариант — воспользоваться функцией защищенного ввода scanf_s( ) , которая появилась несколько позже, но содержит тот же самый список параметров.
Язык программирования C#
Язык С#. Символы и строки
В C# существуют два вида строковых констант (литерал):
- обычные константы — строка символов, заключенная в кавычки string str= “d:\СП21\С#”;
- @-константа — константа c предшествующим знаком @ string str= @ “d:СП21С#”;
В @-константах все символы трактуются в соответствии с их изображением, поэтому путь к файлу лучше задавать @-константой.
Класс Char
Char – символы в кодировке Unicode — хранятся в двух байтах
Методы класса Char
GetNumericValue
Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае.
GetUnicodeCategory
Возвращает категорию Unicode-символа. В Unicode символы разделены на категории, например цифры (DecimalDigitNumber), римские цифры (LetterNumber), разделители строк (LineSeparator), буквы в нижнем регистре (LowercaseLetter) и т.д.
IsControl
Возвращает true, если символ является управляющим.
IsDigit
Возвращает true, если символ является десятичной цифрой.
IsLetter
Возвращает true, если символ является буквой.
IsLetterOrDigit
Возвращает true, если символ является буквой или десятичной цифрой.
IsLower
Возвращает true, если символ задан в нижнем регистре.
IsNumber
Возвращает true, если символ является числом (десятичным или шестнадцатеричным).
IsPunctuation
Возвращает true, если символ является знаком препинания.
IsSeparator
Возвращает true, если символ является разделителем.
IsUpper
Возвращает true, если символ задан в верхнем регистре.
IsWhiteSpace
Возвращает true, если символ является пробельным (пробел, перевод строки, возврат каретки).
Parse
Преобразует строку в символ (строка должна состоять из одного символа).
ToLower
Преобразует символ в нижний регистр
ToUpper
Преобразует символ в верхний регистр
Массив символов char []
В языке C# массив char [] — обычный массив:
- не имеет завершающего нуля,
- его нельзя инициализировать строкой символов
Преобразование строки в массив символов:
string hello = «Hello, World!»;
char[ ] str = hello.ToCharArray();
Класс String
- В классе String невозможно изменить содержимое строки или ее длину.
- При каждом изменении строки создается новый объект, а прежний превращается в мусор.
- Для работы со строками изменяемой длины и содержания используется класс StringBuilder
string str;
string world = «Мир«;
string str1 = new string(‘ ‘, 20);
Преобразование массива символов в строку:
char[ ] mch = < 'М', 'а', 'й', 'к', 'о', 'п' >;
string str2 = new string(mch);
Для строк определены следующие операции:
• присваивание (=);
• проверка на равенство (==);
• проверка на неравенство ( ! = ) ;
• обращение по индексу ( [ ] ) ;
• сцепление (конкатенация) строк ( + ) .
Несмотря на то, что строки являются ссылочным типом данных, на равенство и неравенство проверяются не ссылки, а значения строк! Строки равны, если имеют одинаковое количество символов и совпадают посимвольно.