Ошибка при программировании на языке С++.

balans
Сообщений: 2030
Зарегистрирован: 29 дек 2012, 21:00

Ошибка при программировании на языке С++.

Сообщение balans » 11 мар 2014, 19:52

Здравия Вам желаю, товарищи форумчане.
Пытаюсь освоить язык С++ (использую Dev-C++)... Составил программу для решения системы нелинейных уравнении методом итерации, а она мне уже мозги канифолит, не принимает дробные числа.

Код: Выбрать все

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
 int i;
 double k1, k2,a,sk, sn, z,t;

 cout <<"sn" << endl;
 cin >>sn;

 cout <<" k1" << endl;
 cin >>k1;

 cout <<" k2" << endl;
 cin >>k2;
 a=0;

 do
 {
 z=(1+a)/k1-a;
 sk = z-sqrt(z*z-1);
 t=sn/sk;
 a=0.5*((t+1/t)*k2-2)/(1-k2);
 i=i+1;
 }
 while (i<30);
 cout << "a" << a;

 cout << "sk" << sk;

 system("pause");
 return 0;
}



Где я напортачил?
Последний раз редактировалось balans 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
zykov
Сообщений: 1777
Зарегистрирован: 02 ноя 2009, 21:00

Ошибка при программировании на языке С++.

Сообщение zykov » 11 мар 2014, 22:46

Где именно проблема то?
Вообще лучше выкладывать не всю програму целиком, а сначала урезать её до минимального теста показывающего собственно проблему.
Последний раз редактировалось zykov 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Ошибка при программировании на языке С++.

Сообщение NT » 12 мар 2014, 02:14

balans писал(а):Source of the post
... она мне уже мозги канифолит, не принимает дробные числа.

Параметры типа double принимают дробные величины - тут всё нормально.
А вот функция sqrt(кв. корень) работает только с положительными числами.
Для отрицательных генерирует ошибку NaN (not a number).
Так что надо проверять аргумент (z*z-1) на >= 0 или брать кв. корень по абсолютной величине.
Например так:

Код: Выбрать все

#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int i;
    double k1, k2,a,sk, sn, z,t;
...
    sk = z-sqrt(abs(z*z-1));
Последний раз редактировалось NT 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

balans
Сообщений: 2030
Зарегистрирован: 29 дек 2012, 21:00

Ошибка при программировании на языке С++.

Сообщение balans » 12 мар 2014, 03:53

Здравия Вам желаю.
zykov писал(а):Source of the post
Где именно проблема то?

Знал бы я где именно проблема, то и тему бы не создавал.

NT писал(а):Source of the post
Так что надо проверять аргумент (z*z-1) на >= 0 или брать кв. корень по абсолютной величине.

Сделал,как Вы напечатали, но безрезультатно. Тело программы я протестировал на фортране и получил верный результат.
Похоже, что ошибка в самой среде. Попробую на другой...

Попробовал на другой, и опять тот же ответ: после первого же дробного числа отказывается принимать оставшуюся пару данных.
Последний раз редактировалось balans 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
zam2
Сообщений: 3760
Зарегистрирован: 13 авг 2013, 21:00

Ошибка при программировании на языке С++.

Сообщение zam2 » 12 мар 2014, 04:14

Переменная "i" не инициализирована. А что именно происходит при работе программы?
Последний раз редактировалось zam2 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

balans
Сообщений: 2030
Зарегистрирован: 29 дек 2012, 21:00

Ошибка при программировании на языке С++.

Сообщение balans » 12 мар 2014, 04:41

Здравия Вам желаю.
zam2 писал(а):Source of the post
А что именно происходит при работе программы?

Ввожу дробное число:

Код: Выбрать все

sn
0,02

нажимаю Enter, а ответ

Код: Выбрать все

k1
 k2
a-1.#INDsk-1.#INDДля продолжения нажмите любую клавишу . . .


Другое дело если числа целые:

Код: Выбрать все

sn
2
 k1
3
 k2
4

все данные принимает, но результат тот же:

Код: Выбрать все

a-1.#INDsk-1.#INDДля продолжения нажмите любую клавишу . . .
Последний раз редактировалось balans 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
zykov
Сообщений: 1777
Зарегистрирован: 02 ноя 2009, 21:00

Ошибка при программировании на языке С++.

Сообщение zykov » 12 мар 2014, 06:23

balans писал(а):Source of the post Ввожу дробное число:

Код: Выбрать все

sn
0,02
Так прямо с запятой и вводите?

balans писал(а):Source of the post
zykov писал(а):Source of the post Где именно проблема то?
Знал бы я где именно проблема, то и тему бы не создавал.
Так в чём оно проявляется то?

Если сомнения по вводу чисел, то сразу после "cin >> x" можно сделать "cout << x" и посмотерть что там...
Последний раз редактировалось zykov 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Ошибка при программировании на языке С++.

Сообщение NT » 12 мар 2014, 07:47

balans писал(а):Source of the post
Ввожу дробное число:

Код: Выбрать все

sn
0,02


А почему запятая?
Надо с точкой.
0.02

balans писал(а):Source of the post
а ответ

Код: Выбрать все

k1
 k2
a-1.#INDsk-1.#INDДля продолжения нажмите любую клавишу . . .


Кстати ошибка #IND из той же серии. что NaN.
Нп. деление на 0 , кв. корень из отрицательного ч.

Посмотрите внимательно.
Например при делении очень близкие к нулю могут быть знаменатели ($$1*10^-12)$$.
Тогда результат деления на такое число - выходит очень большое.

PS.Для проверки: подайте мне все данные для ввода - я прогоню и дам вам результат.
Надо использовать форматирование при выводе.
Последний раз редактировалось NT 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Ошибка при программировании на языке С++.

Сообщение folk » 12 мар 2014, 08:32

По поводу sqrt - он и комплексный бывает

Код: Выбрать все

#include <iostream>
#include <complex>

using namespace std;

int main(int argc, char* argv[])
{
 std::complex<double> tmpcmplxnumber(26.0,0.0);
 cout << "Number: " << tmpcmplxnumber << endl;
 std::complex<double> newcmplxnumber = 1.0 - tmpcmplxnumber;
 cout << "New Number: " << newcmplxnumber << endl;

 cout << "Sqrt of New Number: " << sqrt(newcmplxnumber) << endl;

 return 0;
}

--------------------------------------
# g++ -o t t.c; ./t
Number: (26,0)
New Number: (-25,-0)
Sqrt of New Number: (0,5)
Последний раз редактировалось folk 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Ошибка при программировании на языке С++.

Сообщение kiv » 12 мар 2014, 08:39

Некорректный ввод числа - с плавающей точкой.

Можно и с запятой, но тогда надо очень корректно указать локализацию...
Последний раз редактировалось kiv 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 0 гостей