안녕하세요 땅카입니다~!
다항식의 클래스를 구현해보았습니다.
page.84의 프로그래밍 프로젝트 1번 또한 구현했습니다.
cout부분을 printf로 바꾸셔서 소수점 이하 자리 출력하시면 됩니다~!

#include <iostream>
#define MAX_DEGREE 80
class Polynomial {
int degree; //최고 차수를 입력할 변수
float coef[MAX_DEGREE]; //각 항의 계수를 입력할 배열
public:
Polynomial() { degree = 0; } //최고차수를 0으로 초기화
void read() { //다항식의 내용을 입력받는 멤버함수
std::cout << "다항식의 최고 차수를 입력하시오 : ";
std::cin >> degree;
std::cout << std::endl;
std::cout << "각 항의 계수를 입력하시오 (총 " << degree + 1 << "개): ";
for (int i = 0; i <= degree; i++) {
std::cin >> coef[i];
}
}
void display(const char *str =" Poly = ") { //char이 아닌 const char로 해야한다, 다항식의 내용을 화면에 출력하는 함수
/*sub함수를 만들고나니 수정할 부분이 보인다.
1. 계수가 -일 때 +가 붙지 않을 것
2. 계수가 0일 때는 아예 생략할 것
3. 계수가 1일 때는 계수만 생략할 것
*/
for (int i = 0; i <= degree; i++) {
if (coef[i] == 0) { //계수가 0이면 쓰루, 상수항까지 여기 포함
continue;
}
else if(coef[i] == 1){ //계수가 1이면 앞에 계수를 출력하지 않는다
std::cout << "x^" << degree - i;
}
else {
std::cout << coef[i] << "x^" << degree - i; //계수가 0,1이 아닌 경우
}
if (i != degree) { //상수항 전까지 플러스를 어디에 넣어줘야하는지 찾기
if (coef[i + 1] > 0) { // i보다 하나 뒤의 계수가 0이 아니면 +를 넣어주기
std::cout << " + ";
}
else if (coef[i + 1] == 0) {// 만약 하나 뒤의 계수가 0이면
for (int j = i + 2; j <= degree; j++) {
if (coef[j] > 0) { //그 뒤의 계수가 0이면 +넣어주고 for문 종료
std::cout << " + ";
break;
}
else if(coef[j] < 0){ //계수가 0보다 작으면 붙일 필요가 없으니 바로 종료
break;
}
}
}
}
}
}
void add(Polynomial a, Polynomial b) { //다항식 a와 b를 더하기
if (a.degree > b.degree) { //객체 a의 최고차수보다 객체 b의 최고차수가 작다면,
*this = a; //a의 다항식을 자기 객체에 복사, this 포인터를 쓰는 이유를 이해해보자면 a에서 b를 빼는 걸 구현하는 것보다 자기에서 b를 빼는 게 더 쉬워서 아닐까합니다!
for (int i = 0; i <= b.degree; i++) { //i < b.degree가 아니라 <=인 이유는? 상수항까지 챙기기 위해서
coef[i + degree - b.degree] += b.coef[i]; // 계수[ i + (a의 차수- b의 차수) ] = 다항식b의 i번째 계수, a보다 b의 차수가 크므로 b보다 높은 차항의 계수는 바뀌지 않도록 b의 최고차수부터 계수를 더해주는 것
}
}
else {
*this = b;
for (int i = 0; i <= a.degree; i++) {
coef[i + degree - a.degree] += a.coef[i];
}
}
}
bool isZero() { return degree == 0; } //최고차수가 0이면 true를 반환
void negate() { //모든 계수의 부호를 바꾸는 함수
for (int i = 0; i <= degree; i++) {
for (int i = 0; i <= degree; i++) {
coef[i] = -coef[i];
}
}
}
void sub(Polynomial a, Polynomial b) {
if (a.degree > b.degree) {
*this = a;
for (int i = 0; i <= degree; i++) {
coef[i + degree - b.degree] -= b.coef[i];
}
}
else {
*this = b;
a.negate(); //a의 부호를 모두 뒤집고 더하면 빼기와 같다
for (int i = 0; i <= degree; i++) {
coef[i + degree - a.degree] += a.coef[i];
}
}
}
void mult(Polynomial a, Polynomial b) { //계수만 곱하는 게 아닌 차수도 올라가야한다.
degree = a.degree + b.degree; //곱했을 때 최고 차수
for (int i = 0; i <= degree; i) {
coef[i] = 0; //싹 비워주기
}
if (a.degree < b.degree) { //a의 최고차수보다 b의 최고차수가 크면
Polynomial tmp; //임시 객체 tmp를 선언
tmp = b;
b = a;
a = tmp; //이걸 넣은 이유는 굳이 else를 쓰지 않게 하기 위해서이다.
}
for (int i = 0; i <= a.degree; i++) { //이중반복문으로 최고차수인 0부터 계수가 차례대로 들어갈 수 있게 한다
for (int j = 0; i <= b.degree; i++) {
coef[i + j] += a.coef[i] * b.coef[j];
}
}
}
void trim() {
bool isNotZero = false;
//0이 아닌 것이 나온 적이 있는 가를 묻는 불리언 함수. 일단 얘를 false로 두고 이게 true가 될 때부터 남길 것이다.
for (int i = 0; i < degree; i++) { //상수항이 0일때는 남기려고 i < degree
if (coef[i] == 0 && isNotZero == false) { //계수가 0이고 isNotZero도 false면 쓰루
continue;
}
else if (coef[i] != 0 && isNotZero == false) { //계수가 0이 아니고 isNotZero가 false면 이제 남기도록 true를 할당하게 한다
isNotZero = true;
}
std::cout << coef[i] << "x^" << degree - i<< " + "; //높은 차항부터 출력
}
if (isNotZero == true || coef[degree] != 0) { //상수항을 위해서 따로 뺌
std::cout << coef[degree]; //coef[degree]는 맨 끝에 있는 배열 값을 뜻하는데 이게 바로 상수항!
}
std::cout << std::endl;
}
};
int main() {
Polynomial a, b, c, d, e;
a.read();
b.read();
c.add(a, b);
d.sub(a, b);
e.mult(a, b);
a.trim();
b.trim();
a.display("A = ");
b.display("B = ");
c.display("A+B= ");
}'3-1 > 자료구조' 카테고리의 다른 글
| C++로 쉽게 풀어쓴 자료구조 CHPATER02 (0) | 2023.04.12 |
|---|---|
| C++로 쉽게 풀어쓴 자료구조 CHPATER01 (0) | 2023.04.11 |