안녕하세요 땅카입니다~!

다항식의 클래스를 구현해보았습니다.

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

+ Recent posts