Справочник от Автор24
Поделись лекцией за скидку на Автор24

Базовые элементы языка С#

  • 👀 277 просмотров
  • 📌 243 загрузки
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Базовые элементы языка С#» pdf
БАЗОВЫЕ ЭЛЕМЕНТЫ ЯЗЫКА C# Состав языка Алфавит – совокупность допустимых в языке символов. Алфавит языка С# включает: 1. Прописные и строчные латинские буквы и буквы национальных алфавитов (включая кириллицу); 2. Арабские цифры от 0 до 9, шестнадцатеричные цифры от A до F; 3. Специальные знаки: " { }, |; [ ] ( ) + – / % * . \ ' : ? < = > ! & ~ ^ @ _. 4. Пробельные символы: пробел, символ табуляции, символ перехода на новую строку. Из символов алфавита формируются лексемы языка: – идентификаторы, – ключевые (зарезервированные) слова, – знаки операций, константы, – разделители (скобки, точка, запятая, пробельные символы). Границы лексем определяются другими лексемами, такими, как разделители или знаки операций. В свою очередь лексемы входят в состав выражений (выражение задает правило вычисления некоторого значения) и операторов (оператор задает законченное описание некоторого действия). Идентификатор – это имя программного элемента: константы, переменной, метки, типа, класса, объекта, метода и т.д. Идентификатор может включать латинские буквы и буквы национальных алфавитов, цифры и символ подчеркивания. Прописные и строчные буквы различаются, например, myname, myName и MyName — три различных имени. Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы и другие разделители внутри имен не допускаются. Язык С# не налагает никаких ограничений на длину имен, однако для удобства чтения и записи кода не стоит делать их слишком длинными. Для улучшения читабельности кода программным элементам следует давать осмысленные имена, составленные в соответствии с определенными правилами. Существует несколько видов нотаций – соглашений о правилах создания имен. В нотации Pascal каждое слово, входящее в идентификатор, начинается с заглавной буквы. Например: Age, LastName, TimeOfDeath. Венгерская нотация отличается от предыдущей наличием префикса, соответствующего типу величины. Например: fAge, sName, iTime. В нотации Camel с заглавной буквы начинается каждое слово идентификатора, кроме первого. Например: age, lastName, timeOfDeath. Наиболее часто используются нотации Pascal или Camel. Однако в простых программах будут использоваться однобуквенные переменные. Ключевые слова – это зарезервированные идентификаторы, которые имеют специальное значение для компилятора, например, static, int и т.д. Ключевые слова можно использовать только по прямому назначению. Однако если перед ключевым словом поставить символ @, например, @int, @static, то полученное имя можно использовать в качестве идентификатора. С полным перечнем ключевых слов и их назначением можно ознакомиться в справочной системе С#. Типы данных С# является языком со строгой типизацией. В нем необходимо объявлять тип всех создаваемых программных элементов (например, переменных, объектов, окон, кнопок и т.д.), что позволяет среде CLR (CLR – общеязыковая исполняющая среда – исполняющая среда для байт-кода CIL (MSIL), в который компилируются программы, написанные на .NET-совместимых языках программирования (C#, Managed C++, Visual Basic .NET, F# и прочие). CLR является одним из основных компонентов пакета Microsoft .NET Framework.) предотвращать возникновение ошибок, следя за тем, чтобы объектам присваивались значения только разрешенного типа. Тип программного элемента сообщает компилятору о его размере (например, тип int показывает, что объект занимает 4 байта) и возможностях (например, кнопка может быть нарисована, нажата и т. д.). В С# типы делятся на три группы: 1. базовые типы – предлагаемые языком; 2. типы, определяемые пользователем; 3. анонимные типы – типы, которые автоматически создаются на основе инициализаторов объектов (начиная с версии С# 3.0). Кроме того, типы С# разбиваются на две другие категории: размерные типы (value type) и ссылочные типы (reference type). Почти все базовые типы являются размерными типами. Исключение составляют типы Object и String, которые являются базовыми, но ссылочными типами данных. Все пользовательские типы, кроме структур, являются ссылочными. Дополнительно к упомянутым типам, язык С# поддерживает типы указателей, однако они используются только с неуправляемым кодом. Принципиальное различие между размерными и ссылочными типами состоит в способе хранения их значений в памяти. В первом случае фактическое значение хранится в стеке (или как часть большого объекта ссылочного типа). Адрес переменной ссылочного типа тоже хранится в стеке, но сам объект хранится в куче. Стек – это структура, используемая для хранения элементов по принципу LIFO (Last input – first output или первым пришел – последним ушел). В данном случае под стеком понимается область памяти, обслуживаемая процессором, в которой хранятся значения локальных переменных. Куча – область памяти, используемая для хранения данных, работа с которыми реализуется через указатели и ссылки. Память для размещения таких данных выделяется программистом динамически, а освобождается сборщиком мусора. Сборщик мусора уничтожает программные элементы в стеке через некоторое время после того, как закончит существование раздел стека, в котором они объявлены. То есть, если в пределах блока (фрагмента кода, помещенного в фигурные скобки {}) объявлена локальная переменная, соответствующий программный элемент будет удален по окончании работы данного блока. Объект в куче подвергается сборке мусора через некоторое время после того, как уничтожена последняя ссылка на него. Язык С# предлагает обычный набор базовых типов, каждому из них соответствует тип, поддерживаемый общеязыковой спецификацией .NET (CLS). Тип Размер в в языке C# байтах Базовый тип object Логический тип bool 1 Целые типы sbyte 1 byte 1 short 2 ushort 2 int 4 uint long 4 8 Тип .NET Object Может хранить все что угодно, т.к. является всеобщим предком Boolean true или false SByte Byte Int16 UInt16 Int32 Целое со знаком (от –128 до 127) Целое без знака (от 0 до 255) Целое со знаком (от –32768 до 32767) Целое без знака (от 0 до 65535) Целое со знаком (от –2147483648 до 2147483647) Целое число без знака (от 0 до 4294967295) Целое со знаком (от –9223372036854775808 до 9223372036854775807) Целое без знака (от 0 до 0fffffffffffffff) UInt Int64 ulong 8 UInt64 Вещественные типы float 4 Single double 8 Символьный тип char 2 Строковый тип string Финансовый тип decimal 12 Описание Double Число с плавающей точкой двойной точности. Содержит значения –45 приблизительно от ±1.5*10 до ±3.4*1038 c 7 значащими цифрами Число с плавающей точкой двойной точности. Содержит значения –324 приблизительно от ±5.0*10 до ±1.7*10308 c 15–16 значащими цифрами Сhar Символ Unicode String Строка из Unicode-символов Decimal Число до 28 знаков с фиксированным положением десятичной точки. Обычно используется в финансовых расчетах и требует суффикса <> или <<М>> Переменные и константы Переменная представляет собой типизированную область памяти. Программист создает переменную, объявляя ее тип и указывая имя. При объявлении переменной ее можно инициализировать (присвоить ей начальное значение), а затем в любой момент ей можно присвоить новое значение, которое заменит собой предыдущее. static void Main() { int i=10; //объявление и инициализация целочисленной переменной i Console.WriteLine(i); //просмотр значения переменной i=100; //изменение значение переменной Console.WriteLine(i); } В языках предыдущего поколения переменные можно было использовать без инициализации. Это могло привести к множеству проблем и долгому поиску ошибок. В языке С# требуется, чтобы переменные были явно проинициализированы до их использования. Проверим этот факт на примере. static void Main() { int i; //объявление переменной без инициализации Console.WriteLine(i); //просмотр значения переменной } При попытке скомпилировать этот пример в списке ошибок будет выведено следующее сообщение: «Использование локальной переменной i, которой не присвоено значение). Инициализировать каждую переменную сразу при объявлении необязательно, но необходимо присвоить ей значение до того, как она будет использована. Константа, в отличие от переменной, не может менять свое значение. Константы бывают трех видов: литералы, типизированные константы и перечисления. В операторе присваивания: x=32; число 32 является литеральной константой. Его значение всегда равно 32 и его нельзя изменить. Типизированные константы именуют постоянные значения. Объявление типизированной константы происходит следующим образом: const <тип> <идентификатор> = <значение>; Рассмотрим пример: static void Main() { const int i=10; //объявление целочисленной константы i Console.WriteLine(i); //просмотр значения константы i=100; //ошибка – недопустимо изменять значение константы Console.WriteLine(i); } Перечисления (enumerations) являются альтернативой константам. Перечисление – это особый размерный тип, состоящий из набора именованных констант (называемых списком перечисления). Синтаксис объявления перечисления следующий: [атрибуты] [модификаторы] enum <имя> [ : базовый тип] {список-перечисления констант(через запятую)}; Замечание. Атрибуты и модификаторы являются необязательными элементами этой конструкции. Более подробные сведения о их можно найти в дополнительных источниках информации. Базовый тип – это тип самого перечисления. Если не указать базовый тип, то по умолчанию будет использован тип int. В качестве базового типа можно выбрать любой целый тип, кроме char. Пример использования перечисления: class Program { enum gradus:int { min=0, krit=72, max=100, //1 } static void Main() { Console.WriteLine("минимальная температура=" + (int) gradus.min); Console.WriteLine("критическая температура=" + (int)gradus.krit); Console.WriteLine("максимальная температура=" + (int)gradus.max); } } Замечания 1. В общем случае последнюю запятую в объявлении перечисления можно не ставить (см. строку 1). Но лучше ее поставить: если вам придется добавить еще несколько строк в перечисление, такая предусмотрительность избавит вас от возможных синтаксических ошибок. 2. Запись (int) gradus.min используется для явного преобразования перечисления к целому типу. Если убрать (int), то на экран будет выводиться название констант. 3. Символ + в записи "минимальная температура=" + (int) gradus.min при обращении к методу WriteLine означает, что строка "минимальная температура=" будет «склеена» со строковым представлением значения (int) gradus.min. В результате получится новая строка, которая и будет выведена на экран. Организация ввода-вывода данных. Форматирование Программа при вводе данных и выводе результатов взаимодействует с внешними устройствами. Совокупность стандартных устройств ввода (клавиатура) и вывода (экран) называется консолью. В языке С# нет операторов ввода и вывода. Вместо них для обмена данными с внешними устройствами используются специальные классы. В частности, для работы с консолью используется стандартный класс Console, определенный в пространстве имен System. Вывод данных В приведенных выше примерах мы уже рассматривали метод WriteLine, реализованный в классе Console, который позволяет организовывать вывод данных на экран. Однако существует несколько способов применения данного метода: 1. Console.WriteLine(x); //на экран выводится значение идентификатора х 2. Console.WriteLine("x=" + x +"y=" + y); /* на экран выводится строка, образованная последовательным слиянием строки "x=", значения x, строки "у=" и значения у */ 3. Console.WriteLine("x={0} y={1}", x, y); /* на экран выводится строка, формат которой задан первым аргументом метода, при этом вместо параметра {0} выводится значение x, а вместо {1} – значение y*/ Далее мы будем использовать только третий вариант, поэтому рассмотрим его более подробно. Пусть нам дан следующий фрагмент программы: int i=3, j=4; Console.WriteLine("{0} {1}", i, j); При обращении к методу WriteLine через запятую перечисляются три аргумента: "{0} {1}", i, j. Первый аргумент "{0} {1}" определяет формат выходной строки. Следующие аргументы нумеруются с нуля, так переменная i имеет номер 0, j – номер 1. Значение переменной i будет помещено в выходную строку на место параметра {0}, а значение переменной j – на место параметра {1}. В результате на экран будет выведена строка: 3 4. Если мы обратимся к методу WriteLine следующим образом: Console.WriteLine("{0} {1} {0)", j, i); то на экран будет выведена строка: 4 3 4. Данный вариант использования метода WriteLine является наиболее универсальным, потому что он позволяет не только выводить данные на экран, но и управлять форматом их вывода. Рассмотрим несколько примеров: 1. Использование управляющих последовательностей: Управляющей последовательностью называют определенный символ, предваряемый обратной косой чертой. Данная совокупность символов интерпретируется как одиночный символ и используется для представления кодов символов, не имеющих графического обозначения (например, символа перевода курсора на новую строку) или символов, имеющих специальное обозначение в символьных и строковых константах (например, апостроф). Рассмотрим управляющие символы: Вид \a \b \f \n \r \t \v \\ \’ \” Наименование Звуковой сигнал Возврат на шаг назад Перевод страницы Перевод строки Возврат каретки Горизонтальная табуляция Вертикальная табуляция Обратная косая черта Апостроф Кавычки Пример: static void Main() { Console.WriteLine("Ура!\nСегодня \"Информатика\"!!!"); } Замечание. Вместо управляющей последовательности \n можно использовать константу Enviropment.NewLine. Она более универсальна, т.к. ее значение зависит от контекста и операционной системы, в которой запускается программа. 2. Управление размером поля вывода: Первым аргументом WriteLine указывается строка вида {n, m} – где n определяет номер идентификатора из списка аргументов метода WriteLine, а m – количество позиций (размер поля вывода), отводимых под значение данного идентификатора. При этом значение идентификатора выравнивается по правому краю. Если выделенных позиций для размещения значения идентификатора окажется недостаточно, то автоматически добавится необходимое количество позиций. Пример: static void Main() { double x= Math.E; Console.WriteLine("E={0,20}", x); Console.WriteLine("E={0,10}", x); } 3. Управление размещением вещественных данных: Первым аргументом WriteLine указывается строка вида {n: ##.###} – где n определяет номер идентификатора из списка аргументов метода WriteLine, а ##.### определяет формат вывода вещественного числа. В данном случае, под целую часть числа отводится две позиции, под дробную – три. Если выделенных позиций для размещения целой части значения идентификатора окажется недостаточно, то автоматически добавится необходимое количество позиций. Пример: static void Main() { double x= Math.E; Console.WriteLine("E={0:##.###}", x); Console.WriteLine("E={0:.####}", x); } 4. Управление форматом числовых данных: Первым аргументом WriteLine указывается строка вида {n:<спецификатор>m} – где n определяет номер идентификатора из списка аргументов метода WriteLine, <спецификатор> – определяет формат данных, а m – количество позиций для дробной части значения идентификатора. В качестве спецификаторов могут использоваться следующие значения: Параметр C или c D или d Формат Денежный. По умолчанию ставит денежный знак, определенный текущими региональными настройками. В русской Windows это р. Целочисленный (используется только с целыми числами) E или e Экспоненциальное представление чисел F или f Представление чисел с фиксированной точкой Общий формат (или экспоненциальный, или с фиксированной точкой) G или g N или n X или x P или p Стандартное форматирование с использованием запятых и пробелов в качестве разделителей между разрядами Шестнадцатеричный формат Процентный Значение Задается количество десятичных разрядов. Задается минимальное количество цифр. При необходимости результат дополняется начальными нулями Задается количество символов после запятой. По умолчанию используется значение 6. Задается количество символов после запятой Задается количество символов после запятой. По умолчанию выводится целая часть Задается количество символов после запятой. По умолчанию – 2, если число целое, то ставятся нули Пример: static void Main() { Console.WriteLine("C Format:{0,14:C} \t{0:C2}", 12345.678); Console.WriteLine("D Format:{0,14:D} \t{0:D6}", 123); Console.WriteLine("E Console.WriteLine("G Console.WriteLine("N Console.WriteLine("X Console.WriteLine("P Format:{0,14:E} Format:{0,14:G} Format:{0,14:N} Format:{0,14:X} Format:{0,14:P} \t{0:E8}", 12345.6789); \t{0:G10}", 12345.6789); \t{0:N4}", 12345.6789); ", 1234); ", 0.9); } Ввод данных Для ввода данных обычно используется метод ReadLine, реализованный в классе Console. Данный метод в качестве результата возвращает строку, тип которой string. Пример: static void Main() { string s = Console.ReadLine(); Console.WriteLine(s); } Для того чтобы получить числовое значение, необходимо воспользоваться преобразованием данных. Пример: static void Main() { string s = Console.ReadLine(); int x = int.Parse(s); //преобразование строки в число Console.WriteLine(x); } Или сокращенный вариант: static void Main() { //преобразование введенной строки в число int x = int.Parse(Console.ReadLine()); Console.WriteLine(x); } Для преобразования строкового представления целого числа в тип int мы используем метод Parse(), который реализован для всех числовых типов данных. Таким образом, если нам потребуется преобразовать строковое представление в вещественное, мы можем воспользоваться методом float.Parse() или double.Parse(). В случае, если соответствующее преобразование выполнить невозможно, то выполнение программы прерывается и генерируется исключение. Например, если входная строка имела неверный формат, то будет сгенерировано исключение System.FormatExeption. Операции Полный список операций языка С# в соответствии с их приоритетами (по убыванию приоритетов, операции с разными приоритетами разделены чертой) приведен в Приложении 1. В данном разделе мы подробно рассмотрим только часть операций, остальные операции будут вводиться по мере необходимости. Замечание. Операции можно классифицировать по количеству операндов: – унарные – воздействуют на один операнд, – бинарные – воздействуют на два операнда, – тернарные – воздействуют на три операнда. Некоторые символы используются для обозначения как унарных, так и бинарных операций. Например, символ «минус» используется как для обозначения унарной операции – арифметического отрицания, так и для обозначения бинарной операции вычитания. Будет ли данный символ обозначать унарную или бинарную операцию, определяется контекстом, в котором он используется. 1. Инкремент (++) и декремент(--). Эти операции имеют две формы записи – префиксную, когда операция записывается перед операндом, и постфиксную – операция записывается после операнда. Префиксная операция инкремента (декремента) увеличивает (уменьшает) свой операнд и возвращает измененное значение как результат. Постфиксные версии инкремента и декремента возвращают первоначальное значение операнда, а затем изменяют его. Рассмотрим эти операции на примере. static void Main() { int i = 3, j = 4; Console.WriteLine("{0} {1}", i, j); Console.WriteLine("{0} {1}", ++i, --j); Console.WriteLine("{0} {1}", i++, j--); Console.WriteLine("{0} {1}", i, j); } Результат работы программы: 2. Операция new. Используется для создания нового объекта. С помощью ее можно создавать как объекты ссылочного типа, так и размерные, например: object z=new object(); int i=new int(); // то же самое, что и int i =0; 3. Отрицание: 1. Арифметическое отрицание (–) – меняет знак операнда на противоположный. 2. Логическое отрицание (!) – определяет операцию инверсии для логического типа. Рассмотрим эти операции на примере. static void Main() { int i = 3, j=-4; bool a = true, b=false; Console.WriteLine("{0} {1}", -i, -j); Console.WriteLine("{0} {1}", !a, !b); } Результат работы программы: 4. Явное преобразование типа. Используется для явного преобразования из одного типа в другой. Формат операции: (<тип>) <выражение>; Рассмотрим эту операцию на примере. static void Main() { int i = -4; byte j = 4; int a = (int)j; //преобразование без потери точности byte b = (byte)i; //преобразование с потерей точности Console.WriteLine("{0} {1}", a, b); } Результат работы программы: 4 252 Замечание. В Pascal, C++ и других языках допускается неявное преобразование типов, которое в рамках предыдущего примера позволило бы записать: b=i. В этом случае происходит потеря точности вычислений, о чем компилятор либо "умалчивает", либо сообщает в виде предупреждения. Возможность неявного преобразования чревата вычислительными ошибками, которые очень трудно найти. Чтобы избежать подобных ошибок, в C# запрещены некоторые виды неявных преобразований. 5. Умножение (*), деление (/) и деление с остатком (%). Операции умножения и деления применимы для целочисленных и вещественных типов данных. Для других типов эти операции применимы, если для них возможно неявное преобразование к целым или вещественным типам. При этом тип результата равен «наибольшему» из типов операндов, но не менее int. Если оба операнда при делении целочисленные, то и результат тоже целочисленный. Рассмотрим эти операции на примере. static void Main() { int i = 100, j = 15; double a = 14.2, b = 3.5; Console.WriteLine("{0} {1} {2}", i*j, i/j, i%j); Console.WriteLine("{0} {1} {2}", a * b, a / b, a % b); } Результат работы программы: Задание 1. Выполните фрагмент программы и объясните полученный результат: double a=100, b=33; Console.WriteLine(a/b); double d=100/33; Console.WriteLine(d); 6. Сложение (+) и вычитание (–). Операции сложения и вычитания применимы для целочисленных и вещественных типов данных. Для других типов эти операции применимы, если для них возможно неявное преобразование к целым или вещественным типам. 7. Операции отношения ( <, <=, >, >=, ==, !=). Операции отношения сравнивают значения левого и правого операндов. Результат операции логического типа: true – если значения совпадают, false – в противном случае. Рассмотрим операции на примере: static void Main() { int i = 15, j = 15; Console.WriteLine(ij); //больше Console.WriteLine(i>=j); //больше или равно Console.WriteLine(i==j); //равно Console.WriteLine(i!=j); //не равно } Результат работы программы: 8. Логические операции: И (&&), ИЛИ (||). Логические операции применяются к операндам логического типа. Результат логической операции И имеет значение истина тогда и только тогда, когда оба операнда принимают значение истина. Результат логической операции ИЛИ имеет значение истина тогда и только тогда, когда хотя бы один из операндов принимает значение истина. Рассмотрим операции на примере: static void Main() { Console.WriteLine("x Console.WriteLine("{0} Console.WriteLine("{0} Console.WriteLine("{0} Console.WriteLine("{0} } y {1} {1} {1} {1} x и y {2} {3}", {2} {3}", {2} {3}", {2} {3}", x или y"); false, false, false&&false, false||false); false, true, false&&true, false||true); true, false, true&&false, true||false); true, true, true&&true, true||true); Результат работы программы: Замечание. Фактически была построена таблица истинности для логических операций И и ИЛИ. 9. Условная операция. Формат: (<операнд1>)? <операнд2> : <операнд3>; Операнд1 – это логическое выражение, которое оценивается с точки зрения его эквивалентности константам true и false. Если результат вычисления операнда1 равен true, то результатом условной операции будет значение операнда2, иначе – операнда3. Фактически условная операция является сокращенной формой условного оператора if, который будет рассмотрен позже. Пример использования условной операции: static void Main() { int x=5; int y=10; int max = (x > y) ? x : y; Console.WriteLine(max); } 10. Операции присваивания: =, +=, -= и т.д. Формат операции простого присваивания (=): операнд_2 = операнд_1; В результате выполнения этой операции вычисляется значение операнда_1, и результат записывается в операнд_2. Можно связать воедино сразу несколько операторов присваивания, записывая такие цепочки: a=b=c=100. Выражение такого вида выполняется справа налево: результатом выполнения c=100 является число 100, которое затем присваивается переменной b, результатом чего опять является 100, которое присваивается переменной a. Кроме простой операции присваивания существуют сложные операции присваивания, например, умножение с присваиванием (*=), деление с присваиванием (/=), остаток от деления с присваиванием (%=), сложение с присваиванием (+=), вычитание с присваиванием (–=) и т.д. В сложных операциях присваивания, например, при сложении с присваиванием, к операнду_2 прибавляется операнд_1, и результат записывается в операнд_2. То есть, выражение с += а является более компактной записью выражения с = с + а . Выражения и преобразование типов Выражение – это синтаксическая единица языка, определяющая способ вычисления некоторого значения. Выражения состоят из операндов, операций и скобок. Каждый операнд является в свою очередь выражением или одним из его частных случаев – константой, переменной или функций. Замечание. Список математических функций, реализованных в С# приведен в приложении 2. Примеры выражений: (а + 0.12)/6 х && у || !z (t * Math.Sin(x)-l.05e4)/((2 * k + 2) * (2 * k + 3)) Вычисление значения выражения происходит с учетом приоритета операций (см. Приложение 1), которые в нем участвуют. Если в выражении соседствуют операции одного приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, остальные – слева направо. Например, а = b = с означает a=(b=c), a+b+c означает (а + b) + с. Если необходимо изменить порядок выполнения операций, то в выражении необходимо поставить круглые скобки. Результат вычисления выражения характеризуется значением и типом. Например, если а и b – переменные целого типа и описаны так: int а = 2, b = 5; то выражение а + b имеет значение 7 и тип int. В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, то перед вычислениями выполняются преобразования более коротких типов в более длинные для сохранения значимости и точности. Иерархия типов данных приведена в следующей схеме: Преобразование типов в выражениях происходит неявно (без участия программистов) следующим образом. Если одни из операндов имеет тип, изображенный на более низком уровне, чем другой, то он приводится к типу второго операнда при наличии пути между ними. Если пути нет, то возникает ошибка компиляции (чтобы ее избежать, необходимо воспользоваться операцией явного преобразования). Если путей преобразования несколько, то выбирается наиболее короткий, не содержащий пунктирных линий. Вернемся к рассмотрению операции явного преобразования из предыдущего раздела: static void Main() { int i = -4; byte j = 4; int a = (int)j; //1 byte b = (byte)i; //2 Console.WriteLine("{0} {1}", a, b); } В строке 1 можно обойтись без явного преобразования типа, т.е. можно записать a=j, т.к. тип int в иерархии типов находится выше типа byte и существует путь для неявного преобразования типа byte в тип int. Но пути для неявного преобразования от типа int к типу byte нет, поэтому в строке 2 нельзя записать b=i – компилятор выдаст сообщение об ошибке. Замечание. Рассмотрим один важный пример. ВС++ допустим следующий фрагмент кода: int x=10; int y= (x)? 1: 2; // 3 В данном примере в строке 3 происходит неявное преобразование типа переменной х, т.е. типа int, к логическому типу. При этом, если х принимает значение 0 (или null для ссылочных типов), то ему ставится в соответствие логическая величина false, всем другим значениям в соответствие ставится логическое значение true. В нашем случае переменная х принимает ненулевое значение, поэтому оно будет преобразовано к значению true, и в переменную y запишется значение 1. В языке С# подобное неявное преобразование невозможно. Необходимо обязательно выполнять операцию сравнения значения х с 0. Например, следующим образом: int x=10; int y= (x!=0)? 1: 2; // 3 Примеры решения практических задач 1. Написать программу, подсчитывающую площадь квадрата, периметр которого равен p. Указания по решению задачи. Прежде чем составить программу, проведем математические рассуждения. Пусть дан квадрат со стороной а, тогда: периметр вычисляется по формуле р=4а, площадь вычисляется по формуле s=a2. using System; namespace Example { class Program { static void Main() { Console.Write("p= "); double p = double.Parse(Console.ReadLine()); double s = Math.Pow(p/4, 2); Console.WriteLine("s={0}", s); } } } Результат работы программы: Задание. Изменить программу так, чтобы она подсчитывала периметр квадрата, площадь которого равна s. ПРИЛОЖЕНИЕ 1. ОПЕРАЦИИ ЯЗЫКА С# Операции языка С# приведены в порядке убывания приоритетов. Операции с разными приоритетами разделены чертой. Операция . x() x[] x++ x-new typeof checked unchecked + ! ~ ++x --x (тип) x * / % << >> < > <= >= is as == != & ^ | && || ? : = *= /= %= += -= <<= >>= &= ^= |= Описание Доступ к элементу Вызов метода или делегата Доступ к элементу Постфиксный инкремент Постфиксный декремент Выделение памяти Получение типа Проверяемый код Непроверяемый код Унарный плюс Арифметическое отрицание Логическое отрицание Поразрядное отрицание Префиксный инкремент Префиксный декремент Преобразование типа Умножение Деление Остаток от деления Сдвиг влево Сдвиг вправо Меньше Больше Меньше или равно Больше или равно Проверка принадлежности типу Приведение типа Равно Не равно Поразрядное И Поразрядное исключающее ИЛИ Поразрядное ИЛИ Логическое И Логическое ИЛИ Условная операция Простое присваивание Умножение с присваиванием Деление с присваиванием Остаток от деления с присваиванием Сложение с присваиванием Вычитание с присваиванием Сдвиг влево с присваиванием Сдвиг вправо с присваиванием Поразрядное И с присваиванием Поразрядное исключающее ИЛИ с ПоразрядноеИЛИсприсваиванием ПРИЛОЖЕНИЕ 2. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ ЯЗЫКА С# С# содержит большое количество встроенных математических функций, которые реализованы в классе Math пространства имен System. Рассмотрим краткое описание некоторых математических функций, подробнее с ними можно познакомиться в справочной систем VS или технической документации. Особое внимание следует обратить на типы операндов и результатов, т.к. каждая функция может иметь несколько перегруженных версий. Замечание. Использование нескольких функций с одним и тем же именем, но с различными типами параметров, называется перегрузкой функции. Например, функция Math.Abs(), вычисляющая модуль числа, имеет 7 перегруженных версий: double Math.Abs (double x), float Math.Abs (float x), int Math.Abs(int x), и т.д. № Название Описание 1. Math.Abs(<выражение>) Модуль 2. Math.Ceiling(<выражение>) Округление для большего целого 3. Math.Cos(<выражение>) Косинус 4. Math.Е Число е 5. Math.Exp(<выражение>) Экспонента 6. Math.Floor(<выражение>) Округление до меньшего целого 7. Math.Log(<выражение>) Натуральный логарифм 8. Math.Log10(<выражение>) Десятичный логарифм 9. Math.Max(<выражение1>, выражение2>) Максимум из двух значений 10. Math.Min(<выражение1>, выражение2>) Минимум из двух значений 11. Math.PI Число π 12. Math.Pow(<выражение1>, выражение2>) Возведение в степень 13. Math.Round(<выражение>) Простое округление 14. Math.Sign(<выражение>) Знак числа 15. Math.Sin(<выражение>) Синус 16. Math.Sqrt(<выражение>) Квадратный корень 17. Math.Тan(<выражение>) Тангенс
«Базовые элементы языка С#» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Тебе могут подойти лекции

Смотреть все 462 лекции
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot