ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3....

153

Transcript of ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3....

Page 1: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.
Page 2: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

ОГЛАВЛЕНИЕ

1 ПОЯСНИТЕЛЬНАЯ ЗАПИСКА .................................................................................................................... 3

2 ТЕОРЕТИЧЕСКИЙ РАЗДЕЛ......................................................................................................................... 5

3 ЛАБОРАТОРНЫЙ ПРАКТИКУМ .............................................................................................................. 13

4 УПРАВЛЯЕМАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА СТУДЕНТОВ ..................................................... 135

5 ПЕРЕЧЕНЬ ТЕСТОВЫХ ВОПРОСОВ К ЭКЗАМЕНУ .......................................................................... 150

Page 3: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

1 ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

Учебная программа по дисциплине «Языки программирования»

разработана для студентов специальности 1-40 01 01 Программное

обеспечение информационных технологий.

Программа предусматривает требования к содержанию лекционного

материала, перечню тем лабораторных занятий, перечню основных

направлений по которым выполняется курсовая работа.

Дисциплина «Языки программирования» является одной из дисциплин

начального цикла подготовки специалистов с высшим образованием в

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

соответствующих дисциплин, изучаемых студентами на последующих

курсах.

Цель изучения данной дисциплины – подготовка специалиста,

владеющего фундаментальными знаниями языков программирования.

Для изучения данной дисциплины необходимы знания по математике

за курс средней школы, базовые знания по отдельным разделам высшей

математики и знание дисциплины «Основы алгоритмизации и

программирования».

В результате освоения курса «Языки программирования» студент

должен:

понимать концепции, положенные в основу современных языков

программирования;

обладать навыками необходимыми для изучения новых языков

программирования;

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

программ с использованием современных инструментальных средств.

В результате изучения дисциплины студент должен:

знать:

основные теоретические понятия ООП, механизмы реализации объектно-

ориентированного подхода;

синтаксис и семантику языка высокого уровня (С#);

синтаксис и семантику машинно-ориентированного языка низкого уровня

(язык Ассемблера);

уметь:

программировать на языках программирования высокого и низкого уровня

(С# и язык Ассемблера);

исследовать исходный и исполняемый код программ, написанных на

языках программирования высокого и низкого уровня;

уметь характеризовать:

выбор методов и средств объектно-ориентированного подхода для

реализации программных проектов;

Page 4: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

уметь анализировать:

предметную область решаемых задач с целью использования объектно-

ориентированного подхода для их реализации;

приобрести навыки:

приобрести практические навыки разработки программ на языке С#;

выполнять отладку и тестирование программ, написанных на языках

программирования высокого и низкого уровня.

Электронный учебно-методический комплекс предназначен для

студентов дневной и заочной форм обучения по дисциплине «Языки

программирования».

Page 5: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

2 ТЕОРЕТИЧЕСКИЙ РАЗДЕЛ

2.1 ОСНОВНАЯ ЛИТЕРАТУРА

1. Демидович В.Е., Демидович Е.М. C#. Консольные приложения. – Мн.: Бестпринт, 2017. – 658 с.

2. Павловская, Т.А. C#. Программирование на языке высокого уровня.

Учебник для вузов. – СПб.: Питер, 2007. – 432 с.

3. Фролов А.В., Фролов Г.В. Язык C#. Самоучитель. – М.: ДИАЛОГ-

МИФИ, 2003. – 560 с.

4. Шилдт Г.Полный справочник по C#. – М.: Издательский дом «Вильямс»,

2004. – 752 с.

5. Робинсон, С., Кумар Н., Макквин К., Корнес О., Глин Дж., Харвей Б. C#

для профессионалов (2 тома). Программист – программисту. – М.: Лори,

2003. – 478 с.

6. Магда, Ю.С. Ассемблер для процессоров Intel Pentium / Ю.С. Магда –

СПб.: Питер, 2006.

7. Ирвин, Кип. Язык ассемблера для процессоров Intel / Кип. Р. Ирвин, 4-е

издание.: Пер. с англ. – М.: Издательский дом «Вильямс», 2005.

8. Харт, Дж. Системное программирование в среде Microsoft Windows /

Дж.М. Харт – М.: «Диалектика», 2005.

9. Юров, В.И. Assembler. Учебник для вузов. 2-е изд. / В.И. Юров – СПб.:

Питер, 2007.

10. Юров, В.И. Assembler. Практикум. 2-е изд. / В.И. Юров – СПб.: Питер,

2007.

11. Галисеев, Г.В. Ассемблер для Win 32. Самоучитель / Г.В. Галисеев – М.:

«Диалектика», 2007.

12. Крупник, А.Б. Изучаем Ассемблер / А.Б. Крупник – СПб.: Питер, 2005.

13. Пирогов, В.Ю. Ассемблер: учебный курс / В.Ю. Пирогов. – СПб, 2003.

2.2 ДОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА

1. Использование C#. Специальное издание. – М.: Издательский дом

«Вильямс», 2002, – 528 с.

2. Трэй Нэш. C# 2008: ускоренный курс для профессионалов. – М.: ООО

«И.Д. Вильямс», 2008. – 576 с.

3. Троелсен Э. C# и платформа NET. Библиотека программиста. – Спб.:

Питер, 2002. – 800 с.

4. Прайс Д., Гандэрлой М. Visual C#.NET. Полное руководство.: – К.: ВЕК+,

СПб.: КОРОНА принт, К.: НТИ, М.: Энтроп, 2004. – 960 с.

5. Секунов Н.Ю. Разработка приложений на С++ и C#. Библиотека

программиста. – СПб.: Питер, 2003. – 608 с.

6. Майо Д. C#: Искусство программирования. Энциклопедия программиста.

– СПб.: ООО «ДиаСофтЮП», 2002. – 656 с.

Page 6: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

2.3 ТЕМАТИЧЕСКИЕ ПЛАНЫ ЛЕКЦИЙ

Раздел 1 ЯЗЫК ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ

Лекция 1.1 ОСНОВНЫЕ ПОНЯТИЯ ООП

Предмет курса, его задачи, структура курса.

Возникновение ООП.

Понятие объекта и фундаментальные характеристики ООП (инкапсуляция,

наследование, полиморфизм).

Лекция 1.2 ОБЩАЯ ХАРАКТЕРИСТИКА ЯЗЫКОВ ООП

Языки программирования VISUAL STUDIO.NET.

Общая характеристика языка C#.

Отличие языка С# от процедурных языков программирования.

Лекция 1.3 ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА C#

Алфавит языка, идентификаторы, ключевые слова.

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

Лекция 1.4 ТИПЫ ДАННЫХ

Данные целого типа.

Вещественные типы данных.

Символьные данные.

Переменные перечисляемого типа.

Лекция 1.5 ОПЕРАЦИИ ЯЗЫКА

Выражения.

Пробельные символы.

Операторы. Операции.

Пространства имен.

Лекция 1.6 ОПЕРАТОРЫ ЯЗЫКА

Операторы организации переходов.

Операторы организации циклов.

Лекция 1.7 КЛАССЫ

Описание классов.

Определение объектов при помощи классов.

Атрибуты доступа к компонентам классов.

Page 7: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Лекция 1.8 ОБЪЕКТЫ

Экземпляры классов.

Объявление и определение методов класса.

Вызов членов класса.

Лекция 1.9 КОНСТРУКТОРЫ

Конструкторы и деструкторы.

Перегрузка конструкторов.

Лекция 1.10 СТАТИЧЕСКИЕ ЭЛЕМЕНТЫ КЛАССОВ

Статические члены.

Члены экземпляров класса.

Лекция 1.11 МЕХАНИЗМ ВЗАИМОДЕЙСТВИЯ ОБЪЕКТОВ

Атрибуты доступа.

Доступ к компонентам классов в зависимости от атрибутов доступа.

Лекция 1.12 НАСЛЕДОВАНИЕ

Введение в наследование.

Базовые и производные классы.

Лекция 1.13 НАСЛЕДОВАНИЕ СВОЙСТВ

Ограничение доступа.

Наследование свойств и модификаторы доступа.

Лекция 1.14 ПРОИЗВОДНЫЕ КЛАССЫ

Переопределение членов базового класса в производном классе.

Доступ к компонентам производных и базовых классов.

Лекция 1.15 КОНСТРУКТОРЫ ПРОИЗВОДНЫХ КЛАССОВ

Конструкторы базовых и производных классов.

Последовательность выполнения конструкторов.

Лекция 1.16 МЕТОДЫ КЛАССОВ

Параметры ref, out.

Перегрузка методов.

Виртуальные методы.

Подмена методов.

Page 8: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Лекция 1.17 ПОЛИМОРФИЗМ

Полиморфизм.

Статические методы.

Доступ к членам класса.

Лекция 1.18 ИСПОЛЬЗОВАНИЕ ССЫЛОК

Использование ссылок на базовые классы.

Использование ссылок на производные классы.

Лекция 1.19 МЕХАНИЗМ СВЯЗЫВАНИЯ ОБЪЕКТНЫХ КОДОВ

Реализация механизмов раннего связывания объектных кодов.

Лекция 1.20 ПОЗДНЕЕ СВЯЗЫВАНИЕ

Реализация механизмов позднего связывания на примерах объектных

кодов.

Лекция 1.21 ОДНОМЕРНЫЕ МАССИВЫ

Массивы.

Объявление массивов.

Инициализация массивов.

Лекция 1.22 МНОГОМЕРНЫЕ МАССИВЫ

Многомерные массивы.

Объявление массивов.

Инициализация массивов.

Лекция 1.23 СТУПЕНЧАТЫЕ МАССИВЫ

Массив массивов.

Объявление ступенчатых массивов.

Инициализация массивов.

Лекция 1.24 ИНДЕКСАТОРЫ

Определение индексаторов.

Работа с объектами с использованием индексаторов.

Лекция 1.25 ИНТЕРФЕЙСЫ

Объявление интерфейсов.

Реализация интерфейсов.

Наследование интерфейсов.

Page 9: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Лекция 1.26. ЗАПРОС О РЕАЛИЗАЦИИ НТЕРФЕЙСА

Запрос о реализации интерфейса с помощью is.

Запрос о реализации интерфейса с помощью as.

Явная квалификация имени члена интерфейса.

Лекция 1.27 ОРГАНИЗАЦИЯ ВВОДА/ВЫВОДА

Потоки ввода-вывода.

Понятие потока.

Логическое и физическое имя потока.

Лекция 1.28 КЛАССЫ ВВОДА/ВЫВОДА

Иерархия классов ввода-вывода.

Основные уровни иерархии.

Открытие потока.

Закрытие потока.

Лекция 1.29 КОНСОЛЬНЫЙ ВВОД/ВЫВОД

Классы потоков.

Стандартные классы.

Объекты и механизмы консольного ввода/вывода.

Методы ввода/вывода.

Лекция 1.30 ФАЙЛОВЫЙ ВВОД/ВЫВОД

Стандартные классы.

Объекты и механизмы файлового ввода/вывода.

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

Создание файла.

Чтение файла.

Лекция 1.31 БИНАРНЫЕ ФАЙЛЫ

Методы создания бинарных файлов.

Сериализация объектов.

Десериализация объектов.

Позиционирование в файле.

Лекция 1.32 ТИПЫ АТРИБУТОВ

Запрос атрибутов.

Атрибуты класса.

Атрибуты метода.

Атрибуты поля.

Лекция 1.33 ПАРАМЕТРЫ АТРИБУТА

Параметры атрибута.

Page 10: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Позиционные параметры.

Именованные параметры

Наследование атрибутов.

Лекция 1.34 ИСКЛЮЧЕНИЯ

Типы исключений.

Генерация исключений.

Передача исключений.

Обработка исключений.

Лекция 1.35 ИСКЛЮЧЕНИЯ ПОЛЬЗОВАТЕЛЯ

Создание собственных классов исключений.

Наследование исключений.

Перенаправление исключений.

Повторная генерация исключений.

Лекция 1.36 ДЕЛЕГАТЫ

Объявление делегатов.

Реализация делегатов.

Передача делегатов в методы.

События.

Лекция 1.37 ПОТОКИ ВЫПОЛНЕНИЯ

Создание потоков.

Приоритеты потоков.

Фоновые потоки.

Лекция 1.38 ВЗАИМОДЕЙСТВИЕ ПОТОКОВ

Синхронизация потоков.

Определение состояния потока.

Раздел 2 МАШИННО-ОРИЕНТИРОВАННЫЙ ЯЗЫК

ПРОГРАМИРОВАНИЯ

Лекция 2.1 ИНТЕРПРЕТАЦИЯ И КОМПИЛЯЦИЯ

Проблема трансляции программы с языка высокого уровня на

машинный язык.

Интерпретация и компиляция.

Многоуровневая компьютерная организация.

Лекция 2.2 АРХИТЕКТУРА МАШИНЫ

Архитектура и структурная схема компьютера.

Page 11: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Модель микропроцессора.

Организация памяти.

Представление данных в памяти.

Машинный язык.

Лекция 2.3 СИСТЕМА КОМАНД INTEL-СОВМЕСТИМЫХ

ПРОЦЕССОРОВ

Формат машинных команд.

Интерпретация полей машинных команд.

Декодирование машинных команд.

Лекция 2.4 НАЗНАЧЕНИЕ ПОЛЕЙ КОМАНДЫ

Поле префиксов. Код операции.

Байт режима адресации.

Байт масштаба, индекса и базы.

Поля смещения и непосредственного оператора.

Функциональная классификация команд Intel-совместимых

процессоров.

Лекция. 2.5 СИНТАКСИС МАШИННО-ОРИЕНТИРОВАННОГО ЯЗЫКА

Структура программы.

Типы данных.

Директивы определения данных и сегментации.

Операции и выражения.

Лекция 2.6 КОМАНДЫ ОБМЕНА ДАННЫМИ

Команды пересылки данных (mov и xchg).

Работа с адресами.

Лекция 2.7 ТИПЫ АДРЕСАЦИИ

Непосредственная, прямая, косвенная и индексная адресация, их

сочетания.

Влияние вида адресации на размер команды.

Команды для работы со стеком.

Размещение данных в стеке.

Допустимый размер стека.

Лекция 2.8 АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ КОМАНДЫ

Двоичные и двоично-десятичные числа, их предназначение.

Арифметические команды для сложения, вычитания, умножения и деления

знаковых и без знаковых двоичных чисел.

Page 12: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Вспомогательные команды для обработки арифметических

вычислений.

Команды преобразования типов.

Лекция 2.9 КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ

Безусловные переходы: команда jmp и вызов процедур.

Условные переходы.

Команда сравнения.

Лекция 2.10 ОРГАНИЗАЦИЯ ЦИКЛОВ

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

Команды условного перехода и регистр ECX.

Установка байта по условию.

Организация циклов.

Типы циклов.

Ограничение видимости меток.

Лекция 2.11 РАБОТА С АППАРАТНЫМИ РЕСУРСАМИ

ПЕРСОНАЛЬНОГО КОМПЬЮТЕРА

Система прерываний: типы прерываний и организация их обработки.

Доступ к аппаратным ресурсам с помощью портов ввода/вывода.

Организация доступа к аппаратным ресурсам посредством функций

операционной системы.

Работа с жестким диском.

Файловые системы.

Лекция 2.12 МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ

Передача аргументов в процедуры через регистры.

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

Лекция 2.13 СВЯЗЬ С ЯЗЫКАМИ ВЫСОКОГО УРОВНЯ

Возврат результата из процедуры.

Связь ассемблера с языками высокого уровня.

Внешний и встраиваемый ассемблерный код.

Page 13: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

3 ЛАБОРАТОРНЫЙ ПРАКТИКУМ

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

Разработка простых программ

Цель работы:

Ознакомиться с базовыми элементами языка C#. Уметь разрабатывать

простые программы с использованием среды Visual Studio.NET.

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

Краткие сведения о платформе .NET

Платформа .NET Framework определяет среду для создания и

выполнения приложений. Основными особенностями данной платформы

являются не зависящая от языка среда исполнения (Common Language

Runtime, CLR) и библиотека классов .NET. Это гарантирует, что объекты,

созданные на С#, могут использоваться наряду с другими объектами,

созданными на любом языке программирования, поддерживающем .NET

CLS .

Базовые элементы языка

Обьявление и инициализация переменных:

Тип_переменной имя_переменной [=значение];

Примеры:

int a; // Обьявление переменной a.

a=100; // Инициализация переменной a.

long b, c=100; // Обьявление переменных b и c и

// инициализация c.

Для каждого типа данных C# существует соответствующий тип данных

в CRL (Common Language Runtime) ) и сокращенный, который

используется в C#. Полные названия (из CLR) можно использовать в любом

языке .NET сокращенный используется в C#. Короткие названия

использовать привычнее. C# - язык со строгим контролем типов данных.

Каждый тип имеет строго заданный для него размер, который не может

изменяться. Есть две категории встроенных типов данных в C# - простые

типы и ссылочные типы. Ниже приведены краткие названия типов данных.

Page 14: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Простые типы данных

Тип Описание Длина( бит)

bool Значение истина/ложь 1

byte - Битовое беззнаковое целое 8

char Символ 16

decimal Числовой тип для финансовых вычислений 128

double Число двойной точности с плавающей точкой 64

float Число с плавающей точкой 32

int Знаковое целое 32

long Длинное знаковое целое 64

sbyte - Битовое знаковое целое 8

short Короткое целое 16

uint Беззнаковое целое 32

ulong Беззнаковое длинное целое 64

ushort Беззнаковое короткое целое 16

Область видимости переменной в C# - блок кода заключенный в

фигурные скобки { }. Переменная создается при входе в данный блок и

уничтожаются при выходе из него.

В C# существуют следующие логические операторы

Оператор Описание Пример

&& Логическое И. Результат равен true, (x==7)&&(y==3)

только если оба операнда равны true

|| Логическое ИЛИ. Результат равен false,

только если оба операнда равны false (x>7)||(y<5)

! Отрицание. Изменяет логическое значение

на противоположное if(!(a==b))...

Page 15: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Основные управляющие операторы:

Условный:

if (условие) оператор [else оператор];

if (условие1) оператор1;

else

if (условие2) оператор2;

else

if (условие3) оператор3;

else оператор4;

Выбора:

switch (выражение)

{

case константа1: оператор1; break;

case константа2: оператор2; break;

default: операторN; break;

}

Цикла:

for(инициализация; условие_выхода; итерация)

оператор;

while (условие_продолжения)

оператор;

do оператор;

while (условие продолжения);

foreach(float i in х) оператор;

Пример цикла foreach:

int [ ]х = {3, 7, -11};

Page 16: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

int sum=0;

foreach(int i in х) sum+=i* i;

В примере цикл последовательно перебирает все элементы массива х,

возводит их в квадрат и суммирует.

Операторы break и continue:

Бывают ситуации, когда необходимо прекратить выполнение цикла

досрочно. В таких случаях используются операторы break и continue. Если

вы хотите на каком-то шаге цикла его прекратить, то надо записать break.

Оператор continue в отличие от break не прерывает хода выполнения

цикла. Он лишь приостанавливает текущую итерацию и переходит сразу к

проверке условия выполнения цикла.

Пространство имен

Пространство имен определяет область объявления, в которой эти

имена известны и их можно использовать в операторах программы.

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

других наборов. Имена, объявленные в одном пространстве имен, не

конфликтуют с такими же именами, объявленными в другом пространстве

имен. Библиотека С# использует пространство имен System. Для того, чтобы

сделать видимыми пространства имен без указания полного имени (через ‘.’)

используется директива using.

Синтаксис:

using имя_пространства_имен;

Также разрешается использовать псевдонимы для имен:

using псевдоним = имя;

Пространство имен объявляется с помощью ключевого слова namespace.

Синтаксис:

namespace имя

{

элементы_пространства_имен

}

Примеры программы на C#.

Программа ‘ Hello’ выглядит следующим образом:

using System;

class Hello

Page 17: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

{

static void Main( )

{

Console.WriteLine("Hello, C#!");

Console.ReadLine( );

}

}

Программа, реализующая объявление и инициализацию данных.

using System; //01_01_C#_Объявление_Инициализация

namespace ConsoleApplication

{

class Class1

{ static void Main( )

{

int i1, i2, i3; // Переменные целого типа со знаком.

int ix= 5, iy= -7; /* Определение и инициализация

переменных целого типа.*/

long l1, l2; // Длинные целые знаковые – четыре байта.

long lu1= 125, lu2= 1234567;

/* Длинные целые – четыре байта и в них

записываются соответствующие значения. */

double f1= -1.57, f2= 3.14; //Вещественный тип- восемь байт.

char let, symb='z', n_str='\n'; // Символьные- два байта

short s1= 100, s2= 50; // Короткие целые – два байта

const int u= 113; // Константы целого типа

const int k = 17; // const k=17;

Console.Read( );

}

}

Page 18: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

}

Пример: ввести два числа, знак операции и выполнить заданную

арифметическую операцию. В программе используются управляющие

операторы.

using System;

namespace Str_101_Kalcylator_

{

class Class1

{

static void Main( )

{

string buf;

double a,b,rezult;

Console.WriteLine("Введите число a");

buf=Console.ReadLine( );

a=double.Parse(buf);

Console.WriteLine("Введите знак операции");

char deistv=(char)Console.Read( );

Console.ReadLine( );

Console.WriteLine("Введите число b");

buf=Console.ReadLine( );

b=double.Parse(buf);

bool ok=true;

switch(deistv)

{

case'+': rezult=a+b; break;

case'-': rezult=a-b; break;

case'*': rezult=a*b; break;

case'/': rezult=a/b; break;

default: rezult=double.NaN;

ok=false; break;

Page 19: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

}

if(ok) Console.WriteLine("Результат= "+rezult);

else Console.WriteLine("Действие не определено");

Console.ReadLine( );

}

}

}

Контрольные вопросы

1. Приведите пример оператора объявления переменной.

2. Приведите пример оператора инициализации переменной.

3. Какие типы данных используются в языке C#?

4. Перечислите простые типы данных языка C#.

5. Что такое область видимости переменной?

6. Как обозначается область видимости переменной?

7. Что такое время жизни переменной?

8. Напишите общую форму оператора передачи управления.

9. Какие операторы организации циклов используются в языке C#?

10. Объясните термин «пространство имен»?

11. Какой механизм позволяет избежать конфликта имен в программах на

языке C#?

12. Какое пространство имен использует системная библиотека C#?

13. Объясните назначение директивы using?

14. Какой символ используется для указания полного имени переменной в

языке C#?

15. Проиллюстрируйте использование директивы using фрагментом

программы.

16. Проиллюстрируйте объявление пространства имен фрагментом

программы на языке C#.

17. Напишите общий вид оператора передачи управления.

18. Какие операторы организации циклов имеются в языке C#?

Page 20: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

19. Напишите общий вид оператора выбора.

20. Объясните назначение операторов break и continue.

21. Напишите программу использования условного оператора.

22. Проиллюстрируйте использование оператора выбора фрагментом

программы.

23. Объясните выполнение оператора switch.

24. Для чего используется оператор goto case"метка" в операторе выбора?

25. Объясните, как выполняются сокращенные логические операторы.

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

Написать программу, реализующую вычисление функции согласно

варианту задания. Исходные данные вводятся с клавиатуры.

1. Реализуйте функцию, которая определяет максимальное число из двух

своих аргументов. Аргументами могут быть целые числа, числа с плавающей

точкой и целые числа в виде строки знаков.

2. Реализуйте функцию, которая сортирует элементы массива.

Элементами массива могут быть целые числа, числа с плавающей точкой и

строки знаков.

3. Реализуйте функцию, которая сортирует в порядке возрастания или

убывания строки массива.

4. Введите массив чисел. Реализуйте функцию, которая во второй массив

записывает все числа первого массива, в шестнадцатеричном изображении

которых младшая цифра пять. Элементами массива могут быть или короткие,

или длинные целые числа. Выведите на экран элементы массивов в

шестнадцатеричной системе счисления.

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

массива. Элементами массива могут быть или длинные целые числа, или

числа с плавающей точкой, или строки знаков.

6. Введите рассортированный массив чисел. Реализуйте функцию,

которая возвращает позицию заданного числа в исходном массиве.

Элементами массива могут быть или короткие, или длинные целые числа,

или числа с плавающей точкой.

7. Реализуйте функцию, которая определяет количество одинаковых

элементов массива. Элементами массива могут быть или короткие, или

длинные целые числа, или числа с плавающей точкой.

Page 21: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

8. Введите массив чисел. Реализуйте функцию, которая во второй массив

записывает без повторения элементы первого массива, которые в последнем

встретились более одного раза. Элементами массива могут быть или

короткие, или длинные целые числа, или числа с плавающей точкой.

Выведите на экран элементы массивов.

9. Введите массив чисел. Реализуйте функцию, которая во второй массив

записывает все числа первого массива сумма цифр в шестнадцатеричном

изображении которых кратна трем. Элементами массива могут быть или

короткие, или длинные целые числа. Выведите на экран элементы массива и

найденные числа.

10. Введите массив чисел. Реализуйте функцию, которая во второй

массив записывает все числа первого массива, которые слева и справа

читаются одинаково. Элементами массива могут быть или короткие, или

длинные целые числа. Выведите на экран элементы массива и найденные

числа.

11. Введите массив чисел. Реализуйте функцию, которая во второй

массив записывает все числа первого массива, в шестнадцатеричном

изображении которых старшая цифра семь. Элементами массива могут быть

или короткие, или длинные целые числа. Выведите на экран элементы

массивов в шестнадцатеричной системе счисления.

12. Введите массив чисел. Реализуйте функцию, которая во второй

массив записывает все числа первого массива, в шестнадцатеричном

изображении которых первая и последняя цифры совпадают. Элементами

массива могут быть или короткие, или длинные целые числа. Выведите на

экран элементы массива и найденные числа.

13. Введите массив чисел. Реализуйте функцию, которая во второй

массив записывает все числа первого массива сумма цифр, в десятичном

изображении которых кратна трем. Элементами массива могут быть или

короткие, или длинные целые числа. Выведите на экран элементы массива и

найденные числа.

14. Введите массив чисел. Реализуйте функцию, которая во второй

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

которых первая и последняя цифры совпадают. Элементами массива могут

быть или короткие, или длинные целые числа. Выведите на экран элементы

массива и найденные числа.

15. Введите два массива чисел. Элементы первого массива будут

задавать первый аргумент функции, а элементы второго – второй аргумент.

Реализуйте перегружаемую функцию, которая первый свой параметр

циклически сдвигает влево на количество бит задаваемых вторым

параметром. Результат сдвига записывается в третий массив. Элементами

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

Page 22: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

элементы массива и найденные числа. При циклическом сдвиге бит

выталкиваемый слева устанавливается на его правом конце.

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

1. Реализовать программу в соответствии с вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 2, 3

Массивы

Цель работы:

Уметь обрабатывать одномерные, многомерные и ступенчатые

массивы.

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

Многомерные массивы

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

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

посредством двух или более индексов. Каждая строка такого массива

содержит одно то же количество элементов.

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

представляют собой матрицы. Каждый элемент матрицы имеет два индекса,

первый определяет номер строки, второй - номер столбца, на пересечении

которых находится данный элемент. Нумерация строк и столбцов

начинается с нуля.

Объявить двумерный массив можно одним из следующих способов:

int [ , ] х;

int [ , ] х= new int [3, 7];

int [ , ] х={{1, 2, 3}, {2, 4, 6}};

int [ , ] х= new int [,]{{1, 2, 3}, {2, 4, 6}};

При обращении к свойству Length для двумерного массива мы

получим общее количество элементов в массиве. Чтобы получить количество

строк нужно обратиться к методу GetLength с параметром 0. Количество

столбцов в строке возвращает метод GetLength с параметром 1.

Рассмотрим пример.

using System;

Page 23: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

namespace ConsoleApplication1

{

class Program

{

static void Printer(string str, int [ , ] z)

{

Console.WriteLine(str);

for (int i = 0; i < z.GetLength(0); i++)

{

for (int j = 0; j < z.GetLength(1); j++)

Console.Write(" {0} ", z[i, j]);

Console.WriteLine( );

}

}

static void Multy(int [ , ] x)

{

for (int i = 0; i < x.GetLength(0); i++)

for (int j = 0; j < x.GetLength(1); j++)

x[i, j] *= 2;

}

static void Main( )

{

int [ , ] z = { { 1, 2, 3 }, { 2, 4, 6 } };

Printer("Матрица", z);

Multy(z);

Printer("Удвоенная матрица", z);

Console.ReadLine( );

}

}

}

/* Будет выведено:

Матрица

1 2 3

2 4 6

Удвоенная матрица

2 4 6

4 8 12

*/

Ступенчатые массивы

Фактически ступенчатый массив это массив массивов. В ступенчатых

массивах количество элементов в разных строках может быть различным.

Общий формат объявления ступенчатого массива следующий:

тип [ ] [ ] имя_массива;

Page 24: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Например: int [ ] [ ] х;

Выше мы объявили одномерный массив ссылок на целочисленные

одномерные массивы. Затем в программе потребуется выделить память не

только под одномерный массив ссылок, но и под каждый массив. Таким

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

длину. Например:

int [ ] [ ] х= new int [3][ ]; // Создаем массив из трех массивов(

строк).

х[0]=new int [2]; // 0-ая строка будет состоять из двух элементов.

х[1]=new int [3]; // 1-ая строка будет состоять из трех элементов.

х[2]=new int [5]; // 2-ая строка будет состоять из пяти элементов.

Ступенчатый массив можно объявить и так:

int [ ][ ] х= {new int [2], new int [3], new int [5]};

Рассмотрим пример.

using System;

namespace ConsoleApplication1

{

class Program

{

static void Printer(string str, int [ ] [ ] x)

{

Console.WriteLine(str);

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

{

for (int j = 0; j < x[i].Length; j++)

Console.Write("{0} ", x[i] [j]);

Console.WriteLine( );

}

}

static void Main( )

{

int [ ] [ ] z;

Console.Write("Kоличество массивов = ? ");

int n = int.Parse(Console.ReadLine( ));

z = new int [ n ] [ ];

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

{

Console.Write("Kоличество элементов в {0}–м массиве =? ", i);

int m = int.Parse(Console.ReadLine( ));

Page 25: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

z[i] = new int[m];

for (int j = 0; j < z[i].Length; j++)

{

Console.Write("z[{0},{1}]= ", i, j);

z[i][j] = int.Parse(Console.ReadLine( ));

}

}

Printer("Ступенчатый массив", z);

for (int i = 0; i < z.Length; i++) Array.Sort(z[i]);

Printer("Элементы каждого массива рассортированы", z);

Console.ReadLine( );

}

}

}

/* Будет выведено:

Kоличество массивов= ? 2

Kоличество элементов в 0–м массиве =? 3

z[0,0]= 5

z[0,1]= 3

z[0,2]= 2

Kоличество элементов в 1–м массиве =? 4

z[1,0]= 6

z[1,1]= 4

z[1,2]= 3

z[1,3]= 5

Ступенчатый массив

5 3 2

6 4 3 5

Элементы каждого массива рассортированы

2 3 5

3 4 5 6 */

Контрольные вопросы

1. Какой массив называется многомерным?

2. Как обеспечивается доступ к элементам массива?

3. Сколько индексов может быть у элемента массива?

4. Может ли быть различное число элементов в строках массива?

5. С какого значения начинается нумерация строк и столбцов матрицы?

6. Какие Вы знаете способы объявления двумерного массива?

7. Что возвращает свойство Length для двумерного массива?

8. Что возвращает метод GetLength с параметром 0 для двумерного

массива?

9. Что возвращает метод GetLength с параметром 1 для двумерного

массива?

Page 26: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

10.Что такое ступенчатый массив?

11. В ступенчатом массиве количество элементов в разных массивах может

быть различным?

12. Запишите общий формат объявления ступенчатого массива?

13. Как устанавливается длина отдельных массивов в ступенчатом

массиве?

14. Какие Вы знаете способы объявления ступенчатого массива?

15. Могут ли элементы ступенчатого массива быть различного типа?

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

В ниже приведенных заданиях объявить ступенчатый массив с двумя

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

1. Создайте класс Katalog для учета книг библиотеки. Элементами

класса должно быть название книги, фамилия автора, количество

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

вывода на экран информации об имеющихся книгах.

2. Создайте класс для учета имеющихся лекарств в аптеке. Элементами

класса должно быть наименование лекарства, его количество, стоимость и

наименование заменяющего лекарства. Предусмотрите функции

добавления новых лекарств, вывода на экран информации об имеющихся

лекарствах и наличии заменяющих лекарств.

3. Создать класс Monitors со следующими членами класса: Firma- в

котором хранятся данные о фирме изготовителе монитора; Model- в

котором хранятся данные о модели монитора; God- в котором хранится год

выпуска монитора. Создать конструктор класса, в котором мы можем сразу

ввести все данные. Создать конструктор по умолчанию, в котором

изготовитель будет Samtron, модель – 76Е, год выпуска – 2003.

4. Создать класс Scheta, в котором закрытыми членами класса будут:

Familia- в котором хранится фамилия клиента; Schet -в котором хранится

номер счета в банке; Many- в котором хранится количество денег на счету.

Требуется объявить и определить методы класса, с помощью которых

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

требуется создать функцию Info, которая полностью выводит информацию

о клиенте.

5. Создать класс HDD для хранения следующей информации о

жестких дисках: фирма изготовитель, модель, год выпуска. Создать

производный класс PolniiHDD с дополнительной информацией: кэш,

скорость чтения, количество деталей на складе.

6. Создать класс XY, который хранит координаты точки. Создайте

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

Page 27: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

7. Создать класс Otmetki, служащий для хранения оценок со

следующими членами: Matemetika – оценка по математике; Fizika – оценка

по физике. Создать класс Fakultativ, служащий для хранения оценки по

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

класс Obshii, который наследует все данные предыдущего класса. В

каждом классе разработать виртуальную функцию Info, предназначенную

для вывода полной информации об оценках.

8. Создать класс Komplektuiushie, служащий для хранения

информации об элементной базе компьютера. В классе должны быть

следующие члены: CPU – информация о процессоре; RAM – информация

о ОЗУ; HDD – информация о жестком диске. В классе перегрузить

конструктор, чтобы можно было сразу ввести всю информацию. Создать

производный класс Dopolnitelno, в который входят дополнительные члены:

Scanner – хранит информацию о сканере; Printer – хранит информацию о

принтере. В производном классе так же необходимо перегрузить

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

9. Создать класс Information, хранящий информацию о клиенте

социальной службы. В классе должны быть следующие закрытые члены

класса: Number – порядковый номер клиента; Familia – фамилия клиента;

Summa – сумма денежного пособия. Перегрузить конструктор таким

образом, чтобы можно было сразу задать все переменные. Создать методы

класса, с помощью которых можно будет устанавливать и возвращать

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

Information2, в котором будет дополнительная закрытая логическая

переменная Invalid. В созданном классе создать методы установки и

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

выводит всю информацию на экран.

10. Создать класс Scanners со следующими членами класса: Firma - в

котором хранятся данные о фирме, изготовителе сканера; Model -в

котором хранятся данные о модели сканера; God -в котором хранится год

выпуска сканера. Создать конструктор класса, в котором мы можем сразу

ввести все данные. Создать конструктор по умолчанию, в котором

изготовитель будет HP, модель – Scan Jet 4070, год выпуска – 2004.

11. Создать класс Information, в котором закрытыми членами класса

будут: Familia- в котором хранится фамилия клиента; Schet -в котором

хранится номер счета в банке; Many в котором хранится количество денег

на счету. Требуется объявить и определить методы класса, с помощью

которых можно будет изменить и возвратить значения переменных

введенных в класс. Также требуется создать функцию Info, которая

полностью выводит информацию о клиенте.

12. Создать класс XY(хранит координаты точки), содержащий два

закрытых члена класса: Х – значение координат по оси Х; У – значение

Page 28: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

координат по оси У. Создайте методы класса, с помощью которых можно

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

таким образом, чтобы можно было координаты ввести сразу при создании

элемента класса.

13. Создать класс Information(хранит информацию о клиенте),

содержащий два открытых члена класса: Familia – хранит фамилию

клиента; Ima – хранит имя клиента. Перегрузите конструктор таким

образом, чтобы можно было информацию ввести сразу при создании

элемента класса.

14. Создать класс Information, который будет хранить информацию о

студенте. В данный класс будут входить следующие открытые члены

класса: Familia – фамилию студента; Ima – имя студента; SredniiBal –

средний балл студента на сессии. Создайте методы класса, с помощью

которых можно ввести всю информацию. Создайте производный класс

PolnaiaInformatia, который будет хранить полную информацию о студенте.

В созданном классе должна быть следующая дополнительная информация:

Hobby – хобби; Age – возраст студента. Перегрузите конструктор таким

образом, чтобы можно было всю информацию ввести при создании

элемента класса.

15. Создать класс Klient, хранящий информацию о клиенте банка.

Закрытыми членами класса должны быть: Numer – порядковый номер

клиента; Familia – фамилия клиента; Many – количество денег на счету.

Создайте методы класса, с помощью которых можно изменить, ввести

информацию. Создайте функцию Info, которая выводит на экран всю

введенную информацию.

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

1. Реализовать программу на C# в соответствии с вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 4, 5

Объекты и классы

Цель работы:

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

классов, созданием объектов и механизмом наследования. Уметь создавать и

обрабатывать объекты в программах.

Page 29: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

Классы и объекты

Класс – структурированный тип данных, который объявляется

программистом. Класс является основой для создания объектов. В классе

определяются данные (переменные) и код (методы), который обрабатывает

эти данные. Объекты являются экземплярами класса.

Методы и переменные, составляющие класс, называются элементами

класса. При определении класса объявляются данные, которые он содержит,

и код, работающий с этими данными. Данные располагаются в переменных

экземпляра класса, а код содержится в методах. В С# определены несколько

разновидностей элементов класса. Это —переменные экземпляра,

статические переменные, константы, методы, конструкторы, деструкторы,

индексаторы, события, операторы и свойства. Инициализацию переменных в

объекте (переменных экземпляра) можно выполнить в конструкторе.

Синтаксис класса:

class имя_класса

{

тип__доступа тип_ переменной имя_переменной1;

тип_доступа тип_ переменной имя_переменной2;

тип_доступа тип_ возвращаемого_ результата

имя_метода1(список_параметров)

{ тело_метода; }

}

где тип_доступа может быть public, private, protected, internal.

Члены класса с типом доступа public доступны везде за пределами

данного класса, с типом доступа protected – внутри объектов данного класса

и производных классов, с типом доступа private - только для методов

данного класса. Тип доступа internal применяется для типов, доступных в

пределах одной сборки.

Пример:

class Avto

{

public string name;

Page 30: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

private int speed;

protected string marka;

public Avto(int s, string m, string n) //Конструктор класса.

{

speed=s;

marka=m;

name=n;

}

public int getSpeed( ){return speed;}

}

Создание обьекта

Общая форма оператора создания объекта следующая:

имя_класса имя_обьекта = new имя_класса( );

Для создания объекта класса вызывается соответствующий

конструктор класса.

Конструктор и деструктор

Конструктор класса – метод, используемый для инициализации

переменных объекта. Он вызывается в момент создания объекта.

Конструктор имеет то же имя, что и класс. Тип возвращаемого значения в

конструкторе не указывается явно (даже типа void). Конструкторы

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

определенным в классе, и для выполнения других операций необходимых

для создания объекта. В классе может быть несколько конструкторов,- но

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

порядком их перечисления. Все классы имеют конструкторы независимо от

того, определены они или нет. По умолчанию предусмотрен конструктор,

который присваивает нулевые значения всем переменным объекта (для

переменных обычных типов) и значение null (для переменных ссылочного

типа). Но если конструктор явно определен в классе, то система конструктор

по умолчанию не реализует. Формат конструктора:

имя_класса(список_параметров)

{

тело_конструктора;

}

Page 31: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Деструктор – метод, который вызывается автоматически для удаления

объекта. Деструктор не имеет параметров и для него не указывается тип

возвращаемого значения. Формат деструктора:

~имя_класса( )

{

тело_деструктора;

}

Пример:

using System;

namespace MyApplication1

{

class Men

{

string fio;

int zarplata;

public string Fio

{

get {return fio;}

set {fio = value;}

}

public int Zarplata

{

get {return zarplata;}

set {zarplata = value;}

}

}

class Program

{

Page 32: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

static void Main( )

{

Men ob=new Men ( );

Console.Write ("Familia - ? ");

ob.Fio=Console.ReadLine ( );

Console.Write ("Zarplata -? ");

ob.Zarplata = Convert.ToInt32(Console.ReadLine ( ));

Console.WriteLine ("Fio= {0} Zarplata ={1}",ob.Fio, ob.Zarplata);

Console.ReadLine ( );

}

}

}

Наследование

Наследование — это механизм, с помощью которого один класс

может приобретать переменные и методы другого класса. Класс может

наследовать общие элементы от своих базовых классов. В производном

классе мы можем что-нибудь добавлять и что-нибудь изменять по

отношению к классу базовому. Однако удалять что-нибудь, полученное в

наследство от базового класса, нельзя.

Синтаксис:

class имя_класса : имя_базового класса

{

тело_класса;

}

Пример:

class Park:Avto

{

protected int count;

public string adres;

}

Page 33: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Пример:

using System;

namespace ConsoleApplication2

{

class Markaavto

{ int god; string marka;

public void setGod(int g){god=g;}

public void setMarka(string m){marka=m;}

public int getGod( ){return god;}

public string getMarka( ){return marka;}

}

class Godvupyska:Markaavto

{ int probeg; string vladelec;

public void setProbeg(int p){probeg=p;}

public void setVladelec(string v){vladelec=v;}

public int getProbeg( ){return probeg;}

public string getVladelec( ){return vladelec;}

}

class My

{

public static void Main( )

{ Godvupyska [ ]x;

int n, i; string s;

Console.Write("n=? ");

s=Console.ReadLine( );

n=Convert.ToInt32(s);

x=new Godvupyska [n];

Page 34: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

{ x[i]=new Godvupyska ( );

Console.Write("god=? ");

s=Console.ReadLine( );

x[i].setGod(Convert.ToInt32(s));

Console.Write("marka=? ");

s=Console.ReadLine( );

x[i].setMarka(s);

Console.Write("probeg=? ");

s=Console.ReadLine( );

x[i].setProbeg(Convert.ToInt32(s));

Console.Write("vladelec=? ");

s=Console.ReadLine( );

x[i].setVladelec(s);

}

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

{ Console.Write("god vupyska: "+x[i].getGod( ));

Console.Write(" marka mashini: "+x[i].getMarka( ));

Console.Write(" probeg: "+x[i].getProbeg( ));

Console.WriteLine(" vladelec mashini: "

+x[i].getVladelec( ));

}

Console.ReadLine( );

}

}

}

Один класс может содержать в себе объявление другого класса. С

помощью наследования создается иерархия классов (отношение ‘являться’).

Кроме того, можно построить другую структуру – иерархию объектов

(тогда, когда один объект является частью другого – отношение ‘часть-

целое’).

Page 35: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Контрольные вопросы

1.Что такое «класс»?

2. Какое ключевое слово используется при объявлении класса?

3. Какие элементы могут быть объявлены в классе?

4. Для чего предназначено объявление класса?

5. Что такое «класс» и «объект»?

6. В чем отличие между объектом и классом?

7. Что понимается под термином «элемент класса»?

8. Какие элементы класса содержат выполняемый код?

9. Какие элементы класса содержат данные?

10. Что такое «конструктор класса»?

11. Сколько конструкторов может быть в объявлении класса?

12. Когда вызывается конструктор класса?

13. Приведите пример объявления класса.

14. Напишите объявление класса Book, включающего одно закрытое

поле типа int с именем count и одним открытым методом с прототипом void

Printer( ).

15. Для чего используется оператора new?

16. Что понимается под термином «Перегрузка методов »?

17. Напишите фрагмент программы объявления и реализации метода класса.

18. Как используются методы класса?

19. Объясните назначение статических элементов класса.

20. В чем отличие статических элементов класса от элементов экземпляра

класса?

21. Что такое перегрузка конструкторов?

22. Напишите программу использования класса.

23. Какие модификаторы типа доступа имеются в языке C#?

24. Объясните уровень доступа к элементам класса с модификатором public?

25. Объясните уровень доступа к элементам с модификатором private?

26. Объясните уровень доступа к элементам с модификатором protected?

27. Объясните особенности доступа к членам класса с модификатором

inernal?

28. Какое ключевое слово используется для создания объекта?

29. Напишите программу создания объекта на языке C#.

30. Объясните назначение конструктора?

31. Все ли классы имеют конструктор?

32. Все ли конструкторы имеют параметры?

33. Что понимается под термином «Перегрузка конструкторов»?

34. Указывается ли в конструкторе тип возвращаемого значения?

35. Каким значением инициализируются по умолчанию значения

ссылочного типа?

36. Может ли быть в программе два конструктора по умолчанию?

37. Напишите программу использования конструктора.

38. Что такое деструктор (destructor) ?

Page 36: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

39. Как объявляется «деструктор»?

40. Для чего предназначен деструктор?

41. Имеет ли деструктор параметры?

42. Указывается ли в деструкторе тип возвращаемого значения?

43. Напишите программу использования деструктора.

44. Что понимается под термином «наследование»?

45. Как классифицируются объекты при наследовании?

46. Что общего имеет базовый класс и производный?

47. В чем различие между базовым классом и производным?

48. Что такое маскирование методов базового класса?

49. Как можно вызвать конструктор базового класса в производном классе?

50. Для чего используются статические методы класса?

51. Напишите программу, реализующую передачу аргументов в методы.

52. Объясните назначение статических конструкторов.

53. Напишите программу на языке C# наследования классов.

54. Объясните последовательность выполнения конструкторов при

наследовании.

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

классы.

56. Как осуществляется доступ к компонентам производных и базовых

классов?

57. Объясните последовательность выполнения конструкторов при

наследовании.

58. Разрешается ли использовать ссылки на базовый класс при обращении к

элементам производного класса?

59. Разрешается ли использовать ссылки на производный класс при

обращении к элементам базового класса?

60. Определите класс Book, объявите статический элемент класса count типа

int. Выполните инициализацию данного элемента. Сколько экземпляров

статического данного будет в программе, если объектов класса три.

61. Может ли класс D быть производным класса С, который в свою очередь

является производным класса В, для которого базовым является класс А?

62. Может ли объект базового класса быть элементом производного класса?

63. Пусть существует класс B, для которого базовым является класс A.

Определите конструктор производного класса, принимающего один

аргумент и передающего его конструктору базового класса

64. Напишите первую строку описания класса B, который является public-

производным класса A.

65.Элементом базового класса является метод func( ), а производный класс

не имеет метода с таким именем. Может ли объект производного класса

использовать метод func( )?

Page 37: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

В ниже следующих заданиях объявите класс. Закрытыми компонентами

класса являются два массива. Конкретные размеры массивов и значения их

элементов введите с клавиатуры. Определите методы класса необходимые

для обработки массивов.

1. Первым на экран вывести массив, в котором наибольшее количество

простых делителей.

2. Определить массив, в котором наибольшее количество элементов, в

изображении которых имеется цифра семь. На экран первым вывести

элементы этого массива.

3. На экран первым вывести массив, в котором наибольшее количество

элементов расположено в порядке возрастания.

4. Определить массив, в котором наименьшее количество элементов,

значения которых больше соответствующих элементов во втором массиве.

На экран первым вывести элементы этого массива.

5. Первым на экран вывести массив, в котором произведение простых

делителей максимальное.

6. В каждом из массивов найти число, сумма цифр в изображении

которого максимальная. На экран вывести число и цифры его изображения в

порядке убывания.

7. В каждом массиве найти число в двоичном изображении которого

наибольшее количество единиц. На экран вывести двоичное изображение

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

8. В каждом массиве найти все простые числа. Первым на экран вывести

массив, имеющий наименьшее их количество, а также эти числа и их

порядковые номера в массиве.

9. В каждом массиве определить число, имеющее наибольшее количество

делителей. На экран вывести это число, его порядковый номер и его

делители.

10. Первым на экран вывести массив, в котором сумма простых

делителей минимальная.

11. Подсчитать в них количество элементов, кратных двум.

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

первым на экран вывести массив, имеющий наименьшее их количество.

Операцию деления не использовать.

12. Подсчитать в них количество элементов кратных трем.

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

первым на экран вывести массив, имеющий наибольшее их количество.

Операцию деления не использовать.

13. Подсчитать в них количество элементов больших числа, заданного с

клавиатуры. Расположить эти элементы с начала массива в порядке

возрастания. Первым на экран вывести массив, имеющий наибольшее их

количество и номера этих элементов в исходном массиве.

14. Создайте класс Katalog для учета книг библиотеки. Элементами

класса должно быть название книги, фамилия автора, количество

Page 38: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

на экран информации об имеющихся книгах.

15. Создайте класс для учета имеющихся лекарств в аптеке. Элементами

класса должно быть наименование лекарства, его количество, стоимость и

наименование заменяющего лекарства. Предусмотрите функции добавления

новых лекарств, вывода на экран информации об имеющихся лекарствах и

наличии заменяющих лекарств.

16. Создать класс Monitors со следующими членами класса: Firma- в

котором хранятся данные о фирме изготовителе монитора; Model- в котором

хранятся данные о модели монитора; God- в котором хранится год выпуска

монитора. Создать конструктор класса, в котором мы можем сразу ввести все

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

Samtron, модель – 76Е, год выпуска – 2003.

17. Создать класс Scheta, в котором закрытыми членами класса будут:

Familia- в котором хранится фамилия клиента; Schet -в котором хранится

номер счета в банке; Many- в котором хранится количество денег на счету.

Требуется объявить и определить методы класса, с помощью которых можно

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

создать функцию Info, которая полностью выводит информацию о клиенте.

18. Создать класс HDD для хранения следующей информации о

жестких дисках: фирма изготовитель, модель, год выпуска. Создать

производный класс PolniiHDD с дополнительной информацией: кэш,

скорость чтения, количество деталей на складе.

19. Создать класс XY, который хранит координаты точки. Создайте

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

20. Создать класс Otmetki, служащий для хранения оценок со

следующими членами: Matemetika – оценка по математике; Fizika – оценка

по физике. Создать класс Fakultativ, служащий для хранения оценки по

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

класс Obshii, который наследует все данные предыдущего класса. В каждом

классе разработать виртуальную функцию Info, предназначенную для вывода

полной информации об оценках.

21. Создать класс Komplektuiushie, служащий для хранения

информации об элементной базе компьютера. В классе должны быть

следующие члены: CPU – информация о процессоре; RAM – информация о

ОЗУ; HDD – информация о жестком диске. В классе перегрузить

конструктор, чтобы можно было сразу ввести всю информацию. Создать

производный класс Dopolnitelno, в который входят дополнительные члены:

Scanner – хранит информацию о сканере; Printer – хранит информацию о

принтере. В производном классе так же необходимо перегрузить

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

22. Создать класс Information, хранящий информацию о клиенте

социальной службы. В классе должны быть следующие закрытые члены

класса: Number – порядковый номер клиента; Familia – фамилия клиента;

Summa – сумма денежного пособия. Перегрузить конструктор таким

Page 39: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

образом, чтобы можно было сразу задать все переменные. Создать методы

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

переменных введенных в класс. Создать производный класс Information2, в

котором будет дополнительная закрытая логическая переменная Invalid. В

созданном классе создать методы установки и возвращения переменной. В

каждом классе создать функцию Info, которая выводит всю информацию на

экран.

23. Создать класс Scanners со следующими членами класса: Firma - в

котором хранятся данные о фирме, изготовителе сканера; Model -в котором

хранятся данные о модели сканера; God -в котором хранится год выпуска

сканера. Создать конструктор класса, в котором мы можем сразу ввести все

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

HP, модель – Scan Jet 4070, год выпуска – 2004.

24. Создать класс Information, в котором закрытыми членами класса

будут: Familia- в котором хранится фамилия клиента; Schet -в котором

хранится номер счета в банке; Many в котором хранится количество денег на

счету. Требуется объявить и определить методы класса, с помощью которых

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

Также требуется создать функцию Info, которая полностью выводит

информацию о клиенте.

25. Создать класс XY(хранит координаты точки), содержащий два

закрытых члена класса: Х – значение координат по оси Х; У – значение

координат по оси У. Создайте методы класса, с помощью которых можно

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

образом, чтобы можно было координаты ввести сразу при создании элемента

класса.

26. Создать класс Information(хранит информацию о клиенте),

содержащий два открытых члена класса: Familia – хранит фамилию клиента;

Ima – хранит имя клиента. Перегрузите конструктор таким образом, чтобы

можно было информацию ввести сразу при создании элемента класса.

27. Создать класс Information, который будет хранить информацию о

студенте. В данный класс будут входить следующие открытые члены класса:

Familia – фамилию студента; Ima – имя студента; SredniiBal – средний балл

студента на сессии. Создайте методы класса, с помощью которых можно

ввести всю информацию. Создайте производный класс PolnaiaInformatia,

который будет хранить полную информацию о студенте. В созданном классе

должна быть следующая дополнительная информация: Hobby – хобби; Age –

возраст студента. Перегрузите конструктор таким образом, чтобы можно

было всю информацию ввести при создании элемента класса.

28. Создать класс Klient, хранящий информацию о клиенте банка.

Закрытыми членами класса должны быть: Numer – порядковый номер

клиента; Familia – фамилия клиента; Many – количество денег на счету.

Создайте методы класса, с помощью которых можно изменить, ввести

информацию. Создайте функцию Info, которая выводит на экран всю

введенную информацию.

Page 40: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

1.Разработать методы и свойства для каждого класса задания.

2. Реализовать программу в соответствии с вариантом задания.

3. Подготовить отчет на бумаге и в электронном виде.

4. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 6, 7

Виртуальные методы и абстрактные классы

Цель работы:

Ознакомиться с принципом полиморфизма языка C#. Уметь создавать

виртуальные методы и использовать абстрактные классы.

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

Полиморфизм

Полиморфизм – одна из основных составляющих объектно-

ориентированного программирования, позволяющая определять в базовом

классе методы, которые будут общими для всех производных классов.

Однако, в производном классе может быть другая реализация некоторых

или всех методов базового класса. Главный принцип полиморфизма: «один

интерфейс, несколько методов». Благодаря полиморфизму, можно

пользоваться методами, не обладая точными знаниями о типе объектов.

Основным инструментом для реализации принципа полиморфизма является

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

Виртуальные методы

Метод, при реализации которого было указано ключевое слово virtual,

называется виртуальным. Виртуальный метод можно переопределить в

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

класс может иметь собственную реализацию виртуального метода.

Выбор версии виртуального метода, которую требуется вызвать,

осуществляется в соответствии с типом объекта, к которому применяется

метод во время выполнения программы. Именно только тип объекта,

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

класс содержит виртуальный метод и этот класс является базовым для

других классов и в них определены свои версии виртуального метода, то

при применении этого метода к различным типам объектов будут вызываться

различные версии виртуального метода.

Page 41: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

При реализации виртуального метода перед типом возвращаемого

значения указывается ключевое слово virtual, а при переопределении

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

override. Виртуальный метод нельзя использовать с модификаторами static и

abstract.

Переопределять виртуальный метод в производном классе не

обязательно. Если производный класс не реализует собственную версию

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

Переопределение метода положено в основу концепции динамического

выбора вызываемого метода - выбор метода осуществляется во время

выполнения программы (позднее связывание), а не во время компиляции

(раннее связывание).

Синтаксис:

virtual тип имя (список_параметров)

{

тело_метода;

}

Пример программы:

using System;

class Base

{

protected string name;

public Base(string nm) { name = nm; }

virtual public void Printer( )

{

Console.WriteLine("Base.Printer вызывается для {0}", name);

}

}

class Derived_First : Base

{

Page 42: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

public Derived_First(string name): base(name) { }

override public void Printer( )

{

Console.WriteLine

("Derived_First.Printer вызывается для {0}", name);

}

}

class Derived_Second : Base

{

public Derived_Second (string nme): base(nme) { }

override public void Printer( )

{

Console.WriteLine

("Derived_Second.Printer вызывается для {0}", name);

}

}

class Appl

{

protected Base[ ] base_Array;

public void load_base_Array ( )

{ // Имитация загрузки информации в массив данных.

base_Array = new Base[3];

base_Array [0] = new Derived_First ("Казеко_В");

base_Array [1] = new Derived_Second("Новогран_A");

base_Array [2] = new Base("Воюш_Н");

}

Page 43: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

public void read_base_Array ( )

{

foreach(Base emp in base_Array) emp.Printer( );

}

static void Main( )

{

Appl obj = new Appl( );

obj.load_base_Array ( ); obj. read_base_Array ( );

Console.ReadLine( );

}

}

/*

Derived_First.Printer вызывается для Казеко_В

Derived_Second.Printer вызывается для Новогран_A

Base.Printer вызывается для Воюш_Н

*/

Абстрактные классы

Методы класса могут быть объявлены как абстрактные, реализация

таких методов в классе отсутствует. Перед абстрактным методом

указывается модификатор abstract. Для таких методов определены только

некоторые характеристики, такие как тип возвращаемого результата и

список параметров. Абстрактный метод автоматически становится

виртуальным, однако модификатор virtual при объявлении метода не

задается. Класс, в котором есть хотя бы один абстрактный метод, называется

абстрактным (в классе могу быть и обычные методы). Создать объект

абстрактного класса нельзя. Такой класс может использоваться только в

качестве базового класса для создания иерархии производных классов. Если

