다항함수

 

다항함수는 항들의 합이며, 항은 계수와 지수에 의해서 정의된다. 계수는 0이 아닌 정수이고

지수는 음이 아닌 정수라고 가정한다.

 

프로그램 실행 예

$ create f // f=0을 정의한다.

$ add f 2 3 // f(x)에 2x3승 을 더한다. 따라서 f(x) = 2x3이 된다.

$ add f -1 1 // f(x) = 2x3 -x

$ calc f 2 // x=2일때 f의 값을 출력한다.

$ print f // 차수에 관한 내림차순으로 정렬하여 출력한다.

$ create g // 다른 다항함수 g를 정의한다.

$ exit //종료

 

처음에는 어떤 자료구조를 만들어 

다항함수를 표현할것인가??

 

항 들이 모여서 다항함수를 만든다!

 

package section1;

public class Term {
	
	public int coef;//계수
	public int exp;//차수
}

계수와 차수를 가지는 항 클래스 생성

 

package section1;

public class Polynomial {
	
	public char name; //다항식의 이름
	public int nTerms; // 항의 개수
	public Term[] terms; //항들의 배열
}

 

다항 클래스 생성

 

package section1;

import java.util.Scanner;

public class code6 {

	static Polynomial polys[] = new Polynomial [100];
	static int n = 0;
	
	public static void main(String[] args) {
		
		Scanner kb = new Scanner(System.in);
		while(true) {
			System.out.print("$ ");
			String command = kb.next();
			if(command.equals("create")) {
				char name = kb.next().charAt(0);
				
				polys[n] = new Polynomial();
				polys[n].terms = new Term[100];
				polys[n].name = name;
				polys[n].nTerms = 0;
				n++;
			}
			else if(command.equals("add")) {
				char name = kb.next().charAt(0);
				int index = find(name);
				if(index==-1) {
					System.out.println("No such Polynomial exist");
				}
				else {
					int c = kb.nextInt();
					int e = kb.nextInt();
					addTerm(polys[index], c,e);
					
				}
				
			}
			else if(command.equals("calc")) {
				char name = kb.next().charAt(0);
				int index = find(name);
				if(index==-1) {
					System.out.println("No such Polynomial exist");
				}
				else {
					int x = kb.nextInt();
					int result = calcPolynomial(polys[index], x);
					System.out.println(result);
				}
				
			}
			else if(command.equals("print")) {
				char name = kb.next().charAt(0);
				int index = find(name);
				if(index==-1) {
					System.out.println("No such Polynomial exist");
				}
				else {
					printPolynomial(polys[index]);
				}

			}
			else if(command.equals("exit")) {
				break;
			}
		}
		
		kb.close();

	}

	private static int calcPolynomial(Polynomial p, int x) {
		int result = 0;
		
		for (int i =0; i<p.nTerms; i++) {
			result += calTerm(p.terms[i], x);
			}
		return result;
	}

	private static int calTerm(Term term, int x) {
		return (int)(term.coef * Math.pow(x, term.exp));
	}

	private static void printPolynomial(Polynomial p) {
		for(int i =0; i<p.nTerms; i++) {
			printTerm(p.terms[i]);
			System.out.print("+");
		}
		System.out.println();
		
	}

	private static void printTerm(Term term) {
		System.out.print(term.coef + "x^" +term.exp);
		
	}

	private static void addTerm(Polynomial p, int c, int e) {
		int index = findTerm(p,e);
		if(index != -1) {
			p.terms[index].coef += c;
		}
		else {
			int i = p.nTerms-1;
			while(i >= 0 && p.terms[i].exp < e) {
				p.terms[i+1] = p.terms[i];
				i--;
			}
			p.terms[i+1] = new Term();
			p.terms[i+1].coef = c;
			p.terms[i+1].exp =e;
			p.nTerms++;
		}
	}

	private static int findTerm(Polynomial p, int e) {
		for(int i=0;i<p.nTerms && p.terms[i].exp >=e ;i++) {
			if(p.terms[i].exp ==e) {
				return i;
			}
		}
		return -1;
	}

	private static int find(char name) {
		for(int i =0;i<n;i++) {
			if(polys[i].name == name) {
				return i;
			}
		}
		return -1;
	}

}

디테일한 완성도가 떨어지는 코드라서 몇 가지 수정해야할 부분을 수정할 예정이다.

'알고리즘 with 자바 > 자료구조' 카테고리의 다른 글

메서드와 생성자 2  (0) 2021.06.24
메서드와 생성자 1  (0) 2021.06.23
클래스, 객체, 참조변수 4  (0) 2021.06.22
클래스, 객체, 참조변수 3  (0) 2021.06.22
클래스, 객체, 참조변수 2  (0) 2021.06.21

+ Recent posts