Завдання p>
Реалізувати базу даних на основі двонаправленого динамічногосписку, що містить прізвище, ім'я, по батькові людини, дату його народження ізнак зодіаку за західним календарем. p>
У програмному виробі передбачити роботу зі списком, якавключає в себе:
1. Введення даних;
2. Видалення даних зі списку;
3. Виведення списку на дисплей;
4. Сортування списку за прізвищем. P>
Написати програмне виріб на двох мовах програмування: C,
Pascal. P>
Опис алгоритму програми зі структурою даних p>
Взаємодія програми з користувачем повинно бути реалізовано занаступним алгоритмом: p>
Вибір з головного меню однієї з наступних функцій: а) Додати; б) Видалити; в) Подивитися; г) Сортувати; д) Вихід. p>
Після виконання кожної функції необхідно забезпечити повернення вголовне меню і вибір будь-якої іншої функції. p>
Якщо вибрати "Вихід" робота програми завершується. p>
Якщо вибрати «Додати», виділяється пам'ять для зберігання даних,потім користувачеві пропонується ввести прізвище, ім'я, по батькові і датународження людини, ці дані заносяться в пам'ять, після чого автоматичновизначається знак зодіаку за західним календарем і заноситься в пам'ять. p>
При виборі функції «Видалити», перевіряється наявність даних у списку.
Якщо список пустий, на дисплей виводиться відповідне повідомлення; інакшекористувачеві пропонується ввести прізвище, ім'я та по батькові особи, післячого відбувається його пошук у списку. Якщо дані на особу внесено досписок, то відбувається видалення цих даних і звільнення пам'яті; інакше надисплеї з'являється напис про їх відсутності. p>
При виборі функції «Переглянути», звіряти наявність даних у списку.
Якщо дані відсутні, на дисплей виводиться відповідне повідомлення;інакше виводиться таблиця, що містить прізвище, ім'я, по батькові, дату народженнялюдини та її знак зодіаку за західним гороскопом. p>
При виборі функції «Сортувати», відбувається сортування списку запрізвища. Якщо в списку зустрічаються дві однакові прізвища, тодіпорівнюються імена; при збігу імен порівнюються по батькові. p>
Опис програми p>
Для реалізації динамічного списку в програмі застосований типпокажчиків, що вказує на запис "Inform", що містить прізвище "fam", ім'я
"Name", по батькові "fanem", день народження "bethday", знак зодіаку "zodiak" іпокажчики на наступний "next" і попередній "prev" елементи списку. p>
За допомогою цього типу "Ukazat" описані змінні: "temp" - длязберігання покажчика на поточний елемент; "first" - для зберігання покажчика наперший елемент у списку; "cut" - для зберігання на останній елемент усписку. Змінна "ch" використовується для вибору процедури; "s1", "s2", "n"
- Для обчислення знаку зодіаку, "m" - для перевірки умови, при сортуванні;
"Ffam", "fname", "ffanem" - для тимчасового зберігання прізвища, імені,по батькові, при видаленні елемента зі списку. p>
Програма починає виконуватися з присвоєння вказівником на першійелемент (first) значення "nil". Після цього користувачеві пропонуєтьсявибрати дію: «1-Додати», «2-Видалити», «3-Подивитися", "4 -
Сортувати »,« 0-Вихід ». Залежно від того, яку дію виберекористувач, почне виконуватися та чи інша процедура, або відбудетьсявихід з програми. Це реалізовано за допомогою операції вибору "case". Післявиконання деякої процедури користувачеві знову пропонується вибрати однуз вищевказаних дій, поки не вийдете з програми. Цереалізовано за допомогою циклу "repeat until". p>
Процедура долучення "Dobav". p>
Спочатку виділяється пам'ять під поточний елемент (new (temp)), потім уцей елемент записується прізвище, ім'я, по батькові та дата народження. За датоюнародження обчислюється знак зодіаку. Для цього в s2 записується числонародження, а в s1 перші три букви місяця народження, потім, шляхом порівнянняцих критеріїв, числами і частинами слів знаходиться відповідний знакзодіаку, і заноситься в поточний елемент. Після введення інформації, перевіряєтьсянаявність елементів у списку. Якщо вони відсутні, то в поточному елементі,вказівниками на наступний (next) і попередній (prev) елементи присвоюєтьсязначення "nil"; а покажчик на сам елемент (temp) присвоюється вказівникамина перший (first) і останній (cut) елементи у списку. Якщо список непорожній, то в поточному елементі, вказівником на наступний елемент (next)присвоюється значення "nil", а вказівником на попередній елемент (prev)присвоюється покажчик на останній елемент (cut) у списку, а вказівником нанаступний елемент (next) останнього елемента в списку і вказівником наостанній елемент (cut) присвоюється вказівник на поточний елемент (temp).
Після чого процедура додавання завершується. P>
Процедура видалення "Udal". P>
У цій процедурі спочатку перевіряється наявність елементів у списку. Якщосписок порожній, то з'являється повідомлення: «Таблиця порожній». Якщо ж списокмістить елементи, то користувачеві пропонується ввести прізвище, ім'я тапо батькові що видаляється, записуючи їх у ffam, fname, ffanem відповідно.
Після відбувається пошук видаляється елемента в списку. Це реалізовано здопомогою циклу, що виконується, поки елемент не знайдено або непередивлятися весь список. Якщо шуканий елемент відсутній, то виводитьсяповідомлення: «Такого немає». Якщо ж шуканий елемент знайдений, то поточнийпокажчик (temp) показує на нього, і походить його видалення. p>
Якщо покажчики на перший (first) і останній (cut) елементи не рівні,то відбувається пошук місцезнаходження елемента в списку. Якщо у поточномуелемента вказівник на попередній елемент (prev) дорівнює nil, тоді вказівникомна попередній елемент (prev) всередині наступного за поточним елементомприсвоюється вказівник на попередній елемент у поточному, а вказівникомна перший елемент (first) у списку присвоюється покажчик на наступнийелемент. Якщо всередині поточного елемента вказівник на наступний елемент
(next) дорівнює nil, тоді вказівником на наступний елемент (next) всерединіпопереднього перед поточним елементом присвоюється покажчик на наступнийелемент у поточному, а вказівником на останній елемент (cut) у спискуприсвоюється вказівник на попередній елемент. Якщо поточний елементвиявився «всередині» списку, тоді вказівником на наступний елемент (next)усередині попереднього перед поточним елементом присвоюється вказівник нанаступний елемент у поточному, а вказівником на попередній елемент (prev)всередині наступного за поточним елементом присвоюється вказівник напопередній елемент у поточному. p>
Якщо ж покажчики на перший (first) і останній (cut) елементи рівні,то вказівником на перший елемент у списку (first) присвоюється nil. p>
Після деяких перетворень усередині списку відбувається вивільненняпам'яті поточного елементу (dispose (temp)). На цьому процедура видаленнязавершується. p>
Процедура перегляду "Prosm". p>
Ця процедура виконує висновок вмісту списку у вигляді таблиці. p>
Спочатку на дисплей виводиться шапка таблиці, що містить: «Прізвище Назва
По-батькові »,« Дата народження »та« Знак зодіаку ». Після виведення шапки перевіряєтьсянаявність елементів у списку. p>
Якщо список містить елементи, то відбувається їх порядковий висновок. Цереалізовано за допомогою циклу, що виконується, поки вказівник на поточнийелемент (temp) не перебере всі елементи списку. У циклі обчислюється довжинапрізвища, імені та по батькові, після чого вони виводяться на дисплей, а за нимививодяться дата народження та знак зодіаку, потім вказівником на поточний елемент
(temp) присвоюється покажчик на наступний за ним елемент. p>
Якщо список виявиться порожній, то з'являється повідомлення: «Таблиця порожня». p>
Після завершення циклу або виведення повідомлення, процедура переглядузавершується. p>
Процедура сортування "Sortir". p>
Для цієї процедури застосована локальна змінна "tmp" типу "ukazat".
Тут спочатку перевіряється наявність елементів у списку. P>
Якщо список містить елементи, то змінної "m" присвоюєтьсязначення "true", потім виконується цикл, поки "m = true". У циклі змінної
"M" присвоюється значення "false", вказівником на поточний елемент (temp)присвоюється вказівник на перший елемент у списку (first), і виконуєтьсявкладений цикл, поки вказівник на наступний елемент у поточному НЕдорівнює "nil". У цьому циклі перевіряється який елемент більше. P>
Якщо поточний елемент виявиться більше ніж наступний за ним елемент,тоді змінної "m" присвоюється значення "true", і перевіряєтьсямісцезнаходження поточного елемента в списку. Якщо він виявиться на початкусписку, то вказівником на перший елемент у списку (first) присвоюєтьсяпокажчик на наступний елемент за поточним, а інакше вказівником на наступнийелемент (next) всередині попереднього перед поточним елементом присвоюєтьсяпокажчик на наступний елемент у поточному. Якщо ж поточний елементопиниться в кінці списку, тоді вказівником на останній елемент у спискуприсвоюється вказівник на поточний елемент, а локальної змінної "tmp"присвоюється значення "nil", а інакше вказівником на попередній елемент
(prev) наступного елементу після наступного за поточним елементомприсвоюється вказівник на поточний елемент, а локальної змінної (tmp)присвоюється покажчик на наступний елемент після наступного за поточнимелементом. Після з'ясування місця розташування і виконання деяких команд,вказівником на наступний елемент після наступного за поточним елементомприсвоюється вказівник на поточний елемент, вказівником на попередній елементнаступного за поточним елементом присвоюється вказівник на попереднійелемент перед поточним; а всередині поточного елемента вказівником на попереднійперед поточним присвоюється покажчик на наступний елемент за поточним, івказівником на наступний елемент за поточним присвоюється локальназмінна "tmp". Якщо ж поточний елемент виявиться не більше ніж наступнийза ним елемент, тоді вказівником на поточний елемент (temp) присвоюєтьсяпокажчик на наступний за ним елемент (next). На цьому виконання вкладеногоциклу завершується. p>
Змінній "m" знову присвоюється значення "false", а вказівником напоточний елемент (temp) присвоюється покажчик на останній елемент усписку (cut), і виконується ще один вкладений цикл, поки вказівник напопередній елемент у поточному не дорівнює "nil". У цьому цикліперевіряється який елемент менше. p>
Якщо поточний елемент виявиться менше ніж попередній перед ним елемент,тоді змінної "m" присвоюється значення "true", і перевіряєтьсямісцезнаходження поточного елемента в списку. Якщо він виявиться в кінцісписку, то вказівником на останній елемент у списку (cut) присвоюєтьсявказівник на попередній елемент перед поточним, а інакше вказівником напопередній елемент (prev) всередині наступного за поточним елементомприсвоюється вказівник на попередній елемент у поточному. Якщо жпоточний елемент виявиться на початку списку, тоді вказівником на перший елементв списку присвоюється вказівник на поточний елемент, а локальної змінної
"Tmp" присвоюється значення "nil", а інакше вказівником на наступний елемент
(next) попереднього елемента перед попереднім до поточного елементаприсвоюється вказівник на поточний елемент, а локальної змінної (tmp)присвоюється вказівник на попередній елемент перед попереднім до поточногоелементу. Після з'ясування місця розташування і виконання деяких команд,вказівником на попередній елемент перед попереднім до поточного елементаприсвоюється вказівник на поточний елемент, вказівником на наступний елементпопереднього перед поточним елементом присвоюється покажчик на наступнийпісля поточного, а всередині поточного елемента вказівником на наступний елементприсвоюється вказівник на попередній елемент, і вказівником на попереднійелемент присвоюється локальна змінна "tmp". Якщо ж поточний елементвиявиться не менше ніж попередній перед ним елемент, тоді вказівником напоточний елемент (temp) присвоюється вказівник на попередній перед нимелемент (prev). На цьому виконання вкладеного циклу завершується. P>
Якщо під час перевірки наявності елементів в списку виявиться, що вінпорожній, то з'являється повідомлення: «Таблиця порожня».
Після завершення циклу або виведення повідомлення, процедура сортуваннязавершується. p>