Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Объектно-ориентированное программирование. Учебник для СПО
.pdf
9. Найти и объяснить ошибки при инициализации переменных:
byte a = -8, b = 355;
sbyte c = -250; d = 128;
ushort e = -32468; f = 66128;
int i = -5,5;
uint k=-64; m=128,5;
Упражнения
1. Обосновать тип и объявить переменные для обозначения следую-
щих чисел с уровнем доступности внутри класса:
a) номер шага при вычислении экстремума функции, если наибольшее число шагов в используемом методе поиска не может превышать 1 000;
б) значение определенного интеграла с точностью до 6 десятичных
разрядов;
в) денежная сумма в банковских операциях;
г) расстояние до планет Солнечной системы в километрах;
д) масса человека в килограммах с десятыми долями;
е) число оборотов в секунду двигателя внутреннего сгорания;
ж) вероятность отказа устройства с точностью до 3 десятичных разряда после запятой;
з) количество студентов:
- в группе;
- на факультете;
и) количество передач в механической коробке переключения передач автомобиля;
к) номер варианта студента;
л) температура окружающего воздуха с точностью до десятых значений;
м) атмосферное давление в атмосферах (целое значение).
2. Объявить введенные в предыдущем задании переменные с ини-
циализацией.
4.3.КЛАССCHAR
В отличие от языков C, C++ и Pascal в языке C# используется только кодировка символов стандарта Unicode. Символьный тип данных char
(системный тип System.Char) предназначен для хранения только од-
-101-

ного символа. Один символ в кодировке Unicode кодируется 2 байтами.
Двухбайтная кодировка дает возможность кодировать 65 535 различных
символов. Почти во всех существующих алфавитах количество символов
меньше этой величины, поэтому стандарт универсален.
Класс char наследует все свойства и методы класса Object, но имеет и собственные методы. Тип char является значимым типом. Одиночные символы ограничиваются апострофами (а не двойными кавычками,
как для строк).
Примеры объявления символьных переменных:
char x = ‘a’, y=‘B’; // с инициализацией
char mySimbol, y; // без инициализации
char ch1 = 'W', ch2 = 'ф', r =’5’; //с инициализацией
char ch=new char(); //создание символа в объектн. стиле
ch = ch1;
Любой символ может быть представлен в обычном, восьмеричном
или шестнадцатеричном форматах.
Символ можно также задавать его Unicode-кодом. Запись вида
'\u01A3' или '\U1A7F' означает символьный литерал в кодировке Uni-
code. В записи указан четырехсимвольный шестнадцатеричный код
(01A3 или 1A7F) рассматриваемого символа.
Существует также перегруженный метод, в котором указывается
в качестве параметров строка и номер символа в строке, для которого
определяется код.
Преобразование символьного типа в строку производится с помощью метода ToString, например:
char ch = 'A' ;
string s = ch.ToString();
Получить целочисленный код символа можно с помощью неявного
преобразования:
public int SayCode(char sym)
{
return sym;
} // Определение кода
-102-

Получить символ по его известному коду можно с помощью операции:
public char SaySym(object code)
{
return (char)((int)code);
} // Определение символа
Это явное преобразование. Здесь используется тип Object для фор-
мального параметра, поэтому можно использовать целое число любого типа.
Приведем некоторые собственные статические методы класса
char. Метод GetNumericValue(char x) возвращает числовой код симво-
ла x, если он является цифрой, и (–1) в противном случае. Метод Parse
(string a) преобразует строку a, состоящую из одного символа, в сим-
вольный тип. Метод GetUnicodeCategory позволяет определить категорию символа в стандарте Unicode (буква, цифра, разделитель, управляющий символ и др.).
К динамическим методам относится, в частности, метод CompareTo,
позволяющий проводить сравнение символов с выдачей расстояния между символами при их несовпадении в соответствии с расположением символов в таблице Unicode. Далее в примере определяется расстояние между русской и латинской буквами A и между заглавной и строчной буквами:
char ch1='А' /*кириллица*/, ch2='A' /*латиница*/;
char ch3='а' /*кириллица*/,
int distance1 = ch1.CompareTo(ch2); // расстояние равно 975
int distance2 = ch1.CompareTo(ch3); // расстояние равно 1
Приведем пример фрагмента программы с динамическим методом
CompareTo:
public void OurCompare()
{
char ch1, ch2;
int dif;
Console.WriteLine("Метод CompareTo");
ch1='A'; ch2= 'Z';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},
{1} = {2}", ch1, ch2, dif);
-103-

