cout << "4. Open file" << endl;
cout << "5. Vivesti result" << endl;
cout << "6. Vivesti v fail" << endl;
cout << "7. Exit" << endl;
int i;
cin >> i;
return i;
}
void nnf() // Ввести ім'я файлу
{
cout << "Vvedite file name" << endl;
cin >> name;
}
void newf() // Створити новий файл
{
if ((fl = fopen(name,"wb"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
exit(1);
}
cout << "OK" << endl;
fclose(fl);
}
void spisok() // Ввести список
{
if ((fl = fopen(name,"rb+"))==NULL)
{
cout << "Oshibka pri sozdanii"<<endl;
exit(1);
}
cout << "Vvedite chislo studentov " << endl;
cin >> nst;
for (int i=0; i<nst; i++)
{
cout << "Vvedite imya: ";
cin >> stud[i].fio;
cout << "Vvedite otcenku ро matematike: ";
cin >> stud[i].matem;
cout << "Vvedite otcenku ро OAiP: ";
cin >> stud[i].oaip;
fwrite( &stud[i], sizeof(TStudent), 1, fl );
}
fclose(fl);
}
void opf() // Відкрити файл
{
if ((fl = fopen(name,"rb"))==NULL)
{
cout << "Oshibka pri otkritii"<<endl;
exit(1);
}
nst=0; TStudent std;
while(true)
{
int nwrt = fread( &std, sizeof(TStudent), 1, fl );
if (nwrt!=1) break;
stud[nst]=std;
cout << stud[nst].fio << " " << stud[nst].matem
<< " " << stud[nst].oaip << endl;
nst++;
}
fclose(fl);
}
void resc() // Вивести результат на екран
{
for (int i=0; i<nst; i++)
if (stud[i].oaip=='4')
cout << stud[i].fio << endl;
}
void resf() // Вивести результат у файл
{
char namet[30];
FILE *ft;
cout << "Vvedite imya faila" << endl;
cin >> namet;
if ((ft = fopen(namet,"w"))==NULL)
{
cout << "Oshibka pri sozdanii "<<endl;
exit(1);
}
char s[80];
for (int i=0; i<nst; i++)
if (stud[i].oaip=='4')
{
strcpy(s, stud[i].fio);
strcat(s, "\n"); // Додавання роздільника рядків
fputs(s, ft);
}
fclose(ft);
}
10.4. Індивідуальні завдання
У програмі передбачити збереження даних, що вводяться, у файл і можливість читання з раніше збереженого файлу. Результати виводити на екран і в текстовій файл.
1. Список товарів, що є на складі, включає найменування товару, кількість одиниць товару, ціну одиниці і дату вступу товару на склад. Вивести список товарів, що зберігаються більше місяця і вартість яких перевищує 1 000 грн.
2. Для здобуття місця в гуртожитку формується список студентів, який включає ФІО студента, групу, середній бал, дохід на члена сім'ї. Вивести інформацію про студентів, в яких дохід на члена сім'ї менше двох мінімальних зарплат.
3. У довідковій автовокзалу зберігається розклад руху автобусів. Для кожного рейса вказані його номер, пункт призначення, час відправлення і прибуття. Вивести інформацію про рейси, якими можна скористатися для прибуття в пункт призначення раніше заданого часу.
4. Інформація про співробітників фірми включає ФІО, кількість годинника, що пропрацював, за місяць, почасовою тариф. Робочий час понад 144 години вважається наднормовим і оплачується в подвійному розмірі. Вивести розмір заробітної плати кожного співробітника фірми за вирахуванням прибуткового податку, який складає 12 % від суми заробітку.
5. Інформація про учасників спортивних змагань містить назву команди, ФІО гравця, вік. Вивести інформацію про спортсменів, вік яких не досяг 18 років.
6. Для книг, що зберігаються в бібліотеці, задаються автор, назва, рік видання, кількість сторінок. Вивести список книг, виданих після заданого року.
7. На заводі випускається декілька найменувань деталей. Відомості про деталі включають код деталі, кількість випущених деталей, номер місяця випуску. Вивести інформацію про продукцію, випущену заданим цехом за останній місяць.
8. Інформація про співробітників підприємства містить ФІО, номер відділу, посаду, дату початку роботи. Вивести список співробітників заданого відділу, що пропрацювали на підприємстві більше 20 років.
9. Ведомость абітурієнтів містить ФІО, місто мешкання, сумарний бал. Вивести інформацію про абітурієнтів, що проживають в м. Сумах і мають бал більше 12.
10. У довідковій аеропорту зберігається розклад вильоту літаків на наступну добу. Для кожного рейса вказані номер рейса, пункт призначення, час вильоту. Вивести всі номери рейсів і час вильоту літака для заданого пункту призначення.
11. У адміністратора залізничних кас зберігається інформація про вільні місця в поїздах. Інформація представлена в наступному вигляді: номер поїзда, пункт призначення, час відправлення, число вільних місць. Вивести інформацію про поїзди, в яких є вільні місця до заданого пункту призначення.
12. Ведомость студентів, що здавали сесію, містить ФІО і оцінки по чотирьох предметах. Вивести список студентів, що здали сесію з середнім балом більше 7.
13. У радіоательє зберігаються квитанції про здані в ремонт телевізори. Кожна квитанція містить наступну інформацію: марка телевізора, дата приймання в ремонт, стан готовності замовлення (виконаний, не виконаний). Вивести інформацію про замовлення, які на даний момент не виконані.
14. На АТС інформація про розмови містить номер телефону абонента, час розмови і тариф. Вивести для заданого абонента суму, яку йому слід сплатити за розмови.
15. У магазині складений список людей, яким видана карта постійного покупця. Кожен запис цього списку містить номер картки, ФІО, знижку, що надається. Вивести інформацію про покупців, що мають 10 %-ную знижку в магазині.
Работа №11
Сортування по ключу одновимірних масивів структур
11.1. Сортування масивів
Метод бульбашки
void s_puz(int a[], int n)
{
int i,j,t;
for(i=1; i < n; i++)
for( j=n-1; j >= i; j--)
if (а[j-1]> а[j])
{ t = а[j-1]; а[j-1]= а[j]; а[j]= t; }
}
Сортування вибором
void s_vb(int a[], int n)
{
int imin,i,j,t;
for(i=0; i<n-1; i++)
{
imin=i;
for(j=i+1; j<n; j++)
if (а[imin]>а[j]) imin=j;
if (imin != i)
{
t = а[imin];
а[imin]= а[i];
а[i]= t;
}
}
}
Сортування вставками
void s_vst(int a[], int n)
{
int i,j,t;
for(i=1; i<n; i++)
{
t=a[i];
for(j=i-1; j>=0 && t<a[j]; j--) а[j+1]=a[j];
а[j+1]= t;
}
}
11.2. Приклад виконання роботи
Функція для сортування методом QuickSort. Сортування ведеться по ключу – оцінка по ОАїП (використовуються типи даних, оголошені в попередньому прикладі (пункт 10.3)).
{
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);
Використовувати програму, складену при виконанні лабораторної роботи № 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. Знайти середнє значення всіх елементів черги. Помістити найближчий до середнього значення елемент черги на першу позицію.