Q&A 영역
안녕하세요.ㅠ 내일까지 가계부 프로그램 작성해서 내야하는데..ㅠㅠ 너무 어려워서 정말 못하겟네요..ㅠㅠ
고수님들..ㅠ제발 도와주세요..ㅠ 내공 다드릴게요.ㅠㅠ제발 부탁드립니다..ㅠㅠ
다음은 가계부 프로그램에 대한 처리조건이다. 조건에 맞게 코딩하시오.
※ 처리조건
⑴ 입력은 “날짜, 입금/출금 코드, 분류코드, 액수” 의 순으로 input.txt 파일로 입력
⑵ 날짜는 다음과 같이 처리한다.
- 입력크기는 연월일의 순으로 각각 2자리씩 총 6자리를 갖는다.
- 예) 090608 : 2009 년 6 월 8 일
⑶ 입금/출금 코드는 다음과 같다.
- 입력의 크기는 1 자리로 각각 입금은 ‘+', 출금은 ’-' 로 표기한다.
⑷ 분류코드는 다음과 같다.
- 코드는 2 자리로 내용은 다음 표와 같다.
코 드 | 내 용 |
01 | 월급 |
02 | 기타수입 |
03 | 식료품 |
04 | 관리비 |
05 | 용돈 |
06 | 교통비 |
- 분류코드는 반드시 열거형을 사용한다.
⑸ 액수의 크기는 8자리로 한다.
⑹ 입력은 날짜순으로 되어 있지 않으나 출력은 반드시 날짜순으로 정렬하여 출력한다.
- 출력파일의 이름은 output.txt 로 한다.
- 만약 입금과 출금이 같은 날이 있으면 항상 입금을 먼저 출력한다.
- 날짜는 date 함수를 사용하지 않고 입력된 데이터자체의 크기비교로 선후를
결정한다.
예) 090601 과 090630 을 비교할 때 정수타입으로 보아 090630 이 큰 수
이므로 뒤에 나오는 날짜로 인식한다.
- 하루에 여러 번 출금이 있으면 그때는 코드의 번호가 작은 것을 먼저 출력한다.
⑺ 각 날짜 별 입금과 출금의 표현을 왼쪽과 오른쪽으로 반드시 구별하여 출력한다.
- 출력은 아래 출력형식 처럼 내용은 왼쪽정렬, 금액은 오른쪽 정렬을 한다.
- 이때 금액은 세 자리 마다 하나씩 ‘ , ’를 붙인다.
⑻ 처리를 한 제일 마지막에 출금 항목별 총액을 출력하고 그 달의 잔액을 표기한다.
- 출금 항목별 총액은 총액이 가장 큰 항목이 제일 위로 출력 되게 한다.
- 마지막에 입금총액과 출금총액을 출력한다.
- 잔액은 반드시 앞에 ‘+ 또는 -’ 기호를 붙여 표기한다.
⑼ output.txt 에 출력한 내용을 화면으로 출력한다.
⑽ 나머지 화면출력이나 파일 출력에 관련된 여백 등 화면 표기는 프로그래머가 알맞게 조절하여 보기 좋게 한다.
※ 입력형식
input.txt
090601+0103000000
090601-0600020000
090602-0500200000
090615+0201000000
090612-0400500000
090615-0300120000
090621-0600050000
090620-0300110000
090625-0500090000
090629-0600006000
090630-0300013000
090625-0300019000
※ 출력형식
output.txt
입 금 | 날 짜 | 출 금 |
월급 3,000,000
| 09 년 06 월 01 일 09 년 06 월 01 일 . . . |
교통비 20,000
|
출금 항목별 금액
관리비 : xx,xxx
용 돈 : xxx,xxx
.....
입금총액 : xxx,xxx,xxx
출금총액 : xxx,xxx,xxx
잔 액 : + xxx,xxx
이렇게 짜라구 그랬거든요.ㅠㅠ제가 최대한 짜봤는데..ㅠ너무 많이 막혀서요..ㅠㅠ 제가 짠것좀 확인좀 부탁드리며 나머지 부분두 완성 좀 부탁드릴게요.ㅠㅠ 제발..ㅠㅠ 꼭 도움 부탁드립니다..ㅠㅠ제발..ㅠㅠ
내공 더 팍팍 많이 드릴게요..ㅠ제발요...
#include<stdio.h>
#include<stdlib.h>
enum code {01,02,03,04,05,06};
struct std {
char date[7];
char inout;
enum code code;
int money[8];
int list[1];
};
void rank(std *temp,int no) //날짜순으로 순서를 정하는 함수
{
int i,j;
for(i=0;i<no;i++)
for(j=1;j<no;j++)
if(atoi(temp[i].date)>atoi(temp[j].date))
temp[j].list++;
else if(atoi(temp[i].date)<atoi(temp[j].date))
temp[i].list++;
else if(atoi(temp[i].date)==atoi(temp[j].date))
{
if (temp[i].inout=='-')
temp[i].list++;
}
}
void chocode(enum code s)//코드를 고르는 함수- 월급,기타금액.이런거 구별하려고
{
switch(s)
{
case 01:
printf("월급");
case 02:
printf("기타수입");
case 03:
printf("식료품");
case 04:
printf("관리비");
case 05:
printf("용돈");
case 06:
printf("교통비");
break;
}
}
void comma(int array[]) //비용쓰는 함수 ,붙이기 위해서 아직 미완성 ㅠㅠ
{
if (array[1]!=0)
{
printf("%-d",array[2]);
printf(",");
for(i=2;i<5;i++)
printf("%d",array[i]);
printf(",");
for(i=5;i<8;i++)
printf("%d",array[i]);
}
else
if()
printf("")}
int main()
{
struct std table[100];
FILE *in;//파일포인터
FILE *out;
int i,j,cnt,a;//cnt는 no
in=fopen("input.txt","rt");
do{
for(j=0;j<8;j++)//여기도 다시 받아야 할것간같아..
{
fscanf(in,"%c",&table[i].date[j]); //input파일 date정보를 table로 받음.
}
fscanf(in,"%c",&table[i].inout);;//입출금 기호 받기.
fscanf(in,"%d",&table[i].code);// 코드 받기
fscanf(in,"%8d"m&table[i].money); //금액받기
table[i].list=0;
if (table[i]==NULL)
break;
i++;
}while (1);
fcolse(input);
cnt=i;
rank(date,cnt);
out=fopen("output.txt","wt");
fprintf(out," 입 금 날 짜 출 금");
for(i=0;i<cnt;i++) // 날짜순으로 쓰기위해서
{
table[i]=table[table[i].list]; //table의 순서를 날짜순으로 바꿔줌.
}
for (i=0;i<cnt;i++) {
if(table[i].inout=='+')
chocode(table[i].code);//입출금 내용 쓰기 위한함수
comma(table[i].money);
printf(" %2c년 %2c월 %2c일",table[i].date);
}
}//main함수 괄호

