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

4. Порядок выполнения работы. 5. Содержание отчета. Лабораторная работа № 4. Использование классов для работы с массивами данных




4. Порядок выполнения работы

В главном меню системы программирования выберите команду File New Project или щелкните на соответствующей инструментальной кнопке. В окне New Project выберите пункт Console Application и щелкните на кнопке OK. В открывшемся окне в соответствии с вариантом задания напишите программу, использующую принципы наследования классов.

 

5. Содержание отчета

5. 1 Тема и цель работы.

5. 2 Текст программы.

5. 3 Результаты выполнения программы.

Лабораторная работа № 4

Использование классов для работы с массивами данных

 

1. Цель работы. Получение навыков в разработке программ с использованием классов для создания, хранения и работы с массивами данных.

 

2. Общие сведения

Массивы представляют собой упорядоченные структуры, содержащие множество данных одного и того же типа. Упорядоченность массива позволяет обращаться к отдельному его элементу с помощью индекса — целочисленного выражения, определяющего положение элемента в массиве. Как и в других С-подобных языках, в С# самый первый элемент массива имеет индекс 0.

Массивы относятся к ссылочным типам, поэтому должны иницилизироваться при помощи оператора new. Для описания массива нужно указать квадратные скобки за именем типа данных. При этом тип данных определяет тип хранящихся в массиве данных:

 

int[] arrInt; //Целочисленный массив

 

Объявление массива еще не создает объект, который можно использовать в программе. Для иницилизации массива следует указать количество его элементов:

 

arrInt = new int[25]; //Массив содержит 25 целых чисел

 

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

Разумеется, можно объявлять массив и одновременно иницилизировать его:

 

int[] arrInt = new int[25];

Более того, можно одновременно с созданием массива наполнить его нужными значениями:

 

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

 

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

Создание индексатора не составляет большого труда: для этого в классе следует создать специальное свойство с помощью конструкции this[].

В примере программы создаются 2 класса: класс-контейнер queues, предназначенный для хранения множества элементов, и класс queue, содержащий параметры одного элемента. Свойство queues. queue является индексатором.

 

using System;

namespace Project4

{

       class queue

       { string str;

       int integer;

       public queue(string str, int integer)

       { this. str=str;

                   this. integer=integer;

       }

       class queues

       {

       queue[] Queues = new queue[10];

       public queue this [int pos]

       { get

                  {if (pos > =0 || pos< 10) return Queues[pos];

                  else throw new IndexOutOfRangeException(" Вне диапазона! " ); }

                   set {Queues[pos] = value; }

       } }

       static void Main()

                  {     queues A = new queues();

                              A[0] = new queue(" Номер в очереди: ", 1);

                              A[1] = new queue(" Номер в очереди: ", 2);

                              for (int i = 0; i < 2; i++)

                                          {Console. Write(A[i]. str);

                                          Console. WriteLine(A[i]. integer); }

                              Console. ReadLine();

                  }

        }

}

 

3. Постановка задачи

Создать объекты класса < имя класса> (класс и его поля задаются в соответствии с выбранным вариантом в лабораторной работе 1), причем объекты класса должны хранить массивы данных о предметной области, связанные со свойствами предмета задания по варианту. Причем количество элементов массива должно задаваться программно пользователем в интерактивном режиме.

 

4. Порядок выполнения работы

В главном меню системы программирования выберите команду File New Project или щелкните на соответствующей инструментальной кнопке. В окне New Project выберите пункт Console Application и щелкните на кнопке OK. В открывшемся окне в соответствии с вариантом задания напишите программу, использующую созданные вами объекты.

 

5. Содержание отчета

5. 1 Тема и цель работы.

5. 2 Текст программы.

5. 3 Результаты выполнения программы.

Лабораторная работа № 5

Сохранение текущего состояния объектов в файлах

 

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

 

2. Общие сведения

При разработке приложений часто возникают две в общем случае схожие задачи: сохранить (прочитать) содержимое данных (файла) и сохранить (прочитать) текущее состояние объекта в файле или таблице базы данных. Несмотря на несомненную схожесть указанных задач, для решения каждой из них предусмотрены свои классы.

