Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Аналіз завдання та розробка методу вирішення задач

Читайте также:
  1. I. Цель и задачи Всероссийского
  2. II. Цели, принципы и задачи государственной демографической политики в Ульяновской области на период до 2025 года
  3. III. Музично-теоретичний аналіз.
  4. III. Цели, принципы, приоритетные направления и задачи государственной национальной политики Российской Федерации
  5. IV. Хорознавчий аналіз.
  6. V. Виконавський аналіз. Заключення.
  7. V. Домашнє завдання

Масив— впорядкований набір фіксованої кількості однотипних елементів, що зберігаються в послідовно розташованих комірках оперативної пам'яті, мають порядковий номер і спільне ім'я, що надає користувач.

Характеристика масиву:

· Розмірність — кількість індексів елемента (одновимірний, двовимірний, багатовимірний)

· Розмір — загальна кількість елементів у масиві.

· За типом поділяється на числовий та символьний.

Масив може бути одновимірним (вектором), та багатовимірним (наприклад, двовимірною таблицею), тобто таким, де індексом є не одне число, а кортеж (сукупність) з декількох чисел, кількість яких збігається з розмірністю масиву.

Масив називається одновимірним, якщо для завдання місцеположення елемента в масиві необхідно вказати значення лише одного індексу.

Масив називається двовимірним, якщо для завдання місцеположення елемента в масиві необхідно вказати значення двох індексів.

Запам’ятайте, що у двовимірних масивах перший індекс завжди вказує на номер рядка, а другий – на номер стовпчика в цьому рядку!

Загальний вигляд опису масивів:

<ім’я змінної>: array [<межі зміни індексів>] of <тип>;

Наприклад:

Var

A: array [1..10] of real;

B: array [1..100,1..100] of byte;

C:array [1..100] of array [1..100] of byte.

При виконанні завдання я використовував іменовані константи для

оголошення масивів розміру n × n, де n = (k + g) mod 3+6, (k – номер студента в журналі групи, g − номер групи (1 або 2)).

const

k=22;

g=1;

n=9;

var

A:array[1..n, 1..n] of integer;

B:array[1..n] of integer;

Наступним етапом є введення елементів масиву – це процес одержання значень елементів масиву. Існує декілька варіантів організації введення масиву: з використанням генератора випадкових чисел, за формулою, з використанням компонентів Memo, StringGrid і т.д.

Виходячи з завдання курсової роботи ми вводили елементи масиву А(n n) генеруючи числа випадковим чином з проміжку [-10g, 10k].

For i:=1 to n do

For j:=1 to n do

A[i, j]:= RendomRange(-10g, 10k);

З масиву, що відповідає матриці А (n n) утворили одновимірний масив В розмірністю n елементи якого є сумою непарних елементів відповідного рядка:

For i:=1 to n do

Begin

S:=0;

For j:=1 to n do

if A[i, j] mod 2<>0 then S:=S+a[i, j];

B[i]:=S;

End;

При рішенні багатьох завдань виникає необхідність опрацювання елементів масиву (пошуку елементів за певною властивістю, добуток, сума елементів, пошук максимального чи мінімального елемента і т.д.).

Для використання елементів масиву необхідно вказати ім’я масиву та індекселемента.

Виконуючи завдання 2, що полягає у пошуку максимального по модулю елемента масиву серед выдэмних А (n n) використовуємо алгоритм простого перебору:

for i:=1 to n do

for j:=1 to n do

if(a[i,j]<0) and (max<abs(a[i,j]))then max:=abs(a[i,j]);

Враховуючи те, що масиви є математичним об’єктом допускаються алгебраїчні операції над їх елементами.

Наведемо приклад опрацювання елементів одновимірних масивів В та С розмірності n для виконання обчислень в1с1+ в2с2+…+вncn:

S:=0;

For i:=1 to n do

S:=S+B[i]*C[i];

