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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2017, 17:00   #1
Vladislav125
Пользователь
 
Регистрация: 27.09.2016
Сообщений: 66
По умолчанию [Pascal] Помогите найти ошибку.

Это программа работает,только результат немного не правильно,вывод должен быть вот так

Для угла в 2 градусов y=-0.139
Для угла в 2.1 градусов y=-0.104
Для угла в 2.2 градусов y=-0.069
Для угла в 2.3 градусов y=-0.034
Для угла в 2.4 градусов y= 0.001
Для угла в 2.5 градусов y= 0.036
Для угла в 2.6 градусов y= 0.071
Для угла в 2.7 градусов y= 0.106
Для угла в 2.8 градусов y= 0.141
Для угла в 2.9 градусов y= 0.176
Для угла в 3 градусов y= 0.211

а выводит только до 2.9 помогите найти ошибку


Код программы:
Код:
Program primerR;
Const a=2; b=3; h=0.1;
Var x,y:real;
Begin
  x:=a;
  Repeat
    y:=3*sin(sqrt(3))+0.35*x-3.8;
    Writeln('Для угла в ',x,' градусов',' y=',y:6:3);
    x:=x+h;
  Until x>b;
End.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 28.04.2017 в 17:23.
Vladislav125 вне форума Ответить с цитированием
Старый 28.04.2017, 17:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы столкнулись с погрешностью машинного представления вещественных чисел.

попробуйте после
x:=x+h;
написать
Код:
writeLn(x:0:18);
посмотрите, чему равен X, удивитесь...

подробнее об этом можно почитать в статьях по ссылкам ТУТ

теперь, когда выяснили, кто виноват, решим, что же делать.

вариантов много.
например, можно округлять x до одного знака после запятой:
Код:
x:=round(x*10)/10;
или просто изменить сравнение, сравнивать не с b, а величиной, которая больше b (но меньше, чем b+h, разумеется):
Код:
Until x>(b+h/2);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.04.2017, 18:03   #3
Vladislav125
Пользователь
 
Регистрация: 27.09.2016
Сообщений: 66
По умолчанию

а вот еще одна программа там такая же ситуация.Что посоветуете там сделать?
Код:
Program primerR;
Const a=2; b=3; h=0.1;
Var x,y:real;
Begin
x:=a;

While x<=b do
           Begin
           y:=3*sin(sqrt(3))+0.35*x-3.8;
           Writeln('Для угла в ',x,' градусов',' y=',y:6:3);
           x:=x+h;

           end;
End.
Vladislav125 вне форума Ответить с цитированием
Старый 29.04.2017, 15:27   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Vladislav125 Посмотреть сообщение
а вот еще одна программа там такая же ситуация.Что посоветуете там сделать?
так я же описал способы решения выше.
либо округляйте X,
либо не сравнивайте x с конечной величиной. (вместо x<=b напишите x<(b+h/2)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку в программе на Pascal Cade Паскаль, Turbo Pascal, PascalABC.NET 1 04.07.2009 20:07
Задача Pascal (Procedure) Помогите найти ошибку! Seriy8888 Паскаль, Turbo Pascal, PascalABC.NET 2 14.12.2008 14:53