NAVER

사용자 링크

Q&A 영역

질문 씨언어로..가계부 프로그램 짜는건데..ㅠㅠ제발 도와주세요..ㅠㅠ
jung**** 조회수 723 작성일2009.06.24

안녕하세요.ㅠ 내일까지 가계부 프로그램 작성해서 내야하는데..ㅠㅠ 너무 어려워서 정말 못하겟네요..ㅠㅠ

 

고수님들..ㅠ제발 도와주세요..ㅠ 내공 다드릴게요.ㅠㅠ제발 부탁드립니다..ㅠㅠ

 

다음은 가계부 프로그램에 대한 처리조건이다. 조건에 맞게 코딩하시오.

 

※ 처리조건

⑴ 입력은 “날짜, 입금/출금 코드, 분류코드, 액수” 의 순으로 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함수 괄호

프로필 사진

답변자님,

정보를 공유해 주세요.

1개 답변
1번째 답변
프로필 사진
난뽀다
은하신
C, C++ 7위, 자바, JSP 14위, 자바스크립트 79위 분야에서 활동

#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.

  • 채택

    질문자가 채택한 답변입니다.