Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
2. Основы языка программирования C#
C# – объектно-ориентированный язык программирования. Разработан в
1998–2001 годах группой инженеров под руководством Андерса Хейлсберга
в компании Microsoft как основной язык разработки приложений для
платформы Microsoft.Net. В языке изначально заложено много
перспективных возможностей для его дальнейшего развития.
2.1. Алфавит языка Visual C#
Язык программирования – формальная знаковая система,
предназначенная
для
записи
компьютерных
программ.
Язык
программирования определяет набор лексических, синтаксических и
семантических правил, задающих внешний вид программы, и действия,
которые выполнит исполнитель (компьютер) под ее управлением.
Алфавит языка программирования – это набор символов и
служебных (зарезервированных) слов, которые используются при написании
программ.
В алфавит языка C# входят:
1. Латинские буквы и буквы национального алфавита (символы
кириллицы в том числе), как строчные, так и заглавные.
2. Цифры.
3. Специальные символы, например: *, -, /, % и т.д. За некоторыми из
них закреплен определенный смысл, изменить который нельзя. Поэтому
такие символы используются в определенных значениях.
4. Зарезервированные служебные слова, например: using, for, switch,
class и т.д.
2.2. Типы данных
Данные хранятся в памяти компьютера, но для указания на конкретную
информацию очень неудобно все время записывать физические адреса ячеек.
Эта проблема в языках программирования высокого уровня решена
введением понятия переменной.
Переменная – именованный участок памяти для хранения данных
определенного типа. Значение переменной (информация в соответствующих
ячейках памяти) в ходе выполнения программы может быть изменено.
Константами называются величины, значение которых в ходе выполнения
1
программы изменено быть не может. Конкретные переменные и константы
представляют собой объекты уникальные и отличаются друг от друга
именем.
В качестве данных в программах могут выступать числа, символы,
целые строки символов. С этими различными видами информации
выполняются совершенно разные действия. Например, с числовыми
величинами производятся арифметические операции, что невозможно
сделать с величинами символьными. Кроме того, разные виды данных
требуют различного объема памяти для хранения. В соответствии с этими
соображениями введено понятие "Тип". Тип переменной указывает на то,
какие данные могут быть сохранены в этом участке памяти и в каких
действиях эта переменная может участвовать. Существуют встроенные
(зарезервированные, базовые) типы, но есть также возможность создавать
свои собственные, определяемые программистом, типы переменных.
Встроенные типы
Список встроенных типов практически одинаков во всех языках
программирования. К ним относятся:
Логический тип – bool (может принимать два значения: Истинноtrue, Ложно-false), например:
bool f = true;
Целый тип – может принимать как положительные, так и
отрицательные числовые значения. Однако пользователь может указывать
варианты целочисленного типа, которые могут принимать числовые
значения из разных диапазонов. Все диапазоны принимаемых значений
целого типа и других типов перечислены в таблице 2.1;
Вещественный (действительный) тип (то есть – с дробной частью).
Примеры обозначения действительного числа:
double x = -25.000452
float a = 0.24
double m = 4.854E-12; //соответствует числу, записанному
//экспоненциальной форме 4,854·10-12 ;
в
Символьный тип – char. Ключевое слово char используется для
объявления символа Юникода в диапазоне, указанном в табл. 2.1. Символы
Юникода – это 10-разрядные символы, которые используются для
представления большинства известных письменных языков мира. Он
2
содержит внутри себя всего один символ, например, 'w' или '#'. Все
следующие операторы объявляют переменную char и инициализируют ее
символом X:
char c1 = 'X';
char c2 = '\x0058';
// Буквенный символ
// Шестнадцатеричный код символа X;
Строковый тип – string; представляет последовательность из нуля
или более символов в кодировке Юникод, по умолчанию – до 2 Гбайт.
Например:
string a = "hello";
string b = "h";
Таблица 2.1. Таблица встроенных типов данных в языке C#
Название
Ключевое
слово
Тип
.NET
Диапазон значений
Описание
Размер,
битов
Логический тип bool
Boolean true, false
Целые типы
sbyte
SByte
От –128 до 127
Со знаком
8
byte
Byte
От 0 до 255
Без знака
8
short
Int16
От –32768 до 32767
Со знаком
16
ushort
UInt16
От 0 до 65535
Без знака
16
int
Int32
От –2 x 109 до 2 x 109
Со знаком
32
uint
UInt32
От 0 до 4 x 109
Без знака
32
long
Int64
От –9 x 1018 до 9 x 1018 Со знаком
64
ulong
UInt64
От 0 до 18 x 1018
Без знака
64
char
Char
От U+0000 до U+ffff
Unicode-символ
16
Single
От 1.5 x 10-45 до
3.4 x 1038
7 цифр
32
Double
От 5.0 х 10-324 до
15–16 цифр
64
28–29 цифр
128
Символьный
тип
Вещественные float
double
308
1.7 х 10
Финансовый
тип
decimal
Строковый тип string
Decimal От 1.0 x 10-28 до
7.9 x 1028
String
Длина ограничена
объемом доступной
памяти
3
Строка из
Unicodeсимволов
Физически типы данных отличаются друг от друга количеством ячеек
памяти (байтов), отводимых для хранения соответствующей переменной.
Логическое же отличие между ними проявляется в интерпретации
хранящейся информации. Например, переменные типа Char и типа Byte
занимают в памяти по одному байту, однако в первом случае содержимое
ячейки памяти интерпретируется как целое беззнаковое число, а во втором –
как код (ASCII) символа.
2.3. Идентификаторы
Имена операторов, переменных, констант, типов величин, имя самой
программы назначаются программистом и называются идентификаторами.
Существуют правила, которым должны отвечать все идентификаторы:
идентификатор должен быть уникальным, то есть одним и тем же
именем разные объекты названы быть не могут;
идентификатор может иметь ограничение по длине (зависит от
конкретной реализации языка на компьютере);
идентификатор может состоять из символов и цифр, допустимо
использовать знак подчеркивания ("_"), регистр букв имеет значение;
идентификатор не может начинаться с цифры.
//допустимые идентификаторы
x , s5 , Ax6 , D_f , _Fm5 , xM_5 , _128
Для
того
чтобы
облегчить
восприятие
и
понимание
последовательностей операторов, желательно создавать составные
осмысленные имена. При создании подобных имен в одно слово можно
«втиснуть» предложение, которое в доступной форме представит
информацию о типе объекта, его назначении и особенностях использования.
Например, procentInMonth будет подходящим именем для переменной,
хранящей значение процента за месяц при оплате кредита.
Вы можете давать программным объектам любые имена, но
необходимо, чтобы они отличались от зарезервированных слов,
используемых языком (компилятор все равно не примет переменные с
«чужими» именами).
Зарезервированные (ключевые) слова имеют специальное значение для
компилятора. Их можно использовать только в том смысле, в котором они
4
определены. Далее приведен список наиболее часто встречающихся
зарезервированных слов языка C#.
abstract
event
new
struct
as
explicit
null
switch
base
extern
object
this
bool
false
operator
throw
break
finally
out
true
byte
fixed
override
try
case
float
params
typeof
catch
for
private
uint
char
foreach
protected
ulong
checked
goto
public
unchecked
class
if
readonly
unsafe
const
implicit
ref
ushort
continue
in
return
using
decimal
int
sbyte
virtual
default
interface
sealed
volatile
delegate
internal
short
void
do
is
sizeof
while
double
lock
stackalloc
else
long
static
enum
namespace
string
5
2.4. Константы
Константы представляют собой неизменные значения, известные во
время компиляции и неизменяемые на протяжении времени существования
программы. Константы незаменимы при использовании в тексте программы
многократно повторяемых значений, и удобны в случае необходимости
изменения этих значений сразу во всей программе.
Константы объявляются с помощью ключевого слова const; их
использование способствует повышению удобочитаемости кода. Например,
при решении физических задач в качестве константы можно задать
стандартное ускорение свободного падения на поверхности Земли.
В языке существует два вида констант:
неименованные константы (цифры и числа, символы и строки,
множества);
именованные константы.
Неименованные константы
Неименованные константы, как следует из названия, не имеют имен, и
потому их не нужно описывать. Тип неименованной константы определяется
автоматически, по умолчанию:
любая последовательность цифр (возможно, предваряемая знаком
«-» или «+» или разбиваемая одной точкой) воспринимается компилятором
как неименованная константа – число (целое или вещественное);
любая последовательность символов, заключенная в апострофы,
воспринимается как неименованная константа – строка;
любая последовательность целых чисел либо символов через
запятую, обрамленная квадратными скобками, воспринимается как
неименованная константа – множество.
Кроме того, существуют две специальные константы – true и false,
относящиеся к логическому типу данных.
Примеры неименованных констант:
a
b
c
d
=
=
=
=
-10;
12.075 + х;
'z';
"abc" + string44;
6
Именованные константы
Именованные константы, как тоже следует из их названия, должны
иметь имя. Эти имена необходимо описать в специальном разделе const.
Если не указывать тип константы, то по ее внешнему виду компилятор
сам определит, к какому (базовому) типу ее отнести. Любую уже описанную
константу можно использовать при объявлении других констант,
переменных и типов данных. Вот несколько примеров описания
именованных констант:
const int speedLimit = 55;
const double pi = 3.14159265358979323846264338327950;
2.5. Переменные
В языке C# переменные объявляются перед первым их использованием
в программе, т.е. для каждой переменной указывается определенный тип
данных и идентификатор. Тип указывает точный объем памяти, который
компилятор выделит в памяти для хранения значения при выполнении
приложения. Компилятор языка С# требует, чтобы любая переменная была
инициализирована некоторым начальным значением, прежде чем можно
было обратиться к ней в какой-то операции. Например:
int answer = 42;
string greeting = "Hello, World!";
double bigNumber = 1e100;
Console.WriteLine("{0} {1} {2}", answer, greeting, bigNumber);
2.6. Комментарии
В текстах C#-программ допускаются фрагменты пояснительного
характера – комментарии. Наличие комментариев не изменяет смысл
программы и не влияет на ее выполнение.
В языке C# комментарии представляют собой произвольную
последовательность символов, заключенную в фигурные символы /* и */,
например:
/*Это многострочный
комментарий*/
или строки, начинающиеся с // , например:
//Это однострочный комментарий
Старайтесь писать комментарии с таким расчетом, чтобы, взяв свою
программу через полгода, вы смогли понять, как она работает. Не экономьте
на комментариях. Комментарии большого размера не ухудшают качества
7
программы. Пример программы с комментариями приведен в листинге 2.1. В
языке C# по умолчанию комментарии выделяются зеленым цветом.
2.7. Операторы языка
Операторы в языке программирования – это синтаксические
конструкции, предназначенные как для записи алгоритмических действий по
преобразованию данных, так и для задания порядка выполнения других
действий.
Набор операторов языка программирования составляет минимальное
множество конструкций, необходимых для наглядного и однозначного
представления алгоритмов в стиле структурного программирования.
2.7.1. Оператор присваивания
Самым простым действием над переменной является занесение в нее
величины соответствующего типа, т.е. присвоение переменной конкретного
значения. Такая команда (оператор) в общем виде выглядит следующим
образом:
<Имя переменной> = <Выражение>;
Тип переменной и тип выражения должны быть совместимы1. Выражение,
указанное справа от знака «=», должно приводить к значению того же типа,
какого и сама переменная, или типа, совместимого с переменной
относительно команды присваивания. Например, переменной типа double
можно присвоить значение типа Int или byte (наоборот делать нельзя).
Выражение будет сначала вычислено, затем его результат будет положен в
ячейки памяти, отведенные для переменной.
Выражение – это конструкция, возвращающая значение. Например:
A
B
E
F
= X;
=15;
= X * Y;
= Z / (1 - Z);
//
//
//
//
переменная
целая константа
произведение X на Y
отношение Z к (1 - Z)
Так же можно делать множественное присваивание (во все переменные
заносится самое правое значение):
a = b = c = d = 18;
1
Более подробно о совместимости и конвертировании типов данных будет рассказано позднее.
Пока следует считать, что типы совместимы, если при их преобразовании не происходит потери точности.
8
2.7.2. Операторы ввода
Для того чтобы получить данные, вводимые пользователем вручную с
клавиатуры (то есть с консоли), применяется метод ReadLine().
<строковая переменная>=Console.ReadLine()
Результатом ввода с помощью оператора Console.ReadLine() является
строка (т.е. значение строкового типа). Для того чтобы преобразовать
введенное значение к нужному типу данных, можно использовать методы
объекта Convert: Convert.ToInt32; Convert.ToDouble; Convert.ToBoolean;
Convert.ToByte; Convert.ToChar и т.п.
Например:
Number1 = Convert.ToInt64(Console.ReadLine());
В листинге 2.1 демонстрируются примеры ввода с клавиатуры
значений переменных.
Листинг 2.1. Ввод значений переменных с клавиатуры
using System;
namespace Ex2_1
{
class Program
{
static void Main(string[] args)
{
//ввод значений переменных с использованием промежуточной
переменной
Int32 x; Double y; string s;
s = Console.ReadLine();
x = Convert.ToInt32(s);
//без промежуточной строковой переменной
y = Convert.ToDouble(Console.ReadLine());
}
}
}
Типы вводимых значений должны совпадать с типами указанных
переменных, иначе возникает ошибка. Поэтому нужно внимательно следить
за правильностью вводимых данных.
Если запустить консольное приложение на выполнение, то на экране
мелькнет окно с результатом и исчезнет. Для того чтобы задержать окно на
экране до тех пор, пока пользователь не нажмет какую либо клавишу, можно
использовать следующий оператор:
Console.ReadKey();
9
2.7.3. Операторы вывода
Ожидая от человека ввода значения с клавиатуры, не нужно полагать,
что он просто по мерцанию курсора на черном экране догадается, какого
типа переменная нужна ожидающей программе. Следует всегда
придерживаться правила: перед тем, как запросить что-либо с консоли,
необходимо сообщить пользователю, что именно он должен ввести –
характер вводимой информации, тип данных, максимальное и минимальное
допустимые значения и т.п.
Примером хорошего приглашения служит, скажем, такая строчка:
Введите два вещественных числа (0.1<1000000) – длины катетов.
Для вывода на экран сообщения воспользуйтесь методами
Console.Write или Console.WriteLine.
Первый из них, напечатав на экране все, о чем его просили, оставит
курсор в конце выведенной строки, а второй переведет курсор в начало
следующей, например:
Console.WriteLine(s);// переменная
Console.Write (55.3);// константа
Console.WriteLine(y*3+7);// выражение
Можно выводить списком несколько переменных:
Console.WriteLine("Это число А={0} далее B={1} и их сумма {2}",
a, b, a + b);
В языке C# в консольном выводе функций Console.Write() и
Console.Writeln() применяются универсальные индексированные метки {0},
{1}, {2}, и т.д., содержащие порядковый номер выводимого параметра в
списке параметров. Эти подстановочные выражения обозначают знакоместа
(placeholde), куда будет выводиться значение соответствующего параметра
из списка. Знакоместо должно начинаться открывающей фигурной скобкой, а
завершаться закрывающей: {}.
Листинг 2.2. Пример сложения двух чисел
using System;
namespace example_2_2
{
class Program
{
static void Main(string[] args)
{
Console.Write("Введите целое число ");
Int16 x = Convert.ToInt16(Console.ReadLine());
10
Console.Write("Введите вещественное число ");
Single y = Convert.ToSingle(Console.ReadLine());
Single z = x + y;
Console.WriteLine("Сумма двух чисел:{0}+{1}={2}", x, y, z);
Console.ReadKey();
}
}}
Результат работы листинга 2.2 приведен на рис. 2.1.
Рис.2.1. Вид окна выполненной программы листинга 2.2
2.8. Форматированный вывод
Управлять видом выводимых значений можно с помощью строки
стандартных числовых форматов. В табл. 2.2 приведены поддерживаемые
строки. Строка формата принимает следующую форму: Axx, где A –
описатель формата, а xx – описатель точности, который управляет
количеством значащих цифр или десятичных знаков форматированного
результата.
Таблица 2.2. Параметры форматирования в языке C#
Параметр
Значение
C, c
Используется для вывода значений в денежном (Currency) формате. По
умолчанию перед выводимым значением подставляется символ доллара ($)
D, d
Используется для вывода целых десятичных значений (Decimal). После этого
символа можно указать количество значащих цифр
E, e
Для вывода значений в экспоненциальном формате (Scientific)
F, f
Вывод значений с фиксированной точкой (Fixed-point)
G, g
Общий (General) формат. Применяется для вывода значений с фиксированной
точностью или в экспоненциальном формате
N, n
Стандартное числовое форматирование (Number) с использованием
разделителей (пробелов или запятых) между разрядами
X, x
Вывод значений в шестнадцатеричном формате (Hexadecimal). Если
использовать прописную X, то символы в шестнадцатеричном формате также
будут заглавными
11
R, r
Округление (Round-trip)
Символы форматирования следуют в индексированных знакоместах
сразу за номером подставляемого параметра через двоеточие:
Console.Write("{0:C}", 2.5); //
Console.Write("{0:D5}", 25); //
Console.Write("{0:E}", 250000);
Console.Write("{0:F2}", 25); //
Console.Write("{0:F0}", 25); //
$2.50
00025
// 2.500000E+005
25.00
25
2.9. Арифметические операции
В языке C# определены все обычные для языков программирования
арифметические операции: «+» (сложение), «–» (вычитание), «*»
(умножение), «/», «%» (два вида деления).
Приоритет операций сложения и вычитания ниже, чем умножения,
деления и вычисления остатка. Для изменения порядка вычисления
используют круглые скобки, например, для умножения на 2 суммы двух
чисел A и B можно написать: 2*(A+B).
Смена знака. Унарная операция «-» означает смену знака. Она имеет
очень высокий приоритет – выше, чем, к примеру, у операции умножения.
Поэтому в выражении
-A*B
вначале выполняется смена знака для A, а затем умножение -A на B.
В C# один знак «/» означает две разные операции. Если один или оба
операнда вещественные, то выполняется обычное деление, если оба операнда
целые, то выполняется деление нацело и результат будет целого типа.
Использование этой операции требует повышенной внимательности,
например, если запрограммировать вычисление математического выражения
буквально, т.е. так:
1/3*х,
то результат вне зависимости от значения х всегда будет равен нулю, так как
выражение 1/3 означает деление нацело. Для решения проблемы достаточно
один из операндов сделать вещественным:
1.0/3*х
12
Чтобы явно установить вещественный тип, можно поместить
десятичный разделитель после числа, как показано в следующем примере.
Листинг 2.3. Пример форматированного вывода результата операции
деления
static void Main(string[] args)
{
Console.WriteLine(1 / 3);
Console.WriteLine(1D / 3);
Console.WriteLine(1.0 / 3);
Console.WriteLine("{0:F3}",1.0 / 3);
Console.ReadKey();
}
Результат работы листинга 2.3 приведен на рис. 2.2.
Рис. 2.2. Вид форматированного вывода результата операции деления
Операция % – остаток от целочисленного деления; так, результат
операции 13 % 8 есть число 5. Операции целочисленного деления и
нахождения остатка от деления применимы только к целочисленным
операндам, их результатом является целое число.
Листинг 2.4. Пример использования операций нахождения остатка от
деления и целочисленного деления
static void Main(string[] args)
{
Console.WriteLine(24 % 6); // ответ 0
Console.WriteLine(24 / 6); // ответ 4
Console.WriteLine(25 % 7); // ответ 4
Console.WriteLine(25 / 7); // ответ 3
Console.WriteLine(7 % 7); // ответ 0
Console.WriteLine(7 / 7); // ответ 1
Console.WriteLine(8 % 12); // ответ 8
Console.WriteLine(8 / 12); // ответ 0
Console.ReadKey();
}
В языке C# возможна запись некоторых арифметических операций в
сокращенном виде, совмещая ее с оператором присваивания. В табл. 2.3
13
представлены некоторые примеры сокращенной записи арифметических
операций и их аналоги в привычной записи.
Таблица 2.3. Сокращенная форма записи арифметических операторов
Операция
Сокращенная запись
Эквивалентная полная
запись
Инкремент
значения на 1)
(увеличение
А++;
A=A+1;
Декремент
значения на 1)
(уменьшение
B--;
B=B – 1;
C + = 2;
C + = D
C * = 2;
C * = D
C – = 2;
C -= D
C / = 2;
C / = D
C% = 2;
C% = D
C
C
C
C
C
C
C
C
C
C
i += 7 * j;
m /= 3 + k
i = i + 7 * j;
m = m / (3 +
Сложение с присваиванием
Умножение с присваиванием
Вычитание с присваиванием
Деление с присваиванием
Остаток
от
присваиванием
деления
с
Комбинированная запись
=
=
=
=
=
=
=
=
=
=
C
C
C
C
C
C
C
C
C
C
+ 2;
+ D;
* 2;
* D
– 2;
– D
/ 2;
/ D
%2 ;
% D;
k);
2
Операция увеличения (++) увеличивает операнд на 1. Оператор
увеличения может находиться как до, так и после операнда.
Листинг 2.5. Пример использования сокращенной записи оператора
присваивания с вычислением
static void Main(string[] args)
{
double x,y;
x = 1.1; y=2.1;
x++; y--;
Console.WriteLine("x={0} y={1}",x,y);//напечатается x=2.1 y=1.1
x /= 4 + y;
Console.WriteLine("{0:F3}",x);
////напечатается 0.412
Console.ReadKey();
}
2.10. Стандартные функции
В языке C# все часто используемые на практике математические
функции заранее разработаны в виде методов класса Math. Рассмотрим
наиболее часто используемые методы:
2
Существуют две формы записи операции, ДО операнда (++х) и после операнда (х++). В некоторых
случаях они приводят к разным результатам. Более подробно о работе можно прочитать в следующей части
пособия.
14
Math.Abs(x) – возвращает модуль числа х;
Math.Exp(x) – вычисление е в степени х;
Math.Floor(x) – возвращает наибольшее целое число, которое
меньше или равно указанному числу х;
Math.Log(x) – возвращает натуральный логарифм числа х;
Math.Log10(x) – возвращает десятичный логарифм числа х;
Math.Pow(B,E) – возвращает число В, возведенное в указанную
степень Е;
Math.Round(x) – возвращает округленное до ближайшего целого
или указанного количества десятичных знаков значение числа х;
Math.Truncate(x) – возвращает целую часть числа х;
Math.Ceiling(x) – возвращает наименьшее целое число, которое
больше или равно заданному числу x;
Math.PI – возвращает число 3,1415..., математическую константу π ;
Math.E – возвращает число 2,7128..., математическую константу e,
основание натурального логарифма;
Math.Sin(x)
Math.Cos(x)
–
возвращает
тригонометрических функций синус, косинус числа х в радианах;
значение
Math.Atan(x) – возвращает значение тригонометрической функции
арктангенс в радианах;
Math.Sqrt(x) – возвращает значение квадратного корня числа х;
Math.Max(x,y) – возвращает большее из двух чисел х и y.
Важно: большинство методов класса Math возвращает результатом
вещественные числа. Это следует учитывать при описании типа
результирующей переменной.
Правила записи математических выражений на языке
программирования:
1) выражения записываются в строку;
2) очередность выполнения операций регулируется с помощью скобок;
3) используется только один вид скобок – круглые;
4) если вычисляется значение дроби, в числителе или знаменателе
которой записано сложное арифметическое выражение, то числитель или
знаменатель надо заключить в скобки.
15
Пример: Реализовать в виде оператора выражение
Решение:
R=((a+b)*Math.Sin(Math.Pow(x,2))+a*b)/
Math.Sqrt(Math.Pow(Math.Cos(x+Math.PI/2),2)-b);
Примечание: формат печатного листа не позволяет набрать выражение
в строке без разрывов. В тексте программы выражение набирается в одну
строку.
Контрольные вопросы
1. Что называют алфавитом языка программирования? Какие символы
составляют алфавит языка C#?
2. Что в программировании определяет понятие «тип данных»?
3. Перечислите и кратко охарактеризуйте встроенные типы данных в
C#.
4. Что понимают под переменной в языках программирования? Как
описываются переменные в программах на C#?
5. Что такое идентификатор? Каким правилам должен соответствовать
идентификатор?
6. Для чего в программах пишут комментарии? Какие комментарии
бывают и как они оформляются в программах на C#?
7. Как организуется ввод и вывод значений в консольных
приложениях C#?
8. Как можно изменять формат выводимых данных?
9. Какие арифметические операции существуют в C#? Опишите, от
чего зависит тип данных операции деления в C#. Приведите примеры
сокращенной записи арифметических операций.
10. Какие арифметические функции применяются в C#? Приведите
примеры использования арифметических функций в сложных выражениях.
16