본문 바로가기

Studies/A Structured Approach Using C++

Project 4-37 Prepare a payroll earnings statement

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-37
//  data.txt로 부터 세일즈맨의 정보를 읽어와 처리함
//============================================================================

#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>

class Salesperson
{
 public:
  Salesperson();      //Default 생성자
  ~Salesperson();      //소멸자
  void init(char *data_string);  //한 줄을 입력 받아 Data를 변수에 저장
  void calc();      //계산을 수행하는 메쏘드
  void print();      //계산 내용을 출력하는 메쏘드

 private:
  char name[80];
  int sales;
  int bonus;
  float federal;
  float state;
  float retirement;
};

Salesperson::Salesperson()
{} //Do nothing

Salesperson::~Salesperson()
{} //Do nothing

void Salesperson::init(char *data_string) //파일로부터 Data를 읽어오는 생성자
{
 strcpy(name, strtok(data_string," \t"));
 sales = atoi(strtok(NULL," \t"));
 bonus = atoi(strtok(NULL," \t"));
}

void Salesperson::calc()     //계산 함수
{
 float total_income = (float)(sales*0.125 + bonus);
 federal = (float)(total_income * 0.25);
 state = (float)(total_income * 0.10);
 retirement = (float)(total_income * 0.08);
}

void Salesperson::print()      //화면 출력을 담당하는 함수
{
 cout.setf( ios::right, ios::adjustfield ); //오른쪽 정렬                                
 cout <<"| "<<setw(9)<<setfill(' ')<<name<<' '; //9칸의 공간을 할당, 여백을 ' '으로 채움
 cout <<"| "<<setw(7)<<setfill(' ')<<sales<<' ';
 cout <<"| "<<setw(7)<<setfill(' ')<<bonus<<' ';
 cout <<"| "<<setw(7)<<setfill(' ')<<federal<<' ';
 cout <<"| "<<setw(7)<<setfill(' ')<<state<<' ';
 cout <<"| "<<setw(8)<<setfill(' ')<<retirement <<" |\n";
}


int main()
{
 char buf[80];       //파일에서 한줄씩 읽기 위한 버퍼
 ifstream  file;       //file stream
 Salesperson salesperson;    //세일즈맨들의 정보를 저장, 계산하기위한 클래스
 file.open("data.txt", ifstream::in); //Data.txt File Open
 file.getline(buf, 80);     //첫번째 줄 무시
 file.getline(buf, 80);
 cout << "================================================================\n";
 cout << "|SALESPERSON|  SLAES  |  BONUS  | FEDERAL |  STATE  |RETIREMENT|\n";
 cout << "================================================================\n";

 do
 {
  salesperson.init(buf);
  salesperson.calc();
  salesperson.print();
 } while (file.getline(buf, 80)); //마지막 줄까지 읽으면서 새로운 데이터를 생성하고 출력함
 cout << "================================================================\n";

 return 0;
}

--------------------------------------------------------------------------------------

data.txt


salesperson sales   bonus
1           53500   425
2           41300   300
3           56800   350
4           36200   175