ch1=’а’; ch2= ‘А’;
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},
{1} = {2}", ch1, ch2, dif);
ch1=’Я’; ch2= ‘А’;
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},
{1} = {2}", ch1, ch2, dif);
ch1='A'; ch2= 'A';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},
{1} = {2}", ch1, ch2, dif);
ch1='А'; ch2= 'A';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},
{1} = {2}", ch1, ch2, dif);
ch1='Ё'; ch2= 'А';
dif = ch1.CompareTo(ch2);
Console.WriteLine("Расстояние между символами {0},
{1} = {2}", ch1, ch2, dif);
}
Результаты работы этого фрагмента приведены ниже:
Отметим, что строчные буквы в кодировке Unicode непосредственно
следуют за заглавными буквами, а русская буква А на 975 символов правее
в кодировке, чем латинская буква A.
Вопросыизадания
?
1. Какие данные характеризует тип char?
2. К какому типу данных относятся символы?
-104-

3. Как указать константу типа char? Как установить ее конкретное
значение?
4. Как получить символ в кодировке Unicode по его числовому коду?
5. Как получить числовой код заданного символа в кодировке
Unicode?
6. На каком расстоянии отстоит заглавная буква от строчной буквы
в таблице Unicode?
7. На каком расстоянии отстоят русские буквы от латинских букв в та-
блице Unicode?
Упражнения
1. Объявить символьную переменную, видимую в классе, и присво-
ить ей значение, равное начальной букве в имени студента.
2. Определить числовой код символа
A в стандарте Unicode.
3. Определить символ Unicode, имеющий код 67.
4. Определить результат выполнения фрагмента:
char ch1 = 'S', ch2 = 't', ch3 = 'o', ch4 = 'p';
string str;
str = ch1.ToString() + ch2.ToString() + ch3.ToString()+
ch4.ToString();
Console.WriteLine(str);
4.4.КЛАССSTRING
Строка — это линейно упорядоченная конечная последовательность символов. Класс (тип) string (системный тип System.String) задает строки из символов переменной длины по стандарту Unicode. В отличие от рассмотренных выше типов строка относится к ссылочным типам.
В результате присваивания создается ссылка на константную строку, хранимую в куче. Однако, в отличие от правил работы с ссылочными типами,
операторы == и != определены для сравнения значений объектов типа
string, а не ссылок.
Строковые константы ограничиваются двойными кавычками. Например, строковая переменная firstName в результате операции присва-
ивания принимает значение:
string firstName = "Sasha";
-105-

Строковый литерал нулевой длины представляется как " ".
Важной особенностью строк является то, что они неизменяемы, т.е.
содержимое строкового объекта невозможно изменить после создания
объекта. Методы работы со строками возвращают измененную копию,
не изменяя исходных строк. Необходимость изменения строки означает создание новой строки. Если постараться изменить исходную строку,
то ссылка будет по-прежнему указывать на исходный объект, а не на новый объект, созданный при изменении строки.
В примере ниже создается новый строковый объект X, который полу-
чает значение "Нello!", а старый объект со значением "Good buy!" применяется для сборки мусора:
string X = "Good buy! ";
X = "Нello! ";
Над строками определены операции присваивания =, проверки эквивалентности == и !=, конкатенации (сцепления) строк +, указания индекса [].
Часто используется операция сцепления строк, например:
string x = "Будьте " + "здоровы";
Каждый символ строки имеет тип char (доступный только для чтения), поэтому строку постоянной длины можно рассматривать как массив символов char[]. Метод ToCharArray() превращает строку в массив
символов, например строку myString в массив myChars:
char[] myChars = myString.ToCharArray();
Для чтения отдельного символа строки используется оператор [ ], например:
string str = "method";
char x = str[1]; // x = 'e', нумерация начинается с 0;
char y = str[3]; // y = 'h';
Строка со слешем требует его повторения. Например, путь к файлу
должен иметь вид: string path = "C:\\ Formulas\\series.doc";.
Если же перед строкой помещен символ @, то она интерпретируется дословно, и тогда двойной слеш ставить не нужно. Этот символ удобно
-106-

использовать для задания пути к файлу, например: string path = @"C:\
Formulas\series.doc";
. В этом случае слеш воспринимается не как
управляющий символ строки, а как элемент адреса.
Символ @ удобен также при написании текстового литерала на нескольких строках, например:
@ "Растворимость –
это свойство веществ. "
Библиотечные методы позволяют производить многообразные операции со строками, например поиск вхождения одной строки в другую,
вставку, замену и удаление подстрок, определять длину строки.
Статический метод Format класса String выполняет форматирование строки. Он может вызываться с разным числом параметров (т.е. является перегруженным методом). Число форматов в строке указывает
на число объектов, передаваемых при вызове метода Format.
Примеры метода Format c различной спецификаций формата приведены ниже для целочисленной переменной x, которая имеет значение 123:
public void ExamplesFormat()
{
int x=123;
string A= string.Format("x={0}",x);
Console.WriteLine(A + "\tx={0}",x);
A= string.Format("Сумма:{0,5} руб. ",x);
Console.WriteLine(A);
A= string.Format("Сумма:{0,7:######} руб. ",x);
Console.WriteLine(A);
}
Другие примеры применения метода Format:
A= string.Format("Сумма:{0:P} ",0.55);
Console.WriteLine(A);
A= string.Format("Сумма:{0,4:C} ",10.22);
Console.WriteLine(A);
Для создания строкового объекта оператор new не используется
(только при инициализации строки массивом символов).
-107-

В конце строки на языке C# отсутствует символ с пустым значением
null. Поэтому строка C# может содержать любое число внедренных сим-
волов со значением null. В частности, строка может быть инициализирована так:
string message = null;
Пустая строка — это экземпляр объекта System.String, содержащий
0 символов.
Свойство Length строки представляет число объектов сhar, содержащихся в этой строке, а не число символов Unicode.
Класс String не разрешает изменять значение строки. В отличие
от него изменяемый строковый класс StringBuilder из пространства
имен System.Text позволяет изменять существующие объекты. Объекты класса StringBuilder объявляются конструктором с помощью его
явного вызова.
Операции Join, Split производят разбор строки на элементы.
Если необходимо проверить совпадение строк без учета регистра,
то применяется метод System.String.Compare. Результатом выполнения метода System.String.Compare ("abc", "ABC", "aBc", "Abc") является значение true. При использовании двойного равенства результатом "abc" == "ABC" будет значение false.
Более мощный аппарат работы по обработке символьной информации обеспечивается специальными классами из пространства имен
RegularExpression. Их работа основана на теории регулярных выра-
жений.
Вопросыизадания
?
1. К какой категории относятся данные типа
2. Что означает принадлежность данных типа
му типу?
3. Для каких целей используется статический метод
string?
4. Укажите на ошибки во фрагменте кода
string st = 'f'; char ch = "v";
-108-
string?
string к ссылочно-
Format класса

5. Какой символ используется для обозначения многострочного
литерала?
6. Как будет выглядеть строковый литерал, обозначающий путь
к файлу этой книги на кафедральном сервере, с использованием и без использования символа @?
7. Как определить факт совпадения двух строк, если: а) учитывается
регистр букв; б) регистр букв не учитывается?
8. Как выделить букву H из строкового литерала "Hello!"?
9. Для каких целей используется свойство Length?
10. Что означает неизменяемость строковых объектов?
11. Как изменить содержание строки?
4.5.ЛОГИЧЕСКИЙТИПДАННЫХ
Данные логического (булевого) типа bool (системный тип Sys-
tem.Boolean
(но не значения 1 или 0, yes или no и т.д.). Значения true и false — это
логические литералы.
Размер объекта этого типа равен 1 байту. Этот тип данных относит-
ся к значимым типам.
Пример:
) могут принимать только два значения: true или false
bool x, y, z;
bool a = true, b=false;
Важно, что в C# логический тип bool нельзя преобразовать в цело-
численный тип int.
Вопросыизадания
?
1. Какие логические литералы могут быть на языке C#?
2. Приведите примеры, в которых обосновано использование переменных типа bool.
3. Почему оператор bool c = 0; на языке C# ошибочен? Как его можно исправить?
4. Может ли компилятор преобразовать булеву переменную в целочисленную переменную?
-109-

4.6.ТИПDATETIME
Значения даты и времени определяются как количество 100-наносекундных интервалов, называемых тактами, прошедших с полуночи 1 января 0001 г.
Простой (примитивный) тип данных для даты и времени в C# отсутствует. Используются классы DateTime (представляет момент времени)
и TimeSpan (представляет интервал времени). Для инициализации класса
требуется использовать ключевое слово new.
Тип (класс) DateTime применяется для указания даты и времени
и требует модификатора public.
В частности, Date возвращает дату, Day — день, Month — месяц,
Year — год, DayOfYear — номер дня в году, DayOfWeek — день недели,
Ноur — часы, Minute — минуты, Second — секунды, Now — текущие дату
и время.
Класс DateTime имеет многочисленные конструкторы, свойства
и методы в библиотеке классов.
Текущую дату и время можно получить с помощью свойства Data-
Time.Now
Today
. Текущую дату можно получить с помощью свойства DataTime.
.
Программа ниже иллюстрирует применение этого типа:
using System;
class myProgram
{
public static void Main()
{Console.WriteLine ("Сегодня "+ DataTime.Today); }
}
Время может измеряться в тиках. По продолжительности один тик
равен одному импульсу тактового генератора в используемом компьютере. Для измерения времени в тиках используется метод Ticks из класса
DataTime. Этот метод удобно применять при точной оценке времени вы-
полнения программы (вычисляется как разность времени ее начала и завершения):
long startTime = DataTime.Ticks; // в начале программы
long finishTime = DataTime.Ticks; // в конце программы
Console.WriteLine ((finishTime - startTime) + " тиков");
-110-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
