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




Лабораторная работа 7. Основы языка C#. Работа с массивами и строками. Интерфейсы и коллекции

 

Цель работы - продолжение знакомства со средой разработки приложений Microsoft Visual Studio.NET. Изучение особенностей работы с массивами и строками в С#. Ознакомление с реализацией интерфейсами в С#.

Массивы

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

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

// Объявление массива размерности 3 из элементов типа int. Фактически это массив составляющих, представляющих собой массивы размерности 2 одномерных массивов элементов типа int. Размеры всех составляющих массивов одного уровня равны между собой ("прямоугольный" массив).

 

int[,,] ar1;

 

// Объявление одномерного массива из одномерных массивов элементов, каждый из которых является одномерным массивом элементов типа int.

 

int[][][] ar2;

 

// Объявление одномерного массива составляющих, каждый из которых является двумерным массивом массивов элементов типа int. При этом у всех составляющих могут быть разные размеры

 

int[][,] ar3;

 

// Объявление двумерного массива составляющих, каждая из которых является одномерным массивом элементов типа int. При этом у всех составляющих могут быть разные размеры.

 

int[,][] ar4;

Рассмотренные примеры демонстрируют определение двух различных категории массивов:

  • прямоугольные массивы,
  • ломаные (jagged) массивы.

 

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

Возможны два варианта объявления массива совмещенного с инициализацией.

В первом случае инициализация является явной и задается списком констант, например:

int[] odd = {1, 3, 5, 7, 9};

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

int[] even = new int[5];

Все массивы являются потомками класса System.Array, который в свою очередь наследует ряд интерфейсов: ICloneable, IList, ICollection, IEnumerable, а, следовательно, реализует все их методы и свойства. Кроме того, класс Array имеет большое число собственных методов и свойств.

Благодаря наследованию от класса System.Array, для массивов определены такие встроенные методы копирования, поиска, обращения, сортировки. Массивы можно рассматривать также как как коллекции и использовать цикл foreach для перебора его элементов.

Ниже приведены основные свойства и методы класса System.Array:

Свойство Описание
IsFixedSize Возвращает true, если массив является статическим
IsReadOnly Для всех массивов возвращает значение false
IsSynchronized Возвращает true или false, в зависимости от того, установлена ли синхронизация доступа для массива
Length Число элементов в массиве
Rank Размерность массива
Метод Описание
BinarySearch Бинарный поиск элементов
Clear Выполняет инициализацию элементов. Числовые элементы становятся нулевыми, а строковые принимают значение Null
Clone Клонирование массива
Copy Копирование части или всего массива в другой массив
CopyTo Копируются все элементы одномерного массива в другой одномерный массив, начиная с заданного индекса
CreateInstance Создание экземпляра массива
GetEnumerator Возварщает интерфейс IEnumerator. Необходим для использования в цикле foreach
GetLength Возвращает число элементов массива по указанному измерению
GetLowerBound, GetUpperBound Возвращает нижнюю и верхнюю границу по указанному измерению. Для массивов нижняя граница всегда равна нулю.
GetValue SetValue Возвращает или устанавливает значение элемента массива с указанными индексами.
IndexOf Индекс первого вхождения образца в массив
LastIndexOf Индекс последнего вхождения образца в массив
Reverse Сортировка одномерного массива в обратном порядке
Sort Сортировка массива
     

Строки

В языке C# определен класс сhar[], и его можно использовать для представления строк постоянной длины. Однако массив сhar[] - это обычный массив, поэтому его нельзя инициализировать строкой символов. В C# не определено преобразование из класса сhar[] в класс String. У String есть динамический метод ToCharArray, задающий подобное преобразование в сhar[].

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

  • символа, повторяющегося указанное число раз;
  • массива символов char[];
  • части массива символов.

Методы класса String позволяют выполнять вставку, удаление, замену, поиск вхождения подстроки в строку. Класс String наследует методы класса Object, а также методы четырех интерфейсов: IComparable, ICloneable, IConvertible, IEnumerable.

 

Некоторые из членов класса приведены в таблице:

Метод Описание
Length Это свойство возвращает длину указанной строки
Insert Вставляет подстроку в заданную позицию
Remove Удаляет подстроку в заданной позиции
Replace Заменяет подстроку в заданной позиции на новую подстроку
Substring Выделяет подстроку в заданной позиции
IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny Определяются индексы первого и последнего вхождения заданной подстроки или любого символа из заданного набора
StartsWith, EndsWith Возвращается true или false, в зависимости от того, начинается или заканчивается строка заданной подстрокой
PadLeft, PadRight Выполняет заполнение нужным числом пробелов в начале и в конце строки
Trim, TrimStart, TrimEnd Удаляются пробелы в начале и в конце строки, либо только с одного конца
ToCharArray Преобразование строки в массив символов

 

Класс String не разрешает изменять существующие объекты. Для этой цели имеется другой класс - класс StringBuilder, который позволяет исправить данный недостаток. Этот класс принадлежит к изменяемым классам и его можно найти в пространстве имен System.Text.

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

  • Первая группа позволяет задать строку или подстроку, значением которой будет инициализироваться создаваемый объект класса StringBuilder.
  • Вторая группа параметров позволяет задать размер объекта, т.е объем памяти, отводимой для экземпляру класса StringBuilder.

Примеры конструкторов:

  • publicStringBuilder(string str, int size). Параметр str задает строку для инициализации, size - размер объекта;
  • publicStringBuilder(intcursize, intmaxsize). Параметры cursize и maxsize задают начальный и максимальный размер объекта;
  • publicStringBuilder(string str, int start, intlen, int size). Параметры str, start, len задают строку инициализации, size - размер объекта.

Над строками этого класса определены (также как идля строк класса String) операции:

  • присваивание (=);
  • две операции проверки эквивалентности (==) и (!=);
  • взятие индекса ([]).

Операция конкатенации (+) не определена над строками класса StringBuilder, ее роль играет метод Append, добавляющий новую строку в конец существующей.

Интерфейсы

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

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

Среди интерфейсов, встроенных в библиотеку базовых классов.NET, можно особо выделить такие как:

  • IEnumerable (для работы с наборами объектов, в т.ч. с использованием оператора foreach).
  • IClonable (копирование объектов).
  • IComparable (для сравнения и сортировки объектов).

Пространство имен System.Collections, предназначенное для работы с наборами объектов, поддерживает интерфейсы:

  • ICollection (определяет общие характеристики класса набора элементов).
  • IComparer, IDictionary (позволяет представлять содержимое объекта в виде пар имя-значение).
  • IDictionaryEnumerator (нумерация содержимого объекта, поддерживающего IDictionary).
  • IEnumerable, IEnumerator.
  • IHashCodeProvider (возвращает хэш-код с помощью выбранного алгоритма хэширования).
  • IList (обеспечивает методы добавления, удаления и индексирования элементов в списке объектов).

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

 

Создать в Microsoft Visual Studio проект консольного приложенияна С#.

 

Задание 1 Написать программу обрабатывающую двумерный массив.

Варианты:

1. Для двухмерного массива V(10,10) найти количество строк с отрицательными элементами.

2. Для двухмерного массива Х(50,100) поділити элемент с максимальним значением на элемент з минимальнымзначением.

3. Для двухмерного массива А(10,20) поменять местами первый негативний элемент с последним диагодальным.

4. Для двухмерного массива В(20,20) найти элемент с минимальным значениеми его номера строки и столбца.

5. Для двухмерного массива C(10,10) отсортироватьэлементи строк массива по возрастанию значений.

6. Для двухмерного массива D(10,10) найти элемент з максимальним значением, его номера строки и столбца.

7. Для двухмерного массива E(100,100) найти сумму элементов с отрицательным значением.

8. Для двухмерного массива Е(20,20) реализовать такую перестановку: поменять местами элементи с максимальным и минимальным значением.

9. Для двухмерного массиваH(10,20) найти сумму элементов с максимальным и минимальным значением.

10. Для двухмерного массиваJ(10,30) разместить элементы столбцов массивав порядке убывания значений.

11. Для двухмерного массива L(10,20) найти количество элементов с отрицательным значением.

12. Для двухмерного массива Р(10,20) найти суму элементов и максимальный элемент последнего столбца.

13. Для двухмерного массива Q(10,10) найти строку с максимальным значением суммы ее элементов.

14. Для двухмерного мас сива S(50,20) найти номер первой строки, где нет элементов с отрицательным значением.

15. Для двухмерного массива U(20,20) найти максимальний из отрицательных элементов.

16. Для двухмерного массива X(10,10) найти диагональный элемент з максимальным значением.

17. Для двухмерного массиваY(20,20) записати нули вместо элементов с максимальным та минимальным значением.

18. Для двухмерного массива В(20,10) найти минимальный элемент для каждойо строки.

19. Для каждого столбца двухмерного массива К(20,20) найти количество элементов, которые больше заданной величины В= 25.3.

20. Для двухмерного массива С(80,80) найти среднее арифметическое элементов и элемент с максимальным значением.

 

Задание 2 Разобрать работу программы

 

Программа 1. Ломаный массив.

using System;

using System.Collections.Generic;

using System.Text;

 

namespace HelloWorldDemo

{

class Program

{

static void Main(string[] args)

{

// Ломаный многомерный массив из пяти внутренних массивов разного размера

int[][] JagArr = new int[10][];

 

// Инициализация генератора случайных чисел

Random rand = new Random();

 

// Динамическое создание ломаного массив

for (inti = 0; i<JagArr.Length; i++)

{

JagArr[i] = new int[i + rand.Next(10)];

}

 

// Вывод строк на консоль

// Каждый элемент по умолчанию имеет значение, равное

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

{

// Свойство Length массива возвращает его размер

Console.Write("Length of row {0} is {1}:\t", i, JagArr[i].Length);

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

{

Console.Write(JagArr[i][j] + " ");

}

Console.WriteLine();

}

}

}

}

 

Задание 3. Изучить использование свойств и методов класса Array.

 

Программа 2. Свойства и методы класса Array.

using System;

usingSystem.Collections.Generic;

usingSystem.Text;

 

namespaceHelloWorldDemo

{

class Program

{

static void Main(string[] args)

{

// Массивсимвольныхстрок

string[] Brands = new string[]

{"Audi",

"BMW",

"Buick",

"Chevrolet",

"Citroen",

"Dodge",

"Ferrari",

"Fiat",

"Ford",

"Honda",

"Hyundai",

"Cherokee",

"Cherry",

"Lada",

"Lamborghini",

"Lincoln",

"Mazda",

"Mercedes",

"Mitsubishi",

"Nissan",

"Opel",

"Peugeot",

"Plymoth",

"Pontiac",

"Renault",

"Rover",

"Saab",

"Subaru",

"Suzuki",

"Toyota",

"Volkswagen",

"Volvo"};

 

// Вывод марок автомобилей в соответствии с порядком элементов в массиве

 

Console.WriteLine("Here is the array of car brands:");

 

for (inti = 0; i<Brands.Length; i++)

Console.Write(Brands[i] + "\t");

 

Console.Write("\n\n");

 

// Сортировка элементов в обратном порядке

 

Array.Reverse(Brands);

 

// Выводавтомарок

Console.WriteLine("Here is the list once reversed:");

for (inti = 0; i<Brands.Length; i++)

Console.Write(Brands[i] + "\t");

 

Console.Write("\n\n");

 

// Остаются только первый и последний

 

Console.WriteLine("Only two remain: ");

Array.Clear(Brands, 2, Brands.Length-2);

 

for (inti = 0; i<Brands.Length; i++)

{

Console.Write(Brands[i] + "\t\n");

}

}

}

}

 

Задание 4. Изучить особенности классаStringBuilder:

Программа 3. Свойства и методы класса StringBuilder.

 

using System;

usingSystem.Collections.Generic;

usingSystem.Text;

 

 

namespaceHelloWorldDemo

{

class Program

{

static void Main(string[] args)

{

StringBuilderWordList = new StringBuilder("КаждыйОхотник ");

 

WordList.Append("Желает Знать Где ");

Console.WriteLine(WordList);

 

WordList.Append("СидитФазан");

Console.WriteLine(WordList);

 

// Сделатьвсебуквыпрописными

string Spectrum = WordList.ToString().ToUpper();

Console.WriteLine(Spectrum);

}

}

}

 

