Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Laboratornyy_praktikum_Programmirovanie_na_C

.pdf
Скачиваний:
42
Добавлен:
02.02.2015
Размер:
1.93 Mб
Скачать

Поразрядные коллекции (System.Collections) поддерживают операции над отдельными двоичными разрядами (И, ИЛИ, Исключающее ИЛИ…). Представлены одной коллекцией BitArray.

Обобщѐнные коллекции (System.Collections.Generic) являются типизированными и обеспечивают обобщѐнную реализацию нескольких стандартных структур данных, включая связанные списки, стеки, очереди и словари. Такие коллекции (Dictionary, LinkedList, List, Queue, SortedDictionary, SortedList, SortedSet, SynchronizedCollection)

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

Параллельные коллекции (System.Collections.Concurrent) – обобщѐнные коллекции, поддерживающие многопоточный доступ.

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

На Рис 10.1 представлена схема организации коллекции стека.

Рисунок 10.1. Стек

Стек представляет собой связанный список, имеющий статический заголовок head, объект содержит данные и ссылку на предыдущий объект. При создании первого элемента, который по мере добавления элементов в коллекцию сдвигается вглубь, ссылка на предыдущий элемент Prev содержит null – пустую ссылку («никуда»). При добавлении элемента, его ссылке Prev присваивается значение head, затем head присваивается ссылка на этот созданный элемент. Изъятие элементов происходит в обратном порядке.

На Рис10.2 представлена схема организации коллекции очереди.

Рисунок 10.2. Очередь

При организации очереди уже используются две ссылки – на вход (in) и на выход (out). При добавлении первого элемента вход и выход указывают на него. При добавлении элементов используется алгоритм аналогично стеку, но при изъятии элементов извлекается элемент по ссылке выход, при этом последующему элементу (по ссылке Next) в ссылку Prev записывается null, и ссылке выход присваивается ссылка Next (выход из очереди), таким образом, начало очереди смещается к следующему элементу.

111

Рисунок 10.3. Динамический список с произвольным доступом

На Рис 10.3 представлен динамический список с доступом к произвольному элементу, перемещаясь по списку, с возможностью добавлять и удалять произвольные элементы. Двустороннее перемещение по списку обеспечивает ссылка на объект current, для перемещения вперед и назад по списку используются ссылки объекта Prev и Next. При вставке элемента внутрь списка ссылки соседних элементов копируются в него, соответственно сами ссылки соседних элементов изменяются и ссылаются на новый элемент. При работе перечислителя (реализация цикла foreach), ссылке current присваивается ссылка first, затем, следуя ссылкам Next перебираются все элементы, прекращая перебор, когда ссылка Next будет содержать null.

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

using System;

using System.Collections;

using System.Collections.Specialized;

class P10_3

{

static void Main()

{

Console.Write("Введите целое положительное число: "); int[] n = {int.Parse(Console.ReadLine())};

BitArray bitArray = new BitArray(n); bool Odd = false;

112

Console.Write("Двоичное представление числа: "); for (int i = bitArray.Length - 1; i >= 0; --i )

{

Console.Write(bitArray.Get(i) ? "1" : "0"); Odd ^= bitArray.Get(i);

}

Console.WriteLine("\nВ числе {0}чётное количество " + "установленных бит.", Odd ? "не" : "");

}

}

В программе с консоли вводится целое число, которое помещается в целый массив с единственным элементом. Массив используется по причине наличия конструктора битовой коллекции, преобразующего целый массив в битовый поток. Далее с помощью этого конструктора инициализируется коллекция bitArray. В качестве флага нечѐтности описывается и инициализируется в false переменная Odd. В цикле, начиная с максимального номера бита коллекции, определяемого свойством коллекции Length, перебираются элементы коллекции, и с помощью тернарного (внутристрокового условного) оператора «?» выводится «1» или «0» в строку двоичного представления числа. Для вычисления нечѐтности пересчитанных бит используется логический оператор «^» (XOR, исключающее ИЛИ), инвертирующий значение переменной Odd при установленном текущем бите.

using System; class P10_4

{

static void Main()

{

Console.Write("Введите целое положительное число: "); uint n = uint.Parse(Console.ReadLine());

const uint TB = 0x80000000; uint k = 0; Console.Write("Двоичное представление числа: "); for (int i = 31; i >= 0; --i )

{

Console.Write((n & TB) > 0 ? "1" : "0"); k ^= (n & TB);

n = n << 1;

}

Console.WriteLine("\nВ числе {0}чётное количество " + "установленных бит.", k > 0 ? "не" : "");

}

}

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

113

исследуемого числа. Как и в предыдущем примере, переменная k является флагом нечѐтности (0 – чѐтное, > 0, т.е. равное TB – нечѐтное), переключается оператором «^» (XOR). Для заполнения старшего бита следующим используется оператор сдвига влево « ».

Программа P10_5 демонстрирует использование класса битовой коллекции BitVector32, который может оказаться удобен для сегментной обработки 32-битных чисел.

using System;

using System.Collections;

using System.Collections.Specialized;

class P10_5

{

static void Main()

{

string IPFormat = "{0}.{1}.{2}.{3}"; string DefaultIP = "172.17.25.100/24"; //Получение адреса

Console.Write("Введите без пробелов IP4 адрес [" + DefaultIP + "]: ");

string IPstr = Console.ReadLine();

if (IPstr.Length == 0) IPstr = DefaultIP; string[] IPMs = IPstr.Split(new Char[] { '/' }); int MaskB = int.Parse(IPMs[1]), MaskI = -1; MaskI = (int)((uint)MaskI << 32 - MaskB);

string[] IP4s = IPMs[0].Split(new Char[] { '.' }); byte[] IP4 = new byte[4];

byte[] Mask = BitConverter.GetBytes(MaskI); for (int i = 0; i < 4; i++)

IP4[3 - i] = byte.Parse(IP4s[i]); int IP4I = BitConverter.ToInt32(IP4, 0); int SubNetI = IP4I & MaskI;

byte[] SubNet = BitConverter.GetBytes(SubNetI); int NComp = IP4I & ~MaskI;

Console.WriteLine("IP

:

"

+

IPFormat,

IP4[3], IP4[2], IP4[1],

IP4[0]);

Console.WriteLine("маска

:

"

+

IPFormat,

Mask[3], Mask[2], Mask[1], Mask[0]); Console.WriteLine("подсеть: " + IPFormat,

SubNet[3], SubNet[2], SubNet[1], SubNet[0]); Console.WriteLine("№ комп.: " + NComp); //Демонстрация битовых коллекций

BitVector32 IPBV = new BitVector32(IP4I); BitVector32 MaskBV = new BitVector32(MaskI);

114

BitVector32 SubNetBV = new BitVector32(SubNetI); //Определение побайтовых секций

BitVector32.Section s0= BitVector32.CreateSection(0xff); BitVector32.Section s1= BitVector32.CreateSection(0xff,s0); BitVector32.Section s2= BitVector32.CreateSection(0xff,s1); BitVector32.Section s3= BitVector32.CreateSection(0xff,s2); Console.WriteLine("Битовое представление данных");

Console.WriteLine("IP

: " +

IPBV.ToString());

Console.WriteLine("маска

: " +

MaskBV.ToString());

Console.WriteLine("подсеть: " +

SubNetBV.ToString());

Console.WriteLine("Вывод секций

битового массива");

Console.WriteLine("IP

: " +

IPFormat,

IPBV[s3], IPBV[s2], IPBV[s1], IPBV[s0]);

Console.WriteLine("маска

: " + IPFormat,

Mask[3], Mask[2], Mask[1], Mask[0]);

//Передача данных из BitVector32 в BitArray

BitArray IPBA = new BitArray(new int[] {IPBV.Data}); Console.WriteLine("Операции с отдельными битами"); Console.WriteLine("Старший бит в адресе {0}",

IPBA[31] ? "1" : "0");

Console.WriteLine("Младший бит в адресе {0}, номер хоста"+

" {1}чётный", IPBA[0] ? "1" : "0", IPBA[0] ? "не":"");

}

}

В программе задаются строка формата вывода IP-адреса (IPFormat – объединяет точками передаваемые в параметрах числа) и строка адреса по умолчанию (DefaultIP

– используется в подсказке как пример ввода). DefaultIP также используется в качестве строки ввода, если пользователь введѐт пустую строку – нажмѐт Enter. Подобным образом организуется быстрый ввод параметров в консольных программах, когда пользователь вводит только значения, отличные от значений по умолчанию. Далее строка адреса разбирается в строковый массив методом Split сначала на IP/маску. Так как краткая запись маски адреса определяет количество установленных старших бит 32-битного числа, создаѐтся целое число, у которого все биты установлены (–1), затем методом сдвига влево ( ) часть младших битов обнуляется. Методом GetBytes класса BitConverter для удобства вывода маски из целого числа создаѐтся массив байтов. Затем аналогично полному адресу разбирается IP на октеты, преобразуемые в цикле в байтовый массив. Используя метод ToInt32 класса BitConverter создаѐтся целое значение IP-адреса из байтового массива (действие, обратное методу GetBytes). Адрес подсети получается операцией побитного логического умножения (&) IP-адреса и маски, номер компьютера – IPадреса и инвертированной маски. Далее выводятся полученные значения.

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

115

CreateSection указывается максимальное значение, размещаемое в секции (0xFF – один заполненный установленными битами байт). На экран выводятся битовые коллекции, а затем значения структур секций.

Далее демонстрируется создание экземпляра BitArray, инициализированного значением BitVector32, содержащимся в свойстве Data. Так как конструктор требует параметра целого массива, значение преобразуется в такой массив с единственным элементом.

10.3.1. Задание

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

Покажите результаты работы преподавателю, закройте Visual Studio, а затем

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

D:\Program\VS.

Вопросы к под ото к :

1.Что такое структуры?

2.Чем структуры отличаются от объектов?

3.Что такое перечисления?

4.Для чего нужны списки, чем они отличаются от массивов?

116

ЛАБОРАТОРНАЯ РАБОТА 11. ФАЙЛЫ

Цель работы: Научиться работать с файлами данных. Программы работы записать (вклеить распечатку) с пояснениями в лабораторный журнал.

11.1. ФАЙЛЫ

Самостоятельно проработать главу 14 [2], уясните и запишите в лабораторный журнал, что такое потоки, какие виды потоков существуют, какие классы обеспечивают ввод/вывод информации, какие свойства, методы используются при этом. Выполните примеры главы.

Во время выполнения файловых операций возможны ошибки. Рассмотрите методы обработки ошибок в C#.

11.2. ПРОГРАММИРОВАНИЕ

11.2.1. Задача.

Написать программу:

Покажите результаты работы преподавателю, закройте Visual Studio, а затем

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

D:\Program\VS.

Вопросы к под ото к :

1.Для чего используются файлы?

2.Как сохранить данные в файл?

3.Какие операции с файлами вы знаете?

117

ЛАБОРАТОРНАЯ РАБОТА 12. ФОРМЫ. КОНСТРУИРОВАНИЕ ИНТЕРФЕЙСА

Цель работы: Рассмотреть инструменты визуального программирования. Научиться работать с формами. Программы работы записать (вклеить распечатку) с пояснениями в лабораторный журнал.

12.1.ФОРМЫ

Создайте новый проект по шаблону «Приложение Windows Forms».

Вокне конструктора формы Form1, используя маркеры размера (в нижнем правом углу формы) увеличьте размер формы пропорционально половине экрана.

Откройте окно свойств Вид/Окно свойств.

Откройте (если свѐрнута) слева панель инструментов, уберите параметр панели «Автоматически скрывать». Разверните группу «Стандартные элементы управления. Выделите в панели элементов Label, а затем укажите на форме точку вставки элемента. При выделении мышью формы, в окне свойств перечислены свойства самой формы, при выделении объекта label1 – свойства метки. Выделите форму, в окне свойств перейдите в поле Size, задайте размер «500; 300» (X–Y), в поле Text «Вычисление квадрата». Выделите метку, в окне свойств измените значение поля Text на «Введите число», в поле Location «35; 35».

Добавьте на форму элемент TextBox. Установите для его свойств следующие значения: Location «155; 35», Size «150; 22», Text «1», TextAlign «Right».

Выделите мышью принажатой клавише Shift метку и поле ввода, перемещайте их вниз мышью при нажатой клавише Ctrl для создания копии. Задайте для второй метки значение полей: Location «35; 86», Text «Результат». Для второго поля ввода установите поля: Location «155; 86», Text «», ReadOnly «True».

Добавьте на форму элемент Button (кнопку). Задайте значения его полей: Text

«Вычислить», Size «100; 23», Location «330; 190», DialogResult «OK». Дважды щелкните на кнопке правой кнопкой мыши, откроется окно программы класса формы с пустым кодом события нажатия на кнопку. Введите код вычисления квадрата, чтобы получилась следующая программа:

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing; using System.Linq; using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

118

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

double x = double.Parse(textBox1.Text); textBox2.Text = Convert.ToString(x * x);

}

}

}

Перейдите на закладку формы (Shift+F7, в окно программы – F7). В окне свойств перейдите на закладку События (кнопка с изображением молнии). У события Click установлено имя метода button1_Click. Различные события для объектов можно создавать двойным щелчком правой кнопки мыши на поле соответствующего события.

Запустите программу, введите число (разделитель дробной части соответствует настройкам системы – запятая). Нажмите на кнопку Вычислить. Закройте программу.

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

12.2. ПРОГРАММИРОВАНИЕ

12.2.1. Задача. Вычисление квадратного корня

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

12.2.2. Задача. Калькулятор

Напишите простую программу – Калькулятор.

Покажите результаты работы преподавателю, закройте Visual Studio, а затем

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

D:\Program\VS.

Вопросы к под ото к :

1.Что такое визуальное программирование?

2.Что такое свойство?

3.Что такое событие?

4.Что такое форма, зачем она нужна?

5.Что такое ресурс?

119

ЛАБОРАТОРНАЯ РАБОТА 13. ФОРМЫ. КОМПОНЕНТЫ

Цель работы: Рассмотреть инструменты визуального программирования. Научиться работать с формами. Программы работы записать (вклеить распечатку) с пояснениями в лабораторный журнал.

13.1.ФОРМЫ

13.2.ПРОГРАММИРОВАНИЕ

13.2.1. Задача.

Написать программу:

Покажите результаты работы преподавателю, закройте Visual Studio, а затем

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

D:\Program\VS.

Вопросы к под ото к :

1.Что такое визуальные компоненты?

2.Для чего используются невизуальные компоненты?

120

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]