아래 소스에 클래스 선언부는 고치지 않고
원의 개수를 입력하고
개수만큼 원의 이름과 반지름을 입력(ex. 마우스 5)
검색하고자 하는 원의 이름을 입력
검색하고자 하는 원의 면적
최소면적을 정수로 입력하면 그 면적보다 큰 원들을 검색하는 프로그램을 만들려고 합니다.
------------------------------------------------
문제는 아래 주석처럼 searchByName함수로 들어가면 Circle을 가리키는 포인터p가 기능을 안하는 것 같습니다.
그래서 생성자 부분으로 함수의 구현 내용을 다 옮겨서 해보면
3명을 입력한다고 하면 2번째 원은 면적이 나오는데 1번째 원은 입력한 원의 이름과 검색한 원의 이름이 같아도 else문으로 빠집니다.
1. 포인터p를 생성자가 아닌 다른 함수에서 사용하려면 (같은 클래스) 어떻게 해야되나요?
2. 첫번째 원은 왜 else문으로 빠지나요?
#include<iostream>
#include<string>
using namespace std;
class Circle{
int radius; //원의반지름
string name; //원의 이름
public:
void setCircle(string name_in, int radius_in); //이름과 반지름 설정
double getArea(){return radius;}
string getName(){return name;}
};
class CircleManager{
Circle *p; //Circle배열에 대한 포인터
int size; //배열의 크기
public:
CircleManager(int size_in); //size크기의 배열을 동적생성. 사용자로부터 입력완료
~CircleManager(){ delete [] p;}
void searchByName(); //사용자로부터 원의 이름을 받아 면적 출력
void searchByArea(); //사용자로부터 면적을 입력받아 면적보다 큰 원의 이름 출력
};
void Circle::setCircle(string name_in, int radius_in)
{
name = name_in;
radius = radius_in;
}
CircleManager::CircleManager(int size_in)
{
size = size_in;
Circle *p = new Circle[size]; //지역변수?
for(int i=0; i<size; i++)
{
cout<<i+1<<"번 원의 이름과 반지름 : ";
string N;
int R;
getline(cin,N,' ');
cin>>R;
cin.ignore(); //버퍼 지움
(p+i)->setCircle(N,R);
}
for(int i=0; i<size; i++) //확인용
{
cout<<(p+i)->getName()<<' '<<(p+i)->getArea()<<endl;
}
}
void CircleManager::searchByName() //함수로 들어오긴 하는데 검색 이름 까진 저장됨 ㅡ p값이 인식이 안되는듯 하다.
{
string NAME;
cout<<"검색 할 원의 이름 : ";
//cin>>NAME;
getline(cin,NAME,'\n');
cout<<NAME<<"0"<<endl; //확인용
for(int i= 0; i<size; i++)
{
cout<<NAME<<"1"<<endl; //확인용
cout<<(p+i)->getName()<<" p"<<endl; //확인용 - 안됨 p인식 안됨
string AB = (p+i)->getName();
if(NAME==AB) //NAME.compare(AB)==0
{
cout<<NAME<<"2"<<endl; //확인용
cout<<(p+i)->getName()<<"면적은 : "<< ((p+i)->getArea() )*((p+i)->getArea())*3.14 <<endl;
}
else
{
cout<<NAME<<"3"<<endl; //확인용
}
}
}
void CircleManager::searchByArea()
{
int r;
cout<<"최소 면적을 정수로 입력 하시오 : ";
cin>>r;
cout<< r<<"보다 큰 원을 검색합니다."<< endl;
for(int i=0; i<size; i++)
{
if( r < ( ((p+i)->getArea() )*((p+i)->getArea())*3.14) )
{
cout<<(p+i)->getName()<<"의 면적은 "<<((p+i)->getArea() )*((p+i)->getArea())*3.14<<endl;
}
}
}
int main()
{
cout<<"원의 개수 입력 : ";
int input_size;
cin>>input_size;
CircleManager A(input_size);
A.searchByName();
A.searchByArea();
}