Задание 5. Разобрать приемы использования класса ArrayList.

 

Использование класса ArrayList из пространства имен System.Collections позволяет эффективно реализовать работу с массивами объектов, поскольку многие возможности, необходимые для этого реализованы изначально, в частности методы вставки, удаления и нумерации элементов.

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

 

public class NBooks: IEnumerable

{

// nbList — внутренний класс, который будет делать всю работу

private ArrayList nbList;

 

// Создаем объект класса nbList при помощи конструктора NBooks

publicNBooks() {nbList = new ArrayList();}

 

// Реализуем нужные нам методы для приема вызовов извне и передачи их nbList

 

// Метод для вставки объекта NBook

public void AddNBook(NBook nb)

{ nbList.Add(nb); }

 

// Метод для удаления объекта NBook

public void RemoveNBook(intnbToRemove)

{ nbList.RemoveAt(nbToRemove); }

 

// Свойство, возвращающее количество объектов NBook

publicintNBookCount

{ get { return nbList.Count; } }

 

// Метод для очистки объекта — удаления всех объектов NBook

public void ClearAllNBooks()

{ nbList.Clear(); }

 

// Метод, который отвечает на вопрос — есть ли уже в наборе такой объект NBook

publicboolNBookIsPresent(NBook c)

{ return nbList.Contains(c); }

 

// Все, что связано с реализацией IEnumerator, перенаправляется в nbList

publicIEnumeratorGetEnumerator()

{ returnnbList.GetEnumerator(); }

}

Задание 6. Реализовать класс NBook и код программы, использующей класс NBooks.

 

Программа 4. Свойства и методы класса NBook

 

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Collections;

usingSystem.Text;

 

namespaceNBooks

{

public class NBook

{

 

// КонструкторклассаNBook

 

public string Model;

public string CPU_model;

publicintCPU_clock;

publicintRAM_size;

 

publicNBook(string mname, string CPU, int Clock, int RAM)

{

Model = mname;

CPU_model = CPU;

CPU_clock = Clock;

RAM_size = RAM;

}

}

 

class Program

{

static void Main(string[] args)

{

NBooks nbList = new NBooks();

 

// Создание списка объектов NBook

 

nbList.AddNBook(new NBook("ASUS A7Sn","Intel Core 2 Duo T8300", 2400, 2048));

nbList.AddNBook(new NBook("Acer Aspire 5530G-803G25Mi","AMD Turion X2 Ultra ZM80", 2100, 3072));

nbList.AddNBook(new NBook("Fujitsu Amilo Si 2636", "Intel Core 2 Duo T8300", 2400, 2048));

nbList.AddNBook(new NBook("HP Pavilion tx2650er", "AMD Turion X2 Ultra ZM82", 2200, 4096));

 

// Выводим информацию о каждом объекте при помощи конструкции foreach

 

Console.WriteLine("You have {0} in the list: \n", nbList.NBookCount);

foreach (NBooknb in nbList)

{

Console.WriteLine("Model: {0}", nb.Model);

Console.Write("CPU: {0}", nb.CPU_model);

Console.WriteLine(" {0} GHz", nb.CPU_clock);

Console.WriteLine("RAM: {0} GB\n", nb.RAM_size);

}

 

// Удаляем один из ноутбуков

 

nbList.RemoveNBook(3);

Console.WriteLine("You have {0} in the list.\n", nbList.NBookCount);

 

// Добавляем еще один ноутбук и проверяем его наличие в наборе

 

NBook temp = new NBook("ASUS M51Ta", "AMD Turion™ X2 Ultra ZM84", 2300, 4096);

nbList.AddNBook(temp);

 

if(nbList.NBookIsPresent(temp))

Console.WriteLine(temp.Model + " is already in the list.");

 

// Удалитьвсе

 

nbList.ClearAllNBooks();

Console.WriteLine("You have {0} in the list.\n", nbList.NBookCount);

}

}

}

 

В отчете привести скриншоты работающих программ заданий 1-6.

Контрольное задание

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

Для поиска потребуется использование метода IndexOf(string findThisString) для строковых элементов массива. Метод возвращает позицию начала искомой подстроки от начала строки, либо значение -1 при отсутствии соответствия.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: