2022-03-12-C-Chap15-문제33
자동차 관리 프로젝트 2
여러 자동차의 정보를 입력 받고 이 리스트를 출력 및 수정할 수 있는, 자동차 관리 프로그램 내지 플랫폼을 개발하고자 한다! 다음 조건에 맞추어 결과화면과 같이 출력이 되도록 프로그램을 작성하십시오.
조건
- 이전에 만들었던 자동차 관리 프로그램을 바탕으로 한다.
- 파일 입출력을 통해 프로그램을 처음 실행시키면(메뉴가 뜨기 전에) 임의의 파일 정보(cars.txt)를 읽기 모드(r)로 불러온다.
- 불러온 정보는 자동차 정보 구조체에 행 순으로 배열에 저장한다. (feop() 함수 사용) 그 다음, 파일 스트림을 종료한다.
- ‘신규입력’을 선택 시에는 위의 파일 정보(cars.txt)를 추가 보드(a)로 불러온 다음, 정보 번호(No.), 모델명, 제조사, 가격, 연비, 출시일을 각각 띄어쓰기로 구분하여, 텍스트 파일에 작성하게끔 한다.
- 수정 시에는 파일 입출력을 하지 않는다.
- 단, 모든 파일 스트림에서 파일을 열 수 없을 시, 파일을 열 수가 없다는 내용의 에러 처리가 되어야 한다.(fprintf() 함수에 stderr 처리)
Source
#include <stdio.h>
#define STRING_SIZE 50
#define MEM_SIZE 100
struct datetype
{
int year;
int month;
};
struct car
{
struct datetype release;
char model[STRING_SIZE];
char maker[STRING_SIZE];
int value;
double mileage;
};
typedef struct car car;
void insert(car* cars, int* no)
{
FILE* fp;
if ((fp = fopen("cars.txt", "a")) == NULL)
fprintf(stderr, "파일을 열 수 없습니다.");
printf("\n[신규입력]\n\n");
printf("모델명 > "); scanf("%s", cars[*no].model);
printf("제조사 > "); scanf("%s", cars[*no].maker);
printf("가격(만원) > "); scanf("%d", &cars[*no].value);
printf("연비 > "); scanf("%lf", &cars[*no].mileage);
printf("출시일(yyyy mm) > "); scanf("%d %d", &cars[*no].release.year, &cars[*no].release.month);
(*no)++;
}
void modify(car* cars, int* no)
{
int sel;
printf("\n[정보수정]\n수정할 자동차 정보 번호(No.) > ");
scanf("%d", &sel);
if (sel > * no || 0 > sel)
printf("잘못 입력하셨습니다.\n");
else
{
printf("\n모델명: %s -> ", cars[sel].model); scanf("%s", cars[sel].model);
printf("제조사: %s -> ", cars[sel].maker); scanf("%s", cars[sel].maker);
printf("가격(만원): %d -> ", cars[sel].value); scanf("%d", &cars[sel].value);
printf("연비: %lf > ", cars[sel].mileage); scanf("%lf", &cars[sel].mileage);
printf("출시일(yyyy mm): %d %d -> ", cars[sel].release.year, cars[sel].release.month); scanf("%d %d", &cars[sel].release.year, &cars[sel].release.month);
}
}
void search(car* cars, int* no)
{
int value_min, value_max, rel_year;
double mileage_max;
printf("\n[조건검색]\n");
printf("가격대(MIN MAX) > "); scanf("%d %d", &value_min, &value_max);
printf("연비(MAX) > "); scanf("%lf", &mileage_max);
printf("출시연도(yyyy) > "); scanf("%d", &rel_year);
printf("\n=============================================================================================================");
for (int i = 0; i < *no; i++)
if ((value_max >= cars[i].value && cars[i].value >= value_min) && (mileage_max >= cars[i].mileage) && (rel_year == cars[i].release.year))
printf("\nNo.%d\t/\t모델명: %s\t제조사: %s\t가격: %d만원\t연비: %lf (km/l)\t\t출시일: %d년 %d월", i, cars[i].model, cars[i].maker, cars[i].value, cars[i].mileage, cars[i].release.year, cars[i].release.month);
printf("\n=============================================================================================================\n");
}
void list(car * cars, int* no)
{
int op;
void(*pf[2])(car*, int*) = { modify, search };
printf("\n[리스트]\n");
printf("=============================================================================================================\n");
if (!(*no))
{
printf("입력된 정보가 없습니다.\n");
printf("=============================================================================================================\n");
}
else
{
for (int i = 0; i < (*no); i++)
printf("No.%d\t/\t모델명: %s\t제조사: %s\t가격: %d만원\t연비: %lf (km/l)\t/\t출시일: %d년 %d월\n", i, cars[i].model, cars[i].maker, cars[i].value, cars[i].mileage, cars[i].release.year, cars[i].release.month);
printf("=============================================================================================================\n");
printf("1) 정보수정\t2) 조건검색\t3) 메뉴\n\n선택 > ");
scanf("%d", &op);
if (op > 3 || 1 > op)
printf("잘못 입력하셨습니다.\n");
else if (op != 3)
pf[op - 1](cars, no);
}
}
int main()
{
car cars[MEM_SIZE];
int op, no = 0;
int* pno = &no;
void(*pf[2])(car*, int*) = { insert, list };
FILE* fp;
if ((fp = fopen("cars.txt", "r")) == NULL)
fprintf(stderr, "파일을 열 수 없습니다");
while (!feof(fp)) {
fscanf(fp, "%d %s %s %d %lf %d %d", &no, cars[no].model, cars[no].maker, &cars[no].value, &cars[no].mileage, &cars[no].release.year, &cars[no].release.month);
no++;
}
fclose(fp);
printf("[자동차 관리 프로그램]\n");
while (1)
{
printf("\n[메뉴]\n1) 신규입력\t2) 리스트\t3) 종료\n\n선택 > ");
scanf("%d", &op);
if (op > 3 || 1 > op)
printf("잘못 입력하셨습니다.\n");
else if (op == 3)
{
printf("\n종료합니다.\n\n");
break;
}
else
pf[op - 1](cars, pno);
}
return 0;
}