в производном классе реализуются все абстрактные методы базового класса,

то объекты такого класса можно создавать. В том случае, если в

производном классе реализуются не все абстрактные методы базового

класса, то такой класс тоже является абстрактным и его можно

использовать только для создания других производных классов.

Page 44: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Пример:

using System;

namespace ConsoleApplication3

{

abstract class Base

{ abstract public void Printer

(Book[ ] catalog, int n);

}

class Book : Base

{

string nazvanie;

public string Nazvanie

{

get { return nazvanie; }

set { nazvanie = value; }

}

override public void Printer

(Book[ ] books, int n)

{

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

Console.WriteLine("nazvanie: {0}", books[i].Nazvanie);

}

}

class Appl

{

static void Main( )

{

//////// Код метода Main( )

Page 45: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Console.ReadLine();

}

}

}

Контрольные вопросы

1. Что такое «полиморфизм»?

2. Объясните основной принцип полиморфизма?

3. Что такое «виртуальный метод»?

4. Какое ключевое слово используется для определения виртуального

метода?

5. Когда осуществляется выбор версии виртуального метода?

6. Как и когда определяется версия виртуального метода?

7. Какое ключевое слово используется для определения виртуального метода

в базовом классе?

8. Какое ключевое слово используется при реализации виртуального метода в

производном классе?

9. Какие модификаторы нельзя использовать при определении виртуальных

методов?

10. Что такое «переопределенный метод»?

11. Напишите программу реализации виртуального метода.

12. Что такое «абстрактный класс»? Приведите пример.

13. Для чего предназначены абстрактные классы?

14. Какое ключевое слово используется при объявлении абстрактных

методов?

15. Являются ли абстрактные методы виртуальными?

16. При объявлении абстрактного метода используется ли модификатор

virtual ?

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

класс?

18. Могут ли быть в программе объекты абстрактного класса?

19. Проиллюстрируйте использование абстрактного класса фрагментом

программы на языке C#.

20. Объясните понятия «Раннее и позднее связывание».

21. Определите назначение виртуального метода.

22. Напишите описатель для виртуальной функции Fun(), возвращающей

результат типа int и имеющей аргумент типа int.

Page 46: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

В ниже следующих заданиях спроектируйте классы. В базовом классе

объявите конструктор с параметрами для создания объектов, деструктор,

сообщающий об уничтожении объекта. В производном классе объявите

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

данные конструктору базового класса, переопределенные методы просмотра

и переустановки текущего состояния объектов. Предусмотрите функции

необходимые для работы с компонентами объектов. Продемонстрируйте

использование различных атрибутов наследования базового класса. В

объявление классов можно включать свои компоненты. Напишите

программу демонстрации обработки массива объектов объявленных классов,

используя соответствующее меню.

1. Компонентами базового класса являются название книги и ее автор. В

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

книги и две ссылки на названия книг, которыми можно заменить утерянную.

Во второй производный класс добавляется элемент - дата выдачи книги.

Выведите список лиц, у которых срок получения книги превышает месяц.

2. Компонентой базового класса является массив чисел с плавающей

точкой, числа задают параметры фигуры на плоскости. В производный класс

добавляются элемент – площадь фигуры и методы вычисления этой площади.

3. Компонентой базового класса является массив чисел с плавающей

точкой, числа задают параметры фигуры в пространстве. В производный

класс добавляются элемент – объем фигуры и методы вычисления его.

4. Компонентой базового класса является массив чисел с плавающей

точкой, числа задают параметры фигуры в пространстве. В производный

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

площади.

5. Компонентами базового класса являются три строки: фамилия, имя и

отчество, а также три числа, задающие дату рождения. В производный класс

добавляется фамилия супруга и дата регистрации брака. Используя меню,

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

возрастания года регистрации брака; в алфавитном порядке фамилий

базового класса.

6. Компонентами базового класса являются наименование лекарства, его

стоимость, дата изготовления и название фирмы. В производный класс

добавляются возможные лекарства заменители, их стоимость. Определите

массив объектов для работы справочной аптеки.

7. Компонентой базового класса является название работы. В

производный класс добавляются стоимость выполнения работы, срок

выполнения работы, название фирмы. Определите массив объектов-фирм

выполняющих указанные работы.

Page 47: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

8. Компонентой базового класса является наименование товара. В

производный класс добавляются: количество единиц товара; цена единицы

товара; дата поступления товара. Используя меню, вывести список товаров в

алфавитном порядке; в порядке возрастания стоимости; в порядке убывания

срока хранения товара.

9. Компонентами базового класса являются: фамилия автора, название

книги. В производный класс добавляются: год издания; издательство;

стоимость одного экземпляра; количество книг. В программе определить

массив объектов. Используя меню, вывести список книг в следующем

порядке: в алфавитном порядке авторов; убывания года издания; убывания

количества экземпляров книги.

10. Компонентами базового класса являются строки: фамилия, имя и

отчество сотрудника, а также три числа, задающие дату рождения. В

производный класс добавляются: номер отдела; должность; дата приема на

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

алфавитном порядке сотрудников; возрастания года приема на работу; по

возрастанию даты рождения.

11. Создать абстрактный класс Издание с методами позволяющим вывести

на экран информацию об издании, а также определить является ли данное

издание искомым. Создать следующие производные классы: Книга -

название, фамилия автора, год издания, издательство; Статья - название,

фамилия автора, название журнала, его номер и год издания; Электронный

ресурс - название, фамилия автора, ссылка, аннотация. В производных

классах реализовать методы ввода/ вывода информации.

Создать каталог (массив) из n изданий, вывести полную информацию из

каталога, а также организовать поиск изданий по фамилии автора.

12. Создать абстрактный класс Avto с методами позволяющим вывести

на экран информацию о транспортном средстве, а также определить

грузоподъемность транспортного средства.

Создать производные классы: Легковая_машина - марка, номер,

скорость, грузоподъемность; Мотоцикл - марка, номер, скорость,

грузоподъемность, наличие коляски, при этом если коляска отсутствует, то

грузоподъемность равна 0; Грузовик - марка, номер, скорость,

грузоподъемность, наличие прицепа, при этом если есть прицеп, то

грузоподъемность увеличивается в два раза. В производных классах

реализовать методы ввода/ вывода информации и определения

грузоподъемности.

Создать базу (массив) из n машин, вывести полную информацию из

базы на экран, а также организовать поиск машин, удовлетворяющих

требованиям грузоподъемности.

Page 48: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

13. Создать абстрактный класс Function с методом вычисления

значения функции y=f(x) в заданной точке. Создать производные классы:

Line (y=кx+b), Kub (y=kx2+bx+c), Parabola (y=кx

2 +c) со своими методами

вычисления значения в заданной точке. Создать массив n функций и вывести

полную информацию о значении данных функций в точке х.

14. Создать абстрактный класс Tovar с методами, позволяющим

вывести на экран информацию о товаре, а также определить, соответствует

ли она сроку годности на текущую дату.

Создать производные классы: Продукт - название, цена, дата

производства, срок годности; Партия - название, цена, количество штук, дата

производства, срок годности; Комплект - названия, цена, перечень

продуктов. В производных классах реализовать методы ввода/ вывода

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

Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск просроченного товара (на момент

текущей даты).

15. Создать абстрактный класс Tovar с методами, позволяющими

вывести на экран информацию о товаре, а также определить, соответствует

ли она искомому типу. Создать производные классы: Игрушка - название,

цена, производитель, материал, возраст, на который рассчитана; Книга -

название, автор, цена, издательство, возраст, на который рассчитана; Спорт-

инвентарь - название, цена, производитель, возраст, на который рассчитана.

В производных классах реализовать методы ввода/ вывода информации и

определения соответствия искомому типу.

Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск товаров определенного типа.

Создать абстрактный класс Prog с методами, позволяющими вывести на

экран информацию о программном обеспечении, а также определить

соответствие возможности использования (на момент текущей даты).

Создать следующие производные классы:

– свободное программное обеспечение: название, производитель;

– условно-бесплатное программное обеспечение: название,

производитель, дата установки, срок бесплатного использования;

– коммерческое программное обеспечение: название, производитель,

цена, дата установки, срок использования. В классах реализовать методы

ввода/вывода информации на экран, и определения возможности

использования на текущую дату.

Page 49: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Создать базу (массив) из n видов программного обеспечения, вывести

полную информацию из базы на экран, а также организовать поиск

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

дату.

30. Создать абстрактный класс Man с методами, позволяющим вывести

на экран информацию о персоне, а также определить ее возраст (на момент

текущей даты).

Создать производные классы: класс «Абитуриент» - фамилия, дата

рождения, факультет; класс «Студент» - фамилия, дата рождения, факультет,

курс; класс «Преподаватель» - фамилия, дата рождения, факультет,

должность, стаж. В классах реализовать методы ввода/вывода информации

на экран и определения возраста.

Создать базу (массив) из n персон, вывести полную информацию из

базы на экран, а также организовать поиск персон, чей возраст попадает в

заданный диапазон.

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

1. Реализовать программу в соответствии с вариантом задания.

2. Показать на примере одного из методов, объявленных в классе, свойство

полиморфизма.

3. Подготовить отчет на бумаге и в электронном виде.

4. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 8

Исключительные ситуации

Цель работы:

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

прикладных программах.

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

Исключительные ситуации

Исключение представляет собой ошибку, происходящую во время

выполнения программы. С помощью подсистемы обработки исключений

можно обрабатывать эти ошибки, не вызывая аварийного завершения

программы. Обработка исключений в С# выполняется с применением

следующих ключевых слов: try, catch, throw и finally. Данные ключевые

слова взаимосвязаны, так как использование одного из них влечет за собой

Page 50: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

использование других. При обработке исключений используются блоки try и

catch.

Синтаксис:

try

{

//Блок_кода_в _котором_контролируется появление _ошибок.

}

catch (ExcepType1 ех)

{

//Обработчик_исключений_ExcepType1.

}

catch (ЕхсерТуре2 ех)

{

//Обработчик_исключений_ЕхсерТуре2.

}

Основные системные исключения приведены ниже в таблице.

Исключение Значение

ArrayTypeMismatchException Тип сохраняемого значения

несовместим с типом массива.

DivideByZeroException Предпринята попытка деления

на ноль.

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

диапазона массива.

InvalidCastException Некорректное преобразование

в процессе выполнения.

OutOfMemoryException Вызов new был неудачным

из-за недостатка памяти.

OverflowException Переполнение при выполнении

арифметической операции.

StackOverflowException Переполнение стека.

Page 51: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Тип исключения в обработчике catch должен соответствовать типу

перехватываемого исключения. Не перехваченное исключение приводит к

аварийному завершению программы. Для перехвата исключений вне

зависимости от их типа (перехват всех исключений) используется оператор

catch без параметров. Если исключение не произошло, то блоки catch для

данного блока try при выполнении пропускаются.

Возврат из исключения

После выполнения блока catch управление не передается обратно

оператору программы, в котором возникло исключение. Выполнение

программы продолжается с операторов, следующих после блока catch.

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

catch. Для этого необходимо реализовать блок finally в конце

последовательности блоков try/catch. Общая форма блоков try/catch,

включающей finally следующая:

try

{

// Блок_кода__контролирующий появление _ошибок .

}

catch (ExcepType1 ех)

{

// Обработка исключения ExcepType1.

}

catch (ЕхсерТуре2 ех)

{

// Обработка исключения ЕхсерТуре2.

}

finally

{

// Код блока finally.

}

Блок finally выполняется всегда независимо от того, возникло

исключение или нет, и независимо от причины возникновения исключения.

Page 52: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Генерация исключений

Исключение генерируется системой автоматически. Однако оно может

быть сгенерировано и пользователем, используя оператор throw.

Синтаксис оператора:

throw exceptOb;

Исключение, обработанное одним оператором catch, может быть

сгенерировано повторно и оно может перехватываться другим внешним

оператором catch. Для этого используется оператор throw без типа

исключения.

Наследование классов исключений

Можно создавать свои собственные классы исключений, выполняющие

обработку нестандартных ошибок в программе. Для этого необходимо

объявить производный класс, который наследует класс АрplicationException.

В производном классе исключений реализация не обязательна, так как они в

общем случае необходимы лишь для того, чтобы воспользоваться ими в

качестве исключений. Создаваемые пользователем классы исключений

автоматически получают доступ к свойствам и методам, определенным в

классе Exception.

Пример:

/*В классе создаётся массив символов. В функции вводится индекс и

выводится символ, соответствующий ему. При выходе индекса за пределы

массива - выводится сообщение об ошибке, для генерации исключения

используется класс baseExcept. Контролируемый блок находиться в функции,

при возникновении ошибки функция вызывается повторно, но не более трех

раз.*/

using System;

namespace ConsoleApplication18

{

class baseExcept:ApplicationException

{ public baseExcept( ):base() { } }

class strn

{

char [ ]ps;

Page 53: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

int l; //ps - указатель на массив символов, l - его длина

public strn(int n)

{ //Конструктор, запрашиваем место под массив.

ps=new char[l=n];

for(int i=0;i<n;i++) ps[i]=(char)('Z'-i);

//Заполнение массива символами: z y x...

}

public char this[int i]

{

get

{ if((i<0)|(i>=l)) throw new baseExcept();

return ps[i];

}

set { ps[i]=value; }

}

public static int vvod(string s)

//Ввод длины массива или индекса его элемента.

{ int n;

while(true)

{ Console.Write(s);

try{ n=Convert.ToInt32(Console.ReadLine( )); }

catch{Console.WriteLine (" Ошибка, повторите ввод!");

continue; }

return n;

}

}

}

class My

{

static int vxod;

Page 54: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

//Статическая переменная для подсчёта

// количества создаваемых объектов.

public static void func( )

{

strn s=new strn((strn.vvod(" Укажите длину массива - ? ")));

try

{

while(true) Console.Write(s[strn.vvod("\n ind= ? ")]);

//Бесконечный цикл, выход при генерации исключения.

}

catch(Exception baseExcept)

{

vxod++;

if(vxod==3)

{

Console.WriteLine

("\n baseExcept:Три ошибки, выход! "+vxod);

throw;

}

Console.WriteLine

("\n baseExcept: ввод - ошибка индекса "+vxod);

My.func( ); //Повторный вызов функции.

}

}

}

class Class1

{

static void Main( ){ My.func( ); }

}

}

Page 55: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Контрольные вопросы

1. Что такое «исключительная ситуация (исключение)»?

2. Для чего предназначен механизм исключений в языке C#?

3. Какие операторы используются для обработки исключений?

Для чего используется ключевое слово try?

4. Проиллюстрируйте обработку исключительной ситуации фрагментом

программы на языке C#.

5. Перечислите основные системные исключения.

6. Требуется ли соблюдение соответствия типа перехватываемого

исключения типу исключения в обработчике catch?

7. Как реализуется перехват всех исключений?

8. Что происходит если исключение не обработано?

9. Как выполняется оператор catch без параметров?

10. Объясните назначение свойства StackTrace класса System.Exception.

11. Может ли быть в программе блок try без блока catch ?

12. Куда передается управление после обработки исключительной ситуации?

13. Проиллюстрируйте использование блока finally и обработку

исключительной ситуации фрагментом программы на языке C#.

14. Выполняется ли блок finally, если исключение не возникло?

15. Какие причины автоматически генерируют исключения?

16. Как осуществляется явная генерация исключения?

14. Какой оператор используется для явной генерации исключения?

17. Проиллюстрируйте использование оператора throw фрагментом

программы на языке C#.

18. Как можно повторно перехватить исключение в программе?

19. Можно ли создавать собственные классы исключений для обработки

ошибок в программе пользователя?

20. Какой системный класс является базовым для создания классов

исключений пользователя?

21. Как обеспечивается обращение к свойствам и методам системных классов

исключений?

22. Получают ли создаваемые пользователем классы исключений доступ к

свойствам и методам, определенным в классе Exception?

23. Когда возникает исключение?

24. Для чего предназначен блок catch?

25. Как завершится программа, если возникло исключение, для которого нет

соответствующего обработчика?

26. Если в блоке try не возникло исключение, куда передается управление

после того, как блок try завершит работу?

27. Что произойдет, если исключение возникло вне блока try?

28. Укажите основной недостаток использования catch (...)?

29. Может ли программа продолжить свое выполнение после возникновения

исключительной ситуации?

Page 56: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

Реализовать обработку возможных ошибок для заданий лабораторных

работ № 6, № 7.

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

1. Реализовать программу на C# в соответствии с вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 9, 10

Интерфейсы, делегаты

Цель работы:

Уметь создавать и использовать интерфейсы и делегаты при решении

прикладных задач.

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

Интерфейсы

В C# для реализации множественного наследования используется

механизм интерфейсов. Интерфейс является расширением идеи абстрактных

классов и методов. Объявление интерфейса начинается с ключевого слова

interface. Методы в интерфейсе не реализуются. Элементами интерфейса

могут быть методы, свойства, индексаторы и события. В программе может

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

произвольное число интерфейсов. Каждый класс, включающий интерфейс,

должен реализовывать все его методы.

Синтаксис:

[атрибуты] [модификаторы] interface

имя_интерфейса[:список_родительских_интерфейсов]

{

обьявление_свойств_и_методов;

}

Пример:

using System;

Page 57: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

namespace Class09_01_Interfase

{

class Base

{

string str;

public string Str

{

get { return str; }

set { this.str = value; }

}

}

interface MyInterf { bool Printer( ); }

class Derived : Base, MyInterf

{

public Derived( )

{ Str = "Кафедра АИС МИУ"; }

public bool Printer( )

{

Console.WriteLine("Используем свойство: {0}", Str);

return true;

}

}

class App

{

public static void Main( )

{

Derived obj = new Derived();

MyInterf val = (MyInterf)obj;

bool success = val.Printer();

Page 58: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Console.WriteLine

("Вывод строки '{0}' в Printer() завершился успешно? - {1}",

obj.Str, (true == success ? " да, успешно." : " нет, неуспешно." ));

Console.ReadLine( );

}

}

}

Разрешается объявлять ссылочную переменную интерфейсного типа.

Такая переменная может ссылаться на любой объект, который реализует ее

интерфейс. При вызове метода объекта с помощью интерфейсной ссылки

вызывается версия метода, реализуемого данным объектом. Интерфейсы

разрешается наследовать. В этом случае используется синтаксис, как и при

наследовании классов. Если класс наследует интерфейс, который в свою

очередь наследует другой интерфейс, то в классе должна обеспечиваться

реализация всех методов, определенных в последовательности наследования

интерфейсов.

Делегаты

Делегат — это объект, в котором хранится ссылка на метод. Делегат

позволяет выбрать вызываемый метод во время выполнения программы.

Фактически значение делегата – это адрес области памяти, где находится

точка входа в метод. Особенностью делегата является то, что он позволяет в

программе задать вызов метода, но версия вызываемого метода определяется

во время выполнения программы, а не на этапе компиляции. Объявление

делегата начинается с ключевого слова delegate, за которым указывается тип

возвращаемого результата, имя делегата и список параметров вызываемых

методов.

Синтаксис:

delegate тип_возвращаемого_результата имя_делегата

(список__параметров);

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

соответствует сигнатуре делегата. Это позволяет во время выполнения

программы определить, какой из методов должен быть вызван. Вызываемый

метод может быть методом экземпляра, либо статическим методом.

Сигнатура вызываемого метода должна совпадать с сигнатурой делегата.

Page 59: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Многоадресность делегата — это свойство делегата одновременно

хранить несколько ссылок на разные методы. При вызове такого делегата

выполняется вся последовательность его методов. Для создания такой

последовательности необходимо определить объект типа делегата, и

пользуясь операторами + или += добавлять методы к последовательности.

Для удаления метода из последовательности используется оператор - или -=.

У делегатов, хранящих несколько ссылок тип возвращаемого значения void.

Пример:

using System;

namespace delegateSimpl

{

delegate void Del(ref string s);

class cl1

{

public static void Met1(ref string s)

{

Console.WriteLine(s); s = Console.ReadLine( );

}

}

class cl2

{

static void Main( )

{

String s1 = "123";

Del d1 = new Del(cl1.Met1);

d1(ref s1);

Console.WriteLine(s1); Console.ReadLine( );

}

}

}

Page 60: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Контрольные вопросы

1. Что такое «интерфейс»?

2. Чем отличается объявление интерфейса от объявления абстрактного

класса?

3. Какое ключевое слово используется для объявления интерфейса?

4. Реализуются ли методы в объявлении интерфейса?

5. Какие элементы языка C# могут быть членами интерфейса?

6. Сколько интерфейсов может наследовать класс?

7. Где должны быть реализованы методы интерфейса?

8. Можно ли реализовать множественный интерфейс?

9. Проиллюстрируйте использование интерфейса фрагментом программы на

языке C#.

10. Разрешается ли явное указание модификатора доступа для интерфейса?

11. Как реализуется сокрытие имени с помощью интерфейсов?

12. Возможно ли создание ссылочной переменной интерфейсного типа?

13. Можно ли наследовать интерфейс?

14. Требуется ли реализация методов в иерархии наследуемых интерфейсов?

15. Что такое «делегат»?

16. В чем состоит преимущество использования делегатов?

17. Когда осуществляется выбор вызываемого метода в случае использования

делегата?

18. Что является значением делегата?

19. Какое ключевое слово используется для описания делегата?

20. Проиллюстрируйте использование делегата фрагментом программы на

языке C#.

21. Должна ли сигнатура вызываемого метода, соответствовать сигнатуре

делегата?

22. Возможен ли вызов метода в том случае, если его сигнатура не

соответствует сигнатуре делегата?

23. Что такое «многоадресный делегат»?

24. Как можно создать последовательность методов для многоадресных

делегатов?

25. Какие операторы используются для создания последовательности

методов для многоадресных делегатов?

26. Как можно удалить элемент из последовательности методов для

многоадресных делегатов?

27. Каким должен быть тип возвращаемого значения для многоадресных

делегатов?

28. Приведите пример объявления интерфейса.

29. Может ли класс использовать множественный интерфейс?

30. Необходима ли реализация методов интерфейса в классе, наследующем

интерфейс?

Page 61: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

31. Какой модификатор доступа соответствует интерфейсу?

32. Объясните назначение и использование оператора is.

33. Объясните назначение и использование оператора as.

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

Для заданий из лабораторной работы №3 один из классов должен

наследовать интерфейс и абстрактный класс. Использовать для проверки

методов данного класса многоадресный делегат. Ниже приводятся примеры

аналогичных заданий.

1. В абстрактном классе Abstr объявить метод Poisk. В качестве

параметров методу Poisk передается массив объектов типа класса House и

количество объектов. Метод Poisk определяет, находится ли среди объектов

владелец с заданной фамилией. Если такой объект имеется, то выводится

фамилия и порядковый номер объекта. Иначе выводится сообщение, что

такого владельца нет.

В классе Base имеется поле Vladelec для хранения фамилии владельца

дома. Для работы с этим полем реализовать соответствующие методы. Класс

Base наследует класс Abstr.

Объявить интерфейс Inter. Элементом интерфейса является метод

Read, которому в качестве параметров передается массив объектов типа

класса House и количество объектов. Количество объектов и ввод данных в

массив объектов реализовать в методе Read.

Класс House наследует класс Base и интерфейс Inter. Элементом

класса House является поле Ploshchad, задающее площадь дома. Для

работы с полем Ploshchad, использовать свойство.

В головном модуле в цикле while реализовать вызов соответствующих

методов для ввода данных в массив объектов, поиска заданного владельца в

массиве объектов, завершение выполнения программы.

2. В абстрактном классе Abstr_1 объявить метод Find. В качестве

параметров методу Find передается массив объектов типа класса Book и

количество объектов. Метод Find определяет, находится ли среди объектов

искомая книга. Если такая книга имеется, то выводится ее название и

порядковый номер объекта. Иначе выводится сообщение, что такой книги

нет.

В классе Base_1 имеется поле Name для хранения наименования

библиотеки. Для работы с этим полем использовать свойства. Класс Base

наследует класс Abstr_1.

Объявить интерфейс Inter_1. Элементом интерфейса является метод

Vvod, которому в качестве параметров передается массив объектов типа

класса Book и количество объектов. Количество объектов и ввод данных в

массив объектов реализовать в методе Vvod.

Page 62: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Класс Book наследует класс Base_1 и интерфейс Inter_1. Элементом

класса Book является поле Count, задающее количество мест в библиотеке.

Для работы с полем Count, использовать методы.

В головном модуле в цикле do… while реализовать вызов

соответствующих методов для ввода данных в массив объектов, поиска

заданной книги и завершение выполнения программы.

3. В абстрактном классе Abstr_3 объявить метод Find. В качестве

параметров методу Find передается массив объектов типа класса Tovar и

количество объектов. Метод Find определяет, находится ли среди объектов

искомый товар. Если такой объект имеется, то выводится наименование

товара и порядковый номер объекта. Иначе выводится сообщение, что такого

товара нет.

В классе Base_3 имеется поле Shop для хранения наименования

магазина. Для работы с этим полем использовать методы. Класс Base_3

наследует класс Abstr_3.

Объявить интерфейс Inter_3. Элементом интерфейса является метод

TovarRead, которому в качестве параметров передается массив объектов типа

класса Tovar и количество объектов. Количество объектов и ввод данных в

массив объектов реализовать в методе TovarRead.

Класс Tovar наследует класс Base_3 и интерфейс Inter_3. Элементом

класса Tovar является поле Count, задающее количество наименований

товара. Для работы с полем Count, использовать свойство.

В головном модуле в цикле while реализовать вызов соответствующих

методов для ввода данных в массив объектов, поиска заданного товара,

завершение выполнения программы.

4. В абстрактном классе Abstr_2 объявить метод Poisk. В качестве

параметров методу Poisk передается массив объектов типа класса Avto и

количество объектов. Метод Poisk определяет, находится ли среди объектов

машина заданной марки. Если такой объект имеется, то выводится марка

автомобиля и порядковый номер объекта. Иначе выводится сообщение, что

такой машины нет.

В классе Base_2 имеется поле Park для хранения наименования

автопарка. Для работы с этим полем использовать свойство. Класс Base_2

наследует класс Abstr_2.

Объявить интерфейс Inter_2. Элементом интерфейса является метод

ReadAvto, которому в качестве параметров передается массив объектов типа

класса Avto и количество объектов. Количество объектов и ввод данных в

массив объектов реализовать в методе ReadAvto.

Класс Avto наследует класс Base_2 и интерфейс Inter_2. Элементом

класса Avto является поле Count, задающее количество автомашин в парке.

Для работы с полем Count, использовать методы.

Page 63: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

В головном модуле в цикле for реализовать вызов соответствующих

методов для ввода данных в массив объектов, поиска заданной автомашины в

массиве объектов, завершение выполнения программы.

5. В абстрактном классе Abs_ut объявить метод Poisk. В качестве

параметров методу Poisk передается массив объектов типа класса Dog и

количество объектов. Метод Poisk определяет, находится ли среди объектов

собака заданной породы. Если такой объект имеется, то выводится

порядковый номер объекта. Иначе выводится сообщение, что такой породы

нет.

В классе Basovi имеется поле Vladelec для хранения фамилии

владельца собаки. Для работы с этим полем реализовать соответствующие

методы. Класс Basovi наследует класс Abs_ut.

Объявить интерфейс Inter. Элементом интерфейса является метод

Reading, которому в качестве параметров передается массив ссылок типа

класса Dog и количество объектов (объекты типа Basovi или Dog).

Количество объектов и ввод данных в массив объектов реализовать в методе

Reading.

Класс Dog наследует класс Basovi и интерфейс Inter. Элементом

класса Dog является поле Age, задающее возраст собаки. Для работы с

полем Age, использовать свойство.

В головном модуле в цикле while реализовать вызов соответствующих

методов для ввода данных в массив объектов, поиска собаки заданной

породы, завершение выполнения программы.

6. В абстрактном классе Abstrct объявить метод Find. В качестве

параметров методу Find передается массив объектов типа класса Men и

количество объектов. Метод Find определяет, находится ли среди объектов

заданный человек. Если такой имеется, то выводится его фамилия и

порядковый номер объекта. Иначе выводится сообщение, что такого

человека нет.

В классе Bs имеется поле Name для хранения наименования отдела.

Для работы с этим полем использовать свойства. Класс Bs наследует класс

Abstrct.

Объявить интерфейс Intface. Элементом интерфейса является метод

Vvesti, которому в качестве параметров передается массив ссылок типа

класса Men и количество объектов (объекты типа Bs или Men). Количество

объектов и ввод данных в массив объектов реализовать в методе Vvesti.

Класс Men наследует класс Bs и интерфейс Intface. Элементом класса

Men является поле Fio, задающее фамилию. Для работы с полем Fio,

использовать методы.

В головном модуле в цикле do… while реализовать вызов

соответствующих методов для ввода данных в массив объектов, поиска

заданного человека и завершение выполнения программы.

