lec_01_.ppt
- Количество слайдов: 56
Язык программирования С# n Русское название: n n Си-шарп Дата создания: n n n 1998 -2001 гг. основной язык разработки приложений для платформы Microsoft. NET Создан под влиянием: • C++ • Java
Этапы решения задач на ЭВМ n Постановка задачи n Формализация (математическая постановка) n Выбор (или разработка) метода решения n Разработка алгоритма n Составление программы n Отладка программы n Вычисление и обработка результатов 2
Графический способ описания алгоритма 3
Среда разработки n Совокупность средств, с помощью которых программы пишутся, корректируются, преобразуются в машинные коды, отлаживаются и запускаются, называют средой разработки или оболочкой. Понятия приложения, проекта, решения Типы приложений: n Консольные приложения n Windows-приложения n Web-сервисы Приложение, находящееся в процессе разработки, называется проектом. Несколько приложений могут быть объединены в решение (solution).
File –> New -> Project Задаем: Name (имя проекта) Location (расположение на диске) Окно редактора Окно вывода окно управления проектом Solution Explorer окно свойств Properties 5
Основные понятия языка С# Состав языка 6
Состав языка n Символы: n буквы: A-Z, a-z, _, буквы нац. алфавитов n цифры: 0 -9, A-F n спец. символы: +, *, {, … n пробельные символы n. Лексемы: nконстанты nимена nключевые слова nзнаки операций nразделители 2 0. 11 “Вася” Vasia a _11 double do if + - = ; [ ] , n. Выражения nвыражение - правило вычисления значения: a + b n. Операторы nисполняемые: nописания: c = a + b; double a, b; 7
Литералы (константы) C# Вид Булевские Целые дес. шестн. Веществ. с тчк с порядком Символьные Строковые Константа null Примеры true false 8 199226 0 Lu 0 x. A 0 x 1 B 8 0 X 00 FFL 5. 7 . 001 f 35 m 0. 2 E 6 . 11 e– 3 5 E 10 'A' 'x 74' ' ' 'u. A 81 B' “Zdes был Вася" "t. Значение r=x. F 5n" "Здесь был u 0056u 0061" @"C: tempfile 1. txt" null 8
Идентификаторы (Имена) n имя должно начинаться с буквы или _; n имя должно содержать только буквы, знак подчеркивания и цифры; n прописные и строчные буквы различаются; n длина имени практически не ограничена. n имена не должны совпадать с ключевыми словами, однако допускается: @if, @float… n в именах можно использовать управляющие последовательности Unicode Примеры правильных имен: Vasia, Вася, _13, @while. Примеры неправильных имен: 2 late, Big gig, Б#г 9
Нотации Понятные и согласованные между собой имена — основа хорошего стиля. Существует несколько нотаций — соглашений о правилах создания имен. В C# для именования различных видов программных объектов чаще всего используются две нотации: n. Нотация Паскаля - каждое слово начинается с прописной буквы: n Max. Length, My. Fuzzy. Shooshpanchik n. Camel notation - с прописной буквы начинается каждое слово, составляющее идентификатор, кроме первого: n max. Length, my. Fuzzy. Shooshpanchik 10
Ключевые слова, знаки операций, разделители n Ключевые слова — идентификаторы, имеющие специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. n n Знак операции — один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. n n n Например, для оператора перехода определено слово goto. Например, сложение +, деление /, сложное присваивание %=. Операции делятся на унарные (с одним операндом), бинарные (с двумя) и тернарную (с тремя). Разделители используются для разделения или, наоборот, группирования элементов. Примеры разделителей: скобки, точка, запятая. 11
Ключевые слова C# abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float foreach goto if implicit in interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void volatile while 12
Комментарии Комментарий – фрагмент программы, игнорируемый компилятором (для поясняющих записей и т. д. ) 1) // однострочный комментарий 2) /* многострочный комментарий … */
Типы данных 14
Концепция типа данных Тип данных определяет: n внутреннее представление данных => множество их возможных значений n допустимые действия над данными => операции и функции 15
Различные классификации типов данных Типы данных Простые Типы данных Структуриро ванные Встроенные Определяемые программистом Типы данных Статические Динамические 16
Встроенные типы данных C# 17
Логический и целые Название Ключево е слово Диапазон значений Описание Разме р, бит Булевский bool true, false истина, ложь 8 Целые sbyte – 128 — 127 знаковое 8 0 — 255 беззнаковое 8 short ushort – 32768 — 32767 знаковое 16 0 — 65535 беззнаковое 16 int uint ≈(– 2 • 109 — 2 • 109) знаковое 32 ≈(0 — 4 • 109) беззнаковое 32 long ulong ≈(– 9 • 1018 — 9 • 1018) знаковое 64 ≈(0— 18 • 1018) беззнаковое 64 18
Остальные Название Ключевое Диапазон значений слово Описание Размер, бит Символьный char U+0000 — U+ffff символ Unicode 16 Вещественные float 1. 5 • 10 -45 — 3. 4 • 1038 7 цифр 32 double 5. 0 • 10 -324 — 1. 7 • 10308 15 -16 цифр 64 Финансовый decimal 1. 0 • 10 -28 — 7. 9 • 1028 28 -29 цифр 128 Строковый string длина ограничена объемом доступной памяти строка из символов Unicode object можно хранить все, что угодно всеобщий предок 19
Поля и методы встроенных типов n Любой встроенный тип C# построен на основе стандартного класса библиотеки. NET. Это значит, что у встроенных типов данных C# есть методы и поля. С помощью них можно, например, получить: n n n double. Max. Value (или System. Double. Max. Value) — максимальное число типа double; uint. Min. Value (или System. UInt 32. Min. Value) — минимальное число типа uint. В вещественных классах есть элементы: n положительная бесконечность Positive. Infinity; n отрицательная бесконечность Negative. Infinity; n «не является числом» : Na. N. 20
Общая структура программы на С# пространство имен Класс А Переменные класса Методы класса: Локальные переменные … Класс В Переменные класса Методы класса: Метод Main ©Павловская Т. А. (СПб. ГУ ИТМО) 21
Структура простейшей программы на С# using System; namespace A { class Class 1 { static void Main() { // описания и операторы, например: Console. Write(“Первая программа"); } // описания } } ©Павловская Т. А. (СПб. ГУ ИТМО) 22
Переменные n Переменная — это величина, которая во время работы программы может изменять свое значение. n Все переменные, используемые в программе, должны быть описаны. n Для каждой переменной задается ее имя и тип: int float char number; x, y; option; Тип переменной выбирается исходя из диапазона и требуемой точности представления данных. 23
Область действия и время жизни переменных n Переменные описываются внутри какого-л. блока (класса, метода или блока внутри метода) n Блок — это код, заключенный в фигурные скобки. Основное назначение блока — группировка операторов. n Переменные, описанные непосредственно внутри класса, называются полями класса. n Переменные, описанные внутри метода класса, называются локальными переменными. n Область действия переменной - область программы, где можно использовать переменную. n Область действия переменной начинается в точке ее описания и длится до конца блока, внутри которого она описана. n Время жизни: переменные создаются при входе в их область действия (блок) и уничтожаются при выходе. 24
Инициализация переменных n При объявлении можно присвоить переменной начальное значение (инициализировать). int float char number = 100; x = 0. 02; option = ’ю’; При инициализации можно использовать не только константы, но и выражения — главное, чтобы на момент описания они были вычислимыми, например: int b = 1, a = 100; int x = b * a + 25; n Поля класса инициализируются «значением по умолчанию» (0 соответствующего типа). n Инициализация локальных переменных возлагается на программиста. Рекомендуется всегда инициализировать переменные при описании. 25
Пример описания переменных using System; namespace CA 1 { class Class 1 { static void Main() { int i = 3; double y = 4. 12; decimal d = 600 m; string s = "Вася"; } } } 26
Именованные константы Вместо значений констант можно (и нужно!) использовать в программе их имена. Это облегчает читабельность программы и внесение в нее изменений: const float weight = 61. 5; const int n = 10; const float g = 9. 8; 27
Выражения n Выражение — правило вычисления значения. n n В выражении участвуют операнды, объединенные знаками операций. результат имеет вещественный тип n Операндами выражения могут быть константы, переменные и вызовы функций. n n Операции выполняются в соответствии с приоритетами. n Для изменения порядка выполнения операций используются круглые скобки. n Результатом выражения всегда является значение определенного типа, который определяется типами операндов. n t + Math. Sin(x)/2 * x a <= b + 2 результат имеет логический тип n x > 0 && y < 0 результат имеет логический тип Величины, участвующие в выражении, должны быть совместимых типов. ©Павловская Т. А. (СПб. ГУ ИТМО) 28
Приоритеты операций C# 1. Первичные (), [], ++, --, new, … 2. Унарные ~, !, ++, --, -, … 3. Типа умножения (мультипликативные) *, /, % 4. Типа сложения (аддитивные) +, - 5. Сдвига <<, >> 6. Отношения и проверки типа <, >, is, … 7. Проверки на равенство 8. Поразрядные логические &, ^, | 9. Условные логические &&, || 10. Условная ? : 11. Присваивания =, *=, /=, … ==, != 29
Oперации (в порядке убывания приоритета) Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении записано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные — слева направо. Операция Краткое описание Пример Унарные операции -> выбор a->b [] индексация a[0] () вызов функции fun() new object z = new object(); служит для создания нового int i = new int(); // то же самое, объекта что int i = 0; new тип ( [ аргументы ] )
++ инкремент Префиксная запись ++ операнд Постфиксная запись операнд++ a=6; y=++a*5; a=7, y=7*5=35 –– декремент Префиксная запись -- операнд Постфиксная запись операнд-- --a; ~ поразрядное отрицание ~b ! логическое отрицание !a – арифметическое (унарный минус) + унарный плюс +a & взятие адреса &a * разадресация *p (<тип>) преобразование типа (int) a отрицание -a a=6; y=a++*5; y=6*5=30, a=7
Бинарные операции * умножение a*b / деление % остаток от деления + сложение a+b – вычитание a-b << сдвиг влево a<<2 (5<<2 → 10100) >> сдвиг вправо a>>2 (5>>2 → 101>>2 → 001) & поразрядная конъюнкция (И) ^ поразрядное исключающее ИЛИ 10 → 1010 12 → 1100 | поразрядная дизъюнкция (ИЛИ) & | ^ a/b (3/5=0 3. /5=0. 6) a%b (17%3=2) a&b a^b a|b 1000 → 8 1110 → 14 0110 → 6
< меньше <= меньше или равно 7<=8 → true > больше 8>-8 → true >= больше или равно 5>=6 → false == равно 5==5 → true != не равно 5!=5 → false && логическое И a>5 && a<10 || логическое ИЛИ a<=-10 || a>=10 ? : условная операция (тернарная) y=a>b? b: a; = присваивание a=b; a=v=d=c=0; *= умножение с присваиванием a=5; /= %= += -= <<= >>= &= |= ^= 6<5 → false a+=5; (a=a+5=10)
Тип результата выражения n Если операнды, входящие в выражение, одного типа, и операция для этого типа определена, то результат выражения будет иметь тот же тип. n Если операнды разного типа и (или) операция для этого типа не определена, перед вычислениями автоматически выполняется преобразование типа по правилам, обеспечивающим приведение более коротких типов к более длинным для сохранения значимости и точности. n Автоматическое (неявное) преобразование возможно не всегда, а только если при этом не может случиться потеря значимости. n Если неявного преобразования из одного типа в другой не существует, программист может задать явное преобразование типа с помощью операции (тип)x. ©Павловская Т. А. (СПб. ГУ ИТМО) 34
Неявные арифметические преобразования типов в C# double decimal float long ulong int short sbyte uint ushort byte char 35
Математические функции: класс Math Имя Описание Результат Пояснения Abs Модуль перегружен |x| записывается как Abs(x) Acos Арккосинус double Acos(double x) Asin Арксинус double Asin(double x) Atan Арктангенс double Atan(double x) Atan 2 Арктангенс double Atan 2(double x, double y)— угол, тангенс которого есть результат деления y на x Big. Mul Произведение long Big. Mul(int x, int y) Ceiling Округление до большего целого double Ceiling(double х) Cos Косинус double Сos(double x) Cosh Гиперболический косинус double Cosh(double x) Div. Rem Деление и остаток перегружен Div. Rem(x, y, rem) E База натурального логарифма (число е) double 2, 7182845905 Exp Экспонента double ex записывается как Exp(x) 36
Floor Округление до меньшего целого double Floor(double х) IEEERemain der Остаток от деления double IEEERemainder(double x, double y) Log Натуральный логарифм double logex записывается как Log(x) Log 10 Десятичный логарифм double log 10 x записывается как Log 10(x) Max Максимум из двух чисел перегружен Max(x, y) Min Минимум из двух чисел перегружен Min(x, y) PI Значение числа π double 3, 14159265358979 Pow Возведение в степень double xy записывается как Pow(x, y) Round Округление перегружен Round(3. 1) даст в результате 3 Round (3. 8) даст в результате 4 Sign Знак числа int аргументы перегружены Sin Синус double Sin(double x) Sinh гиперболический синус double Sinh(double x) Sqrt Квадратный корень double √x записывается как Sqrt(x) Tan Тангенс double Tan(double x) Tanh Гиперболический тангенс double Tanh(double x) 37
Введение в исключения n При вычислении выражений могут возникнуть ошибки (переполнение, деление на ноль). n В C# есть механизм обработки исключительных ситуаций (исключений), который позволяет избегать аварийного завершения программы. n Если в процессе вычислений возникла ошибка, система сигнализирует об этом с помощью выбрасывания (генерирования) исключения. n Каждому типу ошибки соответствует свое исключение. Исключения являются классами, которые имеют общего предка — класс Exception, определенный в пространстве имен System. n Например, при делении на ноль будет выброшено исключение Divide. By. Zero. Exception, при переполнении — исключение Overflow. Exception. 38
Инкремент и декремент using System; namespace CA 1 { class C 1 { static void Main() { int x = 3, y = 3; Console. Write( "Значение префиксного выражения: " ); Console. Write. Line( ++x ); Console. Write( "Значение х после приращения: " ); Console. Write. Line( x ); Console. Write( "Значение постфиксного выражения: " ); Console. Write. Line( y++ ); Console. Write( "Значение у после приращения: " ); Console. Write. Line( y ); Результат работы программы: }}} Значение префиксного выражения: 4 х после приращения: 4 постфиксного выражения: у после приращения: 4 39
Операция new служит для создания нового объекта. Формат операции: new тип ( [ аргументы ] ) С помощью этой операции можно создавать объекты как ссылочных, так и значимых типов, например: object z = new object(); int i = new int(); // то же самое, что int i = 0; ©Павловская Т. А. (СПб. ГУ ИТМО) 40
Операции отрицания using System; namespace Console. Application 1 { class Class 1 { static void Main() { sbyte a = 3, b = -63, c = 126; bool d = true; Console. Write. Line( -a ); // Результат -3 Console. Write. Line( -c ); // Результат -126 Console. Write. Line( !d ); // Результат false Console. Write. Line( ~a ); // Результат -4 Console. Write. Line( ~b ); // Результат 62 Console. Write. Line( ~c ); // Результат -127 }}} ©Павловская Т. А. (СПб. ГУ ИТМО) 41
Явное преобразование типа n long b = 300; n int a = (int) b; // данные не теряются n byte d = (byte) a; // данные теряются ©Павловская Т. А. (СПб. ГУ ИТМО) 42
Умножение n Операция умножения (*) возвращает результат перемножения двух операндов. n Стандартная операция умножения определена для типов int, uint, long, ulong, float, double и decimal. n К величинам других типов ее можно применять, если для них возможно неявное преобразование к этим типам. Тип результата операции равен «наибольшему» из типов операндов, но не менее int. n Если оба операнда целочисленные или типа decimal и результат операции слишком велик для представления с помощью заданного типа, генерируется исключение System. Overflow. Exception ©Павловская Т. А. (СПб. ГУ ИТМО) 43
Результаты вещественного умножения * +y -y +0 -0 +∞ -∞ Na. N +x +z -z +0 -0 +∞ -∞ Na. N -x -z +z -0 +0 -∞ +∞ Na. N +0 +0 -0 Na. N -0 -0 +0 Na. N +∞ +∞ -∞ Na. N -∞ -∞ +∞ Na. N Na. N ©Павловская Т. А. (СПб. ГУ ИТМО) 44
Пример using System; namespace Console. Application 1 { class Class 1 { static void Main() { int x = 11, y = 4; float z = 4; Console. Write. Line( z * y ); // Результат 16 Console. Write. Line( z * 1 e 308 ); // Рез. "бесконечность" Console. Write. Line( x / y ); // Результат 2 Console. Write. Line( x / z ); // Результат 2, 75 Console. Write. Line( x % y ); // Результат 3 Console. Write. Line( 1 e-324 / 1 e-324 ); // Результат Na. N }}} ©Павловская Т. А. (СПб. ГУ ИТМО) 45
Операции сдвига n Операции сдвига (<< и >>) применяются к целочисленным операндам. Они сдвигают двоичное представление первого операнда влево или вправо на количество двоичных разрядов, заданное вторым операндом. n При сдвиге влево (<<) освободившиеся разряды обнуляются. При сдвиге вправо (>>) освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае. n Стандартные операции сдвига определены для типов int, uint, long и ulong. ©Павловская Т. А. (СПб. ГУ ИТМО) 46
Пример using System; namespace Console. Application 1 { class Class 1 { static void Main() { byte a = 3, b = 9; sbyte c = 9, d = -9; Console. Write. Line( a << 1 ); // Результат 6 Console. Write. Line( a << 2 ); // Результат 12 Console. Write. Line( b >> 1 ); // Результат 4 Console. Write. Line( c >> 1 ); // Результат 4 Console. Write. Line( d >> 1 ); // Результат -5 } } } ©Павловская Т. А. (СПб. ГУ ИТМО) 47
Операции отношения и проверки на равенство n Операции отношения (<, <=, >, >=, ==, !=) сравнивают первый операнд со вторым. n Операнды должны быть арифметического типа. n Результат операции — логического типа, равен true или false. x == y -- true, если x равно y, иначе false x != y -- true, если x не равно y, иначе false x < y -- true, если x меньше y, иначе false x > y -- true, если x больше y, иначе false x <= y -- true, если x меньше или равно y, иначе false x >= y -- true, если x больше или равно y, иначе false ©Павловская Т. А. (СПб. ГУ ИТМО) 48
Условные логические операции using System; namespace Console. Application 1 { class Class 1 { static void Main() { Console. Write. Line( true && true ); // Результат true Console. Write. Line( true && false ); // Результат false Console. Write. Line( true || true ); // Результат true Console. Write. Line( true || false ); // Результат true } } } ©Павловская Т. А. (СПб. ГУ ИТМО) 49
Условная операция n операнд_1 ? операнд_2 : операнд_3 Первый операнд — выражение, для которого существует неявное преобразование к логическому типу. Если результат вычисления первого операнда равен true, то результатом будет значение второго операнда, иначе — третьего операнда. using System; namespace Console. Application 1 { class Class 1 { static void Main() { int a = 11, b = 4; int max = b > a ? b : a; Console. Write. Line( max ); // Результат 11 }}} ©Павловская Т. А. (СПб. ГУ ИТМО) 50
Операция присваивания Присваивание – это замена старого значения переменной на новое. Старое значение стирается бесследно. Операция может использоваться в программе как законченный оператор. переменная = выражение a = b + c; x = 1; x 1 1. 5 1+0. 5 x = x + 0. 5; Правый операнд операции присваивания должен иметь неявное преобразование к типу левого операнда, например: вещественная переменная = целое выражение; ©Павловская Т. А. (СПб. ГУ ИТМО) 51
Сложное присваивание в C# n x += 0. 5; соответствует x = x + 0. 5; n x *= 0. 5; соответствует x = x * 0. 5; n a %= 3; соответствует a = a % 3; n a <<= 2; соответствует a = a << 2; и т. п. ©Павловская Т. А. (СПб. ГУ ИТМО) 52
Ввод-вывод в C# ©Павловская Т. А. (СПб. ГУ ИТМО) 53
Вывод на консоль using System; namespace A { class Class 1 { static void Main() Результат работы программы: 3 y = 4, 12 d = 600 s = Вася { int i = 3; double y = 4. 12; decimal d = 600 m; string s = "Вася"; Console. Write( i ); Console. Write. Line(i + " y = " + y); Console. Write( i ); Console. Write( " y = {0} nd = {1}", y, d ); Console. Write. Line("d = " + d + " s = " + s ); Console. Write( " y = {0: F 2} nd = {1: D 3}", y, d ); Console. Write( " y = {0, 5: 0. # ' руб. '} n", y ); Console. Write. Line( " s = " + s ); } } } ©Павловская Т. А. (СПб. ГУ ИТМО) 54
Ввод с консоли using System; namespace A { class Class 1 { static void Main() { string s = Console. Read. Line(); char c = (char)Console. Read(); Console. Read. Line(); string buf; buf = Console. Read. Line(); int i = Convert. To. Int 32( buf ); // ввод строки // ввод символа // буфер для ввода чисел // преобразование в целое buf = Console. Read. Line(); double x = Convert. To. Double( buf ); // преобразование в вещ. buf = Console. Read. Line(); double y = double. Parse( buf ); // преобразование в вещ. } } } ©Павловская Т. А. (СПб. ГУ ИТМО) 55
Пример: перевод температуры из F в С using System; namespace CA 1 { class Class 1 { static void Main() { Console. Write. Line( "Введите температуру по Фаренгейту" ); string buf = Console. Read. Line(); double fahr = Convert. To. Double( buf ); double cels =5. 0 / 9 * (fahr - 32); Console. Write. Line( "По Фаренгейту: {0} в градусах Цельсия: {1}", fahr, cels ); } } } ©Павловская Т. А. (СПб. ГУ ИТМО) 56