Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursak11112иьпр.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.38 Mб
Скачать

Текст програми на мові Сі:

#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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]