728x90
1๋ฒ
//cow.h
#ifndef COW_H_
#define COW_H_
class Cow
{
private:
char name[20];
char* hobby;
double weight;
public:
Cow();
Cow(const char* nm, const char* ho, double wt);
Cow(const Cow& c);
~Cow();
Cow& operator=(const Cow& c);
void ShowCow() const;
};
#endif
//cow.cpp
#include<iostream>
#include"cow.h"
Cow::Cow()
{
strcpy(name, "no name");
hobby = new char[1];
hobby[0] = '\0';
weight = 0.0;
}
Cow::Cow(const char* nm, const char* ho, double wt)
{
strncpy(name, nm, 19);
name[19] = '\0';
hobby = new char[strlen(ho) + 1];
strcpy(hobby, ho);
weight = wt;
}
Cow::Cow(const Cow& c)
{
strcpy(name, c.name);
delete[] hobby;
hobby = new char[strlen(c.hobby) + 1];
strcpy(hobby, c.hobby);
weight = c.weight;
}
Cow::~Cow()
{
delete[] hobby;
}
Cow& Cow::operator=(const Cow& c)
{
if (this == &c)
return *this;
delete[]hobby;
strcpy(name, c.name);
hobby = new char[strlen(c.hobby) + 1];
strcpy(hobby, c.hobby);
weight = c.weight;
return *this;
}
void Cow::ShowCow() const
{
std::cout << "์ด๋ฆ : " << name << '\n'
<< "์ทจ๋ฏธ : " << hobby << '\n'
<< "๋ชธ๋ฌด๊ฒ : " << weight << '\n';
}
//usecow.cpp
#include"cow.h"
int main()
{
Cow h("hong gil dong", "soccer", 72.4);
Cow n;
h.ShowCow();
n.ShowCow();
n = h;
n.ShowCow();
}
2๋ฒ
// string2.h -- ํ๋ ๊ฐ์ ๋ String ํด๋์ค ์ ์
#ifndef STRING2_H_
#define STRING2_H_
#include <iostream>
using std::ostream;
using std::istream;
class String
{
private:
char* str; // ๋ฌธ์์ด์ ์ง์ํ๋ ํฌ์ธํฐ
int len; // ๋ฌธ์์ด์ ๊ธธ์ด
static int num_strings; // ๊ฐ์ฒด์ ์
static const int CINLIM = 80; // cin ์
๋ ฅ ํ๊ณ
public:
// ์์ฑ์์ ๊ธฐํ ๋ฉ์๋
String(const char* s); // ์์ฑ์
String(); // ๋ํดํธ ์์ฑ์
String(const String&); // ๋ณต์ฌ ์์ฑ์
~String(); // ํ๊ดด์
int length() const { return len; }
void stringlow(); //ํ๋ก๊ทธ๋๋ฐ ์ฐ์ต 2๋ฒ
void stringup(); //ํ๋ก๊ทธ๋๋ฐ ์ฐ์ต 2๋ฒ
int has(char); //ํ๋ก๊ทธ๋๋ฐ ์ฐ์ต 2๋ฒ
// ์ค๋ฒ๋ก๋ฉ ์ฐ์ฐ์ ๋ฉ์๋
String& operator=(const String&);
String& operator=(const char*);
char& operator[](int i);
const char& operator[](int i) const;
// ์ค๋ฒ๋ก๋ฉ ์ฐ์ฐ์ ํ๋ ๋
friend bool operator<(const String& st, const String& st2);
friend bool operator>(const String& st1, const String& st2);
friend bool operator==(const String& st, const String& st2);
friend ostream& operator<<(ostream& os, const String& st);
friend istream& operator>>(istream& is, String& st);
friend String operator+(const String&,const String&); //ํ๋ก๊ทธ๋๋ฐ ์ฐ์ต 2๋ฒ
// static ํจ์
static int HowMany();
};
#endif
// string2.cpp -- String ํด๋์ค ๋ฉ์๋
#include <cstring> // ์ด๋ค C++ ์์คํ
์์๋ string.h
#include "string2.h" // <iostream>์ ํฌํจํ๋ค
#include<cctype>
using std::cin;
using std::cout;
// static ํด๋์ค ๋ฉค๋ฒ๋ฅผ ์ด๊ธฐํํ๋ค
int String::num_strings = 0;
// static ๋ฉ์๋
int String::HowMany()
{
return num_strings;
}
// ํด๋์ค ๋ฉ์๋
String::String(const char* s) // C ์คํ์ผ์ ๋ฌธ์์ด๋ก๋ถํฐ String์ ์์ฑํ๋ค
{
len = std::strlen(s); // ๋ฌธ์์ด์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค
str = new char[len + 1]; // ๊ธฐ์ต ๊ณต๊ฐ์ ๋์
ํ๋ค
std::strcpy(str, s); // ํฌ์ธํฐ๋ฅผ ์ด๊ธฐํํ๋ค
num_strings++; // ๊ฐ์ฒด ์นด์ดํธ ์ค์
}
String::String() // ๋ํดํธ ์์ฑ์
{
len = 4;
str = new char[1];
str[0] = '\0'; // ๋ํดํธ ๋ฌธ์์ด
num_strings++;
}
String::String(const String& st)
{
num_strings++; // static ๋งด๋ฒ ๊ฐฑ์ ์ ์ฒ๋ฆฌํ๋ค
len = st.len; // ๊ฐ์ ํฌ๊ธฐ๋ก ์ค์ ํ๋ค
str = new char[len + 1]; // ๊ธฐ์ต ๊ณต๊ฐ์ ๋์
ํ๋ค
std::strcpy(str, st.str); // ๋ฌธ์์ด์ ์ ์์น์ ๋ณต์ฌํ๋ค
}
String::~String() // ๊ผญ ํ์ํ ํ๊ดด์
{
--num_strings; // ํ์ํ๋ค
delete[] str; // ํ์ํ๋ค
}
// ์ค๋ฒ๋ก๋ ์ฐ์ฐ์ ๋ฉ์๋
// String์ String์ ๋์
ํ๋ค
String& String::operator=(const String& st)
{
if (this == &st)
return *this;
delete[] str;
len = st.len;
str = new char[len + 1];
std::strcpy(str, st.str);
return *this;
}
// C ์คํ์ผ์ ๋ฌธ์์ด์ String์ ๋์
ํ๋ค
String& String::operator=(const char* s)
{
delete[] str;
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
return *this;
}
// const๊ฐ ์๋ String์ ์ฝ๊ธฐ-์ฐ๊ธฐ ๊ฐ๋ณ ๋ฌธ์ ์ ๊ทผ
char& String::operator[](int i)
{
return str[i];
}
// const String์ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ๋ณ ๋ฌธ์ ์ ๊ทผ
const char& String::operator[](int i) const
{
return str[i];
}
// ์ค๋ฒ๋ก๋ ์ฐ์ฐ์ ํ๋ ๋
bool operator<(const String& st1, const String& st2)
{
return (std::strcmp(st1.str, st2.str) < 0);
}
bool operator>(const String& st1, const String& st2)
{
return st1.str > st2.str;
}
bool operator==(const String& st1, const String& st2)
{
return (std::strcmp(st1.str, st2.str) == 0);
}
ostream& operator<<(ostream& os, const String& st)
{
os << st.str;
return os;
}
istream& operator>>(istream& is, String& st)
{
char temp[String::CINLIM];
is.get(temp, String::CINLIM);
if (is)
st = temp;
while (is && is.get() != '\n')
continue;
return is;
}
void String::stringlow() //ํ๋ก๊ทธ๋๋ฐ ์ฐ์ต 2๋ฒ
{
for (int i = 0; i < len; i++)
str[i] = tolower(str[i]);
}
void String::stringup() //ํ๋ก๊ทธ๋๋ฐ ์ฐ์ต 2๋ฒ
{
for (int i = 0; i < len; i++)
str[i] = toupper(str[i]);
}
String operator+(const String& s1, const String& s2)
{
int slen = s1.len + s2.len + 1;
char *temp = new char[slen];
strcpy(temp, s1.str);
strcat(temp, s2.str);
String s(temp);
return s;
}
int String::has(char a)
{
int count = 0;
for (int i = 0; i < len; i++)
if (a == str[i])
count++;
return count;
}
//usestring2.cpp
#include<iostream>
#include"string2.h"
using namespace std;
int main()
{
String s1(" and I am a C++ student.");
String s2 = "์๋ฌธ ์ด๋ฆ์ ์
๋ ฅํ์ญ์์ค: ";
String s3;
cout << s2;
cin >> s3;
s2 = "My name is " + s3;
cout << s2 << ".\n";
s2 = s2 + s1;
s2.stringup();
cout << "๋ค์ ๋ฌธ์์ด์๋\n" << s2 << "\n๋ฌธ์ 'A'๊ฐ "
<< s2.has('A') << "๊ฐ ๋ค์ด์์ต๋๋ค.\n";
s1 = "red";
String rgb[3] = { String(s1),String("green"),String("blue") };
cout << "๋น์ ์ผ์์์ ์ด๋ฆ์ ํ๋๋ง ์
๋ ฅํ์ญ์์ค: ";
String ans;
bool success = false;
while (cin >> ans)
{
ans.stringlow();
for (int i = 0; i < 3; i++)
{
if (ans == rgb[i])
{
cout << "๋ง์์ต๋๋ค!\n";
success = true;
break;
}
}
if (success)
break;
else
cout << "๋ค์ ์
๋ ฅํ์ญ์์ค: ";
}
cout << "ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค.\n";
return 0;
}
3๋ฒ
// stock3.h -- ๊ฐ์ ๋ ํค๋ ํ์ผ
#ifndef STOCK3_H_
#define STOCK3_H_
#include<iostream>
#include <cstring>
class Stock
{
private:
char * company;
int shares;
double share_val;
double total_val;
void set_tot() { total_val = shares * share_val; }
public:
Stock(); // ๋ํดํธ ์์ฑ์
Stock(const char * co, long n = 0, double pr = 0.0);
~Stock(); // ์๋ฌด ์ผ๋ ํ์ง ์๋ ํ๊ดด์
void buy(long num, double price);
void sell(long num, double price);
void update(double price);
friend std::ostream& operator<<(std::ostream& os, const Stock& c);
const Stock& topval(const Stock& s) const;
};
#endif
// stock3.cpp -- ๊ฐ์ ํ
#include "stock3.h"
// ์์ฑ์๋ค
Stock::Stock() // ๋ํดํธ ์์ฑ์
{
strcpy(company, "no name");
shares = 0;
share_val = 0.0;
total_val = 0.0;
}
Stock::Stock(const char* co, long n, double pr)
{
company = new char[strlen(co) + 1];
strcpy(company, co);
if (n < 0)
{
std::cout << "์ฃผ์ ์๋ ์์๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, "
<< company << " shares๋ฅผ 0์ผ๋ก ์ค์ ํฉ๋๋ค.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}
// ํด๋์ค ํ๊ดด์
Stock::~Stock() // ๋ง ์๋ ํด๋์ค ํ๊ดด์
{
delete[] company;
}
// ๋ค๋ฅธ ๋ฉ์๋๋ค
void Stock::buy(long num, double price)
{
if (num < 0)
{
std::cout << "๋งค์
์ฃผ์ ์๋ ์์๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, "
<< "๊ฑฐ๋๊ฐ ์ทจ์๋์์ต๋๋ค.\n";
}
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(long num, double price)
{
using std::cout;
if (num < 0)
{
cout << "๋งค๋ ์ฃผ์ ์๋ ์์๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, "
<< "๊ฑฐ๋๊ฐ ์ทจ์๋์์ต๋๋ค.\n";
}
else if (num > shares)
{
cout << "๋ณด์ ์ฃผ์๋ณด๋ค ๋ง์ ์ฃผ์์ ๋งค๋ํ ์ ์์ผ๋ฏ๋ก, "
<< "๊ฑฐ๋๊ฐ ์ทจ์๋์์ต๋๋ค.\n";
}
else
{
shares -= num;
share_val = price;
set_tot();
}
}
void Stock::update(double price)
{
share_val = price;
set_tot();
}
std::ostream& operator<<(std::ostream& os, const Stock& c)
{
using std::ios_base;
// ํฌ๋งท์ #.###์ ์ธํ
ํ๋ค
ios_base::fmtflags orig =
os.setf(ios_base::fixed, ios_base::floatfield);
std::streamsize prec = os.precision(3);
os << "ํ์ฌ๋ช
: " << c.company
<< " ์ฃผ์ ์: " << c.shares << '\n';
os << " ์ฃผ๊ฐ: $" << c.share_val;
// ํฌ๋งท์ #.##์ ์ธํ
ํ๋ค
os.precision(2);
os << " ์ฃผ์ ์ด ๊ฐ์น: $" << c.total_val << '\n';
// ์๋ณธ ํฌ๋งท์ ์ ์ฅํ๋ค
os.setf(orig, ios_base::floatfield);
os.precision(prec);
return os;
}
const Stock& Stock::topval(const Stock& s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}
// usestok3.cpp -- Stock ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค
// stock3.cpp์ ํจ๊ป ์ปดํ์ผํ๋ค
#include <iostream>
#include "stock3.h"
const int STKS = 4;
int main()
{
// ์ด๊ธฐํ๋ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ ์์ฑํ๋ค
Stock stocks[STKS] = {
Stock("NanoSmart", 12, 20.0),
Stock("Boffo Objects", 200, 2.0),
Stock("Monolithic Obelisks", 130, 3.25),
Stock("Fleep Enterprises", 60, 6.5)
};
std::cout << "๋ณด์ ์ฃผ์ ๋ฆฌ์คํธ:\n";
int st;
for (st = 0; st < STKS; st++)
std::cout << stocks[st];
// ์ฒซ ๋ฒ์งธ ์์์ ํฌ์ธํฐ ์ง์
const Stock* top = &stocks[0];
for (st = 1; st < STKS; st++)
top = &top->topval(stocks[st]);
// ๊ฐ์ฅ ๊ฐ์น ์๋ ์ฃผ์์ ์ต๊ณ ์น
std::cout << "\n์ต๊ณ ๊ฐ์น์ ์ฃผ์:\n";
std::cout << *top;
return 0;
}
4๋ฒ
//stack1.h
#ifndef STACK1_H_
#define STACK1_H_
typedef unsigned long Item;
class Stack
{
private:
enum{MAX=10}; //ํด๋์ค์ฉ ์์
Item* pitems; //์คํ ํญ๋ชฉ๋ค์ ์ ์ฅ
int size; //์คํ์ ๋ค์ด ์๋ ์์์ ์
int top; //์คํ์ ๊ผญ๋๊ธฐ ํญ๋ชฉ์ ๋ํ๋ธ๋ค
public:
Stack(int n = MAX); //n๊ฐ์ ์์๋ฅผ ๊ฐ์ง ์คํ์ ์์ฑ
Stack(const Stack& st);
~Stack();
bool isempty() const;
bool isfull() const;
//push() ๋ ์คํ์ด ๊ฐ๋ ์ฐจ ์์ผ๋ฉด false๋ฅผ ์๋๋ฉด true๋ฅผ ๋ฆฌํด
bool push(const Item& item); // ์คํ์ ํญ๋ชฉ์ ์ถ๊ฐ
//pop()์ ์คํ์ด ๋น์ด์์ผ๋ฉด false๋ฅผ, ์๋๋ฉด true๋ฅผ ๋ฆฌํดํ๋ค
bool pop(Item& item); //๊ผญ๋๊ธฐ ํญ๋ชฉ์ ๊บผ๋ด item์ ๋ฃ๋๋ค
Stack& operator=(const Stack& st);
};
#endif
//stack1.cpp
#include "stack1.h"
Stack::Stack(int n)
{
pitems = new Item[n];
size = n;
top = 0;
}
Stack::Stack(const Stack& st)
{
delete[]pitems;
pitems = new Item[st.size];
for (int i = 0; i < st.size; i++)
pitems[i] = st.pitems[i];
size = st.size;
top = st.top;
}
Stack::~Stack()
{
delete[]pitems;
}
bool Stack::isempty() const
{
return top == 0;
}
bool Stack::isfull() const
{
return top == size;
}
bool Stack::push(const Item& item)
{
if (top < size)
{
pitems[top++] = item;
return true;
}
else
return false;
}
bool Stack::pop(Item& item)
{
if (top > 0)
{
item = pitems[--top];
return true;
}
else
return false;
}
Stack& Stack::operator=(const Stack& st)
{
if (this == &st)
return *this;
delete[]pitems;
pitems = new Item[st.size];
for (int i = 0; i < st.size; i++)
pitems[i] = st.pitems[i];
size = st.size;
top = st.top;
return *this;
}
//usestack1.h
#include<iostream>
#include<cctype>
#include"stack1.h"
int main()
{
using namespace std;
Stack st; // ๋น์ด ์๋ ์คํ์ ์์ฑํ๋ค
Stack st2;
char ch;
unsigned long po;
cout << "์ฃผ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด A, ์ฃผ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด P,\n"
<< "์ข
๋ฃํ๋ ค๋ฉด Q๋ฅผ ์
๋ ฅํ์ญ์์ค.\n";
while (cin >> ch && toupper(ch) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(ch))
{
cout << '\a';
continue;
}
switch (ch)
{
case 'A':
case 'a': cout << "์ถ๊ฐํ ์ฃผ๋ฌธ์์ ๋ฒํธ๋ฅผ ์
๋ ฅํ์ญ์์ค: ";
cin >> po;
if (st.isfull())
cout << "์คํ์ด ๊ฐ๋ ์ฐจ ์์ต๋๋ค.\n";
else
st.push(po);
break;
case 'P':
case 'p': if (st.isempty())
cout << "์คํ์ด ๋น์ด ์์ต๋๋ค.\n";
else {
st.pop(po);
cout << "#" << po << "์ฃผ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ์ต๋๋ค.\n";
}
break;
}
cout << "์ฃผ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด A, ์ฃผ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด P,\n"
<< "์ข
๋ฃํ๋ ค๋ฉด Q๋ฅผ ์
๋ ฅํ์ญ์์ค.\n";
}
st2 = st;
for (int i = 0; i < 10; i++)
{
if (st.isempty())
cout << "์คํ์ด ๋น์ด ์์ต๋๋ค.\n";
else {
st.pop(po);
cout << "#" << po << "์ฃผ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ์ต๋๋ค.\n";
}
}
return 0;
}
5๋ฒ
// bank2.cpp -- Queue ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค
// queue.cpp์ ํจ๊ป ์ปดํ์ผํ๋ค
#include <iostream>
#include <cstdlib> // rand()์ srand()๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด
#include <ctime> // time()์ ์ฌ์ฉํ๊ธฐ ์ํด
#include "queue.h"
const int MIN_PER_HR = 60;
bool newcustomer(double x); // ์ ๊ณ ๊ฐ์ด ๋์ฐฉํ๋๊ฐ?
int main()
{
using std::cin;
using std::cout;
using std::endl;
using std::ios_base;
// ํ์ํ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ์ค๋นํ๋ค
std::srand(std::time(0)); // rand()์ ๋ฌด์์ ์ด๊ธฐํ
cout << "์ฌ๋ก ์ฐ๊ตฌ: ํ์ ์ํ์ ATM\n";
cout << "ํ์ ์ต๋ ๊ธธ์ด๋ฅผ ์
๋ ฅํ์ญ์์ค: ";
int qs;
cin >> qs;
cout << "์๋ฎฌ๋ ์ด์
์๊ฐ ์๋ฅผ ์
๋ ฅํ์ญ์์ค: ";
int hours; // ์๋ฎฌ๋ ์ด์
์๊ฐ ์
cin >> hours;
// ์๋ฎฌ๋ ์ด์
์ 1๋ถ์ 1์ฃผ๊ธฐ๋ฅผ ์คํํ๋ค
long cyclelimit = MIN_PER_HR * hours; // ์๋ฎฌ๋ ์ด์
์ฃผ๊ธฐ ์
double perhour; // ์๊ฐ๋น ํ๊ท ๊ณ ๊ฐ ์
double min_per_cust; // ํ๊ท ๊ณ ๊ฐ ๋์ฐฉ ๊ฐ๊ฒฉ(๋ถ ๋จ์)
Item temp; // ์ ๊ณ ๊ฐ ๋ฐ์ดํฐ
long turnaways; // ํ๊ฐ ๊ฐ๋ ์ฐจ์ ๋ฐ๊ธธ์ ๋๋ฆฐ ๊ณ ๊ฐ ์
long customers; // ํ์ ์ค์ ์ ๊ณ ๊ฐ ์
long served; // ์๋ฎฌ๋ ์ด์
์์ ๊ฑฐ๋๋ฅผ ์ฒ๋ฆฌํ ๊ณ ๊ฐ ์
long sum_line; // ํ์ ๋์ ๊ธธ์ด
int wait_time; // ATM์ด ๋น ๋๊น์ง ๋๊ธฐํ๋ ์๊ฐ
long line_wait; // ๊ณ ๊ฐ๋ค์ด ์ค์ ์์ ๋๊ธฐํ ๋์ ์๊ฐ
double line_wait_aver = 0;
for (perhour = 1; line_wait_aver < 1; perhour++)
{
Queue line(qs); // line ํ์๋ ์ต๋ qs๋ช
๊น์ง ๋๊ธฐํ ์ ์๋ค
turnaways = 0;
customers = 0;
served = 0;
sum_line = 0;
wait_time = 0;
line_wait = 0;
line_wait_aver = 0;
min_per_cust = MIN_PER_HR / perhour;
for (int cycle = 0; cycle < cyclelimit; cycle++)
{
if (newcustomer(min_per_cust)) // ์ ๊ณ ๊ฐ์ด ๋์ฐฉํ๋ค
{
if (line.isfull())
turnaways++;
else
{
customers++;
temp.set(cycle); // cycle์ด ๋์ฐฉ ์๊ฐ์ด ๋๋ค
line.enqueue(temp); // ํ์ ์ ๊ณ ๊ฐ์ ์ถ๊ฐํ๋ค
}
}
if (wait_time <= 0 && !line.isempty())
{
line.dequeue(temp); // ๋ค์ ๊ณ ๊ฐ์ ๋ฐ๋๋ค
wait_time = temp.ptime(); // wait_time์ ์ค์ ํ๋ค
line_wait += cycle - temp.when();
served++;
}
if (wait_time > 0)
wait_time--;
sum_line += line.queuecount();
}
line_wait_aver = (double)line_wait / served;
// ์๋ฎฌ๋ ์ด์
๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค
if (customers > 0)
{
cout << "perhour = " << perhour << '\n';
cout << " ํ์ ์ค์ ์ ๊ณ ๊ฐ ์: " << customers << endl;
cout << " ๊ฑฐ๋๋ฅผ ์ฒ๋ฆฌํ ๊ณ ๊ฐ ์: " << served << endl;
cout << " ๋ฐ๊ธธ์ ๋๋ฆฐ ๊ณ ๊ฐ ์: " << turnaways << endl;
cout << " ํ๊ท ํ์ ๊ธธ์ด: ";
cout.precision(2);
cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout << (double)sum_line / cyclelimit << endl;
cout << " ํ๊ท ๋๊ธฐ ์๊ฐ: "
<< (double)line_wait_aver << "๋ถ\n\n";
}
else
cout << "๊ณ ๊ฐ์ด ํ ๋ช
๋ ์์ต๋๋ค!\n";
}
cout << "์๊ฐ๋น ํ๊ท ๊ณ ๊ฐ ์๊ฐ " << perhour-1 << "์ด์์ด ๋๋ฉด ํ๊ท ๋๊ธฐ์๊ฐ์ด 1๋ถ์ ๋๋๋ค.\n";
return 0;
}
// x๋ ๊ณ ๊ฐ ๊ฐ์ ํ๊ท ์๊ฐ ๊ฐ๊ฒฉ์ด๋ค(๋ถ ๋จ์)
// ์ด ์๊ฐ ๋ด์ ๊ณ ๊ฐ์ด ๋์ฐฉํ๋ฉด ๋ฆฌํด๊ฐ์ true์ด๋ค
bool newcustomer(double x)
{
return (std::rand() * x / RAND_MAX < 1);
}
6๋ฒ
// bank3.cpp -- Queue ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค
// queue.cpp์ ํจ๊ป ์ปดํ์ผํ๋ค
#include <iostream>
#include <cstdlib> // rand()์ srand()๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด
#include <ctime> // time()์ ์ฌ์ฉํ๊ธฐ ์ํด
#include "queue.h"
const int MIN_PER_HR = 60;
Item temp; // ์ ๊ณ ๊ฐ ๋ฐ์ดํฐ
struct information
{
long customers; // ํ์ ์ค์ ์ ๊ณ ๊ฐ ์
long served; // ์๋ฎฌ๋ ์ด์
์์ ๊ฑฐ๋๋ฅผ ์ฒ๋ฆฌํ ๊ณ ๊ฐ ์
long sum_line; // ํ์ ๋์ ๊ธธ์ด
int wait_time; // ATM์ด ๋น ๋๊น์ง ๋๊ธฐํ๋ ์๊ฐ
long line_wait; // ๊ณ ๊ฐ๋ค์ด ์ค์ ์์ ๋๊ธฐํ ๋์ ์๊ฐ
};
bool newcustomer(double x); // ์ ๊ณ ๊ฐ์ด ๋์ฐฉํ๋๊ฐ?
void choose_line(Queue& line, information& info, int cycle, int ne);
int main()
{
using std::cin;
using std::cout;
using std::endl;
using std::ios_base;
// ํ์ํ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ์ค๋นํ๋ค
std::srand(std::time(0)); // rand()์ ๋ฌด์์ ์ด๊ธฐํ
cout << "์ฌ๋ก ์ฐ๊ตฌ: ํ์ ์ํ์ ATM\n";
cout << "ํ์ ์ต๋ ๊ธธ์ด๋ฅผ ์
๋ ฅํ์ญ์์ค: ";
int qs;
cin >> qs;
cout << "์๋ฎฌ๋ ์ด์
์๊ฐ ์๋ฅผ ์
๋ ฅํ์ญ์์ค: ";
int hours; // ์๋ฎฌ๋ ์ด์
์๊ฐ ์
cin >> hours;
// ์๋ฎฌ๋ ์ด์
์ 1๋ถ์ 1์ฃผ๊ธฐ๋ฅผ ์คํํ๋ค
long cyclelimit = MIN_PER_HR * hours; // ์๋ฎฌ๋ ์ด์
์ฃผ๊ธฐ ์
double perhour; // ์๊ฐ๋น ํ๊ท ๊ณ ๊ฐ ์
double line_wait_aver = 0;
double min_per_cust; // ํ๊ท ๊ณ ๊ฐ ๋์ฐฉ ๊ฐ๊ฒฉ(๋ถ ๋จ์)
int newcust;
long turnaways; // ํ๊ฐ ๊ฐ๋ ์ฐจ์ ๋ฐ๊ธธ์ ๋๋ฆฐ ๊ณ ๊ฐ ์
for (perhour = 1; line_wait_aver < 1; perhour++)
{
Queue line(qs); // line ํ์๋ ์ต๋ qs๋ช
๊น์ง ๋๊ธฐํ ์ ์๋ค
Queue line2(qs);
information info = {};
information info2 = {};
min_per_cust = MIN_PER_HR / perhour;
for (int cycle = 0; cycle < cyclelimit; cycle++)
{
if (newcustomer(min_per_cust)) // ์ ๊ณ ๊ฐ์ด ๋์ฐฉํ๋ค
{
if (line.isfull()&&line2.isfull())
turnaways++;
else
{
temp.set(cycle);
if (line.queuecount() < line2.queuecount())
{
choose_line(line, info, cycle, 1);
choose_line(line2, info2, cycle, 0);
}
else
{
choose_line(line, info, cycle, 0);
choose_line(line2, info2, cycle, 1);
}
}
}
else
{
choose_line(line, info, cycle, 0);
choose_line(line2, info2, cycle, 0);
}
}
line_wait_aver = (double)((info.line_wait + info2.line_wait)/2)
/ (info.served + info2.served);
// ์๋ฎฌ๋ ์ด์
๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค
if (info.customers+info2.customers > 0)
{
cout << "perhour = " << (int)perhour << '\n';
cout << " ํ์ ์ค์ ์ ๊ณ ๊ฐ ์: " << info.customers + info2.customers << endl;
cout << " ๊ฑฐ๋๋ฅผ ์ฒ๋ฆฌํ ๊ณ ๊ฐ ์: " << info.served + info2.served << endl;
cout << " ๋ฐ๊ธธ์ ๋๋ฆฐ ๊ณ ๊ฐ ์: " << turnaways << endl;
cout << " ํ๊ท ํ์ ๊ธธ์ด: ";
cout.precision(2);
cout.setf(ios_base::fixed, ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout << ((double)info.sum_line / cyclelimit +
(double)info2.sum_line / cyclelimit) / 2 << endl;
cout << " ํ๊ท ๋๊ธฐ ์๊ฐ: "
<< (double)line_wait_aver << "๋ถ\n\n";
}
else
cout << "๊ณ ๊ฐ์ด ํ ๋ช
๋ ์์ต๋๋ค!\n";
}
cout << "์๊ฐ๋น ํ๊ท ๊ณ ๊ฐ ์๊ฐ " << perhour - 1
<< "์ด์์ด ๋๋ฉด ํ๊ท ๋๊ธฐ์๊ฐ์ด 1๋ถ์ ๋๋๋ค.\n";
return 0;
}
// x๋ ๊ณ ๊ฐ ๊ฐ์ ํ๊ท ์๊ฐ ๊ฐ๊ฒฉ์ด๋ค(๋ถ ๋จ์)
// ์ด ์๊ฐ ๋ด์ ๊ณ ๊ฐ์ด ๋์ฐฉํ๋ฉด ๋ฆฌํด๊ฐ์ true์ด๋ค
bool newcustomer(double x)
{
return (std::rand() * x / RAND_MAX < 1);
}
void choose_line(Queue& line, information& info, int cycle, int ne)
{
if (ne == 1) // ์ ๊ณ ๊ฐ์ด ๋์ฐฉํ๋ค
{
{
info.customers++;
line.enqueue(temp); // ํ์ ์ ๊ณ ๊ฐ์ ์ถ๊ฐํ๋ค
}
}
if (info.wait_time <= 0 && !line.isempty())
{
line.dequeue(temp); // ๋ค์ ๊ณ ๊ฐ์ ๋ฐ๋๋ค
info.wait_time = temp.ptime(); // wait_time์ ์ค์ ํ๋ค
info.line_wait += cycle - temp.when();
if (cycle < temp.when())
{
std::cout << cycle << " " << temp.when()<<'\n';
}
info.served++;
}
if (info.wait_time > 0)
info.wait_time--;
info.sum_line += line.queuecount();
}
728x90