Навигация
--- Учебное
Обязательные сведения и документы о КемГУ
Нормативные документы
Образовательные программы
Расписание занятий
Страницы преподавателей
Преподавателю
Студенту

--- Факультет
Деканат
Совет факультета
Кафедры
Наука
История факультета
Выпускники факультета
Фото галерея
Традиции факультета
Списки студентов

--- Добро пожаловать!
Абитуриенту
Родителям
Интернет-полезности
Учебные пособия в Интернете

Обратная связь
Время бежит...
Неделя
Нечетная
Статистика Internet

Ваш IP-адрес: 54.224.18.114
Вы не являетесь пользователем факультетской сети

Просмотр темы
 Распечатать тему
Задача на С++
Aosolya
#1 Распечатать сообщение
Опубликовано 28-03-2012 19:54
Пользователь

Сообщений: 6
Зарегистрирован: 30.08.11

Татьяна Юрьевна, здравствуйте!
Проверьте пожалуйста задачу (4.26)

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
void main() {
int factor,k,t,m,l;
double stepen,sh,eps,n,slag,ex,x;
cout<<"x=";
cin>>x;
cout<<"eps=";
cin>>eps;
stepen=1;
factor=1;
slag=1;
sh=0;
m=1;
l=1;
m*=l; //совмещение операции присваивания с бинарными операциями
cout<<"m="<<m;
cout<<"\n|______________________________________________________________________|\n";
cout<<"\n| nomer slag | slagaemoe | sh |\n";
cout<<"\n|______________________________________________________________________|\n";
for (n=1,k=1,t=1; abs(slag)>=eps; n++) {
stepen = pow(x,n); // расчет степени
//cout<<"\n stepen="<<stepen;
factor=factor*k; // расчет факториала
cout<<" factor="<<factor;
k++;
if (k%2==0) {
slag=stepen/factor; // расчет слагаемого
sh=sh+slag;
cout<<"\n| "<<setw(3)<<t<<" | "<<setw(20)<<slag<<" | "<<setw(10) <<sh<<" |";


t++;
}
}
ex=(exp(x)-exp(-x))/2;
cout<<"\n \n \n ex="<<ex;

}

Выполнила Ашлапова О.
 
PA3UJIb
#2 Распечатать сообщение
Опубликовано 29-11-2014 12:30
Аватар пользователя

Пользователь

Сообщений: 265
Зарегистрирован: 11.12.06

Aosolya написал:
Татьяна Юрьевна, здравствуйте!
Проверьте пожалуйста задачу (4.26)


Оля наверняка уже всё сдала и пересдала, так что отвечу на этот пост (и не надо меня некропостером звать)

Для начала собственно поправленный код:
Загрузить источник  Код
#include <cmath>
#include <iostream>
#include <iomanip>


using namespace std;

int main()
{
   long long factor = 1;
   int k, n, t;
   double stepen = 1.0f, sh = 0.0f, slag = 1.0f;
   double eps, x;
   double ex;

   cout << "x = ";
   cin >> x;
   cout << "eps = ";
   cin >> eps;

   cout << "|--------------------------------|\n";
   cout << "|  # |    slagaemoe |     result |\n";
   cout << "|--------------------------------|\n";
   for (n = 1, k = 1, t = 1; ( abs(slag) >= eps ) && (n < 25) ; n++)
   {
      stepen = pow(x, n); // расчет степени
      factor = factor * k; // расчет факториала
      if (++k % 2 == 0)   // если следующее k чётное, то рисуем строку таблицы
      {
         slag = stepen / factor; // расчет слагаемого
         sh = sh + slag;
         cout << "| " << setw(2) << t << " | " << setw(12) << slag << " | " << setw(10) << sh << " | (";
         t++;
      }
      else
      {
         cout << "| " << setw(2) << " " << " | " << setw(12) << " " << "  | " << setw(10) << " " << " | (";
      }
      // покажем чему на текущем k равен факториал
      cout << k - 1 << "! = " << factor << ")\n";
   }
   cout << "|--------------------------------|\n";
   
   // расчет значения для проверки
   ex = (exp(x) - exp(-x)) / 2;
   cout << "\n\nex = " << ex << "\n";

   return 0;
}





