Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 Курс / Практика / metodichka_u_praktika.doc
Скачиваний:
10
Добавлен:
30.05.2020
Размер:
2.15 Mб
Скачать

Void s_qs(tStudent st[], int n)

{

struct

{

int l;

int r;

} stack[20];

int i,j, left, right, x, s=0;

TStudent t;

stack[s].l=0; stack[s].r=n-1;

while (s != -1)

{

left=stack[s].l; right=stack[s].r;

s--;

while (left < right)

{

i=left; j=right; x=st[(left+right)/2].oaip;

while (i <= j)

{

while (st[i].oaip < x) i++;

while (st[j].oaip > x) j--;

if (i<=j) {

t=st[i]; st[i]=st[j]; st[j]=t;

i++; j--;

}

}

if ((j-left)<(right-i))

{

if (i<right) {s++; stack[s].l=i; stack[s].r=right; }

right=j;

}

else {

if (left<j) {s++; stack[s].l=left; stack[s].r=j; }

left=i;

}

}

}

}

Підключення функції: s_qs(stud, nst);

11.3. Індивідуальні завдання

Використовувати програму, складену при виконанні лабораторної роботи № 10. Упорядкувати по неубуванню масив структур по заданому ключу, вказаними в індивідуальному завданні методами.

1. Ключ: ціна товару. Методи сортування: QuickSort і сортування вибором.

2. Ключ: середній бал. Методи сортування: QuickSort і сортування вставкою.

3. Ключ: час відправлення. Методи сортування: QuickSort і бульбашкове сортування.

4. Ключ: кількість відпрацьованого годинника за місяць. Методи сортування: QuickSort і сортування вибором.

5. Ключ: вік. Методи сортування: QuickSort і сортування вставкою.

6. Ключ: рік видання. Методи сортування: QuickSort і бульбашкове сортування.

7. Ключ: код деталі. Методи сортування: QuickSort і сортування вибором.

8. Ключ: дата початку роботи. Методи сортування: QuickSort і сортування вставкою.

9. Ключ: сумарний бал. Методи сортування: QuickSort і бульбашкове сортування.

10. Ключ: час вильоту. Методи сортування: QuickSort і сортування вибором.

11. Ключ: час відправлення. Методи сортування: QuickSort і сортування вставкою.

12. Ключ: середній бал. Методи сортування: QuickSort і бульбашкове сортування.

13. Ключ: дата приймання в ремонт. Методи сортування: QuickSort і сортування вибором.

14. Ключ: номер телефону абонента. Методи сортування: QuickSort і сортування вставкою.

15. Ключ: номер картки. Методи сортування: QuickSort і бульбашкове сортування.

Робота №12

Пошук по ключу в одновимірному масиві структур

12.1. Пошук в масиві

Лінійний пошук (метод повного перебору)

int p_lin1(int a[],int n, int x)

{

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

if (а[i]==x) return i;

return -1;

}

Двійковий пошук

int p_dv(int a[],int n, int x)

{

int i=0, j=n-1, m;

while(i<j)

{

m=(i+j) /2;

if (x > а[m]) i=m+1; else j=m;

}

if (а[i]==x) return i;

else return -1;

}

Інтерполяційний пошук. Зазвичай 1–2 перших кроку робиться за допомогою інтерполяційного пошуку, а потім використовується двійковий пошук.

int p_dv(int a[],int n, int x)

{

int i=0, j=n-1, m;

while(i<j)

{

if (а[i]==a[j]) // Запобігання діленню на нуль

if (а[i]==x) return i;

else return -1;

m=i+(j-i)*(x-а[i])/(а[j]-a[i]);

if (а[m]==x) return m;

else

if (x > а[m]) i=m+1; else j=m-1;

}

return -1;

}

12.2. Індивідуальні завдання

Використовувати програму, складену при виконанні лабораторної роботи № 11. Знайти у відсортованому масиві структур заданий елемент вказаними методами пошуку (для спрощення передбачаємо, що в масиві присутній лише один елемент з потрібними характеристиками).

1. Знайти товар ціною 150 000 р. Методи пошуку: повний перебір і двійковий.

2. Знайти студента, що має середній бал 7,3. Методи пошуку: повний перебір і інтерполяційний.

3. Знайти автобус, що вирушає в рейс в 1300. Методи пошуку: повний перебір і двійковий.

4. Знайти співробітника, відпрацьованого за місяць 156 годин. Методи пошуку: повний перебір і інтерполяційний.

5. Знайти спортсмена, якому 28 років. Методи пошуку: повний перебір і двійковий.

6. Знайти книгу 1966 р. видання. Методи пошуку: повний перебір і інтерполяційний.

7. Знайти деталь з кодом 09383. Методи пошуку: повний перебір і двійковий.

8. Знайти співробітника, що працює з 1975 р. Методи пошуку: повний перебір і інтерполяційний.

9. Знайти абітурієнта, що набрав 287 балів. Методи пошуку: повний перебір і двійковий.

10. Знайти літак, що вилітає в 1400. Методи пошуку: повний перебір і інтерполяційний.

11. Знайти поїзд, що вирушає в 2100. Методи пошуку: повний перебір і двійковий.

12. Знайти студента з середнім балом 8,3. Методи пошуку: повний перебір і інтерполяційний.

13. Знайти телевізор, зданий в ремонт 25 чисел. Методи пошуку: повний перебір і двійковий.

14. Знайти абонента з номером 21603. Методи пошуку: повний перебір і інтерполяційний.

15. Знайти покупця з номером картки 00458. Методи пошуку: повний перебір і двійковий.

Робота №13

Програмування з використанням однонаправлених списків типа «стік»

13.1. Робота із стеками

Оголошена структура наступного типа:

struct tstk

{ int inf;

tstk *a; } sp;

Додавання елементу в стек

tstk *AddStask(tstk *sp, int inf)

{ tstk *spt=new tstk;

spt->inf = inf;

spt->a = sp;

return spt; }

Читання елементу з видаленням

tstk *ReadStackD(tstk *sp, int &inf)

{ if (sp == NULL) return NULL;

tstk *spt = sp;

inf= sp->inf;

sp = sp->a;

delete spt;

return sp; }

Видалення всього стека

tstk *DelStackAll(tstk *sp)

{ tstk *spt; int inf;

while(sp != NULL) {

spt = sp;

inf= sp->inf;

cout << inf << endl;

sp = sp->a;

delete spt; }

return NULL; }

Обмін наступних за поточним елементів

void RevStackAfter(tstk *sp)

{ tstk *spt = sp->a->a;

sp->a->a = spt->a;

spt->a = sp->a;

sp->a = spt; }

13.2. Індивідуальні завдання

Створити стек з числами в діапазоні від –50 до +50. Після створення стека виконати індивідуальне завдання. В кінці роботи всі стеки мають бути видалені.

1. Перетворити стек в два стеки. Перший повинен містити лише позитивні числа, а другий – негативні.

2. Створити новий стек, що містить лише парні числа з першого стека.

3. Створити новий стек, що містить лише ті числа з першого стека, які більше середнього значення всіх елементів першого стека.

4. Створити новий стек, що містить лише позитивні числа з першого стека.

5. Підрахувати, скільки елементів стека мають значення, яке перевищує середнє значення всіх елементів стека.

6. Знайти максимальне і мінімальне значення стека.

7. Визначити, скільки елементів стека, починаючи з вершини, знаходиться до елементу з максимальним значенням.

8. Визначити, скільки елементів стека, починаючи від вершини, знаходиться до елементу з мінімальним значенням.

9. Визначити, скільки елементів стека знаходиться між його мінімальним і максимальним елементами.

10. Визначити, скільки елементів стека мають значення менше середнього значення всіх елементів стека.

11. Створити новий стек, що містить лише числа, великі середнього значення всіх елементів першого стека.

12. Перетворити стек в два стеки. У перший помістити всі парні, а в другій – всі непарні числа.

13. Створити новий стек, порядок дотримання елементів в якому зворотний відносно першого стека.

14. Створити новий стек, в який помістити кожен третій елемент першого стека.

15. Створити новий стек, в який помістити елементи, лежачі в другій половите першого стека.

Робота №14

Програмування з використанням

Однонаправлених списків типа «ЧЕРГА»

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

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

Додавання елементу в чергу

void AddOch(toch **sp,toch **spk, int inf)

{

toch *spt=new toch;

spt->inf = inf;

spt->a = NULL;

if (*spk == NULL) // Якщо немає елементів

*sp=*spk=spt;

else

{ (*spk)->a = spt; *spk = spt; }

return;

}

Підключення:

sp=spk=NULL;

AddOch(&sp &spk, інформація);

Читання елементу з видаленням

toch *ReadOchD(toch *sp, int &inf)

{

if (sp == NULL) return NULL;

inf= sp->inf;

toch *spt = sp;

sp = sp->a;

delete spt;

return sp;

}

Видалення елементу, наступного за поточним

void DelOchAfter(toch *sp)

{

if (sp->a == NULL) return;

toch *spt = sp->a;

sp->a = sp->a->a;

delete spt;

}

Видалення всієї черги

void DelOchAll(toch **sp, toch **spk)

{

toch *spt; int inf;

while(*sp != NULL)

{

spt = *sp;

inf= (*sp)->inf;

cout << inf << endl;

*sp = (*sp)->a;

delete spt;

}

*spk=NULL;

}

14.2. Індивідуальні завдання

Створити однонаправлену чергу з числами в діапазоні від –50 до +50. Після створення черги виконати індивідуальне завдання. В кінці роботи всі черги мають бути видалені.

1. Видалити з черги всі парні числа.

2. Видалити з черги всі негативні числа.

3. Поміняти місцями крайні елементи черги.

4. Поміняти місцями мінімальний і максимальний елементи черги.

5. Видалити з черги кожен другий елемент.

6. Видалити з черги всі елементи, розташовані до мінімального елементу черги.

7. Поміняти місцями найбільший серед негативних і найменший серед позитивних елементів черги.

8. Помістити максимальний елемент черги на першу позицію.

9. Поміняти місцями мінімальний і перший елементи черги.

10. Поміняти місцями перший і останній елементи черги.

11. Видалити перший і останній елементи черги.

12. Видалити з черги всі елементи, розташовані між мінімальним і максимальним елементами черги.

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

14. Знайти середнє значення всіх елементів черги і видалити всі елементи, які менше середнього значення.

15. Знайти середнє значення всіх елементів черги. Помістити найближчий до середнього значення елемент черги на першу позицію.