Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Yura_al
 Аватар для Yura_al
1 / 1 / 0
Регистрация: 25.11.2009
Сообщений: 3
#1

в чем моя ошибка?? - C++

25.06.2010, 17:18. Просмотров 386. Ответов 7
Метки нет (Все метки)

вот программа на паскале:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  tmp, find : real;
  k         : real;
 
begin
  k:= 1;                           
  tmp:= 1;                       
  find:= 0.5;                  
 
  repeat
    k:=k+1;                       
    tmp:= tmp*(1-(1/sqr(k)))     
  until abs(tmp - find) < 0.00001; 
 
  writeln('Ответ: ', k-1:1:0);
  readln;
end.
эту задачу переделал на С++, но ответ выдает с ошибкой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <math.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
 
using namespace std;
int main()
{ int k=1;
double tmp=1;
double find=0.5;
double t;
for (;;) {
k= ++k;
tmp= tmp*(1-(1/(k*k)));
t= tmp - find;
if (t<0)
t= -t;
if (t<0.00001)
  break;
}
cout << k;
getch();
}
в чем ошибка??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TrenAr
21 / 20 / 2
Регистрация: 21.06.2010
Сообщений: 80
26.06.2010, 00:00     в чем моя ошибка?? #2
В 14 строке я бы написал просто "k++;"
15 строку я бы записал так: tmp *= (double) (1-(1/(k*k)));
Аналогично добавил бы (double) в строке 16.
Кроме того, в С тоже есть функция abs - не стоит изобретать велосипеды в 17 строке
Yura_al
 Аватар для Yura_al
1 / 1 / 0
Регистрация: 25.11.2009
Сообщений: 3
26.06.2010, 00:18  [ТС]     в чем моя ошибка?? #3
исправив все как сказано, получаю чистое окно без результата. оставив 14 строчку без изменения получаю ошибку приложения: "Исключение unknown software exception в приложении ..."
чем это может быть связано??
TrenAr
21 / 20 / 2
Регистрация: 21.06.2010
Сообщений: 80
26.06.2010, 00:32     в чем моя ошибка?? #4
Вот так у меня компилирует и даже что-то выводит (написано на С):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <math.h>
#include <stdio.h>
 
int main()
{
    int k=1;
    double tmp=1;
    double find=0.5;
    double t;
    do
    {
        k++;
        tmp *= (double) (1-(1/(k*k)));
        t = (double) tmp - find;
    } while ( abs( t ) >= 0.00001 );
    printf("%d", k );
    
    return 0;
}
dxdy
 Аватар для dxdy
97 / 97 / 5
Регистрация: 14.06.2010
Сообщений: 283
26.06.2010, 00:47     в чем моя ошибка?? #5
TrenAr лучше использовать не
C
1
while ( abs( t ) >= 0.00001 );
а наверно
C
1
while ( fabs( t ) >= 0.00001 );
в данной программе все числа double типа
Можно формулировку задания? Просто условие в цикле у всех разное. Я как понимаю, мы в условии всего лишь задаем точность.
Yura_al
 Аватар для Yura_al
1 / 1 / 0
Регистрация: 25.11.2009
Сообщений: 3
26.06.2010, 00:59  [ТС]     в чем моя ошибка?? #6
спасиба, этот вариант рабочий. Теперь осталось тока выяснить почему ответ выдает некорректный, т.к. должен получится 5000, а выдает тока 2

Добавлено через 6 минут
Известно равенство:
алгебраическая сумма (1-1/sqr(k)) от k=2 до бесконечности = 0,5

сколько сомножителей надо взять в произведении, чтобы равенство выполнялось до пятой значащей цыфры, т.е. с погрешностью не более 10^(-5)
dxdy
 Аватар для dxdy
97 / 97 / 5
Регистрация: 14.06.2010
Сообщений: 283
26.06.2010, 01:23     в чем моя ошибка?? #7
В данном примере получается 5000:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <math.h>
#include <iostream>
using namespace std;
 
int main()
{
    int k = 1;
    double tmp = 1.0;
    double find = 0.5;
    double t = 0.0;
    do
    {
        k++;
        tmp *= (double) (1.0 -(1.0/(k*k)));
        t = tmp - find;
    } while ( fabs( t ) > 0.0001 );
    printf("%d", k );
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2010, 02:34     в чем моя ошибка??
Еще ссылки по теме:

C++ В чём заключается моя ошибка?
Исправьте пожалуйста, где моя ошибка? спасибо C++
Пытаюсь создать описание класса одномерных массивов строк. В чем моя ошибка? C++
Ошибка 2 error LNK2019, не пойму в чем ошибка C++
C++ В чем моя ошибка?(ООП, классы)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
TrenAr
21 / 20 / 2
Регистрация: 21.06.2010
Сообщений: 80
26.06.2010, 02:34     в чем моя ошибка?? #8
Цитата Сообщение от dxdy Посмотреть сообщение
TrenAr лучше использовать не
Да, если поставить fabs вместо abs, а так же правильно выставить (double) возле переменной, а не в начале функции присваивания - всё работает

Т.е. короче, вывод - при работе с вещественными числами, везде где только можно надо ставить числа с точкой, а при их отсутствии (только переменные в выражении) - вставлять (double \ float).

Т.е. вариант:
C
1
tmp *= ( 1 - ( 1 / ( (double) k * k )));
тоже рабочий
Yandex
Объявления
26.06.2010, 02:34     в чем моя ошибка??
Ответ Создать тему
Опции темы

Текущее время: 17:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru