Тема 2. Переменные и типы данных

Тема 2. Переменные и типы данных
2.1 Переменные
2.1.1 Концепция переменной
Понятие переменной является очень важным в программировании. Она похожа на коробку, предназначенную для хранения разной всячины.
Рис. 2-1 Простейшее представление о переменной
Термин «переменная» пришел к нам из мира математики, где запись «n = 1» означает, что, начиная с этого момента, используя «n», мы будем подразумевать число «1», пока не изменим значение этой переменной на что-то другое. В программировании все точно так же – программист может написать:
Int32 n; n = 1;
Тем самым он создаст «коробку» и положит в нее число «1». Начиная с данного места программы, переменная «n» станет доступна, а ее значение будет равно 1 до тех пор, пока мы не заменим его некоторым другим числом.
2.1.2 Объявление переменной
К сожалению, многие языки программирования, включая C#, накладывают на переменные ряд ограничений, и требуют формальности. Например, математику достаточно сказать только «n равно 1», а программисту нужно выразиться более точно: «Выделить 32 бита оперативной памяти под хранение данных и обозначить эту ячейку именем «n»; выкинуть все, что там было, и записать туда число 1». Другими словами, язык программирования, в отличие от языка математических формул, в большей степени указывает на то, что именно нужно делать.
В программировании нельзя использовать то, чего нет, поэтому переменную необходимо, сначала создать. Процесс создания переменных по-умному называется «объявлением» или «описанием». Делается это так: сначала указывается тип переменной, а после ее имя.
В общем виде: тип название_переменной;

Пример: Int32 MyValue;
В данном примере мы создали переменную MyValue с типом Int32, который позволяет хранить целые числа в диапазоне ± 2 миллиарда. Отметим так же, что на языке C# команды нужно отделять друг от друга символом точки с запятой, поэтому поставили этот знак в конце строки.
Чтобы сократить писанину, несколько подобных переменных можно объявить одной строкой, перечислив их имена через запятую:
В общем виде: тип первая_переменная, вторая_переменная, третья_переменная;

Пример: Int32 MyValue1, MyValue2, MyValue3;
Создавая переменную, крайне желательно сразу же записывать в нее какое-то начальное значение, что по-умному это называется инициализацией. Если этого не сделать, то при попытке считать значение неинициализированной переменной в программе возникнет ошибка.
В общем виде: тип название_переменной = значение;

