// 그룹(GROUP) 알고리즘
#include
#include
//[!] Input data
struct Record
{
char ProductName[6]; // 상품명
int Quantity; // 판매량
}record[10];
//[!] Output data
struct Output
{
char ProductName[6]; // 상품명
int Quantity; // 판매량
}output[10];
void main(void)
{
//[1] Init
FILE *inData;
FILE *outData;
char buffer[10];
char tempbuff[4];
int count = 0;
int i = 0;
int j = 0;
struct Record temp;
int subTotal = 0; // 그룹소계
int groupCount = 0; // 그룹수
//[2] Input
inData = fopen("C:\\Temp\\abc1229.txt", "rt");
outData = fopen("C:\\Temp\\abc1229_.txt", "wt");
if (inData == NULL || outData == NULL)
{
perror("파일을 열 수 없습니다.");
exit(1);
}
while (!feof(inData))
{
memset(buffer, 0, 10); // 버퍼 초기화
fgets(buffer, 10, inData);
if (strlen(buffer) > 2) // 예외처리 : 버퍼에 담기 데이터가 있다면...
{
printf("크다\n");
strncpy(record[count].ProductName, buffer + 0, 5);
record[count].Quantity = atoi(strncpy(tempbuff, buffer + 5, 3));
count++;
}
}
printf("입력 후 데이터 : \n");
for(i = 0;i < count;i++)
{
printf("%s %d\n", record[i].ProductName, record[i].Quantity);
}
//[2] Process
//[A] Sort
for(i = 0;i < count - 1;i++)
{
for(j = i + 1;j < count;j++)
{
if(strcmp(record[i].ProductName, record[j].ProductName) > 0)
{
temp = record[i];
record[i] = record[j];
record[j] = temp;
}
}
}
printf("정렬 후 데이터 : \n");
for(i = 0;i < count;i++)
{
printf("%s %d\n", record[i].ProductName, record[i].Quantity);
}
//[B] Group
for(i = 0;i < count;i++)
{
subTotal += record[i].Quantity;//그룹소계
// 상품명이 다르면, 새로운 상품명으로 이동
if(strcmp(record[i].ProductName, record[i+1].ProductName) != 0)
{
strcpy(output[groupCount].ProductName, record[i].ProductName);
output[groupCount].Quantity = subTotal;//그룹소계
groupCount++; //그룹수 증가
subTotal = 0;//그룹소계 초기화
}
}
//[3] Output
printf("처리 후 데이터 : \n");
for(i = 0;i < groupCount;i++)
{
printf("%s %d\n", output[i].ProductName, output[i].Quantity);
fprintf(outData, "%s %d\n", output[i].ProductName, output[i].Quantity);
}
//[4] Dispose
fclose(inData);
fclose(outData);
}
/*
abc1229.txt파일의 내용
--------------------
RADIO 5
TV 6
PHONE 3
RADIO 2
PHONE 2
TV 10
PHONE 11
TV 7
PHONE 4
*/