我想添加两个多项式并将结果设置在多项式结果上我的第三个函数有问题,请任何指示我确实需要帮助
PS:动态声明!看来我不太了解指针,所以如果您向我建议可以帮助我理解本章的内容,那将很有帮助!
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++;
}
}
最佳答案
void sommePoly(Polynome p1 , Polynome p2 , Polynome psom)
在C语言中,通过复制变量值来传递参数。所以p1
是您传递的变量的副本。您需要传递指针以修改指针后面的值。或返回值,就像使用Polynome lire_polynome()
一样。
通常我会期望函数:
int lire_polynome(Polynome *p);
int sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom);
使用一些返回值int您可以在出现错误(例如
malloc
错误)的情况下返回负数或非零数。因此,您的功能可能如下所示:
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, "error in scanf"); exit(1); }
记住要检查malloc错误。
Don't cast result of malloc
(unsigned long)(p.degree+1)*sizeof (float)
中无符号long的强制转换很奇怪,而且容易出错。 sizeof(...)
的类型为size_t,这是用于尺寸表示的正确类型,将其强制转换为unsigned long
是不必要的,在某些情况下可能会导致错误。只需malloc((p.degree + 1) * sizeof(float))
或calloc(p->degree + 1, sizeof(float));
很好地阅读linux kernel coding style。
在this thread中可以找到传递指针和修改值的更简单示例。
关于c - 多项式操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53247017/