Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Этап 2. 3 страница




new CStudent ("Макаров", "Информатика", gender_type.male, 1)

};

 

Console.WriteLine("Сортировка по специальности:");

Array.Sort(ar, new CStudent.SortBySpec());

foreach (CStudent elem in ar) elem.output();

 

 

Console.WriteLine("Сортировка по году:");

Array.Sort(ar, new CStudent.SortByYear());

foreach (CStudent elem in ar) elem.output();

 

}

}

}

Перегрузка операций отношения

Если класс реализует интерфейс IComparable, его экземпляры можно сравнивать между собой на больше-меньше. Для этого обычно перегружают операции отношения. Операции должны перегружаться парами: < и >, <= и >=, == и!=. Перегрузка операций обычно путем обращения к переопределенным методам CompareTo и Equals.

Если класс реализует интерфейс IComparable, требуется переопределить метод Equals и связанный с ним метод GetHashCode. Оба метода унаследованы от базового класса object.

Перегрузим операции отношения для класса CStudent. В качестве критерия сравнения объектов на больше-меньше выступает поле year_tr, а при сравнении на равенство попарно сравниваются все поля объектов.

using System;

namespace ConsoleApplication1

{

class CStudent: IComparable

{

public int CompareTo(object obj)

{

CStudent temp = (CStudent)obj;

if (year_tr > temp.year_tr) return 1;

if (year_tr < temp.year_tr) return -1;

return 0;

}

 

public override bool Equals(object obj)

{

if (obj == null || GetType()!= obj.GetType()) return false;

 

CStudent temp = (CStudent)obj;

return Name == temp.Name &&

speciality == temp.speciality &&

gender == temp.gender &&

year_tr == temp.year_tr;

 

}

public override int GetHashCode()

{

return name.GetHashCode();

}

public static bool operator ==(CStudent a, CStudent b)

{

return a.Equals(b);

}

public static bool operator!=(CStudent a, CStudent b)

{

return!a.Equals(b);

}

public static bool operator <(CStudent a, CStudent b)

{

return (a.CompareTo(b) < 0);

}

public static bool operator >(CStudent a, CStudent b)

{

return (a.CompareTo(b) > 0);

}

public static bool operator <=(CStudent a, CStudent b)

{

return (a.CompareTo(b) <= 0);

}

public static bool operator >=(CStudent a, CStudent b)

{

return (a.CompareTo(b) >= 0);

}

}

class Class1

{ static void Main()

{

CStudent s1 = new CStudent("Сидорова", "Информатика", gender_type.female, 3);

CStudent s2 = new CStudent("Иванов", "Математика", gender_type.male, 2);

if (s1 > s2) Console.WriteLine(s1.Name + " старше чем " + s2.Name);

else if (s1 < s2) Console.WriteLine(s1.Name + " младше чем " + s2.Name);

else Console.WriteLine(s1.Name+" и "+ s2.Name +" учатся на одном курсе");

if (s1 == s2) Console.WriteLine("Данные о двух студентах полностью совпадают ");

 

}

}

}

Результат работы программы:

Сидорова старше чем Иванов

 

Задание 11. Стандартные интерфейсы.

 

Каждому студенту рекомендуется выполнить хотя бы одно из упражнений 1-12. Реализовать задание как пункты меню в задании 9.

 

13. В классе РАЦИОНАЛЬНОЕ ЧИСЛО реализовать интерфейсы IComparable и IComparer переопределить операции сравнения для рациональных чисел.

a) С помощью метода Array.Sort осуществить сортировку массива рациональных чисел: по значению числа, по знаменателю.

b) Модифицировать метод поиск наибольшего числа в массиве рациональных чисел, осуществляя сравнение рациональных чисел с помощью операции >.

14. В классе ИСТОРИЧЕСКОЕ СОБЫТИЕ реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения для исторических событий.

a) С помощью метода Array.Sort осуществить сортировку массива рациональных чисел: по названию события, по полной дате.

b) Модифицировать метод поиска наиболее позднего события в массиве событий, осуществляя сравнение событий с помощью операции >.

15. В классе ДАТА реализовать интерфейсы IComparable и и IComparer переопределить операции сравнения для дат, причем операцию == определить как сравнение по году.

a) С помощью метода Array.Sort осуществить сортировку массива дат: по полной дате, по дате месяца.

b) Модифицировать метод в массиве дат всех дат заданного года, осуществляя сравнение событий с помощью операции ==.

16. В классе ДАТА реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения для дат.

a) С помощью метода Array.Sort осуществить сортировку массива дат: по полной дате, по году.

b) Модифицировать функцию демонстрационной программы - поиск в массиве дат самой поздней, осуществляя сравнение дат с помощью операции >.

17. В классе АЛГЕБРАИЧЕСКИЙ ПОЛИНОМ реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения полиномов, причем операцию == как сравнение полиномов.

a) С помощью метода Array.Sort осуществить сортировку массива дат: по степени, по значению коэффициента нулевой степени.

b) Модифицировать функцию демонстрационной программы - удаление заданного полинома из массива, осуществляя в ней сравнение с помощью операции ==.

18. В классе АВТОМАШИНА реализовать интерфейсы IComparable и IComparer переопределить операции сравнения машин, причем операцию == как сравнение по Марке.

a) С помощью метода Array.Sort осуществить сортировку массива машин: по году выпуска, по марке.

b) Модифицировать функцию демонстрационной программы - поиск в массиве всех машин с заданной маркой, осуществляя в нем сравнение с помощью операции ==.

19. В классе СТУДЕНТ реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения студентов, причем операцию == как сравнение студентов по году рождения.

a) С помощью метода Array.Sort осуществить сортировку массива студентов: по ФИО, по полной дате рождения.

b) Модифицировать метод класса - поиск в массиве всех студентов заданного года рождения, осуществляя в нем сравнение с помощью операции ==.

20. В классе ИСТОРИЧЕСКОЕ СОБЫТИЕ реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения событий, причем операцию == как сравнение событий по уровню.

a) С помощью метода Array.Sort осуществить сортировку массива событий: по уровню, по комбинации (год, событие).

b) Модифицировать функцию демонстрационной программы - поиск в массиве событий всех событий заданного уровня, осуществляя в ней сравнение с помощью операции ==.

21. В классе СТУДЕНТ реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения студентов, причем операцию == как сравнение студентов по ФИО.

a) С помощью метода Array.Sort осуществить сортировку массива студентов: по ФИО, по комбинации (Номер группы, ФИО).

b) Модифицировать метод класса - удаление из массива студента с определенной ФИО, осуществляя в нем сравнение с помощью операции ==.

22. В классе ТОВАР реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения товаров, причем операцию == как сравнение товаров по стране-производителю.

a) С помощью метода Array.Sort осуществить сортировку массива товаров: по стране производителю, по комбинации (объем партии, наименование).

b) Модифицировать функцию демонстрационной программы - поиск всех товаров, импортируемых заданной страной, осуществляя в ней сравнение с помощью операции ==.

23. В классе УЧЕНИК реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения учеников, причем операцию == как сравнение учеников по ФИО.

a) С помощью метода Array.Sort осуществить сортировку массива учеников: по ФИО, по комбинации (год обучения, название класса).

b) Модифицировать функцию демонстрационной программы - удаление ученика с заданной ФИО из массива, осуществляя в ней сравнение с помощью операции ==.

24. В классе УЧЕНИК реализовать интерфейсы IComparable и IComparer и переопределить операции сравнения учеников, причем операцию == как сравнение учеников по оценке.

a) С помощью метода Array.Sort осуществить сортировку массива учеников: по ФИО, по комбинации (итоговая оценка, год обучения, название класса).

b) Модифицировать функцию демонстрационной программы - поиск всех учеников с отличной итоговой оценкой, осуществляя в ней сравнение с помощью операции ==.

Глава 10. Файлы

Файл – это именованная область памяти на внешнем носителе. Логически любой файл можно представить как последовательность байтов. Поэтому такие устройства как клавиатура, дисплей, принтер можно считать частными случаями файлов. Чтение из файла – это передача данных с внешнего устройства в оперативную память. Запись в файл – это передача данных из оперативной памяти на внешнее устройство.

Работа с файлами в C# осуществляется при помощи потоков (stream). Поток - это абстрактное понятие, используемое для обозначения потока байтов, передаваемого от источника к приемнику. Поток не зависит от конкретного устройства, с которым производится обмен данными (файл на диске, клавиатура, дисплей, оперативная память, принтер и т.п.).

Для повышения скорости передачи данных обмен с потоком обычно производится специальную область оперативной памяти – буфер. При записи в файл вся информация сначала направляется в буфер. Передача данных из буфера на внешнее устройство происходит либо при заполнении буфера, либо после специальной команды сброса. При чтении из файла данные также сначала считываются в буфер до тех пор пока буфер не будет заполнен. Буфер выделяется для каждого открытого файла.

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

В C# для работы с потоками используется обширная библиотека классов, определенных в пространстве имен System.IO.

Программа на C# может работать с потоками нескольких типов: стандартные потоки, потоки локальных файлов и потоки, связанные с оперативной памятью.

Рассмотрим основные классы иерархии для работы с потоками.

FileStream – обеспечивает произвольный доступ к файлу как к потоку байтов. (Имеет метод seek, чтобы переходить на определенную позицию в потоке данных для их обработки).

StreamWriter – обеспечивает последовательную запись в файл текстовой информации

StreamReder - обеспечивает последовательное чтение из файла текстовой информации

BinaryReader – предназначен для побайтового чтения из файла встроенных типов данных в двоичном виде

BinaryWriter – предназначен для побайтовой записи в файл встроенных типов данных в двоичном виде

Directory, DirectoryInfo, File, FileInfо — обеспечивают работу с каталогами и файлами (создание, удаление, получение свойств).

Существуют и другие классы для работы с потоками, с которыми вы можете ознакомиться в [].

Для работы с файлом в языке C# необходимо выполнить следующую последовательность действий

1. Подключить пространство имен System.IO.

2. Создать поток (объект соответствующего класса из пространства имен System.IO) и связать его с физическим файлом.

3. Операцию создания потока заключить в блок try и написать соответствующие обработчики исключений.

4. Осуществить с файлом необходимые операции.

5. Закрыть файл (отсоединить физический файл от потока).

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

Для создания потока используется один из конструкторов класса. На практике чаще применяется конструктор с тремя параметрами.

Например,

FileStream f=new FileStream(“1.txt”, FileMode.Create, FileAccess.ReadWrite);

Первый параметр конструктора - имя присоединяемого физического файла.

Второй параметр конструктора – режим открытия файла, задаваемый константой, описанной в перечислении FileMode:

Append – открыть файл для дозаписи (указатель устанавливается в конец файл) или создать, если он не существет;

Create – создать новый файл (если существует одноименный файл, он будет удален)

CreateNew - создать новый файл (если существует одноименный файл, возникнет исключение IOException)

Open – открыть существующий файл (указатель устанавливается в начало файла).

OpenOrCreate – открыть файл, или создать, если он не существует.

Третий параметр конструктора – режим доступа к файлу, задаваемый константой, описанной в перечислении FileAccess:

Read – открыть файл для чтения;

ReadWrite – открыть файл для чтения и записи;

Write – открыть файл только для записи.

 

При создании потока может генерироваться ряд исключений, например:

FileNotFoundException – файл c указанным именем не существует

DirectoryNotFoundException – каталог с указанным именем не существует

ArgumentException – неверно задан режим открытия файла

Для чтения и записи данных в файл используются методы класса FileStream:

Read, ReadByte и Write, WriteByte соответственно. Методы Read, Write используются для работы последовательностью байтов, а ReadByte, WriteByte с одним байтом.

Например,

f.WriteByte(20); //запись в файл числа 20

byte []a=new byte [5](1,2,3,4,5);

f.Write(a,1,4); //запись в файл 4 элементов из массива, начиная с индекса 1.

Кроме того на практике часто используются следующие методы класса FileStream:

Length – возвратить длину потока в байтах,

Seek – установить текущий указатель на заданную позицию

Position – возвратить текущую позицию в потоке.

Например,

f.Seek(0, SeekOrigin.Begin); //сдвинуть текущий указатель на 0 байтов от начала файла;

Для закрытия файла используется метод Close().

Например, f.Close();

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

Рассмотрим пример работы с файлми.

static void Main()

