Как добавить массив многочленов, используя указатели и структуру?

0

Я новичок в c, моя цель - добавить массив многочленов, и в течение нескольких недель я действительно стараюсь, чтобы этот код работал правильно, к сожалению, есть ошибка из-за того, что я получаю ошибку с помощью сообщение "Unhanded exception" в функции добавления в результате. Я слежу за этим форумом в течение нескольких месяцев, и я хочу поблагодарить вас за все ответы, которые были даны по проблемам, они мне очень помогли.

typedef struct
{
    int* coef;
    int exp;
}polinom;

typedef polinom* sir;

void read(polinom*,char);   //read a polynom
void print(polinom,char*);  //print a polynom
polinom addn(sir, int );


void read(polinom* p)
{
    cout<<"Give the polynom "<<endl;
    cout<<"\tgrad if polynom: ";
    cin>>p->exp;

    cout<<"\tGive coef:\n";
    p->coef=(int*)malloc(sizeof(int)*((p->exp)+1));

    for(int i=0;i<=p->exp;i++)
    {
        cout<<"\t\tcoef ["<<i+1<<"]= ";
        cin>>p->coef[i];
    }
}

void readn(sir r,int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<"Polynom ["<<i+1<<"]:\n";
        read(&r[i]);
    }
}

void print(polinom p)
{
    for(int i=p.exp; i>=0; i--)
    { 
        cout<<p.coef[i]<<'^'<<i<<' ';
    }
    cout<<endl;
}
void printn(sir r, int n)
{
    cout<<"print a polynom\n";
    for(int i=0; i<n; i++)
    {
        print(r[i]);
    }
}

void main()
{
    int n;

    cout<<"Give a number of polynomials: \n";
    cin>>n;

    sir s;

    s=(polinom*)malloc(sizeof(polinom)*n);

    readn(s,n);

    printn(s,n);

    printf("here is the addition \n");
    print(addn(s,n));

    system("pause");
}
polinom addn(sir s, int n)//s array of polynomial and n is the number of them
{
    int grad,i,j,k;
    polinom result,  aux;

    for(i=0; i<10; i++)
    {
        aux.coef=0;
        result.coef=0;
    }//try to initialize 

    for(i=0; i<n; i++)
    {
        if(s[i].exp ==s[i+1].exp)//<---------------------x==y
        {
            for(j=0; j < s[i].exp; j++)
                result.coef[j]=s[i].coef[j] + s[i+1].coef[j];

            grad=s[i].exp;
        }// end of if

        if(s[i].exp > s[i+1].exp)//<---------------------x>y
        {
            for(j=0; j < s[i].exp; j++)
            {
                if(i >= s[i].exp-s[i+1].exp)
                {
                    result.coef[j]=s[i].coef[j] + s[i+1].coef[j];
                    j++;

                }// end of if
                else
                {
                    result.coef[j] = s[i].coef[j];
                }// end of else
            }
            grad=s[i].exp;
        }// end of if

        if(s[i+1].exp < s[i].exp)//<---------------------y<x
        {
            for(j=0; j < s[i].exp; j++)
            {
                if(i >= s[i+1].exp-s[i].exp)
                {
                    result.coef[j]=s[i].coef[j] + s[i+1].coef[j];
                    j++;
                }// end of if
                else
                {
                    result.coef[j]=s[i].coef[j];
                }// end of else
            }
            grad=s[i].exp;
        }// end of if

        if(i == n-1)//<---------------------only additional
        {   
            result.exp=grad;
            for(int k = 0; k < result.exp; k++)
            {
                aux.coef[k]=0;
                result.coef[k] = result.coef[k] + aux.coef[k];
            }

        }

    }
    return result;
}
  • 2
    Держись, ты хочешь C ++ или C? Потому что ваш код выглядит как смесь. cout и cin - это C++ .
  • 0
    Предположение, что эта ошибка - необработанное исключение - обратите внимание на L. Либо так, либо кто-то сделал что-то подлое , и вы получили закулисное исключение , но это очень редко в наши дни.
Теги:

1 ответ

0

У вашего кода много проблем. Я бы предложил прекратить писать код и немного начать читать, а затем начать снова с отладки.


Вы говорите, что хотите C, но этот код может компилироваться только в C++, поскольку cout и cin являются C++ функциями. С другой стороны, вы используете C-подобные вещи, такие как malloc() (которые должны поставляться со free(), а в C++ следует использовать new (который должен появиться с delete).


Вот несколько заметок, для начала.

Ваш main() должен выглядеть следующим образом:

int main() { // main should return an int, not void
  int n;

  cout << "Give a number of polynomials: \n";
  cin >> n;

  sir s;

  s = (polinom*) malloc(sizeof(polinom) * n);

  readn(s, n);

  printn(s, n);

  printf("here is the addition \n");
  print(addn(s, n));

  free(s); // don't forget to free your memory

  // system("pause"); Don't use this
  return 0; // return success code
}

Система ( "пауза"); - Почему это неправильно?


Ваш add() возвращает локальную переменную !!!!! Это выйдет из области действия, которая прекратится, поэтому аргумент print() - это мусор.

polinom addn(sir s, int n)
             {
  int grad, i, j, k;
  polinom result, aux;
  ...
  return result;
}

и внутри main() вас есть print(addn(s,n)); ,

  • 0
    спасибо за ответ. Я использую Microsoft Visual C ++ 2010 Express Edition.
  • 0
    Я использую систему («пауза»), чтобы оставить командную строку открытой, но теперь я буду использовать return 0;
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню