Задание к лабораторной работе
ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Факультет компьютерных наук и технологий
Кафедра компьютерной инженерии
Методические указания И ЗАДАНИЯ
к лабораторныМ работАМ
по курсу
«ПРОГРАММИРОВАНИЕ В СРЕДЕ СОВРЕМЕННЫХ ОПЕРАЦИОННЫХ СИСТЕМ. ЧАСТЬ 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 цифр) – название магазина – количество товара. Вывести сведения о заданном товаре. Тип коллекции – список.
Дата добавления: 2018-04-05; просмотров: 532; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!