Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОП Розраха.doc
Скачиваний:
3
Добавлен:
03.12.2018
Размер:
537.09 Кб
Скачать

Опис програми

Розроблена програма має такий алгоритм роботи для виконання поставленої задачі:

  • Визначення кількості елементів

Користувач вводить бажану кількість елементів ( n ) і під цю

кількість виділяється відповідний об’єм ДП для оптимізації розміру програми.

  • Заповнення масиву структур

У циклі з параметром проводиться зчитування відповідних полів МС.

Ф-я називається read. Вхідними параметрами ф-ї є вказівник на масив структур і кількість елементів. Ф-я не повертає значення.

void read(car *a,int n) // ф-я для введення вхідної інформації

{

int i;

printf("\nEnter information in such way:\n");

printf("\nMark\tNumber\tColour\tName\tAdress(Country/Town/Street)\tTech(Yes/No)\n");

for(i=0;i<n;i++) scanf("%s%s%s%s%s%s%s%s",&(a+i)->mark,&(a+i)->num,&(a+i)->col, &(a+i)->name,&(a+i)->adr.country,&(a+i)->adr.town,&(a+i)->adr.street,&(a+i)->teh);

}

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

Відповідно до завдання здійснюється сортування масиву структур за вказаним атрибутом, а саме номером авто.

Ф-я сортування називається sort. Вхідними параметрами ф-ї є вказівник на масив структур і кількість елементів. Сортування здійснюється методом бульбашки.

void sort(car *a,int n) // ф-я для сортування масиву структур за номером машини

{

car tp;

int i,j;

for (i=0;i<n-1;i++)

for (j=i+1;j<n;j++)

if ( (strcmp ( (a+i)->num,(a+j)->num) ) >0)

{

tp=*(a+i);

*(a+i)=*(a+j);

*(a+j)=tp;

}

}

  • Створення двонаправленого лінійного списку

Виділяю пам'ять для розташування у ній ДЛС. Додавання нових елементів здійснюю з кінця так як вважаю цей метод оптимальнішим з огляду на розмір коду.

Ф-я, яка створює ДЛС називається makelist. Сама функція є вказівником і має такі вхідні параметри: 2 вказівники на структуру яка описує ДЛС (list *а і list *q), вказівник на масив структур з якого буде братися інформація (car *b) і кількість елементів (n). ДЛС створюю зправа наліво, тобто з кінця. Функція повертає вказівник на голову списку.

list *makelist(list *a,list *q,car *b,int n) // Створення ДЛС

{

head=NULL; int i;

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

{

q=(list*)malloc(sizeof(list)); // додавання нових елементів

q->next=head; // відбувається з кінця списку

if (head!=NULL) head->prev=q; // <---

else tail=q;

head=q;

head->in=*(b+i);

}

head->prev=NULL;

return (head); // ф-я повертає вказівник на голову

}

  • Видалення зі списку вказаних елементів

Перш за все користувач вводить номер авто, які він бажає видалити з ДЛС. Починаючи з голови списку, я переглядаю поточний елемент ( а саме його поле з номером авто) і при співпадінні з введеним видаляю його, звільняючи тим самим об’єм ОП, яку він займав.

Ф-я, яка видаляє відповідні елементи з ДЛС називається del. Сама функція є вказівником і має такі вхідні параметри: 3 вказівники на структуру яка описує ДЛС (list *l, list *q і list *r), і кількість елементів (n). В залежності від розміщення елемента відбувається його видалення зі списку. Ф-я повертає вказівник на голову.

list *del(list *l,list *q,list *r,int n) // Видалення елементів

{

. . .

{

if ( (l->prev)&&(l->next) ) // якщо елемент всередині списку

{

. . .

}

else if ( (l->prev)&&(!(l->next) ) ) // якщо елемент є останнім

{

. . .

}

else if ( (l->next)&&(!(l->prev) )) // якщо елемент є першим

{

. . .

}

printf("\nErr");

}

else l=l->next;

}

return head; // ф-я повертає вказівник на head

}

  • Виведення на екран у вигляді таблиці відсортованого масиву структур і ДЛС

У циклі з параметром я виводжу введений і посортований масив структур. Крім того я виводжу ДЛС який, відповідно, є також відсортованим і без видалених елементів.

Ф-я, яка виводить елементи масиву структур на екран у вигляді таблиці називається print. Сама функція має такі вхідні параметри: вказівник на масив структур і кількість його елементів.

void print(car *a,int n) // ф-я виводить масив структур на екран у вигляді таблиці

{

int i;

printf("\n\tHere is the information (from list) :\n");

for(i=0;i<n;i++) printf("\n%-10s %-5s %-10s %-10s %-10s %-10s %-15s %-5s",(a+i)->mark,(a+i)->num,(a+i)->col,(a+i)->name,(a+i)->adr.country,(a+i)->adr.town,(a+i)->adr.street,(a+i)->teh);

}

  • Запис ДЛС у текстовий файл

Утворений двонаправлений лінійний список я записую у текстовий файл. Режим доступу до файлу « w+ » що дозволяє створити файл для запису й читання, якщо його не існує і перезаписати, якщо він відповідно існує.