Код с++. Есть две функции, я вызываю сначала одну, потом вбиваю в консоль ее результаты как аргумент для второй функции, все работает. Но когда вызываю вторую от первой, прога ломается. Я пробовал скопировать вектор из первой функции и его передать в вторую, и так не работает. Первая функция называется proisveden, вторая rasnost. Передаю в пр. {5, 8, 9, 8, 5} и {-0.56, -1.58, -3.36, -5.6), получаю {5, 8, 9, 8, -70}. Передаю в разн (при новой компиляции), вместе с {5, 8, 9, 8, 5}. А вместе (функция delSOstOst) не работает (выдает -7.10543е-15 и тп)
Код:
#include <iostream>
#include <vector>
using namespace std;
// прога приближенно вычисляет корни многочлена с помощью ряда Штурма и бинарного поиска
// vsp - чаще всего то, что нужно найти
int sign (double a) {
return ((a > 0) - (a < 0));
}
int maximum (int a, int b) {
if (a >= b) {return a;}
return b;
}
int minimum (int a, int b) {
if (a <= b) {return a;}
return b;
}
void coutvec (vector <double> f1) {
for (int i = 0; i < f1.size(); i++){
cout « "f_" << i << " = " << f1 [i] << "; ";
}
}
//вывод вектора (многочлена) в консоль, выводит только вектор <double>
double znMngch(vector <double> f, double x){
double zn = 0;
double stX = 1;
for (int i = 0; i < f.size(); i++){
for (int j = 0; j < i; j++){
stX = stX * x;
}
//посчитали степень перед коэфф
zn = zn + f [f.size() - 1 - i] * stX;
//прибавили к общей сумме значение в члене
stX = 1;
}
return (zn);
}
// вычисляем значение мч в точке х
vector <double> proisvod (vector <double> f) {
vector <double> fvsp;
if (f.size() - 1 > 0){
for (int i = 0; i < f.size() - 1; i++){
fvsp.push_back (f [i] * (f.size() - i - 1));
}
}
else {
fvsp.push_back(0);
}
return fvsp;
}
// берем производную от многочлена
vector <double> rasnost (vector <double> f1, vector <double> f2) {
if (f1.size() != f2.size()){
if (maximum (f1.size(), f2.size()) == f1.size()) {
for (int i = 0; i < f1.size() - f2.size() + 1; i++) {
int t = 0;
f2.insert (f2.begin(), t);
}
}
else if (maximum (f1.size(), f2.size()) == f2.size()) {
for (int i = 0; i < f2.size() - f1.size() + 1; i++) {
int t = 0;
f1.insert (f1.begin(), t);
}
}
}
// костыль для разных размеров
vector <double> vsp;
for (int i = 0; i < maximum(f1.size(), f2.size()); i++) {
vsp.push_back (f1[i] - f2[i]);
}
//собственно нашли разность
for (int i = 0; i < maximum(f1.size(), f2.size()); i++){
if (vsp [0] == 0){
vsp.erase(vsp.begin());
}
else {
break;
}
}
// удалили нули в начале
return (vsp);
}
// вычитаем из первого мч второй
vector <double> proisveden (vector <double> f1, vector <double> f2) {
if (f1.size() < f2.size()) {
vector <double> f1copy (f1.size());
for (int i = 0; i < f1.size(); i++){
f1copy[i] = f1[i];
}
vector <double> f2copy (f2.size());
for (int i = 0; i < f2.size(); i++){
f2copy[i] = f2[i];
}
f1.clear();
f2.clear();
for (int i = 0; i < f2copy.size(); i++){
f1.push_back(f2copy [i]);
}
for (int i = 0; i < f1copy.size(); i++){
f2.push_back(f2copy [i]);
}
}
// костыль. ставим первым наибольший вектор
vector <double> fvsp (f1.size() + f2.size() - 1);
for (int i = f1.size() + f2.size() - 2; i >= 0; i--){ //i - степень
int a = 1;
for (int j = minimum (i, f2.size() - 1); j >= 0; j--){
if (f1.size() + f2.size() - 2 - i + 1 < a) {break;}
fvsp [fvsp.size() - i - 1] = fvsp [fvsp.size() - i - 1] + f1 [f1.size() - (i - j) - 1] * f2 [f2.size() - j - 1];
a++;
// для степени i находим все пары членов дающих ее и суммируем пр коэф с уже найденным значением. а нужно, чтобы не получить лишних прибавок (для самой большой степени есть всего 1 пара)
}
}
return fvsp;
}
// произведение двух многочленов, нужно для остатка
vector <double> delenSOst (vector <double> f1, vector <double> f2) {
vector <double> fvsp (f1.size());
vector <double> f1copy (f1.size());
for (int i = 0; i < f1.size(); i++){
f1copy[i] = f1[i];
}
//скопировали ф1, чтоб потом восстановить
int n = 0;
while (true){
if (f1.size() < f2.size()) {break;}
fvsp[n] = f1[0]/f2[0];
for (int i = 0; i < f1.size(); i++){
f1[i] = f1[i] - f2[i] * fvsp[n];
}
f1.erase(f1.begin());
n++;
}
// нашли fvsp
for (int i = 0; i < f1copy.size(); i++){
f1[i] = f1copy[i];
}
for (int i = f1copy.size(); i > n; i--){
fvsp.pop_back();
}
// привели все в порядочный вид, вернули ф1
for (int i = 0; i < maximum(f1.size(), f2.size()); i++){
if (fvsp [0] == 0){
fvsp.erase(fvsp.begin());
}
else {
break;
}
}
// удалили нули в начале
return (fvsp);
}
// делим многочлены с остатком, первый на второй
vector <double> delSOstOst (vector <double> f1, vector <double> f2) {
return (rasnost (f1, proisveden (f2, delenSOst (f1, f2))));
}
// остаток деления первый на второй
vector <vector <double» rdShtrm (vector <double> f) {
vector <vector <double» rdShtrmvsp;
rdShtrmvsp.push_back (f);
if (f.size() == 1) {return rdShtrmvsp;}
rdShtrmvsp.push_back (proisvod (f));
int n = 1; // n - номер мч в ряде
cout << "dlya mn: ";
coutvec (f);
cout << "stroim rs" << endl;
cout << "rs[" << 0 << "]:";
coutvec (rdShtrmvsp [0]);
cout<< endl;
cout << "rs[" << 1 << "]:";
coutvec (rdShtrmvsp [1]);
cout << endl;
// вывели первые два мч, они вне цикла.
while (true){
vector <double> a {-1};
rdShtrmvsp.push_back (proisveden (delSOstOst (rdShtrmvsp [n-1], rdShtrmvsp [n]), a));
cout << "rs[" << n + 1 << "]:";
coutvec (rdShtrmvsp [n + 1]);
cout << endl;
n++;
}
return rdShtrmvsp;
}
// строим ряд Штурма для многочлена
int znRS (vector <vector <double» rdShtrmvsp, double x) {
int vsp = 0; // в данном случае - вспомогательная переменная.
int zn = 0;
for (int i = 0; i < rdShtrmvsp.size(); i++) {
if (znMngch (rdShtrmvsp [i], x) != 0) {
if (sign (znMngch (rdShtrmvsp [i], x)) != vsp) {zn++;}
vsp = sign (znMngch (rdShtrmvsp [i], x));
}
}
return (zn);
}
// ищем значение ряда Штурма в х - количество смен знака после исключения нулей
vector <double> binPoisk (vector <double> f){
}
int main () {
int dlina1;
cout << " dlina f1: ";
cin >> dlina1;
vector <double> f1;
for (int i = 0; i < dlina1; i++){
cout << " f1_" << i << ": ";
double n;
cin >> n;
f1.push_back(n);
}
cout « endl;
// считали коэфф многочлена с консоли в вектор
// /*
int dlina2;
cout << " dlina f2: ";
cin >> dlina2;
vector <double> f2;
for (int i = 0; i < dlina2; i++){
cout << " f2_" << i < ": ";
double n;
cin >> n;
f2.push_back(n);
}
cout << endl;
// */
// второй многочлен для проверки функций. первый член - наибольшая степень.
// проверка функции соutvec: верно
// coutvec(f1);
// проверка функции delenSOst: верно
// coutvec (delenSOst (f1, f2));
// проверка функции proisvod: верно
// coutvec (proisvod (f1));
// проверка функции proisveden: верно
// coutvec (proisveden (f1, f2));
// проверка функции znMngch: верно
/*
double a;
cout << "v tochke: ";
cin >> a;
cout << "func = " << znMngch (f1, a);
// */
// проверка функции rasnost: верно?
// coutvec (rasnost (f1, f2));
// проверка функции остатка:
// /*
cout << "proisveden:" << endl;
coutvec (proisveden (f2, delenSOst (f1, f2)));
// cout << "rasn:" << endl;
// coutvec (rasnost (f1, f2));
// coutvec (delSOstOst (f1, f2));
// */
// проверка функции rdShtrm
/*
for (int i = 0; i < rdShtrm(f1).size(); i++) {
cout << "vyvod ";
coutvec (rdShtrm(f1)[i]);
cout << endl;
}
// */
// проверка функции sign: верно
// cout « sign (3);
return 0;
}