C 多项式操作
我想添加两个多项式并在多项式结果上设置结果。我对第三个函数有问题。请给出任何指示,我真的需要帮助 PS:动态声明!看来我不太懂指针,所以如果你能给我一些建议,也许能帮助我理解这一章,那将是很有帮助的C 多项式操作,c,codeblocks,C,Codeblocks,我想添加两个多项式并在多项式结果上设置结果。我对第三个函数有问题。请给出任何指示,我真的需要帮助 PS:动态声明!看来我不太懂指针,所以如果你能给我一些建议,也许能帮助我理解这一章,那将是很有帮助的 typedef struct { int degree; float* coeff_tab; } Polynome; Polynome lire_polynome() {
typedef struct {
int degree;
float* coeff_tab;
} Polynome;
Polynome lire_polynome()
{
Polynome p;
int i;
printf("Degree du polynome? ");
scanf("%d", &p.degree);
p.coeff_tab = (float*)malloc((unsigned long)(p.degree+1)*sizeof (float));
for(i=0; i<=p.degree; i++)
{
printf("coeff de degree %i: ", i);
scanf("%f", &p.coeff_tab[i]);
}
//free(p.coeff_tab);
return p;
}
void affiche_polynome(Polynome p)
{
int i;
if(p.degree > 1){
printf("%4.2fX^%i ", p.coeff_tab[p.degree], p.degree);
for(i=p.degree-1; i>1; i--){
printf(" + %4.2fX^%i ", p.coeff_tab[i], i);
}
printf(" + %4.2fX + %4.2f\n", p.coeff_tab[1], p.coeff_tab[0]);
} else {
printf(" + %4.2f\n", p.coeff_tab[0]);
}
}
void sommePoly(Polynome p1 , Polynome p2 , Polynome psom)
{
int degsom,deg1,deg2,i=0,j=0,k=0;
float coeffsum,coeff1,coeff2;
Polynome *P,*S ,*Psom;
P=&p1; S=&p2;
degsom=max(p1.degree,p2.degree);
psom.coeff_tab=(float*)malloc((unsigned long)(degsom+1)*sizeof (float));
Psom=&psom;
if( p1.degree == p2.degree)
{
psom.coeff_tab[k]=p1.coeff_tab[i]+p2.coeff_tab[j];
psom.degree=p1.degree;
Psom ++;
i++;j++;k++;
}
else if(p1.degree > p2.degree) {
psom.degree=p1.degree;
psom.coeff_tab[k]=p1.coeff_tab[i];
i++;k++;
}else {
psom.coeff_tab[k]=p2.coeff_tab[j];
psom.degree=p2.degree;
j++;k++;
}
}
typedef结构{
智力度;
浮动*系数选项卡;
}多项式;
多项式lire_多项式()
{
多项式p;
int i;
printf(“多项式度?”);
scanf(“%d”和“p.degree”);
p、 coeff_tab=(float*)malloc((无符号长)(p.degree+1)*sizeof(float));
对于(i=0;i 1){
printf(“%4.2fX^%i”,p.coeff_选项卡[p.degree],p.degree);
对于(i=p.degree-1;i>1;i--){
printf(“+%4.2fX^%i”,p.coeff_tab[i],i);
}
printf(“++%4.2fX++%4.2f\n”,p.coeff_选项卡[1],p.coeff_选项卡[0]);
}否则{
printf(“+%4.2f\n”,p.coeff_选项卡[0]);
}
}
void sommePoly(多项式p1、多项式p2、多项式psom)
{
int degsom,deg1,deg2,i=0,j=0,k=0;
浮动系数和,系数1,系数2;
多项式*P,*S,*Psom;
P=&p1;S=&p2;
degsom=最大值(p1度,p2度);
psom.coeff_tab=(float*)malloc((无符号长)(degsom+1)*sizeof(float));
Psom=&Psom;
如果(p1度==p2度)
{
psom.coeff_tab[k]=p1.coeff_tab[i]+p2.coeff_tab[j];
psom.degree=p1.degree;
Psom++;
i++;j++;k++;
}
否则如果(p1度>p2度){
psom.degree=p1.degree;
psom.coeff_tab[k]=p1.coeff_tab[i];
i++;k++;
}否则{
psom.coeff_tab[k]=p2.coeff_tab[j];
psom.degree=p2.degree;
j++;k++;
}
}
void sommePoly(多项式p1、多项式p2、多项式psom)
在C语言中,参数是通过复制变量的值来传递的。因此,p1
是您传递的变量的副本。为了修改指针后面的值,需要传递指针。或者返回值,就像您在使用Polynome lire\u Polynome()
时所做的那样
通常我会期望功能:
int lire_polynome(Polynome *p);
int sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom);
使用一些返回值,例如int,可以在出现错误时返回负数或非零数(例如malloc
error)
因此,您的函数可能如下所示:
int sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom)
{
int degsom, deg1, deg2, i = 0, j = 0, k = 0;
float coeffsum, coeff1, coeff2;
degsom = max(p1->degree, p2->degree);
psom->coeff_tab = malloc((degsom + 1) * sizeof(float));
if (psom->coeff_tab == NULL) { return -1; }
if (p1->degree == p2->degree){
psom->coeff_tab[k] = p1->coeff_tab[i] + p2->coeff_tab[j];
psom->degree = p1->degree;
... // and so on replace psom. to psom-> ie. replace dot with ->
}
return 0;
}
然后将其称为向结构传递指针:
Polynome p1;
if (lire_polynome(&p1) != 0) { /* error handling */ }
Polynome p2;
if (lire_polynome(&p2) != 0) { /* error ahdling */ }
Polynome p3;
if (sommePoly(&p1, &p2, &p3) != 0) { /* error handling */ }
scanf
错误if(scanf(“%f”,…)!=1){fprintf(stderr,“scanf中的错误”);退出(1);}
(unsigned long)(p.degree+1)*sizeof(float)
中转换为unsigned long很奇怪,而且很容易出错sizeof(…)
的类型为size\u t,这是大小表示的正确类型,将其强制转换为无符号长
是不必要的,并且在某些大数情况下可能会导致错误。只需malloc((p.degree+1)*sizeof(float))
或calloc(p->degree+1,sizeof(float))代码>
我认为这个版本的sommePoly正是您想要的:
void sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom)
{
int i;
Polynome *big, *sml;
if (p1->degree > p2->degree) {
big = p1;
sml = p2;
}
else {
big = p2;
sml = p1;
}
psom->degree = big->degree;
psom->coeff_tab = calloc(psom->degree + 1, sizeof(float));
for (i = 0; i < sml->degree + 1; i++)
{
psom->coeff_tab[i] = big->coeff_tab[i] + sml->coeff_tab[i];
}
for (; i < big->degree + 1; i++)
{
psom->coeff_tab[i] = big->coeff_tab[i];
}
}
以及输出:
$ cc -g -O0 -Wall poly.c -o poly
$ ./poly
1.00X^5 + 3.00X^4 + -2.00X^2 + 8.00X^1 + 1.00
7.00X^3 + 5.00X^2 + -3.00X^1 + 1.00
1.00X^5 + 3.00X^4 + 7.00X^3 + 3.00X^2 + 5.00X^1 + 2.00
你能创造一个新的世界吗?如何调用这些函数?你能举个例子吗?示例输出?期望期望的输出?是的,前两个函数可以工作,但最后一个函数是完全错误的…示例输入多项式p=lire_Polynome();affiche_多项式(p)<代码>扫描(“%f”和p.coeff_选项卡[i])代码>你能为你的程序提供示例输入吗?你的程序给它什么输出?您希望您的程序打印什么?在主函数中有以下内容:Polynome p=lire_Polynome();/*读取多项式1/affiche_多项式(p);/然后读取poly 2*/多项式s=lire_Polynome();附加多项式;乘法是什么?乘法比求和函数稍微复杂一点。您需要迭代两个多项式的每一项并执行乘法:for()循环中的for()循环。
$ cc -g -O0 -Wall poly.c -o poly
$ ./poly
1.00X^5 + 3.00X^4 + -2.00X^2 + 8.00X^1 + 1.00
7.00X^3 + 5.00X^2 + -3.00X^1 + 1.00
1.00X^5 + 3.00X^4 + 7.00X^3 + 3.00X^2 + 5.00X^1 + 2.00