Page 64: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

7. В абстрактном классе Abs объявить метод Iskatel. В качестве

параметров методу Iskatel передается массив объектов типа класса Film и

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

массиве объектов. Выводится наименование фильма и порядковый номер

объекта.

В классе Basov имеется поле Name для хранения названия фильма. Для

работы с этим полем использовать методы. Класс Basov наследует класс

Abs.

Объявить интерфейс Intr. Элементом интерфейса является метод Read,

которому в качестве параметров передается массив ссылок типа класса Film

и количество объектов (объекты типа Basov или Film). Количество объектов

и ввод данных в массив объектов реализовать в методе Read.

Класс Film наследует класс Basov и интерфейс Intr. Элементом

класса Film является поле Cena, задающее цену билета. Для работы с

полем Cena, использовать свойство.

В головном модуле в цикле while реализовать вызов соответствующих

методов для ввода данных в массив объектов, поиска заданного фильма,

завершение выполнения программы.

8. В абстрактном классе Ablut объявить метод Naiti. В качестве

параметров методу Naiti передается массив объектов типа класса Child и

количество объектов. Метод Naiti определяет, находится ли среди объектов

ребенок с заданной фамилией. Если такой объект имеется, то выводится

фамилия и порядковый номер объекта. Иначе выводится сообщение, что

такого ребенка нет.

В классе Basovi имеется поле Shcola для хранения наименования

школы. Для работы с этим полем использовать свойство. Класс Basovi

наследует класс Ablut.

Объявить интерфейс Interf. Элементом интерфейса является метод

Reading, которому в качестве параметров передается массив ссылок типа

класса Child и количество объектов (объекты типа Basovi или Child).

Количество объектов и ввод данных в массив объектов реализовать в методе

Reading.

Класс Child наследует класс Basovi и интерфейс Interf. Элементом

класса Child является фамилия ребенка и поле Year, задающее возраст

ребенка. Для работы с полем Year, использовать методы.

В головном модуле в цикле for реализовать вызов соответствующих

методов для ввода данных в массив объектов, поиска заданного ребенка в

массиве объектов, завершение выполнения программы.

9. В классе Tovar имеется поле Naim для хранения наименования

товара и поле Price – стоимость товара. Для работы с этими полями

использовать свойства. Класс Tovar наследует класс Abstr и интерфейс Inter.

Page 65: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

В абстрактном классе Abstr объявить методы Vvod и Vivod без

параметров. В методе Vvod выполняется ввод данных одного объекта типа

Tovar. Метод Vivod выполняет вывод на экран данных одного объекта типа

Tovar.

Объявить интерфейс Inter. Элементами интерфейса являются два

метода Sort, которые принимают в качестве параметров массив объектов

типа класса Tovar(одного отдела). Один метод сортирует объекты по цене,

другой метод сортирует товары по наименованию.

Объявить класс Shop. Данный класс содержит массив массивов (не

выровненный массив) mas типа Tovar. Первый индекс массива задает

количество отделов в магазине, второй индекс задает количество

наименований товара(количество товара). Для работы с массивом ) mas

реализовать индексатор, который принимает и возвращает массив товаров

заданного отдела.

Класс Metodi содержит статические методы Vvod_1 и Vivod_1,

которые получают в качестве параметров массив товаров одного отдела и

обеспечивают ввод или вывод данных товара, используя методы Vvod и

Vivod класса Abstr.

В головном модуле объявить один объект типа класса Shop, в цикле

while реализовать вызов соответствующих методов для ввода, вывода

данных в объект, сортировки товара в отделе по цене или по наименованию,

завершение выполнения программы.

10. В абстрактном классе Absolut объявить метод Find. В качестве

параметров методу Find передается массив объектов типа класса Avto и

количество объектов. Метод Find определяет, находится ли среди объектов

машина заданного года выпуска. Если такой объект имеется, то выводится

марка автомобиля и порядковый номер объекта. Иначе выводится

сообщение, что такой машины нет.

В классе Basovi имеется поле Parking для хранения наименования

автопарка. Для работы с этим полем использовать свойство. Класс Basovi

наследует класс Absolut.

Объявить интерфейс Intface. Элементом интерфейса является метод

RdAvto, которому в качестве параметров передается массив ссылок типа

класса Avto и количество объектов (объекты типа Basovi или Avto).

Количество объектов и ввод данных в массив объектов реализовать в методе

RdAvto.

Класс Avto наследует класс Basovi и интерфейс Intface. Элементом

класса Avto является поле God, задающее год выпуска автомобиля. Для

работы с полем God, использовать методы.

В головном модуле в цикле for реализовать вызов соответствующих

методов для ввода данных в массив объектов, поиска заданной в массиве

объектов, завершение выполнения программы.

Page 66: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

1. Разработать методы и свойства для каждого класса задания.

2. Реализовать программу на C# в соответствии с вариантом задания.

3. Подготовить отчет на бумаге и в электронном виде.

4. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 11, 12

Обработка потоков данных

Цель работы:

Ознакомится с механизмом потока данных, уметь создавать и

обрабатывать текстовые и бинарные файлы, уметь выполнять стандартные

операции работы с файлом: различные способы сортировки объектов в

файле; вставку и удаление объекта из рассортированного файла; слияние

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

файл.

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

Класс Stream

Центральную часть потоковой С#-системы занимает класс

System. IO. Stream.

Класс Stream представляет байтовый поток и является базовым для

всех остальных потоковых классов. Этот класс также абстрактный, т.е. мы не

можем создать его объект. В классе Stream определен набор стандартных

потоковых операций. Ниже приведены наиболее применяемые методы класса

Stream.

Метод Описание

void close ( ) Закрывает поток.

void Flush ( ) Записывает содержимое потока в физическое устройство.

int ReadByte ( ) Возвращает целочисленное представление

следующего доступного байта потока. При обнаружении конца файла

возвращает значение -1.

int Read (byte [ ] buf, int offset, int numBytes) Делает попытку

прочитать numBytes байт в массив buf, начиная с элемента buf [offset],

возвращает количество успешно прочитанных байтов.

Page 67: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

long Seek (long offset, Seek origin origin) Устанавливает текущую

позицию потока равной указанному значению смещения от заданного начала

отсчета.

void WriteByte (byte b) Записывает один байт в выходной поток.

void write(byte [ ] buf, int offset, int numBytes) Записывает поддиапазон

размером numBytes байт из массива buf, начиная с элемента buf[offset].В

общем случае при возникновении ошибки ввода-вывода методы генерируют

исключение типа IOException. При попытке выполнить некорректную

операцию, например, записать данные в поток, предназначенный только для

чтения, генерируется исключение типа NotSupportedException.

Байтовые классы потоков

Из класса stream выведены такие байтовые классы потоков.

Класс потока Описание

Bufferedstream Заключает в оболочку байтовый поток и добавляет

буферизацию. Буферизация во многих случаях увеличивает

производительность.

Filestream Байтовый поток, разработанный для файлового ввода-

вывода.

Memorystream Байтовый поток, который использует память для

хранения данных.

Файловый ввод-вывод с ориентацией на символы

Чтобы создать символьный поток, поместите байтовый поток в одну из

символьных потоковых С#-оболочек. В вершине иерархии символьных

потоков находятся абстрактные классы TextReader и TextWriter. Класс

TextReader предназначен для обработки операций ввода данных, а класс

TextWriter — для обработки операций вывода данных. Методы,

определенные этими двумя абстрактными классами, доступны для всех их

подклассов.

Класс StreamWriter — производный от класса TextWriter, a

StreamReader —производный от TextReader. Следовательно, классы

StreamWriter и StreamReader имеют доступ к методам и свойствам,

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

Page 68: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Потоковый класс Описание

StreamReader Предназначен для чтения символов из байтового

потока. Этот класс является оболочкой для байтового входного потока.

StreamWriter Предназначен для записи символов в байтовый поток.

Этот класс является оболочкой для байтового выходного потока.

StringReader Предназначен для чтения символов из строки.

StringWriter Предназначен для записи символов в строку.

void Write( int val ) Записывает значение типа int.

void Write( double val ) Записывает значение типа double.

void Write( bool val ) Записывает значение типа bool.

void WriteLine( string val ) Записывает значение типа string

с последующим символом новой строки.

void WriteLine ( char val ) Записывает символ с последующим

символом новой строки.

void WriteLine ( uint val ) Записывает значение типа uint

с последующим символом новой строки.

Класс Filestream и файловый ввод-вывод

на побайтовой основе

Рассмотрим ввод-вывод данных на побайтовой основе. Чтобы создать

байтовый поток с привязкой к файлу, используйте класс FileStream. Класс

FileStream — производный от Stream и потому обладает функциональными

возможностями базового класса.

Чтобы создать байтовый поток, связанный с файлом, создайте объект

класса FileStream. В классе FileStream определено несколько

конструкторов. Чаще всего из них используется следующий конструктор:

FileStream(string filename, FileMode mode) Здесь элемент filename означает

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

полный путь к файлу. Элемент mode означает, как именно должен быть

открыт этот файл, или режим открытия. Элемент mode может принимать

одно из значений, определенных перечислением FileMode.

Page 69: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Этот конструктор открывает файл для доступа с разрешением чтения и

записи. Ниже приведены значения перечисления FileMode:

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

FileMode.Append Добавляет выходные данные в конец файла.

FileMode.Create Создает новый выходной файл. Существующий

файл с таким же именем будет разрушен.

FileMode.CreateNew Создает новый выходной файл. Файл с таким

же именем не должен существовать.

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

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

В противном случае создает новый.

FileMode.Truncate Открывает существующий файл,

но усекает его длину до нуля.

Считывание и запись двоичных данных

Класс BinaryWriter

Класс BinaryWriter представляет собой оболочку для байтового потока,

которая управляет записью двоичных данных. Его наиболее

употребительный конструктор имеет следующий вид:

BinaryWriter(Stream outputStream)

Здесь элемент outputStream означает поток, в который будут записываться

данные. Чтобы записать выходные данные в файл, можно использовать для

этого параметра объект, созданный классом FileStream. Если поток

outputStream имеет null-значение, генерируется исключение типа

ArgumentNullException, а если поток outputStream не открыт для записи, —

исключение типа ArgumentException.

В классе BinaryWriter определены методы, способные записывать

значения всех встроенных С#-типов. Обратите внимание: значение типа

string записывается с использованием внутреннего формата, который

включает спецификатор длины. В классе BinaryWriter также определены

стандартные методы Close ( ) и Flush ( ), работа которых описана выше.

Page 70: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Класс BinaryReader

Класс BinaryReader представляет собой оболочку для байтового

потока, которая управляет чтением двоичных данных. Его наиболее

употребительный конструктор имеет такой вид:

BinaryReader(Stream.inputStream)

Здесь элемент inputStream означает поток, из которого считываются

данные. Чтобы выполнить чтение из файла, можно использовать для этого

параметра объект, созданный классом FileStream. Если поток inputStream

имеет null-значение, генерируется исключение типа ArgumentNullException,

а если поток inputStream не открыт для чтения,— исключение типа

ArgumentException. В классе BinaryReader предусмотрены методы для

считывания всех простых С#-типов. Обратите внимание на то, что метод

ReadString( ) считывает строку, которая хранится с использованием

внутреннего формата, включающего спецификатор длины. При обнаружении

конца потока все эти методы генерируют исключение типа

EndOfStreamException, а при возникновении ошибки — исключение типа

IOException

В следующей программе выполняются операции записи объектов в

бинарный файл и чтение объектов из файла.

using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1

{

/*Класс "авто" включает свойства:

марка, год выпуска, телефон владельца.*/

[Serializable]

public class Auto

{

string mar,

god, tel;

public string Mar

{ get { return mar; } set { mar = value; } }

public string God

{ get { return god; } set { god = value; } }

public string Tel

{ get { return tel; } set { tel = value; } }

}

Page 71: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

/*Класс с методами ввода-вывода файла.*/

class Write_Read_File

{

static void write_file() //Метод записывает данные в файл.

{

Auto obj = new Auto();

int n;

string buf;

FileStream f_out; //Объявление файлового потока.

Console.Write("Укажите имя файла: ");

buf = Console.ReadLine();

/* Здесь у пользователя спрашивают,

создавать новый файл. или дописывать

информацию в старый. */

Console.Write("Открыть новый файл (yes или no): ");

if (Console.ReadLine() == "yes") f_out = new FileStream(buf,

FileMode.Create, FileAccess.Write);

else f_out = new FileStream(buf, FileMode.Append, FileAccess.Write);

BinaryFormatter bin_for = new BinaryFormatter();

Console.Write("\t Кол-во машин: ");

n = Convert.ToInt32(Console.ReadLine());

//Цикл ввода информации об автомобилях.

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

{

Console.Write(" Марка машины № {0}: ", i + 1);

obj.Mar = Console.ReadLine();

Console.Write(" Год выпуска: ");

obj.God = Console.ReadLine();

Console.Write(" Номер телефона владельца: ");

obj.Tel = Console.ReadLine();

bin_for.Serialize(f_out, obj);

}

f_out.Close(); //Закрытие потока.

}

static void Read_File() // Чтение данных из файла

{

Auto obj = new Auto();

int i; string buf; //Объявление переменных.

FileStream f_in; //Объявление файлового потока.

Console.Write("Укажите файл: ");

buf = Console.ReadLine(); //Запрос имени файла.

/*Попытка открыть файл с именем переменной buf.

Если он существует, инициализируется файловый поток,

Page 72: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Если не существует, то срабатывает исключение

filenotfound и выводится сообщение с ошибкой на экран.*/

try

{

f_in = new FileStream(buf, FileMode.Open, FileAccess.Read);

}

catch (FileNotFoundException ex)

{

Console.Write("\t Нет такого файла \n" + ex.Message);

return;

}

StreamReader S_R = new StreamReader(f_in);

string str_from_file = S_R.ReadToEnd();

f_in.Seek(0, SeekOrigin.Begin);

Console.WriteLine("\n\t Длина файла: {0}", f_in.Length);

//Определение и вывод длины файла.

if (f_in.Length != 0)

{

BinaryFormatter bin_for = new BinaryFormatter();

Console.WriteLine("\n\t Содержимое файла\n");

//Объявление и инициализация количества записей в файле.

// Цикл вывода на экран двух объектов из файла.

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

{

//Попытка десериализации, как только становится

// невозможно, выводится сообщение о

// количестве прочитанных и выведенных объектов.

try

{

obj = (Auto)bin_for.Deserialize(f_in);

Console.WriteLine("\n\t Объект №" + (i + 1));

Console.WriteLine(" Марка -{0}, год -{1}," +

" номер телефона владельца -{2}",

obj.Mar, obj.God, obj.Tel);

}

catch

{

Console.WriteLine("\n\t Прочитано n записей: " + i);

break;

}

}

Console.Write("\n\t\t Читаем файл до конца(yes)? ");

if (Console.ReadLine() == "yes")

//Эта ветка кода выполняется,

Page 73: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

// если в файле более двух объектов.

while (true)

try

{

obj = (Auto)bin_for.Deserialize(f_in);

Console.WriteLine("\n\t\t Объект №" + (i + 1));

Console.WriteLine("\t\tМарка -{0}, год -{1}," +

" номер телефона владельца -{2}",

obj.Mar, obj.God, obj.Tel);

i++;

}

catch

{

Console.WriteLine("\n\t Прочитан весь файл. \n");

break;

}

else Console.WriteLine("\n\t Читали не до конца. \n");

}

f_in.Close(); //Закрытие файла.

}

static void Main()

{

while (true)

{ // Стандартное меню.

Console.Write

("\n\t 1 - создать файл \n\t 2 - читать файл"+

" \n\t 3 - выход из программы\n ");

Console.Write(" Ваш выбор: ");

switch (Console.ReadLine())

{

case "1": write_file(); break;

case "2": Read_File(); break;

case "3": Console.WriteLine("Завершение работы");

Console.ReadLine(); return;

default: Console.WriteLine("\n\t Ошибка выбора пункта меню. ");

break;

}

}

}

}

}

Page 74: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Контрольные вопросы

1. Что такое поток данных?

2. Для чего предназначен механизм потоков данных в языке C#?

3.Какие классы иерархии потоков ввода Вы знаете?

4. Какие стандартные классы используются при консольном вводе?

5. Какие стандартные классы используются при файловом вводе?

6. В чем отличие текстового набора данных от бинарного набора?

7. Объясните механизм консольного ввода.

8. Какие классы иерархии потоков вывода Вы знаете?

9.Какие стандартные классы используются при консольном выводе?

10. Какие стандартные классы используются при файловом выводе?

11. Какая передача данных выполняется быстрее: в текстовый набор

данных или в бинарный набор данных? Объясните почему.

12. Стандартные классы, объекты файлового ввода/вывода.

13. Объясните механизм файлового ввода.

14. Объясните механизм консольного вывода.

15. Объясните механизм файлового вывода.

16. Какие операторы используются для открытия текстового потока

данных?

17. Какие операторы используются для открытия бинарного потока

данных?

18. Что такое сериализация объектов?

19. Что такое десериализация объектов?

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

1. Создайте файл, содержащий список членов некоторого клуба.

Реализуйте функции вывода содержимого файла на экран, добавления в файл

новых членов и удаление тех, кто вышел из состава клуба.

2. Используя потоки ввода/вывода, напишите программу для ввода и

хранения анкетных данных студентов. Выведите эти данные в виде таблицы.

3. Создайте файл с информацией о студентах. Записи файла включают:

номер курса, номер группы, Ф.И.О., номер зачетки и результаты сессии. По

запросу с клавиатуры выполнить сортировку списка:

а) по алфавиту;

б) по номерам зачетных книжек;

в) по результатам сессии.

Page 75: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

4. Создайте файл-справочник. Записи файла содержат: фамилию

автора, наименование книги и год издания. Создать файлы, объединяя в них

работы одного автора, упорядоченные по годам.

5. Создайте файл, каждая запись которого содержит фамилию студента и

результаты сессии. С клавиатуры задается номер записи. Вывести

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

6. Создайте файл, каждая запись которого содержит фамилию сотрудника

и размер зарплаты. Вывести содержимое третьей записи, считая от середины

файла.

7. Создать файл-справочник, содержащий наименование товара и его

стоимость. По запросу с клавиатуры выполнить сортировку:

а) по наименованию товара;

б) по стоимости.

Реализовать функции изменения содержимого файла.

8. Создать файл, записи которого содержат прогноз погоды на текущий

квартал. По запросу с клавиатуры вывести на экран:

а) справку-прогноз на указанный день недели по всему кварталу;

б) перечень дней с температурой в заданном диапазоне.

9. Создать файл. Записи файла содержат Ф. И. 0. студента и его адрес.

По запросу с клавиатуры:

а) вывести адрес соответствующего студента;

б) ВЫВЕСТИ содержимое записи, номер которой задается с клавиатуры;

в) определить порядковый номер записи в файле;

г) определить смещение указанной записи от начала файла;

д) определить смещение указанной записи от конца файла.

10. Напишите программу, демонстрирующую генерацию исключений,

используя соответствующее меню. Элементом базового класса является

список сотрудников отдела фирмы. Количество сотрудников в отделе

планируется 15, но может быть другим. Информация о сотрудниках фирмы

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

количество отработанных часов за месяц; почасовая тарифная оплата.

11. С клавиатуры вводится имя файла, содержащего информацию о

жителях района (Ф. И. 0., жилая площадь и количество человек). Написать

программу, которая:

а) сортирует файл по величине жилой площади, приходящейся на

одного человека;

б) добавляет, удаляет записи;

в) выводит на экран содержимое файла.

12. Составить программу учета наличия хозяйственных товаров в

магазине: учет количества товаров; список всех товаров; поступление

товаров; выдача товаров; выдача справки о конкретном товаре.

Page 76: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

13. В записях файла хранятся наименование магазина, его номер, адрес,

а также имя файла, в котором хранится информация об имеющихся в нем

книгах (количество, стоимость, издательство). Программа реализует

следующие операции: выдачу справок, учет продажи и поступления книг, а

также поиск требуемых книг.

14. Имеется файл, в котором находятся: номер группы, Ф. И. О. студен-

тов и название файла с содержащимся в нем перечнем литературы. В про-

грамме надо реализовать: ввод, вывод списков литературы и студентов;

списка студентов, получивших данную книгу. Обеспечить вывод Ф.И.О.

студентов, которые просрочили срок сдачи литературы. Под список

литературы использовать один файл. В записях студентов, получивших

книгу, указывается код, соответствующий каждой книге (для уменьшения

объема хранимой информации).

15. В командной строке даны имена двух символьных файлов. Первый

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

знаками препинания. Второй файл содержит не более сорока пар слов,

каждая пара - в отдельной строке, слова в паре разделены запятыми. Каждое

первое слово в паре считается заменяемым, а второе - заменяющим. Найти в

первом файле все заменяемые слова и заменить эти слова на

соответствующие заменяющие. Результат поместить во второй файл.

16. С клавиатуры задается имя файла, в котором хранится текст. В

функции следует рассортировать в строках слова по величине их длины и

записать в тот же файл на исходное место.

17. В файле содержится информация об авиарейсах: откуда и куда на-

правляется, по каким дням, количество мест. Написать программу, которая:

а) выдавала бы справочную информацию о нужном рейсе;

б) добавляла новую информацию;

в) резервировала билеты.

18. С клавиатуры вводится файл. В нем содержится информация о

гостинице,

Ф. И. 0. жильцов, количество номеров, площадь номера, класс номеров.

Написать программу, которая:

а) выдает справки: кто и где проживает;

б) ведет учет используемых номеров;

в) обновляет информацию в файле.

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

студента и список взятых им книг (не более 20). Студентов - не более 30.

Вывести список книг, взятых указанным студентом.

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

студента и результаты сессии. С клавиатуры задается номер записи. Вывести

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

Page 77: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

1. Реализовать программу в соответствии с вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 13, 14

Индексаторы

Цель работы:

Уметь реализовать и использовать механизм индексаторов в

прикладных программах.

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

Индексаторы

Индексатор реализуется в том случае, когда в классе имеется скрытый

массив, к элементам которого пользователь планирует обращаться из другого

модуля (например, головного) используя имя объекта (с массивом) и номер

элемента массива в квадратных скобках. В этом случае в модуле (головном)

создается объект, но так как в объекте хранится массив и в классе реализован

индексатор, то объект можно индексировать и таким образом обрабатывать

отдельные элементы массива в объекте. Другими словами, индексатор — это

индекс для объекта, включающего в себя массив данных, и обеспечивающий

доступ к элементам. Индексатор похож на свойства.

Синтаксис индексатора подобен синтаксису свойства:

спецификатор_доступа тип_результата this [ список_параметров ]

{

get {код_ доступа;}

set {код_ доступа;}

}

Как видите, определение индексатора напоминает определение

свойств, кроме двух отличий. Прежде всего, индексатор принимает в

качестве параметра индекс. Во-вторых, так как сам класс содержит массив,

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

Индексация объектов реализуется с использованием оператора

" [ ] ".

Общий формат определения одномерного индексатора следующий:

Page 78: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

public возвращаемый_тип this[int index]

{

get{ код_метода_чтения; }

set{ код_ метода_записи; }

}

Рассмотрим пример. В объекте класса предусмотреть место для списка

фамилий студентов. Ввод данных в объект и их вывод реализовать,

используя индексатор.

using System;

namespace My

{

class Group

{

string [ ] mass;

public Group(int n) { mass = new string[n]; }

public string this[int i] // Индексатор.

{ get { return mass[i]; } set { mass[i] = value; } }

}

class Programm

{

static void Main( )

{

int n = 0; Group gr;

Console.Write("Сколько студентов = ? ");

n = Convert.ToInt32(Console.ReadLine( ));

gr = new Group(n);

Console.WriteLine("Введите " + n + " фамилий!");

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

gr[i] = Console.ReadLine( );

Console.WriteLine(" Список студентов");

Page 79: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

Console.WriteLine( gr[i] );

Console.ReadLine( );

}

}

}

Рассмотрим второй пример. В классе о сотруднике требуется хранить

его фамилию, стаж работы и величину его зарплаты. Для работы с этими

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

будет список сотрудников. Для работы с элементами списка реализовать

индексатор.

using System;

namespace ConsoleApplication1

{

class Fio

{

string fio;

public void setFio(string f) { fio = f; }

public string getFio( ) { return fio; }

int zarp;

public void setZarp(int z) { zarp = z; }

public int getZarp( ) { return zarp; }

int skill;

public void setSkill(int s) { skill = s; }

public int getSkil( ) { return skill; }

}

class Otdel

{

Fio [ ] x;

Page 80: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

int n;

public int N

{ get { return n; } set { n = value; } }

public Otdel(int size)

{

x = new Fio[size];

for (int i = 0; i < size; i++) x[i] = new Fio( );

n = 0;

}

public Fio this[int i]

{

get { return x[i]; }

set { x[i] = value; }

}

}

class Program

{

static void Main( )

{

int k;

string buf;

Console.Write("Размер отдела ? ");

buf = Console.ReadLine( );

Otdel x = new Otdel(Convert.ToInt32(buf));

Console.Write(" Количество работников ? ");

buf = Console.ReadLine( );

k = Convert.ToInt32(buf);

if (k < 0 || k >= x.N)

{

Console.WriteLine(" Плохие данные!");

Page 81: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Console.ReadLine( ); return;

}

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

{

Console.Write(" Фамилия " + (x.N + 1) + " работника: ");

x[i].setFio(Console.ReadLine( ));

Console.Write(" Введите зарплату: ");

x[i].setZarp(Convert.ToInt32(Console.ReadLine( )));

Console.Write(" Введите стаж работника: ");

x[i].setSkill(Convert.ToInt32(Console.ReadLine( )));

x.N += 1;

}

Console.WriteLine(" Результат вывода ");

Console.WriteLine("Вы ввели " + x.N + " фамилий. ");

for (int i = 0; i < x.N; i++)

Console.WriteLine(" Фамилия: " + x[i].getFio( ) +

", стаж работы: " + x[i].getSkil( ) +

", зарплата: " + x[i].getZarp( )); Console.ReadLine( );

}

}

}

Контрольные вопросы

1. В каких случаях рекомендуется использовать индексатор?

2. Запишите общий формат объявления индексатора?

3. В случае реализации индексатора, должен ли быть в объекте массив

данных?

4. Проиллюстрируйте использование индексатора фрагментом программы

на языке C#.

5. В чем отличие индексатора от свойства?

6. Для каких целей в индексаторе используется ключевое слово this?

7. Может ли индексатор возвращать объект?

Page 82: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

8. В какой части программы должен быть реализован индексатор?

9. Может ли в одном классе быть несколько индексаторов?

10. Может ли индексатор возвращать массив объектов?

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

В ниже следующих заданиях спроектируйте классы. В базовом классе

объявите конструктор с параметрами для создания объектов, деструктор,

сообщающий об уничтожении объекта. В производном классе объявите

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

данные конструктору базового класса, переопределенные методы просмотра

и переустановки текущего состояния объектов. Предусмотрите функции

необходимые для работы с компонентами объектов. Продемонстрируйте

использование различных атрибутов наследования базового класса. В

объявление классов можно включать свои компоненты. Напишите

программу демонстрации обработки массива объектов объявленных классов,

используя соответствующее меню.

1. Компонентами базового класса являются название книги и ее автор. В

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

книги и две ссылки на названия книг, которыми можно заменить утерянную.

Во второй производный класс добавляется элемент - дата выдачи книги.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

1. Компонентой базового класса является массив чисел с плавающей

точкой, числа задают параметры фигуры на плоскости. В производный класс

добавляются элемент – площадь фигуры и методы вычисления этой площади.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

3. Компонентой базового класса является массив чисел с плавающей

точкой, числа задают параметры фигуры в пространстве. В производный

класс добавляются элемент – объем фигуры и методы вычисления его.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

4. Компонентой базового класса является массив чисел с плавающей

точкой, числа задают параметры фигуры в пространстве. В производный

Page 83: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

площади.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

5. Компонентами базового класса являются три строки: фамилия, имя и

отчество, а также три числа, задающие дату рождения. В производный класс

добавляется фамилия супруга и дата регистрации брака. Используя меню,

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

возрастания года регистрации брака; в алфавитном порядке фамилий

базового класса.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

6. Компонентами базового класса являются наименование лекарства, его

стоимость, дата изготовления и название фирмы. В производный класс

добавляются возможные лекарства заменители, их стоимость. Определите

массив объектов для работы справочной аптеки.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

7. Компонентой базового класса является название работы. В

производный класс добавляются стоимость выполнения работы, срок

выполнения работы, название фирмы. Определите массив объектов-фирм

выполняющих указанные работы.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

8. Компонентой базового класса является наименование товара. В

производный класс добавляются: количество единиц товара; цена единицы

товара; дата поступления товара. Используя меню, вывести список товаров в

алфавитном порядке; в порядке возрастания стоимости; в порядке убывания

срока хранения товара.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

Page 84: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

9. Компонентами базового класса являются: фамилия автора, название

книги. В производный класс добавляются: год издания; издательство;

стоимость одного экземпляра; количество книг. В программе определить

массив объектов. Используя меню, вывести список книг в следующем

порядке: в алфавитном порядке авторов; убывания года издания; убывания

количества экземпляров книги.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

10. Компонентами базового класса являются строки: фамилия, имя и

отчество сотрудника, а также три числа, задающие дату рождения. В

производный класс добавляются: номер отдела; должность; дата приема на

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

алфавитном порядке сотрудников; возрастания года приема на работу; по

возрастанию даты рождения.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

11. Создать базовый класс Издание с методами позволяющим вывести на

экран информацию об издании, а также определить является ли данное

издание искомым. Создать следующие производные классы: Книга -

название, фамилия автора, год издания, издательство; Статья - название,

фамилия автора, название журнала, его номер и год издания; Электронный

ресурс - название, фамилия автора, ссылка, аннотация. В производных

классах реализовать методы ввода/ вывода информации.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

12. Создать базовый класс Avto с методами позволяющим вывести на

экран информацию о транспортном средстве, а также определить

грузоподъемность транспортного средства.

Создать производные классы: Легковая_машина - марка, номер,

скорость, грузоподъемность; Мотоцикл - марка, номер, скорость,

грузоподъемность, наличие коляски, при этом если коляска отсутствует, то

грузоподъемность равна 0; Грузовик - марка, номер, скорость,

грузоподъемность, наличие прицепа, при этом если есть прицеп, то

грузоподъемность увеличивается в два раза. В производных классах

Page 85: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

реализовать методы ввода/ вывода информации и определения

грузоподъемности.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

13. Создать базовый класс Function с методом вычисления значения

функции y=f(x) в заданной точке. Создать производные классы: Line

(y=кx+b), Kub (y=kx2+bx+c), Parabola (y=кx

2 +c) со своими методами

вычисления значения в заданной точке.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

14. Создать базовый класс Tovar с методами, позволяющим вывести на

экран информацию о товаре, а также определить, соответствует ли она сроку

годности на текущую дату.

Создать производные классы: Продукт - название, цена, дата

производства, срок годности; Партия - название, цена, количество штук,

дата производства, срок годности; Комплект - названия, цена, перечень

продуктов. В производных классах реализовать методы ввода/ вывода

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

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

15. Создать базовый класс Tovar с методами, позволяющими вывести на

экран информацию о товаре, а также определить, соответствует ли она

искомому типу. Создать производные классы: Игрушка - название, цена,

производитель, материал, возраст, на который рассчитана; Книга - название,

автор, цена, издательство, возраст, на который рассчитана; Спорт-

инвентарь - название, цена, производитель, возраст, на который рассчитана.

В производных классах реализовать методы ввода/ вывода информации и

определения соответствия искомому типу.

Создайте класс с массивом объектов. Элементами массива могут быть

ссылки на объекты выше перечисленных классов. Для работы с объектами

массива реализовать индексатор.

В головном модуле создать объект базового класса и выполнить ввод и

вывод данных в объект.

Page 86: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

1. Реализовать программу на C# в соответствии с вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы из VisualStudio 2015 вставьте в электронный и

бумажный отчеты.

Лабораторная работа 15

Программы типа ЕХЕ и типа СОМ

Цель работы:

Уметь создавать простые программы на языке ассемблера.

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

Структура программы на языке ассемблера

Рассмотрим общую структуру программы на языке Ассемблера.

Следует отметить, что какой-либо фиксированной структуры программы

на Ассемблере нет, но для небольших программ, в которых

используется три сегмента - сегмент команд, сегмент данных и сегмент

стека, типичной является такая структура:

DATA_SEG SEGMENT ; сегмент данных

...

<переменные программы>

...

DATA_SEG ENDS ; конец сегмента данных

STACK_SEG SEGMENT STACK ‘STACK’ ; сегмент стека

dw 100 dup (?) ; участок памяти длиной в 100 слов

STACK_SEG ENDS ; конец сегмента стека

CODE_SEG SEGMENT ; сегмент кода

ASSUME CS:CODE_SEG, DS:DATA_SEG, SS:STACK_SEG

START: ; точка входа

mov ax,DATA_SEG

mov ds,ax

...

Page 87: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

<команды программы>

...

mov ax,4c00h ; завершение выполнения

int 21h

CODE_SEG ENDS ; конец сегмента кода

END START ; конец программы

Поясним эту структуру программы. Для определения использовались

стандартные директивы ассемблера. Взаимное расположение сегментов

программы может быть любым, но для того чтобы избежать проблем с

префиксами рекомендуется сегмент кода размещать в конце текста

программы.

Сегмент стека описан с классом ‘STACK ‘ (совпадение этого

параметра с именем переменной недопустимо). Поэтому в самой

программе нам уже не надо самим загружать сегментный регистр SS,

значение на этот регистр автоматически запишет загрузчик системы при

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

лишь DS. Относительно сегмента стека нужно сделать такое замечание:

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

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

операционной системой при обработке прерываний, возникающих в

процессе работы программы. В конце программы надо обязательно

указать директиву END. Она является признаком конца текста

программы, все строки за ней не считаются относящимися к программе.

В этой директиве указывается точка входа - метка той команды, с

которой должно начинаться выполнение программы (в общем случае это

не обязательно первая команда программы). В данной программе такой

меткой является START.

Теперь сделаем несколько замечаний общего характера. Все

предложения, по которым компилятор что-то заносит в формируемую

им машинную программу (а это, в первую очередь, команды и

директивы определения данных), обязательно должны входить в состав

какого-нибудь программного сегмента, размещать их вне программных

сегментов нельзя. Вне программных сегментов можно указывать только

директивы чисто информационного характера, например директивы

описания типов структур.

Может возникнуть вопрос: можно ли в сегменте данных размещать

команды, а в сегменте команд размещать описания переменных? Да,

можно, но лучше это не делать, т.к. могут возникнуть некоторые

проблемы с сегментированием. Поэтому рекомендуется в сегменте

Page 88: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

данных описывать только переменные, а в сегменте команд размещать

только команды.

Структура ЕХЕ - программы

Программа в формате ЕХЕ, созданная компоновщиком, состоит из

следующих двух частей:

- заголовка - записи, содержащей информацию по управлению и

настройке программы;

- собственно загрузочного модуля.

В заголовке находится информация о размере выполняемого модуля,

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

которые должны заполнить машинные адреса в соответствии с

относительными шестнадцатеричными позициями:

00 - (шестнадцатеричное 4D,5A). Компоновщик устанавливает этот код для

идентификации правильного ЕХЕ файла;

02 - число байтов в последней странице ЕХЕ файла(страница 512 байт);

04 - число блоков по 512 байт ЕХЕ файла, включая заголовок;

06 - число настраиваемых элементов;

08 - число 16-ти байтовых блоков (параграфов) в заголовке (необходимо для

локализации начала выполняемого модуля, следующего после заголовка);

0А - минимальное число параграфов, которые должны находится после

загруженной программы;

0С - переключатель загрузки в младшие или старшие адреса. При

компоновке пользователь должен решить, будет ли его программа

загружаться для выполнения в младшие адреса памяти или в старшие.

Обычным является загрузка в младшие адреса. Значение 0000 указывает

на загрузку в старшие адреса, а FFFF - в младшие. Иные значения

определяют максимальное число параграфов, которые должны

находиться после загруженной программы;

0Е - относительный адрес сегмента стека в выполняемом модуле;

10 - адрес, который загрузчик должен поместить в регистр SP перед

передачей управления в выполнимый модуль;

12 - контрольная сумма - сумма всех слов в файле (без учета переполнения)

используется для проверки потери данных;

14 - относительный адрес, который загрузчик должен поместить в регистр IP

до передачи управления в выполняемый модуль;

16 - относительный адрес кодового сегмента в выполняемом модуле. Этот

Page 89: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

адрес загрузчик заносит в регистр CS;

18 - смещение 1-ого настраиваемого элемента в файле;

1А - номер оверлейного фрагмента: 0 означает, что заголовок относится к

резидентной части ЕХЕ файла;

1С - таблица настройки, содержащая переменное число настраиваемых

элементов, соответствующее значению по смещению 06.

Заголовок имеет минимальный размер 512 байт и может быть больше,

если программа содержит большое число настраиваемых элементов. Позиция

06 в заголовке указывает число элементов в выполняемом модуле,

нуждающихся в настройке. Каждый элемент настройки в таблице,

начинающейся в позиции 1С заголовка, состоит из 2-х байтовых величин

смещений и 2-х байтовых сегментных значений. Система строит префикс

программного сегмента (PSP) вслед за резидентной частью COMMAND.COM,

которая выполняет операцию загрузки. Затем COMMAND.COM выполняет

следующие действия:

- считывает форматированную часть заголовка программы в память;

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

позиции 04 вычитается размер заголовка в позиции 08. Загружает модуль в

память с начала сегмента;

- считывает элементы таблицы настройки в рабочую область и

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

0E);

- устанавливает в регистрах SS и SP значения из заголовка и прибавляет

адрес начала сегмента;

- устанавливает в регистрах DS и ES сегментный адрес PSP;

- устанавливает в регистре CS адрес PSP и прибавляет величину

смещения в заголовке (позиция 16) к регистру CS. Если сегмент кода

непосредственно следует за PSP, то смещение в заголовке равно 256 (100H).

Регистровая пара CS:IP содержит стартовый адрес в кодовом сегменте, т.е.

начальный адрес программы. После инициализации регистры CS и SS

содержат правильные адреса сегментов, а регистр DS (и ES) должен быть

настроен в программе на собственный сегмент данных:

MOV AX,datasegname ; Установить в DS

MOV DS,AX ; адрес сегмента данных

COMMENT /*Пример: l-02-011.asm. Программа типа .EXE. Вычислить

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

записаны построчно, каждый элемент занимает два байта. Использовать

Page 90: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

стандартные директивы компилятора. */

data segment 'data' ;Сегмент данных

n dw 4 ;Размеры матрицы: число столбцов

m dw 5 ; строк

x dw 1,2,3,4, 5,6,7,8, 9,10,11,12, -8,-7,-6,-5, -4,-3,-2,-1

lnstr dw 8

lnel dw 2

s dw 4 dup(?) ; Массив для сумм столбцов

data ends

stk segment stack 'stack' ;Сегмент стека

dw 100 dup(?)

stk ends

cod segment 'code' ;Кодовый сегмент

sum proc

assume cs:cod,ds:data,ss:stk

mov ax,data ; Позиционируем регистр DS на

mov ds,ax ; сегмент данных

mov cx,n ; Загружаем в CX количество циклов

xor bx,bx ; Очищаем BX

l2: push cx ; Заносим CX в стек

xor si,si ;Устанавливаем в SI 0

xor ax,ax ;Устанавливаем в AX 0

mov cx,m ; Загружаем в CX количество циклов

l1: add ax,x[bx+si] ; В АХ суммируем элементы столбца

add si,lnstr ; Прибавляем к SI восемь байт для перехода

; к следующему элементу столбца

loop l1 ; Уменьшается CX, а потом, если CX не

; равно 0 - переход к метке l1

mov s[bx],ax ; Заносим в S сумму столбца

add bx,lnel ;Прибавляем к BX два байта для адресации

Page 91: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

; следующей суммы и элемента следующего столбца

pop cx ;Извлекаем CX из стека

loop l2 ;Уменьшается CX, а потом, если CX

;не равно 0, то переход к метке l2

mov ax,4c00h ;Функция DOS : завершение выполнения

int 21h ;программы с кодом 0(успешно)

sum endp

cod ends

end sum ; конец модуля и точка входа

Структура СОМ - программы

Различия между программами в ЕХЕ и СОМ форматах следующие.

- Размер программы. Программа в формате ЕХЕ может иметь любой

размер, в то время как СОМ-файл ограничен размером одного сегмента и не

превышает 64 К. Размер СОМ - файла всегда меньше, чем размер

соответствующего ЕХЕ - файла; одна из причин этого - отсутствие в СОМ -

файле 512-байтового заголовка ЕХЕ - файла.

- Сегмент стека. В ЕХЕ - программе определяется сегмент стека, в то

время как в СОМ - программе стек генерируется автоматически в конце

сегмента. Таким образом, при создании ассемблерной программы, которая

будет преобразована в СОМ - файл, объявление стека должно отсутствовать.

- Сегмент данных. В ЕХЕ - программе обычно определяется сегмент

данных, а регистр DS программист инициализирует адресом этого сегмента.

В СОМ - программе все данные должны быть определены в одном общем

сегменте - сегменте кода.

- Инициализация регистров. В ЕХЕ - программе программист должен

выполнить инициализацию регистра DS. Так как в СОМ - программе стек и

сегмент данных явно не определены и являются частями одного общего

сегмента, то эти шаги отсутствуют. Когда СОМ-программа начинает

выполняться, все сегментные регистры содержат адрес PSP - 256 байтовый

блок, который создаётся операционной системой DOS непосредственно

перед СОМ- или ЕХЕ - программой в памяти. Так как адресация начинается

со смещения 100Н от начала PSP и программа загрузчик при выполнении

программы заносит в IP число 100h, то в начале программы необходимо

указать директиву ORG 100H.

Page 92: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

COMMENT /*Пример: l-02-021.asm. Программа типа СОМ. В

кодовом сегменте определена матрица. Матрица записана построчно, под

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

каждой строки матрицы. Использовать упрощённые директивы компилятора.

*/

.model tiny

.code

org 100h ;Стандартный адрес начала кода COM-программы

b1:

jmp continue ;Осуществляется переход к метке continue(обходим данные)

m db 5 ;Размеры матрицы: количество строк,

n db 10 ; столбцов

mt db 0,1,2,3,4,5,6,7,8,9 ; элементы матрицы построчно

db 0,-2,3,4,56,-6,3,3,3

db 1,1,1,1,1,1,1,1,1,1

db -7,-8,-9,-6,-5,-4,-3,-2,-1,-10

db 3,2,1,4,-8,6,6,-5,2,-56

sum dw 5 dup(?) ;Массив для сумм строк

continue:

mov cl,m ;Пересылаем значение M в регистр CL

xor ch,ch ; очищаем ch

lea bx,mt ; загружаем адрес матрицы

xor si,si ;Для индексации сумм

p2:

mov sum[si],0 ;Записываем 0 в SUM[SI]

push cx ;Заносим CX в стек(сохраняем)

mov di,0 ;Для движения по строке матрицы

xor dx,dx ; исключающее ‘или’, если значения бит совпадают,

; то соответствующий бит в DX равен нулю(очистка)

mov cx,n ;Цикл для движения по строке

p1: mov al,[bx+di]

Page 93: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

;Запишем содержимое в памяти по адресу [BX+DI] в AL

cbw ;Расширяем однобайтовое арифметическое

; значение в регистре AL до размеров слова

add dx,ax ;Прибавляем AX к DX

inc di ;Наращиваем DI на единицу, следующий элемент строки

loop p1 ;Уменьшается значение в регистре CX на единицу и,

;если оно не равно нулю, то переход к метке P1

mov sum[si],dx ;Записываем DX в SUM[SI]

add si,2 ;Адресация следующей суммы

add bx,10 ;Адресация начала следующей строки

pop cx ;Извлекаем CX из стека

loop p2 ;Уменьшается значение в регистре CX на единицу и,

;если оно не равно нулю, то переход к метке P2

mov ah, 4ch ;Функция DOS : выход из программы

int 21h

sum endp

end b1

COMMENT /*Пример: Найти сумму элементов столбцов матрицы. Матрица

хранится в кодовом сегменте. Матрица записана построчно, элемент занимает

два байта. Программа типа .COM. Использовать упрощённые директивы. */

.model tiny

.code

org 100h

b: jmp sum

ms db 10, 13, 'Вычисление суммы элементов столбцов',

db 10, 13, '$'

n dw 4 ; число столбцов

m dw 5 ; число строк

x dw 1, 2, 3, 4 ; элементы матрицы

Page 94: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

dw 5, 6, 7, 8

dw 9, 10, 11, 12

dw -8, -7, -6, -5

dw -4, -3, -2, -1

s dw 4 dup(?) ; массив для сумм столбцов

lnstr dw 8 ; длина строки в байтах

lnel dw 2 ; длина одного элемента

sum:

mov ah, 9 ; выводим сообщение

lea dx, ms

int 21h

mov cx, n ; в CX заносим Количество циклов(столбцов)

xor bx, bx ; очищаем BX

l2:

push cx ; заносим в стек CX

xor si, si ; очищаем SI

mov cx, m; в CX заносим Количество циклов(строк)

xor ax, ax ; очищаем AX

l1:

add ax, x[bx+si] ; в AX суммируем элементы столбца

add si, lnstr ; прибавляем к SI 8 и переходим к

; следующему элементу столбца

loop l1 ; уменьшаем на 1 CX, и если он не равен

; нулю, то переходим к метке l1

mov s[bx], ax ; заносим в S[BX] сумму столбца

add bx, lnel ; прибавляем к BX 2 и переходим к

; следующему столбцу

pop cx ; извлекаем из стека CX

loop l2 ; уменьшаем на 1 CX, и если он не равен

; нулю переходим к метке l2

Page 95: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

mov ax, 4c00h ; выход из программы

int 21h

end b

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

1. Вычислить сумму чисел a и b, используя прямую адресацию. Числа

а и в положительные, не большие 9.

2. Вычислить сумму чисел a и b, используя регистровую адресацию.

Результат суммирования вывести на экран.

3. Вычислить сумму чисел a и b, используя регистровую косвенную

адресацию со смещением. Числа не больше девяти, положительные.

Результат суммирования вывести на экран.

4. В сегменте данных дана матрица. Найти сумму элементов

расположенных ниже главной диагонали каждого столбца матрицы,

расположить столбцы в порядке убывания этих сумм.

5. Ввести матрицу с клавиатуры. Найти сумму элементов каждого

столбца матрицы, расположенных выше главной диагонали.

6. Ввести с клавиатуры размерности матриц и элементы матриц.

Перемножить матрицы и результирующую матрицу вывести на

экран.

7. С клавиатуры вводится размерность массива и сам массив чисел.

Найти максимальное и минимальное число и поменять их местами.

8. В сегменте данных имеется матрица. Рассортировать элементы

каждой строки матрицы.

9. В сегменте данных имеется текст. Отыскать в тексте слово.

Вывести на экран полный адрес этого слова.

10. Ввести n(n<=10) строк (строки не более 50 символов). Задается

признак сортировки (1 – по возрастанию, 0 – по убыванию).

Выполнить сортировку строк в соответствии с заданным признаком.

11. В сегменте данных дана матрица. Найти сумму элементов каждого

столбца матрицы, расположенных ниже главной диагонали.

Расположить столбцы матрицы в порядке возрастания этих сумм.

12. Ввести строку чисел, Рассортировать числа в порядке убывания их

значений.

13. В сегменте данных имеется массив чисел, найти максимальный и

минимальный элементы массива. Вывести на экран эти числа и их

индексы.

14. С клавиатуры ввести размерность массива и элементы этого

массива. Найти максимальное и минимальное число и поменять их

местами.

Page 96: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

15. В сегменте данных дана матрица. В каждом столбце найти первый

положительный элемент и первый отрицательный. Поменять

элементы местами.

16. Ввести текст. Рассортировать слова текста в алфавитном порядке.

Вывести их на экран. Исходный текст сохранить.

17. Дана матрица, рассортировать строки матрицы по убыванию

значений элементов последнего столбца.

18. Ввести массив строк, найти слова-палиндромы. Рассортировать их

по алфавиту.

19. Ввести матрицу. В матрице могут быть нулевые элементы. Удалить

строки и столбцы с нулевыми элементами.

20. Дана матрица, рассортировать строки матрицы по возрастанию

значений элементов первого столбца.

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

1. Реализовать программу на языке ассемблера в соответствии с

вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы вставьте в электронный и бумажный отчеты.

Лабораторная работа 16

Процедуры

Цель работы:

Уметь использовать в программах на языке ассемблера процедуры.

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

Процедуры

Довольно часто в программах, особенно больших, приходится

несколько раз решать одну и ту же задачу. Для того чтобы не

выписывать многократно один и тот же программный фрагмент в язык

были включены средства, упрощающие эту задачу - так называемые

процедуры (подпрограммы). Любая процедура представляет собой

некоторую программу в миниатюре, которая, отработав, возвращает

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

программы. Но при этом надо помнить, что сама по себе процедура не

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

случайно не попало управление. Если имеются несколько процедур, то

их обычно располагают рядом либо в конце сегмента кода, либо в

самом начале, перед меткой входа в головной модуль. В больших

программах процедуры часто размещаются в отдельном сегменте кода ( в

другом файле). Ниже указаны места размещения процедур.

Page 97: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

C SEGMENT C SEGMENT CP SEGMENT

START: ... <процедуры> <процедуры>

... START: ... CP ENDS

... ...

<процедуры> ... C SEGMENT

... ... START: ...

... ... ...

C ENDS C ENDS C ENDS

END START END START END START

Обратите внимание, что в языке ассемблера имена и метки, объявленные

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

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

программе. В частности, хотя язык разрешает располагать одну

процедуру внутри другой, но так обычно не делают, так как никакой

выгоды это не дает.

Выполнение процедур

Для улучшения читабельности программ в язык ассемблера были

включены следующие директивы оформления процедур:

<метка> proc <язык> <тип> USES перечисление регистров ; для TASM

… ; тело процедуры

ret

<метка> endp ; конец процедуры

или

<метка> proc <тип> <язык> USES перечисление регистров ; для MASM

… ; тело процедуры

ret

<метка> endp ; конец процедуры

Ассемблер не накладывает на оформление процедуры никаких

ограничений. Командой CALL можно передать управление на адрес любой

группы команд программы и вернуть управление в точку вызова командой

RET, т. е. не использовать директивы proc и endp, а записать метку и

Page 98: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

передать на неё уп- равление командой CALL. Однако, процедура в этом

случае может быть только ближней.

Все операнды в директиве PROC необязательны.

Процедуры могут быть ближними и дальними, поэтому параметр,

<тип> может принимать два значения NEAR и FAR. Если тип указан, то

команды RET в процедуре будут заменены соответственно на RETN и

RETF. Так как в моделях памяти TINY, SMALL, COMPACT, используется

один кодовый сегмент, то в этих моделях по умолчанию используется тип

NEAR.

Операнд <язык> определяет интерфейс процедуры с модулями на

языках высокого уровня. Его использование упрощает реализацию

процедуры, т.к. ряд необходимых для интерфейса действий выполняет

компилятор. Этот вопрос будет рассмотрен дальше в разделе компоновки

модулей на разных языках.

После слова USES следует список регистров, содержимое которых

изменяется в процедуре. В этом случае ассемблер помещает в начало

процедуры команды занесения в стек содержимого этих регистров, а перед

командой RET - код восстановления перечисленных регистров.

Команда CALL передает управление процедуре, сохраняя в стеке

смещение к точке возврата - смещение команды следующей за вызовом

CALL. Команда RET выбирает из стека адрес возврата и передает

управление в точку возврата. Данная команда не изменяет значения бит

регистра флагов.

Команда CALL имеет четыре модификации:

- вызов прямой ближний (в пределах текущего программного

сегмента);

- вызов косвенный ближний;

- вызов прямой дальний ( вызов процедуры, расположенной в

другом

сегменте кода);

- вызов косвенный дальний.

Все модификации имеют одну мнемонику CALL. Во многих

случаях транслятор может сам определить вид вызова по контексту. Когда

это невозможно используются атрибутные операторы:

near ptr - прямой ближний вызов;

far ptr - прямой дальний вызов;

word ptr - косвенный ближний вызов;

dword ptr - косвенный дальний вызов.

Page 99: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Команда CALL прямого ближнего вызова заносит в стек

относительный адрес точки возврата в текущем программном сегменте и

изменяет содержимое IP так, чтобы в нем содержался относительный адрес

точки входа в процедуру в том же программном сегменте.

Команда CALL прямого дальнего вызова заносит в стек два слова -

сначала сегментный адрес текущего программного сегмента(CS), а затем

относительный адрес точки возврата(IP) в текущем программном сегменте.

Модифицируются регистры CS и IP: в CS помещается сегментный адрес

сегмента, в котором размещена вызываемая процедура, а в IP -

относительный адрес точки входа в процедуру в этом сегменте.

Косвенные вызовы отличаются тем, что адрес перехода берется не из

кода команды, а из ячеек памяти. В коде находится информация о том, где

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

адресации.

1. Прямой ближний вызов:

call near ptr proc1 ;Вызов процедуры proc1 из того же

; сегмента, где и команда call

call proc1 ;То же самое

2. Косвенные ближние вызовы:

mov bx,offset proc1 ;bx = адрес процедуры

call [bx] ;Вызов процедуры

adr dw proc1 ;Слово с адресом процедуры( в сегменте данных)

call DS:adr ;Вызов процедуры( это в сегменте кода)

call word ptr adr ;То же самое

;в сегменте данных имеется массив с адресами входа в процедуры:

tbl dw proc1 ;Ячейка с адресом процедуры 1

dw proc2 ;Ячейка с адресом процедуры 2

dw proc3 ;Ячейка с адресом процедуры 3

;в сегменте кода записаны команды:

mov bx,offset tbl ;bx=адрес таблицы с адресами процедур

mov si,2 ;si=смещение к адресу proc2

Page 100: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

call [bx][si] ;Вызов процедуры 2

3. Прямой дальний вызов:

call far ptr proc1 ;Вызов процедуры proc1,

расположенной

; в другом программном сегменте.

4. Косвенный дальний вызов:

;в сегменте данных поле с двухсловным адресом процедуры:

adr dd proc1

; в сегменте кода команды вызова процедуры:

call DS:adr ;Вызов процедуры

call dword ptr adr ;То же самое

;в сегменте данных имеется массив с адресами входа в процедуры:

tbl dd proc1 ;Адрес процедуры proc1

dd proc2 ;Адрес процедуры proc2

dd proc3 ;Адрес процедуры proc3

;в сегменте кода записаны команды:

mov si,offset tbl ;di=адрес таблицы адресов процедур

mov di,8 ;Смещение к адресу proc3

call [si][di] ;Вызов процедуры proc3

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

1. Вычислить сумму чисел a и b, используя прямую адресацию. Числа

а и в положительные, не большие 9. Вычисление выполнить в

процедуре.

2. Вычислить сумму чисел a и b. Суммирование выполнить в

процедуре. Результат суммирования вывести на экран.

3. Головной модуль передает в процедуру два числа. В процедуре

вычисляется сумма этих чисел. Результат суммирования вывести на

экран в головном модуле.

4. В сегменте данных дана матрица. В процедуре вычислить сумму

элементов каждого столбца матрицы, расположенных ниже главной

Page 101: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

диагонали. В другой процедуре расположить столбцы матрицы в

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

5. Ввести матрицу с клавиатуры. В процедуре вычислить сумму

элементов каждого столбца матрицы, расположенных выше главной

диагонали.

6. Ввести с клавиатуры размерности матриц и элементы матриц. В

процедуре перемножить матрицы и результирующую матрицу

вывести на экран в головном модуле.

7. С клавиатуры вводится размерность массива и сам массив чисел. В

процедуре найти максимальное и минимальное число и поменять их

местами.

8. В сегменте данных имеется матрица. В процедуре рассортировать

элементы каждой строки матрицы.

9. В сегменте данных имеется текст. В процедуре отыскать в тексте

заданное слово. Вывести на экран полный адрес этого слова.

10. Ввести n(n<=10) строк (строки не более 50 символов). Задается

признак сортировки (1 – по возрастанию, 0 – по убыванию).

Сортировку выполнять в одной и той же процедуре одними и теми

же командами.

11. В сегменте данных дана матрица. В процедуре найти сумму

элементов каждого столбца матрицы, расположенных ниже главной

диагонали. Во второй процедуре расположить столбцы матрицы в

порядке возрастания этих сумм.

12. Ввести строку чисел, В процедуре рассортировать числа строки в

порядке убывания их значений.

13. В сегменте данных имеется массив чисел. В процедуре найти

максимальный и минимальный элементы массива, вывести на экран

эти числа и их индексы.

14. С клавиатуры ввести размерность массива и элементы этого

массива. В процедуре найти максимальное и минимальное число и

поменять их местами.

15. В сегменте данных дана матрица. В процедуре в каждом столбце

найти первый положительный элемент и первый отрицательный.

Поменять элементы местами.

16. Ввести текст. В процедуре рассортировать слова текста в

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

сохранить.

17. Дана матрица. В процедуре рассортировать строки матрицы по

убыванию значений элементов последнего столбца.

18. Ввести массив строк. В процедуре найти слова-палиндромы.

Рассортировать их по алфавиту.

19. Ввести матрицу. В матрице могут быть нулевые элементы. В

процедуре удалить строки и столбцы с нулевыми элементами.

20. Дана матрица. В процедуре рассортировать строки матрицы по

возрастанию значений элементов первого столбца.

Page 102: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

1. Реализовать программу на языке ассемблера в соответствии с

вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы вставьте в электронный и бумажный отчеты.

Лабораторная работа 17

Связь по данным между модулями

Цель работы:

Уметь создавать проекты из нескольких процедур и осуществлять

передачу данных между модулями.

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

Связь по данным между модулями

При программировании на языках высокого уровня многие элементы

реализации интерфейса между модулями осуществляет компилятор.

Программисту надо лишь записать имя активизируемого модуля и

корректно перечислить передаваемые аргументы. При этом нас не

беспокоит, как процедура начинает работать, как извлекает аргументы и

другие особенности интерфейса: за все это отвечает транслятор. Но при

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

всё взаимодействие между вызывающим модулем и процедурой.

Аргументы в процедуру можно передавать следующими способами:

- передать копию аргумента;

- передать адрес аргумента;

- одновременно используя выше перечисленные способы.

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

создание их копий не требует много времени. Так как передаётся копия

значений, то оригиналы аргументов не изменяются. Этот способ просто

реализуется и требует меньшей затраты времени.

В том случае, когда список аргументов большой, или для размещения

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

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

вариантом – передать адрес аргумента. При больших объёмах передаваемых

аргументов рекомендуется создать блок аргументов, в котором расположить

не сами значения (например, матрицу), а записать адреса массивов, структур,

переменных. В процедуру же передать в качестве аргумента начальный

адрес этого блока.

Иногда при реализации интерфейса используют оба подхода.

Аргументы при вызове процедуры чаще всего размещают:

- на регистрах;

- в глобальных переменных;

- в стеке.

Page 103: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

аргументов и небольшом их размере. В ином случае регистров окажется

недостаточно или сами аргументы не помещаются на регистре (например,

строки, массивы и др.).

Часто аргументы располагают в глобальных переменных, доступ к

которым возможен из разных процедур. Однако, такой подход затрудняет

возможность использования процедуры в других разработках, снижает её

ценность и может привести к трудно уловимым ошибкам. В общем случае

этот вариант невозможно реализовать в рекурсивных процедурах.

Профессиональные программисты обычно передают аргументы

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

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

из стека. Этот вариант используется в рекурсивных процедурах.

Для иллюстрации выше изложенного рассмотрим простой пример

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

выражения c=max(a,b)+max(5,a-1), где все числа — знаковые, размером

в слово. Вычисление max(x,y) реализуем в процедуре, при этом догово-

римся о следующем: первый аргумент «x» основная программа должна

передавать через регистр AX, второй аргумент «y» — через BX,

результат работы функции max() должен возвращаться в регистре AX.

При этих условиях процедура и соответствующий фрагмент основной

программы имеют вид:

max PROC ; процедура: AX=max(AX,BX)

cmp ax,bx

jge L01

mov ax,bx

L01: ret

max ENDP

start: … ; основная программа

mov ax,a ; AX=a

mov bx,b ; BX=b

call max ; AX=max(a,b)

mov c,ax ; c=max(a,b)

mov ax,5 ; AX=5

mov bx,a

dec bx ; BX=a-1

call max ; AX=max(5,a-1)

Page 104: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

add c,ax ; c=max(a,b)+max(5,a-1)

...

end start

Если воспользоваться терминологией языков высокого уровня, то

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

процедуре основная программа вычисляет значения аргументов и

передаёт их процедуре.

Теперь рассмотрим фрагмент программы использующей адрес аргумен-

та, т.е. передачу аргументов по указателю (или ссылке) Возьмем следующую

простую функцию на языке Си, присваивание аргументу значения нуль:

void zero ( int *x) void zero ( int &x)

{ *x=0; } { x=0; }

( по указателю) (по ссылке)

Пусть в программе есть также обращение к ней:

(по указателю) (по ссылке)

... ...

int a, b int a, b

... ...

a = 7; a = 7;

b = 8; b = 8;

zero (&a); zero (a);

zero (&b); zero (b);

...

...

Как видно из примера, функция изменяет значение своего параметра.

В терминах машинного языка присваивание означает лишь запись в

какую-то ячейку памяти, а чтобы записать что-либо в эту ячейку, надо

знать ее адрес. Поэтому процедуре этот адрес должен сообщить

вызывающий её модуль. Таким образом, передача параметров по ссылке

означает передачу адреса ячейки, соответствующей фактическому

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

регистр адрес аргумента, а процедура использует его в своих командах.

Регистр может быть любой, но лучше, если это будет регистр-

модификатор: BX, BP, SI, DI.

Page 105: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Пусть для нашей процедуры zero () мы выбрали регистр BX. Это

означает, что в начале её выполнения он будет содержать адрес той

ячейки, содержимое которой надо изменить. В подобной ситуации

добраться до содержимого этой ячейки можно с помощью [BX].

С учетом всего сказанного получаем следующий фрагмент основной

программы, соответствующей обращениям zero (a), zero (b) и следующую

процедуру zero ().

zero PROC ; вход в процедуру zero

mov [bx],0 ; BX = адрес x

ret

zero ENDP

... ; основная программа

mov bx, OFFSET a ;загружаем смещение переменной А

call zero

mov bx, OFFSET b ; загружаем смещение переменной В

call zero

...

Аналогичным образом передаются и аргументы структурированных

типов данных: массивы, структуры и др.

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

1. Передача аргументов выполняется через стек. В процедуру

передается адрес матрицы, размеры матрицы, вывести матрицу на экран.

Числа в матрице не большие 99

2. В процедуру через стек передаётся строковая запись числа. Требуется

перевести её из строки в число и возвратить число на регистре.

Предполагается, что строка состоит только из цифр, число положительное.

3. В головном модуле вводится строка, являющаяся записью

десятичного числа. В процедуру через стек передаётся адрес строки в

регистре BX. Используя операции сдвига, преобразовать строку в число и

вернуть его в регистре DX. Признак конца строки является любой знак

отличный от цифры, например, код клавиши Enter. Предполагается, что

число положительное, не больше 32767, иначе надо использовать регистры

dx, ax для результата.

4. Ввести массив строк. В процедуру через стек передаётся адрес

массива строк. В процедуре вывести их на экран в порядке возрастания

Page 106: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

количества символов в строке. В начале строки вывести ее длину.

Количество вводимых строк не больше 50, длина строки не больше 80.

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

языка.

5. В процедуру через стек передаётся адрес арифметического

выражения. В процедуре проверить правильность расстановки скобок

выражении. В случае успеха, выражение занести в массив, подсчитать

количество правильных выражений. После окончания работы произвести

очистку массива.

6. В сегменте данных определены числа в формате двойного слова. С

клавиатуры вводится число. В процедуру через стек передаётся данное число

и программа определяет, имеется ли данное число в сегменте данных.

7. Программа демонстрирует использование стека. Для простоты

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

9, результаты вычислений не выводятся. В память числа записываются в два

байта. В головном модуле вводится количество элементов массива (1-9) и

массив цифр. В процедуру передаётся в качестве параметра область памяти,

содержащая указатели (адреса) на входные данные и адреса памяти для

возврата результатов. Процедура вычисляет сумму элементов массива,

определяет максимальный элемент и его индекс и записывает результаты по

заданным адресам.

8. Программа вычисляет значение заданного элемента ряда Фибоначчи.

В ряде Фибоначчи каждый следующий элемент равен сумме двух

предыдущих. Значения первых элементов ряда: 1, 1, 2, 3, 5, 8, 13, …

Процедура FIB принимает параметры через стек: сначала num - порядковый

номер элемента ряда, затем res - адрес переменной, куда будет записан

результат.

9. Программа через стек передает в процедуру адрес размещения

арифметического выражения. Процедура проверяет правильность

расстановки скобок в арифметическом выражении используя рекурсию.

10. В сегменте данных дана матрица. Программа через стек передает

в процедуру адрес размещения матрицы. В процедуре вычислить сумму

элементов каждого столбца матрицы, расположенных ниже главной

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

убывания этих сумм.

11. Ввести матрицу с клавиатуры. Программа через стек передает

в процедуру адрес размещения матрицы. В процедуре вычислить сумму

элементов каждого столбца матрицы, расположенных выше главной

диагонали.

12. Ввести с клавиатуры размерности матриц и элементы матриц.

Программа через стек передает в процедуру размерности матриц и адреса

размещения матриц. В процедуре перемножить матрицы и результирующую

матрицу вывести на экран в головном модуле.

13. С клавиатуры вводится размерность массива и сам массив чисел.

Программа через стек передает в процедуру размер массива и адрес массива

Page 107: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

В процедуре найти максимальное и минимальное число и поменять их

местами.

14. В сегменте данных имеется текст. Программа через стек передает

в процедуру адрес текста. В процедуре отыскать в тексте заданное слово.

Вывести на экран полный адрес этого слова.

15. Ввести n(n<=10) строк (строки не более 50 символов). Программа

через стек передает в процедуру адрес массива строк. В процедуре задается

признак сортировки (1 – по возрастанию, 0 – по убыванию). Сортировку

выполнять в одной и той же процедуре одними и теми же командами.

16. В сегменте данных дана матрица. Программа через стек передает

в процедуру адрес матрицы. В процедуре найти сумму элементов каждого

столбца матрицы, расположенных ниже главной диагонали. Во второй

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

17. Ввести строку чисел, Программа через стек передает в процедуру

адрес строки. В процедуре рассортировать числа строки в порядке убывания

их значений.

18. В сегменте данных имеется массив чисел. Программа через стек

передает в процедуру адрес массива. В процедуре найти максимальный и

минимальный элемент массива, вывести на экран эти числа и их индексы.

19. С клавиатуры ввести размерность массива и элементы этого

массива. Программа через стек передает в процедуру размерность массива и

адрес массива. В процедуре найти максимальное и минимальное число и

поменять их местами.

20. В сегменте данных дана матрица. Программа через стек передает

в процедуру адрес матрицы. В процедуре в каждом столбце найти первый

положительный элемент и первый отрицательный. Поменять элементы

местами.

21. Ввести текст. Программа через стек передает в процедуру адрес

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

порядке. Вывести их на экран. Исходный текст сохранить.

22. Дана матрица. Программа через стек передает в процедуру адрес

матрицы. В процедуре рассортировать строки матрицы по убыванию

значений элементов последнего столбца.

23. Ввести массив строк. Программа через стек передает в процедуру

адрес массива строк. В процедуре найти слова-палиндромы. Рассортировать

их по алфавиту.

24. Ввести матрицу. В матрице могут быть нулевые элементы.

Программа через стек передает в процедуру адрес матрицы. В процедуре

удалить строки и столбцы с нулевыми элементами.

25. Дана матрица. Программа через стек передает в процедуру адрес

матрицы. В процедуре рассортировать строки матрицы по возрастанию

значений элементов первого столбца.

26. В сегменте данных имеется матрица. Программа через стек

передает в процедуру адрес матрицы. В процедуре рассортировать элементы

каждой строки матрицы.

Page 108: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

1. Реализовать программу на языке ассемблера в соответствии с

вариантом задания.

2. Подготовить отчет на бумаге и в электронном виде.

3. Копию программы вставьте в электронный и бумажный отчеты.

Лабораторная работа 18

Интерфейс модулей на языке ассемблера с модулями на языке Си

Цель работы:

Уметь проектировать программы, состоящие из модулей на языке

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

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

Интерфейс модулей на языке ассемблера с модулями на языке Си

Одна из часто встречающихся задач профессионального

программирования - это совместное использование модулей написанных на

языке высокого уровня и на языке ассемблера. Модули на ассемблере

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

невозможно реализовать без использования ассемблера, либо его применение

повышает эффективность работы программы.

Имеется два варианта совместного использования модулей на языке Cи

и на языке ассемблера:

- Использование в тексте Си-функции непосредственно ассемблерных

инструкций или, как говорят, встроенного (inline) ассемблера. Команды

ассемблера (или машинные коды) в тексте программы на языке Си без

изменения включаются в формируемый компилятором объектный код. Эта

форма удобна, если надо вставить небольшой фрагмент.

- Использование внешних процедур и функций. Эта форма

комбинирования имеет ряд преимуществ:

-написание и отладку программ можно производить независимо;

-отлаженные модули можно использовать в других проектах;

-облегчается модификация и сопровождение программ.

Рассмотрим эти способы объединения модулей более подробно.

Page 109: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Использование встроенного ассемблера

Любая строка Си-программы начинающаяся с ключевого слова asm и

оканчивающаяся символом ';' или символом перевода строки

рассматривается как инструкция на ассемблере.

Для встроенного ассемблера разрешается использовать:

- Исполняемые инструкции (машинные команды);

- Цепочные примитивы (инструкции манипуляции последовательно

расположенными байтами или словами) с префиксом повторения и без него;

- Все инструкции передач управления (jump, call, loop, ret, iret ) с

прямой или косвенной адресацией;

- Директивы описания и определения данных (db, dw, dd, extrn).

Для встроенного ассемблера нельзя использовать директивы,

управляющие его работой: ASSUME, SEGMENT, ENDS, PROC, ENDP,

ORG и т.д., а также имя группы DGROUP, имена сегментов _TEXT,

_STACK, _DATA и т.п.

При задании операндов в ассемблерных инструкциях разрешается

ссылаться на уже описанные в Си переменные: имена функций, поля

структурных переменных и объединений, метки, имена переменных и др.

Группа инструкций на ассемблере, заключенная в фигурные скобки, не

требует повторения перед каждой из них ключевого слова "asm".

COMMENT /* Пример: Программа выполняет суммирование двух

целых чисел. Ввод и вывод чисел реализуется на языке Си, а сложение чисел

- на ассемблере. */

#pragma inline /* эта директива указывает компилятору на то,

что в программе есть ассемблерные строки */

#include <stdio.h>

void main()

{

int i, j, s;

puts ("Введите значения i и j: ");

Page 110: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

scanf ("%d%d",&i,&j); /* ввод значений i и j */

asm {

push ax bx // значение регистров ax и bx помещаются в стек

mov ax,i /* в ах заносится введенное значение i */

mov bx,j /* в bx заносится введенное значение j */

add ax,bx /* сумма ax и bx сохраняется в ax */

mov s,ax /* содержимое ax записывается в s */

pop bx /* из стека восстанавливаются */

pop ax /* содержимое регистров ax и bx */

}

printf ("\n i + j = %d ",s); /* вывод результата */

}

Вызов ассемблерной процедуры из Си-функции

В данном параграфе рассматривается общая схема построения

ассемблерной процедуры, которая вызывается из Си-функции. Функция

передаёт через стек в процедуру аргументы и получает в точке возврата

значение того или иного типа. Компоновку модулей можно выполнять

одним из ниже описанных способов:

1. Ассемблерные процедуры и Си-функции объединяются сов-

местно, используя файл- проект. В этом случае в файл-проекте

перечисляются имена Си-функций и имена объектных модулей, полученных

после трансляции модулей на ассемблере с помощью TASM.EXE;

2. Альтернативный вариант - компиляция из командной строки.

Модули компилируются отдельно, а затем выполняется их сборка. Для этого

необходимо:

- Выполнить трансляцию модуля на Си и получить объектный

модуль:

bcc -c prog1.c

- Выполнить трансляцию модуля на ассемблере:

tasm /mx prog2.asm (действие опции /mx рассмотрено ниже)

- Выполнить объединение объектных модулей:

Page 111: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

bcc -ms prog1.obj prog2.obj

Исполняемому модулю будет присвоено имя prog1.exe. Параметр -ms

определяет модель памяти.

Предполагается, что функция main реализуется на языке Си.

Кроме того, ассемблерная процедура должна удовлетворять ниже

перечисленным требованиям:

- Гарантировать получение необходимой информации редактором

связей;

- Обеспечить получение значений аргументов, переданных ей при

вызове, и видимость всех внешних переменных;

- Должно соблюдаться соответствие моделей памяти, используемых

при компиляции Си-функции и при обработке ассемблерных процедур. В

этой связи ассемблерная процедура должна:

- использовать правила именования сегментов, принятые в Turbo C;

в Си и в Ассемблере необходимо использовать одну и ту же модель

памяти;

- явно описывать все глобальные и внешние идентификаторы;

- поддерживать принятую в Си последовательность передачи аргу-

ментов и возврата значений в точку вызова.

В общем случае процедура на ассемблере строиться по такой схеме:

.model small

.stack ;сегмент стека

.data ;сегмент инициализируемых данных модуля

. . .

.data? ;сегмент не инициализируемых данных модуля

. . .

.code ; кодовый сегмент модуля без директив описания

. . .

end ; директива завершения модуля

Все внешние переменные, на которые ссылается ассемблерная

Page 112: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

процедура, и описанные в Си-функциях как внешние, должны объявляться в

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

extrn имя_переменной: тип

где "тип" определяет тип внешней переменной (byte, word, dword и т.д.).

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

сформировал соответствующую машинную команду. Действительные адреса

будут вычислены на этапе редактирования, когда будут разрешаться внешние

ссылки.

Если имеются переменные, описанные в ассемблерном модуле, значения

которых используются в Си-функции, то они в ассемблерном модуле

объявляются с атрибутом public:

public имя_переменной

Имя ассемблерной процедуры, вызываемой из Си, в ассемблерном

модуле должно описываться как public, что делает это имя видимым при

редактировании связей.

Turbo C накладывает определенные ограничения на запись имен

переменных и функций, вытекающие из особенностей работы компилятора и

компоновщика.

Во-первых, при объявлении внешнего идентификатора, в том числе и

имен функций, которые по умолчанию являются внешними, компилятор Си

автоматически добавляет символ подчеркивания "_" перед именем. В таком

виде имя сохраняется в объектном модуле. В то же время ассемблеры TASM

и MASM не добавляют символ подчеркивания. Таким образом, внешние

идентификаторы в ассемблерном модуле должны иметь лидирующий символ

подчеркивания, если Си-модуль компилируется с добавлением

подчеркивания, и не должны содержать его в противном случае. Еще раз

подчеркнем, что все сказанное относится только к внешним

идентификаторам. Внутренние переменные и процедуры на ассемблере

могут иметь любые имена.

Во вторых, компилятор TURBO C для всех внешних идентификаторов

сохраняет регистр букв, т.е. является " регистро чувствительным" (case

sensitive), и такое поведение Си-компилятора невозможно изменить. В то же

Page 113: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

время TASM и MASM при записи внешних идентификаторов в объектном

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

преобразовываются в большие. Такое поведение по умолчанию можно

переопределить, используя при компиляции опцию /mx. Таким образом, на

этапе компиляции сохраняется регистр букв глобальных идентификаторов.

Последнее, что необходимо учитывать при разработке процедуры

на ассемблере, вызываемой из Си функции, относится к передаче параметров

через стек и возврату значений в точку вызова.

Передача данных из программы на языке высокого уровня в

некоторую процедуру на языке Ассемблера может осуществляться двумя

способами: принятым в Паскале, т. е. в стек аргументы помещаются

последовательно, как они перечислены в списке вызова процедуры, или

как в Си, т. е. в обратном порядке (последний аргумент посылается в

стек первым, а первый – последним). Пусть из модуля на Си вызывается

ассемблерная процедура:

extern void asm1(int *i, int *j, long l);

void main(void)

{ int i=15, j=35;

long l=0x23456789;

asm1(&i, &j,l);

}

Если явно не указывается, как будут передаваться параметры, то

по умолчанию они передадутся по способу принятому в языке Си (в

стек посылается l, затем j, а последним i).

Для выше приведенного модуля будет создан следующий

ассемблерный код (для малых моделей памяти):

push bp

mov bp, sp ; в bp записывается указатель на вершину стека

sub sp, 8 ; выделить место под локальные переменные

; будут посланы в стек

Page 114: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

mov word ptr [bp-2], 15 ; Записывается в стек i

mov word ptr [bp-4], 35 ; Записывается в стек j

mov word ptr [bp-8], 6789

mov word ptr [bp-6], 2345 ; В стек записывается l

push word ptr [bp-6]

push word ptr [bp-8]

; Подготовка к вызову ассемблерной процедуры:

;в стек помещаются аргументы

lea ax, [bp-4] ; Получаем в ax адрес j

push ax ; Посылаем в стек адрес j

lea ax, [bp-2] ; Получаем в ax адрес i

push ax ; Посылаем в стек адрес i

call asm1 ; Вызов Ассемблерной процедуры

add sp,8 ; освобождаем стек от аргументов

mov sp, bp ; Восстанавливаем указатель стека

pop bp

"Паскалевский" способ передачи аргументов: в языке Pascal

процедуры и функции также получают значения из стека, ссылаясь на

регистр bp:

а) числовые параметры: чтобы передать целочисленный параметр,

Pascal выталкивает его в стек, прежде чем вызвать процедуру, которая в

нем нуждается. Например, вызов PROCEDURE Count (I:Integer)

реализуется следующим образом:

mov ax, [I]

push ax

call Count

Page 115: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Состояние стека при запуске Count:

Нижние адреса памяти

sp2 [bp] 0 Старый bp–регистр

sp1 [bp+2] 2 Адрес возврата

sp0 [bp+4] 4 Переменная I

Верхние адреса памяти

В процедуре на ассемблере можно так обратиться непосредственно к

значению переменной I:

1) inc [word bp+4] ; I := I+1

2) mov ax, [word bp+4] ; ax := I

б) предположим, что в ассемблерную процедуру передаётся адрес

аргумента:

PROCEDURE Count (VAR I:Integer);

Если предположить, что I храниться в сегменте данных программы,

то инструкции для вызова Count могут быть следующими:

mov di, offset I ; Получение смещения переменной I

push ds ; В стек адрес сегмента, хранящего I

push di ; В стек смещение переменной I

call Count ; Вызов процедуры Count

Page 116: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Состояние стека при запуске Count:

Нижние адреса памяти

sp3 [bp] 0 Старый bp-регистр

sp2 [bp+2] 2 Адрес возврата

sp1 [bp+4] 4 Адрес переменной I (смещение)

sp0 [bp+6] 6 Адрес переменной I (сегмент)

Верхние адреса памяти

Извлечение аргументов из стека может быть реализовано одним из

следующих вариантов:

1) mov es, [word bp+6] ; Получение значения сегмента

mov di, [word bp+4] ; Получение значение смещения

2) les di, [bp+4] ; Загрузка es:di значением адреса I

mov ax, [word es:di] ; Загрузка значения I в ax

В случае Си – способа передачи информации ассемблерная

процедура завершается командой ret, а в паскалевском – ret const. При

выходе из процедуры указатель вершины стека смещается на количество

байт, занимаемых аргументами (const). В языке Pascal процедуры и функции

не могут иметь переменного списка аргументов, т.е. в стеке аргументы всегда

занимают одно и то же пространство. Поэтому стек от аргументов

«освобождает» вызванная процедура, увеличивая вершину стека на const

байт. Так как в языке Си реализованы функции с переменным числом

параметров, то количество аргументов в стеке известно лишь вызывающей

функции, на которую и возлагается задача очистки стека, поэтому процедура

завершается ret. В точке возврата должны быть команды освобождения

стека от аргументов. Для этого рекомендуется нарастить указатель стека (sp)

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

аргументами.

Page 117: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

COMMENT /* Пример: Программа на языке Си выводит

символ заданное количество раз с определенной позиции на экране.

Все числовые аргументы определяются в программе на Си,

а вывод осуществляет процедура на ассемблере. */

Головной модуль на Си:

#include <stdio.h>

#include <conio.h>

extern “c” void asmproc (char ch, unsigned x, unsigned y, unsigned kol);

/*процедура asmproc объявлена внешней. Параметр “c” определяет

порядок занесения аргументов в стек. В данном случае реализуется

порядок, принятый в языке Си.*/

void main (void)

{

clrscr(); /*очистка экрана */

asmproc('a',2,3,5); /*вызов внешней функции */

asmproc('s',9,2,7); /*вызов внешней функции */

}

Вызываемая процедура на ассемблере(имя исходного файла может

быть любым, но лучше asmproc.asm):

.model small

.stack 100h

public _asmpro ; процедура _asmproc объявлена глобальной (внешней)

.code

_asmproc proc near

push bp ; код пролога

mov bp, sp ;настройка на вершину стека

mov ax, [bp+8]

mov dh, al ; номер строки для вывода символа y=3(2) - в dh

mov ax, [bp+6]

Page 118: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

mov dl, al ; номер столбца для вывода символа x=2(9) - в dl

mov ah, 02h ; номер функции BIOS (позиционирование курсора)

int 10h ; вызов прерывания BIOS

mov ax, [bp+4] ; символ ch в al='а'(s)

mov bl, 07h ; атрибут символа

xor bh, bh ; страница

mov cx, [bp+10] ; кол-во раз повторения символа kol - в cx=5(7)

mov ah, 09h ; вывод символа из al на экран

int 10h

pop bp ; код эпилога

ret ; возврат в вызывающую процедуру

_asmproc endp

end ; нет точки входа т.к. вызывается из Си

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

реализуется через стек. При вызове функции (процедуры), в стек

копируются значения аргументов. В соответствии с принятыми в языке Си

соглашениями эти значения помещаются в стек справа налево по сравнению

с порядком их следования в операторе вызова функции (процедуры). Затем в

стек помещается адрес точки возврата. Количество байт выделяемых в стеке

для сохранения адреса возврата зависит от выбранной модели памяти:

- tiny, small, compact - 2 байта;

- medium, large, huge - 4 байта.

Page 119: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Содержимое стека в момент передачи управления процедуре _asmproc

(для ближнего типа процедур - near) показано ниже.

0000:0000 Младшие

адреса

оперативной

памяти

0000:0000 Младшие

адреса

оперативной

памяти

ss:sp

ss:bp

bp

ss:sp IP +2 IP

ch +4 сh

x +6 x

y +8 y

kol +10 kol

ss: Дно стека

ss: Дно стека

А) Б)

Содержимое стека при передаче управления из Си в Asm:

А). Содержимое стека после вызова _asmproc;

Б). Содержимое стека перед выборкой аргументов из стека.

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

пролога сохранять, а при своём завершении восстанавливать содержимое

всех используемых регистров, за исключением тех, в которых возвращается

результат выполнения процедуры.

Так как регистр sp нельзя модифицировать, то для доступа в стеке к

значениям аргументов необходимо использовать регистр bp. Для этого в

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

пролога”:

push bp ; сохраняет в стеке текущее значение bp

mov bp, sp ; устанавливает bp на вершину стека

Page 120: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Выполнение этих двух команд обеспечивает сохранение содержимого

регистра bp и запись в этот регистр адреса вершины стека. После этого

доступ к значениям аргументов в стеке осуществляется по смещению

относительно содержимого bp.

Например:

mov ax,[bp+4] ; переслать копию значения ch из стека в ax

mov cx,[bp+10] ; кол-во раз повторения символа kol - в cx

Перед завершением процедуры необходимо выполнить “код эпилога”:

- Во первых, записать содержимое bp в sp командой mov sp,bp. Это

действие восстанавливает в sp значение, которое было на момент входа в

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

если в процедуре резервировалось место в стеке для временного хранения

результатов промежуточных вычислений. В нашем примере стек

использовался только для передачи аргументов, поэтому выше указанная

команда отсутствует.

- Во вторых, восстановить сохраненное в стеке содержимое регистра bp

командой - pop bp.

Для передачи данных между модулями на языке Си и языке ассемблера

рекомендуется использовать директиву arg. Это избавляет от необходимости

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

позволяет обращаться к ним непосредственно по имени. Тогда выше

приведенную процедуру можно записать так:

_asmproc proc near

arg ch : word; x : word; y : word; kol : word

push bp

mov bp, sp

mov dh, byte ptr [y];номер строки для вывода символа y=3(2) - в dh

mov dl, byte ptr [x]; номер столбца для вывода символа x=2(9) - в dl

mov ah, 02h ; номер функции BIOS (позиционирование курсора)

int 10h ; вызов прерывания BIOS

Page 121: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

mov ax, [ch] ; символ ch в al='а'(s)

mov bl, 07h ; атрибут символа

xor bh, bh ; страница

mov cx, [kol] ; кол-во раз повторения символа kol - в cx=5(7)

mov ah, 09h ; вывод символа из al на экран

int 10h

pop bp ; код эпилога

ret ; возврат в вызывающую процедуру

_asmproc endp

end ; нет точки входа т.к. вызывается из Си

Кроме того, для упрощения связей между модулями целесообразно

использовать операнды в директиве model. В этой директиве можно задать

как модель памяти, так и сообщить о соблюдении соглашений языка Си о

вызове процедур.

.model small, c

Эта директива говорит о том, что данный модуль на языке ассемблера

будет объединяться с модулем на Си в соответствии с соглашениями языка

Си. Тогда:

- Перед именами всех внешних процедур будет автоматически