Передбачається, що сортовані дані розміщуються в масиві записів, кожна з яких містить ключ (він визначає порядок сортування) і деякі супутні дані. Передбачається також наявність функції порівняння двох ключів (оператора "менше" або "більша або дорівнює"). Супутні дані ніяк не впливають на порядок сортування і можуть не розглядатися. Дійсно, можна визначити другий масив цілих, елементи якого вказують на елементи першого масиву, потім сортувати тільки його:

Сортування (sortіng) − процес, що дозволяє впорядкувати безліч подібних даних у зростаючому або спадаючому порядку.

Алгоритми сортування добре досліджені і вивчені. Хоча деякі методи в середньому можуть бути краще інших, жоден з методів не буде ідеальним

для всіх ситуацій, тому кожен програміст повинен мати у своєму

розпоряджені кілька різних типів сортування. Можна виділити кілька типів які використовуються найчастіше: метод сортування вибором, метод сортування обміном, метод сортування вставки.

Один з найпростіших методів сортування працює наступним чином: знаходимо найменший елемент в масиві і обмінюємо його з елементом знаходяться на першому місці. Потім повторюємо процес з другої позиції у файлі і знайдений елемент обмінюємо з другим елементному і так далі поки весь масив не буде відсортований. Цей метод називається сортування вибором, оскільки він працює, циклічно вибираючи найменший з елементів, що залишилися, як показано на малюнку 1. При першому проході символ пропуску йде на перше місце, обмінюючись з буквою 'П'. На другому проході елемент 'В' обмінюється з елементом 'Р' і так далі.

Наступна програма дає повну реалізацію цього процесу. Для кожного i від 1 до N-1, вона обмінює найменший елемент з a [i.. N] з a [i]:

У міру просування покажчика i зліва направо через файл, елементи ліворуч від вказівника знаходяться вже у своїй кінцевій позиції (і їх більше вже не будуть чіпати), тому масив стає повністю відсортованим до того моменту, коли покажчик досягає правого краю.

Цей метод - один з найпростіших, і він працює дуже добре для невеликих файлів. Його «внутрішній цикл» складається з порівняння a [i] <a [min] (плюс код необхідний для збільшення j та перевірки на те, що він не перевищив N), що навряд чи можна ще спростити.

Крім того, хоча сортування вибором є методом «грубої сили», він має дуже важливе застосування: оскільки кожен елемент пересувається не більше ніж раз, то він дуже гарний для великих записів з маленькими ключами.

Метод сортування вставкою, майже настільки ж простий, що і сортування вибором, але набагато більш гнучкий. Цей метод часто використовують при сортуванні карток: беремо один елемент і вставляємо його в потрібне місце серед тих, що ми вже обробили (тим самим залишаючи їх отортірованнимі).

Розглянутий елемент вставляється в позицію за допомогою пересування більшого елемента на одну позицію вправо і за розміщенням меншого елемента в звільнилася позицію, як показано на малюнку 2. Так 'І' при третьому кроці менше всіх інших відсортованих елементів, тому ми «топимо» його в початок масиву. 'М»більше' І 'але менше за всіх інших, тому ми поміщаємо його між' І 'і' П ', і так далі.

Цей процес реалізований в наступній програмі. Для кожного i від 2 до N, подмассів a [1.. i] сортується за допомогою приміщення a [i] у відповідну позицію серед уже відсортованих елементів:

Також як і при сортуванні вибором, в процесі сортування елементи ліворуч від вказівника i знаходяться вже в сортованого порядку, але вони не обов'язково знаходяться у своїй останній позиції, оскільки їх ще можуть пересунути направо щоб вставити більш маленькі елементи зустрінуті пізніше. Масив стає повністю сортований коли покажчик досягає правого краю.

Проте є ще одна важлива деталь: програма insertion не завжди працює, оскільки while може проскочити за лівий край масиву, коли v - найменший елемент масиву. Щоб виправити ситуацію, ми поміщаємо «сторожовий» ключ в a [0], роблячи його, по крайней мере, не більше, ніж найменший ключ масиву. Сторожові елементи повсюдно використовуються в ситуаціях подібних до цієї для запобігання додаткової перевірки (у даному випадку j> 0), що майже завжди допомагає у внутрішніх циклах.