Пример: Int32 MyValue = 0;
2.1.3 Имена переменных
Все обычные человеческие языки состоят из слов, а те из букв. Для составления слов нельзя брать какие попало буквы – только те, которые включены в алфавит этого языка. Та же ситуация наблюдается в программировании, там у каждого языка тоже есть алфавит.
В состав алфавита языка С# входят большие и маленькие буквы, цифры и знак нижнего подчеркивания. Из этих символов можно составлять слова, которые делятся на два вида: зарезервированные слова и пользовательские имена.
Зарезервированными словами считаются те, которые имеют особый смысл в языке. Всего в C# их 76 штук, но запоминать их не нужно. Какие-то запомнятся сами, т.к. ты их будешь часто использовать, а во всех других ситуациях компилятор сам тебе скажет, о том, что ему не понравилось выбранное тобою название.
Именами или идентификаторами называются все остальные слова, которые можно составить из букв алфавита. Единственное ограничение – имена не могут начинаться с цифр! И еще одно важное замечание: язык C# различает большие и маленькие буквы, поэтому можно без проблем создать три разных переменных с именами Vasya, vasya и VASYA.
Все остальные символы, такие как знаки препинания, скобки, кавычки, тире, звездочки, решетки, знаки вопроса, восклицательные знаки, знаки доллара и множество других используются в программах на языке C#, но, как и зарезервированные слова, имеют особый смысл и не могут использоваться в именах.
Добавим также, что C# позволяет использовать в названиях переменных символы кириллицы, но это считается плохим тоном. Во-первых, возможны ошибки, так как русская буква «о» и английская «оу» – это две совершенно разные буквы. Ну, а, во-вторых, нужно будет довольно часто переключать раскладку на клавиатуре, что отнимает некоторое время. А хорошие программисты стремятся оптимизировать все, в том числе и свою работу.
2.1.4 Оператор присвоения
Как ты уже заметил, в программировании одиночный знак равенства говорит не о том, что переменные равны, а указывает, что значение правой части этого «уравнения» следует записать в переменную, которая стоит слева. Поэтому в правой части могут быть выражения, а в левой только имя какой-то одной переменной. В силу этого обстоятельства знак равенства называется так же оператором присваивания.
Например, в третьей строке нижеследующего примера в переменную «a» мы записываем значение переменной «b», но никак не наоборот, поэтому обе переменные станут равны трем.
Int32 a=1; Int32 b=3; a = b; Console.Write("a = {0} b={1}", a, b);
В данном примере для вывода на экран мы воспользовались уже знакомой функцией «Console.Write ();». Раньше нам нужен был только один параметр, но теперь пришло время познакомиться с ее дополнительными возможностями. После строки текста, которую мы хотим напечатать, можно указать через запятую сколь угодно много переменных, значение которых потом можно будет вставлять в текстовую строку с помощью шаблона «{x}», где x – это порядковый номер переменной в списке. Нумерация переменных начинается с нуля, поэтому для вставки значения переменной «a» используется шаблон подстановки «{0}».
2.2 Типы данных
Назначение компьютеров заключается в том, чтобы обрабатывать данные. И не важно, что мы делаем за компьютером, – рассчитываем траекторию баллистической ракеты или играем в линейку, на входе всегда есть данные, а на выходе результат их обработки. А уж то, насколько полезными будут эти результаты, остается полностью на совести пользователя. Далее мы рассмотрим элементарные типы и те, что являются встроенными в язык C#.
2.2.1 Элементарные типы данных
Устройство компьютера таково, что изначально он умеет работать только с двоичной системой счисления, в которой наименьшей единицей хранения информации является бит (сокращение от англ. binary digit, двоичное число; название так же совпадает с реально существующим словом bit, которое переводится как «немного», что тоже подходит).
Бит может принимать только два состояния, поэтому с его помощью, например, можно сохранить статус флажка: если флажок установлен, то бит равен единице, если сброшен, то нулю.
Рис. 2-4 Один бит
Но одного бита становится недостаточно, когда нам нужно работать с числами или буквами, поэтому их довольно часто объединяют в группы по 8 штук – байты. Самый правый бит в этой последовательности имеет порядковый номер 0 и называется «младшим», а самый левый с номером 7 – «старшим».
Рис. 2-3 Внутреннее устройство байта, в котором закодировано число «206»
Биты часто называют также разрядами, поэтому говорят, что байт представляет собой 8-разрядный тип данных. Есть типы данных, объединяющие несколько байтов, с разрядностью 16, 32 и даже 64 бита.
Когда говорят об объеме оперативной памяти или размерах жесткого диска, используют производные величины от байта: килобайт, мегабайт, гигабайт и терабайт. Не смотря на то, что метрические приставки были взяты из физики (килограмм, мегатонная, гигагерц, тераджоуль), их нельзя интерпретировать дословно. То есть кило – это не тысяча, мега – не миллион.
Исторически сложилось, что данные приставки со словом «байт» используют некорректно. Вместо 1000 = 103 принято 1024 = 210. Сделано это было преднамеренно, чтобы исключить неоправданных округлений. И весь мир принял эту идею, отсюда и путаница. Если ты хочешь не быть дураком, тебе придется запомнить, что 1 Кбайт = 1024 байт, 1 Мбайт = 1024 Кбайт, 1 Гбайт = 1024 Мбайт, 1 Тбайт = 1024 ГБайт и т. д.
Счет в двоичной системе
Давай вспомним, как происходит счет в привычной тебе десятичной системе: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 Обрати внимание на число 10. Как только у тебя уже нет возможности увеличивать самый младший разряд, ты его сбрасываешь и увеличиваешь следующий. В двоичной системе все происходит точно так же, только каждое из чисел может принимать всего два значения, поэтому счет получается короткий: 02, 12, 102, 112, 1002, и так далее. Чтобы не путать число десять с числом один-ноль в двоичной системе, к числу добавляют нижний индекс «2». Давай рассмотрим этот процесс подробнее.
Число в десятичной системе
Число в двоичной системе
Значение

0
00002
Сбрасываем все биты

1
00012
Прибавляем 1 к 0-му разряду.

2
00102
Прибавляем 1 к 0-му разряду. Получаем число 10. Записываем 0, а 1 переносим на разряд выше.

3
00112
Прибавляем 1 к 0-му разряду.

4
01002
Прибавляем 1 к 0-му разряду. Получаем число 10. Записываем 0, а 1 переносим на разряд выше.
Прибавляем 1 к 1-му разряду. Получаем число 10. Записываем 0, а 1 переносим на разряд выше.


