Основные свойства элементов управления 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основные свойства элементов управления



Методические указания И ЗАДАНИЯ

к лабораторныМ работАМ

по курсу

«ПРОГРАММИРОВАНИЕ В СРЕДЕ СОВРЕМЕННЫХ ОПЕРАЦИОННЫХ СИСТЕМ. ЧАСТЬ 1»

для студентов направления подготовки

 0915 «Компьютерная инженерия»

                     

 

  Рассмотрено на заседании кафедры компьютерной инженерии
  ___________, протокол №
   
  Утверждено на заседании учебно- издательского Совета ДонНТУ
  Протокол №____от ___________20___ р. Регистрационный номер _______________________

 

Донецк, 2016


 

УДК 681.973

 

МЕТОДИЧЕСКИЕ УКАЗАНИЯ И ЗАДАНИЯ К ЛАБОРАТОРНЫМ РАБОТАМ ПО КУРСУ «ПРОГРАММИРОВАНИЕ В СРЕДЕ СОВРЕМЕННЫХ ОПЕРАЦИОННЫХ СИСТЕМ» (для студентов направления подготовки 6.0915 «Компьютерная инженерия»).

 

Составитель: Чередникова О.Ю. – Донецк: ГВУЗ «Донецкий национальный технический университет», 2016 г. – 56 с.

 

Целью методических указаний по курсу «Программирование в среде современных операционных систем» является приобретение студентами практических навыков программирования в среде Visual Studio на платформах Windows Form и WPF на языке программирования C#.

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

 

          Составитель:

к.т.н., доцент каф. КИ                         Чередникова О.Ю.

 

 

           

 

          Рецензенты:

к.т.н., доцент каф. КИ                         Теплинский С.В.

к.т.н., доцент каф. АСУ                       Хмелевой С.В.

 


Содержание

Введение ……………………………………………………………………..6

Лабораторная работа №1…………………………………………………7

Лабораторная работа №2…………………………………………………22

Лабораторная работа №3…………………………………………………26

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

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

работа Лабораторная №6…………………………………………………38

Лабораторная работа №7…………………………………………………38

Список рекомендуемой литературы ……………………………………..59


Введение

Целью лабораторных работ по курсу «Программирование графического интерфейса» является приобретение студентами практических навыков программирования в среде Visual Studio на платформах Windows Form и WPF на языке программирования C#. Данные методические указания предназначены для студентов, обучающихся по направлению подготовки «Компьютерная инженерия» специальностей «Компьютерные системы и сети» и «Системное программирование».

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

     


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

Тема: Разработка консольного приложения на языке программирования C#. Интерфейсы, свойства, коллекции.

Цель: Показать знание основных конструкций языка С#, в частности интерфейсов, свойств и коллекций, полученных в курсе ООП.

Теоретические сведения

Свойства

Каждый класс С# может содержать в себе объявления одного или нескольких свойств. Свойства представляют собой методы специального вида, причем для каждого свойства применяются два таких метода. Один метод используется для чтения значения свойства, а другой — для записи. Для того чтобы объявить свойство, используется такая конструкция:

<Модификатор> <Тип> <Имя свойства>

{

get

{

return <Возвращаемое значение>;

}

set

{

<Поле класса> = value;

}}

пример объявления свойства Channel в классе TelevisionSet:

class TelevisionSet

{ private byte currentChannel;

public byte Channel

{

set

{

if(value <= maxChannel && value > 0)

currentChannel = value;

}

get

{ return currentChannel;}

}

}

Блок свойства Channel содержит две процедуры доступа. Одна из этих процедур, объявленная с ключевым словом get, предназначена для получения значения свойства, а другая, объявленная с ключевым словом set, — для установки значения свойства. Ключевое слово value обозначает неявный параметр, передаваемый процедуре доступа set. Этот параметр содержит значение, которое программа пытается присвоить свойству.

Рассмотрим следующий фрагмент программы:

TelevisionSet tvSmall = new TelevisionSet();

TelevisionSet tvLarge = new TelevisionSet();

tvSmall.Channel = 5;

tvLarge.Channel = 52;

 

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

Интерфейсы

Класс С# может наследовать свойства только одного базового класса. Таким образом, в отличие от других языков ООП (например, C++) в языке С# каждый производный класс может иметь только один базовый класс. На первый взгляд такое ограничение может показаться довольно существенным, однако во многих случаях оно успешно обходится при помощи механизма интерфейсов.

В то время как классы представляют собой механизм для представления неких сущностей (таких, например, как геометрические фигуры, телевизоры и т. п.), интерфейсы применяются для описания неких действий над этими сущностями. При этом объект (класс) может реализовать набор интерфейсов, каждый из которых отвечает за выполнение над объектом каких-либо действий. Интерфейсы более всего похожи на виртуальные методы абстрактного класса, которые должны быть определены в базовом классе.

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

Пусть нам нужно создать класс Point, отражающий поведение точки на плоскости. Этот объект должен хранить текущие координаты точки, делая их доступными при помощи свойств X и Y. Кроме того, класс Point должен реализовывать два интерфейса IPrint и IMail, первый из которых позволяет распечатывать точку на принтере и выполнять предварительный просмотр результатов печати, а второй — отправлять точку по электронной почте по заданному адресу.

Ниже мы привели объявление интерфейсов IPrint и IMail:

interface IPrint

{

void Print();

void PrintPreview();

}

interface IMail

{

void SendMail(string mailAddress);

}

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

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

Ниже мы привели в сокращенном виде исходный текст класса Point, реализующего интерфейсы IPrint и IMail:

class Point: IPrint, IMail

{

protected int xPos;

protected int yPos;

public Point(int x, int y)

{ xPos = x;

yPos = y;

}

 void IPrint.Print()

{Console.WriteLine("Печать точки ({0}, {1})", this.X, this.Y);

}

void IPrint.PrintPreview()

 {Console.WriteLine("Просмотр перед печатью точки ({0}, {1})", this.X, this.Y);

 }

void IMail.SendMail(string mailAddress)

 {Console.WriteLine("Отправка точки ({0}, {1}) по адресу {2}", this.X, this.Y, mailAddress);

}

Тот факт, что класс реализует те или иные интерфейсы, отражается в ключевом слове class. Названия реализуемых интерфейсов перечисляются после этого слова через запятую:

class Point: IPrint, IMail

Если бы наш класс Point был унаследован от базового класса с именем, например, Shape и дополнительно реализовывал интерфейсы IPrint и IMail, это можно было бы записать следующим образом:

class Point: Shape, IPrint, IMail

Вначале нужно создать объект класса, реализующего наш интерфейс:

Point pt = new Point(10, 20);

Далее нам нужно создать ссылку на интерфейс. Это делается следующим образом:

IPrint ptPrinter = (IPrint)pt;

Здесь мы объявили переменную ptPrinter типа IPrint и записали в нее ссылку, приведя ее тип явным образом к типу IPrint. С помощью такой ссылки можно адресоваться к методам интерфейса IPrint, но нельзя получить доступ к полям и методам класса Point:

ptPrinter.PrintPreview();

ptPrinter.Print();

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

Коллекции

Большинство классов коллекций находятся в пространствах имен System. Collections и System.Collections.Generic. Классы обобщенных коллекций можно найти в пространстве имен System.Collections.Generic. Классы коллекций, специализированные для хранения определенного типа, находятся в пространстве имен System.Collections. Specialized.

Списки

Для динамических списков в.NET Framework предусмотрен обобщенный класс List<T>. В реализации List<T> используется массив типа Т.

Создавать списочные объекты можно, вызывая конструктор по умолчанию. При объявлении обобщенного класса List<T> необходимо указывать тип хранимых значений. В приведенном ниже коде показано, как объявлять списки List<T> с элементами int и Racer:

 var intList = new List<int>();

 var racers = new List<Racer>();

 

Конструктор по умолчанию создает пустой список. Как только элементы начинают добавляться в список, его емкость увеличивается до 4 элементов. При добавлении пятого элемента размер списка изменяется так, чтобы уместить 8 элементов. Если же и этого недостаточно, список вновь расширяется, на этот раз до 16 элементов. При каждом расширении емкость списка удваивается.

Емкость коллекции — это не то же самое, что количество элементов в коллекции. Количество элементов в коллекции может быть прочитано в свойстве Count. Разумеется, емкость всегда больше или равна количеству элементов. До тех пор, пока ни один элемент не добавлен в коллекцию, количество равно 0.

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

var intList = new List<int>();

intList.Add(1);

intList.Add(2);

var stringList = new List<string> ();

stringList. Add ("one");

stringList.Add("two");

Для вставки элементов в определенную позицию коллекции служит метод Insert ():

intList.Insert (3, 3);

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

for (int i=0; i < racers.Count; i++)

{

Console.WriteLine(racers[i]);

Поскольку List<T> реализует интерфейс IEnumerable, проход по элементам коллекции можно также осуществлять с помощью оператора foreach:

foreach (Racer r in racers)

{ Console.WriteLine(r);}

Элементы можно удалять по индексу либо передавая подлежащий удалению элемент.

Ниже удаляется четвертый по порядку элемент:

racers.RemoveAt(3);

Чтобы удалить объект Racer, его можно также непосредственно передать методу Remove (). Удаление по индексу работает быстрее, поскольку в этом случае не приходится выполнять поиск удаляемого элемента по всей коллекции. Метод Remove () сначала ищет в коллекции индекс удаляемого элемента с помощью метода IndexOf (), а затем использует этот индекс для удаления элемента.

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

int index = 3;

int count = 5;

racers.RemoveRange(index, count);

Для удаления всех элементов из коллекции служит метод Clear(), определенный в интерфейсе ICollection<T>.

 

Очередь

Очередь (queue) — это коллекция, в которой элементы обрабатываются по схеме "первый вошел, первый вышел" (first in, first out — FIFO).

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

Очередь реализуется с помощью класса Queue<T> из пространства имен System.Collections.Generic. Внутри класс Queue<T> использует массив типа Т, подобно тому, как это делает класс List<T>. Обращаться к элементам очереди через индексатор нельзя. Очередь позволяет лишь добавлять элементы, при этом элемент помещается в конец очереди (методом Enqueue ()), а также получать элементы из головы очереди (методом Dequeue ()).

Методы класса Queue<T> описаны в табл. 10.2.

При создании очередей можно использовать конструкторы, подобные тем, что применялись с типом List<T>. Конструктор по умолчанию создает пустую очередь, но конструктор можно также использовать для указания начальной емкости. Подобно классу List<T>, емкость очереди при необходимости удваивается.

Стек

Стек (stack) — это еще один контейнер, очень похожий на очередь. Элемент, добавленный к стеку последним, читается первым ("последний вошел, первый вышел"(last in, first out — LIFO).

Члены класса Stack<T> перечислены в табл. 10.3.

Сортированный список

Если нужна коллекция, отсортированная по ключу, можно воспользоваться SortedList<TKey, TValue>. Этот класс сортирует элементы на основе значения ключа. Можно использовать не только любой тип значения, но также и любой тип ключа. В приведенном ниже примере создается сортированный список, в котором как ключ, так и значение имеют тип string. Конструктор по умолчанию создает пустой список, в который с помощью метода Add () добавляются две книги. Применяя перегруженные конструкторы, можно указать емкость списка, а также передать объект, который реализует интерфейс IComparer<TKey>, используемый для сортировки элементов в списке.

Первый параметр метода Add () — ключ (заголовок книги); второй параметр — значение (номер ISBN). Для добавления элементов в список вместо метода Add () можно применить индексатор. Индексатор требует ключ в качестве параметра индекса. Если такой ключ уже существует, метод Add () генерирует исключение ArgumentException. Если же то же значение ключа применяется с индексатором, то новое значение заменяет старое.

SortedList<TKey, TValue> допускает только одно значение на ключ. Если нужно иметь несколько значений на ключ, следует использовать Lookup<TKey, TElement>.

var books = new SortedList<string, string>();

books.Add("C# 2008 Wrox Box", "978-0-470-047205-7");

books.Add("Professional ASP.NET MVC 1.0", "978-0-470-38461-9");

books["Beginning Visual C# 2008"] = "978-0-470-19135-4";

books["Professional C# 2008"] = "978-0-470-19137-6";

С помощью оператора fоreach можно выполнить итерацию по списку. Элементы, возвращенные перечислителем, имеют тип KeyValuePair<TKey, TValue>, который содержит как ключ, так и значение. Ключ доступен через свойство Key, а значение — через свойство Value.

foreach (KeyValuePair<string, string> book in books)

Console.WriteLine ("{0}, {1}", book.Key, book.Value);  

Эта итерация отображает заголовки книг и номера ISBN, упорядоченные по ключу:

 

Задание к лабораторной работе

Разработать программу ввода и обработки данных (в соответствии с вариантом). Ввод данных осуществляется с клавиатуры. При вводе должен быть осуществлен контроль данных на корректность (используя механизм свойств и исключений).

Этапы выполнения лабораторной работы:

1. Разработать класс, инкапсулирующий работу с одно записью данных (поля записи, свойства, методы ввода и вывода полей записи) и реализующий интерфейс IComparable для возможности сортировки данных по какому-либо полю.

2. Разработать класс, содержащий коллекцию (по варианту) описанного выше класса, и обеспечивающий реализацию следующего интерфейса:

interface Iwork_field

{ void input_data(); // ввод данных

   void output_data(string s); // вывод данных, s – заголовок

   void work(); // обработка данных

   void sort(); // сортировка данных

 }

Пример выполнения задания приведен ниже. В примере вводятся фамилия и оценка по 5тибальной шкале. Затем выводится список отличников.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace lab1

{

interface Iwork_field

{ void input_data();

   void output_data(string s);

   void work();

   void sort();

}

//////////////////////////////////////////////////////////////////////////////////////////

class info:IComparable<info>

{

   public string name {get;set;}

   int ball;

   bool err;

   public int prop_ball

   {

       set

       {

           if ((value >= 0) && (value <= 5)) ball = value;

           else { Console.WriteLine("error. wrong diapason ball"); ball = 0; err = true; }

       }

       get { return ball; }

   }

   public info() { err = false; }

 

   public info(string s,int b)

   {name=s;prop_ball=b;}

 

   public int CompareTo(info other) // сравнение записей

   {// A call to this method makes a single comparison that is used for sorting.

       if (this.ball > other.ball) return 1;

       else if (this.ball < other.ball)

           return -1;

       else return 0;

   }

 

    public info load_keyboard()// ввод записи с клавиатуры

   {

       do

       { 

          Console.WriteLine("vvedite fio ball");

           err = false;

           string s = Console.ReadLine();

           string[] mas_s = s.Split(new Char[] { ' ' });

           name = mas_s[0];

           if (mas_s.Length < 2) { Console.WriteLine("error. no ball"); err = true; }

           else

               try { prop_ball = Convert.ToInt32(mas_s[1]); }

               catch (System.FormatException)

               { Console.WriteLine("error format ball"); err = true; }

       } while (err);

       return this;

   }

      

   public void write_screen() // вывод записи на экран

   {

       Console.WriteLine(name + ' ' + ball);

   }

}

////////////////////////////////////////////////////////////////////////////////////

class Work:Iwork_field

{

   List<info> spisok;

  public Work()

   { spisok = new List<info>();

   }

  public void input_data()

   {

       Console.Write("count=");

       int n = Convert.ToByte(Console.ReadLine());

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

       {

           info z = new info();               

           spisok.Add(z.load_keyboard());

       }

   }

  public void output_data(string s)

  {

      Console.WriteLine(s);

      foreach (info current in spisok)

          current.write_screen();

   }

  public void work()

  {

      Console.WriteLine("список отличников");

      var rez = spisok.Where(x => x.prop_ball == 5);

      foreach (info current in rez)

          Console.WriteLine(current.name+" "+ current.prop_ball);

  }

   public void sort()

   {spisok.Sort();

   }

}

////////////////////////////////////////////////////////////////////////////////

class Program

{

   static void Main(string[] args)

   {

       byte n;

       Work z = new Work();

       Iwork_field w = (Iwork_field)z;

       w.input_data();

       w.output_data("исходные данные");

       w.sort();

       w.output_data("данные после сортировки");

       w.work();

       Console.ReadKey();           

   }

}

}

Варианты заданий

1. Оценки за сессию по предметам. Формат ввода информации: предмет (название предмета может состоять из двух слов) – оценка по 5тибальной шкале. Подсчитать средний балл за сессию. Тип коллекции – очередь.

2. Курс доллара за несколько дней. Формат ввода информации: дата – курс. Определить максимальный курс за представленный период. Тип коллекции – стек.

3. Ведомость по сессии. Формат ввода информации: фамилия – инициалы – средний балл. Определить отличников. Тип коллекции – сортированный список.

4. Движение самолетов. Формат ввода информации: номер рейса (4 цифры 2 буквы) – цена – порт назначения. Сформировать таблицу рейсов для заданного аэропорта. Тип коллекции – список.

5. Успеваемость по дисциплине. Формат ввода информации: фамилия – оценки по 3 лаб. работам. Сформировать список не сдавших хоть одну лаб. работу. Тип коллекции – очередь.

6. Учет товаров в магазине. Формат ввода информации: наименование товара – стоимость – количество. Вывести информацию о товаре, которого в магазине находится на самую большую сумму. Тип коллекции – стек.

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

8. Электронный каталог. Формат ввода информации: имя файла – объем – дата создания. Вывести все файлы больше 100Мб. Тип коллекции – сортированный список.

9. Учет в больнице. Формат ввода информации: номер мед. карты (2 буквы, 3 цифры) – номер палаты. Вывести список больных заданной палаты. Тип коллекции – список.

10.  Станция тех. обслуживания. Формат ввода информации: марка машины – регистрационный номер (2 буквы, 5 цифр) – пробег. Вывести список машин с пробегом больше 10000 км. Тип коллекции – сортированный список.

11.  Учет книг в библиотеке. Формат ввода информации: жанр (фантастика, детектив, история) – автор – количество. Найти автора, книг которого наибольшее количество, и вывести информацию о его книгах. Тип коллекции – очередь.

12.   Районный военкомат. Формат ввода информации: фамилия – дата рождения – пригодность к службе (да/нет). Вывести сведения о всех пригодных к службе. Тип коллекции – стек.

13. Учет лекарств в аптеке. Формат ввода информации: название лекарства – стоимость – количество. Вывести список лекарств, стоимостью менее 50 руб, которых в аптеке осталось меньше 10 шт. Тип коллекции – сортированный список.

14.  Учет материалов в цехе. Формат ввода информации: наименование материала – шифр (6 цифр) – количество – единица измерения (шт, кг). Вывести список материалов, которых осталось меньше 100 шт. или менее 50 кг. Тип коллекции – список.

15.  Учет оборудования. Формат ввода информации: наименование предмета – инвентарный номер (3 буквы 4 цифры) – срок службы. Составить список оборудования со сроком службы более 10 лет. Тип коллекции – стек.

16.  Учет разговоров на АТС за месяц. Формат ввода информации: фамилия абонента – количество звонков – сумма для оплаты. Вывести абонента, который сделал максимальное количество звонков и абонента, выполнившего звонки на максимальную сумму. Тип коллекции – очередь.

17.  Учет рабочего времени. Формат ввода информации: фамилия – табельный номер (5 цифр) – количество отработанных часов в неделю. Вывести информацию о рабочих, которые отработали более 40ч. Тип коллекции – сортированный список.

18.  Диспетчерская автовокзала. Формат ввода информации: номер автобуса (2 буквы, 5 цифр) – фамилия водителя – время отправления чч:мм. Составить список автобусов, отправляющихся позже 15.00. Тип коллекции – сортированный список.

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

20.  Учет погодных условий на метеостанции за месяц. Формат ввода информации: число – температура воздуха днем и ночью. Вывести информацию о дне с максимальной разницей дневной и ночной температур. Тип коллекции – очередь.

21.  Книга заявок на ремонт. Формат ввода информации: фамилия заявителя – тип ремонта (малый, средний, крупный) – дата заявки. Вывести информацию о заявке на средний ремонт для заданной даты. Тип коллекции – стек.

22.  Часовая мастерская. Формат ввода информации: фамилия заказчика – стоимость ремонта – дата заявки. Сформировать список заказов на ремонт после заданной даты. Тип коллекции – список.

23.  Справочное бюро. Формат ввода информации: фамилия – инициалы – домашний телефон (6 или 7 цифр или -, если телефона нет). Сформировать список людей, не имеющих домашнего телефона. Тип коллекции – очередь.

24.  Жилищное управление. Формат ввода информации: адрес (улица, дом, квартира) – количество проживающих – жилая площадь. Вывести сведения о квартирах, у хозяев которых имеется лишняя жилая площадь (норма 13 кв.м. на человека). Тип коллекции – список.

25.  Рабочие предприятия. Формат ввода информации: табельный номер (5 цифр) – номер цеха – профессия. Вывести рабочих заданного цеха. Тип коллекции – сортированный список.

26.  Библиотека. Формат ввода информации: инвентарный номер (7 цифр) – год издания – издательство. Вывести список книг заданного издательства. Тип коллекции – сортированный список.

27.  Информация о дипломировании. Формат ввода информации: номер зачетной книжки (в виде гг/56788, где гг – год поступления) – сокращенное название факультета – оценка). Составить список защитивших на отлично и поступивших в заданном году. Тип коллекции – сортированный список.

28.  Учет компьютеров на кафедре. Формат ввода информации: инвентарный номер (6 цифр) – стоимость – использование (учебная работа, НИР). Вывести сведения о компьютерах, используемых для учебной работы стоимостью более 10000руб. Тип коллекции – очередь.

29.   Сведения о футбольном турнире. Формат ввода информации: название команды – количество побед, поражений, ничьих. Для каждой команды подсчитать количество набранных очков (победа 3 очка, ничья 1 очко, поражение 0). Тип коллекции – стек.

30.  Учет товаров. Формат ввода информации: артикул товара (6 цифр) – название магазина – количество товара. Вывести сведения о заданном товаре. Тип коллекции – список.

Вопросы к защите лабораторной работы №1

1. Объяснить назначение и структуру свойства.

2. Объяснить назначение и структуру интерфейса.

3. Применение модификаторов доступа.

4. Особенности типа коллекции согласно варианту.

5. Понятие статических членов класса.

 

 


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

Тема: Разработка приложения с помощью Windows Form на языке программирования C#. Работа с файлами. Работа с массивами. LINQ.

Цель: Освоить особенности программирования с помощью  Windows Form на С#, в частности работу с элементами управления; освоить также работу с текстовыми и бинарными файлами и работу с массивами с помощью LINQ.

Теоретические сведения

Windows Forms - стиль построения приложения на базе классов.NET Framework Class Library. Такая модель программирования называется визуальное программирование, предполагающее простое перетаскивание мышью на форму тех или иных элементов управления из панели ToolBox, где все они расположены. Таким образом сводится к минимуму непосредственное написание программного кода.

В Windows Forms термин "форма" - синоним окна верхнего уровня. Главное окно приложения - форма. Любые другие окна верхнего уровня, окна диалога, которые имеет приложение - также формы. Подобно традиционным Windows-приложениям приложения осуществляют полный контроль над событиями в собственных окнах.

       

Рисунок 1 – Окно дизайнера формы               Рисунок 2 – Панель ToolBox

На рис.1 показано окно дизайнера форм Form1.cs[Design] и изображена экранная форма – Form1, в которой располагают различные компоненты графического интерфейса пользователя (элементы управления). Для добавления их на форму используют панель ToolBox (рис.2).

Для отображения этой панели можно нажать комбинацию <CTRL>+<Alt>+<x> или выполнить команду меню View| ToolBox. Для добавления элемента дважды щелкните на нем, а затем расположите на форме, где желаете.

Второй способ размещения элементов – программный. Например можно создать кнопку:

Button button1 = new Button();

this.Controls.Add(button1);

Удалить созданный программно элемент управления можно методом Controls.Remove. Например, если нужно удалить элемент управления, можно написать:

this.Controls.Remove((Control)button1);

При этом нужно знать, что каждый объект имеет свойства. Их можно увидеть и задать в панели свойств Properties, которая откроется, если щелкнуть правой кнопкой мыши на элементе или выбрать в контекстном меню команду Properties. Например, свойствами кнопки являются: имя кнопки (Name) – в нашем случае Button1, надпись на кнопке (Text), расположение кнопки (Location), размер кнопки (Size).

Рисунок 3 – Форма и панель свойств Properties.

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

button1.Text = "Нажми меня";

button1.Location = new System.Drawing.Point(10, 120);

Работа с файлами

Различают текстовые (StreamWriter, StreamReader), двоичные (классы BinaryReader, BinaryWriter) и байтовые файлы (FileStream).

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

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

Использование классов файловых потоков в программе предполагает следующие операции:

  1. Создание потока и связывание его с физическим файлом.
  2. Обмен информацией (чтение-запись).
  3. Закрытие файла.

Каждый файл можно создавать разными способами и открывать в различных режимах.

Режимы доступа к файлу содержаться в переменной FileAccess, определенном в пространстве имен System.IO. Константы перечисления приведены в таблице 2.1.

Таблица 2.1- Значения FileAccess

Значение                 Описание

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

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

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

Возможные режимы открытия файла определены в переменной FileMode (таблица 2.2)

Таблица 2.2 - Значения FileMode

Значение              Описание

Append                   Открыть файл, если он существует, и установить текущий

                                указатель в конец файла. Если файл не существует, создать

                                новый файл

Create                 Создать новый файл. Если в каталоге уже существует файл с

                                таким же именем, он будет стерт

CreateNew              Создать новый файл. Если в каталоге уже существует файл с

                                 таким же именем, возникает исключение IOException

Open                        Открыть существующий файл

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

                                таким именем

Truncate                       Открыть существующий файл. После открытия он должен быть

                                обрезан до нулевой длины

Байтовые файлы (потоки)

Ввод-вывод в файл на уровне байтов выполняется с помощью класса FileStream, основные элементы которого представлены в таблице 2.3.

Таблица 2.3 - Элементы класса Stream

Элемент    Описание

BeginRead, Начать асинхронный ввод или вывод

BeginWrite    

CanRead,   Свойства, определяющие, какие операции поддерживает поток: чтение,

CanSeek,   прямой доступ и/или запись

CanWrite

Close          Закрыть текущий поток и освободить связанные с ним ресурсы (сокеты,

                   указатели на файлы)

EndRead,  Ожидать завершения асинхронного ввода; закончить асинхронный вывод

EndWrite

Flush          Записать данные из буфера в связанный с потоком источник данных

                   и очистить буфер. Если для данного потока буфер не используется,

                   то этот метод ничего не делает

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

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

Read,         Считать последовательность байтов (или один байт) из текущего потока

ReadByte  и переместить указатель в потоке на количество считанных байтов

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

SetLength  Установить длину текущего потока

Write,         Записать последовательность байтов (или один байт) в текущий поток

WriteByte  и переместить указатель в потоке на количество записанных байтов

Байтовый поток класс FileStream реализует эти элементы для работы с дисковыми файлами. Для определения режимов работы с файлом используются стандартные перечисления FileMode, FileAccess.

Пример работы с байтовым файлом

//Демонстрация чтения и записи одного байта и массива байтов, а также //позиционирование в потоке.

using System;

using System.IO;

namespace ConsoleApplication1

{ class Class1

{ static void Main()

{

//создание файловой переменной и связывание с байтовым потоком -

          FileStream f=new FileStream("est.txt",

                               FileMode.Create, FileAccess.ReadWrite);

       f. WriteByte (100); //в начало файла записывается число 100

       byte[] x=new byte[10];

       for (byte i=0; i<10; ++i)

       {

       x[i]=(byte)(10-i);

       f.WriteByte(i); // записывается 10 чисел от 0 до 9

       }

       f. Write (x, 0, 5); //записывается 5 элементов массива

byte[] y=new byte[20];

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

f. Read (y, 0, 20);       //чтение из файла в массив

foreach (byte elem in y) Console.Write(" " + elem);

Console.WriteLine();

f. Seek (5, SeekOrigin.Begin); //текущий указатель – на 5-ый элемент

       int a = f. ReadByte (); //чтение 5-го элемента

       Console.WriteLine(a);

       a = f.ReadByte();  //чтение 6-го элемента

       Console.WriteLine(a);

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

   Console.ReadKey();

       f.Close(); } }}

Результат работы программы: 100 0 1 2 3 4 5 6 7 8 9 10 9 8 7 6 0 0 0 0

4

5

Текущая позиция в потоке 7

Текстовые файлы

Символьные потоки - классы StreamWriter и StreamReader работают с Unicode-символами, следовательно, ими удобнее всего пользоваться для работы с файлами, предназначенными для восприятия человеком. Эти потоки являются наследниками классов TextWriter и TextReader соответственно. В таблицах 2.4 и 2.5 приведены основные элементы этих классов. Произвольный доступ для текстовых файлов не поддерживается.

Таблица 2.4 – Основные элементы класса TextWriter

Элемент               Описание

Close   Закрыть файл и освободить связанные с ним ресурсы. Если в процессе записи

              используется буфер, он будет очищен

Flush   Очистить все буферы для текущего файла и записать накопленные в них

              данные в место их постоянного хранения. Сам файл при этом не закрывается

NewLine Используется для задания последовательности символов, означающих начало

               новой строки. По умолчанию используется «возврат - перевод строки» (\r\n)

Write    Записать фрагмент текста в поток

WriteLine  Записать строку в поток и перейти на другую строку

Таблица 2.5 - Основные элементы класса TextReader

Элемент           Описание

Peek        Возвратить следующий символ, не изменяя позицию указателя в файле

Read        Считать данные из входного потока

ReadBlock Считать из входного потока указанное пользователем количество символов

                   и записать их в буфер, начиная с заданной позиции

ReadLine   Считать строку из текущего потока и возвратить ее как значение типа string.

                   Пустая строка (null) означает конец файла(EOF)

ReadToE



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 78; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.104.29 (0.287 с.)