Техника работы с файлами зависит от типа файла (текстовый или двоичный). При работе с текстовыми файлами сначала создается поток класса FileStream. Данные записываются в файл с помощью вспомогательного объекта класса StreamWriter, а читаются объектом класса StreamReader. При создании объекта FileStream ему передаются имя файла и два параметра: FileMode, определяющий способ создания потока, и FileAccess, регулирующий доступ потока к данным.

Таблица1.

Значение параметра FileMode

Значение Описание
Append  Добавляет записи в существующий файл или создает новый. Требует, чтобы параметр FileMode имел значение Write
Create Создает новый файл или переписывает существующий. Требует, чтобы параметр FileMode имел значение Write

 

CreateNew Создает новый файл, а если он уже существует, возникает исключение. Требует, чтобы параметр FileMode имел значение Write
Open Открывает существующий файл. Если файла нет, возникает исключение
OpenOrCreate Открывает существующий или создает новый файл, если он еще не создан
Truncate Открывает существующий файл и делает его размер равным нулю

Таблица2.

Значение параметра FileAccess

Значение Описание
Read Поток может читать данные
ReadWrite Поток может читать и записывать данные
Write Поток может записывать данные

 

Для потока существует понятие текущей записи — в эту запись помещаются данные и из нее они считываются. Положением текущей записи можно управлять с помощью метода Seek(), имеющего такую сигнатуру:

 

public virtual long Seek (int Offset, SeekOrigin Origin);

 

Здесь Offset — смещение относительно позиции, указанной параметром Origin.

Таблица3.

Значение параметра SeekOrigin

Значение Описание
Begin Соответствует началу потока
Current Соответствует текущей записи потока
End Соответствует концу потока

Физическая запись данных в файл реализуется в момент закрытия потока методом Close() или выталкиванием записей из промежуточного буфера методом Flush(). Во втором случае поток не закрывается и готов к продолжению операций.

Обработка двоичных файлов во многом подобна обработке текстовых: сначала создается поток, затем — объекты BinaryWriter или BinaryReader в зависимости от направления передачи данных (в файл или из файла).

C# поддерживает интересную технологию сохранения текущего состояния объекта на некотором носителе информации. Эта технология называется сериализацией объекта. Сериализованный объект может быть, например, передан по сети на другой компьютер и там восстановлен в первоначальном состоянии — этот процесс называется десериализацией.

Особенностью сериализации является то, что ее можно применять к классам, поддерживающим эту процедуру. Для этого класс должен объявляться с атрибутом [Serializable] или в его объявлении должно быть явное указание на то, что он исполняет интерфейс ISerializable. Лишь относительно небольшое количество (менее 40) стандартных классов реализуют данный интерфейс. Это, в основном, классы, используемые как хранилища данных.

Следующий пример иллюстрирует данную технологию.

 

using System;

using System. IO;

using System. Runtime. Serialization. Formatters. Binary;

 

namespace Project5

{

[Serializable]

class queue

{

       private int q=50;

       private char[] arrchar= new char[4] {'a', 'b', 'c', 'd'};

       public int p;

       public char ch;

}

       [Serializable]

 class queue1: queue

{

 private int r = 50;

 public new int q=50;

 public new char[] arrchar= new char[4] {'e', 'f', 'g', 'h'};

       public queue1() {}

       public queue1(int q, int i)

       { p = q*r;

       ch = arrchar[i];

       }

}

 

class Executer

{

       [STAThread]

static void Main()

                  {

       queue1 a = new queue1();

       queue1 b = new queue1(50, 2);

       queue1 c = new queue1(500, 1);

 

 FileStream fs;

 fs = new FileStream

        (" File_queue. bin", FileMode. Create, FileAccess. Write);

 BinaryFormatter sw = new BinaryFormatter();

 sw. Serialize(fs, b);

 sw. Serialize(fs, c);

 fs. Close();

 

 fs = new FileStream

        (" File_queue. bin", FileMode. Open, FileAccess. Read);

long i=0,

j = fs. Length/231; //231 — количество байт занимаемых одним объектом класса queue1

 

 while (i < j)

 {

a = (queue1) sw. Deserialize(fs);

Console. WriteLine(a. p);

Console. WriteLine(a. ch);

i++;

 }

       fs. Close();

       Console. ReadLine();

                  }

       }

}

 

Поделиться:





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



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