Как «прочитать» двоичное число
Допустим, у тебя в кармане 423 рубля. Ты воспринимаешь это число целиком «четыреста двадцать три», но когда ты только начинал знакомиться с математикой, тебя учили, что 423 = 4*100 + 2*10 + 3. Возможно, что ты даже вспомнишь, как тебя мучили вопросами, сколько единиц, десятков и сотен в том или ином числе. Только ты не задумывался тогда, что эти единицы, десятки и сотни связаны с тем, что мы используем десятичную систему счисления. На самом деле, полной будет следующая запись 423 = 4*102 + 2*101 + 3*100, где 10 – это «основание» используемой системы счисления, а степени 2, 1 и 0 ни что иное, как порядковые номера разрядов.
Двоичные числа нужно воспринимать точно также. Только вместо числа «10» у них в основании будет число «2». Учитель информатики поставил Саше за контрольную 1012. Давай определим, что это за отметка, и тогда нам станет ясно, какие у Саши будут эмоции.
1012 = = 1*22 + 0*21 + 1*20 = = 4 + 0 + 1 = = 510
Как перевести обычное число в двоичную систему
Обратное действие не намного сложнее, нужно лишь только делить на основание системы счисления и записывать остаток в обратном порядке. Как обычно, рассмотрим сначала на примере обычной десятичной системы и выполним, казалось бы, бесполезную работу – переведем номер маршрутки «259» из десятичной системы в саму себя.

Рис. 2-5 Перевод числа «259» из десятичной системы в саму себя
Теперь по аналогии сделать тоже самое будет совсем нетрудно. Например, в 1994-м году Биллу Гейтсу было 39 лет. Давай посмотрим, какой последовательностью нулей и единиц это число будет храниться в памяти компьютера.
Рис. 2-6 Возраст Билла Гейтса в двоичной системе счисления
Как складывать числа в двоичной системе
Складывать и вычитать числа в двоичной системе мы будем методом «столбика». Давай вспомним этот способ сложения. Процесс выполняется поразрядно, начиная с младших разрядов. Если при сложении двух цифр сумма получается больше 9, то «излишек» переносится на разряд выше и наоборот, если меньше, то забирается.
3257 + 1814 ------ 11 + 6 + 10 + 4 ------ 5071
У пирата Джо было 3257 золотых, а у Билли 78 жемчужин, за которые можно было выручить 1814 монет золотом.
Попробуем сложить эти два числа в обычной десятичной системе. Сначала складываем 0-й разряд и получаем 7+4=11, далее 1-й разряд 5+1=6, 2-й разряд 8+2=10, и 3-й разряд 3+1=4. Теперь осталось правильно сложить по разрядам и получить число 5071.

10011 + 10001 ------- 10 + 1 + 0 + 0 + 10 ------- 100100
В регистры процессора для сложения из оперативной памяти поступило два числа: 100112 и 100012. Требуется посчитать, что будет в результате выполнения этой операции.
Если все сделать правильно, то получим число 1001002. При желании ты можешь выполнить проверку (16 + 17 = 36).


Как умножать числа в двоичной системе
Умножать числа в двоичной системе даже проще, чем в десятичной. Для этого даже не потребуется таблица умножения, т.к. достаточно лишь только помнить, что 1 * 0 = 0, а 1 * 1 = 1.
1011 * 101 ------ 1011 + 0000 + 1011 ------ 110111
У бобра «Зубастика» много друзей, 5 из которых пообещали подарить ему по 11 яблок. С помощью калькулятора он посчитал, что в скором времени у него будет 55 яблок. Давай посмотрим, что при этом происходило в процессоре калькулятора?
Берем 0-й разряд второго числа. Так как он равен 1, то при умножении на первое число получаем, собственно, первое число.
Берем 1-й разряд второго числа. Так как он равен 0, то при умножении получаем 0000.
Берем 2-й разряд второго числа. Так как он равен 1, то при умножении снова получаем первое число.
Осталось правильно сложить числа и получим 1101112

