C언어 함수 정의 좀 도와주세요.. 다항식 덧셈입니다.

aysl의 이미지

#include
#include
#include

#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);
print("\n");
}

대학과제인데.. inputPolyNum이랑 makeRandomPoly, printPoly 함수를 정의해야하는데 어떻게 해야할지 모르겠네요.. 문제 원본은 첨부파일에 있습니다.. 도와주세요ㅠㅠ

File attachments: 
첨부파일 크기
PDF icon 자구기_과제1.pdf75.93 KB
세벌의 이미지

code 태그를 활용하세요. < code > 와 < /code > 사이에 소스코드를 넣으면 됩니다.
첨부 파일 보려면 클릭 한 번 더 해야 되는데, 답글 달러 오신 분들 그냥 갑니다.

aysl의 이미지

뒤늦게 새로 글을 올렸습니다. 한번 봐주실 수 있으신가요? 마음만 급해 제대로 정리를 하지 못했네요ㅠㅠ https://kldp.org/node/157324 이 글입니다..

 의 이미지

주의사항에 과제는 스스로 하도록 하고 라고 적혀있군요. 흠...

"아무리 해봐도 안되네요. 어떻게 하는지 모르겠어요" 밖에 없는 질문은 답하기가 매우 곤란합니다.
질문자가 어느 정도 수준인지, 어디까지 시도해봤는지, 어디서 막혔는지, 어디서부터 설명드려야 하는지 하나도 모르는데, 무슨 답을 드리겠습니까.
답변을 바란다면 질문에도 성의를 보이셔야지요.

aysl의 이미지

죄송합니다ㅜㅜ 마음이 급해 제대로 정리를 하지 못하였네요ㅠㅠ 새로 글 올렸는데 봐주실 수 있으신가요? https://kldp.org/node/157324 이 글입니다..

vagabond20의 이미지

처음 글을 올리신 후 하루가 지났군요.
학교 과제인것 같은데, 나중에 직장에 가서도 이렇게 물어보실거면 (옳은길로 가고 있는지) 많이 생각해 보시길. 물어봐서 누군가가 쉽게 답을 알려줄 수 도 있을겁니다 (어쩌면 제가라도). 하지만 그렇게 알게되는 답은 당신의 지식으로 소화되지 못합니다.

서울에서 전산실들어가서 제일먼저 하는게, 안가르쳐주고 박-박- '굴리는' 겁니다.
못견디면요? 나가야지요.

여의도자바

익명 사용자의 이미지

ㅠㅠ 불쌍한 학생 한번만 구제해주시면 안될까요? 다음부터는 이렇게 물어보는 일 없도록 열심히 공부하도록 하겠습니다ㅠㅠ

 의 이미지

귀하의 사정에 대해 좀 더 알게 됐으니, 좀 더 자세한 답변을 드릴 수 있겠군요.

저는 여기하고 네이버 지식in에서 활동합니다.
과제성 질문글이 심심찮게 올라오기는 합니다만, 귀하의 질문글처럼 거의 통째로 해달라는 식의 질문글은 그렇게 흔치 않습니다.
그리고 설령 올라오더라도 아무도 답변을 달지 않아 방치되곤 합니다.

딱히 답변자들이 담합해서 그렇게 하는 게 아니라, 그럴 만한 이유가 있는 것이지요.

1) 대체로 프로그래밍 과제물이라는 게 그 내용을 처음 배우는 학생에게나 의미가 있는 것이라서, 숙련자들에게는 별로 재미있는 문제가 아닌 경우가 많습니다.

2) 과제를 대신 해 줘 봤자 질문자 단 한 사람에게만 이득이 되기 때문에 별로 보람이 없지요. 많은 수의 답변자들은 공공의 이익에 기여한다는 보람으로 활동하는데요.

3) 비록 수십여 줄의 짧은 코드 스니펫이라도 자신이 짠 것인데, 생판 모르는 타인이 가져가서 자기 이름만 써넣고 과제물로 제출할 게 뻔히 보이는 상황이면 누가 기분이 좋겠습니까.

4) 귀하의 Academic integrity는 좁게 보면 귀하와 귀하의 학교 간의 문제이긴 합니다만, 누군가 부정 행위를 돕는다면 공범이 되는 것이지요.

그럼에도 불구하고 간혹은 과제를 대신 해 주는 답변이 달리기는 합니다. 귀하의 경우에도 조금 더 기다리다 보면 그럴 수도 있겠지요.

하지만 제 생각으로는, 지금 과제를 스스로 마치실 만한 여력이 없으시다면 가능한 빨리 수강취소를 고려해 보시는 게 좋을 듯합니다. 문제의 근원은 귀하께서 충분히 준비가 안 된 상태로 상위 과목을 수강하려 하셨다는 데 있으니까요.

세벌의 이미지

그렇게 심하게 할 것 까지야...
https://kldp.org/node/157324 에 질문이 다시 올라왔네요.
저는 고수님들의 힌트를 지켜보겠습니다.

세벌의 이미지

안 가르쳐 주고 박 박 굴리기... :p

요즘엔 어디가나 인터넷 잘 되어 있어서, 구글에게 사알짝 물어보면 많이 가르쳐 주던데...
질문하는 방법을 잘 모르는 분이 아직도 많네요 :)

bushi의 이미지

[schoi0@SEL-SCHOI0-D2 net]$ sh func.sh 
Number of A: 6
Out of range(1~5). Retry!
Number of A: 5
Number of B: 0
Out of range(1~5). Retry!
Number of B: 4
A      :   3X^4   -9X^3   -6X^2    7X^1   -5X^0  
B      :  -9X^4           -8X^2   -7X^1   -4X^0  
C=(A+B):  -6X^4   -9X^3  -14X^2           -9X^0  
댓글 첨부 파일: 
첨부파일 크기
Plain text icon func.sh_.txt2.47 KB
bushi의 이미지

보여주신 코드를 그대로 옮긴다음 요구하시는 그 함수들을 추가했습니다.

[schoi0@SEL-SCHOI0-D2 net]$ sh func2.sh 
Number of A: 12
Out of range(1~11). Retry!
Number of A: 5
Number of B: 0
Out of range(1~11). Retry!
Number of B: 4
A      :  -3X^8   -4X^7   -9X^4    4X^3   -5X^1  
B      :  -5X^8   -2X^6   -4X^5   -9X^4  
C=(A+B):  -8X^8   -4X^7   -2X^6   -4X^5  -18X^4    4X^3   -5X^1  
댓글 첨부 파일: 
첨부파일 크기
Plain text icon func2.sh_.txt3.87 KB
익명 사용자의 이미지

정말 정말 감사드립니다ㅠㅠ 근데 제가 c언어 밖에 몰라서 그러는데, 이건 어느 언어인가요?ㅠㅠ 이제 겨우 자바랑 리습도 겨우 시작했거든요 ㅠㅠ 정말 무리하고 한심한 요청이지만(한없이 죄송하고 감사합니다ㅠㅠ), c언어로 옮겨주실 수 있으신가요?(에고 아무 댓글도 안 달린만한 글인데 이런 요청까지 하다니, 염치가 없습니다 ㅠㅠ)

bushi의 이미지

리습으로는 예제와 같은 저열한 코드를 만들경우 이해가 더 어려우실 것이고,
자바는 또 어느 분이 내키면 코드 올려 주시겠지만, C 의 포인터 정도는 공부하셔야 번역이 가능하실 겁니다.

그리고,
누구라도 여기서 C 코드 올려봐야 F 받으십니다. 본인 뿐만 아니라 비슷한 코드를 제출한 학생들 모두가.
교수님이나 조교들은 이런 시절이 없을 것 같습니까 ? 어지간히 알려진 사이트들은 주요 감시 대상입니다.

익명 사용자의 이미지

아 그렇겠네요ㅠ.ㅠ 그럼 이게 어느 언어인지만 알려주실 수 있을까요?ㅠㅠ 완전 생소하네요ㅜ 그리고 다시 한번 답변 주신거 정말 깊히 감사드립니다 정말 복 받으실거에요!!

bushi의 이미지

bash 라는 shell 겸 interpreter 를 이용한 script 입니다.
C 의 pointer 처럼 indirect reference 및 dereference 를 하기 위한 코드를 사용했습니다.

번역에 매달리시는 것을 보니 C 는 둘째치고... 문제 자체를 이해하지 못하신 것 같은데, 코드 보다는 문제에 대해 말씀드릴게요.
As, Ae, Bs, Be, Cs, Ce 따위의 변수들은 전역 배열에서 A, B 그리고 C 다항식의 계수 및 지수가 담겨져 있는 영역의 starting index, ending index 를 의미하는 것 같습니다.
그렇다면 makeRandomPoly() 함수는 다음과 같은 꼴로 만들수 있습니다.

__makeRandomPoly(int *S, int *E, int N)
{
      /* 전역 배열의 현재 index 값을 읽어서 이 다항식을 위한 starting index 로 기억한다. */
      *S = avail;
 
      /* make random coef and exp */
      int i = 0;
      for (i = 0; i < N; i++) {
           coef = ....
           exp = ...
 
          /* 전역 배열에 저장한다. 배열의 index 는 attach() 함수 내부에서 증가된다. */
           attach(coef, exp);
       }
 
      /* 전역 배열의 현재 index 값을 읽어서 이 다항식을 위한 ending index 로 기억한다. */
      *E = avail;
}
 
makeRandomPoly(int *As, int *Ae, int *Bs, int *Be, int An, int Bn)
{
      __makeRandomPoly(As, Ae, An);
      __makeRandomPoly(Bs, Be, Bn);
}

지수에 대한 조건(랜덤, 중복불가)은 https://kldp.org/comment/621846#comment-621846 를 읽어보시고 그것을 구현하시고요.
저 댓글에 예시된 코드는 간단하게 qsort() 함수의 콜백으로 제공할 수 있는 함수입니다.
(다른 댓글들은 무시하세요. 읽지 않으시는 걸 권장합니다.
random 에 대해 배우고 난 다음에 스스로 사리분별을 할 수 있게 됐을 때 다시 찾아서 읽어보고 옳다 그르다를 판단하세요)

printPoly() 는 전역 배열에서, 주어진 starting index, ending index 사이의 값들을 printf() 하면 그만이고,
inputPolyNum() 는 scanf() 함수에 대해 검색하거나 공부해보시고요.

aysl의 이미지

int makeRandomPoly(int *As, int *Ae, int *Bs, int *Be, int An, int Bn) {
 
	int i, j;
 
	for (i = 0; i < An; i++)
		terms[i].coef = rand() % 10+1;
		terms[i].expon = rand() % 11;
 
	for (j = 0; i < Bn; j++)
		terms[j].coef = rand() % 10 + 1;
		terms[j].expon = rand() % 11;
 
}
 
//////////////////////////////////////////////////
 
 
makeRandomPolyA(int *As, int *Ae, int An)
{
	/* 전역 배열의 현재 index 값을 읽어서 이 다항식을 위한 starting index 로 기억한다. */
	*As = avail;
 
	/* make random coef and exp */
	int i = 0;
	for (i = 0; i < An; i++) {
		terms[i].coef = rand() % 10 + 1;
		terms[i].expon = rand() % 11;
	}
 
			/* 전역 배열에 저장한다. 배열의 index 는 attach() 함수 내부에서 증가된다. */
			attach(terms[*As].coef, terms[*As].expon);
	}
 
	/* 전역 배열의 현재 index 값을 읽어서 이 다항식을 위한 ending index 로 기억한다. */
	*Ae = avail;
}

a다항식 b다항식을 만드는 함수를 꼭 따로따로 해야하나요?ㅠㅠ 문제를 잘 이해하지도 못하고 마음만 급해서 뒤죽박죽 엉망진창이네요ㅠㅠ 위에 makeRandomPoly는 제가 해본 방식인데, 알려주신대로 makeRandomPolyA로 a다항식 따로 만드는 것도 해보려고 하는데 비주얼스튜디오에서 빨간줄 쫙쫙 그히는데 뭐가 뭔지 모르겠네요ㅠㅠ;; *Ae=avail이 식에 상수값이 있어야 한다고 나오네요.. ㅠㅠ대혼란ㅜㅜ 지금 이 상황이면 문제를 풀지 말고 개념서를 봐야하는데, 과제가 오늘 자정까지 제출을 해야해서ㅠㅠ 막 되는대로 쳐보고 있는데 제대로 될리가 없네요ㅠㅠ

vagabond20의 이미지

위의 어느분이 도와주시려고 발벗고 나섰으나, 제가 볼때는 도움을 받아서 과제를 제대로 할 수 있는 수준에까지 아직 도달하지 못하신것 같습니다. 너무 냉혹하고 모질게 들릴지 모르지만, 설령 이번고비를 지나간다해도 (아직 학기중인데) 다른 프로젝트들이나 과제를 어찌 하시려고 그러는지요? 수강신청을 취소하고 기초 개념서부터 다시 공부하셔야 할것 같습니다.
*
남일 같지 않아서 그렇습니다.
제 아들녀석도 4 학년 마지막 학기에 결국은 휴학을 택했고 1 년넘게 기초를 다시 다지고 전산전공 책들을 다시 학습하고서야 겨우 겨우 이제 졸업준비에 들어갔습니다. 컴퓨터 관련 전공이 그만큼 어렵다고 봅니다.

여의도자바

bushi의 이미지

공통 함수 하나를 만들어 무한개의 다항식을 만들자는 것이지 다항식 별로 따로 만들자는 것이 아닙니다.
이러한 함수의 개념은 C 뿐만 아니라 어느 언어를 배울 때라도 첫날 수업에 교수 받게 되는 내용입니다.

다항식을 만드는 함수에서는 전역 배열에 직접적으로 접근하는 것을 자제하고 문제에 제시된 attach() 를 활용하세요.
상당한 감점 요소입니다.

문제에 제시된 poly_add2() 는 두 다항식의 계수들이 지수의 내림차순 혹은 오름차순으로 정렬되어 있어야 동작합니다.

포기하시면 편합니다. 열심히 수업들은 다른 사람들을 생각해서라도...

_______의 이미지

이렇게해서 과제를 해결하는게 무슨 의미가 있을런지... 학점?...
이번 과제는 그냥 제출하시구 수업을 철회하시던지 아니면 그냥 들으시구 방학때 기초를 다지셔서 나중에 재수강하는게 나으실거같아요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.