ЛабРаб_ООП
.pdfВаріант 8. Характеристикою стовпця цілочисельної матриці назвемо суму модулів його негативних непарних елементів. Переставляючи стовпці заданої матриці, розташувати їх відповідно до зростання характеристик.
Варіант 9. Для заданої матриці розміром NхN знайти таке k, що k-й рядок матриці співпадає з k-м стовпцем.
Варіант 10. Починаючи з центру, обійти по спіралі всі елементи матриці NхN, роздруковувавши їх в порядку обходу.
Варіант 11. Для заданої цілочисельної квадратної матриці знайти максимум серед сум елементів діагоналей, що паралельні головній діагоналі.
Варіант 12. Починаючи з елементу a11 обійти по спіралі квадратну матрицю NхN, роздруковувавши елементи в порядку обходу.
Варіант 13. Знайти максимальний серед всіх елементів тих рядків заданої матриці, які впорядковані (або за збільшенням, або за зменшенням).
Варіант 14. По заданій квадратній матриці NхN побудувати вектор завдовжки 2n-1, елементи якого – максимуми елементів діагоналей, паралельних головній.
Варіант 15. Дана цілочисельна квадратна матриця. Визначити:
1)суму елементів в тих стовпцях, які не містять негативних елементів;
2)мінімум серед сум модулів елементів діагоналей, паралельних побічній діагоналі матриці.
Варіант 16. Дана цілочисельна прямокутна матриця. Визначити:
1)суму елементів в тих рядках, які містять хоч би один негативний елемент;
2)номери рядків і стовпців всіх сідлових точок матриці.
Примітка. Матриця А має сідлову точку Аij, якщо Аij є мінімальним елементом в i-й рядку і максимальним в j-м стовпці.
Варіант 17. Ущільнити задану матрицю, видаляючи з неї рядки і стовпці, заповнені нулями. Знайти номер першою з рядків, що містять хоч би один позитивний елемент.
Варіант 18. Дана цілочисельна прямокутна матриця. Визначити:
1)кількість рядків, що містять хоч би один нульовий елемент;
2)номер стовпця, в якому знаходиться найдовша серія однакових елементів.
Хід роботи.
1.Виконати Вправу 1.
2.Виконати Вправу 2.
3.Виконати завдання згідно своєму варіанту.
Вправа 1.
Приклад використання ArrayList.
using System;
using System.Collections;
using System.Collections.Generic; using System.Text;
namespace ArrayList2
{
class Program
{
static void Main(string[] args)
41
{
ArrayList baseballTeams = new ArrayList(); baseballTeams.Add("St. Louis Cardinals"); baseballTeams.Add("Seattle Mariners"); baseballTeams.Add("Florida Marlins");
string[] myStringArray = new string[2]; myStringArray[0]= "San Francisco Giants"; myStringArray[1]= "Los Angeles Dodgers";
baseballTeams.AddRange(myStringArray);
foreach (string item in baseballTeams)
{
Console.Write(item + "\n");
}
Console.ReadLine();
}
}
}
Вправа 2.
Приклад використання класу Hashtable.
using System; using System.Text;
using System.Collections;
namespace SocialSecurityNumbers
{
class MainEntryPoint
{
static void Main()
{
TestHarness harness = new TestHarness(); harness.Run();
}
}
class TestHarness
{
Hashtable employees = new Hashtable(31);
public void Run()
{
EMPLOYEEID idMortimer = new EMPLOYEEID("B001");
EmployeeData mortimer = new EmployeeData(idMortimer, "Mortimer", 100000.00M); EMPLOYEEID idArabel = new EMPLOYEEID("W234");
EmployeeData arabel= new EmployeeData(idArabel, "Arabel Jones", 10000.00M);
employees.Add(idMortimer, mortimer); employees.Add(idArabel, arabel);
while (true)
{
try
{
Console.Write("Enter employee ID (format:A999, X to exit)> "); string userInput = Console.ReadLine();
userInput = userInput.ToUpper(); if (userInput == "X")
42
return;
EMPLOYEEID id = new EMPLOYEEID(userInput); DisplayData(id);
}
catch (Exception e)
{
Console.WriteLine("Exception occurred. Did you use the correct format for the employee ID?");
Console.WriteLine(e.Message);
Console.WriteLine();
}
Console.WriteLine();
}
}
private void DisplayData(EMPLOYEEID id)
{
object empobj = employees[id]; if (empobj != null)
{
EmployeeData employee = (EmployeeData)empobj; Console.WriteLine("Employee: " + employee.ToString());
}
else
Console.WriteLine("Employee not found: ID = " + id);
}
}
class EmployeeData
{
private string name; private decimal salary; private EMPLOYEEID id;
public EmployeeData(EMPLOYEEID id, string name, decimal salary)
{
this.id = id; this.name = name; this.salary = salary;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder(id.ToString(), 100); sb.Append(": ");
sb.Append(string.Format("{0-20}", name)); sb.Append(" "); sb.Append(string.Format("{0:C}", salary)); return sb.ToString();
}
}
class EMPLOYEEID
{
private readonly char prefix; private readonly int number;
public EMPLOYEEID(string id)
{
prefix = (id.ToUpper())[0];
number = int.Parse(id.Substring(1,3));
}
43
public override string ToString()
{
return prefix.ToString() + string.Format("{0,3:000}", number);
}
public override int GetHashCode()
{
string str = this.ToString(); return str.GetHashCode();
}
public override bool Equals(object obj)
{
EMPLOYEEID rhs = obj as EMPLOYEEID; if (rhs == null)
return false;
if (prefix == rhs.prefix && number == rhs.number) return true;
return false;
}
}
}
Методичні вказівки і теоретичні відомості.
Масиви
Масив (array) – це сукупність змінних однакового типу, звернення до яких відбувається з використанням загального для всіх імені. У C# масиви можуть бути одновимірними або багатовимірними.
Хоча масиви в C# можна використовувати по аналогії з тим, як вони використовуються в інших мовах програмування, C#-массивы мають один спеціальний атрибут, а саме: вони реалізовані як об'єкти.
Приклад #1: Одновимірний масив.
class TestMain
{
public static int Main()
{
int[] ar; // Declare array
ar= new int[20]; // new space on heap
for(int i=0;i<ar.Length;++i) // Length Attribute ar[i]=i; }
for(int i=0;i<ar.Length;++i) System.Console.WriteLine("Item ["+i+"]="+ar[i]); }
return 0;
}
}
Приклад #2: Двовимірний масив. Рвані масиви.
class TestMain
{
public static int Main()
{
44
int[][] ar; // Declare array 2dim
ar= new int[20][] ;
for(int i=0;i<ar.Length;++i)
{
ar[i]=new int[1+i];
}
for(int i=0;i<ar.Length;++i)
{
for(int k=0;k<ar[i].Length;++k) ar[i][k]=0; }
}
return 0;
}
}
Приклад #3: Двовимірні масиви. Прямокутні масиви.
class TestMain
{
public static int Main()
{
int[,] ar;
ar= new int[5,20];
System.Console.WriteLine("Item: "+ar.Length);//total Items in 2-D Array int rows=ar.GetLength(0);
int cols=ar.GetLength(1); System.Console.Write("Rows="+rows+" Cols="+cols); return 0;
}
}
Приклад #4: Масив об'єктів.
using System;
public class Car
{
private String mName;
public void Info() { Console.WriteLine("Name: " + mName); }
public Car(String name){ mName=name; }
}
class TestMain
{
public static int Main() Car[] ar;
ar=new Car[100]; // allocate array object
for(int i=0;i<ar.Length;++i) ar[i]=new Car("Car #"+i); }
for(int i=0;i<ar.Length;++i) { ar[i].Info(); }
return 0;
}
}
45
Робота з колекціями
У C# під колекцією мається на увазі група об'єктів. Простір імен System.Collections містить ряд інтерфейсів і класів, які визначають і реалізують колекції різних типів. Колекції спрощують програмування, пропонуючи вже готові рішення для побудови структур даних, розробка яких «з нуля» відрізняється великою трудомісткістю. Йдеться про вбудовані колекції, які підтримують, наприклад, функціонування стеків, черг і хеш-таблиць.
Середовище .NET Framework підтримує три основні типи колекцій: загального призначення, спеціалізовані і орієнтовані на побітову організацію даних. Колекції загального призначення реалізують ряд основних структур даних, включаючи динамічний масив, стек і чергу. Сюди також відносяться словники, призначені для зберігання пар ключ/значення. Колекції загального призначення працюють з даними типу object, тому їх можна використовувати для зберігання даних будь-якого типа.
Колекції спеціального призначення орієнтовані на обробку даних конкретного типу або на обробку унікальним способом. Наприклад, існують спеціалізовані колекції, призначені тільки для обробки рядків або однонаправленого списку.
Основою для всіх колекцій є реалізація нумератора, який підтримує інтерфейси IEnumerator і IEnumerable. Нумератор забезпечує стандартний спосіб поелементного доступу до вмісту колекції.
Інтерфейси колекцій.
У просторі імен System.Collections визначена велика кількість інтерфейсів. Інтерфейси колекцій визначають функції, загальні для всіх класів колекцій.
Інтерфейс ICollection.
Інтерфейс ICollection можна назвати фундаментом, на якому побудовані всі колекції. У нім оголошені основні методи і властивості, без яких не може обійтися жодна колекція. Він успадковує інтерфейс IEnumerable. Не знаючи суті інтерфейсу ICollection, неможливо зрозуміти механізм дії колекцій.
У інтерфейсі ICollection визначені наступні властивості:
Таблиця 5. Властивості інтерфейсу ICollection.
Властивість |
Опис |
int Count{get;} |
Кількість елементів колекції в даний момент |
bool IsSynchronized{get;} |
Приймає значення true, якщо колекція синхронізована, |
|
інакше значення false. За замовчуванням колекція не |
|
синхнонізована. |
object SyncRoot{get;} |
Об’ект, для якого колекція може бути синхронізована. |
Властивість Count – сама затребувана, оскільки містить кількість елементів, що зберігаються в колекції в даний момент. Якщо властивість Count дорівнює нулю, це означає, що колекція порожня. У інтерфейсі визначений наступний метод:
void CopyTo(Array target, int startIdx)
Метод CopyTo() копіює вміст колекції в масив, заданий параметром target, починаючи з індексу, заданого параметром startIdx.
Оскільки інтерфейс ICollection успадковує інтерфейс IEnumerable, він також включає його єдиний
метод GetEnumerator():
IEnumerator GetEnumerator()
Цей метод повертає нумератор колекції.
46
Інтерфейс IList.
Інтерфейс IList успадковує інтерфейс ICollection і визначає поведінку колекції, доступ до елементів якої дозволений за допомогою індексу з відліком від нуля. Крім методів, визначених в інтерфейсі ICollection, інтерфейс IList визначає і власні методи.
Об'єкти додаються в колекцію типа IList за допомогою виклику методу int Add(object obj). Зверніть увагу на те, що метод Add() приймає аргументи типу object. Оскільки клас object є базовим для всіх типів, в колекції можна зберегти об'єкт будь-якого типу.
Видалити об'єкт з колекції можна за допомогою методу Remove() або RemoveAt(). Для повного очищення колекції досить викликати метод Clear().
Щоб дізнатися, чи містить колекція заданий елемент, викличте метод Contains(). Отримати індекс заданого об'єкту допоможе метод IndexOf(), а вставити елемент по заданому індексу – метод
У класі IList визначений наступний індексатор:
object this[int idx] { get; set; }
Цей індексатор можна використовувати для прочитування або запису значення потрібного елементу. Але його не можна застосувати для додавання в колекцію нового елементу. Для цієї мети існує метод Add().
Інтерфейс IDictionary.
Інтерфейс IDictionary визначає поведінку колекції, яка встановлює відповідність між унікальними ключами і значеннями. Ключ – це об'єкт, який використовується для набуття відповідного йому значення. Отже, колекція, яка реалізує інтерфейс IDictionary, служить для зберігання пар ключ/значення. Збережену одного разу пару можна потім витягнути по заданому ключу. Інтерфейс IDictionary успадковує інтерфейс ICollection.
Щоб додати пару ключ/значення в IDictionary-колекцію, використовуйте метод void Add(object k, object v). Зверніть увагу на те, що ключ і його значення задаються як окремі параметри. Щоб видалити з колекції-словника непотрібний елемент, необхідно передати методу Remove() відповідний йому ключ. Для очищення всієї колекції використовується метод Clear(). Щоб визначити, чи містить колекція заданий об'єкт, досить викликати метод Contains(), передавши йому ключ елементу, що цікавить вас. Метод GetEnumerator() повертає нумератор, сумісний з колекцією IDictionary.
У інтерфейсі IDictionary визначені наступні властивості:
Таблиця 6. Властивості інтерфейсу IDictionary.
Властивість |
Опис |
bool IsFixedSize{get; } |
дорівнює значенню true, якщо словник має |
|
фіксований розмір |
bool IsReadOnly{get; } |
дорівнює значенню true, якщо словник |
|
тільки для |
ICollection Keys{get; } |
Отримує колекцію ключів |
ICollection Values{get; } |
Отримує колекцію значень |
Зверніть увагу на те, що за допомогою властивостей Keys та Values ключі та значення, що зберігаються в словарній колекції, можна отримати у вигляді окремих списків.
Клас ArrayList
Клас ArrayList призначений для підтримки динамічних масивів, які при необхідності можуть збільшуватися або скорочуватися. У C# стандартні масиви мають фіксовану довжину, яка не може змінюватися під час виконання програми.
47
Об'єкт класу ArrayList є масив змінної довжини, елементами якого є об'єктні посилання. Будь-який об'єкт класу ArrayList створюється з деяким початковим розміром. При перевищенні цього розміру колекція автоматично його збільшує. У разі видалення об'єктів масив можна скоротити. Колекція класу ArrayList, мабуть, найбільш вживана.
Клас ArrayList реалізує інтерфейси ICollection, IList, IEnumerable і ICloneable. У класі ArrayList визначені наступні конструктори:
public ArrayList()
public ArrayList(ICollection c)
public ArrayList(int capacity)
Перший конструктор призначений для створення порожнього ArrayList-масиву з початковою місткістю, рівною 16 елементам. Другий служить для побудови масиву, який ініціалізувався елементами і місткістю колекції, заданої параметром c. Третій конструктор створює масив із заданою початковою місткістю. Місткість – це розмір масиву для зберігання елементів. При додаванні елементів кожного разу, коли масив повинен автоматично розширитися, його місткість подвоюється.
Крім методів, визначених в інтерфейсах, які реалізує клас ArrayList, в нім визначені і власні методи. Найбільш вживані з них перераховані в Таблиці 7.
Таблиця 7. Найбільш вживані методи класу ArrayList.
Метод |
|
Опис |
public virtual void |
|
Додає элементи з колекції c в кінець колекції |
AddRange(ICollection c) |
|
|
public virtual int |
|
В коллекції виконується пошук значення, |
BinarySearch(object |
v) |
заданого параметром v. Повертає індекс |
|
|
знайденого елемента. |
public virtual void |
CopyTo(Array |
Копіює вміст колекції, починаюци з startIdx, в |
ar, int startIdx) |
|
масив |
public virtual void |
Sort() |
Сортує колекцію за збільшенням |
public virtual void |
Reverse() |
Розміщує елементи колекциії в зворотньому |
|
|
порядку |
Крім властивостей, визначених в інтерфейсах, що реалізовуються класом ArrayList, в нім також визначена властивість Capacity, що дозволяє дізнатися або встановити місткість динамічного масиву.
Клас Hashtable
Клас Hashtable призначений для створення колекції, в якій для зберігання об'єктів використовується хеш-таблиця. У хеш-таблиці для зберігання інформації використовується механізм, що іменується хешуванням (hashing). Суть хешування полягає в тому, що для визначення унікального значення, яке називається хеш-кодом, використовується інформаційний вміст відповідного йому ключа. Хеш-код потім використовується як індекс, по якому в таблиці відшукуються дані, відповідні цьому ключу. Перевага хешування в тому, що воно дозволяє зберігати постійним час виконання таких операцій, як пошук, прочитування і запис даних, навіть для великих об'ємів інформації.
Клас Hashtable реалізує інтерфейси IDictionary, ICollection, IEnumerable, ISerializable, ICloneable.
У класі Hashtable визначена велика кількість конструкторів, включаючи наступні (вони використовуються найчастіше):
public Hashtable()
public Hashtable(IDictionary c)
public Hashtable(int capacity)
48
public Hashtable(int capacity, float fillRatio)
Перша форма дозволяє створити стандартний об'єкт класу Hashtable. Друга для ініціалізації Hashtable-об'єкту використовує елементи заданої колекції c. Третя ініціалізує місткість створюваної хеш-таблиці значенням capacity, а четверта – як місткість (значенням capacity), так і коефіцієнт заповнення (значенням fillRatio). Значення коефіцієнта заповнення (також іменованого коефіцієнтом навантаження), яке повинне потрапляти в діапазон 0,1-1,0, визначає ступінь заповнення хеш-таблиці, після чого її розмір збільшується.
У класі Hashtable крім методів, визначених в реалізованих ним інтерфейсах, також визначені власні методи. Так, щоб визначити, чи містить Hashtable-колекція заданий ключ, досить викликати метод ContainsKey(). А щоб дізнатися, чи зберігається в хеш-таблиці задане значення, що цікавить вас, викличте метод ContainsValues(). Для опиту елементів Hashtable-колекції необхідно отримати нумератор типу IdictionaryEnumerator, викликавши метод GetEnumerator().
Приклад #1: System.Collections.IDictionary + Hash table
using System;
public class TestMain
{
public static void Main()
{
System.Collections.IDictionary dict=new System.Collections.Hashtable(); dict.Add("One",123);
dict.Add("two","Hello WOrld"); dict.Add(33,1234.5554); dict.Add("me","mdevi@comine.com");
Console.WriteLine("Item Count: " + dict.Count );
foreach(object keys in dict.Keys)
Console.WriteLine("Key: {0} Value: {1} ",keys,dict[keys]); }
if (dict.Contains("me")) { Console.WriteLine("key me is in collection"); }
dict.Remove("me"); // Remove Keyed Element
dict.Clear(); // Clear all items
}
}
Приклад #2: List Dictionary (single Linked list)
using System;
public class TestMain
{
public static void Main()
{
System.Collections.IDictionary dict=new System.Collections.Specialized.ListDictionary();
dict.Add("One",123); dict.Add("two","Hello WOrld"); dict.Add(33,1234.5554); dict.Add("me","mdevi@comine.com");
Console.WriteLine("Item Count: " + dict.Count );
foreach(object keys in dict.Keys)
Console.WriteLine("Key: {0} Value: {1} ",keys,dict[keys]); }
if (dict.Contains("me")) { Console.WriteLine("key me is in collection"); }
49
dict.Remove("me"); // Remove Keyed Element
dict.Clear(); // Clear all items
}
}
Клас SortedList
Клас SortedList призначений для створення колекції, яка зберігає пари ключ/значення у впорядкованому вигляді, а саме вони відсортовані по ключу. Клас SortedList реалізує інтерфейси IDictionary, ICollection, IEnumerable і ICloneable.
У класі SortedList визначено декілька конструкторів, включаючи наступні:
public SortedList()
public SortedList(IDictionary c)
public SortedList(int capacity)
public SortedList(Icomparer comp)
Перший конструктор дозволяє створити порожню колекцію з початковою місткістю, рівною 16 елементам. Другий створює SortedList-колекцію, яка ініціалізувалася елементами і місткістю колекції, заданої параметром c. Третій конструктор призначений для побудови порожнього SortedList-списку, який ініціалізувався місткістю, заданою параметром capacity. Четверта форма конструктора дозволяє задати метод порівняння, який повинен використовуватися для порівняння об'єктів списку. За допомогою цієї форми створюється порожня колекція з початковою місткістю, рівною 16 елементам.
Існують різні способи установки і прочитування ключа або значення. Щоб набути значення, пов'язаного із заданим індексом, викличте метод GetByIndex(), а щоб встановити значення, задане індексом, - метод SetByIndex(). Отримати ключ, пов'язаний із заданим індексом, можна за допомогою методу GetKey(). Для отримання списку всіх ключів використовуйте метод GetKeyList(), а для отримання списку всіх значень – метод GetValueList().
Розглянемо приклад використання класу SortedList.
using System;
using System.Collections;
using System.Collections.Generic; using System.Text;
namespace SortedList1
{
class Program
{
static void Main(string[] args)
{
SortedList footballTeams = new SortedList(); footballTeams.Add(1, "St. Louis Rams"); footballTeams.Add(2, "Kansas City Chiefs"); footballTeams.Add(3, "Indianapolis Colts");
for (int i = 0; i < footballTeams.Count; i++)
{
Console.WriteLine("KEY: " + footballTeams.GetKey(i) + " VALUE: " + footballTeams.GetByIndex(i));
}
Console.ReadLine();
}
}
}
50