Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2021, 17:07   #1
Erthaz
Новичок
Джуниор
 
Регистрация: 09.01.2021
Сообщений: 1
По умолчанию Проблема с аргументами функции

Код с++. Есть две функции, я вызываю сначала одну, потом вбиваю в консоль ее результаты как аргумент для второй функции, все работает. Но когда вызываю вторую от первой, прога ломается. Я пробовал скопировать вектор из первой функции и его передать в вторую, и так не работает. Первая функция называется 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; 
}
Erthaz вне форума Ответить с цитированием
Старый 10.01.2021, 09:03   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Erthaz, оформление вопроса ужасное - из потока сознания ничего непонятно, код не компилируется из-за автозамен (откуда они вообще могли взяться, интересно)

мне кажется, ответа можно не ждать в таком виде

ещё могу предложить воспользоваться отладчиком и по шагам проверить, где и что ломается
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Bash | Работа с аргументами Nikita322 Фриланс 2 19.03.2019 10:47
Макросы с аргументами Андрей Иванов Помощь студентам 0 20.05.2015 19:21
Visual C++: конструктор с аргументами studen Помощь студентам 5 15.12.2012 23:35
Задача на С++ с аргументами Sofa Помощь студентам 1 22.12.2011 22:13
Работа с аргументами передоваемыми в функцию tae1980 Microsoft Office Excel 3 19.09.2010 20:20