Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Способы представления отрицательных чисел и текста




Теперь ты понимаешь, почему байт, в котором все разряды сброшены, соответствует нулю, а состояние, в котором все разряды установлены, – значению 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   -128.. 127
Byte byte   0.. 255
Int16 short   -32768.. 32767
UInt16 ushort   0.. 65535
Int32 int   -2147483648.. 2 147 483 647
UInt32 uint   0.. 4294967295
Int64 long   намного больше чем int
UInt64 ulong   =)

 

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

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

Тип.NET Тип C# Размер в байтах Количество разрядов после запятой
Single float   6-7
Double double   15-16
Decimal decimal    

 

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

Если ты считаешь, что на этом все встроенные типы кончились, спешу обрадовать! Следующий тип – логический.

Тип.NET Тип C# Размер в байтах Диапазон значений
Boolean bool   Правда или ложь (true or false)

 

Несмотря на страшное название, он очень прост и может содержать лишь только два значения: «правду» или «ложь». Для работы с логическими типами, в C# есть две специальные константы «true» (правда) и «false» (ложь). Вот пример описания логической переменной:

Boolean CSharpRulez = true;

Для хранения букв и строк предназначены типы Char и String. Символьный тип Char хранит буквы, цифры, знаки препинания и другие символы. Одна переменная – один символ. Строковый тип (String) хранит сразу целую последовательность символов, проще говоря – текстовую строку.

Тип.NET Тип C# Размер в байтах Диапазон значений
Char Char   Все символы
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);

В этом куске программы мы последовательно описали и проинициализировали переменные целого, дробного, символьного и строкового типов. Обратите внимание, что:

· целые числа записываются просто цифрами;

· в дробных может присутствовать разделительная точка;

· одиночные символы берутся в одинарные кавычки;

· строки берутся в двойные кавычки.

Арифметика с числами

Математики создают переменные и выполняют над ними различные действия, складывая их, умножая и, даже возводя в степень. Программисты ничем не хуже, и этими словами их не напугаешь.

В программировании действия называются операциями. Но эти операции производятся не хирургами в халатах, а специальными элементами языка, называемыми операторами. Результатом действия арифметических операторов почти всегда будет какое-нибудь число.

Оператор Пояснение
+ Сложение для чисел и конкатенация (сцепление) для строк
- Вычитание
* Умножение
/ Деление
% Остаток от деления

 

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

Оператор Пояснение
++ Инкремент, увеличивает значение переменной на единицу. Например 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» у нас записаны соответственно площадь, объем и сила выталкивания.

Операции со строками

Только что мы познакомились с операциями, которые можно проворачивать с цифрами. А что с текстом? Во первых, мы можем «складывать» строчки друг с другом

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); //На экране увидим «Богдад»

Преобразование типов

Довольно часто в программировании возникают такие ситуации, когда в одном выражении требуется использовать переменные разных типов. В этом случае нужно выполнить так называемое «преобразование типов».

Неявное преобразование

Довольно часто, когда преобразование возможно без потерь, оно происходит автоматически. Это так называемое «неявное» преобразование. Например, для зарплаты сотрудников хватит переменной с типом Int16, но если нам потребуется посчитать сумму выплат всего предприятия, то нужно будет взять типом побольше, например, Int32. В этом случае сумму можно считать как обычно, никаких вспомогательных действий не потребуется.

Int16 a=30000, b=12500, c=25000, d=28000;
Int32 r;
r = a + b + c + d;

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...