Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Функции, Операторы цыкла

13K
26 мая 2011 года
X-enot
39 / / 01.09.2010
Помогите дорешать задачу...Вроде бы все правильно, но в цикле зависает.. код писал около 2-х дней.. и вот уже 4 день не могу исправить правильно :facepalm: Спасибо.

Задача: Вычислить значение суммы ряда, используя операторы цикла с предусловием, постусловием и параметром (по выбору пользователя). Выбор пользователя анализировать с помощью оператора switch. Для циклов с предусловием и постусловием принять точность e = 0.0001, для цикла с параметром подобрать количество итераций опытным путем. Выполнить проверку.

Заданный ряд:


Проверка:



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

using namespace std;

#define PI 3.14159

unsigned long fact(unsigned long);


using namespace std;

int main()
{
        double x,e,s1,s2;
    int l,i,k, number;
    e = 0.0001;
        l=1;
    while(l!=0)
    {
        cout<<"Vichislenie s predusloviem - 1"<<endl;
        cout<<"Vichislenie s postusloviem - 2"<<endl;
        cout<<"Vichislenie s opredelennim kolichestvom shagov - 3"<<endl;
        cout<<"Vihod - 0"<<endl;
        cout<<"Vibirete sposob rasscheta:";
        cin>>l; if (l==0) break;
        cout<<"Vvedite znachenie x: ";cin>>x;  
                switch(l)
        {  
        case 1:
                  {  s1=x;
                     s2=s1-((pow(PI/3, 3))/(fact(3)));
            while( fabs(fabs(s2)-fabs(s1)) > e )
            {
                         i=5;
                         k=3;        
             s1=s2;
             s2+=((pow(PI/3, i))/(fact(k)));
                         i++;
                         k++;
            }
            break;
                  }
        case 2:
                  {  s2=x;
            do
            {
                         i=3;
                         k=1;
             s1=s2;
             s2+=((pow(PI/3, i))/(fact(k)));
                         i++;
                         k++;
            }while( fabs(s2-s1) > e );
            break;
                  }
        case 3:
                 {  s2=x;
            for(int i=3,k=1;i<5; i++,k++)
            {
                         s1=s2;
                         s2+=((pow(PI/3, i))/(fact(k)));          
            }
            break;
                  }
                }
        }
         cout<<"Summa  = "<<s2<<endl;
     
return 0;
}

unsigned long fact(unsigned long number)
{
    if(number <= 1)
        return 1;
    else
        return number * fact(number - 1);
}
66K
26 мая 2011 года
Antosh
18 / / 25.05.2011
сделай вот так вот:
Код:
l=1;
    while(l!=0)
    {
        cout<<"Vichislenie s predusloviem - 1"<<endl;
        cout<<"Vichislenie s postusloviem - 2"<<endl;
        cout<<"Vichislenie s opredelennim kolichestvom shagov - 3"<<endl;
        cout<<"Vihod - 0"<<endl;
        cout<<"Vibirete sposob rasscheta:";
        cin>>l;        
    switch(l)
        {  
        case 1:
            {
                cout<<"Vvedite znachenie x: ";
                cin>>x;
                s1=x;
                s2=s1-((pow(PI/3, 3))/(fact(3)));
                while( fabs(fabs(s2)-fabs(s1)) > e )
                {
                    i=5;
                    k=3;        
                    s1=s2;
                    s2+=((pow(PI/3, i))/(fact(k)));
                    i++;
                    k++;
                }
                l=0;
                break;
            }
        case 2:
            {
                cout<<"Vvedite znachenie x: ";
                cin>>x;
                s2=x;
                do
                {
                    i=3;
                    k=1;
                    s1=s2;
                    s2+=((pow(PI/3, i))/(fact(k)));
          i++;
          k++;
                }while( fabs(s2-s1) > e );
                l=0;
                break;
      }
        case 3:
            {
                cout<<"Vvedite znachenie x: ";
                cin>>x;
                s2=x;
                for(int i=3,k=1;i<5; i++,k++)
                {
                    s1=s2;
                    s2+=((pow(PI/3, i))/(fact(k)));          
                }
                l=0;
                break;
            }
        case 0:
            {
                l=0;
                break;
            }
        default:
            {
                cout <<"Vveden neverniy punkt menu!";
                //здесь лучше очистить экран system("sld");  подключить только нужно вроде #include <windows.h>
                break;
            }
    }
  }
  cout<<"Summa  = "<<s2<<endl;


у тебя цикл зацикливался потому что l всегда равен 0 кроме как если нажать выход.
13K
26 мая 2011 года
X-enot
39 / / 01.09.2010
Спасибо. Работает только case 3, Не работает case1 и case2. В чем ошибка?
Код:
case 1:
            {
                cout<<"Vvedite znachenie x: ";
                cin>>x;
                s1=x;
                s2=s1-((pow(PI/3, 3))/(fact(3)));
                while( fabs(fabs(s2)-fabs(s1)) > e )
                {
                    i=5;
                    k=3;        
                    s1=s2;
                    s2+=((pow(PI/3, i))/(fact(k)));
                    i++;
                    k++;
                }
                l=0;
                break;
            }
        case 2:
            {
                cout<<"Vvedite znachenie x: ";
                cin>>x;
                s2=x;
                do
                {
                    i=3;
                    k=1;
                    s1=s2;
                    s2+=((pow(PI/3, i))/(fact(k)));
                                         i++;
                                         k++;
                }while( fabs(s2-s1) > e );
                l=0;
                break;
      }
66K
26 мая 2011 года
Antosh
18 / / 25.05.2011
опиши что именно не работает или напиши на что ругается и как
13K
26 мая 2011 года
X-enot
39 / / 01.09.2010
Цитата: Antosh
опиши что именно не работает или напиши на что ругается и как



При выборе case1 или выборе case2. Программа зависает :(

29K
26 мая 2011 года
Енот_в_Засаде
224 / / 09.11.2010
я особо в код не вникал, но обрати внимание на цикл:
 
Код:
while( fabs(fabs(s2)-fabs(s1)) > e )
                {
                         i=5;
                     k=3;
                     s1=s2;
                     s2+=((pow(PI/3, i))/(fact(k)));
                     i++;
                     k++;
                }

каждый раз, при выполнении цикла, переменной i присваивается значение 5, потом ты вычисляешь s1 s2, и выполняешь операцию инкремента для переменной i, новое значение i=6, но при следующей итерации цикла, переменной i вновь присваивается значение 5, в результате s2 не изменяется, так как i все время равно 5. Соответственно тоже самое и с переменной к. Вынеси i=5 и к=3 перед циклом.



P.S. С циклом do while тоже самое
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог