Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 16.04.2014, 11:23   #1 (permalink)
Kampuchiec
Member
 
Регистрация: 05.12.2012
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Циклы в Си

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

#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.png  
Kampuchiec вне форума   Ответить с цитированием

Старый 16.04.2014, 11:23
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Можете поискать интересующую информацию в аналогичных топиках

Вложенные циклы с разветвлениями, использование массивов
Pascal, циклы
Pascal, циклы, управляемые условиями

Старый 16.04.2014, 12:26   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,817
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Kampuchiec Посмотреть сообщение
fact+=n*(n-1);
Это еще что за ахинея? Разберитесь, для начала, что такое факториал и как его правильно считать.

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

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, иначе он может вылететь за разрядную сетку.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 16.04.2014, 13:10   #3 (permalink)
Kampuchiec
Member
 
Регистрация: 05.12.2012
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо за исправление, но что то не так почему то программа дальше n=1 не идет что делать?
Kampuchiec вне форума   Ответить с цитированием
Старый 16.04.2014, 14:36   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,817
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Kampuchiec Посмотреть сообщение
Спасибо за исправление, но что то не так почему то программа дальше n=1 не идет что делать?
А какое eps вводите?
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 16.04.2014, 14:50   #5 (permalink)
Kampuchiec
Member
 
Регистрация: 05.12.2012
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

eps=0.01 (10 символов)
Kampuchiec вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 16.04.2014, 14:55   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,817
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Kampuchiec Посмотреть сообщение
eps=0.01 (10 символов)
Ой, да, забыл спросить - при каком х проверяли?
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 16.04.2014, 14:57   #7 (permalink)
Kampuchiec
Member
 
Регистрация: 05.12.2012
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

От 1 до 10 с шагом в 1, при смене на начальное 0.1 и конечным 1 и с шагом 0.1, такой же результат
Kampuchiec вне форума   Ответить с цитированием
Старый 16.04.2014, 15:02   #8 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,817
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Kampuchiec Посмотреть сообщение
От 1 до 10 с шагом в 1
Попробуйте так:
1. Задайте х=1.
2. Внутри цикла организуйте вывод на экран промежуточных значений n, temp, s и покажите, что выйдет.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 16.04.2014, 15:17   #9 (permalink)
Kampuchiec
Member
 
Регистрация: 05.12.2012
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Выводит вот такую картину
Миниатюры
2014-04-16_191655.png  
Kampuchiec вне форума   Ответить с цитированием
Старый 16.04.2014, 15:34   #10 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,817
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Kampuchiec Посмотреть сообщение
Выводит вот такую картину
Нет, не то.
Еще раз.
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.jpg
Видно, как s постепенно сходится к значению 1/е = 0.367879, что свидетельствует о правильности алгоритма. Вывод: Вы где-то накосячили с вводом программы. Поэтому и прошу выложить Ваш листинг.
Да, Вам еще следует перед циклом while добавить temp = 1.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

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

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




Часовой пояс GMT +4, время: 16:22.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.