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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2023, 23:20   #1
Ars_Kis
 
Регистрация: 13.03.2023
Сообщений: 6
По умолчанию Помощь с циклом C++

Нужна помощь с циклом, 2 недели сижу рыскаю в интернете, миллион попыток реализовать его, но никак.
Сейчас попробую объяснить
Сперва вычисляется ответ по e = exp(-l) - (l - 1) * (l - 1)(например ответ 0.2974545) этому примеру, если он больше погрешности(0.00001),то этот ответ (0.2974545), должен подставляться в e = exp(-l) - (l - 1) * (l - 1) этот же пример за место l (например ту получилось 0.00122365), ответ опять больше погрешности и так до тех пор пока ответ не станет меньше погрешности.

}
Код:
#include <iostream>
#include <stdio.h>
#include <math.h>
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "rus");
    double a, b, y,e,l;
    double n = 0;
    double p = 0.00001;//погрешность
 
    std::cout << "Введите a: ";
    std::cin >> a;
    std::cout << "Введите b: ";
    std::cin >> b;
 
    l = ((b + a) / 2);//корень
    y = ((b - a) / 2);//точность
    e = exp(-l) - (l - 1) * (l - 1);//сам пример, который должен быть меньше p(погрешности) 
{
тут должен быть цикл, который должен повторяться(но за место l "e = exp(-l) - (l - 1) * (l - 1)" 
в этом примере должен подставляться ответ из этого же примера "e = exp(-l) - (l - 1) * (l - 1)") и должно быть кол-во шагов цикла
}
 
    std::cout << "Корень равен " << l << "\n";
    std::cout << "Точность равна " << y << "\n";
    std::cout <<"Для достижения погрешности  потребовалось " << n << " шагов";
 
}
Ars_Kis вне форума Ответить с цитированием
Старый 13.03.2023, 23:36   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Например:
Код:
while (e > p) {
    l = e;
    e = exp(-l) - (l - 1) * (l - 1);
    n++;
}
// или
while (e > p) {
    e = exp(-e) - (e - 1) * (e - 1);
    n++;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.03.2023, 00:27   #3
Ars_Kis
 
Регистрация: 13.03.2023
Сообщений: 6
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Например:
Код:
while (e > p) {
    l = e;
    e = exp(-l) - (l - 1) * (l - 1);
    n++;
}
// или
while (e > p) {
    e = exp(-e) - (e - 1) * (e - 1);
    n++;
}
Цикл выполняется один раз, я так уже пробовал
Ars_Kis вне форума Ответить с цитированием
Старый 14.03.2023, 00:32   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда попробуй так
Код:
while (abs(e) > p) {
    l = e;
    e = exp(-l) - (l - 1) * (l - 1);
    std::cout << e << std::endl;
    n++;
}
// или
while (abs(e) > p) {
    e = exp(-e) - (e - 1) * (e - 1);
    std::cout << e << std::endl;
    n++;
}

Последний раз редактировалось macomics; 14.03.2023 в 00:36.
macomics вне форума Ответить с цитированием
Старый 16.03.2023, 23:15   #5
Ars_Kis
 
Регистрация: 13.03.2023
Сообщений: 6
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Тогда попробуй так
Код:
while (abs(e) > p) {
    l = e;
    e = exp(-l) - (l - 1) * (l - 1);
    std::cout << e << std::endl;
    n++;
}
// или
while (abs(e) > p) {
    e = exp(-e) - (e - 1) * (e - 1);
    std::cout << e << std::endl;
    n++;
}
Код выполняется сперва хорошо, потом -1,79328 пишется бесконечно, программа не считает после этого числа
Ars_Kis вне форума Ответить с цитированием
Старый 16.03.2023, 23:24   #6
Ars_Kis
 
Регистрация: 13.03.2023
Сообщений: 6
По умолчанию

У меня появился пример на pascalabcnet, списал код, подправил под c++
Код:
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "rus");
    double a = 2.0;
    double b = 1.0;
    double y, f, x;
    double p = 0.00001;
    int n = 0;

    x = ((b + a) / 2);
    y = ((b - a) / 2);
    f = exp(-x) - (x - 1) * (x - 1);
    if (f < 0) { ((exp(-a) - (a - 1) * (a - 1)) < 0); }
    else { (f > 0) && ((exp(-a) - (a - 1) * (a - 1)) > 0); a = x; }
    if (f > 0) { ((exp(-b) - (b - 1) * (b - 1)) > 0); }
    else { (f < 0) && ((exp(-b) - (b - 1) * (b - 1)) < 0); b = x; }
    n++;
    std::cout << "Корень равен " << x << "\n";
    std::cout << "Точность равна " << y << "\n";
    std::cout << "Для достижения погрешности потребовалось " << n << " шагов";

}
pascal
Код:
begin
  var a:=2.0;
  var b:=1.0;
  var(f,x,s):=(0.0,0.0,0.0);
  var P:=(b-a)/2;
  while P>0.00001 do
  begin
    x:=(a+b)/2;
    f:=exp(-x) - (x - 1) * (x - 1);
    if (f<0)and((exp(-a) - (a - 1) * (a - 1))>0)or(f>0)and((exp(-a) - (a - 1) * (a - 1))>0) then a:=x;
     if (f>0)and((exp(-b) - (b - 1) * (b - 1))>0)or(fb<0)and((exp(-b) - (b - 1) * (b - 1))<0) then b:=x;
     P:=(b-a)/2;
     s+=1;     
  end;
  writeln('Корень =',x:=0:9);
  writeln('Погрешность',P:=0:9);
  Println('Количество шагов =',s);
