input.txt 파일을 읽어와서 output.csv 파일을 만드는 프로그램이다
여기에 추가적으로 input.txt 파일에 보면 각 날짜의 시간별로 온도, 습도, 강수량 등이 기록되어 있다
이를 날짜별으로 평균 온도, 최대 최소 온도, 표준편차 등을 구해서 Reprot.csv 파일로 만드는 프로그램이다
#include
#include
#include
#include
typedef struct Weather
{
char day[11];
char time[6];
float temperature;
float humidty;
float rainfall;
float insolation;
float sunshine_duration;
char windy[5];
float wind_velocity;
float max_wind_velocity;
struct Weather *next;
}Weather;
typedef struct
{
Weather* head;
}Weather_h;
Weather_h* CreateNode(void);
void PrintList();
void CreateCSVfile(Weather_h *L, Weather *p);
void CreateReportFile(Weather *p);
float Standard_Deviation(Weather *p, Weather* nextNdoe, float avgTmp, bool end, int count);
void FreeNode(Weather_h *L, Weather *p);
void main()
{
Weather_h* L;
L = CreateNode();
PrintList();
}
Weather_h* CreateNode(void)
{
Weather_h* L;
L = (Weather_h *)malloc(sizeof(Weather_h));
L->head = NULL;
return L;
}
void PrintList()
{
Weather* p;
Weather* newData;
Weather_h* L;
L = (Weather_h *)malloc(sizeof(Weather_h));
L->head = NULL;
FILE *fp;
if((fp = fopen("input.txt", "r")) == NULL)
{
printf("File is not found!\n");
}
p = L->head;
fseek(fp, 110,SEEK_SET);
puts("=========================================================================");
puts("계측시간 온도(℃) 습도(%) 강수량(mm) 일사량(w/m2) 일조시간(hour) 풍향 풍속(m/s) 최대풍속(m/s)");
while(!feof(fp))
{
newData = (Weather *)malloc(sizeof(Weather));
fscanf(fp, "%s %s %f %f %f %f %f %s %f %f ", newData->day, newData->time, &newData->temperature, &newData->humidty, &newData->rainfall, &newData->insolation, &newData->sunshine_duration, &newData->windy, &newData->wind_velocity, &newData->max_wind_velocity);
if(L->head == NULL)
{
L->head = newData;
p = newData;
newData->next = NULL;
}
else
{
p->next = newData;
newData->next = NULL;
}
while(p->next != NULL)
{
p = p->next;
}
}
p = L->head;
CreateCSVfile(L, p);
CreateReportFile(p);
FreeNode(L, p);
puts("\ncvs 파일과 report.csv 파일을 성공적으로 만드셨습니다.");
puts("=========================================================================");
fclose(fp);
}
void CreateCSVfile(Weather_h* L, Weather* p)
{
FILE *fp;
Weather* newData;
newData = p;
if((fp = fopen("output.csv", "w")) == NULL)
{
printf("File is not found!\n");
}
fprintf(fp, "계측날짜, 시간,온도(℃), 습도(%), 강수량(mm), 일사량(w/m2), 일조시간(hour), 풍향, 풍속(m/s), 최대풍속(m/s) \n");
while(newData->next != NULL)
{
fprintf(fp, "%s,", newData->day);
fprintf(fp, " %s,", newData->time);
fprintf(fp, " %.1f,", newData->temperature);
fprintf(fp, " %.1f,", newData->humidty);
fprintf(fp, " %.1f,", newData->rainfall);
fprintf(fp, " %.1f,", newData->insolation);
fprintf(fp, " %.1f,", newData->sunshine_duration);
fprintf(fp, " %s,", newData->windy);
fprintf(fp, " %.1f,", newData->wind_velocity);
fprintf(fp, " %.1f\n", newData->max_wind_velocity);
newData = newData->next;
}
fclose(fp);
}
void CreateReportFile(Weather* p)
{
FILE *fp;
Weather *nextNode, *temp, *startNode;
float avgTem = 0;
float sumTem = 0;
int count=0;
float Max = -1000;
float Min = 1000;
float sumHumidty = 0;
float avgHumidty = 0;
float sumRainfall = 0;
float avgRainfall = 0;
float sumSunshine_duration = 0;
float avgSunshine_duration = 0;
temp = p;
startNode = p;
nextNode = p->next;
if((fp = fopen("Report.csv", "w")) == NULL)
{
printf("File is not found!\n");
}
fprintf(fp, "[일별기상통계표] 계측 지역:신촌 \n");
fprintf(fp, "일자, ,기온(Temperature), , , 습도, 강수량, 일조시간\n");
fprintf(fp, " , 평균, 표준편차, 최고, 최저, [%%], [mm], [hour]\n");
while(p->next != NULL)
{
temp = startNode;
if(strcmp(p->day, nextNode->day) == 0)
{
sumTem = sumTem + p->temperature;
sumHumidty = sumHumidty + p->humidty;
sumRainfall = sumRainfall + p->rainfall;
sumSunshine_duration = sumSunshine_duration + p->sunshine_duration;
count++;
if(p->temperature > Max)
Max = p->temperature;
if(p->temperature < Min)
Min = p->temperature;
p = nextNode;
nextNode = nextNode->next;
if(p->next == NULL)
{
sumTem = sumTem + p->temperature;
sumHumidty = sumHumidty + p->humidty;
sumRainfall = sumRainfall + p->rainfall;
sumSunshine_duration = sumSunshine_duration + p->sunshine_duration;
count++;
avgTem = sumTem / count;
avgHumidty = sumHumidty / count;
avgRainfall= sumRainfall / count;
avgSunshine_duration = sumSunshine_duration / count;
fprintf(fp, "%s, ", p->day);
fprintf(fp, "%.1f, " , avgTem );
fprintf(fp, "%.4f,", Standard_Deviation(temp, temp, avgTem, true, count));
fprintf(fp, "%.1f, " , Max);
fprintf(fp, "%.1f, " , Min);
fprintf(fp, "%.1f, " , avgHumidty);
fprintf(fp, "%.1f, " , avgRainfall);
fprintf(fp, "%.1f\n " , avgSunshine_duration);
}
}
else if(strcmp(p->day, nextNode->day) != 0)
{
sumTem = sumTem + p->temperature;
sumHumidty = sumHumidty + p->humidty;
sumRainfall = sumRainfall + p->rainfall;
sumSunshine_duration = sumSunshine_duration + p->sunshine_duration;
count++;
avgTem = sumTem / count;
avgHumidty = sumHumidty / count;
avgRainfall= sumRainfall / count;
avgSunshine_duration = sumSunshine_duration / count;
if(p->temperature > Max)
Max = p->temperature;
fprintf(fp, "%s, ", p->day);
fprintf(fp, "%.1f, " , avgTem);
fprintf(fp, "%.4f,", Standard_Deviation(temp, nextNode, avgTem, false, count));
fprintf(fp, "%.1f, " , Max);
fprintf(fp, "%.1f, " , Min);
fprintf(fp, "%.1f, " , avgHumidty);
fprintf(fp, "%.1f, " , avgRainfall);
fprintf(fp, "%.1f\n " , avgSunshine_duration);
p = nextNode;
nextNode = nextNode->next;
startNode = p;
avgTem = 0;
sumTem = 0;
sumRainfall = 0;
sumHumidty = 0;
sumSunshine_duration = 0;
count = 0;
Max = -1000;
Min = 1000;
}
}
}
float Standard_Deviation(Weather* p, Weather* nextNode, float avgTmp, bool end, int count)
{
Weather *temp = p;
Weather *tempNext = nextNode;
float sd = 0;
float squaresum = 0;
if(end == false)
{
while(strcmp(temp->day, tempNext->day) != 0)
{
squaresum = squaresum + (avgTmp - temp->temperature)*(avgTmp - temp->temperature);
temp = temp->next;
}
squaresum = squaresum + (avgTmp - temp->temperature)*(avgTmp - temp->temperature);
temp = temp->next;
}
else
{
while(temp->next != NULL)
{
squaresum = squaresum + (avgTmp - temp->temperature)*(avgTmp - temp->temperature);
temp = temp->next;
}
squaresum = squaresum + (avgTmp - temp->temperature)*(avgTmp - temp->temperature);
temp = temp->next;
}
sd = sqrt(squaresum) / count;
return sd;
}
void FreeNode(Weather_h *L, Weather *p)
{
Weather *temp = L->head;
if(L->head == NULL)
return ;
else
{
free(L);
while(temp->next != NULL)
{
temp = p->next;
free(p);
p = temp;
}
}
}