Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 28.04.2017, 18:00   #1
Vladislav125
Форумчанин
 
Регистрация: 27.09.2016
Сообщений: 66
Репутация: 10
По умолчанию [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 в 18:23.
Vladislav125 вне форума   Ответить с цитированием
Старый 28.04.2017, 18:21   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 23,766
Репутация: 5213
По умолчанию

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

попробуйте после
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, 19:03   #3
Vladislav125
Форумчанин
 
Регистрация: 27.09.2016
Сообщений: 66
Репутация: 10
По умолчанию

а вот еще одна программа там такая же ситуация.Что посоветуете там сделать?
Код:

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, 16:27   #4
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 23,766
Репутация: 5213
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


09:32.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru