Лекции по C#(первая часть, версия 2.2)
.pdfУГТУ-УПИ Кафедра Автоматизированные электрические системы
КУРС ЛЕКЦИЙ по C#
Часть первая:
встроенные возможности, массивы, строки, структуры
Котов О.М.
Редакция 2.2
Екатеринбург 2011
1 |
Введение |
Содержание |
4 |
||
|
|||||
2 Первая программа на C#.............................................................................................. |
6 |
||||
|
2.1 |
Пространства имён...................................................................................................................... |
|
7 |
|
3 Общая характеристика и вспомогательные элементы языка..................................... |
7 |
||||
|
3.1 |
Ключевые слова........................................................................................................................... |
|
8 |
|
|
3.2 |
Разделители.................................................................................................................................. |
|
8 |
|
|
3.3 |
Комментарии ............................................................................................................................... |
|
8 |
|
|
3.4 |
Идентификаторы.......................................................................................................................... |
|
9 |
|
4 Объекты данных и базовые средства их обработки ................................................... |
9 |
||||
|
4.1 |
Иерархия встроенных типов в C#............................................................................................... |
9 |
||
|
4.2 |
Константы.................................................................................................................................. |
|
10 |
|
|
4.2.1 |
Литералы (простые константы) ......................................................................................... |
10 |
||
|
4.2.2 |
Символические константы................................................................................................. |
15 |
||
|
4.2.3 |
Перечисления...................................................................................................................... |
|
15 |
|
|
4.3 |
Скалярные объекты встроенных типов данных....................................................................... |
15 |
||
|
4.3.1 |
Тип float .............................................................................................................................. |
|
19 |
|
|
4.3.2 |
Тип decimal ......................................................................................................................... |
|
20 |
|
|
4.4 |
Выражения и операции.............................................................................................................. |
21 |
||
|
4.4.1 |
Битовые операции .............................................................................................................. |
24 |
||
|
4.4.2 |
Операции сдвига................................................................................................................. |
|
25 |
|
|
4.4.3 |
Арифметические операции:............................................................................................... |
26 |
||
|
4.4.4 |
Преобразование типов........................................................................................................ |
27 |
||
|
4.4.5 |
Особый порядок выполнения операций замещения......................................................... |
29 |
||
|
4.4.6 |
Логические операции и операции отношения................................................................... |
30 |
||
|
4.4.7 |
Операции инкремента и декремента.................................................................................. |
31 |
||
|
4.4.8 |
Объявление и использование символических констант................................................... |
31 |
||
|
4.4.9 |
Объявление и использование перечислимых констант.................................................... |
32 |
||
|
4.4.10 |
Операция выбора................................................................................................................ |
|
32 |
|
|
4.4.11 |
Операция присваивания..................................................................................................... |
35 |
||
|
4.5 |
Операторы управления.............................................................................................................. |
35 |
||
|
4.5.1 |
Типы вычислительных процессов ..................................................................................... |
35 |
||
|
4.5.2 |
Операторы выбора.............................................................................................................. |
37 |
||
|
4.5.3 |
Оператор выбора if............................................................................................................. |
37 |
||
|
4.5.4 |
Оператор выбора if-else...................................................................................................... |
38 |
||
|
4.5.5 |
Оператор выбора if-else-if................................................................................................... |
38 |
||
|
4.5.6 |
Блочный оператор .............................................................................................................. |
40 |
||
|
4.5.7 |
Оператор множественного выбора switch ......................................................................... |
40 |
||
|
4.5.8 |
Операторы циклов.............................................................................................................. |
43 |
||
|
4.5.9 |
Оператор цикла while ......................................................................................................... |
44 |
||
|
4.5.10 |
Оператор цикла |
do while.................................................................................................. |
45 |
|
|
4.5.11 |
Оператор цикла |
for.......................................................................................................... |
46 |
|
|
4.5.12 |
Операторы goto, break и continue в циклах....................................................................... |
47 |
||
|
4.5.13 |
Вложенные циклы.............................................................................................................. |
49 |
||
|
4.6 |
Массивы..................................................................................................................................... |
|
50 |
|
|
4.6.1 |
Одномерные массивы......................................................................................................... |
50 |
||
|
4.6.2 |
Оператор цикла foreach..................................................................................................... |
52 |
||
|
4.6.3 |
Простейшие приёмы работы с одномерными массивами................................................. |
53 |
||
|
4.6.4 |
Двумерные массивы........................................................................................................... |
60 |
||
|
4.6.5 |
Двумерные ломаные (ступенчатые, зубчатые) массивы................................................ |
65 |
||
5 |
Методы (подпрограммы)............................................................................................ |
67 |
2
|
5.1 |
Типы и аргументы методов....................................................................................................... |
68 |
|
5.2 |
Модификаторы ref и out ............................................................................................................ |
69 |
|
5.3 |
Массив в качестве входного аргумента.................................................................................... |
71 |
|
5.4 |
Модификатор params................................................................................................................. |
72 |
|
5.5 |
Перегрузка методов................................................................................................................... |
73 |
|
5.6 |
Рекурсивные методы................................................................................................................. |
73 |
6 |
Строки......................................................................................................................... |
75 |
|
|
6.1 |
Объявление строк...................................................................................................................... |
75 |
|
6.2 |
Операции и методы для работы со строками........................................................................... |
77 |
|
6.3 |
Массивы строк........................................................................................................................... |
79 |
7 |
Структуры................................................................................................................... |
81 |
|
|
7.1 |
Конструкторы............................................................................................................................ |
83 |
|
7.2 |
Конструкторы копии................................................................................................................. |
84 |
|
7.3 |
Неособые методы ...................................................................................................................... |
85 |
|
7.4 |
Переопределение методов......................................................................................................... |
85 |
|
7.5 |
Операции для пользовательских типов .................................................................................... |
87 |
|
7.6 |
Свойства..................................................................................................................................... |
88 |
8 Методы и алгоритмы численного интегрирования .................................................. |
89 |
||
|
8.1 |
Постановка задачи..................................................................................................................... |
89 |
|
8.2 |
Программная реализация численного интегрирования........................................................... |
93 |
9 |
Приложение 1 ............................................................................................................. |
96 |
3
1 Введение
Как известно, языки программирования служат одной цели – написанию исходного кода программ. По степени «близости» аппаратной части языки программирования делятся на низкоуровневые (машинно-ориентированные) и высокоуровневые. В свою очередь, языки высокого уровня различаются на структурные (процедурно-ориентированные) и объектно-ориентированные. В первом случае концепция программирования может быть определена, как набор функций (центральный элемент системы), обрабатывающих данные. В объектноориентированных языках центральное место отведено данным, а выполнение функций так или иначе организовано вокруг этих данных. Типичным представителем процедурных языков считается язык Си, объектно-ориентированных – Си++. Последний до недавних пор оставался одним из наиболее универсальных для решения широкого круга задач. При этом использование Си++ в конкретных инструментальных системах (например, Builder) и для конкретного вида приложений (например, сетевых приложений) требовало соответствующих добавлений (расширений) языка и в ряде случаев приводило к созданию своего рода диалектов, где базовые конструкции оказывались зачастую не всегда различимым фоном.
Как это часто бывает в истории, когда «вес» количественных изменений превысил некоторый суммарный порог, появился новый язык программирования С# (произноситься, как си шарп, хотя разработчики предполагали названием си-диез), вобравший в себя значимые черты своих предшественников и в большей степени отвечающий современным потребностям.
Руководителем группы разработчиков языка С# является Андерс Хейлсберг,
сотрудник компании Microsoft (ранее входил в группу разработчиков инструментальной системы Builder). Цели, которые преследовались созданием этого языка были сформулированы им следующим образом:
•создать объектно-ориентированный язык, в котором любая сущность представляется объектом;
•создать первый компонентно-ориентированный язык программирования семейства C/C++;
•упростить C++, сохранив его мощь и основные конструкции.
•повысить надёжность программного кода.
Компонентами называются объекты специальных типов, позволяющие эффективно разрабатывать модульные оконные приложения. Построение компонентов обычно определяется не только языком, но и платформой, на которой этот язык реализован. Язык С# разработан для платформы .NET (произносится, как «дот-нет»), которая в свою очередь является средой, открытой для свободного включения новых языков, создаваемых не только Microsoft, но и (потенциально) другими фирмами. Проще говоря, .NET объединяет набор программных технологий, ориентированных, прежде всего, на разработку Web и Windows приложений (отсюда и название).
Среда .NET содержит такие основные составляющие, как CLR (Common Language Runtime) – общеязыковую среду исполнения:
4
ядро (набор служб, управляющих загрузкой приложения в память,
собраны в mscoree.dll);
библиотека базовых классов (главная сборка в mscorlib.dll);
Всоставе этой библиотеки выделяется CTS (Common Type System) – общая система типов и подмножество этой системы CLS (Common Language Specification) –
общеязыковую спецификацию (содержит типы данных, которые гарантированно поддерживаются во всех языках .NET),
Процесс создания приложения на C# в среде .NET представляет следующую последовательность этапов:
*.cs - файл
Исходный код на C# |
|
|
С# - транслятор |
|
|
Управляемый, |
*.exe - файл |
|
платформеннонезависимый |
||
(сборка) |
||
(промежуточный) код на языке IL |
||
( intermedia language) |
|
JIT (just in time) - компилятор времени выполнения
Машинный платформеннозависимый код, исполняющийся в среде CLR
Загружается
непосредственно в оперативную память
Наряду с языком C# в среде NET в соответствии с указанной технологией могут быть использованы такие языки, как C++, VB.NET, VisualBasic, Jscript, J# и т.д. (всего более 30 языков).
Язык С# можно считать непосредственным преемником языка С++. С другой стороны, не могут быть незамеченными в его составе и многие черты такого языка,
как Java.
Задачей второй части дисциплины «Информатика» (и, соответственно, первой части изучения настоящего программирования) является изучение и практическое освоение части языка С#, не связанной с глубоким использованием объектного и компонентного программирования. Завершение изучения языка будет осуществлено уже в рамках дисциплины «Современные языки программирования» в следующем семестре.
5
2 Первая программа на C#
class FirstProgram
{
static void Main()
{
System.Console.WriteLine("Здравствуй, Мир!");
}
}
На экране (режим запуска «Start without Debugging» - запуск без отладчика):
Комментарий к тексту «первой программы»
Слово class, расположенное в первой строке, относится к объектноориентированной части языка и разговор об этом будет отдельный. Для начала можно отметить, что class – это способ описания конструкции объекта. Элементами класса могут быть :
поля - именованные области памяти для размещения данных;
методы - фрагменты кода, выполняющие некоторое действие;
свойства и операции – упрощенные или специализированные вариации методов;
события – специальные ссылки для т.н. обратного вызова методов.
Слово class должно присутствовать, хотя бы один раз, в любой программе на C#. Здесь, несомненно, проявляется заимствование из языка Java: даже главная (Main) программа должна принадлежать классу и поэтому называется методом. В данном случае имя класса FirstProgram, а программа Main - часть этой конструкции. Имя после class – произвольное.
Во второй строке слово static объявляет метод Main статическим, что определяет возможность запуска на выполнения без каких - либо предварительных условий (а именно: без предварительного создания объекта класса). Фраза void Main() является заголовком метода Main: объявляет пустой возвращаемый тип (void) и пустой «()» список входных параметров. Следующий далее блок фигурных скобок ограничивает «тело» метода Main, состоящий из одного оператора – вызова функции (правильнее сказать – метода) WriteLine с входным аргументом - строкой "Здравствуй, Мир!". Можно отметить, что аргументы метода всегда помещаются внутри круглых (обычных) скобок. Заканчивается оператор символом «;», являющимся обязательным ограничителем большинства конструкций С#. Приписка перед именем функции System.Console. указывает, что функция WriteLine является методом класса Console (тоже статическим), который, в свою очередь, относится к категории системных (System – корневое пространство имён).
Имя главной программы Main не может быть изменено, так как система именно с этой программы начинает выполнение любой программной системы (т.н. точка входа).
6
Если использовать оператор using , определяющий пространство имён System, оператор вызова функции WriteLine несколько упрощается:
using System; class FirstProgram
{
static void Main()
{
Console.WriteLine("Здравствуй, Мир!");
}
}
2.1 Пространства имён
Как уже отмечалось, программирование на C# основано на системе (библиотеке) типов CTS. Эта библиотека насчитывает более 4000 различных типов, которые для удобства работы объединены в функциональные группы – пространства имён. Группы, в свою очередь, представляют собой иерархическую древовидную систему. Часть этой системы представлена на схеме:
System |
Корневое пространство имён |
Контейнерные
|
|
|
Collection |
классы |
|
|
|
|
|
|
|
Windows |
Классы для работы с |
|
|
|
элементами интерфейса |
||
|
|
|
||
|
|
|
Windows |
|
|
Drawing |
Классы для работы с графическими |
||
|
примитивами |
|
||
|
|
|
||
IO |
Классы, отвечающие за операции ввода |
|
||
- вывода |
|
|
|
|
|
|
|
|
На первом этапе освоения C# будет использовано только пространство имён
System.
3 Общая характеристика и вспомогательные элементы языка
Алфавит (множество литер) языка программирования С# составляют символы:
строчные и прописные буквы латинского алфавита;
цифры от 0 до 9;
символ подчеркивания ‘_’;
набор специальных символов: " ( ) { } | [ ] + - % / \; ' : ? < > = ! & # ~ *
прочие символы.
7
В свою очередь, алфавит С# служит для построения слов, которые называются лексемами. Различают пять типов лексем:
ключевые слова;
разделители.
идентификаторы;
константы;
знаки (символы) операций;
3.1Ключевые слова
Всоставе языка C# ровно 77 ключевых слов, из которых в текущем семестре освоены будут примерно половина (подчёркнуты):
abstract |
false |
params |
this |
as |
finally |
private |
throw |
base |
fixed |
protected |
true |
bool |
float |
public |
try |
break |
for |
readonly |
typeof |
byte |
foreach |
ref |
uint |
case |
goto |
return |
ulong |
catch |
if |
sbyte |
unchecked |
char |
implicit |
sealed |
unsafe |
checked |
in |
short |
ushort |
class |
int |
sizeof |
using |
const |
interface |
stackalloc |
virtual |
continue |
internal |
static |
void |
decimal |
is |
string |
volatile |
default |
lock |
struct |
while |
delegate |
long |
switch |
|
do |
namespace |
operator |
|
double |
new |
out |
|
else |
null |
override |
|
enum |
object |
|
|
event |
|
|
|
explicit |
|
|
|
extern |
|
|
|
3.2 Разделители
Лексемы языка имеют собственные правила словообразования (синтаксис) и обособляются разделителями:
скобки ( ) { } [ ],
пробел,
табуляция,
символ новой строки,
комментарии.
Осимволах табуляции и новой строки речь пойдёт в разделе о литералах.
3.3Комментарии
Комментарий – это текст, который предназначен только для читающего программу человека и игнорируется компилятором. В С# это можно сделать одним из трёх способов:
8
парный комментарий - /* комментарий */;
строчный комментарий - // комментарий заканчивается в конце данной строки;
xml – комментарий для создания самодокументируемых программ(///);
3.4 Идентификаторы
Идентификаторами называются имена, которые назначает программист. Именуются объекты, классы, структуры, методы, метки и т.п. Правило написания идентификаторов достаточно простое:
состоит из одного или более символов. Обычно даётся осмысленное, отражающее назначение элемента имя;
идентификатор не может совпадать с ключевым словом. Точнее сказать, может – но с точностью до @ (например, @else, @for, @case – допустимые идентификаторы);
размер идентификатора не ограничен;
первый символ – обязательно буква. Хорошую читабельность придают знаки нижнего подчёркивания внутри имени (например, my_firstr_variable) или использование прописных букв (MyFirstrVariable);
в идентификаторах можно (!) использовать русские буквы (например,
моя_первая_переменная или МояПерваяПеременная);
4 Объекты данных и базовые средства их обработки
4.1 Иерархия встроенных типов в C#
Все объекты данных в C# являются производными от системного «супербазового» типа Object (или object):
Object
GetType() |
|
|
|
|
ToString() |
методы |
|
|
|
… |
|
|
|
|
|
|
|
|
|
Value Type |
String |
Array |
Type |
… |
- значащие типы |
|
|
|
|
MaxValue
MinValue статические
…поля
встроенные типы |
структурные типы |
Enum |
|
SByte, Byte, Char, Int16,UInt16,… |
|
Небольшое пояснение, связанное с типом Type. Любая программа .NET организуется в виде самоописательной (и самодостаточной) сущности - сборки (assembly). Сборка состоит из одного или нескольких модулей в виде IL – кода, а
9
также необходимых описаний для использования этого кода. Эти описания называются метаданными. Для работы с подобными описаниями как раз и разработан специальный тип Type. Он позволяет получить информацию о конструкторах, методах, полях, свойствах и событиях класса, а так же о том, в каком модуле и сборке развернут соответствующий тип.
4.2 Константы
Константами называются объекты данных, которые не изменяют своего значения на всём времени выполнения программы. Константы в С# бывают трёх типов :
литералы (или простые константы); символические константы; перечислимые константы.
4.2.1 Литералы (простые константы)
Литералов насчитывается четыре типа:
•целочисленный литерал;
•вещественный литерал;
•символьный литерал;
•строковый литерал.
Целочисленный литерал (или целочисленная константа) служит для записи целых значений и является соответствующей последовательностью цифр. Эта последовательность может предваряться знаком '-', в данном случае являющейся операцией смены знака. Целочисленный литерал, начинающийся с 0х или 0X, воспринимается как шестнадцатеричное целое. В этом случае целочисленный литерал может включать символы от А или а, до F или f. В зависимости от значения целочисленный литерал размещается последовательно в одном из следующих форматов (по мере увеличения значения) :
целочисленный знаковый размером 4 байта;
целочисленный беззнаковый размером 4 байта;
целочисленный знаковый размером 8 байт;
целочисленный беззнаковый размером 8 байт;
Непосредственно за константой могут располагаться в произвольном сочетании один или два специальных суффикса: U (или u) и L (или l). При этом суффикс U (или u) регламентирует использование беззнакового формата, а L (или l) использование формата удвоенного размера – 8 байт.
Вещественный литерал служит для задания вещественных значений. Он представляет собой запись соответствующего значения в десятичной системе в том числе, в экспоненциальной форме, когда мантисса отделена от порядка символом Е (или е). Размещается вещественный литерал в 8-байтовом плавающем формате (соответствует плавающему типу с удвоенной точностью - double). Непосредственно за вещественным литералом может располагаться один из двух специальных суффиксов: F (или f) для создания 4-х байтовой константы плавающего типа (float).
10