Рис. 2-6 Сравнение таблиц умножения
Как нам может помочь обычный калькулятор Windows
В операционной системе Windows есть калькулятор, возможности которого значительно больше, чем можно было бы предположить изначально. По умолчанию он открывается в обычном режиме, но если выполнить команду «Вид Инженерный», то кнопочек становится значительно больше.
В левом верхнем углу находятся переключатели между различными системами счисления. По умолчанию переключатель находится в состоянии «Dec», что соответствует десятичной системе счисления, но можно переключиться так же в шестнадцатеричную (Hex), восьмиричную (Oct) и двоичную (Bin).
Рис. 2-7 Обычный и инженерный режимы программы калькулятор в ОС Windows
Чтобы с помощью калькулятора перевести любое число из десятичной системы в двоичную, достаточно включить режим «Dec», ввести это число с клавиатуры и переключиться в режим «Bin». Попробуй с помощью калькулятора найти ошибку в следующей строке утверждений 564813110 = 5E2FE316 = 254274038 = 111111000101111000000112
2.2.2 Способы представления отрицательных чисел и текста
Теперь ты понимаешь, почему байт, в котором все разряды сброшены, соответствует нулю, а состояние, в котором все разряды установлены, – значению 255. Таким образом, с помощью одного байта можно представить целые числа в диапазоне от 0 до 255.
Если потребуется хранить не только положительные, но и отрицательные значения, то старший разряд байта можно использовать для хранения знака (если он сброшен, число положительное, если установлен – отрицательное). Естественно, что при этом диапазон сократится вдвое, и с помощью одного байта мы сможем представить числа только от –127 до 127. Возможно нам потребуются числа побольше, тогда нужно будет увеличить разрядность.
Текст в компьютере так же хранится в виде чисел. Как это происходит можно показать на простом примере. Попробуй записать все буквы русского алфавита и пронумеровать их от 1 до 32. Числом ноль мы обозначим пробел.
Рис. 2-8 Таблица для расшифровки сообщения
Допустим, тебе поступило такое сообщение «17, 18, 6, 3, 6, 5, 0, 14, 6, 5, 3, 6, 5», попробуем его расшифровать с помощью нашей таблицы. Числу 17 соответствует буква «п», числу 18 – буква «р», далее «е», «в», «е» «д» Получили «превед медвед»! Скорее всего, тебе захочется добавить заглавные буквы, знаки препинания, цифры, символы латинского алфавита и многое другое. В самом простейшем случае на один знак принято выделять один байт информации, поэтому такая таблица может содержать до 256 различных символов.
Точно так же и у компьютера есть таблицы соответствия чисел символам. Причем их много и называются они кодовыми таблицами или проще – кодировками. Очевидно, что, если мы выберем неправильную кодировку, то увидим текст, который не сможем прочитать. Пример таблицы ASCII кодов ты можешь посмотреть в приложении (ASCII – это аббревиатура от American Standard Code for Information Interchange – американский стандартный код для обмена информацией).
2.2.3 Типы данных, встроенные в язык C#
В математике мы можем записать в переменную совершенно любое число (целое, десятичное, дробное), а в программировании с этим строго – назначение переменной определяется ее типом, который задается при ее объявлении.
Встроенные типы языка C# позволяют оперировать различного рода числами, символами, строками и массивами данных. Целые числа (0, ±1, ±2, ±3 и т.д.) обычно применяют в циклах для организации перечислений, и при любых других ситуациях, когда нет надобности в точности до знаков после запятой. Так как под каждую переменную выделяется определенное количество памяти, мы не можем записать туда бесконечно большое число. Для целых чисел в языке C# существует несколько типов: от Sbyte до Int64. Например, тип Int32 занимает ровно 4 байта, и хранить в нем можно числа от примерно -2 миллиардов до примерно +2 миллиардов. Этого обычно хватает, пока вы не соберетесь подсчитать количество китайцев или расстояние от Земли до Солнца. Для таких случаев существуют целочисленные типы большего и меньшего размера.
Кроме предопределенных типов данных есть еще и пользовательские, которые ты можешь придумать и описать самостоятельно, но об этом как-нибудь в другой раз.
Тип .NET
Тип C#
Размер в байтах
Диапазон значений

SByte
sbyte
1
-128 .. 127

Byte
byte
1
0 .. 255

Int16
short
2
-32768 .. 32767

UInt16
ushort
2
0 .. 65535

Int32
int
4
-2147483648 .. 2 147 483 647

UInt32
uint
4
0 .. 4294967295

Int64
long
8
намного больше чем int

UInt64
ulong
8
=)


Чтобы не возникло путаницы, поясню разницу между типами .NET и типами C#. Настоящие типы – типы .NET, а типы C# всего лишь псевдонимы, которые были введены для того, чтобы людям, программировавшим ранее на языках C, C++ или Java, было проще привыкнуть к новому языку. Какие названия использовать – дело ваше. Но мы рекомендуем тебе пользоваться правильными названиями в стиле .NET
Кроме целых чисел, в жизни встречаются еще дробные, и было бы наивно полагать, что компьютер не умеет с ними обращаться. В C# для дробных чисел существуют сразу три разных типа: Single, Double и Decimal. Обычно используют Single, а если его не хватает, применяют Double, ну а Decimal необходим лишь для особо точных вычислений.
Тип .NET
Тип C#
Размер в байтах
Количество разрядов после запятой

