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


/*
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 Time {
int h;
int m;
};
*/
/*
struct Trip {
char bus_no[20];
struct Time time;
char station[50];
};
*/
struct Date {
	int day;
	int month;
	int year;
};

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

int lt(struct Repair a, struct Repair b);
// возвращает true, если a < 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");
//	struct Repair repair = {0, 0};
	int count = 0;
	while (
		fscanf(f_in,"%s %s %s %s",
			ar[count].orderer, 
			ar[count].name, 
			ar[count].creator, 
			ar[count].data) == 4 && 
		AR_LEN > count) {
			printf("===>%s\n", ar[count].data);
		count = count + 1;
	}
	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) {
	// возвращает true, если a < 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;
	int 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 %s\n", ar[i].orderer, ar[i].name, ar[i].creator, ar[i].data);
		printf("=======>%s\n", ar[i].name);
	}
}

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 creator_count = 0;
	int i, j, k;
	int day, month, year;
	
	// Сбор статистики по производителям
	for (i = 0; i < n; ++i) {
		// Разбираем дату из строки
		sscanf(ar[i].data, "%d.%d.%d", &day, &month, &year);
		
		// Ищем производителя
		int found = -1;
		for (j = 0; j < creator_count; ++j) {
			if (strcmp(creators[j], ar[i].creator) == 0) {
				found = j;
				break;
			}
		}
		
		if (found == -1) {
			found = creator_count;
			strcpy(creators[creator_count], ar[i].creator);
			creator_count++;
		}
		
		total[found]++;
		
		// Проверяем, выполнен ли ремонт
		if (year > 2026) {
			not_done[found]++;
		}
	}
	
	// Сортировка производителей по алфавиту
	for (i = 0; i < creator_count - 1; ++i) {
		for (j = i + 1; j < creator_count; ++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 < creator_count; ++i) {
		int percent;
		if (total[i] > 0) {
			percent = (not_done[i] * 100) / total[i];
		} else {
			percent = 0;
		}
		fprintf(f_out, "%s %d%%\n", creators[i], percent);
	}
}