diff --git a/SPoly_Harbuz.c b/SPoly_Harbuz.c new file mode 100644 index 0000000..e6b7218 --- /dev/null +++ b/SPoly_Harbuz.c @@ -0,0 +1,489 @@ +#include "SPoly_Harbuz.h" +#include +#include +#include +#include +#include +#include + +#define OUT_OF_MEMORY_EXCEPTION 3 +#define INDEX_OUT_OF_BOUNDS_EXCEPTION 4 + +//typedef struct SPoly { +// double *data; +// unsigned size; +//} SPoly; +//Конструктор класу +SPoly* create(unsigned size) { + SPoly *tmp = NULL; + if (!(tmp = (SPoly*) malloc(sizeof(SPoly)))) { + exit(OUT_OF_MEMORY_EXCEPTION); + } + if (!(tmp->data = (double*) malloc(size * sizeof(double)))) { + exit(OUT_OF_MEMORY_EXCEPTION); + } + tmp->size = size; + return tmp; +} + +//Отримуємо елемент масива. Якщо індекс додатнійб +//то повертаємо елемент поіндексу, якщо від*ємний, то +//повертаємо його по індексу з кінця +double get(SPoly* arr, int index) { + if (index < 0) { + unsigned realIndex = arr->size + index; + if (realIndex < arr->size) { + return arr->data[realIndex]; + } else { + exit(INDEX_OUT_OF_BOUNDS_EXCEPTION); + } + } else { + if (index < arr->size) { + return arr->data[index]; + } else { + exit(INDEX_OUT_OF_BOUNDS_EXCEPTION); + } + } +} +//Встановлює значення в і-ту позицію многочлена +double set(SPoly* arr, int index, double value) { + if (index < 0) { + unsigned realIndex = arr->size + index; + if (realIndex < arr->size) { + return (arr->data[realIndex] = value); + } else { + exit(INDEX_OUT_OF_BOUNDS_EXCEPTION); + } + } else { + if (index < arr->size) { + return (arr->data[index] = value); + } else { + exit(INDEX_OUT_OF_BOUNDS_EXCEPTION); + } + } +} + +//Заповнює масив нулями +void zeros(SPoly* arr) { + unsigned i; + for (i = 0; i < arr->size; i++) { + arr->data[i] = 0; + } +} +//Вводить масив з консолі +void input(SPoly* arr) { + unsigned i; + for (i = 0; i < arr->size; i++) { + printf("Input koeficient near x^%d:",i); + double k; + scanf("%lf",&k); + + arr->data[i] = k; + } +} + +//вводить масив рядком, але не враховує нульових елементів, тому їх слід записувати як 0x^n +void input_str(SPoly* arr){ + char my_string[100]; + printf("Input string:"); + scanf("%s",my_string); + char *istr ; + istr= strtok (my_string,"+"); + unsigned n=0; + while (istr != NULL) + { + char *stopstring; + double Num=0; + Num = strtof (istr,&stopstring); + set(arr,n,Num); + n++; + //printf ("%.2f\n",Num); + + // Вывод очередной выделенной части + // printf ("%s\n",istr); + // Выделение очередной части строки + istr = strtok (NULL,"+"); + } +} + + +//Запис у файл многочлена +void input_file(SPoly* arr,char name[]){ + FILE *file; + file=fopen(name, "r"); + char my_string[100]; + //printf("Input string:"); + fscanf(file,"%s",my_string); + char *istr ; + istr= strtok (my_string,"+"); + unsigned n=0; + while (istr != NULL) + { + char *stopstring; + double Num=0; + Num = strtof (istr,&stopstring); + set(arr,n,Num); + n++; + //printf ("%.2f\n",Num); + + // Вывод очередной выделенной части + // printf ("%s\n",istr); + // Выделение очередной части строки + istr = strtok (NULL,"+"); + } + fclose(file); +} + + + + +//Виведення многочлна в консоль +void print(SPoly* arr){ + unsigned i; + unsigned n=(arr->size); + int k=0; + for (i = 0; i < n; i++) { + if(i==0 && get(arr, i)!=0) { + printf("%.2lf", get(arr, i)); + k++; + } + if(i==1){ + if(get(arr, i)>0 &&k!=0) printf("+%.2lfx", get(arr, i)); + if(get(arr, i)>0 &&k==0){ + printf("%.2lfx", get(arr, i)); + k++; + } + + if(get(arr, i)<0 &&k!=0) printf("%.2lfx", get(arr, i)); + if(get(arr, i)<0 && k==0){ + printf("%.2lfx", get(arr, i)); + k++; + } + + + } + if(i>1 && i0 && k!=0) printf("+%.2lfx^%u", get(arr, i),i); + if(get(arr, i)>0 && k==0) {printf("%.2lfx^%u", get(arr, i),i);k++;} + if(get(arr, i)<0 && k!=0) printf("%.2lfx^%u", get(arr, i),i); + if(get(arr, i)<0 && k==0){ printf("%.2lfx^%u", get(arr, i),i);k++;} + + } + if(i==(n-1) && i>1){ + if(get(arr, i)>0 && k!=0) printf("+%.2lfx^%u", get(arr, i),i); + if(get(arr, i)>0 && k==0) {printf("%.2lfx^%u", get(arr, i),i);k++;} + if(get(arr, i)<0 && k!=0) printf("%.2lfx^%u", get(arr, i),i); + if(get(arr, i)<0 && k==0){ printf("%.2lfx^%u", get(arr, i),i);k++;} + + } + + } + //printf("\n"); +} +//Вивыд многочлена у файл +void print_file(SPoly* arr,char name[]){ + FILE *file; + file=fopen(name, "w"); + unsigned i; + unsigned n=(arr->size); + int k=0; + for (i = 0; i < n; i++) { + if(i==0 && get(arr, i)!=0) { + fprintf(file,"%.2lf", get(arr, i)); + k++; + } + if(i==1){ + if(get(arr, i)>0 &&k!=0) fprintf(file,"+%.2lfx", get(arr, i)); + if(get(arr, i)>0 &&k==0){ + fprintf(file,"%.2lfx", get(arr, i)); + k++; + } + + if(get(arr, i)<0 &&k!=0) fprintf(file,"%.2lfx", get(arr, i)); + if(get(arr, i)<0 && k==0){ + fprintf(file,"%.2lfx", get(arr, i)); + k++; + } + + + } + if(i>1 && i0 && k!=0) fprintf(file,"+%.2lfx^%u", get(arr, i),i); + if(get(arr, i)>0 && k==0) {fprintf(file,"%.2lfx^%u", get(arr, i),i);k++;} + if(get(arr, i)<0 && k!=0) fprintf(file,"%.2lfx^%u", get(arr, i),i); + if(get(arr, i)<0 && k==0){ fprintf(file,"%.2lfx^%u", get(arr, i),i);k++;} + + } + if(i==(n-1) && i>1){ + if(get(arr, i)>0 && k!=0) fprintf(file,"+%.2lfx^%u", get(arr, i),i); + if(get(arr, i)>0 && k==0) {fprintf(file,"%.2lfx^%u", get(arr, i),i);k++;} + if(get(arr, i)<0 && k!=0) fprintf(file,"%.2lfx^%u", get(arr, i),i); + if(get(arr, i)<0 && k==0){ fprintf(file,"%.2lfx^%u", get(arr, i),i);k++;} + + } + + } + fprintf(file,"\n"); + + fclose(file); + getchar(); +} + +//Видалення елементыв масиву +void clearArr(SPoly* arr) { + free(arr->data); + arr->data = NULL; +} + +void freeArr(SPoly **arr) { + clearArr(*arr); + free(*arr); + arr = NULL; +} +//Змына розмырносты масиву +void resizeArr(SPoly* arr, unsigned newSize) { + if (!(arr->data = (double*) realloc(arr->data, newSize * sizeof(double)))) { + exit(OUT_OF_MEMORY_EXCEPTION); + } + arr->size = newSize; +} +//Функцыя уми двох многочленыв +SPoly* summary(SPoly* arr1,SPoly* arr2){ + unsigned n_1=arr1->size; + unsigned n_2=arr2->size; + unsigned n_max,n_min; + + if(n_1>n_2){ + n_max=n_1; + n_min=n_2; + } + else{ + n_max=n_2; + n_min=n_1; + } + SPoly* arr=create(n_max); + int i; + + for(i=0;i=n_min && i=n_min && isize; + unsigned n_2=arr2->size; + unsigned n_max,n_min; + + if(n_1>n_2){ + n_max=n_1; + n_min=n_2; + } + else{ + n_max=n_2; + n_min=n_1; + } + SPoly* arr=create(n_max); + int i; + + for(i=0;i=n_min && i=n_min && isize; + SPoly* arr2=create(n-1); + for(int i=0;isize; + + for(int i=0;isize; + SPoly* deriv=create(n-1); + deriv=derivative(arr); + double res=value_in_point(deriv,x); + + return res; + +} +//Повертає інтеграл від многочлену +SPoly* integration(SPoly* arr,double c){ + + unsigned n=arr->size; + SPoly* arr2=create(n+1); + set(arr2,0,c); + for(int i=1;i<(n+1);i++){ + + set(arr2,i,get(arr,i-1)/i); + } + + //print(arr2); + return arr2; + +} +//Визначений інтеграл +double integration_value(SPoly* arr,double a,double b){ + unsigned n=arr->size; + SPoly* arr2=create(n+1); + arr2=integration(arr,0); + double res=value_in_point(arr2,b)-value_in_point(arr2,a); + return res; + +} +//Множення многочлена на число +SPoly* multiply_num(SPoly* arr, double a){ + unsigned n=arr->size; + SPoly* arr1=create(n); + for(int i=0;isize; + unsigned m=arr2->size; + unsigned size; + + + if(n==1 && m!=1){ + + size=m; + SPoly* arr=create(size); + arr=multiply_num(arr2,get(arr1,0)); + return arr; + } + if(m==1 && n!=1){ + size=n; + SPoly* arr=create(size); + arr=multiply_num(arr1,get(arr2,0)); + return arr; + } + else { + if(n==1 && m==1){ + size=1; + } + else {size=n*m-1; + } + SPoly* arr=create(size); + for(int k=0;ksize; + SPoly* arr1=create(n); + for(int i=0;isize; + unsigned m=arr2->size; + + + SPoly* ob_3; + SPoly* ob_1; + SPoly* ob_2; + SPoly* ob_4; + + ob_3=create(n); + ob_1=create(n); + ob_2=create(m); + ob_4=create(n-m+1); + zeros(ob_4); + + ob_1=arr1; + ob_2=arr2; + + int k=0; + while(n-k>=m){ + double mnojnik=get(ob_1,n-k-1)/get(ob_2,m-1); + //printf("\nMnojnik%lf\n",mnojnik); + + //printf("\nob_2\n"); + //print(ob_2); + + set(ob_4,n-m-k,mnojnik); + //printf("\nob_4\n"); + //print(ob_4); + ob_3=multiply(ob_4,ob_2); + //printf("\nob_3\n"); + //print(ob_3); + ob_1=subtraction(ob_1,ob_3); + //printf("\nob_1\n"); + //print(ob_1); + + + k++; + } + return ob_4; +} +//Остача від ділення двох многочленів +SPoly* devide_ost(SPoly* arr1,SPoly* arr2){ + return(subtraction(arr1,multiply(arr2,devide(arr1,arr2)))); +} diff --git a/SPoly_Harbuz.h b/SPoly_Harbuz.h new file mode 100644 index 0000000..b2722ab --- /dev/null +++ b/SPoly_Harbuz.h @@ -0,0 +1,29 @@ +#pragma once +typedef struct SPoly { + double *data; + unsigned size; +} SPoly; +SPoly* create(unsigned size); +double get(SPoly* arr, int index); +double set(SPoly* arr, int index, double value); +void zeros(SPoly* arr); +void input(SPoly* arr); +void input_str(SPoly* arr); +void input_file(SPoly* arr,char name[]); +void print(SPoly* arr); +void print_file(SPoly* arr,char name[]); +void clearArr(SPoly* arr); +void freeArr(SPoly **arr); +void resizeArr(SPoly* arr, unsigned newSize); +SPoly* summary(SPoly* arr1,SPoly* arr2); +SPoly* subtraction(SPoly* arr1,SPoly* arr2); +SPoly* derivative(SPoly* arr); +double value_in_point(SPoly* arr,double x); +double derivative_value(SPoly* arr,double x); +SPoly* integration(SPoly* arr,double c); +double integration_value(SPoly* arr,double a,double b); +SPoly* multiply_num(SPoly* arr, double a); +SPoly* multiply(SPoly* arr1,SPoly* arr2); +SPoly* devide_num(SPoly* arr, double a); +SPoly* devide(SPoly* arr1,SPoly*arr2); +SPoly* devide_ost(SPoly* arr1,SPoly* arr2); diff --git a/SPoly_Harbuz_file.txt b/SPoly_Harbuz_file.txt new file mode 100644 index 0000000..2954775 --- /dev/null +++ b/SPoly_Harbuz_file.txt @@ -0,0 +1 @@ +1.00+2.00x+3.00x^2 diff --git a/SPoly_Harbuz_test.c b/SPoly_Harbuz_test.c new file mode 100644 index 0000000..38546f1 --- /dev/null +++ b/SPoly_Harbuz_test.c @@ -0,0 +1,344 @@ +//Задача6 SPoly +//Використовую компілятор GNU GCC Compiler +//Створити клас РОЗРІДЖЕНИЙ БАГАТОЧЛЕН з числовими коефіцієнтами +//(як словник коефіцієнтів поліному – ключ це ступені багаточлену). +//Методи (де можливо - перевантаження) введення/виведення (на екран та в файл), +//обчислення в даній точці, +, -, *, /, остача від ділення поліномів, +//модульне множення/додавання, похідна, інтеграл ( визначений, невизначений). +//Знайти корінь поліному на даному відрізку. +//Введення: +//Передбачити введення як рядок довільної довжини ступінь зобразити ^. +//Зробити також стандартне введення через scanf по значенням коефіцієнтів. +//Intinput(* x); // через scanf по значенням коефіцієнтів – +//результат кількість коректно ввведених коефіцієнтів +//Передбачити введення через консоль як таблицю через пробіли +//intinput(* x, char* str); // через рядок по значенням +//коефіцієнтів – результат кількість коректно ввведених символів +//Виведення: виведення в на екран та в текстовий файл як виведення у рядок. +//Виведення в бінарний файл – як список коефіційнтів, починаючий з 0-го ступеня. +//Передбачити функцію виведення що буде керувати точністю виведення та +//Значення поліному в даній точці: +//Dtype value(SPoly p, Dtype x); +//Похідна +//SPoly derivative(SPoly p) +//SPoly integral (SPoly p, Dtype C); +//Dtype integrate(SPoly p, Dtype a, Dtype b); + + + +#include "SPoly_Harbuz.h" +#include + + +void func1(){ + //summary of 2 polinoms + printf("Input power-1 for the first polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + printf("\nInput power-1 for the second polinom m="); + unsigned m; + scanf("%u",&m); + SPoly *arr2 =create(m); + input(arr2); + printf("\n"); + print(arr2); + + unsigned size; + if(n>=m) size=n; + if(m>n) size=m; + SPoly *arr =create(size); + arr=summary(arr1,arr2); + printf("\n("); + print(arr1); + printf(")+("); + print(arr2); + printf(")="); + print(arr); + printf("\n"); + +} + +void func2(){ + ////substracktion of 2 polinoms + printf("Input power-1 for the first polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + printf("\nInput power-1 for the second polinom m="); + unsigned m; + scanf("%u",&m); + SPoly *arr2 =create(m); + input(arr2); + printf("\n"); + print(arr2); + + unsigned size; + if(n>=m) size=n; + if(m>n) size=m; + SPoly *arr =create(size); + arr=subtraction(arr1,arr2); + printf("\n("); + print(arr1); + printf(")-("); + print(arr2); + printf(")="); + print(arr); + printf("\n"); +} + +void func3(){ + //multiplying of 2 polinoms + printf("Input power-1 for the first polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + printf("\nInput power-1 for the second polinom m="); + unsigned m; + scanf("%u",&m); + SPoly *arr2 =create(m); + input(arr2); + printf("\n"); + print(arr2); + + unsigned size; + if(n==1&& m==1) size=1; + if(m!=1 || n!=1) size=m*n-1; + SPoly *arr =create(size); + arr=multiply(arr1,arr2); + printf("\n("); + print(arr1); + printf(")*("); + print(arr2); + printf(")="); + print(arr); + printf("\n"); +} +void func4(){ + //deviding of 2 polinoms + printf("Input power-1 for the first polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + printf("\nInput power-1 for the second polinom m="); + unsigned m; + scanf("%u",&m); + SPoly *arr2 =create(m); + input(arr2); + printf("\n"); + print(arr2); + + unsigned size; + if(n==1&& m==1) size=1; + if(m!=1 || n!=1) size=n-m+1; + SPoly *arr =create(size); + arr=devide(arr1,arr2); + + SPoly* ost=create(n); + ost=devide_ost(arr1,arr2); + printf("\n("); + print(arr1); + printf(")/("); + print(arr2); + printf(")=("); + print(arr); + printf(")+(ost"); + print(ost); + printf(")\n"); +} + +void func5(){ + //integral + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + printf("\nInput const for the the integration polinom const="); + double c; + scanf("%lf",&c); + + unsigned size=n+1; + + SPoly *arr =create(size); + arr=integration(arr1,c); + printf("\nintegrate("); + print(arr1); + printf("+%.2lf",c); + + printf("="); + print(arr); + printf("\n"); +} +void func6(){ + //definite integral + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + printf("\nIntegral:"); + print(integration(arr1,0)); + printf("\nInput: a="); + double a; + scanf("%lf",&a); + printf("\nInput: b="); + double b; + scanf("%lf",&b); + + + + double result=integration_value(arr1,a,b); + + printf("\nintegrate from a to b("); + print(arr1); + printf(")="); + + printf("%lf\n",result); + + +} + +void func7(){ + //derivative + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + + unsigned size=n-1; + + SPoly *arr =create(size); + arr=derivative(arr1); + printf("\n("); + print(arr1); + printf(")'="); + print(arr); + printf("\n"); +} +void func8(){ + //derivative in point + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + + unsigned size=n-1; + + SPoly *arr =create(size); + arr=derivative(arr1); + printf("\n("); + print(arr1); + printf(")'="); + print(arr); + printf("\n"); + printf("Input x="); + double x; + scanf("%lf",&x); + + double value=derivative_value(arr1,x); + printf("Derivative in point=%lf\n",value); +} + +void func9(){ + //Value in point + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print(arr1); + + printf("\nInput x="); + double x; + scanf("%lf",&x); + + double value=value_in_point(arr1,x); + printf("Value in point=%lf\n",value); +} + +void func10(){ + printf("VEnter the polinom, if coeficient =0, input 0x^n:\n"); + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input_str(arr1); + print(arr1); + printf("\n"); + +} + +void func11(){ + //enter in file + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input(arr1); + printf("\n"); + print_file(arr1,"SPoly_Skurativska_file.txt"); +} + +void func12(){ + //input from file the last one + printf("Input power-1 of polinom n="); + unsigned n; + scanf("%u",&n); + SPoly *arr1 =create(n); + input_file(arr1,"SPoly_Skurativska_file.txt"); + print(arr1); + printf("\n"); + + +} +int main(){ + printf("Menu:\n1-Sum \n2-Substruction \n3-Multiply\n4-division\n5-integrate\n6-definit integrate\n7-derivative\n8-derivative in point\n9-value in point\n10-input polinom in a row\n11-print polinom in file\n12-input from file\n0-break\n"); +int action; + while(action>0){ + printf("Input number of action:"); + scanf("%d",&action); + if(action==1) func1(); + if(action==2) func2(); + if(action==3) func3(); + if(action==4) func4(); + if(action==5) func5(); + if(action==6) func6(); + if(action==7) func7(); + if(action==8) func8(); + if(action==9) func9(); + if(action==10) func10(); + if(action==11) func11(); + if(action==12) func12(); + } +}