[ Source Code ]#include <stdio.h>
double charging[5][3] = { { 0.10, 0.06, 0.02 },
{ 0.25, 0.15, 0.05 },
{ 0.53, 0.33, 0.13 },
{ 0.87, 0.47, 0.17 },
{ 1.44, 0.80, 0.30 } };
int main ( void )
{
char distance, number[8];
int start_time_m, end_time_m, start_time[2], end_time[2], output[3] = { 0, }, i, j;
double result = 0;
int value[4] = { 480, 1080, 1320, 1440 }, check;
while ( 1 ) {
scanf ( “%c“, &distance );
if ( distance == ‘#’ ) {
break;
}
getchar();
scanf ( “%s“, number );
scanf ( “%d %d %d %d“, &start_time[0], &start_time[1], &end_time[0], &end_time[1] );
getchar ();
// 입력된 시간을 분으로 계산한다.
start_time_m = start_time[0] * 60 + start_time[1];
end_time_m = end_time[0] * 60 + end_time[1];
// start_time과 end_time이 같을때 24시간 출력후 continue
if ( start_time_m == end_time_m ) {
output[0] = 600;
output[1] = 240;
output[2] = 600;
for ( i = 0 ; i < 3 ; i++ ) {
j = distance – 65;
result += charging[j][i] * output[i];
}
printf(“%10s%6d%6d%6d%3c%8.2f\n“,
number, output[0], output[1], output[2], distance, result );
continue;
}
check = 0;
// start_time과 end_time이 같은 구간일 경우
if ( end_time_m > start_time_m ) {
if ( ( 480 <= start_time_m && start_time_m < 1080 ) &&
( 480 <= end_time_m && end_time_m < 1080 ) ) {
output[0] = end_time_m – start_time_m;
check = 1;
}
else if ( ( 1080 <= start_time_m && start_time_m < 1320 ) &&
( 1080 <= end_time_m && end_time_m < 3120 ) ) {
output[1] = end_time_m – start_time_m;
check = 1;
}
else if ( ( 1320 <= start_time_m && start_time_m < 1440 ) &&
( 1320 <= end_time_m && end_time_m < 1440 ) ) {
output[2] = end_time_m – start_time_m;
check = 1;
}
else if ( ( 0 <= start_time_m && start_time_m < 480 ) &&
( 0 <= end_time_m && end_time_m < 480 ) ) {
output[2] = end_time_m – start_time_m;
check = 1;
}
}
// 같은 구간일때 그냥 차이 구해서 출력후 continue
if ( check == 1 ) {
for ( i = 0 ; i < 3 ; i++ ) {
j = distance – 65;
result += charging[j][i] * output[i];
}
printf(“%10s%6d%6d%6d%3c%8.2f\n“,
number, output[0], output[1], output[2], distance, result );
//변수 초기화
output[0] = output[1] = output[2] = result = 0;
continue;
}
//start_time과 end_time이 다른 구간에 걸쳐 있을때
// start_time부터 다음 구분영역까지의 계산
for ( i = 0 ; i < 4 ; i++ ) {
if ( start_time_m / value[i] != 0 ) {
continue;
}
else {
if ( i == 0 ) {
output[2] = value[i] – start_time_m;
}
else {
output[i-1] = value[i] – start_time_m;
}
break;
}
}
// start_time이 end_time 보다 크거나 작거나에 따라
if ( start_time_m > end_time_m ) {
// start_time 첫 영역 다음부터 24시까지의 시간
for ( j = i+1 ; j < 4 ; j++ ) {
output[j-1] += value[j] – value[j-1];
}
//0시부터 end_time까지의 계산
for ( i = 0 ; i < 4 ; i++ ) {
if ( value[i] > end_time_m ) {
if ( i == 0 ) {
output[2] += end_time_m;
break;
}
else {
output[i-1] += end_time_m % value[i-1];
break;
}
}
else {
if ( i == 0 ) {
output[2] += value[i];
}
else {
output[i-1] += value[i] – value[i-1];
}
}
}
}
else {
for ( j = i+1 ; j < 4 ; j++ ) {
if ( value[j] <= end_time_m ) {
output[j-1] += value[j] – value[j-1];
}
else {
output[j-1] += end_time_m % value[j-1];
break;
}
}
}
// 요금계산해서 출력 해주는 부분
for ( i = 0 ; i < 3 ; i++ ) {
j = distance – 65;
result += charging[j][i] * output[i];
}
printf(“%10s%6d%6d%6d%3c%8.2f\n“,
number, output[0], output[1], output[2], distance, result );
//변수 초기화
output[0] = output[1] = output[2] = result = 0;
}
return 0;
}
|
댓글 남기기