C언어 다항식 덧셈 문제 도와주세요!!!ㅠ.ㅠ

aysl의 이미지

대학 자료구조 과제인데 군대를 다녀와 C언어를 거의 완전히 잊어버렸습니다ㅠㅠ;;

뒤늦게 C언어책 보고 있는데 미처 보지못한 구조체를 사용한 다항식 덧셈 과제가 나왔네요ㅠ;;

문제는 아래와 같습니다.

문제) 다음 조건에 맞도록 프로그램을 작성하시오.

- 아래 main 함수가 출력결과(첨부파일 이미지입니다.)처럼 잘 수행될 수 있도록 해야 한다.
- main함수에서 A 다항식의 항의 개수와 B 다항식의 항의 개수를 입력받는다.
- inputPolyNum 함수를 이용하여 항수의 개수를 입력받고 입력받은 값을 반환받도록 한다.
- 매개변수는 다항식의 이름을 전달한다.
- 입력받는 값이 1~11 중 하나이어야 하며 잘못된 값이 입력되면 올바른 값이 입력될 때까지 반복해서 입력받아야 한다.
- makeRandomPoly 함수를 이용하여 랜덤으로 두 다항식을 만든다.
- 다항식에서 지수는 0~10 중 하나가 랜덤으로 결정되도록 한다.
- 다항식에서 계수는 1~10 중 하나가 랜덤으로 결정되도록 한다.
- 랜덤으로 결정된 계수의 경우 다시 랜덤으로 0 또는 1을 구하여 0이면 랜덤으로 결정된 계수를 음수로 바꾸고, 1 이면 그대로 양수를 사용하도록 한다.
- 지수의 경우 랜덤으로 결정된 값들 중 이미 나온 값이 있다면 다시 반복하여 다른 값을 가질 수 있도록 해야 한다.
(동일한 지수를 갖는 항이 여러 개가 아니므로)
- 또한, 지수의 경우 지수를 기준으로 각 항이 내림차순이 되어야 함을 주의한다.
- printPoly함수는 수업시간에 했던 내용을 활용하면 된다(아래에 print_poly를 만들어봤습니다).

미리 정의된 소스코드는 아래와 같습니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define MAX_TERMS 101
 
struct {
	float coef;
	int expon;
} terms[MAX_TERMS];
 
int avail;
 
//두 개의 정수를 비교
char compare(int a, int b)
{
	if (a > b) return '>';
	else if (a == b) return '=';
	else return '<';
}
 
//새로운 항을 다항식에 추가한다.
void attach(float coef, int expon)
{
	if (avail > MAX_TERMS) {
		fprintf(stderr, "항의 개수가 너무 많음\n");
		exit(1);
	}
	terms[avail].coef = coef;
	terms[avail++].expon = expon;
}
 
//C = A + B
void poly_add2(int As, int Ae, int Bs, int Be, int *Cs, int *Ce)
{
	float tempcoef;
	*Cs = avail;
	while (As <= Ae && Bs <= Be)
		switch (compare(terms[As].expon, terms[Bs].expon)) {
		case '>': // A의 차수 > B의 차수
			attach(terms[As].coef, terms[As].expon);
			As++; break;
		case '=':
			tempcoef = terms[As].coef + terms[Bs].coef;
			if (tempcoef)
				attach(tempcoef, terms[Bs].expon);
			As++; Bs++; break;
		case '<':
			attach(terms[Bs].coef, terms[Bs].expon);
			Bs++; break;
 
		}
	// A의 나머지 항들을 이동함
	for (;As <= Ae;As++)
		attach(terms[As].coef, terms[As].expon);
	// B의 나머지 항들을 이동함
	for (;Bs <= Be;Bs++)
		attach(terms[Bs].coef, terms[Bs].expon);
	*Ce = avail - 1;
}
 
 
//메인함수
void main()
{
int An, Bn; int As, Ae, Bs, Be, Cs, Ce;
srand((unsigned int)time(NULL));
An = inputPolyNum('A');
Bn = inputPolyNum('B');
makeRandomPoly(&As, &Ae, &Bs, &Be, An, Bn);
poly_add2(As, Ae, Bs, Be, &Cs, &Ce);
printf("\nA 다항식: ");
printPoly(As, Ae);
printf("\nB 다항식: ");
printPoly(Bs, Be);
printf("\nC= (A+B) 다항식: ");
printPoly(Cs, Ce);
printf("\n");
}
 
///////////////////////////////////////////////////////////////

문제는 위와 같고.

요약하면 사용자로부터 a와 b다항식의 항수를 입력 받고,
그 수만큼 srand를 사용해서 지수와, 계수를 랜덤으로 생성하고,
계수의 경우 0과 1중에 다시 랜덤으로 돌려 0이면 음수로, 1이면 양수로 그대로 사용합니다.
지수는 0~10 중의 수고, 계수는 1~10 중의 수입니다.
또한 지수의 경우 랜덤으로 결정된 값 중 이미 나온 값이 있다면, 다시 반복하여 다른 값을 가질 수 있도록 해야합니다.(동일한 지수를 갖는 항이 여러 항이 아니므로)
또한 지수의 경우 각항이 내림차순으로 되도록 해야합니다.

그래서 구한 A, B 다항식을 출력하고, C = A + B 다항식도 출력하면 완성입니다.

그래서 결국 inputPolyNum 함수와 makeRandomPoly, printPoly함수를 각자 정의해야합니다.

제가 여태까지 작성한 함수는 inputPolyNum과, print_poly 함수인데 아래와 같습니다. 제가 맞게 정의한것이 맞는지 알려주시면 감사하겠습니다...

int inputPolyNum(char a) {
 
	int An, Bn;
 
	printf("A 다항식의 항 수를 입력: ");
	while (1) {
		scanf("%d, &An");
		if (An >= 1 && An <= 11)
			break;
		else
			printf("항의 개수는 1~11개입니다. 다시 입력해주세요.");
	}
	printf("B 다항식의 항 수를 입력: ");
	while (1) {
		scanf("%d, &Bn");
		if (Bn >= 1 && Bn <= 11)
			break;
		else
			printf("항의 개수는 1~11개입니다. 다시 입력해주세요.");
	}
		return An, Bn;
}
 
//////////////////////////////////////////
 
int print_poly(int s, int e)
{
	int i;
	for (i = s;i <= e;i++)
		printf("%3.0fx^%d", terms[i].coef, terms[i].expon);
	printf("\n");
}

결국 제가 막히는 곳은, srand를 이용해서 뽑아낸 난수를 makeRandomPoly 함수에 어떻게 적용을 시켜서 코딩을 해야하나인데, 제가 구조체와 배열을 미처 완독을 하지 못해서, makeRandomPoly 함수를 어떻게 정의를 해야하는지 손도 못대고 있는 실정입니다ㅠㅠ 완전 C알못 수준입니다ㅠㅠ

makeRandomPoly 함수를 정의시켜주시면 정말 감사하겠습니다ㅠㅠ

아, 그리고 "출력결과 이미지"는 첨부파일로 올립니다. 태그 사용법을 몰라서 양해 부탁드립니다ㅠㅠ

File attachments: 
첨부파일 크기
Image icon 출력결과.png211.06 KB
세벌의 이미지

출력결과를 첨부파일 클릭해서 보란 얘기죠?
클릭해 보니 텍스트던데... 그냥 질문 본문에 써 넣어도 되는 걸...
답변하려면 그거 클릭 한번 더 하는 거 귀찮아서 답변하러 왔다가 그냥 갑니다.

aysl 님 질문에 여러분이 답을 달았는데 aysl 님 마음엔 드는 건 없죠?
급한 건 질문하는 사람이 급한 거지, 답변할 사람이 급한 건 아니거든요.

답변이란 글들이 뭐 이래? 나 약올리는 거야? 이런 생각이 드실 수도 있겠습니다.
그러나, 그 어려움을 이겨내면 발전하실 겁니다.

어떤 분은 수강신청을 취소하라는 등의 강력한 의견도 써 주셨던데, 제 생각은 다릅니다.
수강신청을 취소하건 말건 그건 님께서 결정하시면 됩니다.
그 책임도 님께서 지면 되는 겁니다.

 의 이미지

약간의 오해가 있는 듯하군요.

저는 "수강신청을 취소하라"고 하지 않았습니다.
"수강취소를 고려해 보시는 게 좋을 듯하다"고 말씀드렸을 뿐입니다.
말이라는 게 아 다르고 어 다르다고들 하지요. 저는 강요한 적 없고, 책임질 생각도 없습니다.

프로그래밍을 배우는 단계에서 clueless 상태에 빠지는 분들이 드물지 않게 계십니다.
말 그대로 뭘 어떻게 해야 할지 아무런 감도 못 잡으시는 분들인데요.
제 경험상 그런 분들한테 실질적인 도움을 드리려면 거의 옆에 딱 붙어서 가르쳐드려야 합니다.
피드백 사이클이 짧아도 몇 분, 길면 며칠씩 걸리는 QnA 스레드로는 한계가 있을 수밖에요.
과제를 통째로 대신 해주려는 게 아닌 한 달리 어떻게 해 드리기가 무척 어렵습니다.

결국 그 상태에서 빠져나오시려면 상당한 시간과 노력을 들이시는 수밖에 없습니다.
잘 쓰인 개론서를 차분히 읽고 따라하거나, 좋은 선생님을 찾아서 곁에서 배우거나.
대학생이시면 어떻게든 조금 수월하게 시작하실 수 있으시겠지요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.