title: “버스 시간표 프로그램(파일입출력)1” categories:

  • C

    #버스 시간표 프로그램(파일입출력)1 : 네이버 블로그

파일 입출력 예제로 연습하다가 텍스트 파일로 저장할 수 있는 시간표를 만들어보고 싶었다

아래는 버스 시간표를 입력,출력,저장,삭제 할 수 있는 프로그램이다

#include 
#include 
#include 
int menu();
void search\_bus(int list[], int n, int key);
int get\_trans\_time(void);
int main(void)
{
 FILE \*fp = NULL;
 int list[10000] = { 0 };
 int temp[10000] = { 0 };
 int add\_temp[10000] = { 0 };

 while (1)
 {
 fp = fopen("bus.txt", "a+");
 int save\_size;
 for (save\_size = 0; !feof(fp); save\_size++)
 {
 fscanf(fp, "%d", &list[save\_size]);
 }
 int SIZE = save\_size - 1;
 fclose(fp);

 switch (menu())
 {
 case 1:
 printf("버스 시간 찾기\n");
 int h, m, key;
 key = get\_trans\_time();
 search\_bus(list, SIZE, key);
 break;
 case 2:
 fp = fopen("bus.txt", "w");
 for (int i = 0; i < SIZE; i++)
 {
 temp[i] = list[i];
 }
 while (1)
 {
 printf("시간표를 입력합니다(00시00분을 입력하면 종료)\n");
 temp[SIZE] = get\_trans\_time();
 if (temp[SIZE] == 0) {
 printf("입력을 종료합니다\n");
 break;
 }
 SIZE++;
 }
 int least, i, j, temp\_int;

 for (i = 0; i < SIZE - 1; i++)
 {
 least = i;
 for (j = i + 1; j < SIZE; j++)
 if (temp[j] < temp[least])
 least = j;
 temp\_int = temp[i];
 temp[i] = temp[least];
 temp[least] = temp\_int;
 }

 for (i = 0; i < SIZE; i++)
 {
 fprintf(fp, "%d\n", temp[i]);
 }
 fclose(fp);
 break;
 case 3:
 fp = fopen("bus.txt", "a+");
 for (int i = 0; i < SIZE; i++)
 {
 printf("%d시 %d 분\n", list[i] / 60, list[i] % 60);
 }
 fclose(fp);
 break;
 case 4:
 printf("버스 시간표 삭제");
 int del, del\_temp, num = 0;
 del = get\_trans\_time();
 int del\_num;
 for (del\_num = 0; del\_num < SIZE; del\_num++)
 {
 if (del == list[del\_num]) {
 num = 1;
 break;
 }
 }
 if (num == 0) {
 printf("\n일치하는 시간이 없습니다\n\n\n");
 }
 else
 list[del\_num] = 0;
 for (del\_num=del\_num; del\_num < SIZE - 1; del\_num++)
 {
 list[del\_num] = list[(del\_num+1)];
 }
 SIZE--;
 fp = fopen("bus.txt", "w");
 for (i = 0; i < SIZE; i++)
 {
 fprintf(fp, "%d\n", list[i]);
 }
 fclose(fp);
 break;
 case 5:
 exit(1);
 break;
 default:
 break;
 }
 }
}
int menu() {
 printf("===============================================\n\n");
 printf(" 1 입력된 시간에서 가장 가까운 버스시간 보기\n");
 printf(" 2 버스 시간표 입력하기 \n");
 printf(" 3 버스 시간표 출력하기 \n");
 printf(" 4 버스 시간표 삭제하기 \n");
 printf(" 5 종료 \n\n");
 printf("===============================================\n");
 printf("선택 : ");
 int choice;
 scanf("%d", &choice);
 return choice;
}
int get\_trans\_time(void) {
 printf("시간을 입력하세요 : 시 분\b\b\b\b\b\b\b");
 int h, m, key;
 scanf("%d %d", &h, &m);
 return key = h \* 60 + m;
}
void search\_bus(int list[], int n, int key)
{
 int i = 0;
 int o\_key=key;
 while (list[i] != key)
 {
 for (i = 0; i < n; i++) {
 if (key == list[i]) {
 printf("가장 가까운 버스는 %d시 %d분입니다\n\n", list[i] / 60, list[i] % 60);
 printf("대기 시간은 %d시 %d 분입니다\n", (key - o\_key) / 60, (key - o\_key) % 60);
 return 0;
 }
 }
 key = key + 1;
 if (key > 14400) {
 printf("시간 오류!");
 return 0;
 }
 }
}

길긴 하지만 간단한 코드이다.

나눠서 설명하자면 일단 파일을 열고 파일에 저장된 정수를 줄의 끝까지 배열에 입력시킨다.

fp = fopen(“bus.txt”, “a+”); // 앍기+쓰기 추가모드로 열기

int save_size;

for (save_size = 0; !feof(fp); save_size++) // Ifeof는 파일의 끝을 의미한다. 파일이 끝날 때까지 list에 저장

{

fscanf(fp, “%d”, &list[save_size]);

}

int SIZE = save_size - 1;

fclose(fp);

save_size는 마지막줄인지는 몰라도 0이 추가된다. 그러므로 실제 저장된 정수의 수는 save_size에서 1을 뺀다

파일 읽기로 정수 데이터를 배열에 옮기면 파일을 닫는다.

그럼 list[SIZE] 데이터가 만들어진다.

그 아래에는 menu의 반환값으로 case되는 조건문이 있다.

menu 사용자 지정 함수는 메뉴를 출력하고 정수를 읽어 반환하는 함수이다.

입력된 정수는 반환되어 case로 분류된다.

case 1은 시간을 입력하고 가장 가까운 버스시간을 찾는것이다.

case 1:

printf(“버스 시간 찾기\n”);

int h, m, key;

key = get_trans_time();

search_bus(list, SIZE, key);

break;

일단 get_trans_time 함수가 키의 값으로 된다.

get_trans_time 함수는 시간과 분을 입력받고 시간에 *60을 하고 분을 더해 반환하는 함수이다

int get_trans_time(void) {

printf(“시간을 입력하세요 : 시 분\b\b\b\b\b\b\b”); //\b로 커서를 뒤로 옮겼다.

int h, m, key;

scanf(“%d %d”, &h, &m); //시간과 분을 띄어쓰기 하나로 구분한다

return key = h * 60 + m; 시간*60을 한 후 분을 더하고 값을 반환한다.

}

다시 case 1: 로 돌아가서 반환된 (분) 데이터는 키에 저장된다.

그리고 이번엔 search_bus(list, SIZE, key); 함수가 실행된다.

search_bus 함수는 가장 가까운 버스가 몇번째 배열인지 순차탐색하는 함수이다.

void search_bus(int list[], int n, int key)

{

int i;

int o_key=key; /원본 키를 o_key로 복사한다

while (1)

{

for (i = 0; i < n; i++) { //n(SIZE) 까지 배열을 비교한다

if (key == list[i]) { //키랑 list[i]가 같으면 출력하고 종료시킨다

printf(“가장 가까운 버스는 %d시 %d분입니다\n\n”, list[i] / 60, list[i] % 60);

printf(“대기 시간은 %d시 %d 분입니다\n”, (key - o_key) / 60, (key - o_key) % 60);

return 0;

}

}

key = key + 1; //가장 가까운 list[i]를 못찾으면 key에 5를 더한다

if (key > 14400) { //키가 24*60을 넘어가면 시간 오류 출력 후 종료시킨다

printf(“시간 오류!”);

return 0;

}

}

}

list[i]를 비교하면서 같은 값이 없으면 key를 1 더하는 것에 주목하라.

이것으로 case 1 가장 가까운 시간 조회가 되었다

case 2:는 시간표를 입력해 입력한 시간을 list 배열에 합친 후 정렬시켜 파일에 저장한다.

fp = fopen(“bus.txt”, “w”); //폴더를 쓰기모드로 연다(지우고 연다) 데이터는 이미 list[] 배열에 저장되어 있다.

for (int i = 0; i < SIZE; i++)

{

temp[i] = list[i]; list[SIZE] 배열을 temp에 이동시킨다

}

while (1)

{

printf(“시간표를 입력합니다(00시00분을 입력하면 종료)\n”);

temp[SIZE] = get_trans_time(); //get_trans_time 함수로 정수를 입력받는다

if (temp[SIZE] == 0) { 00시 00분을 입력하면 0이므로 temp[SIZE]가 0이면 종료시킨다

printf(“입력을 종료합니다\n”);

break;

}

SIZE++; //입력받는만큼 사이즈를 하나 올린다

}

int least, i, j, temp_int;

for (i = 0; i < SIZE - 1; i++) //이 반복문은 순차정렬이다

{

least = i; //기본최소값i

for (j = i + 1; j < SIZE; j++)

if (temp[j] < temp[least]) //temp j가 더 작으면 최소값을 j로 둔다

least = j;

temp_int = temp[i]; temp를 이용해 temp[i]와 temp[least]가 바뀐다

temp[i] = temp[least];

temp[least] = temp_int;

}

for (i = 0; i < SIZE; i++)

{

fprintf(fp, “%d\n”, temp[i]); //temp[i]를 하나씩 띄우며 저장한다

}

fclose(fp);

이로써 case 2까지의 설명을 마친다.

파일 입출력을 활용한다면 사용자가 편하게 설정을 변경 할 수 있을 것 같다

업데이트: