'Studies'에 해당되는 글 30건

  1. 2014.07.05 Visual Studio C++ 비쥬얼 스튜디오 링크에러 수정방법
  2. 2014.07.05 윤성우 열혈강의 C 프로그래밍 솔류션 만들기 시작합니다
  3. 2011.12.13 9장 Programming 1. 은행계좌
  4. 2011.12.11 Chapter 8 LAB solution (4)
  5. 2011.12.06 Programming 08-07 (p.338) 클래스 설계
  6. 2011.09.06 [Review] Chapter 01. p.14 ~ 15 Name Space 와 변수
  7. 2011.09.06 [Review] Chapter 01. p.06 - 객체지향방법 (Object-oriented approach)의 목적
  8. 2011.09.06 뭐부터 할까? (4)
  9. 2011.02.21 C++ Espresso 에스프레소 by 천인국 에 관한 Technical Review 및 과제 등록 게시판 입니다 (6)
  10. 2008.08.23 Project 9-67 Euclid's method to get the Greate commom divisor and the Least common muliple 유클리드 소거법으로 최대공약수, 최소공배수 구하기
  11. 2008.08.23 Project 4-41 Create customers' bills 영수증 발행
  12. 2008.08.23 Project 4-40 Random number 랜덤
  13. 2008.08.23 Project 4-39 Temperature convertor : Fathrenheit VS Centigrade 온도변환기 : 화씨 섭씨
  14. 2008.08.23 Project 4-38 Compute the interest and print the balance
  15. 2008.08.23 Project 4-37 Prepare a payroll earnings statement
  16. 2008.08.23 Problem 4-35 print the ceiling, floor, and rounded value of a floating-point number
  17. 2008.08.23 Problem 4-33 Modify the "Add two digit" grogram
  18. 2008.08.21 Computer Science: A structured approach using C++
  19. 2008.08.20 문제 2. 지뢰 찾기 (Mine sweeper)
  20. 2008.08.12 문제 1. 3n+1 문제(The 3n+1 Problem)
  21. 2008.08.12 File mode checker
  22. 2008.08.12 myShell
  23. 2008.08.12 myCAT : cat(1)
  24. 2008.08.10 WC : Word Count
  25. 2008.08.10 실행파일 만들기 : Make a .exe file for APUE
  26. 2008.08.10 error.c
  27. 2008.08.10 ourhdr.h
  28. 2008.08.10 Advanced Programming in the UNIX Environment
  29. 2008.08.10 게시판별 용도
  30. 2008.08.08 [개강공지] Computer Engineering 1st year. Blog just opend and Welcome!

첫번째 예제코드를 작성하고 봤더니 Visual Studio 2010 에서 링크 에러를 내네요. 


Error 'LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt'


해결 방법은 인터넷 검색으로 찾았습니다. 이미 알려진 문제인 듯 합니다. 


프로젝트 상태에서 메뉴 -> Project -> 맨 아래 Properties -> Linker -> General -> Enable Incremental Linking 을 "No" 로 변경합니다. 


경로는 아래 그림을 참고하세요.


참고 >  만약 Properties로 진입했는데 Linker가 보이지 않는다면, 현재 소스코드 (C 또는 CPP파일)이 활성화된 상태라서 그렇습니다. Visual Studio 2010의 코드 에디터 외에 밖의 영역 아무데나 클릭하시고 다시 Properties 메뉴를 선택하시면 됩니다. 이 부분이 이해가 안되신다면, 지금 작업하는 프로젝트를 닫으시고 (메뉴 -> File -> Close Solution), 열혈강의 책 23 ~ 27 페이지 까지 참고하셔서 1단계 까지만 진행하시고 "2단계 소스파일의 생성"을 하지 않은 상태에서 Properties에 진입하시면 Linker가 보일겁니다. 





Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

제목과 같습니다.


C언어 교제중 가장 널리 사용되고 있는 윤성우 저자의 열혈강의 C에 대한 솔류션 만들기를 시작하려 합니다.


코드가 도움이 되신다면, 구글 광고라도 열심히 봐주시고 클릭해주시면 감사하겠습니다. 


사실, 이 코드를 과제에 직접 카피해 쓰시다가는 조교님이나 교수님도 금방 찾아내실거에요. 구글에 검색하면 나올테니까요. 


이 코드들이 네이버 검색에 걸릴지는 잘 모르겠네요 


7월 한달 내에 100% 완성하는 것이 목표입니다. 


뒷부분 고급 코드들은 소스 코드를 공개적으로 올리지는 않을지도 모르겠습니다. 그 부분은 수익모델 때문에 고민중입니다. 사실 이런 작업 자체가 용돈벌이가 될 수 있는가라는 질문에 대한 공개실험이라고 생각하셔도 좋습니다.


문의사항이나 필요한 내용이 있다면 방명록이나 E-mail을 주십시요. rinehart@naver.com 입니다. 

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절



※ 아 이건 문제가 좀 거지 같네요. Virtual 함수 쓰는 법 연습인 건 알겠지만, 문제 정의도 별로고... 실제 테스트 시나리오도 너무 부실하게 기술되어 있고... 좀더 문제가 이해하기 쉬웠으면 좋겠습니다. 

결국, 제 맘대로 해버렸다는... <iostream> 에서 cout으로 출력할 대, float 계산 결과의 소수점 맞추는 것도 마음에 안드네요. 이건 c의 stdio의 fprinf 같은 것 이용해야 깔끔합니다. 

● BankAcct.h
#ifndef __BACKACCT_H__
#define __BACKACCT_H__

#include <iostream>
#include <string>

class BankAcct
{
	protected:
		int money;

	public:
		BankAcct();
		~BankAcct();

		void deposit(int v_money);
		int withdraw(void);

		virtual float getInterest(void) = 0;
};
#endif




●BankAcct.cpp
#include "BankAcct.h"

BankAcct::BankAcct()
{
	/* do nothing */
}

BankAcct::~BankAcct()
{
	/* do nothing */
}

void BankAcct::deposit(int v_money)
{
	money += v_money;

	return;
}

int BankAcct::withdraw(void)
{
	float temp = money;

	money = 0;

	return temp;
}



●Accounts.h
#ifndef __ACCOUNTS_H__
#define __ACCOUNTS_H__

#include "BankAcct.h"

class SavingAcct:public BankAcct
{
	private:

	public:
		SavingAcct();
		~SavingAcct();
		virtual float getInterest(void);
};

class CheckingAcct:public BankAcct
{
	private:

	public:
		CheckingAcct();
		~CheckingAcct();
		float getInterest(void);
};
#endif



●Acounts.cpp
#include "Accounts.h"

SavingAcct::SavingAcct()
{
	money = 0;
}

SavingAcct::~SavingAcct()
{
	/* do nothing */
}

float SavingAcct::getInterest(void)
{
	return 0.09;
}

CheckingAcct::CheckingAcct()
{
	money = 0;
}

CheckingAcct::~CheckingAcct()
{
	/* do nothing */
}

float CheckingAcct::getInterest(void)
{
	/* do nothing */
	return 0.05;
}




●main.h
#include <iostream>
#include <iomanip>
#include <string>
#include "Accounts.h"

using namespace std;



●main.cpp
#include "main.h"

int main()
{
	float s_temp=0, c_temp = 0;

	/* Create acconts */
	SavingAcct S = SavingAcct();
	CheckingAcct C = CheckingAcct();

	/* Save some money */
	S.deposit(20000);
	C.deposit(15000);

	/* Calculate interest incomes */
	s_temp = S.withdraw() * S.getInterest();
	c_temp = C.withdraw() * C.getInterest();

	cout << "Saving Account Interest Incomes : expecting : " << setw(8) << setprecision(6) << s_temp << "\n";
	cout << "Checking Account Interest Incomes : expecting : " << setw(8) << setprecision(6) << c_temp << "\n";

	/* Save more money */
	S.deposit(s_temp + 20000);
	C.deposit(c_temp + 17000);

	/* Widthraw and Calculate total incomes */
	s_temp = S.withdraw() * (1 + S.getInterest());
	c_temp = C.withdraw() * (1 + C.getInterest());

	cout << "Saving Account Total Incomes : " << setw(8) << setprecision(6) << s_temp << "\n";
	cout << "Checking Account Total Incomes : " << setw(8) << setprecision(6) << c_temp << "\n";

	return 0;
}


 


Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절


p.339의 상속관련 예제입니다. 

● human.h

#include <iostream>
#include <string>
using namespace std;

#ifndef HUMAN_H
#define HUMAN_H

class Human
{
	protected:
		string name;
		int age;

	public:
		Human();
		Human(string name, int age);
		~Human();
		void setName(string v_name);
		string getName(void);
		void setAge(int v_age);
		int getAge(void);
		void print(void);
};

#endif

● human.cpp
#include "human.h"

Human::Human()
{
	/* Default constructor */
	cout << "Human default constructor" << "\n";
}

Human::Human(string name, int age)
{
	setName(name);
	setAge(age);	

	cout << "Human second constructor" << "\n";
}

Human::~Human()
{
	/* Do nothing */  
	cout << "Human default destructor" << "\n";
}

void Human::setName(string v_name)
{
	name = v_name;
	return;
}

string Human::getName()
{
	return name;
}

void Human::setAge(int v_age)
{
	age = v_age;
	return;
}

int Human::getAge()
{
	return age;
}

void Human::print(void)
{
	cout << "Name : " << name << "\tAge : " << age << "\n";

	return;
}

● student.h
#ifndef HUMAN_H
#include "human.h"
#endif

#ifndef STUDENT_H
#define STUDENT_H

class Student : public Human
{
	protected:
		string major;

	public:
		Student();
		Student(string name, int age, string major);
		~Student();
		void setMajor(string v_major);
		string getMajor(void);
		void print(void);
};
#endif


● student.cpp
#include "student.h"

Student::Student()
{
	/* default constructor */
	cout << "Student default constructor" << "\n";
}

Student::Student(string name, int age, string major)
{
	setName(name);
	setAge(age);
	setMajor(major);

	cout << "Student second constructor" << "\n";
}

Student::~Student()
{
	/* Do nothing */
	cout << "Student default destructor" << "\n";
}

void Student::setMajor(string v_major)
{
	major = v_major;
}

string Student::getMajor(void)
{
	return major;
}

void Student::print(void)
{
	cout << "Name : " << name << "\tAge : " << age << "\tMajor : " << major << "\n";

	return;
}

● main.cpp
#include <iostream>
#include <string>
using namespace std;

#include "human.h"
#include "student.h"

int main()
{
	Human a("춘향", 18);
	Human b("몽룡", 21);
	Human c("사또", 50);

	a.print();
	b.print();
	c.print();

	Student d("명진", 21, "컴퓨터");
	Student e("미현", 22, "경영");
	Student f("용준", 24, "전자");

	d.print();
	e.print();
	f.print();

	return 0;
}
※ 뭐 질문이 없어서, 그냥 손에 잡히는데로 하렵니다.    그나저나 구글의 소스 플러그인은 정말 보기가 좋네요. 


Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2012.05.18 21:56
    댓글 주소 수정/삭제 댓글
    c++ 에스프레소 7장부터 11장 까지 exerclse 와 lab좀 해서주실수 있나요정말 어렵네요 군대 갔다 왓더니 모르겟네요 부탁드립니다.
  2. 2012.06.11 08:43 신고
    댓글 주소 수정/삭제 댓글
    C++ 에스프레소의 솔류션을 찾는 유입 키워드가 굉장히 많네요. 도와드릴 용의는 있습니다.
    단, 전체를 요청하기보다, 막히는 문제 한두 문제 정도? 그리고 막히는 부분을 물어봐주세요.
    좋아요 나 View on, 배너 클릭을 좀 해주시면 저도 의욕이 좀 더 나겠죠.
    • jjsj
      2014.05.24 15:06
      댓글 주소 수정/삭제
      C++에스프레소 6장 LAB문제 답좀 알수있을까요...ㅠ
      일단 답을 알고 보면서 공부하고 싶은데...답이없네요 ㅠㅠ

Student.h
#include <iostream>
#include <string>
using namespace std;

class Student
{
	protected:
		string name;		//이름
		string id;			//학번
		string major;		//전공
		unsigned int grade;	//학년
		unsigned int credit;//학점

	public:
		Student();
		~Student();	
};

Student::Student()
{
	/* Do nothing */
}

Student::~Student()
{
	/* Do nothing */
}
graduate.h
class Graduate:private Student
{
	private:
		string assistant;	//조교
		float scholarship;	// 장학금

	public:
		Graduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_assistant, float f_scholarship);
		~Graduate();
		void print(void);
};


Graduate::Graduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_assistant, float f_scholarship)
{
	name = s_name;
	id = s_id;
	major = s_major;
	grade = i_grade;
	credit = i_credit;
	assistant = s_assistant;
	scholarship = f_scholarship;
}

Graduate::~Graduate()
{
	/* Do nothing */
}

void Graduate::print(void)
{
	cout << "이름" << " : " << name << "\n";
	cout << "학번" << " : " << id << "\n";
	cout << "전공" << " : " << major << "\n";
	cout << "학년" << " : " << grade << "\n";
	cout << "이수학점" << " : " << credit << "\n";
	cout << "조교유형" << " : " << assistant << "\n";
	cout << "장학금비율" << " : " << scholarship << "\n";
}

UnderGraduate.h
class UnderGraduate:private Student
{
	private:
		string circle;	//동아리

	public:
		UnderGraduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_circle);
		~UnderGraduate();
		void print(void);
};


UnderGraduate::UnderGraduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_circle)
{
	name = s_name;
	id = s_id;
	major = s_major;
	grade = i_grade;
	credit = i_credit;
	circle = s_circle;
}

UnderGraduate::~UnderGraduate()
{
	/* Do nothing */
}

void UnderGraduate::print(void)
{
	cout << "이름" << " : " << name << "\n";
	cout << "학번" << " : " << id << "\n";
	cout << "전공" << " : " << major << "\n";
	cout << "학년" << " : " << grade << "\n";
	cout << "이수학점" << " : " << credit << "\n";
	cout << "동아리" << " : " << circle << "\n";
}

Main.cpp
#include "student.h"
#include "under_graduate.h"
#include "graduate.h"

int main()
{
	Graduate g("홍길동","20051111","컴퓨터공학과",4, 140,"연구조교", 0.5);

	UnderGraduate u("하길동","20011111","컴퓨터공학과",2, 80,"Visaul C++");

	g.print();
	cout<<"-------------------------"<<endl;
	u.print();

	return 0;
}

PS. VS2010 문제인지, 오랬만에 해서 뭔가 헛갈리는 건지 모르겠지만... Include 중복 문제가 있어서 이 코드는 좀 우습게 되었습니다. 참고만 하세요.
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

   Name Space와 변수  
 

○ using namespace std (p.15)

● Using namespace 선언의 경우, 두 개 이상의 name을 등록할 수도 있다. 만약 두 개 이상의 name을 등록했을 때, 동일한 이름의 함수가 두 곳에 모두 있다면 compile error가 날 것인가? 아니면 어떤 우선순위를 가지고 넘어갈 것인가? test를 해보려면 어떻게 해야 하나? 


○ 변수는 데이터를 담아두는 상자와 같다. (p.17)

● 변수를 상자로 표현하는 것은 좋은 아이디어가 아닌 것 같다. 변수는 실제 컴퓨터 안에서는 메모리 "주소"에 이름을 붙있다는 의미가 더 크다. Computer 구조와 연산방식에 대한 이해가 없다면 Pointer에 대한 이해는 영원히 어렵다. Basic 같은 언어에서라면 상자로 충분하겠지만, C/C++에서는 좀 더 상세한 내부 구조 / 동작 설명이 같이 되었다면 더 좋았을 것 같다. 

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

   객체 지향 방법의 최대 목표는 코드의 재사용(reuse)이다. (p.7)
 


●  객체지향의 최대 목표가 코드의 재사용일까? 실제 작업에서는 그 이점을 크게 느끼기는 어렵다. 다른 사람이 만든 코드를 라이브러리로 제공하는 것은 꼭 객체지향방법론에만 적용되는 것은 아니다. jQuery와 같이 JavaScript 같은 언어에서도 라이브러리로 함수 Set을 제공한다. 

  특히, Virtual 및 Interface를 이용한 추상함수의 경우, 함수 상속자가 각각의 함수를 재구현해야 한다. 경험한 바에 따르면, Class를 상속한다고 해서 작업량이 늘 줄어드는 것은 아니다. 

●  객체지향의 가장 큰 장점은, 오히려 각각의 객체간의 완전한 분리를 통한 수정 용이성이 아닐까? 전역변수를 철저하게 배재하고 깔끔하게 독립적으로 돌아가도록 잘 구현한 클래스는 나중에 수정이나 확장할 때도 큰 고민 없이 작업을 시작할 수 있다. 함수의 Overriding, Overloading 기능은 기존 코드를 Side effect 우려 없이 수정할 수 있도록 지원한다. C로 만든 범용 함수를 확장(ex. 함수 인자를 추가 하는 경우)하는 경우와 비교하면 이것은 정말 큰 이점이다. 
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  확실히, 개강시즌이라 그런지  "C++  Espresso 해답" 이란 검색어로 들어오는 분들이 많네요. 진도가 어디쯤인지, 과제가 어떤 식인지, 혹은 어떤 부분이 막히는지 남겨주시면 그 부분부터 볼까 합니다. 뭐 교수님도 검색해서 이 블로그를 아시겠지만... 
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2013.09.25 20:10
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
    • 2013.10.12 16:44 신고
      댓글 주소 수정/삭제
      ㅎㅎ 생각이 너무 많으신 듯 합니다.
      그냥 정수 구간만 생각하시고, 증가도 1씩 한다고 쉽게 생각하세요. 여백은 빈칸으로, 점은 * 로 찍으시면 됩니다.

      앞에 다이아를 이해 하셨으면 어렵지 않습니다. 그래도 모르겠으면 짜신데까지의 코드를 보내주세요
  2. someone
    2013.11.25 15:41
    댓글 주소 수정/삭제 댓글
    chapter 10 lab 문제좀 풀어주세요... 오류가 계속 생기고 뭔소린지 모르겠습니다

  C++ 책을 졸업하고 몇년만에 다시 훝어보고 있습니다. 그동안의 짬밥이 헛된 것이 아니기를 바라며, 책의 내용에 대한 궁금증들에 대한 답을 스스로 해보려고 합니다. 우선은 Technical한 부분에 치중을 하겠지만, 중간에 재미있는 과제들이 보인다면 그에 대한 해답도 가끔 올라갈 것입니다. 

  사실, 과제 위주로 하고 싶은 마음도 크지만, 블로그에 소스코드를 보기좋게 올리는 것이 생각보다 쉽지 않아서 - Syntax highlighting이 제대로 지원되지 않아, 캡춰 후 이미지로 올려야 웹에서 보기 좋습니다 - 좀 고민이 되고 있습니다. 새로 PC를 산 뒤에 아직 빌드 환경을 깔지 않은 것이 두번째 이유 입니다. 귀찮다고 여기는건데, 영 좋지 않습니다. 

  퇴근 후 잠깐잠깐 할까 했으나, 이미 잘시간이 되어갑니다. 내일부터 할까요? 
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2011.04.25 17:10
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
  2. 2011.12.03 23:52
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다
  3. 2013.12.02 11:44
    댓글 주소 수정/삭제 댓글
    비밀댓글입니다

//============================================================================
//  제출일 : 2005. 4. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 9-67
//============================================================================

#include <iostream.h>

int get_gcd(int a, int b); //recursive fuction

int main()
{
 int gcd;
 int a, b;

 cout << "input factor A : ";
 cin >> a;
 cout << "input factor B : ";
 cin >> b;

 gcd = get_gcd(a, b);
 cout << "gcd is " << gcd << endl;
 cout << "lcm is " << a*b/gcd << endl;

 return 0;
}

int get_gcd(int a, int b) //get gcd by recursive
{
 if (a ==0 || b == 0)
  return a+b;
 else if (a >= b)
  return get_gcd(a%b, b);
 else
  return get_gcd(b%a, a);
};


 

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-41
//  : Call by Reference를 사용하기 위하여 메인함수에 값을 받아오는 함수를
//    추가하였습니다. 클래스 구조를 사용할 경우 굳이 사용할 필요는 없습니다만
//    주어진 조건에 충실하기 위하여 추가하였습니다.
//============================================================================


#include <iostream.h>
#include <iomanip.h>
#define LABOR 0.35  //고정변수 : Labor cost per sqare fit
#define TAX 8.5 //%  //고정변수 : Tex rate

class Bill    //청구서를 발행하는 클래스
{
 public:
  Bill();
  ~Bill();
  void setData(int _length, int _width, int _discount, float carpet); //사용자로부터 읽어온 값을 클래스의 데이터로 set함
  void calculate(void);            //계산 시작
  void printResult(void);            //결과 출력

 private:
  int length;
  int width;
  int discount;
  int area;
  float carpet;
  float carpet_cost;
  float labor_cost;
  float intalled_price;
  float discount_cost;
  float subtotal;
  float tax;
  float total;

  void calcInstall(void);            //계산에 필요한 세 가지 함수
  void clacSubTotal(void);
  void calcTotal(void);
};

Bill::Bill() //생성자
{}    //Do nothing
 
Bill::~Bill() //소멸자
{}    //Do nothing

void Bill::setData(int _length, int _width, int _discount, float _carpet)  //입력받은 변수를 저장하는 함수
{
 length = _length;
 width = _width;
 discount = _discount;
 carpet = _carpet;
 return;
}

void Bill::calculate(void)              //계산의 시작
{
 calcInstall();
 clacSubTotal();
 calcTotal();
 return;
}

void Bill::calcInstall(void)             //시설비 계산
{
 area = length * width;
 carpet_cost = area * carpet;
 labor_cost = (float)(area * LABOR);
 intalled_price = carpet_cost + labor_cost;
 return;
}

void Bill::clacSubTotal(void)             //SubTotal 계산
{
 discount_cost = intalled_price * discount/100;
 subtotal = intalled_price - discount_cost;
 return;
}

void Bill::calcTotal(void)              //Total 계산
{
 tax = (float)(subtotal * TAX/100);
 total = subtotal + tax;
 return;
}

void Bill::printResult(void)             //결과의 출력
{
 cout << "\n\n\t\tMEASUREMENT\n";
 cout.setf( ios::right); //오른쪽 정렬
 cout <<"Length\t\t\t"<<setw(7)<<setfill(' ')<<length<<"\tfeet\n";
 cout <<"Width\t\t\t"<<setw(7)<<setfill(' ')<<width<<"\tfeet\n";
 cout <<"Area\t\t\t"<<setw(7)<<setfill(' ')<<area<<"\tfeet\n";

 cout << "\t\tCHAREGES\n\n";
 cout << "DESCRIPTION\tCOST/SQ.FT.\tCHARGE/ROOM\n";
 cout << "-----------\t-----------\t-----------\n";
 cout <<"Carpet\t\t"<<setw(11)<<setfill(' ')<< carpet<<"\t"<<setw(11)<<setfill(' ')<<carpet_cost<<"\n";
 cout <<"Labor\t\t"<<setw(11)<<setfill(' ')<< LABOR<<"\t"<<setw(11)<<setfill(' ')<<labor_cost<<"\n";
 cout <<"\t\t\t\t-----------\n";
 cout <<"INSTALLED PRICE\t\t\t"<<setw(11)<<setfill(' ')<<intalled_price<<"\n";
 cout <<"Discount\t"<<setw(10)<<setfill(' ')<< discount<<'%'<<"\t"<<setw(11)<<setfill(' ')<<discount_cost<<"\n";
 cout <<"\t\t\t\t-----------\n";
 cout <<"SUBTOTAL\t\t\t"<<setw(11)<<setfill(' ')<<subtotal<<"\n";
 cout <<"TAX\t\t\t\t"<<setw(11)<<setfill(' ')<<tax<<"\n";
 cout <<"TOTAL\t\t\t\t"<<setw(11)<<setfill(' ')<<total<<"\n";

 return;
}
//END of class Bill

//Subfunction of MAIN
void getData(int &_length, int &_width, int &_discount, float &_cost); //Call by Reference를 사용하기 위하여 추가한 함수

int main()
{
 int _length;              //Call by Reference를 사용하기 위하여 추가한 변수
 int _width;
 int _discount;
 float _carpet;
 getData(_length, _width, _discount, _carpet);      //사용자로부터 값을 입력받음
 Bill bill;               //클래스 생성
 bill.setData(_length, _width, _discount, _carpet);     //데이터 저장
 bill.calculate();             //계산  
 bill.printResult();             //결과 출력
 
 return 0;

}

//Subfunction of MAIN
void getData(int &_length, int &_width, int &_discount, float &_carpet) //Call by Reference를 사용하기 위하여 추가한 함수
{
 cout << "Length of room (feet)? ";
 cin >> _length;
 cout << "Width of room (feet)? ";
 cin >> _width;
 cout << "Customer discount (feet)? ";
 cin >> _discount;
 cout << "Cost per square foot (xxx.xx)? ";
 cin >> _carpet;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-40
//============================================================================

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
 float number;
 int rand_num;
 float product;
                                //Process No.
 cout << "Enter a number\n"; //1
 cin >> number;    //2
 cout << number << "\n";  //3

 srand(time(NULL)); //Seed Initianlization //4
 rand_num = rand()%35+3; //Get a Random number
 cout << rand_num << "\n"; //5

 product = number * rand_num; //6
 cout << ceil(product)<< "\n"; //7
 cout << pow(number, 5)<< "\n"; //8
 cout << floor (product)<< "\n"; //9
 cout << pow(number, 5)<< "\n"; //10
 cout << sqrt(product)<< "\n"; //11

 return 0;
}


Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-39
//============================================================================

#include <iostream.h>

void C2F(float input)    //썹씨를 화씨로 고치는 함수
{
 float output;
 output = 32 + input*(180/100); //변환식
 cout << output <<" F degree\n"; //출력
 return;
}

void F2C(float input)    //화씨를 썹씨로 고치는 함수
{
 float output;
 output = (input-32)*100/180; //변환식
 cout << output <<" C degree\n"; //출력
 return;
}

int main()
{
 float temp;
 cout << "Enter Centigrade temperature :\n";
 cin >> temp;
 C2F(temp);
 cout << "Enter Fathrenheit temperature :\n";
 cin >> temp;
 F2C(temp);


 return 0;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-38
//============================================================================

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

float calc(float input);  //이자의 계산
void print(float input);  //출력

int main()
{
 float begining_balance;
 cout << "원금을 입력하세요\n";
 cin >> begining_balance;

 print(begining_balance); //출력 함수 호출

 return 0;
}


float calc(float input)   //이자 계산 함수
{
 return (float)(input * 0.053);
}

void print (float input)  //출력함수 : 이자 계산 함수 호출
{
 int loop ;
 cout << "============================|\n";
 cout << "|Quater| Interest |  Total  |\n";
 cout << "============================|\n";
 for (loop = 0; loop < 5 ; loop++)
 {
  cout.setf( ios::right, ios::adjustfield ); //오른쪽 정렬       
  cout <<'|'<<setw(6)<<loop <<'|';
  cout <<setw(10)<<calc(input)<<'|';   //이자의 계산
  input+=calc(input);       //계산된 이자를 원금에 합산
  cout <<setw(9)<<input<<"|\n";    //최종 잔액 출력
 }
 cout << "=================================\n";
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

//============================================================================
//  제출일 : 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

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-35
//============================================================================
#include <iostream.h>
#include <math.h>

float round(float num);

int main()
{
 float num;
 cout << "아무수나 입력하세요\n";
 cin >> num;

 cout << "Ceiling : " << ceil(num) << "\n";
 cout << "Floor : " << floor(num) << "\n";
 cout << "Round : " << round(num) << "\n";
 

 return 0;
}

float round(float num)
{
 float temp;
 temp = (int)num;
 temp = num - temp;
 
 if (num > 0)
 {
  if (temp >= 0.5)
   return ceil(num);
  else
   return floor(num);
 }
 else
 {  
  if (temp >= -0.5)
   return ceil(num);
  else
   return floor(num);
 }
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-33
//============================================================================

#include <iostream.h>
//using namespace std;

// Prototype Declarations
 int addThreeDigits (int num);
 int firstDigit (int);
 int secondDigit (int);
 int thirdDigit (int);

int main()
{
 cout << "Enter an integer: ";
 int number;
 cin >> number;

 int sum = addThreeDigits (number);
 cout << "\nSum of last three digits is: " << sum;
 return 0;
} //main

int addThreeDigits (int number)
{
 int result = firstDigit(number) + secondDigit(number) + thirdDigit(number);
 return result;
}

int firstDigit(int num)
{
 return (num % 10);
}

int secondDigit(int num)
{
 int result = (num / 10) % 10;
 return result;
}

int thirdDigit(int num)
{
 int result = (num /100) % 10;
 return result;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

 
This book is the main textbook of this category. I'll post exercise & quizz's solutions on this category.

Please, do NOT simple copy & paste for your homework. If you can find this one, your prof. & friends can find, too. It's no easy to avoid copy finder. :-(

If you need more hint, leave some message on Guestbook. Thanks.

이 책이 교과서고, 앞으로 이 카테고리에는 연습문제의 소스들이 일부 올라갈 것임. 힘들게 숙제를 했는데 그냥 나만 보기는 좀 아쉬워서..
 
혹시 학교 숙제를 이걸 긁어 낼 생각은 하지 말기를.. 이정도 카피를 그냥 넘어갈 학교도 없겠거니와 인터넷에 검색해서 나온 소스는 나만 보는 것이 아니란 것도 염두에 둘 것. 당신이 검색해서 찾은 소스라면 당신의 교수님이나 조교도 당연히 찾았을 것이라는 뜻임.
 
나름데로 신경써서 짠 것들인데, 문제를 좀 날림으로 해석한 것도 있고, 내 마음데로 C로 짰다 C++로 짰다 해서 좀 거시기 한 면도 없잖아 있음. 교수님이 허용한 부분이기 때문에..
 
 그럼, "참고" 잘 하시기를.

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

// Written by rinehart

// rinehart@naver.com

//2007. 6. 8

/* Note :  This code will be better if get map text from file. (I'm lazy...)

Maybe, some part of main function need to seperate to another functions */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAP_MAX 100
#define Type_New_map    1
#define Type_Read_map  2
#define Type_Exit               3


int Get_String(char *input_buf, int *m, int *n);


int Get_Result(char **map, char **result, int m, int n);


int Print_Result(char** result, int m, int n);


int Set_Mark(char* target);


int main()
{
        char buf[MAP_MAX];       
        char **map;
        char **result;
        int m = 0, n = 0, line_counter = -1;
        int Type = 0;
        int loop;

        while (1)
        {
                Type = Get_String(buf, &m, &n);

                if (Type == Type_Exit)
                        break;
                else if (Type == Type_New_map)
                {
                        map = malloc(sizeof(char*) * m);
                        result= malloc(sizeof(char*)*m);
                       
                        for (loop = 0; loop < m; loop++)
                        {
                                map[loop] = malloc(sizeof(int*)*n);
                                result[loop] = malloc(sizeof(char*)*n);
                        }
                               
                        line_counter = 0;
                }
               
                for (loop = 0; loop < n; loop++)
                {
                        Type = Get_String(buf, &m, &n);
                        if (line_counter >= m)
                        {
                                // Get the Result
                                m = 0;               
                        }
                        else
                        {
                                strcpy(map[line_counter], buf);
                                line_counter++;               
                        }
                }

                Get_Result(map, result, m, n);
                Print_Result(result, m, n);
        }
       
        printf ("\nEnd of Program\n");
       
        return 0;
}


int Get_String(char *a_buf, int *m, int *n)
{
        int result_Type = Type_New_map;
        int t_m, t_n;
        char *token;

        memset (a_buf, 0x00, sizeof(a_buf));
        gets(a_buf);

        if (a_buf[0] == '.' || a_buf[0] == '*')
        {
                result_Type = Type_Read_map;
        }
        else
        {
                token = strtok(a_buf, " \n");
                t_m = atoi(token);
                token = strtok(NULL, " \n");
                t_n = atoi(token);
                if(t_m ==0 && t_n == 0)
                        result_Type = Type_Exit;
                else
                {
                        *m = t_m;
                        *n = t_n;
                        result_Type = Type_New_map;
                }
        }

        return result_Type;
}


int Get_Result(char **map, char **result, int m, int n)
{
        int loop1, loop2;

        for (loop1 = 0; loop1 < m; loop1++)
        {
                for (loop2 = 0; loop2 < n; loop2++)
                {
                        result[loop1][loop2] = '0';
                }
        }

       
        for (loop1 = 0; loop1 < m; loop1++)
        {
                for (loop2 = 0; loop2 < n; loop2++)
                {
                        if (map[loop1][loop2] == '*')
                        {
                                result[loop1][loop2] = '*';

                                if (loop1 != 0)
                                {
                                        Set_Mark(&(result[loop1-1][loop2]));
                                        if (loop2 != 0)
                                                Set_Mark(&(result[loop1-1][loop2-1]));                                        
                                        if (loop2 != n-1)
                                                Set_Mark(&(result[loop1-1][loop2+1] ));
                                }
                                if (loop1 != m-1)
                                {
                                        result[loop1 +1][loop2] ++;
                                        if (loop2 != 0)
                                                Set_Mark(&(result[loop1 +1][loop2-1]));
                                        if (loop2 != n-1)
                                                Set_Mark(&(result[loop1 +1][loop2+1]));
                                }

                                if (loop2 != 0)
                                        Set_Mark(&(result[loop1][loop2-1]));                                   
                                if (loop2 != n-1)
                                        Set_Mark(&(result[loop1][loop2+1]));   
                        }
                }
        }

        return 0;
}


int Print_Result(char** result, int m, int n)
{
        int loop1, loop2;
        for (loop1 = 0; loop1 < m; loop1++)
        {
                for (loop2 = 0; loop2 < n; loop2++)
                {
                        printf ("%c", result[loop1][loop2]);
                }
                printf("\n");
        }
        printf("\n");

        return 0;
}


int Set_Mark(char* target)
{
        if (*target != '*')
                *target = *target+1;
        return 0;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

// Written by rinehart

// rinehart@naver.com

//2007. 6. 1

/* Note : About 110,000 times tries, the program freezed. I don't know why. Maybe the windows OS can't support too much loop or function calls. */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_INPUT   1000000
#define MIN_INPUT   1

 

int Get_Numbers(int *input_a, int *input_b);
int Get_Cycle(int x);

 

int main()
{
    int v_input_a, v_input_b, v_input_temp;
    int v_Max_counter = 0, v_Temp_counter = 0;
   
    if (Get_Numbers(&v_input_a, &v_input_b))
        return 0;   // Error   
   
    v_input_temp = v_input_a;
   
    while (v_input_temp <= v_input_b)
    {
        v_Temp_counter = Get_Cycle(v_input_temp);
        printf (";%d", v_input_temp);   // Progress
       
        if (v_Max_counter < v_Temp_counter)
            v_Max_counter = v_Temp_counter;
       
        v_input_temp++;
    }
   
    printf ("\n\n%d %d %d\n", v_input_a, v_input_b, v_Max_counter);
   
    return 0;
}

int Get_Numbers(int *input_a, int *input_b)
{
    char buf[80];
    char *token;
    int v_err = 0;
   
    *input_a = 0;   *input_b = 0;   // Init
   
    printf ("Input 2 numbers (%d ~ %d)\n", MIN_INPUT, MAX_INPUT);
   
    gets(buf);
    token = strtok(buf, " \n");
    if (token)
        *input_a = atoi(token);
    else
        v_err = 1;
   
    token = strtok(NULL, " \n");
    if (token)
        *input_b = atoi(token);
    else
        v_err = 1;
   
    if (*input_a > *input_b)
        v_err = 1;
    else if (*input_a < MIN_INPUT || *input_a > MAX_INPUT)
        v_err = 1;
    else if (*input_b < MIN_INPUT || *input_b > MAX_INPUT)
        v_err = 1;
   
    if (v_err)  //later, seperate error cases
        printf ("ERROR : Wrong Number\n\n");
   
    return v_err;
}

int Get_Cycle(int x)
{
    int counter = 1;
   
    while(x != 1)
    {
        if (x%2)    //Odd number
            x = (x*3)+1;
        else        //Even number
            x = x/2;
       
        counter++;
    }
   
    return counter;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

APUE 책에 IF - ELSE로 구현 된 것을 switch - case로 재구현 한 것. stat 스트럭쳐 의 st_mode 의 내부를 들여다 본 것.

헤더파일과 구현부로 나뉘어 있음.

 
/* Header : myhdr.h */

#include <sys/types.h>
#include <sys/stat.h>
#include "ourhdr.h"

//Defined Values
#define N_IFREG 32768 // 1000 0000 0000 0000
#define N_IFDIR 16384 // 0100 0000 0000 0000   
#define N_IFCHR 8192 // 0010 0000 0000 0000
#define N_IFBLK 24576 // 0110 0000 0000 0000
#define N_IFIFO 4096 // 0001 0000 0000 0000
#define N_IFLNK 40960 // 1010 0000 0000 0000
#define N_IFSOCK 49152 // 1100 0000 0000 0000
#define MASK 61440 // 1111 0000 0000 0000

/* End of myhdr.h */

/* Source : file_mode.c */

#include "myhdr.h"

int main(int argc, char *argv[])
{
    int  i; //for loop
    int   mode ; //mode checker by bits
    struct stat buf;
    char  *ptr;

    for (i = 1; i < argc; i++)
    {
        printf("%s: ", argv[i]);
        if (lstat(argv[i], &buf) < 0)
        {
            err_ret("lstat error");
            continue;
        }

        mode = buf.st_mode & MASK; //Masking

        switch (mode)
        {
            case N_IFREG :
                ptr = "regular";
            break;

            case N_IFDIR :
                ptr = "directory";
            break;

            case N_IFCHR :
                ptr = "character special";
            break;

            case N_IFBLK :
                ptr = "block special";
            break;

            case N_IFIFO :
                ptr = "fifo";
            break;

#ifdef S_IFLNK
            case N_IFLNK :
                ptr = "symbolic link";
            break;
#endif
#ifdef S_IFSOCK
            case N_IFSOCK :
                ptr = "socket";
            break;
#endif
            default :
                ptr = "** unknown mode **";
            break;    
        }//end of switch

        printf("%s\n", ptr);

    }//end of for

    exit(0);
}
/* End of file_mode.c */

'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

File mode checker  (0) 2008.08.12
myShell  (0) 2008.08.12
myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

입력받은 커맨드를 실행하고, 그 실행 시간을 측정한다. 유닉스 쉘의 입력 부분만 흉내낸 것

Get command from user, then calculate the command's execute time.
This is a simple UNIX shell. Just make command input part
 

#include <sys/types.h> //for types for time and etc.
#include <sys/wait.h>  //for wait()
#include <signal.h>  //for signal catching
#include "ourhdr.h"  //System Programming Default Header
#include <sys/times.h> //for times()

//functions
static void sig_int(int);  /* our signal-catching function */
static void report(void);  // print report
static void pr_times(clock_t, struct tms *, struct tms *); //time checker

//global variable : to save data
char cmd[80][80];
double rtime[80];
double utime[80];
double stime[80];

int num_of_cmd = -1; // counter

// MAIN  //////////////////////////////////////

int main(void)
{
    char buf[MAXLINE];
    pid_t pid;
    int status;
    struct tms tmsstart, tmsend; //structure for time check
    clock_t start, end;   //variable for time

    if (signal(SIGINT, sig_int) == SIG_ERR) //signal checker
    { err_sys("signal error"); }

    printf("%% "); /* print prompt (printf requires %% to print %) */

    while (fgets(buf, MAXLINE, stdin) != NULL)  //^D를 제외한 입력의 경우 : ^D이면 루프 끝
    {
        buf[strlen(buf) - 1] = 0; /* replace newline with null */
        num_of_cmd++; // Counter ++

        if ( (pid = fork()) < 0)
        { err_sys("fork error"); }
        else if (pid == 0)
        {
            /* child */
            execlp(buf, buf, (char *) 0);  //입력받은 커맨드 실행 후 else if 블록을 빠져나감
            // 커맨드가 실행되지 않는 경우
            err_ret("couldn't execute: %s", buf);
            exit(127);
        }

        strcpy (cmd[num_of_cmd], buf);  //입력 받은 커맨드를 전역변수 배열에 저장

        if ( (start = times(&tmsstart)) == -1) /* starting values */
        { err_sys("times error"); }

        /* parent */
        if ( (pid = waitpid(pid, &status, 0)) < 0)
        { err_sys("waitpid error"); }

        if ( (end = times(&tmsend)) == -1)  /* ending values */
        { err_sys("times error"); }

        pr_times(end-start, &tmsstart, &tmsend); //시간 계산
        printf("%% "); //프롬프트 출력
    }

    report(); //^D 입력시 루프 종료 후 결과 표시

    exit(0);
}

void sig_int(int signo) //시그널 입력 시 출력
{
 //printf("interrupt\n%% ");
}

static void pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend) // 시간 체크
{
    static long clktck = 0;

    if (clktck == 0) /* fetch clock ticks per second first time */
    {
        if ( (clktck = sysconf(_SC_CLK_TCK)) < 0) //시스템 상수를 받아옴
        { err_sys("sysconf error"); }
    }

    // fprintf(stderr, "  real:\t\t%7.2f\n", real / (double) clktck);
    // fprintf(stderr, "  user:\t\t%7.2f\n", (tmsend->tms_cutime - tmsstart->tms_cutime) / (double) clktck);
    // fprintf(stderr, "  system:\t%7.2f\n", (tmsend->tms_cstime - tmsstart->tms_cstime) / (double) clktck);

    rtime[num_of_cmd] = real / (double) clktck; //시간을 계산하여 배열에 저장
    utime[num_of_cmd] = (tmsend->tms_cutime - tmsstart->tms_cutime) / (double) clktck;
    stime[num_of_cmd] = (tmsend->tms_cstime - tmsstart->tms_cstime) / (double) clktck;
}

void report(void)
{
    int loop;

    for (loop = 0; loop <=num_of_cmd; loop++) //전체 시행 시간을 계산, 배열의 마지막에 추가
    {
        strcpy (cmd[num_of_cmd+1], "Total");
        rtime[num_of_cmd+1] += rtime[loop];
        utime[num_of_cmd+1] += utime[loop];
        stime[num_of_cmd+1] += stime[loop];
    }

    // 출력 시작
    printf ("\n\t\tProcess\tSystem time\tUse time\tReal time\n");

    for (loop = 0; loop <=num_of_cmd; loop++)
    {
        if (rtime[loop]==0 && utime[loop]==0 && stime[loop]==0) //커맨드 오류시 모든 시간이 0로 표시됨을 이용, 에러커맨드는 출력하지 않음
        {   /* Do nothing */    }
        else
        {
            fprintf(stderr, "  %s:\t", cmd[loop]);
            fprintf(stderr, "  \t\t%7.2f",rtime[loop]);
            fprintf(stderr, "  \t%7.2f", utime[loop]);
            fprintf(stderr, "  \t%7.2f\n", stime[loop]);
        }
    }

    // total 값 출력
    printf ("-------------------------------------------------------------------\n");
    fprintf(stderr, "  %s:\t", cmd[num_of_cmd+1]);
    fprintf(stderr, "  \t%7.2f",rtime[num_of_cmd+1]);
    fprintf(stderr, "  \t%7.2f", utime[num_of_cmd+1]);
    fprintf(stderr, "  \t%7.2f\n", stime[num_of_cmd+1]);
}

'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

File mode checker  (0) 2008.08.12
myShell  (0) 2008.08.12
myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

파일의 내용을 보여주거나, 둘 이상의 파일을 내용을 합쳐서 출력해주는 cat(1)을 직접 구현한 것.

cat는 유닉스에 기본으로 포함되어 있는 명령어이다.

 

#include "ourhdr.h"  //기본 헤더파일 //Common header

int main (int argc, char *argv[])
{
    FILE *file[argc-1];  //파일 포인터 배열 : 입력 받은 파일 명의 수 만큼 파일포인터를 선언
    int loop;    //순환문을 위한 변수
    char buffer;   //Read Buffer

    if (argc <2)   //입력받은 파라메터의 수를 확인
    { err_quit ("Error - One or more parameter is needed."); } //에러 메세지

    for (loop = 0; loop <argc -1; loop++) //출력 루프
    {
        if ( (file[loop] = fopen( argv[loop+1], "r" ) ) ==NULL) //파일 Open이이 실패한 경우
        {
            printf ("cat : %s : No such file or directory\n", argv[loop+1]); //에러메세지
        }
        else           //파일 Open이 성공한 경우
        {
            while ( (buffer = fgetc(file[loop]) )> 0)   //한 바이트씩 읽어서 출력
            {
                printf ("%c",buffer);     //STDOUT 출력
            }     

            if ( (fclose (file[loop])) !=0 )     //출력이 끝나면 파일 Close
            {
                err_sys("%d번째 파일", loop);    //Close 실패 시 에러메세지
            }  
        }
    }

    return 0;
}

'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

File mode checker  (0) 2008.08.12
myShell  (0) 2008.08.12
myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

UNIX의 wc(1)의 기능을 구현한 것.

#include "ourhdr.h"  //System Programming Default Header

enum bool {false, true}; //C dosen't support the "boolean" type. So, I defined as enumeration type.


/////////////////////////////////////////
//main function  ////////////
////////////////////////////////////////

int main (int agrc, char *agrv[])
{
    int c = 0;       //get character input
    int lines = 0, words = 0 , bytes = 0; //count lines, words, bytes
    enum bool real_word = false;   //check a byte whether a part of the first word or not

    while ( (c = getchar() )> 0)    //count loop - until EOF (This retuns -1)
    {
        if (c > 33)     //check first character is input or not
            real_word = true;  //character inputed

        if (c=='\n')     //check new-line character
        {
            lines++;     //line count
            words++;     //word count
        }
        else if (c==' ' || c=='\t' || c=='\r' || c=='\v' || c=='\f') //check word seperation conditions
        {
            if (real_word)      //first character inputed
                words++;        //word count
        }

        bytes++;      //byte count
    }

    if (ferror(stdin))     //check stdin error
        err_sys("input error");  //system error massage

    printf ("      %d       %d      %d\n", lines, words, bytes); //print out to stdout

    return 0;
}

'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

myShell  (0) 2008.08.12
myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
ourhdr.h  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

APUE 의 모든 소스 코드들은 우선 error.h 가 컴파일 된 상태에서 링크를 통해 만들어져야 한다. 직접적인 예제를 보여주면


gcc -c error.c       //error.o가 만들어짐

gcc -c myWC.c     //myWC.o가 만들어짐

gcc -o a.out error.o myWC.o     //실행파일을 a.out으로, error.o와 myWC.o를 링크시킨다.


a.out    //실행.

'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
ourhdr.h  (0) 2008.08.10
Advanced Programming in the UNIX Environment  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

Advanced Programming in the UNIX Environment 의 기본적인 error처리 library. 컴파일 해서 Object파일을 만든 후, 실제 실행파일 컴파일 시 링크시켜 줄 것.

 

#include <errno.h>  /* for definition of errno */
#include <stdarg.h>  /* ANSI C header file */
#include "ourhdr.h"

static void err_doit(int, const char *, va_list);

char *pname = NULL;  /* caller can set this from argv[0] */

/* Nonfatal error related to a system call.
 * Print a message and return. */

void
err_ret(const char *fmt, ...)
{
    va_list  ap;

    va_start(ap, fmt);
    err_doit(1, fmt, ap);
    va_end(ap);
    return;
}

/* Fatal error related to a system call.
 * Print a message and terminate. */

void
err_sys(const char *fmt, ...)
{
    va_list  ap;

    va_start(ap, fmt);
    err_doit(1, fmt, ap);
    va_end(ap);
    exit(1);
}

/* Fatal error related to a system call.
 * Print a message, dump core, and terminate. */

void
err_dump(const char *fmt, ...)
{
    va_list  ap;

    va_start(ap, fmt);
    err_doit(1, fmt, ap);
    va_end(ap);
    abort();  /* dump core and terminate */
    exit(1);  /* shouldn't get here */
}

/* Nonfatal error unrelated to a system call.
 * Print a message and return. */

void
err_msg(const char *fmt, ...)
{
    va_list  ap;

    va_start(ap, fmt);
    err_doit(0, fmt, ap);
    va_end(ap);
    return;
}

/* Fatal error unrelated to a system call.
 * Print a message and terminate. */

void
err_quit(const char *fmt, ...)
{
    va_list  ap;

    va_start(ap, fmt);
    err_doit(0, fmt, ap);
    va_end(ap);
    exit(1);
}

/* Print a message and return to caller.
 * Caller specifies "errnoflag". */

static void
err_doit(int errnoflag, const char *fmt, va_list ap)
{
    int  errno_save;
    char buf[MAXLINE];

    errno_save = errno;  /* value caller might want printed */
    vsprintf(buf, fmt, ap);
    if (errnoflag)
        sprintf(buf+strlen(buf), ": %s", strerror(errno_save));
    strcat(buf, "\n");
    fflush(stdout);  /* in case stdout and stderr are the same */
    fputs(buf, stderr);
    fflush(NULL);  /* flushes all stdio output streams */
    return;
}

'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
ourhdr.h  (0) 2008.08.10
Advanced Programming in the UNIX Environment  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

역시, Advanced Programming in the UNIX Environment(이하 APUE)의 기본 헤더파일. 다운 받아도 좋고, 직접 긁어 저장해도 좋다.
 

/* Our own header, to be included *after* all standard system headers */

#ifndef __ourhdr_h
#define __ourhdr_h

#include <sys/types.h> /* required for some of our prototypes */
#include <stdio.h>  /* for convenience */
#include <stdlib.h>  /* for convenience */
#include <string.h>  /* for convenience */
#include <unistd.h>  /* for convenience */

#define MAXLINE 4096   /* max line length */

#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
     /* default file access permissions for new files */
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
     /* default permissions for new directories */

typedef void Sigfunc(int); /* for signal handlers */

     /* 4.3BSD Reno <signal.h> doesn't define SIG_ERR */
#if defined(SIG_IGN) && !defined(SIG_ERR)
#define SIG_ERR ((Sigfunc *)-1)
#endif

#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))

     /* prototypes for our own functions */
char *path_alloc(int *);   /* {Prog pathalloc} */
int   open_max(void);   /* {Prog openmax} */
void  clr_fl(int, int);   /* {Prog setfl} */
void  set_fl(int, int);   /* {Prog setfl} */
void  pr_exit(int);    /* {Prog prexit} */
void  pr_mask(const char *);  /* {Prog prmask} */
Sigfunc *signal_intr(int, Sigfunc *);/* {Prog signal_intr_function} */

int   tty_cbreak(int);   /* {Prog raw} */
int   tty_raw(int);    /* {Prog raw} */
int   tty_reset(int);   /* {Prog raw} */
void  tty_atexit(void);   /* {Prog raw} */
#ifdef ECHO /* only if <termios.h> has been included */
struct termios *tty_termios(void); /* {Prog raw} */
#endif

void  sleep_us(unsigned int); /* {Ex sleepus} */
ssize_t  readn(int, void *, size_t);/* {Prog readn} */
ssize_t  writen(int, const void *, size_t);/* {Prog writen} */
int   daemon_init(void);   /* {Prog daemoninit} */

int   s_pipe(int *);    /* {Progs svr4_spipe bsd_spipe} */
int   recv_fd(int, ssize_t (*func)(int, const void *, size_t));
         /* {Progs recvfd_svr4 recvfd_43bsd} */
int   send_fd(int, int);   /* {Progs sendfd_svr4 sendfd_43bsd} */
int   send_err(int, int, const char *);/* {Prog senderr} */
int   serv_listen(const char *); /* {Progs servlisten_svr4 servlisten_44bsd} */
int   serv_accept(int, uid_t *); /* {Progs servaccept_svr4 servaccept_44bsd} */
int   cli_conn(const char *); /* {Progs cliconn_svr4 cliconn_44bsd} */
int   buf_args(char *, int (*func)(int, char **));
         /* {Prog bufargs} */

int   ptym_open(char *);   /* {Progs ptyopen_svr4 ptyopen_44bsd} */
int   ptys_open(int, char *); /* {Progs ptyopen_svr4 ptyopen_44bsd} */
#ifdef TIOCGWINSZ
pid_t  pty_fork(int *, char *, const struct termios *,
      const struct winsize *); /* {Prog ptyfork} */
#endif

int  lock_reg(int, int, int, off_t, int, off_t);
         /* {Prog lockreg} */
#define read_lock(fd, offset, whence, len) \
   lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
#define readw_lock(fd, offset, whence, len) \
   lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
#define write_lock(fd, offset, whence, len) \
   lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
#define writew_lock(fd, offset, whence, len) \
   lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
#define un_lock(fd, offset, whence, len) \
   lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)

pid_t lock_test(int, int, off_t, int, off_t);
         /* {Prog locktest} */

#define is_readlock(fd, offset, whence, len) \
   lock_test(fd, F_RDLCK, offset, whence, len)
#define is_writelock(fd, offset, whence, len) \
   lock_test(fd, F_WRLCK, offset, whence, len)

void err_dump(const char *, ...); /* {App misc_source} */
void err_msg(const char *, ...);
void err_quit(const char *, ...);
void err_ret(const char *, ...);
void err_sys(const char *, ...);

void log_msg(const char *, ...);  /* {App misc_source} */
void log_open(const char *, int, int);
void log_quit(const char *, ...);
void log_ret(const char *, ...);
void log_sys(const char *, ...);

void TELL_WAIT(void);  /* parent/child from {Sec race_conditions} */
void TELL_PARENT(pid_t);
void TELL_CHILD(pid_t);
void WAIT_PARENT(void);
void WAIT_CHILD(void);

#endif /* __ourhdr_h */


'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
ourhdr.h  (0) 2008.08.10
Advanced Programming in the UNIX Environment  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

http://www.yendor.com/programming/unix/apue/apue.html


Advanced Programming in the


UNIX Environment

by W. Richard Stevens

Addison-Wesley Professional Computing Series
0-201-56317-7 * Hardback * 768 pages * ©1992
Web/HTML/man-page-linking by: Ariel Faigon


위 주소에 가면 이 책의 모든 소스를 구할 수 있다.


정말, 주옥같은 소스코드들이 실려있는 책이다. 아직 본격적으로 본문을 읽지는 않고, 소스코드만 보고 있는데, 그것만으로도 이 책의 진가를 알 수 있다.

'Studies > Advanced Programming in the UNIX Environment' 카테고리의 다른 글

myCAT : cat(1)  (0) 2008.08.12
WC : Word Count  (0) 2008.08.10
실행파일 만들기 : Make a .exe file for APUE  (0) 2008.08.10
error.c  (0) 2008.08.10
ourhdr.h  (0) 2008.08.10
Advanced Programming in the UNIX Environment  (0) 2008.08.10
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

게시판별 용도

2008.08.10 22:08
각 게시판의 용도를 알려드립니다.

Studies : 각 교과서들의 해설과 연습문제 풀이

    A Book on C : C 언어 기본서. Kelley & Pohl. 4th Edition. 영문판

    A Structured Approach Using C++ : C++ 기본서. 2nd Edition. 영문판

    Advanced Programming in the UNIX Environment : Stevens. System Programing 기본서. 영문판  

    Programming Chanllenge 알고리즘 트레이닝 북 : 프로그래밍 연습문제집

Excercise & Quizz : 교과서에 없는 연습문제와 과제 풀이

   
Term Project : 규모가 좀 되는 프로젝트.

ECIM List (Help!) : 방명록을 통해 들어온 블로그 리더들의 질문에 대한 해답을 수록할 예정입니다.

Issues & News : 프로그래밍 관련 Issues와 News를 싣을 예정입니다.

Gossip about Job : 프로그래머 취업 관련 질문들, 준비할 사항들을 싣을 예정입니다.

Tools : 각종 프로그래밍 관련 Tool의 사용법 등을 실을 예정입니다.

'Studies' 카테고리의 다른 글

게시판별 용도  (0) 2008.08.10
[개강공지] Computer Engineering 1st year. Blog just opend and Welcome!  (0) 2008.08.08
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

안녕하세요. 컴공과 1학년 블로그 과대표 로엔그린 입니다.

네이버에 본래 블로그를 운영하고 있었으나, 좀더 전문적인 내용으로 바꾸기 위하여 컴퓨터 관련된 내용을 새로운 블로그로 독립하여 운영합니다. 기존 블로그는 본의 아니게 지나치게 정치색(?)을 띠게 되어버렸습니다.

과대표 소개를 간단하게 드리면, 최초로 베이직으로 프로그램을 짠지 한 16년 정도 되었습니다. 컴공과에 입학하여 C언어를 배운지 10년 정도 되었습니다. 그리고, 지금도 프로그램을 만드는 것을 업으로 하고 있습니다.

어떤 개그맨은 "16년 정도 하면 달인이다" 라고 주장합니다만, 아직 짠 프로그램의 수가 5만 6천개가 안되서인지... 아직 달인이라고 부르기는 부끄러울 정도의 수준입니다.

프로가된 지금 돌아보면 항상, "그 때 배울 때 이런건 왜 안가르쳐 줬을까?" 란 아쉬움이 남습니다. 이 고민을. 후배들에게는 그 고민을 물려주고 싶지 않아서 새로운 스타일의 C/C++ 스터디를 시작해 보려 합니다.

좀더 실용적이고, 실질적이며, 생각할 거리를 던지는 그런 C언어 공부를 시작해 봅시다.

C / C++ 관련 질문이 있으시다면 방명록을 이용해 주세요.

PS. 이 블로그의 Post 들이 유익하셨다면, 올블로그 link의 클릭을 부탁드립니다.

'Studies' 카테고리의 다른 글

게시판별 용도  (0) 2008.08.10
[개강공지] Computer Engineering 1st year. Blog just opend and Welcome!  (0) 2008.08.08
Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절


BLOG main image
일상, 프로그래밍, IT 그리고 직장생활, Dive, 여행 by 지그프리드

카테고리

Class List (402)
Studies (30)
Exercise & Quizz (10)
Term Project (0)
ECIM list (Help!) (10)
Issues & News (0)
Gossip about IT & Job (22)
Tools (2)
Think about the Justice (23)
Book Review (170)
조엘 온 소프트웨어(번역) (28)
Diary (87)
Vacations (9)
Clash of clans 클래시 오브.. (11)

글 보관함

달력

«   2019/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total : 315,135
Today : 24 Yesterday : 27