Теперь по косякам:
1. Функция main() согласно стандарту обязана возвращать значение. Да, компилятор проглатывает тип void для возвращаемого значения, но правильно всё же писать так.
2. Тип int для факториала не подходит, так как при попытке рассчитать 17! и больше компилятор интерпретирует значения факториала как отрицательные. Соответственно, при выставлении точности до, скажем, пятого знака после запятой исходная программа "зависает".
3. Начальное значение переменных можно задать в момент объявления. Незачем раздувать листинг программы.
4. Неиспользуемые переменные m и l - для чего они в программе были, мне не ясно, так что удаляем их.
5. Просто для иллюстрирования, чему равен факториал четных чисел, добавил несколько строк.

Какие есть баги:
1. При слишком высокой желаемой точности вычисления ряда программа "зависает" - опять же, вследствие того, что факториал больших чисел есть число запредельное.
2. По прежнему нету проверки на ввод. Пользователь может ввести букву или дробное число как целое. Но будем надеяться, что будущие ученые отдают себе отчет в требуемых данных.

Вот так.
Теперь несколько результатов выполнения программы:
Загрузить источник  Код

x = 1
eps = 0.0000001
|--------------------------------|
|  # |    slagaemoe |     result |
|--------------------------------|
|  1 |            1 |          1 | (1! = 1)
|    |              |            | (2! = 2)
|  2 |     0.166667 |    1.16667 | (3! = 6)
|    |              |            | (4! = 24)
|  3 |   0.00833333 |      1.175 | (5! = 120)
|    |              |            | (6! = 720)
|  4 |  0.000198413 |     1.1752 | (7! = 5040)
|    |              |            | (8! = 40320)
|  5 | 2.75573e-006 |     1.1752 | (9! = 362880)
|    |              |            | (10! = 3628800)
|  6 | 2.50521e-008 |     1.1752 | (11! = 39916800)
|--------------------------------|


ex = 1.1752




Загрузить источник  Код

x = 2
eps = 0.01
|--------------------------------|
|  # |    slagaemoe |     result |
|--------------------------------|
|  1 |            2 |          2 | (1! = 1)
|    |              |            | (2! = 2)
|  2 |      1.33333 |    3.33333 | (3! = 6)
|    |              |            | (4! = 24)
|  3 |     0.266667 |        3.6 | (5! = 120)
|    |              |            | (6! = 720)
|  4 |    0.0253968 |     3.6254 | (7! = 5040)
|    |              |            | (8! = 40320)
|  5 |   0.00141093 |    3.62681 | (9! = 362880)
|--------------------------------|


ex = 3.62686




Загрузить источник  Код

x = 4
eps = 0.0001
|--------------------------------|
|  # |    slagaemoe |     result |
|--------------------------------|
|  1 |            4 |          4 | (1! = 1)
|    |              |            | (2! = 2)
|  2 |      10.6667 |    14.6667 | (3! = 6)
|    |              |            | (4! = 24)
|  3 |      8.53333 |       23.2 | (5! = 120)
|    |              |            | (6! = 720)
|  4 |      3.25079 |    26.4508 | (7! = 5040)
|    |              |            | (8! = 40320)
|  5 |     0.722399 |    27.1732 | (9! = 362880)
|    |              |            | (10! = 3628800)
|  6 |     0.105076 |    27.2783 | (11! = 39916800)
|    |              |            | (12! = 479001600)
|  7 |     0.010777 |     27.289 | (13! = 6227020800)
|    |              |            | (14! = 87178291200)
|  8 |  0.000821108 |    27.2899 | (15! = 1307674368000)
|    |              |            | (16! = 20922789888000)
|  9 | 4.83005e-005 |    27.2899 | (17! = 355687428096000)
|--------------------------------|


ex = 27.2899




Изменил(а) PA3UJIb, 29-11-2014 12:32
 
Перейти на форум:
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
АФФФ


Перейти
ВКР


Перейти
Темы форума
Обсуждаемые темы
А давайте серьезно...
Я хочу...
Задача на С++
Ассоциация физиков ф...
Проверка знаний
Copyright © 2006