{

try

{

FileStream f = new FileStream("1.txt", FileMode.Create, FileAccess.ReadWrite);

f.WriteByte(20); //запись в файл числа 20

byte[] a = new byte[5]{1, 2, 3, 4, 5};

f.Write(a, 1, 4); //запись в файл 4 элементов из массива, начиная с индекса 1.

long len = f.Length;

Console.WriteLine("Длина потока в байтах " + len);

Console.WriteLine("Текущая позиция в файле "+f.Position);

f.Seek(0, SeekOrigin.Begin);

Console.WriteLine("Текущая позиция в файле " + f.Position);

byte[] b = new byte[len];

f.Read(b, 0, (int)len);

for (int i=0; i<len; i++) Console.Write (Console.Write(b[i]+" ");

f.Close();

 

}

catch (FileNotFoundException e)

{ Console.WriteLine(e.Message); Console.WriteLine("Проверьте правильность имени файла"); }

catch (Exception e)

{ Console.WriteLine("Error: "+e.Message); }

Console.ReadKey();

}

Результат работы программы

Длина потока в байтах 5

Текущая позиция в файле 5

Текущая позиция в файле 0

20 2 3 4 5

Для работы с текстом, в задачах где не требуется прямого доступа к данным, удобно использовать потоки StreamWriter и StreamReder. Эти потоки автоматически выполняют перекодирование из байтов в символы с кодировкой Unicode и обратно. При этом осуществляется только последовательный доступ к файлу.

При создании объектов данных поток обычно используется конструктор с одним параметром – именем файл, например,

StreamWriter f = new StreamWriter("1.txt");

Для класса StreamWriter чаще всего используются методы Close, Flush, аналогичные одноименным методам класса FileStream, а также метод Write и WriteLine, используемые Вами при работе с классом Console.

Для класса StreamReader кроме известных Вам методов Read и ReadLine, используются следующие методы:

Peek – возвращающий следующий символ без изменения позиции указателя в файле;

ReadBlock – считывающий из входного потока указанное количество символов и записывающий их в буфер;

ReadToEnd – считывающий все символы до конца потока в строку типа string, начиная с текущей позиции.

Как известно, метод ReadLine позволят считывать только строки типа string. Метод ReadLine возвращает null, если достигнут конец файла.

Если из текстового файла требуется считать числа, разделенные, например, пробелами, то посыпают следующим образом:

- содержимое файла f считывают в объект типа string, например string s = f.ReadLine(); (если требуется считать строку) или s= f.ReadToEnd(); (если требуется считать все данные из файла);

- с помощью метода Split класса string разбивают считанную строку на подстроки, например, string [] buf=s.Split(‘ ’);

- каждую из выделенных подстрок buf[i] преобразует в число соответствующего типа с использованием методов (ToInt32, ToDouble и т.д.) класса Convert и один из его методов или метода Parse, имеющий в каждом арифметическом классе.

Рассмотрим пример программы, которая записывает из заданных массивов в текстовый файл в отдельных строках информацию об учениках. В каждой строке файла должна содержаться фамилия ученика, средняя оценка (в формате два знака после запятой), номер курса. Эти данные разделены пробелами. Затем программа считывает эти данные из файла и выводит на экран, увеличивая оценку на 0,1 и курс обучения на 1.

static void Main()

{

try

{

StreamWriter f = new StreamWriter("1.txt");//выходной поток

string[] s = new string[3] { "Иванов", "Петров", "Сидоров" };

float[] m = new float[3] { 3.446F, 4.3F, 5.1111F };

int[] y = new int[3] { 1, 2, 3 };

for (int i = 0; i < s.Length; i++)

f.WriteLine("{0} {1:F2} {2}",s[i], m[i], y[i]);// запись в файл

f.Close();

 

StreamReader f1 = new StreamReader("1.txt");//входной поток

string st;

string[] buf;

while ((st = f1.ReadLine())!= null) // чтение из файла

{

buf = st.Split(' ');

Console.Write(buf[0] + " ");

Console.Write(Convert.ToDouble(buf[1]) + 0.1);

Console.Write(" ");

Console.WriteLine(Convert.ToInt32(buf[2]) + 1);

}

 

f1.Close();

 

}

catch (FileNotFoundException e)

{ Console.WriteLine(e.Message); Console.WriteLine("Проверьте правильность имени файла"); }

catch (Exception e)

{ Console.WriteLine("Error: " + e.Message); }

Console.ReadKey();

 

 

Задание 12. Работа с файлами

В задании 9 добавить два пункта меню:

· начального формирование массива объектов на основе данных из текстового файла,

· запись массива объектов в текстовый файл.


 




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 554; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.126 сек.