Елементарний метод сортування, який часто дають на вступних заняттях - це бульбашкове сортування: Завдання, що стоять поруч елементи масиву обмінюються місцями, до тих пір, поки зустрічаються невідсортовані пари. Реалізація цього методу дана нижче.

Щоб повірити в те, що вона насправді працює, може знадобитися якийсь час. Для цього зауважте, що коли під час першого проходу ми зустрічаємо максимальний елемент, ми обмінюємо його з кожним елементом праворуч

від нього поки він не опиниться в крайній правій позиції. На другому проході ми поміщаємо другий максимальний елемент у передостанню позицію і так далі. Бульбашкова сортування працює також як і сортування вибором, хоча вона і робить набагато більше роботи на те, щоб перемістити елемент у його кінцеву позицію.

Наведемо приклад як сортується одновимірний масив методом вставки та двох вимірний масив методом обміну.

Сортування одновимірного масиву методом вставки:

for i:=1 to n-1 do

begin

m_in:=i;

for j:=i+1 to n do

if c[j]<c[m_in] then m_in:=j;

t:=c[i];

c[i]:=c[m_in];

c[m_in]:=t;

end;

Сортування двовимірного масиву методом обмінного сортування:

for k:=1 to n do

for i:=1 to n-1 do

if Y[i]>Y[i+1]then

begin

t:=Y[i];

Y[i]:=Y[i+1];

Y[i+1]:=t;

for j:=1 to n do

begin

t:=D[i,j];

D[i,j]:=D[i+1,j];

D[i+1,j]:=t;

end;

Під виведенням розуміють вивід на екран монітора (у діалогове вікно) значень елементів масиву. Для даного процесу зазвичай використовують компоненту Memo та StringGrid.

У нашому випадку - виведення елементів одно та двовимірного масиву використовуючи компоненту StringGrid.

Одновимірний масив:

for i:=1 to n do

В[i]:=StrToInt(StringGrid1.Cells[0,i-1]);

Двовимірний масив:

for i:=1 to n do

for j:=1 to n do

StringGrid1.Cells[j,i]:=IntToStr(A[i,j]);
3 Опис структури программного проекту

 

procedure TForm1.N31Click(Sender: TObject);

begin

for i:=1 to n do

for j:=1 to n do

if(a[i,j]<0) and (max<abs(a[i,j]))then max:=abs(a[i,j]); ]); // Знаходження максимального по модулю елемента серед відємних.

edit1.Text:='Максимальний по модулю елемент серед відємних -'+IntToStr(max);

label3.caption:='В двовимірному масиві,що відповідає матриці A,'

+#13+ 'Максимальний по модулю елемент серед відємних'

end;

procedure TForm1.N41Click(Sender: TObject);

var

s:integer;

begin

for j:=1 to n do

begin

s:=1;

for i:=1 to n do

if A[i,j] mod 2=0 then

s:=s*A[i,j];

b[j]:=s;

StringGrid2.Cells[j-1,0]:=IntToStr(b[j]); //Виведення відсортоваго масиву

label3.caption:='З масиву, що відповідає матриці А утворити одновимірний масив В '

+#13+'B[i] є добутком парних елементів і-го стовпців:';

end;

end;

procedure TForm1.N51Click(Sender: TObject);

var

t:integer;

m_in:integer;

begin

for i:=1 to n do

c[i]:=b[i];

for i:=1 to n-1 do// Сортування масиву С

begin

Сортування масиву С

m_in:=i;

for j:=i+1 to n do

if c[j]<c[m_in] then m_in:=j;

t:=c[i];

c[i]:=c[m_in];

c[m_in]:=t;

end;

for i:=1 to n do

StringGrid3.Cells[i-1,0]:=IntToStr(c[i]); //Виведення відсортоваго масиву

Label3.Caption:='Відсортувати одновимірний масив В за методом вибору.'

+#13+'Результатом сортування - масив С.';

end;

procedure TForm1.N21Click(Sender: TObject);

begin

for i:=1 to n do

for j:=1 to n do

begin

A[i,j]:=RandomRange(-10,10*k);

