Ошибка сегментации - C (СИ) (149148)

Узнай цену своей работы

Формулировка задачи:

Написал программу, которая по схеме Горнера преобразует многочлен до квадратного уравнения. По факту программа сама работает, выводит всё что нужно, но после или перед выходом из цикла она вылетает. Вот полный код:
#include <stdio.h>
#include <stdlib.h>
void founddells(double a, double *c,double m) //Поиск и запись всех делителей 0 коэффициента
{
    double i;
    a = fabs(a);
    int k = (int)a;
    int z;
    for(i = 1; i <= a*2 ;i++) {
        z = (int)i;
        if(!(k % z)) {*c = i/m;c++;*c = -i/m; c++;}
    }
}
void clean(double *c, double n) //Очистка массива для последующей записи
{
    int i;
    for(i = 0; i < n; i++) c[i] = 0;
}
double pow(double a, int n) //Возведение в степень
{
    if(n > 0)return a*pow(a, n-1);
    else return 1;
}
int main()
{
    int i;
    printf("Write vishuy stepen'\n");
    int p;
    scanf("%d", &p);
    double *n = (double*)malloc(sizeof(double) * p+4);
    printf("Write koeffs:\n");
    for(i = 0; i <p ; i++) { //Сканируем коеффициенты
        scanf("%lf", &n[i]);
    }
    for(i = 0; i < p; i++) { //Выводим исходное уравнение
        printf("x^%d*%.1f %c", p-i-1,fabs(n[i]), (n[i+1] > 0) ? (i == p-1) ? 0 : '+' :(i == p-1) ? 0 : '-');
    }
    double j = n[p-1]; //Коеффициент при 0 степени
    putchar('\n');
    double *r = (double *) malloc(100*4); //Память под коэффициенты
    double viraj = 0; // Храним здесь значение уравнения
    int m = 0; //Счетчик
    double std = 0; //В схеме горнера
    double count = 0; //Нужный делитель
    for(;p > 3;p--) { //Поехали, пока не дойдем до квадратного уравнения
        clean(r,100);//Полностью чистим массив
        founddells(j,r,n[0]); //Ищем делители коэффициента при 0
        for(i = 0; *r != 0 ; i++,r++) { //Перебираем все делители
            for(m = 0; m < p; m++)
                viraj =viraj + pow(*r, p-m-1) * n[m]; //Считаем значение при таком то делителе
            if(viraj == 0) {count = *r;break;} //Если равно 0 то подходит
            viraj = 0;//Обнуляем для последующих вычислений
        }
        std = n[0]; //Снимаем первый коэффициент при самой старшей степени
        n[p-1] = 0; //Сразу же скидываем остаток на 0 , так как мы просто упращаем уравнение
        for(i = 1; i < p-1; i++) {
            n[i] = count * std + n[i]; //Записываем последующие коэффициенты по правилу : предыдущий * выбраный делитель + нынешний
            std = n[i]; //Записываем нынешний делитель что бы в следующий раз его применить
        }
        for(i = 0; i < p-1; i++) { //Опять выводим уравнение
            printf("x^%d*%.1f %c", p-i-2, fabs(n[i]), (n[i+1] > 0) ? (i == p-2) ? 0 : '+' :(i == p-2) ? 0 : '-');
        }
        putchar('\n');
    }
}

Решение задачи: «Ошибка сегментации»

textual
Листинг программы
printf("%cx^%d*%.1f ", (n[i] > 0) ? (i == 0) ? 0:'+' : '-', p-i-1, n[i]);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5