자동차 관리 프로젝트 2

여러 자동차의 정보를 입력 받고 이 리스트를 출력 및 수정할 수 있는, 자동차 관리 프로그램 내지 플랫폼을 개발하고자 한다! 다음 조건에 맞추어 결과화면과 같이 출력이 되도록 프로그램을 작성하십시오.

조건

  • 이전에 만들었던 자동차 관리 프로그램을 바탕으로 한다.
  • 파일 입출력을 통해 프로그램을 처음 실행시키면(메뉴가 뜨기 전에) 임의의 파일 정보(cars.txt)를 읽기 모드(r)로 불러온다.
  • 불러온 정보는 자동차 정보 구조체에 행 순으로 배열에 저장한다. (feop() 함수 사용) 그 다음, 파일 스트림을 종료한다.
  • ‘신규입력’을 선택 시에는 위의 파일 정보(cars.txt)를 추가 보드(a)로 불러온 다음, 정보 번호(No.), 모델명, 제조사, 가격, 연비, 출시일을 각각 띄어쓰기로 구분하여, 텍스트 파일에 작성하게끔 한다.
  • 수정 시에는 파일 입출력을 하지 않는다.
  • 단, 모든 파일 스트림에서 파일을 열 수 없을 시, 파일을 열 수가 없다는 내용의 에러 처리가 되어야 한다.(fprintf() 함수에 stderr 처리)

image

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;
}

태그:

카테고리:

업데이트: