Текст програми: p>
# include
# include
# include
# include
# include p>
struct PL// Завдання структурних змінних p>
(char namepl [18]; int year; char people [15]; unsigned int sputnik; p>
PL * prev; p>
PL * next; p>
); p>
void menu1 ()// Функція головного меню
(Clrscr (); printf ( "nt ?---------------------------------------- --------------------< br>
? n "); printf (" t | |
"); Puts (" nt | К А Р Т О Т Е К А П Л А Н Е Т
| n "); p>
"t | tt З О Л Н Е Л Н О Й С И С Т Е М И |
"); Puts (" t ?------------------------------------------ ------------------?< br>
"); Puts (" ntt Головне меню: n "); puts (" tt 1 - Рекомендації користувачеві. "); Puts (" tt 2 - Введення даних. "); Puts (" tt 3 - Виведення всіх даних. ") ; puts ( "tt 4 - Перегляд, видалення, додавання."); puts ( "tt 5 - Виведення даних за певною ознакою."); puts ( "tt 6 - Сортування."); puts ( "tt 7 - Вихід. ");
) p>
void menu2 ()// Меню пошуку елементів
(Puts ( "nnnnttt Меню пошуку: n"); puts ( "ttt 1 - Висновок за назвою планети."); Puts ( "ttt 2 - Висновок по року відкриття."); Puts ( "nnnnnnnnnnnnnnnt Для виходу в головне меню, натисніть будь-яку клавішу .");< br>
) p>
void sovet (char * s)// Функція підказки
(Window (1,25,79,25); textcolor (GREEN + BLUE); textbackground (WHITE + YELLOW); p>
clrscr (); cprintf ( "% s", s); textcolor (10); window (1,1,79,25); textbackground (0);
) p>
void vvod (PL * pla)// Функція введення структури
(Do p>
(clrscr (); puts ( "Введіть ім'я планети:"); fflush (stdin); gets (pla-> namepl); p>
) while (strlen (pla-> namepl)> 18); do p>
(puts ( "Рік відкриття планети:"); scanf ( "% d", & (pla-> year )); p>
) while ((pla-> year) year)> 30000); do p>
(puts ( "Хто відкрив планету:"); fflush (stdin); gets (pla-> people); p>
) while (strlen (pla-> people)> 15); do p>
(puts ( "Скільки супутників?"); scanf ( "% d", & (pla-> sputnik )); p>
) while (((pla-> sputnik) sputnik)> 999));
) p>
PL * vvodall ()// Функція введення структур
(
PL * playn, * pla; clrscr (); sovet ( "Введіть параметри планети"); pla = (PL *) malloc (sizeof (PL)); vvod (pla); playn = pla; pla-> next = NULL; sovet ( "Для дальнейщего введення натисни y, інакше будь-яку клавішу ."); p>
while (getch ()==' y ') p>
(clrscr (); sovet ( "Введіть параметри планети"); pla = (PL *) malloc (sizeof (PL)); vvod (pla); playn-> prev = pla; pla-> next = playn; playn = pla; sovet ( "Для дальнейщего введення натисни y, інакше будь-яку клавішу ."); p>
) pla-> prev = NULL; while (pla-> next) pla = pla-> next; return (pla);
) p>
void vivodall (PL * pla)// Функція виведення на екран всіх структур
(Int i = 1; puts ( "nttt У С Я К А Р Т О Т Е К Аn"); printf ("+------+-------------- ---+------------+---------------+-----------< br>
+ n "); printf (" | Номер | Назва | Коли | Хто відкрив | Кількість
| n "); printf (" | стр. | планети | відкрили | планету | супутників
| n "); printf ("+------+-----------------+------------+--- ------------+-----------< br>
+ n "); printf ("+------+-----------------+------------+--- ------------+-----------< br>
+ n "); while (pla-> prev) p>
(printf ( "|% 5d |% 18s |% 12u |% 15s |% 11u |", i, pla-> namepl, pla-> year, pla-> people, pla-> sputnik); pla = pla-> prev; i ++; p>
) printf ( "|% 5d |% 18s |% 12u |% 15s |% 11u |", i, pla-> namepl, pla-> year, pla-> people, pla-> sputnik); printf ( "+------+-----------------+------------+---------- -----+-----------< br>
+ "); Gotoxy (22,24); puts (" Висновок закінчено, натисніть будь-яку клавішу. "); Getch ();
) p>
void spisok (PL * pla)// Функція для роботи зі списком
(Clrscr (); window (17,2,62,15); textbackground (4); textcolor (15); clrscr (); if (pla! = NULL) p>
(cprintf ( "n"); cprintf ( "% 30s", "ПАРАМЕТРИ ПЛАНЕТnn"); gotoxy (1, wherey () +2); cprintf ( "Назва:% s", pla-> namepl); gotoxy (1, wherey () +2); cprintf ( "Рік відкриття:% d", pla-> year); gotoxy (1, wherey () +2); cprintf ( "Хто відкрив:% s", pla - > people); gotoxy (1, wherey () +2); cprintf ( "Скільки супутників:% d", pla-> sputnik); p>
) textbackground (2); sovet ( "Наступний/Попередня планета (PgDn/PgUp)" p>
"Видалення (Del)" "Додавання (Ins)" "Вихід (Esc )");< br>
) p>
PL * vvodspisok (PL * pla)// Функція введення елементів списку
(
PL * plr = pla; char c; sovet ( "Додати елемент до/після поточного (Home/End)" p>
"Скасувати (Esc)"); do p>
(c = getch ();
/ * Esc */if (c == 27) return (pla); if (c == 71 | | c == 79) p>
(clrscr (); sovet ( "Введіть параметри планети"); plr = (PL *) malloc (sizeof (PL)); vvod (plr); if (pla == NULL) p>
(plr-> next = NULL; plr-> prev = NULL; return (plr); p>
)
/ * End */if (c == 79) p>
(plr-> next = pla-> next; plr-> prev = pla; pla-> next = plr; p>
(plr-> next) -> prev = plr; p>
)
/ * Home */if (c == 71) p>
(plr-> next = pla; plr-> prev = pla-> prev; pla-> prev = plr; p>
(plr-> prev) -> next = plr; p>
) return (plr); p>
) p>
) while (1);
) p>
PL * vozvr (PL * pla)// Повертає вказівник
(//На початок списку pla if (pla == NULL) return (pla); while (pla-> next! = NULL) pla = pla-> next; return (pla);
) p>
PL * korrekt (PL * pla)// Керуючі клавіші при роботі зі списком
(Spisok (pla);
PL * delit (PL *); do p>
(switch (getch ()) p>
(
/ * PgUp */case 73: if (pla! = NULL) p>
(if (pla-> prev! = NULL) pla = pla-> prev; spisok (pla); p>
) break;
/ * PgDn */case 81: if (pla! = NULL) p>
(if (pla-> next! = NULL) pla = pla-> next; spisok (pla); p>
) break;
/ * Del */case 83: if (pla! = NULL) p>
(pla = delit (pla); spisok (pla); p>
) break;
/ * Ins */case 82: pla = vvodspisok (pla); spisok (pla); break;
/ * Esc */case 27: pla = vozvr (pla); return (pla); p>
) p>
) p>
while (1);
) p>
PL * delit (PL * pla)// Функція видалення елементів зі списку
(
PL * plr = NULL; if (pla-> prev! = NULL) p>
( p>
(pla-> prev) -> next = pla-> next; plr = pla-> prev; p>
) if (pla-> next! = NULL) p>
( p>
(pla-> next) -> prev = pla-> prev; plr = pla-> next; p>
) free (pla); return (plr);
) p>
void poisk1 (PL * pla)// Функція пошуку по назвах планет
(Char s [15], ch; do p>
(int i = 1, l = 0; clrscr (); fflush (stdin); puts ( "Введіть інтерессующее вас назва планети:"); gets (s); printf ( "nn Планети з назвою% s: n ", s); printf ("+------+-----------------+------------+--- ------------+---------< br>
- + n "); printf (" | Номер | Назва | Коли | Хто відкрив | Кількість
| n "); printf (" | стр. | планети | відкрили | планету | супутників
| n "); printf ("+------+-----------------+------------+--- ------------+-----------< br>
+ n "); printf ("+------+-----------------+------------+--- ------------+-----------< br>
+ n "); while (pla-> prev) p>
(if (strcmpi (pla-> namepl, s) == 0) p>
(printf ( "|% 5d |% 18s |% 12u |% 15s |% 11u |", i, pla-> namepl, pla-> year, pla-> people, pla-> sputnik); l + +; i ++; p>
) pla = pla-> prev; p>
) if (strcmpi (pla-> namepl, s) == 0) p>
(printf ( "|% 5d |% 18s |% 12u |% 15s |% 11u |", i, pla-> namepl, pla-> year, pla-> people, pla-> sputnik); l + +; i + +;) puts ("+------+-----------------+------------+----- ------------+-------------< br>
+ "); Printf (" n Знайдено% d планет.n ", l); puts (" Пошук за назвами планет завершено. Продовжити? (Y-да) "); fflush (stdin); ch = getch ();
) while (ch == 'y');
) p>
void poisk2 (PL * pla)// Функція пошуку по роках відкриття
(Char ch; do p>
(int i = 1, l = 0, a, b; clrscr (); fflush (stdin); puts ( "Введіть інтерессующее вас кордону пошуку (від чого-то до чого-то):"); while ( scanf ( "% d% d", & a, & b)! = 2) p>
(while (getchar ()!=' n '); printf ( "Все-таки варто тут що-небудь ввестіn (від a до b) n "); p>
) p>
printf ( "nn Планети відкриті в такому діапозоні (з% d до% d року): n", a, b); printf ("+------+--------- --------+------------+---------------+-----------< br>
+ n "); printf (" | Номер | Назва | Коли | Хто відкрив | Кількість
| n "); printf (" | стр. | планети | відкрили | планету | супутників
| n "); printf ("+------+-----------------+------------+--- ------------+-----------< br>
+ n "); printf ("+------+-----------------+------------+--- ------------+-----------< br>
+ n "); while (pla-> prev) p>
(if ((ayear) & & (b> = pla-> year)) p>
(printf ( "|% 5d |% 18s |% 12u |% 15s |% 11u |", i, pla-> namepl, pla-> year, pla-> people, pla-> sputnik); l + +; i ++; p>
) pla = pla-> prev; p>
) if ((ayear) & & (b> = pla-> year)) p>
(printf ( "|% 5d |% 18s |% 12u |% 15s |% 11u |", i, pla-> namepl, pla-> year, pla-> people, pla-> sputnik); l + +; i ++; p>
) puts ("+------+-----------------+------------+---- -----------+-----------< br>
+ "); Printf (" n Знайдено% d планет.n ", l); puts (" Пошук по роках відкриття планет завершено. Продовжити? (Y-да) "); fflush (stdin); ch = getch (); p>
) while (ch == 'y');
) p>
void klear (PL * pla)// Функція очищення пам'яті
(
PL * plr; if (pla) p>
(if (pla-> prev) p>
(plr = pla-> prev; while (plr-> prev) p>
(free (plr-> next); plr = plr-> prev; p>
) p>
) else plr = pla; free (plr); p>
)
) p>
char * fname ()// Функція введення імені файлу
(Char * t; t = (char *) malloc (80 * sizeof (char)); cprintf ( "Введіть ім'я файлу: n"); fflush (stdin); scanf ( "% 79s", t); return t;
) p>
int save1 (PL * pla, char * filename)// Функція, яка зберігає дані
(
FILE * fp; if ((fp = fopen (filename, "w "))== NULL) return 0; while (pla) p>
(fprintf (fp, "% s% d% s% d |", pla-> namepl, pla-> year, pla-> people, pla-> sputnik); pla = pla-> prev; p>
) fclose (fp); return 1;
) p>
int save (PL * pla)// Функція для збереження даних
(Char * name; window (1,1,79,25); clrscr (); name = fname (); if (save1 (pla, name) == 1) return 1; cprintf ( "nНевозможно провести запис! "); sovet (" Помилка! Натисніть будь-яку кнопку "); getch (); return 0;
) p>
PL * load (PL * pla)// Функція завантаження даних з файлу
(Char c, * name; int i; p>
PL * plan = NULL, * plane = NULL;
FILE * fp; window (1,1,79,25); clrscr (); name = fname (); cprintf ( "Здійснювати читання? (Y-Так, n-Ні) n"); do c = getch () ; while ((c! = 'y')&&( c! =' n ')); if (c ==' n ') return (pla); if ((fp = fopen (name, "rt")) == NULL) p>
(klear (pla); cprintf ( "nОшібка при відкритті файлу !!!"); sovet (" Помилка! Натисніть будь-яку кнопку "); getch (); return (NULL); p>
) plane = (PL *) malloc (sizeof (PL)); while (fscanf (fp, "% s% d% s% d |", plane-> namepl, & (plane-> year), plane -> people, & (plane-> sputnik)) == 4) p>
(plane-> prev = NULL; plane-> next = plan; if (plan! = NULL) plan-> prev = plane; plan = plane; plane = (PL *) malloc (sizeof (PL)); p>
) free (plane); if (plan! = NULL) p>
(while (plan-> next) plan = plan-> next; p>
) fclose (fp); klear (pla); return (plan);
) p>
/* Функція сортування за алфавітом */
PL * sort (PL * pla) p>
( p>
PL * point, * tmp = NULL, * f, * s; int i, j, srav; p>
// Покажчик на початок f = pla; point = pla; p>
while (f! = NULL) p>
(s = f-> next; while (s! = NULL) p>
(if ((strcmp (f-> namepl, s-> namepl)> 0)) p>
(tmp = (PL *) malloc (sizeof (PL)); strcpy (tmp-> namepl, f-> namepl); tmp-> year = f-> year; strcpy (tmp-> people, f - > people); tmp-> sputnik, f-> sputnik; p>
// strcpy (f-> namepl, s-> namepl); f-> year = s-> year; strcpy (f-> people, s-> people); f-> sputnik = s-> sputnik ; p>
// strcpy (s-> namepl, tmp-> namepl); s-> year = tmp-> year; strcpy (s-> people, tmp-> people); s-> sputnik = tmp-> sputnik ; free (tmp); p>
) s = s-> next; p>
) strcpy (point-> namepl, f-> namepl); point-> year = f-> year; strcpy (point-> people, f-> people); point-> sputnik = f-> sputnik; point = point-> next; f = f-> next; p>
) point = pla; return (point);
) p>
void main ()
(Char ccc, hhh, ch; int i;
PL * planet = NULL; planet-> prev = planet-> next = NULL;
_setcursortype (_NOCURSOR); textcolor (10); menu1 (); do p>
(do p>
(fflush (stdin); switch (ccc = getch ()) p>
(case '1 ': p>
(clrscr (); printf ( "ttt Рекомендації користувачеві: nn" p>
"Ця програма-це подібність електронної бази даних. Програма працює," p>
"nіспользуя масиви в пам'яті ЕОМ для зберігання інформації введеної користувачем." p>
"nДанние може вводитися з клавіатури або завантажити з файлу." p>
"Також можна вивестіна екран всю картотеку або ж переглядати картотеку по картках," p>
"з можли-ністю додавання або видалення деяких карток з вибору." p>
"Програма має гарний інтерфейс і показує стійку роботу." p>
"У програмі є пошук елементів за заданими умовами, а також сортування планет за назвами." p>
"У програмі є головне меню і підменю для пошуку планет за деякими ознаками." p>
"Бажано, щоб дані були точні, коректно записані і що стосуються" p>
"n безпосередньо теми даної лабораторної роботи."); puts ( "nnnnnttДля переходу до головного меню, натисніть будь-яку клавішу ..."); getch (); p>
menu1 (); break; p>
) case '2 ': p>
(free (planet); planet = NULL; planet-> prev = planet-> next = NULL; clrscr (); puts ( "Це нова база даних? (так-y/ні-n)"); do p>
(fflush (stdin); scanf ( "% c", & ch); p>
printf ( "tВведіте символ (так-y/ні-n) "); p>
) while (ch! = 'n' & & ch! = 'y' & & ch! = 'Y' & & ch! = 'N'); if (ch == 'y' | | ch == 'Y ') p>
(clrscr (); planet = vvodall (); clrscr (); puts ( "nnЗапісать в файл (да-y/нет-n )?"); do p>
(fflush (stdin); scanf ( "% c", & ch); printf ( "Введіть символ (так-y/ні-n) n "); p>
) while (ch! = 'n' & & ch! = 'y' & & ch! = 'Y' & & ch! = 'N'); if (ch == 'Y' | | ch == 'y ') p>
(save (planet); puts ( "nnnnntt Запис даних закінчена! Натисніть будь-яку клавішу."); getch (); p>
) p>
) else planet = load (planet); menu1 (); continue; p>
) case '3 ': p>
(if (planet! = NULL) p>
(clrscr (); vivodall (planet); menu1 (); continue; p>
) break; p>
) case '4 ': p>
(free (planet); planet = korrekt (planet); menu1 (); break; p>
) case '5 ': p>
(if (planet! = NULL) p>
(clrscr (); menu2 (); switch (hhh = getch ()) p>
(case '1 ': p>
(poisk1 (planet); menu1 (); continue; p>
) case '2 ': p>
(poisk2 (planet); menu1 (); continue; p>
) default: menu1 (); p>
) menu1 (); continue; p>
) break; p>
) case '6 ': p>
(if (planet! = NULL) p>
(clrscr (); i = 5; puts ( "Йде nnnntt сортування за назвою планети."); while (i p>