Single
float
4
6-7

Double
double
8
15-16

Decimal
decimal
8
16


Кстати, примечательным является тот факт, что точность чисел с «плавающей точкой» зависит от того, насколько большой является целая часть. Представь себе, что тебе нужно записать два числа «16,7236545892» и «64983,2516798612» в 7 клеток, по одной цифре на клетку. Если ты все сделаешь правильно, то в первом случае у тебя получится «16,72365», а во втором «64983,25». Как видишь, изначально числа обладали одинаковой точностью в 10 знаков после запятой, а после преобразования точность первого числа оказалась выше на три порядка. Преимущество такого представления чисел над фиксированной запятой состоит в том, что можно использовать существенно больший диапазон значений при неизменной относительной точности.
Если ты считаешь, что на этом все встроенные типы кончились, спешу обрадовать! Следующий тип – логический.
Тип .NET
Тип C#
Размер в байтах
Диапазон значений

Boolean
bool
1
Правда или ложь (true or false)


Несмотря на страшное название, он очень прост и может содержать лишь только два значения: «правду» или «ложь». Для работы с логическими типами, в C# есть две специальные константы «true» (правда) и «false» (ложь). Вот пример описания логической переменной:
Boolean CSharpRulez = true;
Для хранения букв и строк предназначены типы Char и String. Символьный тип Char хранит буквы, цифры, знаки препинания и другие символы. Одна переменная – один символ. Строковый тип (String) хранит сразу целую последовательность символов, проще говоря – текстовую строку.
Тип .NET
Тип C#
Размер в байтах
Диапазон значений

Char
Char
2
Все символы

String
String
0..65535
Комбинации символов


Чтобы не ломать голову, уясним подробности на примере простой программы, в которой мы объявим переменные разных типов, а потом выведем их значения на экран.
Int32 Сeloe = 12345679; Single Drobnoe = 1234.5678; Boolean Logicheckoe = true; Char Simvol = 'A'; String Stroka = "ABCDEFG";
Console.WriteLine(Celoe); Console.WriteLine(Drobnoe); Console.WriteLine(Logicheskoe); Console.WriteLine(Simvol); Console.WriteLine(Stroka);
В этом куске программы мы последовательно описали и проинициализировали переменные целого, дробного, символьного и строкового типов. Обратите внимание, что:
целые числа записываются просто цифрами;
в дробных может присутствовать разделительная точка;
одиночные символы берутся в одинарные кавычки;
строки берутся в двойные кавычки.
2.2.4 Арифметика с числами
Математики создают переменные и выполняют над ними различные действия, складывая их, умножая и, даже возводя в степень. Программисты ничем не хуже, и этими словами их не напугаешь.
В программировании действия называются операциями. Но эти операции производятся не хирургами в халатах, а специальными элементами языка, называемыми операторами. Результатом действия арифметических операторов почти всегда будет какое-нибудь число.
Оператор
Пояснение

+
Сложение для чисел и конкатенация (сцепление) для строк

-
Вычитание

*
Умножение

/
Деление

%
Остаток от деления


Особо продвинутые программисты, которым лениво печатать «много букоф», используют сокращенный синтаксис. Наличие таких операций в языке С было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях, поэтому это уже не так актуально.
Оператор
Пояснение

++
Инкремент, увеличивает значение переменной на единицу. Например
int a=0; a++; Console.Write(a); //На экране увидим число 1
Инкремент может стоять до и после имени переменной.
Если он стоит после имени переменной, то значение переменной в рамках выражения останется прежним и будет изменено, начиная только со следующей строки.
Именно по этой причине в следующем примере переменная «c» стала равна 6, т. к. значение переменной «b» в рамках выражения осталось равно 3.
int a=2, b=3, c; c = a * b++; //a==2 b==3 Console.WriteLine(b); //На экране увидим число 4 Console.WriteLine(c); //На экране увидим число 6
Если инкремент стоит перед именем переменной, то значение этой переменной изменится, уже начиная с этого выражения. Поэтому в следующем примере переменная «c» равна 8, т.к. в рамках выражения переменная «b» становится равна 4.
int a=2, b=3, c; c = a * ++b; //a==2 b==4 Console.WriteLine(b); //На экране увидим число 4 Console.WriteLine(c); //На экране увидим число 8

– –
Декремент, выполняет обратное действие по отношению к инкременту.

+= X
Прибавляет к значению переменной число X

-= X
Вычитает из значения переменной число X

*= X
Умножает значение переменной на число X

/= X
Делит значение переменной на число X


Есть еще одна особенность у языков семейства C, которая очень нравится их сторонникам, но сильно раздражает оппозицию. Они позволяют изменять значения переменных внутри выражений!
Например, нам нужно посчитать, чему будет равна сила выталкивания прямоугольного тела из воды со сторонами a, b и c. Из курса физики мы должны помнить, что f=r*g*v, где r – плотность жидкости (для воды единица), g – ускорение свободного падения (для землян 9.8), v – объем тела. Задача усложняется тем, что мы хотим не только посчитать силу, но и показать пользователю промежуточные результаты расчетов: площадь и объем. Для решения этой задачи можно использовать следующий код:
Int32 a=5, b=12, h=7, r=1, s, v, f;
s = a * b; //считаем площадь v = s * h; //считаем объем f = Convert.ToInt32(r * 9.8 * v); //считаем силу
Console.WriteLine("Площадь={0}, объем={1}, сила={2}", s, v, f); Console.ReadLine();
Но оказывается, что на C# три строчки расчетов можно заменить всего одной, и результат при этом будет тот же самый!
f = Convert.ToInt32(r * 9.8 * (v = (s = a * b) * h));
Теперь читаем внимательно. Любое выражение с оператором присваивания, заключенное в круглые скобки, имеет значение, равное присваиваемому. Например, выражение (s = a * b) с одной стороны присваивает переменной «s» значение, равное «a*b», а с другой – само по себе равно этому произведению, поэтому может быть использовано для расчета объема. Таким образом, после выполнения этой строчки кода мы получим, что в переменных «s», «v» и «f» у нас записаны соответственно площадь, объем и сила выталкивания.
2.2.5 Операции со строками
Только что мы познакомились с операциями, которые можно проворачивать с цифрами. А что с текстом? Во первых, мы можем «складывать» строчки друг с другом
String a="Hello", b="world";
Colsole.Write(a + " " + b);
На этом все возможные манипуляции со строками не заканчиваются Например, если дописать «.ToUpper()» после имени переменной, то мы получим тот же текст, только приведенный к верхнему регистру. А с помощью «.ToLower()» можно добиться обратного действия.
string test = "ПрЕоБрАзОвАнИе РеГиСтРа СиМвОлОв";
Console.WriteLine(test.ToUpper());
Если потребуется узнать длину строки, нужно использовать свойство «.Length».
string name = "Bartholomew";
int length = name.Length;
Console.WriteLine("Длина имени: " + length);
Еще одна очень полезная вещь в строках – это возможность поиска отдельных слов и букв в них. Метод «.IndexOf» ищет нужную последовательность символов и возвращает номер первого «вхождения». Смотрим:
Console.WriteLine("Первый индекс 'B': " + name.IndexOf("B"));
Console.WriteLine("Первый индекс 'a': " + name.IndexOf("a"));
Console.WriteLine("Первый индекс 'r': " + name.IndexOf("r"));
Console.WriteLine("Последний индекс 'o': " + name.LastIndexOf("o"));
Попробуем что-нибудь по-интереснее. С помощью методов «.PadLeft()» и «.PadRight()» мы можем добавить слева или справа определенное количество нужных нам символов. Если нам наоборот нужно убрать пробелы, тогда нужно воспользоваться методами «.Trim()», «.TrimEnd()» или «.TrimStart()».
string rubbish = "......... привет.....";
Console.WriteLine(rubbish);
Console.WriteLine(rubbish.TrimEnd('.'));
Console.WriteLine(rubbish.TrimStart('.'));
Console.WriteLine(rubbish.Trim('.'));
И последнее, с чем нам нужно познакомиться – это вырезка подстроки. В программировании много случаев, когда надо "отрезать" определенный "кусочек" строки. Сделать это можно с помощью метода «.Substring()». В скобках нужно указать два параметра – номер первого символа и их количество. Например:
string name = "В Богдаде все спокойно =)";
Console.WriteLine(name.Substring(3, 6); //На экране увидим «Богдад»
2.2.6 Преобразование типов
Довольно часто в программировании возникают такие ситуации, когда в одном выражении требуется использовать переменные разных типов. В этом случае нужно выполнить так называемое «преобразование типов».
Неявное преобразование
Довольно часто, когда преобразование возможно без потерь, оно происходит автоматически. Это так называемое «неявное» преобразование. Например, для зарплаты сотрудников хватит переменной с типом Int16, но если нам потребуется посчитать сумму выплат всего предприятия, то нужно будет взять типом побольше, например, Int32. В этом случае сумму можно считать как обычно, никаких вспомогательных действий не потребуется.
Int16 a=30000, b=12500, c=25000, d=28000; Int32 r; r = a + b + c + d;
Явное преобразование (приведение)
В приведенном ранее примере у нас без проблем получилось неявное преобразование Int16 => Int32. Если же ситуация будет обратной, мы нарвемся на ошибку. Компилятор нам тут же подскажет, что результат выражения может быть больше, чем емкость переменной, поэтому код не может быть выполнен.
Чтобы выполнить явное преобразование, перед именем переменной в круглых скобках нужно указать желаемый тип. Эта форма записи называется «выражением приведения».
double x = 1234.7; int a; a = (int)x; System.Console.WriteLine(a);

Исходный тип
Чтобы получить следующий результат

sbyte
byte , ushort, uint, ulong или char

byte
sbyte или char

short
sbyte , byte, ushort, uint, ulong или char

ushort
sbyte , byte, short или char

int
sbyte , byte, short, ushort, uint, ulongили char

uint
sbyte , byte, short, ushort, int или char

long
sbyte , byte, short, ushort, int, uint, ulong или char

ulong
sbyte , byte, short, ushort, int, uint, long или char

char
sbyte , byte или short

float
sbyte , byte, short, ushort, int, uint, long, ulong, charили decimal

double
sbyte , byte, short, ushort, int, uint, long, ulong, char, floatили decimal

decimal
sbyte , byte, short, ushort, int, uint, long, ulong, char, floatили double

Явное преобразование с помощью специальных функций
Довольно часто мы будем сталкиваться с ситуациями, когда описанных выше явных преобразований нам будет недостаточно. Например, мы зайдем в тупик, если нам нужно будет превратить текст, введенный пользователем, в число. Для решения этой задачи в языке C# есть целое множество специальных функций, таких как Convert.ToInt16(), Int16.Parse(), Convert.ToInt32(), Int32.Parse() и др.
String Age; Int16 AgeNum;
Console.WriteLine ("Сколько тебе лет?"); Age = Console.ReadLine(); AgeNum = Convert.ToInt16(Age); AgeNum++; Age = Convert.ToString(AgeNum);
Console.Write("Тогда в следующем году тебе будет " + Age);
Console.ReadLine();
В приведенном выше примере программа спрашивает у пользователя, сколько ему лет, переводит полученную строку в число, прибавляет единицу, потом снова переводит в строку и выводит, как часть текстового сообщения.

Задания
 #13 SEQ tasqnum \r 114115
· Какое имя нельзя использовать для переменной?
_1e, S1, 8y, a, asdf, int, forward, 1fsd, foot, enum,_cs, _UMN.
 #13 SEQ tasqnum 14215
· Определи значения переменных a, b, c и f после выполнения фрагмента программы
int a = 0, b=9, c=8, d=7; a = a + 1; b = a + 2*b; c = (b – a) + c; d = a*b + c - d;
 #13 SEQ tasqnum 14315 
·
· Даны две переменные a=3 и b=7. Напиши программу, которая сможет поменять местами значения этих переменных так, чтобы «a» стало равно 7, а «b» стало равно 3.
 #13 SEQ tasqnum 14415 
·
· Напиши калькулятор, который получая на входе ширину и высоту экрана определяет его разрешение в мегапикселях (приставка мега- равна 1*106).
 #13 SEQ tasqnum 14515 
·
· Напиши программу, которая вычисляет площадь круга по формуле S =
·*r2, где число PI округлено до 3. Посчитай с ее помощью, сколько потребуется шелка, чтобы сшить круглый парашют радиусом 2 метра.
 #13 SEQ tasqnum 14615 
·
·
· Какое число закодировано в последовательности цифр 11000010012?
 #13 SEQ tasqnum 14715 
·
·
· Праздник хэллоуин отмечается в канун Дня всех святых – 31 октября. Переведи эту дату из десятичной системы счисления в двоичную.
 #13 SEQ tasqnum 14815 
·
·
· Если тебе предложить 55510 рублей или 101002 мороженных, то что выгоднее, если одно мороженое стоит 20 рублей?
 #13 SEQ tasqnum 14915 
·
· Номер Димы Билана закодирован последовательностью букв «жз_едвбёбаб». Когда на радио будет играть очередная его песня, на какой номер все-таки нужно слать благодарности?
 #13 SEQ tasqnum 141015 
·
·
· Дано четырехзначное число. Нужно написать программу, которая сможет посчитать сумму цифр, из которых оно состоит (например, сумма цифр числа 2012 равна 2+0+1+2 = 4).
 #13 SEQ tasqnum 141115 
·
·
· Напиши программу, которая выводит первое слово введенного с клавиатуры предложения.
 #13 SEQ tasqnum 141215 
·
· Напиши программу, которая поможет тебе ответить на следующие вопросы:
Что произойдет с числом 2.87, если его привести к Int32 и умножить на 34?
Как ты думаешь, если число 2.87 сначала умножить на 34, а потом привести результат к ToInt32, измениться ли что-нибудь?
 #13 SEQ tasqnum 141315 
·
· Допустим, мы знаем, что в мире волшебников 1 золотой галеон равен 17 сиклеям, а 1 сиклей равен 29 бронзовым кантам. Напиши программу, которая спрашивает у пользователя, сколько у него есть бронзовых кантов, и сообщает, сколько золотых он может за них выручить.
 #13 SEQ tasqnum 141415 
·
·
· Доработай предыдущий пример, пусть программа так же сообщает пользователю, сколько у него останется кантов, ведь вряд ли пользователь будет вводить «красивые числа».
 #13 SEQ tasqnum 141515 
·
· Сколько времени потребуется на то, чтобы выкачать видеофильм размером 425 Мбайт через DSL модем со скоростью 512 кбит в секунду?
Задания на дом
 #13 SEQ tasqnum \r 114115 
·
· Сашу повсюду преследуют «красивые» числа. Как он ни взглянет на часы, так видит 10:10, 15:15 или даже 11:11. В один из дней он увидел, что на часах 10 часов 42 минуты. Неужели удача от него отвернулась? Что будет, если перевести это число в двоичную систему?
Сделай это, но только без помощи калькулятора. Используй его лишь только для проверки.
 #13 SEQ tasqnum 14215 
·
·
· Даны две переменные a=3 и b=7. Напиши программу, которая сможет поменять местами значения этих переменных без использования третьей переменной.
 #13 SEQ tasqnum 14315 
·
·
· До взрыва бомбы осталось 3 часа и 24 минуты, соответственно h=3 и m=24. Напиши программу, которая сможет посчитать, сколько времени в минутах осталось до этого трагического события.
Представь себе обратную задачу. Тебе известно, что до экзамена осталось 368 минут. Напиши программу, которая определит, сколько это часов (h) и сколько это минут (m).

















13PAGE 15


13PAGE 141615








І Ё
·
·
·
·
·
·
·
·Ђ
·
·°
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·-
·
·
·
·
·
·
·
·
·
·
·1
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·l
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·#
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·°
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·ї
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·„
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·„
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·B
·
·6
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·–
·
·
·
·
·
·
·°
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·“
·
·
·
·
·о
·
·
·
·
·
·
·
·
·
·
·
·
·5
·
·
·
·
·
·
·
·
·d
·
·
·
·
·
·
·
·
·
·Т
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Ђ
·
·
·
·
·
·
·
·
·
·
·°
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Ђ
·
·
·
·С
·
·
·
·
·
·
·
·
·
·„
·
·
·
·B
·
·
·
·
·
·°
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Й
·
·
·
·
·
·
·C
·
·
·
·
·°
·
·
·
·
·
·
·@
·
·
·
·
·І Ё
·
·
·
·
·
·
·
·Ђ
·
·°
·
·
·
·
·
·
·
·
·
·
·
·
·
·Q
·
·
·
·
·
·
·
·
·Ё
·
·
·
·
·
·Ё
·
·@
·
·
·
·
·І
·
·
·
·
·
· 
·
·
·
·Ђ
·
·
·
·Ї
·
·
·
·
·
·A
·
·
·Ђ
·
·
·
·
·@
·
·
·
·
·
·
·
·
·
·
·
·
·°
·
·
·
·°
·
·
·
·
·
·
·@
·
·
·
·
·І Ё
·
·
·
·
·
·
·
·Ђ
·
·°
·
·
·
·
·
·
·
·Ђ
·
·
·
·
·
·F15Заголовок 1,Семинар X14Заголовок 2,Семинары13Заголовок 3,Блок H213Заголовок 4,Блок H3 Заголовок 5 Заголовок 6 Заголовок 715

Приложенные файлы

  • doc 6648783
    Размер файла: 566 kB Загрузок: 0

Добавить комментарий