добавлен символ подчеркивания “_”, поэтому делать это программисту не

требуется;

- Можно объявить аргументы процедуры непосредственно в директиве

proc:

asmproc proc near ch:byte, x:word, y:word, kol:word

- Автоматически генерируется код пролога и эпилога в процедуре на

ассемблере;

- Для доступа к аргументам, объявленным в proc, можно использовать

их имена.

Рассмотрим, как изменится модуль на языке ассемблера по сравнению

с предыдущим вариантом при использовании описанного выше варианта

Page 122: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

директивы model. Вызываемая процедура на ассемблере:

.model small, c

.stack 100h

public asmproc

.code

asmproc proc near c : byte, x : word, y : word, kol : word

mov dh, byte ptr y

mov dl, byte ptr x

mov ah,02h

int 10h

mov ah,09h

mov al,c

mov bl,07h

xor bh,bh

mov cx,kol

int 10h

ret

asmproc endp

end

Рассмотрим вопрос передачи результатов из процедуры на ассемблере в

вызывающую функцию на языке Си.

В ниже приведенной таблице перечислены типы возвращаемых

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

Тип возвращаемого

значения (Си)

Куда поместить

результат?

unsigned char al

Page 123: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

char al

enum ax

unsigned short ax

short ax

unsigned int ax

int ax

unsigned long dx:ax

long dx:ax

yказатель near ax

указатель far dx:ax

Передача результатов из процедуры в функцию на языке Си

Значения типов float, double и long double возвращаются во внутреннем

регистре сопроцессора 80x87, соответствующему текущему значению стека

сопроцессора (регистр ST(0)). При эмуляции сопроцессора возвращаемое

значение помещается в регистр, который эмулирует ST(0). Вызывающая

функция затем копирует возвращаемое значение тогда, когда оно требуется.

Структурные переменные длиной один байт возвращаются в al, длиной в 2

байта - в ax, а длиной 4 байта - в регистрах dx : ax. Если длина структурной

переменной 3 байта или больше 5, возвращаемое значение записывается в

статическую память и возвращается указатель на неё (ax - для младших

моделей памяти, dx : ax - для старших моделей).

COMMENT /*Рассмотрим пример, в котором процедура на ассемблере

вычисляет сумму элементов массива. В процедуру передается адрес массива

и его длина. Результат возвращается в вызывающую программу на Си. */

#include <stdio.h> // Головной модуль на Си

extern int sum_asm( int mas[], int count); /* процедура sum_asm

внешняя */

Page 124: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

void main()

{

int mas[5]={1,2,3,4,5}; // элементы массива

int len =5, sum; // количество элементов и их сумма

sum=sum_asm(mas,len); //вызов внешней процедуры и

//помещение результата в sum

printf(“ %d \n”, sum);

return;

}

.model small ; Вызываемый модуль на ассемблере

.stack 100h

public _sum_asm;процедура _sum_asm видима в вызывающем модуле

.code

_sum_asm proc c near adr_mas : word, len_mas : word ; опция ‘c’

; сообщает, что коды пролога и эпилога создаются компилятором

xor ax, ax ; очистка регистра для суммы

mov cx, len_mas ; в cx - длина массива

mov si, adr_mas ;в si - адрес массива

m: add ax, [si] ; суммирование элементов массива

add si, 2 ; адресовать следующий элемент

loop m

ret ; выход из функции. Результат - в ax

_sum_asm endp

end ;точка входа отсутствует, т.к. модуль вызывается из Си

Вызов функции Си из программы на языке ассемблера

Необходимость вызова Си-функций из ассемблерной процедуры, как

правило, возникает при использовании библиотечных функций Turbo C.

Page 125: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

При вызове из ассемблерной процедуры библиотечных функций Turbo C

следует иметь в виду одно важное обстоятельство. Как правило, эти функции

ссылаются на внешние переменные, инициализируемые программой-

загрузчиком C0x.OBJ, или предполагают наличие тех или иных условий,

создаваемых функциями программы загрузчика: состояние процессора

80x87, режим работы видеоадаптера, состояние памяти и т.п. Выполнение

всех этих действий средствами ассемблерной процедуры вряд ли оправдано.

Поэтому рекомендуемым способом построения ассемблерных процедур,

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

разрабатывается головная функция main(), содержащая единственную

строку - вызов ассемблерной процедуры. Ассемблерная процедура

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

модулю через файл проекта. Из ассемблерной процедуры может вызываться

любая библиотечная функция Turbo C или Си-функция, в теле которой

имеется обращение к библиотечным функциям. Выполнив компиляцию и

компоновку файл - проекта, получим объединённый исполняемый модуль.

Так как ассемблерная процедура будет вызываться из Си-функции, она

должна удовлетворять общей схеме рассмотренной выше. Кроме того,

ассемблерная процедура, вызывающая Си-функцию, должна удовлетворять

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

Имя вызываемой Си-функции должно быть описано как near или far

указатель на функцию директивой:

extrn имя_функции: {far | near}

Тип указателя должен соответствовать модели памяти, которая

использовалась при компиляции Си-функции. Например, если планируется

использовать в ассемблерной процедуре функцию printf() из библиотеки

функций для моделей памяти tiny, small или compact, в ассемблерный

модуль помещается строка:

extrn _printf: near

Имя функции записывается с лидирующим символом подчеркивания

строчными буквами. Сказанное относится к библиотечным функциям Turbo

C. Затем перед вызовом функции в стек помещаются аргументы,

необходимые для ее работы. После возвращения управления в точку вызова

Page 126: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

вызывающая процедура должна очистить стек от параметров.

COMMENT /* Рассмотрим пример программы на языке ассемблера,

которая вводит две строки, используя библиотечную функцию языка Си

gets(), затем выполняет их сравнение с помощью функции strcmp() и

выводит результат на экран. */

#include <stdio.h> /* подключаемые библиотеки */

#include <string.h>

extern void asmproc(void); /* объявление внешней процедуры */

void main()

{

asmproc(); /* вызов процедуры на ассемблере */

}

.model small ; Модуль на ассемблере

.stack 100h

.data

str1 db 20 dup(?) ; резервируем место для первой строки

str2 db 20 dup(?) ; резервируем место для второй строки

mes1 db 10,13,'Введите 2 строки:',10,13,'$'

mes2 db 'Строка1 < Строки 2! $' ; сообщения

mes3 db 'Строка1 > Строки 2! $' ; о результатах

mes4 db 'Строки равны! $' ; сравнения строк

public _asmproc ; процедура _asmproc теперь

; видима в вызывающем модуле

.code

extrn _strcmp:near ; библиотечные функции языка Си объявляются

extrn _gets:near; внешними. Используется ближний вызов (модель small)

_asmproc proc

mov ax,@data ; настройка сегментного регистра ds

mov ds,ax ; на сегмент данных

Page 127: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

mov ah,9 ; выводим сообщение о вводе строк

lea dx,mes1

int 21h

lea ax,str1 ; помещаем в стек адрес первой строки

push ax ; (по которому функция gets() введёт строку)

call _gets ; вызываем библиотечную функцию gets(),

;выполняющую ввод строки

add sp,2 ; освобождаем стек от параметра

lea ax,str2 ; то же самое для второй строки

push ax

call _gets

add sp,2

lea ax,str1 ; помещаем в стек адреса первой и

;второй строк соответственно

push ax

lea ax,str2

push ax

call _strcmp ; вызываем функцию сравнения строк strcmp()

add sp,4 ; освобождаем стек от параметров

mov bx,ax ; результат сравнения - из ax в bx

mov ah,9

cmp bx,0 ; сравниваем его с нулем

je m2 ; если результат сравнения - 0, то строки равны

jl m1 ; если меньше нуля - первая строка больше второй

lea dx,mes2 ; иначе вторая строка больше первой

int 21h ; выводим соответствующее сообщение

jmp e ; идём на выход

m1: lea dx,mes3 ; выводим соответствующее сообщение

jmp e

Page 128: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

m2: lea dx,mes4 ; выводим соответствующее сообщение

int 21h

e: ret ; конец процедуры. Возврат в функцию на Си.

_asmproc endp

end

Варианты заданий 1. В программе на языке Си вводится массив строк, далее символы

каждой строки сортируется по алфавиту функцией на языке Ассемблера,

затем в модуле на СИ строки в массиве сортируются в порядке возрастания

длины строки, причем длина строк определяется ассемблерной функцией.

2. В программе на языке Си вводится массив строк, в каждой из

которых содержится произвольное показание системных часов; далее строки

поочередно обрабатываются процедурой на Ассемблере: если значения

минут в момент обработки строки совпадает со значением секунд в

переданной строке, то значение времени в массиве обнуляется. Затем в

программе на Си строки сортируются по возрастанию.

3. В модуле на Си ввести матрицу, элементы матрицы строки

знаков (длина строки - не более 50 знаков). Рассортировать все строки

матрицы в алфавитном порядке, перемещая указатели на них. В процедуре на

Ассемблере, используя функцию 9h int 21h вывести все строки на экран.

Параметры передавать через стек.

4. В модуле на Си ввести матрицу целых чисел. (Количество строк

в матрице - не более 10, количество столбцов – не более 15). В процедуре на

Ассемблер, получив исходную матрицу, на старом месте построить новую

матрицу из исходной: все элементы новой матрицы должны быть

рассортированы в порядке возрастания. Во второй процедуре на Ассемблере

определить строку с максимальной суммой элементов. Номер строки и сумму

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

5. В модуле на Си ввести массив из 'К’ знаков (‘K’<=50).

Реализовать процедуру на ассемблере с переменным числом параметров.

Первый параметр задает количество параметров в списке; процедура

сортирует некоторые знаки массива в порядке возрастания в исходном

массиве (элементы из массива в списке могут идти в любом порядке) .

Преобразованный массив вывести в модуле на Си.

Page 129: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

6. В процедуре на ассемблере ввести массив строк ( признак

конца ввода – пустая строка). Строк не более 100, длина строки не более 60

знаков. Из процедуры на Ассемблере вызвать функцию на Си и в ней создать

динамический массив структур. Элементами структуры являются : длина

строки, указатель на её размещение в процедуре на Ассемблере, порядковый

номер строки в исходном массиве. В функции на Си рассортировать

структуры в алфавитном порядке строк и вывести строки в исходной

процедуре на Ассемблере. Глобальные переменные и упрощенные директивы

не использовать. Из модуля в модуль передавать не более пяти слов через

стек.

7. Модуль на Си вводит массивы чисел типа int или long.

Массивов не более пяти, чисел в массиве не более 100, признак конца

массива число 0. В функцию на Ассемблере передается тип данных (0 – int,1-

long), массив, куда поместить результаты, и исходные массивы. Признаком

конца списка параметров является NULL. В данной функции на Ассемблере

найти сумму элементов каждого массива и вывести в головном модуле.

8. В модуле на Си создать массив структур (не более 11).

Элементами структуры являются номер отдела, текстовая строка (длина

строки не более 100 символов), массив указателей на массивы целых чисел,

задающих потребность отделов в деталях (числа могут быть

положительными, отрицательными и нулевыми). Размерность массивов – не

более 10 элементов. В текстовой строке сначала следуют числа, задающие

позицию, с которой начинается наименование детали, длину этого

наименования, затем другая информация. Слова в строке разделены одним

или несколькими пробелами. В модуль на Ассемблере передается указатель

на массив целых чисел. В этом модуле сегменты стека и данных отсутствуют.

В модуле вывести сообщение о том, что модуль работает, а на месте

исходного массива создать новый такой, чтобы в начале шли положительные

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

положительных и отрицательных чисел в своих группах сохранить. Новых

массивов не создавать. Вывести массив в модуле на Ассемблере в 16-ричной

системе счисления, а в модуле на Си вывести наименование детали и

преобразованные массивы в 10-тичной системе счисления.

9. В модуле на Си ввести матрицу целых чисел. Размеры

матрицы – не более 7*10. Преобразовать числа в строки, рассортировать

полученные строки в алфавитном порядке. В модуль на Ассемблере передать

массив строк и в нем вывести 5 строк, находящихся в середине массива.

Page 130: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Глобальные переменные, системные функции (кроме ввода-вывода) не

использовать.

10. В модуле на Си ввести матрицу строк. Размерность матрицы –

не более 10*15, длина строк – не более 50 знаков. Используя массив

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

перемещая указатели на них. В процедуре на Ассемблере, используя

функцию 9h и прерывание int 21h вывести строки на экран. Передачу

параметров в процедуру осуществлять через стек.

11. В модуле на Си ввести матрицу структур. Размеры матрицы –

не более10*15. Элементами структуры являются массив целых чисел (не

более 50 элементов), строка знаков (не более 25 символов), число, задающее

длину массива чисел. В модуле на Си из каждой строки матрицы вывести

массив целых чисел, принадлежащих структуре, и первую по алфавиту

строку знаков. В модуле на Ассемблере в каждом массиве найти

максимальное число и вывести его и в модуле на ассемблере, и в модуле на

Си.

12. В модуле на Си ввести матрицу целых чисел. Размеры

матрицы не более чем 7Х10 (могут быть меньше). Преобразовать числа в

строки. Рассортировать полученные строки в алфавитном порядке. В модуль

на ассемблере используя регистры, передать массив строк и его длину и

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

вывести в нем, используя 21-ое прерывание, 5 строк находящихся в середине

массива. Глобальных переменных, системных функций, за исключением

ввода/вывода, не использовать.

13. С клавиатуры вводится информация о сотрудниках. Всего

сотрудников 25, длина информации об одном сотруднике 80 знаков.

Признак конца информации об одном сотруднике знак «@», выделенный

пробелами, конца всей информации – «!». Информация о сотруднике

включает фамилию, имя, отчество и зарплату по месяцам (их не более 12).

Рассортировать исходный список сотрудников по сумме полученной

зарплаты и, используя прерывание 9h, вывести его в модуле на ассемблере. В

модуль на ассемблере через регистры передать список сотрудников и его

длину. Ввод информации вывести в одном модуле, сортировку во втором.

14. Находясь в первом модуле, написанном на Cu, вывести строку

записанную во втором модуле, реализованном на Ассемблере. Вызвать из

первого модуля второй. Во втором перемножить, заранее введенные в

первом модуле, матрицы.

Page 131: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

15. В модуле на Ассемблере, используя библиотечные функции

языка Си, считать массив строк (размер задается с клавиатуры).

Рассортировать массив строк по возрастанию в модуле на Ассемблере

(сравнение строк производить в функции на Си, передавая адреса

сравниваемых строк через область межзадачных связей). Строки вывести на

экран, используя видеобуфер. (Записать возможные варианты

ассемблирования и компоновки модулей).

16. В модуле на Си в командной строке задается размер

динамического массива данных (типа int). В модуле на Ассемблере строковое

представление размера массива перевести в число и передать его в модуль на

Си для выделения памяти под массив, вернуть адрес выделенного массива в

модуль на Ассемблере. В модуле на Ассемблере, используя библиотечные

функции языка Си, заполнить массив (ввод с клавиатуры), через стек

передать в процедуру на Ассемблере адрес массива и рассортировать его.

Вывести на экран произведение первого и последнего элементов

отсортированного массива. (Записать возможные варианты ассемблирования

и компоновки модулей).

17. В модуле на языке C ввести размеры матрицы, затем

элементы этой матрицы – целые числа. Матрица размещается в памяти

динамически. В каждой строке матрицы определить число, символьное

представление которого минимально. Обратиться в процедуру на языке

Assembler, в которой необходимо вывести символическое представление

найденных чисел на экран и завершить программу на Assembler. Параметры

в процедуру передаются через стек.

18. Ввести два массива чисел. Для каждого числа из второго

массива найти наиболее близкое число из первого массива. Для

поиска использовать бинарное дерево. Результаты вывести в порядке

возрастания, используя бинарное дерево. Головной модуль на Си. Ввод

массивов на Си. Создание бинарного дерева на Си. Сортировку второго

массива реализовать на ассемблере. Поиск по дереву реализовать на

ассемблере. Вывод реализовать на ассемблере, используя библиотечные

функции Си.

19. Ввести массив чисел. Для каждого числа этого массива

найти минимальное число являющееся перестановкой его

десятичных цифр. Полученные цифры вывести в порядке их возрастания,

используя бинарное дерево. Головной модуль на Си. Ввод массива на Си.

Преобразование массива реализовать на ассемблере. Создание бинарного

дерева на Си. Вывод реализовать на ассемблере, используя библиотечные

функции Си.

Page 132: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

20. Ввести массив чисел. Создать 2 дерева: 1ое дерево из чисел

являющимися степенью двойки; 2ое - из чисел не являющихся

степенью двойки. В первом дереве вывести все листья в порядке

возрастания. Во втором все узлы третьего уровня в порядке убывания.

Головной модуль на Си. Ввод массива на Си. Функцию проверки, является

ли число степенью двойки реализовать на ассемблере, а создание деревьев

на Си. Вывод реализовать на ассемблере, используя библиотечные

функции Си.

21. Ввести N двумерных массивов чисел одинаковой

размерности. Найти те числа, которые при определённых координатах I, j

во всех массивах равны. Найденные числа вывести в порядке возрастания

их значений, используя дерево. Головной модуль на Си. Ввод массивов на

Си. Поиск чисел реализовать на ассемблере, а создание дерева на Си.

Вывод реализовать на ассемблере без использования рекурсии.

22. Ввести массив чисел. Создать односвязный список,

элементами которого являются числа из массива, причём, если очередное

число массива простое, то оно добавляется в конец списка, иначе – в

начало. Вывести список в следующем порядке: первый элемент сначала,

второй с конца, третий сначала ... Головной модуль на Си. Ввод массива на

Си. Проверка является ли число простым реализовать на ассемблере, а

создание списка реализовать на Си. Вывод реализовать на ассемблере,

используя библиотечные функции Си.

23. Ввести строку. Определить частоту встречаемости слов, которые

слева и справа читаются одинаково. Для расчёта использовать двусвязный

список. Вывести в алфавитном порядке три самых часто встречаемых слова,

а в порядке обратном алфавитному- три редко встречаемых слова.

Головной модуль на Си. Ввод строки на Си. Создание двусвязного списка

на Си. Проверка читается ли слово слева и справа читаются одинаково

реализовать на ассемблере. Поиск по списку также на ассемблере.

24. В командной строке задаётся имя текстового файла.

Необходимо подсчитать частоту встречаемости букв в тексте. Для расчёта

использовать ХЭШ таблицу, реализованную в виде массива стеков.

Вывести в порядке убывания. Буквы, которые ни разу не встретились не

выводить. Добавление в стек на Си. Добавление в Хэш таблицу реализовать

на ассемблере. Сортировку и вывод также реализовать на ассемблере.

25. Ввести массив строк. Из каждой строки убрать минимальное

число букв так, чтобы строка стала палиндромом. Строки в

лексикологическом порядке записать в список. В том же порядке их

рекурсивно вывести. Головной модуль на Си. Ввод строки на Си.

Page 133: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Преобразование реализовать на ассемблере. Добавление в список на Си.

Просмотр реализовать на ассемблере.

26. Ввести массив структур. Элементами структуры являются

указатель на очередь, указатель на функцию с переменным числом

параметров (* func) (char *str, …) и строка знаков (<10). Элементом

очереди может быть число типа int, long, double или указатель на

строку символов. Необходимо все элементы очереди подать в

функцию с переменным числом параметров. Порядок следования

параметров определяется строкой знаков, находящейся в каждой

структуре массива структур. Эта строка подаётся а функцию с

переменным числом параметров. Каждый символ строки соответствует

определённому типу данных ( 'i' - int, 'l' - long, 'd' - double, ' s' – char ).

Необходимо для каждой структуры из массива структур вызвать

функцию с переменным числом параметров, функция выводит все

поданные в неё параметры. Ввод массива структур на Си. Функцию с

переменным числом параметров реализовать на ассемблере с

использованием библиотечных функций Си. Вызов функции с переменным

числом параметров реализовать на ассемблере.

27. Головной модуль на Си вводит массив арифметических выражений со

скобками. В процедуру на Ассемблере подается число строк и указатель на

массив. Процедура рекурсивно проверяет правильность расстановки скобок и

используя стандартные функции языка Си выводит выражение и результат

проверки.

28. Головной модуль на Ассемблере, используя библиотечные функции Си,

вводит арифметическое выражение. Вызываемая процедура на Си

анализирует правильность расстановки скобок и возвращает результат

проверки в модуль на Ассемблере, который выводит результат.

29. Головной модуль на С. Вводится матрица чисел (5х5). В процедуре на

ассемблере найти сумму элементов каждой строки матрицы. В исходном

модуле вывести строки матрицы в порядке убывания значения сумм

(исходную матрицу сохранить, в процедуру подавать данные как один

параметр). Программу завершить в модуле на ассемблере.

30. Головной модуль реализовать на ассемблере. В головном модуле

вводится массив слов (не более девяти). В рекурсивной функции на Си

определить слова палиндромы и вывести их в головном модуле. Функции

ввода-вывода использовать scanf-printf.

Page 134: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

31. Состыковка Си с Ассемблером. На Си создается дерево. В рекурсивной

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

стандартные функции вывода С.

32. Состыковка Си с Ассемблером. В головном модуле на ассемблере

вводится массив “n” строк. В рекурсивной функции на Си проверяется, не

является ли поданная строка палиндромом (читается в обе стороны

одинаково). Результатом является текстовая строка, передаваемая в модуль

на ассемблере (там её вывести). Можно использовать стандартные функции

ввода/вывода Си.

33. В функции main() вводится размерность массива и сам массив. Затем

вызывается функция сортировки массива по возрастанию. В функции

используется встроенный ассемблер. В программе реализуется метод

сортировки Шелла.

34. В головном модуле на С вводится матрица чисел (5х5). В процедуре на

ASM найти сумму элементов каждой строки матрицы. В исходном модуле

вывести строки матрицы в порядке убывания значения сумм (исходную

матрицу сохранить, в процедуру подавать данные как один параметр).

Программу завершить на ASM.

35. Головной модуль на Cи вводит m - количество строк и сами строки. В

рекурсивной процедуре на asm определить, какие из этих строк являются

палиндромами. Результат вывести в main. В процедуру передавать только

один параметр.

36. В процедуре на ассемблере, используя функции языка Cи, ввести “n”

массивов чисел типа int. Первый элемент массива – количество чисел в

массиве. В модуле на Си рассортировать числа в порядке убывания и

вывести элементы, также используя модуль на Cи.

37. Из main вызывается модуль на ASM, в котором вводится массив строк.

Строк не более десяти, длина строки не более восьмидесяти знаков. Из

модуля на ASM вызывается рекурсивный модуль rekurs_polindrom на Си, в

котором определяется, является ли поданная строка палиндромом.

38. В ассемблерном модуле ввести массив из n - строк, в рекурсивной

функции на С проверить не является ли очередная подаваемая строка

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

ASM. Для ввода используются стандартные функции ввода языка Си.

Page 135: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

4 УПРАВЛЯЕМАЯ САМОСТОЯТЕЛЬНАЯ РАБОТА

СТУДЕНТОВ

Отчет по УСРС должен включать (2-ой семестр):

1) Титульный лист.

2) Материал, раскрывающий тему.

3) Литература (список используемых источников).

Общий объем – до 30 печатных листов.

Выбор варианта по каждой части УСРС осуществляется по номеру в

журнале.

Теоретические вопросы

1. События. Генерация событий.

2. Создание обобщенных классов.

3. Средства обобщенных классов. Значения по умолчанию,

ограничения, наследование.

4. Обобщенные интерфейсы.

5. Обобщенные методы.

6. Обобщенные делегаты.

7. Списки. Создание списков. Добавление элементов.

8. Списки. Удаление элементов.

9. Списки. Поиск элемента.

10. Стек.

11. Очередь.

12. Связные списки.

13. Сортированные списки.

14. Словари. Тип ключа.

15. Словари с множественными ключами.

Литература:

Нейгел К.и др. С# 2005 для профессионалов. –М.: Издательский дом

«Вильямс», 2007. – 1376 с.

Разработка программ

1. Полную структуру классов и их взаимосвязь продумать

самостоятельно. Все данные в классе закрытые.

2. Для работы с полями использовать: методы, полный вариант свойств,

сокращенный вариант свойств.

3. В головном модуле реализовать меню с пунктами: создать массив,

ввести данные в массив, вывести содержимое массива, удалить

заданный элемент, рассортировать элементы массива.

4. Методы для обработки объектов массива реализовать в отдельном

классе.

Page 136: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

5. Для абстрактного класса (интерфейса) определить, какие методы

должны быть абстрактными, а какие обычными.

Вариант 1

1. Создать базовый класс «Фирма» с полем: адрес фирмы.

2. Создать производные классы: Свободное ПО(название, производитель),

Условно-бесплатное ПО(название, производитель, дата установки, срок

бесплатного использования), Коммерческое По (название,

производитель, цена, дата установки, срок использования) со своими

методами вывода информации на экран, и определения возможности

использования на текущую дату.

3. Создать базу (массив) из n видов программного обеспечения, вывести

полную информацию из базы на экран, а также организовать поиск

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

текущую дату.

Вариант 2

1. Создать базовый класс «Man» с полем: адрес человека.

2. Создать производные классы: Абитуриент (фамилия, дата рождения,

факультет), Студент (фамилия, дата рождения, факультет, курс),

Преподаватель (фамилия, дата рождения, факультет, должность, стаж),

со своими методами вывода информации на экран, и определения

возраста.

3. Создать базу (массив) из n персон, вывести полную информацию из

базы на экран, а также организовать поиск персон, чей возраст

попадает в заданный диапазон.

Вариант 3

1. Создать базовый класс «Издательство» с полем: адрес издательства.

2. Создать производные классы: Книга (название, фамилия автора, год

издания, издательство), Статья (название, фамилия автора, название

журнала, его номер и год издания), Электронный ресурс (название,

фамилия автора, ссылка, аннотация) со своими методами вывода

информации на экран.

3. Создать каталог (массив) из n изданий, вывести полную информацию из

каталога, а также организовать поиск изданий по фамилии автора.

Вариант 4

1. Создать базовый класс «Транспорт» с полем: адрес автопарка.

2. Создать производные классы: Автомашина (марка, номер, скорость,

грузоподъемность); Мотоцикл (марка, номер, скорость,

грузоподъемность, наличие коляски, при этом если коляска

Page 137: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

отсутствует, то грузоподъемность равна 0); Грузовик (марка, номер,

скорость, грузоподъемность, наличие прицепа, при этом если есть

прицеп, то грузоподъемность увеличивается в два раза) со своими

методами вывода информации на экран, и определения

грузоподъемности.

3. Создать базу (массив) из n машин, вывести полную информацию из

базы на экран, а также организовать поиск машин, удовлетворяющих

требованиям грузоподъемности.

Вариант 5

1. Создать базовый класс «Фигура» с полем: название функции.

2. Создать производные классы: Line (y=кx+b), Kub (y=kx2+bx+c), Parabola

(y=кx2 +c) с методами вычисления значения в заданной точке.

3. Создать массив n функций и вывести полную информацию о значении

данных функций в точке х.

Вариант 6

1. Создать базовый класс «Магазин» с полем: адрес магазина.

2. Создать производные классы: Продукт (название, цена, дата

производства, срок годности); Партия (название, цена, количество шт,

дата производства, срок годности); Комплект (названия, цена, перечень

продуктов) со своими методами вывода информации на экран, и

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

3. Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск просроченного товара (на

момент текущей даты).

Вариант 7

1. Создать базовый класс «Магазин» с полем: адрес магазина.

2. Создать производные классы: Игрушка (название, цена, производитель,

материал, возраст, на который рассчитана); Книга (название, автор,

цена, издательство, возраст, на который рассчитана); Спорт- инвентарь

(название, цена, производитель, возраст, на который рассчитана), со

своими методами вывода информации на экран, и определения

соответствия искомому типу.

3. Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск товаров определенного

типа.

Вариант 8

1. Создать базовый класс «Справка» с полем: адрес.

Page 138: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

2. Создать производные классы: Персона (фамилия, номер телефона);

Организация (название, телефон, факс, контактное лицо); Друг

(фамилия, номер телефона, дата рождения) со своими методами вывода

информации на экран, и определения соответствия искомому типу.

3. Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск в базе по фамилии.

Вариант 9

1. Создать базовый класс «Фигура» с полем: название функции.

2. Создать производные классы: Rectangle (прямоугольник), Circle (круг),

Triangle (треугольник) со своими методами вычисления площади и

периметра.

3. Создать массив из n фигур и вывести полную информацию о фигурах

на экран.

Вариант 10

1. Создать базовый класс «Клиент» с полем: адрес человека.

2. Создать производные классы: Вкладчик (фамилия, дата открытия

вклада, размер вклада, процент по вкладу); Кредитор (фамилия, дата

выдачи кредита, размер кредита, процент по кредиту, остаток долга);

