Загрузка данных


/*
9. В базе данных хранятся сведения о ремонтах техники: заказчик, название, производитель, дата выполнения (при наличии)
Структура входного файла in.txt
Винни-Пух Принтер Samsung 25.11.2022
Пятачок Монитор LG 12.11.2022
Кенга Микроволновка LG 31.12.3000
...
Определить процент невыполненных ремонтов по каждому производителю, упорядочив по наименованию производителя
Структура выходного файла out.txt
Производитель Процент
LG 50%
Samsung 0%
*/
/** Задание Гусятинер Л.Б., КМПО, 2022 */
/** Решение Гусятинер Л.Б., КМПО,  */
/** Для КТ-2 301 / 302 / 305 / 306 / 309 / 315 ИС-23 */
/** Этап 1 из 5. Чтение из файла в массив и эхо-печать */
// 12:57 - 13:11 (0 часов 14 минут)
/** Этап 2 из 5. Частичное выполнение задания. Без сортировки */
// 13:33 - 13:58 (0 часов 25 минут) Итого: 0 часов 39 минут 
/** Этап 3 из 5. Функции. Сортировка. */
// 8:40 - 8:58 (0 часов 18 минут) Итого: 0 часов 57 минут

#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <time.h>
#define AR_LEN 100

struct Date {
	int day;
	int month;
	int year;
};

struct Repair {
	char orderer[50];
	char name[50];
	char creator[20];
	struct Date date;
};

int lt(struct Repair a, struct Repair b);
void swap(struct Repair *pa, struct Repair *pb);
void ar_sort(struct Repair ar[], int n);
void ar_print(struct Repair ar[], int n, FILE *f_out);
void ar_percant(struct Repair ar[], int n, FILE *f_out);

int main(void) {
	setlocale(LC_ALL, "");
	struct Repair ar[AR_LEN];
	FILE *f_in = fopen("in.txt", "r");
	FILE *f_out = fopen("out.txt", "w");
	int count = 0;
	
	while (fscanf(f_in,"%s %s %s %d.%d.%d",
			ar[count].orderer, 
			ar[count].name, 
			ar[count].creator,
			&ar[count].date.day,
			&ar[count].date.month,
			&ar[count].date.year) == 6 && 
			AR_LEN > count) {
		count++;
	}
	
	ar_print(ar, count, f_out);
	ar_sort(ar, count);
	ar_percant(ar, count, f_out);
	
	fclose(f_in);
	fclose(f_out);
	return 0;
}

int lt(struct Repair a, struct Repair b) {
	return strcmp(a.orderer, b.orderer) < 0;
}

void swap(struct Repair *pa, struct Repair *pb) {
	struct Repair temp = *pa;
	*pa = *pb;
	*pb = temp;
}

void ar_sort(struct Repair ar[], int n) {
	int i, j;
	for (i = 0; i < n-1; ++i) {
		int imin = i;
		for (j = i+1; j < n; ++j) {
			if (lt(ar[j], ar[imin])) {
				imin = j;
			}
		}
		if (i != imin) {
			swap(&ar[i], &ar[imin]);
		}
	}
}

void ar_print(struct Repair ar[], int n, FILE *f_out) {
	int i;
	for (i = 0; i < n; ++i) {
		fprintf(f_out,"%s %s %s %d.%d.%d\n", 
			ar[i].orderer, 
			ar[i].name, 
			ar[i].creator,
			ar[i].date.day,
			ar[i].date.month,
			ar[i].date.year);
	}
}

void ar_percant(struct Repair ar[], int n, FILE *f_out) {
	char creators[AR_LEN][20];
	int total[AR_LEN] = {0};
	int not_done[AR_LEN] = {0};
	int cnt = 0;
	int i, j;
	
	// Собираем производителей и считаем
	for (i = 0; i < n; ++i) {
		// Ищем производителя
		int idx = -1;
		for (j = 0; j < cnt; ++j) {
			if (strcmp(creators[j], ar[i].creator) == 0) {
				idx = j;
				break;
			}
		}
		if (idx == -1) {
			idx = cnt;
			strcpy(creators[cnt], ar[i].creator);
			cnt++;
		}
		
		total[idx]++;
		
		if (ar[i].date.year > 2026) {
			not_done[idx]++;
		}
	}
	
	// Сортируем производителей по алфавиту
	for (i = 0; i < cnt - 1; ++i) {
		for (j = i + 1; j < cnt; ++j) {
			if (strcmp(creators[i], creators[j]) > 0) {
				char temp_c[20];
				strcpy(temp_c, creators[i]);
				strcpy(creators[i], creators[j]);
				strcpy(creators[j], temp_c);
				
				int temp_t = total[i];
				total[i] = total[j];
				total[j] = temp_t;
				
				int temp_nd = not_done[i];
				not_done[i] = not_done[j];
				not_done[j] = temp_nd;
			}
		}
	}
	
	// Выводим результат
	fprintf(f_out, "\nПроизводитель Процент\n");
	for (i = 0; i < cnt; ++i) {
		int percent = (not_done[i] * 100) / total[i];
		fprintf(f_out, "%s %d%%\n", creators[i], percent);
	}
}