• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Циклы в Си

Kampuchiec

Новые
Регистрация
5 Дек 2012
Сообщения
27
Реакции
0
Баллы
0
Циклы в Си

Доброго времени суток помогите найти ошибку в программе

#include <stdio.h>
#include <conio.h>
#include <math.h>




int main()
{
float x, s, f, x_nach, x_kon, delta_x, eps, temp;
int n, fact;

printf("\nVvod ishodnyh dannyh\n");
printf("\nx_nach=");
scanf("%f", &x_nach);
printf("\nx_kon=");
scanf("%f", &x_kon);
printf("\ndelta_x=");
scanf("%f", &delta_x);
printf("\neps=");
scanf("%f", &eps);

printf("\nDlya x=%5.3f do %5.3f s shagom $5.3f i tochnostyi %5.3f\n", x_nach, x_kon, delta_x, eps);

printf("\n x n s f");
printf("\n--------------------------------------");

x = x_nach;

do
{
temp = 1.0;
s = 0;
n = 1;
f = exp(-x);
fact=1;
while (fabs(temp) > eps)
{
temp=pow(-1,n)*(pow(x,n)/fact);
s+=temp;
n++;
fact+=n*(n-1);

}


printf("\n%5.3f %d %0.6f %0.6f", x, n, s, f);

x += delta_x;
}
while (x <= x_kon);

printf("\n--------------------------------------");

return 0;
}
 

Вложения

  • 2014-04-16_151455.webp
    2014-04-16_151455.webp
    20.6 KB · Просмотры: 55
Это еще что за ахинея? Разберитесь, для начала, что такое факториал и как его правильно считать.

Попробуйте так:

do
{
s = 1;
n = 1;
f = exp(-x);
fact = 1;
while (fabs(temp) > eps)
{
temp=pow(-1,n)*(pow(x,n)/fact);
s+=temp;
n++;
fact*= n;

}
...

И да, fact лучше задать в формате float, иначе он может вылететь за разрядную сетку.
 
Спасибо за исправление, но что то не так почему то программа дальше n=1 не идет что делать?
 
От 1 до 10 с шагом в 1, при смене на начальное 0.1 и конечным 1 и с шагом 0.1, такой же результат
 
Выводит вот такую картину
 

Вложения

  • 2014-04-16_191655.webp
    2014-04-16_191655.webp
    22.4 KB · Просмотры: 138
Выводит вот такую картину
Нет, не то.
Еще раз.
1. Уберите цикл по х, оставьте только х=1.
2. В цикле по n организуйте вывод указанных параметров.
3. Покажите текст программы.

К сожалению, СИ-транслятора у меня нет, поэтому я переписал Ваш код на Паскаль так, чтобы было максимально близко. Вот что получилось (стандартной функции Pow у меня нет, поэтому она введена вручную):
Код:
Uses CRT;

Var
 s,fact,temp,eps,x,f:Real;
 n:Integer;

function Pow(z:real; M:integer):Real;
Var i:integer;
    Y:real;
Begin
 if M=0 then Pow:=1 else
 if M=1 then Pow:=z else
  begin
   Y:=z;
   for i:=2 to M DO Y:=Y*z;
   Pow:=Y;
  end;
end;

Begin
 ClrScr;
 x:=1;
 eps:=0.01;
 temp:=1;
 s:=1;
 n:=1;
 f:=exp(-x);
 fact:=1;
 while abs(temp)>eps do
  begin
   temp:=pow(-1,n)*(pow(x,n)/fact);
   s:=s+temp;
   writeln(' n = ',n,'   temp = ',temp:11:8, '   s = ',s:11:8);
   Inc(n);
   fact:=fact*n;
  end;
 Readkey
End.
Вот что получилось у меня:
AA01.webp
Видно, как s постепенно сходится к значению 1/е = 0.367879, что свидетельствует о правильности алгоритма. Вывод: Вы где-то накосячили с вводом программы. Поэтому и прошу выложить Ваш листинг.
Да, Вам еще следует перед циклом while добавить temp = 1.
 
Назад
Сверху