Организация (название, дата открытия счета, номер счета, сумма на

счету) со своими методами вывода информации на экран, и

определения соответствия дате (открытия вклада, выдаче кредита,

открытия счета).

3. Создать базу (массив) из n клиентов, вывести полную информацию из

базы на экран, а также организовать поиск клиентов, начавших

сотрудничать с банком в заданную дату.

Вариант 11

1. Создать базовый класс «Фирма» с полем: адрес фирмы.

2. Создать производные классы: Отдел (название, количество

сотрудников, дата создания); Сотрудник (фамилия, год рождения,

адрес) со своими методами ввода и вывода информации на экран.

3. Создать базу (массив) из n фирм, вывести полную информацию из базы

на экран, а также организовать поиск заданного отдела и вывести

информацию о нем.

Вариант 12

1. Создать базовый класс «Город» с полем: наименование города.

2. Создать производные классы: Вуз (название, количество

специальностей, дата создания); Специальность (название, количество

Page 139: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

студентов, дата открытия); Студент (фамилия, адрес) со своими

методами ввода и вывода информации на экран.

3. Создать базу (массив) из n городов, вывести полную информацию из

базы на экран, а также организовать поиск заданной специальности.

Вариант 13

1. Создать базовый класс «Библиотека» с полем: наименование

библиотеки.

2. Создать производные классы: Отдел (название, количество книг, дата

создания); Книга (название, цена, количество) со своими методами

ввода и вывода информации на экран.

3. Создать базу (массив) из n библиотек, вывести полную информацию из

базы на экран, а также организовать поиск заданной книги.

Вариант 14

1. Создать базовый класс «Аэропорт» с полем: название аэропорта.

2. Создать производные классы: Самолет (тип самолета, количество мест,

срок эксплуатации); Рейс (название, цена билета, количество рейсов,

время полета) со своими методами ввода и вывода информации на

экран.

3. Создать базу (массив) из n аэропортов, вывести полную информацию из

базы на экран, а также организовать поиск самолетов с истекшим

сроком эксплуатации (на момент текущей даты).

Вариант 15

1. Создать базовый класс «Аптека» с полем: адрес аптеки.

2. Создать производные классы: Лекарство (название, цена, дата

производства, срок годности), Фирма (название, страна, дата

основания), Замена (список равнозначных лекарств) со своими

методами ввода и вывода информации на экран, и определения

соответствия сроку годности.

3. Создать базу (массив) из n аптек, вывести полную информацию из базы

на экран, а также организовать поиск просроченного лекарства (на

момент текущей даты).

Вариант 16

1. Создать базовый класс «Город» с полем: название города.

2. Создать производные классы: Магазин (название, адрес, количество

отделов); Отдел (название, количество наименований инструмента,

дата создания отдела); Инструмент (название, цена, количество) со

своими методами ввода и вывода информации на экран.

Page 140: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

3. Создать базу (массив) из n городов, вывести полную информацию из

базы на экран, а также организовать поиск указанного инструмента.

Вариант 17

1. Создать базовый класс «Больница» с полем: адрес больницы.

2. Создать производные классы: Отделение (название, дата открытия,

количество мест, количество сотрудников); Операция (название,

стоимость, длительность операции) со своими методами ввода и

вывода информации на экран.

3. Создать базу (массив) из n больниц, вывести полную информацию из

базы на экран, а также организовать поиск информации о заданной

операции.

4.

Отчет по УСРС должен включать (3–ий семестр):

Теория (блок вопросов )

Выбор варианта по каждой части УСРС осуществляется по номеру в

журнале.

Теоретические вопросы

1. Отражение. Ядро подсистемы отображения: класс System.Type.

Использование отражения. Получение информации о методах. Вызов

методов с помощью средства отражения.

2. Атрибуты. Основы применения атрибутов. Создание атрибута.

Присоединение атрибута. Получение атрибутов объекта. Сравнение

позиционных и именованных параметров.

3. Использование встроенных атрибутов. Атрибут Attribute Usage.

Атрибут Conditional. Атрибут Obsolete.

4. Коллекции. Интерфейсы коллекций. Интерфейс ICollection. Интерфейс

IList. Интерфейс IDictionary. Интерфейсы IEnumerable, IEnumerator и

IDictionary Enumerator. Интерфейс IComparer.

5. Классы коллекций общего назначения. Класс Array List. Сортировка

Array List-массивов и выполнение поиска.

6. Создание обычного массива из динамического. Класс Hashtable.

Класс SortedList. Класс Stack. Класс Queue .

7. Специализированные коллекции. Доступ к коллекциям с помощью

нумератора. Использование нумератора. Использование интерфейса

IDictionaryEnumerator.

8. Хранение в коллекциях классов, определенных пользователем.

Реализация интерфейса IComparable. Использование интерфейса

IComparer.

9. Сеть. Internet. Члены пространства имен System.Net.Универсальные

идентификаторы ресурсов. Основы Internet-доступа. Класс WebRequest.

Класс WebResponse.

Page 141: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

10. Классы HttpWebRequest и HttpWeb Response. Обработка сетевых

ошибок. Исключения, генерируемые методом Create( ).

11. Исключения, генерируемые методом GetReponse( ). Исключения,

генерируемые методом GetResponseStream( ).

12. Обработка исключений. Класс URI. Доступ к дополнительной HTTP-

информации. Доступ к заголовку. Доступ к cookie-данным.

Использование свойства LastModified

13. Создание компонентов. Компонентная модель. Контейнеры и узлы.

Сравнение С#- и СОМ-компонентов.

14. Интерфейс IComponent. Класс Component. Простой компонент.

15. Компиляция компонента CipherLib. Клиент, использующий

компонент CipherComp. Переопределение метода Dispose( ).

16. Использование метода Dispose(bool). Защита освобожденного

компонента от использования.

17. Контейнеры. Использование контейнера.

18. Обзор сборок .NET.

19. Средства для работы с базами данных.

20. Загрузка сборки. Применение позднего связывания.

21. Загрузка сборки. Применение позднего связывания.

22. Доступ к данным при помощи ADO.NET.

Разработка программ

1. Полную структуру классов и их взаимосвязь продумать

самостоятельно.

2. Для абстрактного класса (интерфейса) определить, какие методы

должны быть абстрактными, а какие обычными.

Задание 1

Вариант 1

1. Создать абстрактный класс «Prog» с методами, позволяющими вывести

на экран информацию о программном обеспечении, а также определить

соответствие возможности использования (на момент текущей даты).

2. Создать производные классы: Свободное ПО(название, производитель),

Условно-бесплатное ПО(название, производитель, дата установки, срок

бесплатного использования), Коммерческое По (название,

производитель, цена, дата установки, срок использования) со своими

методами вывода информации на экран, и определения возможности

использования на текущую дату.

3. Создать базу (массив) из n видов программного обеспечения, вывести

полную информацию из базы на экран, а также организовать поиск

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

текущую дату.

Page 142: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Вариант 2

1. Создать абстрактный класс «Stud» с методами, позволяющими вывести

на экран информацию о персоне, а также определить ее возраст (на

момент текущей даты).

2. Создать производные классы: Абитуриент (фамилия, дата рождения,

факультет), Студент (фамилия, дата рождения, факультет, курс),

Преподаватель (фамилия, дата рождения, факультет, должность, стаж),

со своими методами вывода информации на экран, и определения

возраста.

3. Создать базу (массив) из n персон, вывести полную информацию из

базы на экран, а также организовать поиск персон, чей возраст

попадает в заданный диапазон.

Вариант 3

1. Создать абстрактный класс «Издание» с методами позволяющими

вывести на экран информацию об издании, а также определить

является ли данное издание искомым.

2. Создать производные классы: Книга (название, фамилия автора, год

издания, издательство), Статья (название, фамилия автора, название

журнала, его номер и год издания), Электронный ресурс (название,

фамилия автора, ссылка, аннотация) со своими методами вывода

информации на экран.

3. Создать каталог (массив) из n изданий, вывести полную информацию из

каталога, а также организовать поиск изданий по фамилии автора.

Вариант 4

1. Создать абстрактный класс «Avto» с методами позволяющими вывести

на экран информацию о транспортном средстве, а также определить

грузоподъемность транспортного средства.

2. Создать производные классы: Легковая_машина (марка, номер,

скорость, грузоподъемность), Мотоцикл (марка, номер, скорость,

грузоподъемность, наличие коляски, при этом если коляска

отсутствует, то грузоподъемность равна 0), Грузовик (марка, номер,

скорость, грузоподъемность, наличие прицепа, при этом если есть

прицеп, то грузоподъемность увеличивается в два раза) со своими

методами вывода информации на экран, и определения

грузоподъемности.

3. Создать базу (массив) из n машин, вывести полную информацию из

базы на экран, а также организовать поиск машин, удовлетворяющих

требованиям грузоподъемности.

Page 143: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Вариант 5

1. Создать абстрактный класс «Function» с методом вычисления значения

функции y=f(x) в заданной точке.

2. Создать производные классы: Line (y=кx+b), Kub (y=kx2+bx+c), Parabola

(y=кx2 +c) со своими методами вычисления значения в заданной точке.

3. Создать массив n функций и вывести полную информацию о значении

данных функций в точке х.

Вариант 6

1. Создать абстрактный класс «Tovar» с методами, позволяющим вывести

на экран информацию о товаре, а также определить, соответствует ли

она сроку годности на текущую дату.

2. Создать производные классы: Продукт (название, цена, дата

производства, срок годности), Партия (название, цена, количество шт,

дата производства, срок годности), Комплект (названия, цена, перечень

продуктов) со своими методами вывода информации на экран, и

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

3. Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск просроченного товара (на

момент текущей даты).

Вариант 7

1. Создать абстрактный класс «Tovar» с методами, позволяющими

вывести на экран информацию о товаре, а также определить,

соответствует ли она искомому типу.

2. Создать производные классы: Игрушка (название, цена, производитель,

материал, возраст, на который рассчитана), Книга (название, автор,

цена, издательство, возраст, на который рассчитана), Спорт-инвентарь

(название, цена, производитель, возраст, на который рассчитана), со

своими методами вывода информации на экран, и определения

соответствия искомому типу.

3. Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск товаров определенного

типа.

Вариант 8

1. Создать абстрактный класс «Телефонный справочник » с методами,

позволяющими вывести на экран информацию о записях в телефонном

справочнике, а также определить соответствие записи критерию

поиска.

2. Создать производные классы: Персона (фамилия, адрес, номер

телефона), Организация (название, адрес, телефон, факс, контактное

Page 144: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

лицо), Друг (фамилия, адрес, номер телефона, дата рождения) со

своими методами вывода информации на экран, и определения

соответствия искомому типу.

3. Создать базу (массив) из n товаров, вывести полную информацию из

базы на экран, а также организовать поиск в базе по фамилии.

Вариант 9

1. Создать абстрактный класс Figure с методами вычисления площади и

периметра, а также методом, выводящим информацию о фигуре на

экран.

2. Создать производные классы: Rectangle (прямоугольник), Circle (круг),

Triangle (треугольник) со своими методами вычисления площади и

периметра.

3. Создать массив n фигур и вывести полную информацию о фигурах на

экран.

Вариант 10

1. Создать абстрактный класс Klient с методами, позволяющими вывести

на экран информацию о клиентах банка, а также определить

соответствие клиента критерию поиска.

2. Создать производные классы: Вкладчик (фамилия, дата открытия

вклада, размер вклада, процент по вкладу), Кредитор (фамилия, дата

выдачи кредита, размер кредита, процент по кредиту, остаток долга),

Организация (название, дата открытия счета, номер счета, сумма на

счету) со своими методами вывода информации на экран, и

определения соответствия дате (открытия вклада, выдаче кредита,

открытия счета).

3. Создать базу (массив) из n клиентов, вывести полную информацию из

базы на экран, а также организовать поиск клиентов, начавших

сотрудничать с банком в заданную дату.

Вариант 11

1. Создать абстрактный класс «Фирма» с методами, позволяющими

вывести на экран информацию о фирме, а также определить, сколько в

фирме отделов.

2. Создать производные классы: Отдел (название, количество

сотрудников, дата создания), Сотрудник (фамилия, год рождения,

адрес) со своими методами ввода и вывода информации на экран.

3. Создать базу (массив) из n фирм, вывести полную информацию из базы

на экран, а также организовать поиск заданного отдела и вывести

информацию о нем.

Page 145: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

Вариант 12

1. Создать абстрактный класс «Город» с методами, позволяющими

вывести на экран информацию о городе, а также определить, сколько в

нем вузов.

2. Создать производные классы: Вуз (название, количество

специальностей, дата создания), Специальность (название, количество

студентов, дата открытия), Студент (фамилия, адрес) со своими

методами ввода и вывода информации на экран.

3. Создать базу (массив) из n городов, вывести полную информацию из

базы на экран, а также организовать поиск заданной специальности.

Вариант 13

1. Создать абстрактный класс «Библиотека» с методами, позволяющими

вывести на экран информацию о библиотеке, а также определить,

сколько в ней книг.

2. Создать производные классы: Отдел (название, количество книг, дата

создания), Книга (название, цена, количество шт) со своими методами

ввода и вывода информации на экран.

3. Создать базу (массив) из n библиотек, вывести полную информацию из

базы на экран, а также организовать поиск заданной книги.

Вариант 14

1. Создать абстрактный класс «Аэропорт» с методами, позволяющими

вывести на экран информацию об аэропорте, а также определить,

сколько в нем самолетов.

2. Создать производные классы: Самолет (тип самолета, количество мест,

срок эксплуатации), Рейс (название, цена билета, количество рейсов,

время полета) со своими методами ввода и вывода информации на

экран.

3. Создать базу (массив) из n аэропортов, вывести полную информацию из

базы на экран, а также организовать поиск самолетов с истекшим

сроком эксплуатации (на момент текущей даты).

Вариант 15

1. Создать абстрактный класс «Аптека» с методами, позволяющими

вывести на экран информацию о лекарстве, а также определить,

соответствует ли оно сроку годности на текущую дату.

2. Создать производные классы: Лекарство (название, цена, дата

производства, срок годности), Фирма (название, страна, дата

основания), Замена (список равнозначных лекарств) со своими

методами ввода и вывода информации на экран, и определения

соответствия сроку годности.

Page 146: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

3. Создать базу (массив) из n аптек, вывести полную информацию из базы

на экран, а также организовать поиск просроченного лекарства (на

момент текущей даты).

Вариант 16

1. Создать абстрактный класс «Город» с методами, позволяющими

вывести на экран информацию об инструменте.

2. Создать производные классы: Магазин (название, адрес, количество

отделов), Отдел (название, количество наименований инструмента,

дата создания отдела), Инструмент (название, цена, количество) со

своими методами ввода и вывода информации на экран.

3. Создать базу (массив) из n городов, вывести полную информацию из

базы на экран, а также организовать поиск указанного инструмента.

Вариант 17

1. Создать абстрактный класс «Больница» с методами, позволяющими

вывести на экран информацию о больнице.

2. Создать производные классы: Отделение (название, дата открытия,

количество мест, количество сотрудников), Операция (название,

стоимость, длительность операции) со своими методами ввода и

вывода информации на экран.

3. Создать базу (массив) из n больниц, вывести полную информацию из

базы на экран, а также организовать поиск информации о заданной

операции.

Задание 2

1. В предыдущих заданиях предусмотреть обработку исключительных

ситуаций. Реализовать базовый класс исключений и многоуровневую

иерархию производных классов с использованием наследования (выход

индекса за пределы массива, неправильный аргумент у функции и др.)

Полную структуру классов и их взаимосвязь продумать

самостоятельно.

2. Продемонстрировать использование делегатов.

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

Задании необходимо выполнить в двух вариантах: первый вариант –

работа с текстовым файлом; второй вариант – работа с бинарным

файлом (сериализация объектов, десериализация).

Page 147: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

1. Создать файл, содержащий список членов некоторого клуба. Реализовать функции

вывода содержимого файла на экран, добавления в файл новых членов и удаления тех, кто

вышел из состава клуба.

2. Создать файл с информацией о студентах. Записи файла включают: номер курса, номер

группы, Ф. И. O., номер зачетки и результаты сессии. По запросу с клавиатуры выполнить

сортировку списка:

а) по алфавиту;

б) по номерам зачетных книжек;

в) по результатам сессии.

3. Создать файл-справочник, содержащий наименование товара и его стоимость. По

запросу с клавиатуры выполнить сортировку:

а) по наименованию товара;

б) по стоимости.

Реализовать функции изменения содержимого файла.

4. Создать файл-справочник. Записи файла содержат: фамилию автора, наименование

книги и год издания. Создать файлы, объединяя в них работы одного автора,

упорядоченные по годам.

5. Создать файл, записи которого содержат прогноз погоды на текущий квартал. По

запросу с клавиатуры вывести на экран:

а) справку-прогноз на указанный день недели по всему кварталу;

б) перечень дней с температурой в заданном диапазоне.

6. Создать файл. Записи файла содержат Ф. И. 0. студента и его адрес. По запросу с

клавиатуры:

а) вывести адрес соответствующего студента;

б) ВЫВЕСТИ содержимое записи, номер которой задается с клавиатуры;

в) определить порядковый номер записи в файле;

г) определить смещение указанной записи от начала файла;

д) определить смещение указанной записи от конца файла.

7. С клавиатуры вводится имя файла, содержащего информацию о жителях района (Ф. И.

0., жилая площадь и количество человек). Написать программу, которая:

а) сортирует файл по величине жилой площади, приходящейся на одного человека;

б) добавляет, удаляет записи;

в) выводит на экран содержимое файла.

8. В записях файла заданы:

- наименование сельскохозяйственной культуры;

- имя файла, в котором хранится информация о выращивании культуры;

- имя файла, в котором хранится информация о борьбе с вредителями данной культуры.

В программе надо реализовать следующие операции:

а) корректировку информации во всех трех файлах;

б) вывод по запросу требуемой информации.

9. Составить программу учета наличия хозяйственных товаров в магазине: учет

количества товаров; список всех товаров; поступление товаров; выдача товаров; выдача

справки о конкретном товаре.

Page 148: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

10. В записях файла хранятся наименование магазина, его номер, адрес, а также имя файла,

в котором хранится информация об имеющихся в нем книгах (количество, стоимость,

издательство). Программа реализует следующие операции: выдачу справок, учет продажи

и поступления книг, а также поиск требуемых книг.

11. Имеется файл, в котором находятся: номер группы, Ф. И. О. студентов и название

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

вывод списков литературы и студентов; списка студентов, получивших данную книгу.

Обеспечить вывод Ф. И.О. студентов, которые просрочили срок сдачи литературы. Под

список литературы использовать один файл. В записях студентов, получивших книгу,

указывается код, соответствующий каждой книге (для уменьшения объема хранимой

информации).

12. В командной строке даны имена двух символьных файлов. Первый файл содержит

произвольный текст, слова в тексте разделены пробелами и знаками препинания. Второй

файл содержит не более сорока пар слов, каждая пара - в отдельной строке, слова в паре

разделены запятыми. Каждое первое слово в паре считается заменяемым, а второе -

заменяющим. Найти в первом файле все заменяемые слова и заменить их на

соответствующие заменяющие слова. Результат поместить во второй файл.

13. Ввести имя файла. В записи файла хранятся: фамилия, образование (среднее

специальное, высшее), пол, семейное положение, а также девичья фамилия или - для

военнообязанного - указывается военная специальность, а для невоеннообязанного -

причина и год, с которого стал невоеннообязанным. Кроме того, хранится код (один

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

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

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

изменили фамилию, имеют высшее образование и невоеннообязанные. Сортировки не

использовать. Имя нового файла задается в командной строке.

14. С клавиатуры задается имя файла, в котором хранится текст. В функции следует

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

место.

15. В файле содержится информация об авиарейсах: откуда и куда направляется, по каким

дням, количество мест. Написать программу, которая:

а) выдавала бы справочную информацию о нужном рейсе;

б) добавляла новую информацию;

в) резервировала билеты.

16. С клавиатуры вводится файл. В нем содержится информация о гостинице, Ф. И. 0.

жильцов, количество номеров, площадь номера, класс номеров. Написать программу,

которая:

а) выдает справки: кто и где проживает;

б) ведет учет используемых номеров;

в) обновляет информацию в файле.

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

им книг (не более 20). Студентов - не более 30. Вывести список книг, взятых указанным

студентом.

Page 149: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

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

сессии. С клавиатуры задается номер записи. Вывести содержимое соответствующей

записи, считая от конца файла.

19. Создать файл, в отдельной записи которого хранятся фамилия сотрудника и размер

зарплаты. Вывести содержимое третьей записи, считая от середины файла.

20. Создать файл, в котором хранятся фамилии и адреса места жительства. С клавиатуры

вводится фамилия. Организовать поиск записи с введенной фамилией и заменить адрес

места жительства.

21. В командной строке указано имя текстового файла. В файл записаны строки,

размер строки не превышает восьмидесяти символов. Найти строку символов, не

содержащую ни одного символа, входящего в другие строки.

22. Подсчитать служебные слова языка С# в тексте программы (не учитывать слова,

заключенные в кавычки). Имя файла с программой задается в командной строке.

23. Программа формирует таблицу перекрестных ссылок, т. е. выводит список

идентификаторов, используемых в программе, и для каждого идентификатора выводит

список номеров строк, в которых они встречаются.

24. В командной строке задано имя файла со строками. Количество строк и размер строк

неизвестны. Прочитать строки из файла и сохранить в оперативной памяти.

25. В командной строке заданы имена текстовых файлов. Создать для каждого файла

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

слово строки. При вводе слова ир массивы упорядочиваются по алфавиту, если down, то в

обратном порядке.

26. В текстовом файле записаны строки. В каждой строке определить самое длинное и

самое короткое слово и вывести их на экран.

27. В командной строке задано имя файла. В файл записаны строки. Длина строки не

превышает 80 символов. Если в строке встречаются числа, то эти числа надо вывести на

экран.

28. В командной строке задано имя файла. Элементами записи файла являются:

а) число целого типа, записанное в виде строки знаков;

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

Требуется выполнить соответствующие функции, используя в качестве аргумента элементы

массива.

29. С клавиатуры вводится имя файла, каждая запись которого содержит Ф.И.О. и адрес

студента. Записать файл на диск. Рассортировать записи файла по алфавиту:

а) в новый файл;

6) в этом же файле.

Осуществить поиск указанного студента в файле.

Page 150: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

5 ПЕРЕЧЕНЬ ТЕСТОВЫХ ВОПРОСОВ К ЭКЗАМЕНУ

2-ой семестр

1. Понятие объекта, фундаментальные характеристики ОПП.

2. Типы приложений на С#

3. Типы данных: числа, строки, указатели.

4. Типы данных: логический, перечисление, литералы.

5. Тип decimal.

6. Использование спецификатора const.

7. Символы форматирования.

8. Управляющие операторы.

9. Оператор foreach.

10. Множественный выбор.

11. Консольный ввод/вывод.

12. Методы класса Convert для преобразования строки в число.

13. Операторы: switch, goto Loop, goto case” one”, break.

14. Сокращенные логические операторы.

15. Объявление классов, определение объектов.

16. Использование операторов new и delete.

17. Описание классов(class, struct). Вложенные классы.

18. Конструкторы и деструкторы.

19. Перезагрузка конструкторов.

20. Указатели и ссылки. Указатели this.

21. Объявление и определение методов класса.

22. Наследование. Базовые и производные классы.

23. Доступ к компонентам производных и базовых классов.

24. Маскирование методов базового класса.

25. Переопределение членов базового класса в производном классе.

26. Модификаторы доступа.

27. Доступ к компонентам классов в зависимости от атрибутов доступа.

28. Конструкторы базовых и производных классов.

29. Вызов конструкторов базового класса.

30. Последовательность выполнения конструкторов при наследовании.

31. Ссылки на базовый класс и объекты производных классов.

32. Использование модификатора static.

33. Статические члены класса, статические константы.

34. Статические методы класса.

35. Конструкторы классов, конструкторы и наследование.

36. Механизмы вызовов конструкторов и деструкторов.

37. Статические конструкторы.

38. Передача аргументов в методы.

39. Использование ref и out модификаторов.

40. Перегрузка методов.

41. Вызов перегруженного конструктора, используя ссылку this.

Page 151: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

42. Перегрузка методов. Использование виртуальных методов.

43. Статические конструкторы.

44. Поля read only.

45. Передача параметров.

46. Запрет наследования.

47. Использование ссылок на базовые классы.

48. Использование ссылок на производные классы.

49. Реализация механизмов раннего и позднего связывания.

50. Класс System.Object.

51. Одномерные массивы: ввод, вывод.

52. Многомерные массивы: ввод, вывод.

53. Не выровненные (рваные) массивы: ввод, вывод.

54. Массивы строк: ввод, вывод.

55. Перегрузка бинарных операторов.

56. Перегрузка унарных операторов.

57. Перегрузка операторов отношений.

58. Перегрузка логических операторов.

59. Использование блока finally.

60. Явное преобразование типов.

61. Проверка преобразований числовых типов.

62. Виртуальные методы и их переопределение.

3-ий семестр

1. Определение индексаторов и их использование.

2. Использование индексатора без массива.

3. Работа с объектами с использованием индексаторов.

4. Абстрактные базовые классы и их использование для описания объектной

модели.

5. Операторы is, as.

6. Одномерные индексаторы.

7. Многомерные индексаторы.

8. Свойства, их использование.

9. Интерфейсы. Объявление интерфейсов.

10. Реализация интерфейсов.

11. Запрос о реализации интерфейсов с помощью is.

12. Запрос о реализации интерфейсов с помощью аs.

13. Сокрытие имени с помощью интерфейсов.

14. Использование интерфейсов для избежания неоднозначности имен.

15. Интерфейсы и наследование.

16. Кодирование и декодирование информации.

17. Комбинирование интерфейсов.

18. Обработка ошибок. Улавливание исключений. Блоки try и catch.

19. Генерация исключений. Перехватывание исключений

20. Повторная передача исключений.

Page 152: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

21. Освобождение ресурсов с помощью finally в обработчиках исключений.

22. Передача исключений из конструкторов.

23. Перехват всех исключений.

24. Улавливание исключений на верхнем уровне.

25. Свойство StackTrace класса System.Exception.

26. Создание собственных классов Exception.

27. Проблема создания блоков try.

28. Проблема создания блоков catch.

29. Потоки ввода-вывода. Понятие потока.

30. Система ввода вывода в C#.

31. Иерархия классов ввода-вывода. Основные уровни иерархии. Классы

потоков.

32. Стандартные классы, объекты и механизмы консольного ввода/вывода.

33. Форматированный ввод/вывод.

34. Стандартные классы, объекты и механизмы файлового ввода/вывода.

35. Байтовые и символьные потоки.

36. Файлы последовательного доступа.

37. Создание текстового файла.

38. Записать символьную строку в файл и прочитать как массив байтов.

39. Чтение текстового файла.

40. Копирование файла.

41. Файлы произвольного доступа.

42. Записать в бинарный файл из класса статическую строку и число, а затем

прочитать.

43. Создание бинарного файла. Сериализация объектов.

44. Записать объект в бинарный файл.

45. Чтение бинарного файла. Десериализация объектов.

46. Прочитать объект из бинарного файла.

47. Сортировка объектов в бинарном файле.

48. Слияние объектов бинарных файлов.

49. Делегаты. Использование делегатов.

50. Оповещение наблюдателей с помощью делегата.

51. Передача делегата через список параметров.

52. Потоки и многозадачность.

53. Создание вторичного потока.

54. Управление временем существования потоков.

55. Уничтожение потоков.

56. Планирование потоков. Использование приоритетов.

57. Защита кода с помощью класса Monitor.

58. Блокировка методов для упорядоченного обращения к ресурсам.

59. Применение блокировок монитора оператором lock.

60. Синхронизация кода с помощью класса Mutex.

61. Атрибуты. Определение атрибутов.

62. Атрибуты класса.

63. Атрибуты метода.

Page 153: ОГЛАВЛЕНИЕ - media.miu.bymedia.miu.by/files/store/umk/eumk_YAzykiProgr_2017.pdf · 3. lроелсен Э. c# и платформа net. ;иблиотека программиста.

64. Атрибуты поля.

65. Язык ассемблера. Регистры процессора.

66. Форматы команд. Директивы ассемблера.

67. Структура программы типа СОМ и ЕХЕ.

68. Типы данных. Резервирование памяти.

69. Способы адресации данных.

70. Организация переходов на языке ассемблера.

71. Нахождение суммы элементов строк (столбцов) матрицы. Данные в

сегменте данных (в кодовом сегменте).

72. Программа типа СОМ (EXE).

73. Использование подпрограмм.

74. Вывод текстовой информации на экран.

75. Ввод информации с клавиатуры.

76. Задачи на ввод символов, строк, скэн-кодов.

77. Задачи на переход по функциональным клавишам.

78. Задачи на анализ состояния клавиатуры.