
Новичок
Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.4.2005
Где: Челябинск
Репутация: 1 Всего: 3
|
 Трояк поставили Прога работает... Не понравилось то, что работаю со строками Садисты, на первом курсе такое давать.... Если кому интересно, вот код работающей программы в виде проекта: 1) Ввод данных Код | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <conio.h>
/*************/ /*ВВОД ДАННЫХ*/ /*************/ void InputPolinom(double *a, //коэффициенты при х int &a_max){ //максимальный номер элемента массива double A2, //переменная для получения целого значения элемениа массива a[] из строки d1; //переменная для сортировки массива int N2, //максимальная степень полинома MaxN2, //переменная для определения maxстепени полинома L, //переменная для работы со строкой (для сокращения длины строки) j, //индекс массива коэффициентов i2; //переменная для нахождения символа в строке char *ptr, //переменная для работы с текстом *ptr1, //переменная для работы с текстом *ptr2, //переменная для работы с текстом tmp2[200], //строка tmp[201]; //строка (полином) clrscr; printf("введите полином в виде число*x^степень+число*x^степень+...\n"); //scanf("%200s",tmp); //strcpy(tmp, "1*x^2-6*x^1+5*x^0"); //strcpy(tmp, "1*x^2-10*x^1+9*x^0"); strcpy(tmp, "1*x^4-23*x^3+177*x^2-505*x^1+350*x^0"); printf("%s \n",tmp); // вывод того что ввели MaxN2=0; a_max=0; while (strlen(tmp)>0){ //производим анализ строки ptr=strchr(tmp, '*'); //ищем А if (ptr){ // L=abs(int(ptr)-int(tmp)); //сокращаем длину строки strncpy(tmp2,tmp,L); tmp2[L]=0; //printf("A=%s\n",tmp2 ); A2=atoi(tmp2); //преобразуем строку в целое число strcpy(tmp,ptr+1); } ptr=strchr(tmp, '^'); //ищем N if (ptr){ strcpy(tmp2, ptr+1); strcpy(tmp, tmp2); ptr1=strchr(tmp, '+'); //проверяем строку на наличие + ptr2=strchr(tmp, '-'); //проверяем строку на наличие - if (ptr1&&ptr2){ if (ptr1<ptr2) ptr=ptr1; else ptr=ptr2; } else{ if(ptr1) ptr=ptr1; if(ptr2) ptr=ptr2; } if (!ptr) ptr=tmp+strlen(tmp); if (ptr){ L=abs(int(ptr)-int(tmp)); strncpy(tmp2, tmp, L); tmp2[L]=0; strcpy(tmp, ptr); //printf("N=%s\n",tmp2); N2=atoi(tmp2); } } else N2=0; if(N2>MaxN2) MaxN2=N2; a[N2]=A2; } a_max=MaxN2; for(j=0;j<a_max;j++) if(a[j]==0) a[j]=1; i2=ceil(a_max/2); // производим обмен значений for(j=0;j<=i2;j++){ d1=a[j]; a[j]=a[a_max-j]; a[a_max-j]=d1; } //for(j=0;j<=a_max;j++) //printf("%d %3.2f * x^ %d \n",j, a[j],a_max-j); // контрольный вывод на экран значений массива
}
|
2) Деление полинома Код | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <conio.h>
/*****************************/ /*ДЕЛЕНИЕ ПОЛИНОМА С ОСТАТКОМ*/ /*****************************/ // используется формула P(x)=Q(x)*H(x)+R(x) // ищутся коэффициенты полиномов H(x) и R(x) // степень полинома R(x) равна k<m void DividePolynoms( int n, // размер массива p int m, // размер массива q double *p, // P(x) double *q, // Q(x) int &k, // степень полинома R(x) double *h, // H(x) double *r, // R(x) double Epsilon // точность ){ //счетчики int j, i; if(n>=m){ j=n-m; do{ h[j]=p[j+m]/q[m]; i=m; do{ p[i+j]=p[i+j]-h[j]*q[i]; i--; } while (i>=0); j--; } while (j>=0); k=m-1; while (1){ if(k<0) break; if(fabs(p[k])>=Epsilon) break; k--; } } else{ k=n; } if(k>=0){ i=k; while (i>=0){ r[i]=p[i]; i--; } } }
|
3) Вычисление корней Код | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <conio.h>
/****************************/ /*ВЫЧИСЛЕНИЕ КОРНЕЙ ПОЛИНОМА*/ /****************************/ double CalcX(double *a, //коэффициенты int n4, //наибольшая степень double *x, //корни int k, //индекс корня double E){ //погрешность double up_value, //значение числителя дроби down_value, //значение знаменателя дроби //временныепеременные fraction, integer, delta; int i; //индекс коэффициента do{ x[k]=x[k+1]; // суммируем знаменатель down_value=0; for(i=0;i<=n4;i++){ down_value=down_value+a[i]*pow(x[k], n4-i); } up_value=-a[n4+1]; //числитель x[k+1]=up_value/down_value; //вычисляем корень fraction= modf(x[k+1], &integer); //вычисляем погрешность if (fraction>0.5) delta=1-fraction; else delta=fraction; //printf("result %lf ,целая=%lf ,остаток=%lf \n",x[k+1],integer,fraction); } while ((x[k+1]<0)||(delta>E)); //условие прекращения цикла if (x[k+1]>0.5) x[k]=ceil(x[k+1]); else x[k]=floor(x[k+1]); return x[k]; }
|
4) Главная процедура Код | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <conio.h>
/*******************/ /*ГЛАВНАЯ ПРОЦЕДУРА*/ /*******************/ void main(void){ int a_max, //максимальный номер элемента полинома a_max2, //максимальный номер элемента массива, не меняется в процессе j, // k, //индекс корня k2, //индекс корня r_k; //степень остатка R(x) //массивы полинома и временные double a[100], q[100], h[100], r[100], E, //погрешность вычислений x[100], //корни x2[100]; //корни double CalcX(double *a, int, double *x, int, double); void InputPolinom(double *a, int &a_max); void DividePolynoms(int, int, double *p, double *q, int &k, double *h, double *r, double); // полином имеет вид // P(x) = a[0]*x^n+a[1]*x^(n-1)+...+a[n]*x^0 // инициализация массива clrscr(); for(j=0;j<100;j++) a[j]=0; InputPolinom(a, a_max); //ввод данных a_max2=a_max; E=pow(10,-5); // корень находится по формуле // x[k+1] = -a[n]/(a[0]*x[k]^(n-1)+a[1]*x[k]^(n-2)+...+a[n-1]) x[k]=0; //изначально принимаем х=0 x[k+1]=0; k=0; k2=0; x2[k2]=CalcX(a, a_max-1, x, k, E); //вычисление корней k2++; //понижаем степень полинома: q=(x-x1) q[0]=1; q[1]=-x[k]; DividePolynoms(a_max, 1, a, q, r_k, h, r, E); // получаем новый массив А для расчета a_max--; for(j=0;j<=a_max;j++) a[j]=h[j]; do{ x2[k2]=CalcX(a, a_max-1, x, k, E); k2++; // понижаем степень полинома q[0]=1; q[1]=-x[k]; DividePolynoms(a_max, 1, a, q, r_k, h, r, E); a_max--; for(j=0;j<=a_max;j++) a[j]=h[j]; k++; x[k+1]=x[k-1]; } while (k2<=(a_max2-1)); printf("\n"); for(j=0;j<k2;j++){ printf("x[%d]=%lf\n",j+1,x2[j]); } getch(); }
|
|