Создать файл, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю - C (СИ)
Формулировка задачи:
Создать файл, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщик, количество изделий, которые были собраны им в понедельник, вторник, ..., пятницу. Вывести по фамилии сборщиков общее количество деталей, собранных им за неделю и день, когда он достиг наибольшей производительности труда.
Решение задачи: «Создать файл, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю»
textual
Листинг программы
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define DAYS 5
typedef struct
{
char name[64];
int details[DAYS];
}Worker;
int GetNumDetails(const Worker *worker )
{
int num = 0;
int i = 0;
for(i = 0; i < DAYS; i++)
num += worker->details[i];
return num;
}
int GetNumDetailsMax(const Worker *worker )
{
int m = 0;
int i = 0;
for(i = 0; i < DAYS; i++)
if(worker->details[i] > m)
m= worker->details[i];
return m;
}
int GetNumEntries(FILE* f)
{
int num = 0;
char tmp[80];
while(fgets(tmp,80,f)!= NULL)
num++;
fseek(f,0,SEEK_SET);
return num;
}
void PrintWithCondition(const Worker *arr, int len)
{
int i = 0;
puts("Name Number Maximum:");
puts("--------------------");
for(i = 0; i < len; i++)
{
printf("%s ",arr[i].name);
printf("%d ",GetNumDetails(&arr[i]));
printf("%d \n",GetNumDetailsMax(&arr[i]));
}
}
int main(void)
{
FILE* f = fopen("Workers.txt","r");
Worker *arr = NULL;
int numEntries = 0;
int i = 0;
if(!f)
puts("Error in opening file");
else
{
numEntries = GetNumEntries(f);
arr = (Worker *)malloc(sizeof(Worker) * numEntries);
for(i = 0; i < numEntries; i++)
{
fscanf(f,"%s %d %d %d %d %d\n",
arr[i].name, &arr[i].details[0], &arr[i].details[1],
&arr[i].details[2],&arr[i].details[3], &arr[i].details[4]);
}
PrintWithCondition(arr, numEntries);
free(arr);
fclose(f);
}
}
Объяснение кода листинга программы
- Создание структуры для хранения данных о работниках В начале кода определяется структура Worker, которая содержит массив из 5 элементов типа int для хранения количества изделий, собранных работником за каждый день недели, а также строку (char array) для хранения имени работника.
- Функции для работы со структурой Worker
Для удобства работы со структурой Worker определены две функции:
- GetNumDetails - суммирует все элементы массива details заданного работника
- GetNumDetailsMax - находит максимальное значение среди всех элементов массива details
- Чтение данных из файла
В функции main открывается файл
Workers.txtдля чтения. Заголовок каждой строки файла содержит имя работника, а следующие 5 строк содержат числа, соответствующие количеству изделий, собранных работником за каждый день недели. С помощью цикла и функции fscanf данные считываются в массив arr. - Вывод данных Функция PrintWithCondition выводит на экран информацию о каждом работнике в формате: имя работника - общее количество изделий - максимальное количество изделий за день.
- Освобождение памяти и закрытие файла
После выполнения всех операций память, выделенная под массив arr, освобождается с помощью функции free. Файл
Workers.txtзакрывается с помощью функции fclose.