StringGrid1.Cells[j-1,i-1]:=IntToStr(a[i,j]);

label3.caption:='Задано квадратну матрицю А розміром n*n, де n=(k+g) mod 3+6,'

+#13+'(k-номер студента в журналі групи, g-номер групи (1 або 2)).'

+#13+'матрицz заповнюються випадковим чином з проміжку [-10g,10k]';

end;

end;

procedure TForm1.N61Click(Sender: TObject);

var

S:real;

begin

S:=0;

for i:=1 to n do

begin

S:=S+cos(C[n-i+1]-B[i]);

edit2.text:=FloatToStr(S);

label3.caption:='Використовуючи елементи масивів В та С, виконати обчислення '

+#13+'';

image1.Visible:=true;

end;

end;

procedure TForm1.N71Click(Sender: TObject);

var

s,min,t,k:integer;

begin

//Обчислюємо характеристику стовпців матриці а

for i:=1 to n do

begin

s:=0;

for j:=1 to n do

if a[i,j] mod 2 <> 0 then

begin

s:=s+a[i,j];

x[i]:=s;

StringGrid4.Cells[0,i-1]:=IntToStr(x[i]);

end;

image1.Visible:=false;

end;

for i:=1 to n do

begin

//копія массиву x

y[i]:=x[i];

StringGrid6.Cells[0,i-1]:=IntToStr(x[i]);

end;

for i:=1 to n do

for j:=1 to n do

begin

d[i,j]:=a[i,j]; //копія массиву A

StringGrid5.Cells[j-1,i-1]:=IntToStr(d[i,j]);

label3.caption:='Відсортувати матрицю методом бульбашок'

end;

begin

for k:=1 to n do// Сортування масиву методом "Обміного сортування "

for i:=1 to n-1 do

if Y[i]>Y[i+1]then

begin

t:=Y[i];

Y[i]:=Y[i+1];

Y[i+1]:=t;

for j:=1 to n do

begin

t:=D[i,j];

D[i,j]:=D[i+1,j];

D[i+1,j]:=t;

end;

end;

for i:=1 to n do

StringGrid6.Cells[0,i-1]:=IntToStr(y[i]); //Виведення відсортованої характеристики

for i:=1 to n do

for j:=1 to n do

StringGrid5.Cells[j-1,i-1]:=IntToStr(d[i,j]); //Виведення відсортованого масиву

Label2.Caption:=('Завдання 6.'+#13+'Сортування масиву методом "Обміного сортування".');

end;

end;

procedure TForm1.N1Click(Sender: TObject);

begin

close;

end;

procedure TForm1.N72Click(Sender: TObject);

begin

for i:=1 to n do

begin

St:=' ';

for j:=1 to n do

St:=St+#9+IntToStr(A[i,j]); // Виведення матриці А в поле memo1.

Memo1.lines.add(st)

end;

Memo1.Lines.SaveToFile('A.txt'); // Виведення матриці А з поля memo в текстовий документ.

for i:=1 to n do

begin

St:=' ';

St:=St+#9+IntToStr(B[i]);

Memo2.lines.add(st)

end;

Memo2.Lines.SaveToFile('B.txt');

for i:=1 to n do

begin

St:=' ';

St:=St+#9+IntToStr(C[i]);

Memo3.lines.add(st)

end;

Memo3.Lines.SaveToFile('C.txt');

for i:=1 to n do

begin

St:=' ';

St:=St+#9+IntToStr(X[i]);

Memo4.lines.add(st)

end;

Memo4.Lines.SaveToFile('X.txt');

for i:=1 to n do

begin

St:=' ';

for j:=1 to n do

St:=St+#9+IntToStr(d[i,j]);

Memo5.lines.add(st)

end;

Memo5.Lines.SaveToFile('d.txt');

label3.caption:='Збереження масивів';

end;

 

end.

 


Дата добавления: 2015-11-04; просмотров: 138 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Структура розгалуження| Реалізація проекту в середовищі Borland Delphi

mybiblioteka.su - 2015-2024 год. (0.036 сек.)