답변자님,
정보를 공유해 주세요.
#include <stdio.h>
#include <stdlib.h>
enum{
CODE_1 = 1,
CODE_2 = 2,
CODE_3 = 3,
CODE_4 = 4,
CODE_5 = 5,
CODE_6 = 6,
};//열거형을 어떻게 이용 할지 잘모르겠네요
struct Process
{
char nDate[13];
char nInOutCode;
int nCode;
int nMoney;
};
//파일에서 읽어온 문자열 한줄에서 데이터를 추출
void ToData(char *line, struct Process *data)
{
int tmpCount = 0, tmp;
char str[10];
//날짜 읽기
tmp = 0;
strcpy(data->nDate, "");
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp] = 0;
strcat(data->nDate, str);
strcat(data->nDate, "년");
tmp = 0;
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp] = 0;
strcat(data->nDate, str);
strcat(data->nDate, "월");
tmp = 0;
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp] = 0;
strcat(data->nDate, str);
strcat(data->nDate, "일");
//입출금 코드 읽기
(*data).nInOutCode = line[tmpCount++];
//분류코드 읽기
tmp = 0;
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp] = 0;
(*data).nCode = atoi(str);
//금액 읽기
tmp = 0;
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp++] = line[tmpCount++];
str[tmp] = 0;
(*data).nMoney = atoi(str);
}
void Load(struct Process *data, int *cnt)
{
FILE *fp = fopen("input.txt", "r");
char strTemp[256];
while(1)
{
if(fgets(strTemp,256,fp) == NULL) break;//파일에서 한줄을 읽어옵니다.
ToData(strTemp, &data[*cnt]);//읽어온 문자열을 데이터 추출합니다.
(*cnt)++;
}
fclose(fp);
}
//날짜순으로 정렬
void Sort(struct Process *data, int cnt)
{
int i,j;
struct Process tmp;
for(i=0;i < cnt-1;i++)
{
for(j=1;j < cnt-i;j++)
{
if(strcmp(data[j-1].nDate, data[j].nDate) > 0)
{
tmp = data[j-1];
data[j-1] = data[j];
data[j] = tmp;
}
}
}
}
//코드에 맞는 문자열을 리턴 합니다.
char* CodeToStr(int code)
{
switch(code)
{
case CODE_1:
return "월급";
case CODE_2:
return "기타수입";
case CODE_3:
return "식료품";
case CODE_4:
return "관리비";
case CODE_5:
return "용돈";
case CODE_6:
return "교통비";
}
}
//숫자에 3자리마다 콤마를 찍어줍니다.
char* MoneyTo(int money)
{
char str[40]={0,},str2[40]={0,},tmp;
int i,j = 0, c = 0;
itoa(money,str,10);
for(i = strlen(str)-1;i > -1;i--)
{
str2[j] = str[i];
if(c == 2 && c != 0 && i != 0)//3자리 마다 콤마 삽입
{
c = -1;
j++;
str2[j] = ',';
}
j++;
c++;
}
str2[j] = 0;//꺼구로 저장됨 밑에 소스로 반대로 만듬
for(i=0;i < strlen(str2)/2;i++)//문자열을 꺼꾸로
{
tmp = str2[i];
str2[i] = str2[strlen(str2)-i-1];
str2[strlen(str2)-i-1] = tmp;
}
return str2;
}
//파일에 출력
void OutFile(struct Process *data, int cnt)
{
int i;
char str[40];
FILE *fp = fopen("output.txt", "w");
int nCode[6] = {0,}, inTotal = 0, outTotal = 0;
fprintf(fp,"\t입금\t\t\t날짜\t\t\t출금\n");
for(i=0;i < cnt;i++)
{
if(data[i].nInOutCode == '+')//수입일경우
{
sprintf(str,"%s %d", CodeToStr(data[i].nCode), data[i].nMoney);
if(strlen(str) < 13)
fprintf(fp,"%s %d\t\t%s\n", CodeToStr(data[i].nCode), data[i].nMoney, data[i].nDate);
else if(strlen(str) > 13)
fprintf(fp,"%s %d\t%s\n", CodeToStr(data[i].nCode), data[i].nMoney, data[i].nDate);
}else if(data[i].nInOutCode == '-')//
{
fprintf(fp,"\t\t\t%s\t\t\t%s %d\n", data[i].nDate, CodeToStr(data[i].nCode), data[i].nMoney);
}
nCode[data[i].nCode-1] += data[i].nMoney;
if(data[i].nInOutCode == '+')
inTotal += data[i].nMoney;
if(data[i].nInOutCode == '-')
outTotal += data[i].nMoney;
}
fprintf(fp,"출금 항목별 금액\n");
strcpy(str, MoneyTo(nCode[0]));
fprintf(fp,"월급:\t\t%s\n", str);
strcpy(str, MoneyTo(nCode[1]));
fprintf(fp,"기타수입:\t%s\n", str);
strcpy(str, MoneyTo(nCode[2]));
fprintf(fp,"식료품:\t\t%s\n", str);
strcpy(str, MoneyTo(nCode[3]));
fprintf(fp,"관리비:\t\t%s\n", str);
strcpy(str, MoneyTo(nCode[4]));
fprintf(fp,"용돈:\t\t%s\n", str);
strcpy(str, MoneyTo(nCode[5]));
fprintf(fp,"교통비:\t\t%s\n\n", str);
strcpy(str, MoneyTo(inTotal));
fprintf(fp,"입금총액:\t%s\n", str);
strcpy(str, MoneyTo(outTotal));
fprintf(fp,"출금총액:\t%s\n", str);
strcpy(str, MoneyTo(inTotal - outTotal));
fprintf(fp,"잔액:\t\t%s\n", str);
fclose(fp);
}
void main()
{
struct Process data[100];
int nCount = 0;
char str[80];
Load(data, &nCount);
Sort(data, nCount);
OutFile(data, nCount);
}
2009.06.24.
-
채택
질문자가 채택한 답변입니다.