Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Объектно-ориентированное программирование. Учебник для СПО

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать

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
. Текущую дату можно получить с помощью свойства DataTime.
.
Программа ниже иллюстрирует применение этого типа:
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-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]