
Текст програми на мові Сі:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
struct hardware_info // Описуємо структуру
{
char cpu_type[20];
int year;
int mem;
int hdd;
struct hardware_info *next;
};
typedef struct hardware_info item; // Можливість роботи з ім’ям структури
int cmp(item *a, item *b, int field) // ф-я, цо повідомляє, які елементи сортувати
{
if (field == 1)
{
return a->mem - b->mem;
}
else if (field == 2)
{
return a->hdd - b->hdd;
}
else
{
return a->year - b->year;
}
}
item *sort_list(item *list, int field) // ф-я сортування
{
item *p, *q, *e, *tail;
int insize, nmerges, psize, qsize, i;
insize = 1;
while (1)
{
p = list;
list = NULL; // кінцевий список
tail = NULL; // об’єднаний список
nmerges = 0; //підрахунок кількості злиттів
while (p) // Виконання потоку p існує
{
nmerges++; // рухуємо злиття
q = p;
psize = 0;
for (i = 0; i < insize; i++)
{
psize++;
q = q->next;
if (!q) break; // поки є q виконуємо злиття
}
qsize = insize;
while (psize > 0 || (qsize > 0 && q)) // поки існує два списки виконуємо злиття
{
if (psize == 0) // якщо p пусто то е берем з q
{
e = q;
q = q->next;
qsize--;
}
else if (qsize == 0 || !q) // якщо q пусто то е берем з p
{
e = p;
p = p->next;
psize--;
}
else if (cmp(p, q, field) <= 0) // пропонуємо поля по яких будем сортувати, і дізнаємось яке поле куди перемістити (яке поле менше)
{
e = p;
p = p->next;
psize--;
}
else
{
e = q;
q = q->next;
qsize--;
}
if (tail) // Додаємо наступний елемент в загальний список, якщо він є
{
tail->next = e;
}
else
{
list = e; //якщо немає то додаємо елемент в кінцевий список
}
tail = e;
}
p = q;
}
tail->next = NULL;
if (nmerges <= 1) return list; // якщо злиття було тільки одне, то закінчуємо структуру
insize = 2*insize; // якщо не виконується то сортуємо 2 рази
}
}
Void print_sorted_items(item *head, int sort_field, int max_year) // Ф-я виводу данних
{
FILE *o = NULL;
item *t = sort_list(head, sort_field);
o = fopen("print.txt","w");
while(t)
{
if (t->year >= max_year) // перевіряємо до якого року, друкуємо порівнюючи роки
{
fprintf(o,"Тип процессора: %s\n", t->cpu_type);
fprintf(o,"Рік: %d\n", t->year);
fprintf(o,"Розмір памяті: %d\n", t->mem);
fprintf(o,"Рзмір HDD: %d\n\n", t->hdd);
}
t = t->next ; //переміщуємо зчитуюче t
}
}
void my_sorty(item *head) // Вибір типу сортування, і передача для подальшого сортування
{
char tmp[128];
int year = 0;
printf("Введіть тип сортування: пам’ять(m)/розмір жорсткого диска(h)/рік(y)");
if (scanf("%s", tmp))
{
if (tmp[0] == 'm')
{
print_sorted_items(head, 1, 0);
}
else if (tmp[0] == 'h')
{
print_sorted_items(head, 2, 0);
}
else
{
printf("Введіть максимальний рік: ");
if (scanf("%d", &year))
{
print_sorted_items(head, 3, year);
}
}
}
}
int main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
item *t;
item *head = NULL; // вказівник на перший елемент списку
FILE *f = NULL;
int items = 0;
char tmp[128];
if(!(f = fopen("base.bd","a+")))
printf("Помилка відкриття файлу\n");
else if(!( t = (item *)malloc(sizeof(item)))) //виділяємо пам’ять під _один_ елемент структури
printf("Помилка виділення пам’яті\n");
else
{
while(fread(t, (sizeof(item)-sizeof(item *)), 1, f)) //Читаємо файл в пам’ять, по одному елементу, і розміщуємо його t
{
// Якщо читання не виконано, отже елементів немає
items += 1; // ведем рахунок прочитаних елементів
t->next = head; // записуєм прочитаний елемент в структуру
head = t;
// t = (item *)malloc(sizeof(item)); // виділяєм пам’ять під новий елемент
if (!(t = (item *)malloc(sizeof(item))))
{
printf("Помилка виділення пам’яті\n");
break;
}
}
if (items == 0) // якщо елементів незнайдено, то звільнюємо t
{
free(t);
}
else
{
printf("Прочитано %d записій.\n", items); // Друкуємо скільки прочитано записів з файлу
printf("Очистити базу (d). Відсортувати (s) або додати (a) елементи?");
scanf("%s", tmp);
if (tmp[0]=='s')
{
my_sorty(head);
fclose(f);
return 0;
}
else if (tmp[0]=='d')
{
f = fopen("base.bd","w");
printf("База очищена.");
free(t);
items = 0;
}
else if (tmp[0]!='a')
{
printf("Помилка введення данних\n");
return 0;
}
}
while(1)
{
printf("Додати нове значення.\n");
if (!(t = (item *)malloc(sizeof(item))))
{
printf("Помилка виділення пам’яті\n");
return -1;
}
printf("Введіть тип Процесора: ");
scanf("%s", t->cpu_type);
printf("Введить дату виробництва: ");
scanf("%d", &t->year);
printf("Введить розмір памяті: ");
scanf("%d", &t->mem);
printf("Введить розмір HDD: ");
scanf("%d", &t->hdd);
printf("Для закінчення введення натисніть (f), для продовження (a): ");
scanf("%s", tmp);
if (tmp[0] == 'f')
{
fwrite(t, (sizeof(item)-sizeof(item *)), 1, f);
t->next = head;
head = t;
items += 1;
break;
}
else if (tmp[0]== 'a')
{
fwrite(t, (sizeof(item)-sizeof(item *)), 1, f);
t->next = head;
head = t;
items += 1;
}
else
{
printf("\n\nПомилка введення нових данних, повторіть введення.\n\n");
free(t);
continue;
}
}
my_sorty(head);
printf("%d Записів збережено.\n", items);
printf("Робота програми закінчена.\n");
fclose(f);
}
return 0;
}