end.
Ars_Kis вне форума Ответить с цитированием
Старый 16.03.2023, 23:50   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А почему в C++ варианте p=0.00001; хотя на PascalABC p := (a+b)/2?
На C++ нету цикла?

Код:
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "rus");
    int n = 0;
    double a = 2.0;
    double b = 1.0;
    double f = 0.0, x = 0.0, s = 0.0, t = 0.0;
    double p = (a+b)/2;
    while (abs(p) > 0.00001) {
        x = ((b + a) / 2);
        f = exp(-x) - (x - 1) * (x - 1);
        s = exp(-a) - (a - 1) * (a - 1);
        t = exp(-b) - (b - 1) * (b - 1);
        if ((f < 0) && (s < 0) || (f > 0) && (s > 0)) a = x;
        if ((f > 0) && (t > 0) || (f < 0) && (t < 0)) b = x;
        p = (b-a)/2;
        n++;
    }
    std::cout << "Корень равен " << x << "\n";
    std::cout << "Точность равна " << p << "\n";
    std::cout << "Для достижения погрешности потребовалось " << n << " шагов";
}

Последний раз редактировалось macomics; 17.03.2023 в 02:12.
macomics вне форума Ответить с цитированием
Старый 30.03.2023, 17:41   #8
Ars_Kis
 
Регистрация: 13.03.2023
Сообщений: 6
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
А почему в C++ варианте p=0.00001; хотя на PascalABC p := (a+b)/2?
На C++ нету цикла?

Код:
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "rus");
    int n = 0;
    double a = 2.0;
    double b = 1.0;
    double f = 0.0, x = 0.0, s = 0.0, t = 0.0;
    double p = (a+b)/2;
    while (abs(p) > 0.00001) {
        x = ((b + a) / 2);
        f = exp(-x) - (x - 1) * (x - 1);
        s = exp(-a) - (a - 1) * (a - 1);
        t = exp(-b) - (b - 1) * (b - 1);
        if ((f < 0) && (s < 0) || (f > 0) && (s > 0)) a = x;
        if ((f > 0) && (t > 0) || (f < 0) && (t < 0)) b = x;
        p = (b-a)/2;
        n++;
    }
    std::cout << "Корень равен " << x << "\n";
    std::cout << "Точность равна " << p << "\n";
    std::cout << "Для достижения погрешности потребовалось " << n << " шагов";
}
Спасибо, программа работает. Единственное, зачем в цикле abs? Для себя просто
Ars_Kis вне форума Ответить с цитированием
Старый 30.03.2023, 17:43   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Потому что иначе у вас все отрицательные значения p будут гарантировано меньше 0.00001, хотя вам надо проверить длину дробной части числа.
Можете вместо abs написать условие while (p > 0.00001 && p < -0.00001)
macomics вне форума Ответить с цитированием
Старый 31.03.2023, 08:47   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Цитата:
Сообщение от Ars_Kis Посмотреть сообщение
зачем в цикле abs? Для себя просто
std::abs возвращает модуль от агрумента
Алексей1153 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
требуется помощь с двойным циклом dsbv Общие вопросы Delphi 8 21.03.2019 14:51
[C++] Помощь с циклом for andryxa100 Помощь студентам 1 15.09.2017 08:42
Помощь с циклом manula Microsoft Office Excel 1 18.07.2014 04:52
Помощь с циклом (Не могу решить проблему) Usandy Паскаль, Turbo Pascal, PascalABC.NET 5 05.11.2013 16:41
Что-то с циклом VetalMan Помощь студентам 1 10.05.2010 11:20