이번 문제는
학생정보를 관리하는 프로그램을 만드는 문제입니다.
사용할 변수는 U_Name(대학교이름), Year(학년), U_StuID(학생 아이디), Object_Oriented_Programming(객체프로그래밍 학점), Digital_Logic_Circuit(디지털논리회로 학점), Name(학생이름), age(학생나이) 입니다.
글 제목대로 상속 class를 이용해야하고,
3가지 command가 있습니다.
1. INSERT라는 명령어를 받으면 학생정보를 차례대로 입력받는거고, 단 학생 수가 100명이 넘어갈 경우에는 100명이 넘었다고 출력을 해야합니다.
2. FIND라는 명령어를 받으면 입력받은 학생의 이름과 학번을 통해서 해당 학생의 정보를 출력해야합니다.
3. EXIT을 입력 받을 경우에는 프로그램 종료를 합니다.
문제 풀이 방법
1. class 만들기
상속이란것은 처음 접하는 개념이지만, 사회에서의 그 상속을 생각했습니다.
조부모들이 부모들에게 부모들이 자식들에게 상속을 한다고 생각하고,
대학이 과에 과가 학생에게 상속한다고 생각했습니다.
먼저 대학교의 이름, 학년, 학번을 담을 대학class를 만들어줍니다.
(class이름은 한국어로도 설정이 가능합니다 !)
그다음 대학을 상속받을 컴퓨터정보공학부class를 만들었습니다.
구성변수는 객체프로그래밍학점과 디지털논리회로 학점이 있겠네용
마지막으로 컴퓨터정보공학부를 상속받을 학생정보class를 만들면 될 것 같습니다.
구성변수는 학생이름과 학생나이입니다.
2. 명령어 만들기
2-1 INSERT
INSERT로 입력받아야 할 변수의 갯수는 7개이지만, 각자 다른 CLASS이여서 처음에는 당황했습니다.
하지만, 대학⊂컴퓨터정보공학부⊂학생정보 이 순서로 상속이 되었기때문에, CLASS형 변수인 학생정보형 변수를 선언을 해줍니다.
학생정보** info;//학생정보class 변수선언
그리고 문제조건으로 100명정도가 할당을 받아야 하므로
info = new 학생정보* [100];//학생정보 변수 메모리할당
그리고 INSERT를 입력받으면, 학생정보를 입력 받을 수 있게
if (command == "INSERT")
{//INSERT를 받을경우
if (people > 100)
cout << "Limit Number is 100" << endl;
else
{
cout << "학교 :"; cin >> school;
cout << "학번 :"; cin >> id;
cout << "학년 :"; cin >> grade;
cout << "객체지향프로그래밍 학점 :"; cin >> oop_score;
cout << "디지털논리회로 학점 :"; cin >> dlc_score;
cout << "이름 :"; cin >> name;
cout << "나이 :"; cin >> age;
info[people] = new 학생정보(school, id, grade, oop_score, dlc_score, name, age);//학생정보를 입력하면서 동시에 할당
people++;
}
}
학생한명을 입력받을때마다, people++를 해줌으로써, 학생의 수를 알게 됩니다.
2-2 FIND
FIND는 이름과 학번이 일치할경우, 학생정보를 출력하는 command입니다.
학번은 대학class, 이름은 학생정보class에 있으므로, 각 class마다 학번찾기, 이름찾기 함수를 만들어줍니다.
int find_id(char* rec_id)//학번찾기
{
int cmp = -1;
if (strcmp(U_StdID, rec_id) == 0)
cmp = 1;
return cmp;
}
대학class내의 학번찾기 함수입니다.
main함수에서 입력받은 학번과 일치할경우 1을 반환하게 만듭니다.
int find_name(char *rec_name)
{
int cmp = -1;
if (strcmp(rec_name,name) == 0)
cmp = 1;
return cmp;
}
학생정보 class내의 이름찾기 함수입니다.
main함수에서 입력받은 이름과 일치 할 경우 1을 반환하게 만듭니다.
일치할경우에 1을 반환하게 하기때문에, n번째 학생의 학번과 이름이 일치해야만 찾을 수 있게 main함수에서
코드를 짜주면
else if (command == "FIND")
{//FIND를 받을경우
cin >> name >> id;
for (int j = 0; ; j++)
{
index1 = info[j]->find_name(name);//학생이름
index2 = info[j]->find_id(id);//학번 찾기
if (index1 == 1 && index2 == 1)//둘다 찾을경우
{
save1 = j;
info[save1]->print_info();
info[save1]->print_score();
break;
}
else
break;
}
}
이렇게 main함수내의 코드가 완성됩니다.
2-3 EXIT
간단하게 메모리해제를 main함수에서 해주면 됩니다.
else if (command == "EXIT")
{
delete[] info;
break;//EXIT을 받을경우
}
3. 코드완성
#include<iostream>
using namespace std;
class 대학//이름, 학년, 학번
{
private:
char U_Name[20]={ 0 };
int grade = 0;
char U_StdID[20]={ 0 };
public:
대학(char* name, char* id, int rec_grade) //생성자
{
int length = strlen(name) + 1;
int acc = strlen(id) + 1;
strcpy_s(U_Name, length, name);
strcpy_s(U_StdID, acc, id);
grade = rec_grade;
}
int find_id(char* rec_id)//학번찾기
{
int cmp = -1;
if (strcmp(U_StdID, rec_id) == 0)
cmp = 1;
return cmp;
}
void print_info()//학교 학번 학년 출력
{
cout << "\n\n\n" << "학교:" << U_Name << "\n" << "학번:" << U_StdID << "\n" << "학년:" << grade << endl;
}
~대학() {//소멸자
}
};
class 컴퓨터정보공학 : public 대학
{
private:
char Object_Oriented_Programming;
char Digital_Logic_Circuit;
public:
컴퓨터정보공학(char* c_name, char* c_id, int rec_grade, char opp_score, char dlc_score) :대학(c_name, c_id, rec_grade)
{//대학class에서 인수를 받고 성적을 입력받는 class 생성자
Object_Oriented_Programming = opp_score;
Digital_Logic_Circuit = dlc_score;
}
void print_score()
{//성적 출력
cout << "객체지향프로그래밍 학점:" << Object_Oriented_Programming << "\n" << "디지털논리회로 학점:" << Digital_Logic_Circuit << endl;
}
~컴퓨터정보공학() {//소멸자
}
};
class 학생정보 : public 컴퓨터정보공학
{
private:
char name[10];
int age=0;
public://컴퓨터정보공학class에서 정보를 받고 이름과 나이를 입력하는 class 생성자
학생정보(char* u_name, char* u_id, int rec_grade, char opp_score, char dlc_score,char*rec_name,int rec_age) :컴퓨터정보공학(u_name, u_id, rec_grade, opp_score, dlc_score)
{
int length = strlen(rec_name) + 1;
strcpy_s(name, length, rec_name);
}
int find_name(char *rec_name)
{
int cmp = -1;
if (strcmp(rec_name,name) == 0)
cmp = 1;
return cmp;
}
~학생정보() {//소멸자
}
};
int main()
{
char school[20];
char id[20];
int grade = 0;
int index1=0,index2 = 0;
int save1=00;
char oop_score;
char dlc_score;
char name[10];
int age = 0;
bool result = false;
학생정보** info;//학생정보class 변수선언
info = new 학생정보* [100];//학생정보 변수 메모리할당
int people = 0;
string command;
for (int i = 0; result != true; i++)
{
cin >> command;
if (command == "INSERT")
{//INSERT를 받을경우
if (people > 100)
cout << "Limit Number is 100" << endl;
else
{
cout << "학교 :"; cin >> school;
cout << "학번 :"; cin >> id;
cout << "학년 :"; cin >> grade;
cout << "객체지향프로그래밍 학점 :"; cin >> oop_score;
cout << "디지털논리회로 학점 :"; cin >> dlc_score;
cout << "이름 :"; cin >> name;
cout << "나이 :"; cin >> age;
info[people] = new 학생정보(school, id, grade, oop_score, dlc_score, name, age);//학생정보를 입력하면서 동시에 할당
people++;
}
}
else if (command == "FIND")
{//FIND를 받을경우
cin >> name >> id;
for (int j = 0; ; j++)
{
index1 = info[j]->find_name(name);//학생이름
index2 = info[j]->find_id(id);//학번 찾기
if (index1 == 1 && index2 == 1)//둘다 찾을경우
{
save1 = j;
info[save1]->print_info();
info[save1]->print_score();
break;
}
else
break;
}
}
else if (command == "EXIT")
{
delete[] info;
break;//EXIT을 받을경우
}
}
return 0;
}
위에 설명한 코드와 생성자 소멸자와 변수를 추가하면 코드가 완성이 됩니다.
실행결과는
줄바꿈 불편이 있습니다 ㅠ
이번문제를 정리하자면
이번 문제에서 사용한것은 class와 상속 그리고 class를 활용한 이차 포인터입니다. 처음에 대학 class를 생성한 후, 학교이름, 학년, 학번 변수를 만들고 생성자에서 문자열을 복사하게 만들고, find_id에서 해당 학번을 받게 만들었습니다. print_info에서는 main함수에서 이름과 학번이 일치하 면 그 학생의 정보를 출력하게 만들었습니다.
다음으로는 컴퓨터정보공학이라는 class에서는 디지털논리회로, 객체프로그래밍성적을 선언하고, 대학class를 상속받았고, 생성자에는 성적을 인자로 받고 main함수에서 이름과 학번이 일치하면 그 학생의 성적을 출력하게 만들었습니다.
다음으로는 학생정보 class에서는 학생이름, 학생나이 변수를 선언하고, 대학class를 상속받은 컴 퓨터정보공학class를 상속했습니다. 인자로 받은 학생이름을 생성자에서 문자열로 복사하게 만들 었고, find_name으로 학생이름을 받게 만들었습니다.
라고 레포트에 제가 작성했네요 ㅋㅋㅋ
이번 문제를 풀면서 상속이라는 개념을 처음 접했고, 빨리 적응하는게 좀 더 멋진 코드가 되지않을까 싶습니다...!
#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향 프로그래밍 과제 문제입니다.
2-9 연산자 오버로딩 사용 (0) | 2021.08.09 |
---|---|
2-6 계좌관리 class 구현 (0) | 2021.08.05 |
2-5 클래스 선언 후, 문자찾기 (0) | 2021.08.04 |
2-4 9*9행렬을 3*3곱하기로 나눠서 연산 (0) | 2021.07.29 |
2-3 함수포인터 void(*fp)() 사용 (0) | 2021.07.20 |
댓글 영역