Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

C Programming (степенен ред)

C Programming (степенен ред)

Мнениеот WEBER » 06 Мар 2011, 22:36

Искам да направя програма на С 4.5, която да изчислява степенния ред [tex]\sum_{k=0}^{n }\frac{x^{2n+1}}{(2n+1)! }[/tex], все едно реда на [tex]sh(x)[/tex], но не мога да разбера къде е грешката. Интересното е, че при n=1 и n=2 (при х=2), резултатът е един и същ (2), същото за n=3, n=4, резултатът е 3,3333332539, n=5, n=6...и т.н

#include <stdio.h>
#include <math.h>
void main()
{
float v,f,n,m,p;
int t;
printf("Value of x:");
scanf("%f",&m);
printf("Number of terms:");
scanf("%f",&n);
v=0;
f=1;
for(p=1;p<=n;p=p+2)
{
for(t=p;t>=1;t--)
f*=t;
v+=pow(m,p)/f;
}
printf("The sum is %10.10e",v);
}

Който може и има желание нека подскаже :)
Аватар
WEBER
Напреднал
 
Мнения: 256
Регистриран на: 26 Фев 2010, 14:17
Местоположение: София
Рейтинг: 7

Re: C Programming (степенен ред)

Мнениеот ins- » 07 Мар 2011, 13:18

Както е записано условието - в това под сумата трябва на мястото на n трябва да имаш k.
Защо не я разбиеш на методи? Напиши метод дето да ти смята факториел и оттам нататък става
елементарна.
Има и друг проблем ... с факториелите малко интересно стои въпроса с големите стойности.
Може би се иска предварително да намериш кратка формула за сумата и после ще е по-лесно.
Аватар
ins-
Математик
 
Мнения: 1264
Регистриран на: 11 Яну 2010, 21:57
Рейтинг: 254

Re: C Programming (степенен ред)

Мнениеот WEBER » 07 Мар 2011, 17:50

Ще ползвам рекурентната зависимост. Така отпада въпроса с големите стойности на факториела. Как мислиш?
Аватар
WEBER
Напреднал
 
Мнения: 256
Регистриран на: 26 Фев 2010, 14:17
Местоположение: София
Рейтинг: 7

Re: C Programming (степенен ред)

Мнениеот seppen » 07 Мар 2011, 19:05

Цикълът ти трябва да е p=1; p<=2*n+1; p=p+2.
Също може да махнеш pow и да го сложиш в цикъла с t.
Не знам това дали ще повлияе на точността отрицателно, но може да работи по-бързо.
Рекурентно може [tex]x(\frac{x^2}{2}+(\frac{x^3}{3}+ ))[/tex].
seppen
Фен на форума
 
Мнения: 220
Регистриран на: 10 Яну 2010, 17:52
Рейтинг: 5

Re: C Programming (степенен ред)

Мнениеот ins- » 07 Мар 2011, 21:09

Тази задача от чисто практическа гледна точка е пълна глупост, защото не са зададени точност
и максимално допустими стойности на променливите. А доколкото видях се явява стандартна алгоритмична задачка.
На стр. 74 от учебника по Паскал на М. Тодорова - зад 31 е да се напише програма, която намира сумата на ред, много подобен на този, пуснат от теб.

http://www.daniweb.com/forums/thread72734.html това би могло да ти е от полза.
Напиши в google power series C++ progamm и ще излязат много такива.

За рекурсията - не е панацея ... хаби много ресурси и откъм производителност е зле.
Трябва да се използва внимателно. В повечето учебници намирането на ! е класически пример за рекурсия.
А проблема с големите стойности не отпада, нито по начина, предложен от мен, нито с рекурсия.
Може в C++ да има класове за работа с големи числа, поне в Java e така, но не ми се рови.
Ако искаш - опитай се да напишеш без такива класове метод, който да смята 123456789123456789!
и ми кажи какво става :)
Хубаво ще е, докато смяташ да използваш изчисленията, направени в предходните стъпки.
Иначе алгоритъма, който е в линка е приложим, стига да направиш проверки за четност и да не
включваш всички членове.
Аватар
ins-
Математик
 
Мнения: 1264
Регистриран на: 11 Яну 2010, 21:57
Рейтинг: 254

Re: C Programming (степенен ред)

Мнениеот WEBER » 08 Мар 2011, 08:23

ins-, ако се загледаш в кода ще видиш, че от клавиатурата се въвежда броя на членовете от реда, който се сумира, значи има някаква точност, иначе за останалото си прав. Ще я помъча още.

ПП. seppen, това като го направя и ми забива :D , вече пробвах.
Аватар
WEBER
Напреднал
 
Мнения: 256
Регистриран на: 26 Фев 2010, 14:17
Местоположение: София
Рейтинг: 7

Re: C Programming (степенен ред)

Мнениеот ins- » 08 Мар 2011, 11:26

Броят на членовете е хубаво нещо, но до кой разряд след десетичната точка/запетая се пресмята е нещо съвсем различно. И в Excel въвеждаш числа, колкото ти искаш, но имаш и опции за настройка на точността на изчисленията.
Аватар
ins-
Математик
 
Мнения: 1264
Регистриран на: 11 Яну 2010, 21:57
Рейтинг: 254

Re: C Programming (степенен ред)

Мнениеот WEBER » 08 Мар 2011, 18:31

Е и тука има, но те разбрах и си прав. Трябва да е есно с каква точност се работи.

seppen, това ли имаш предвид:


#include <stdio.h>
#include <math.h>
void main(void)
{
float v=0,f,n,m,p;
int t;
printf("Value of x:");
scanf("%f",&m);
printf("Number of terms:");
scanf("%f",&n);
f=1;
for(p=1;p<=2*n+1;p=p+2)
{
for(t=p;t>0;t--)
f*=t;
v+=pow(m,p)/f;
}
printf("The sum is %10.10e",v);
}
Аватар
WEBER
Напреднал
 
Мнения: 256
Регистриран на: 26 Фев 2010, 14:17
Местоположение: София
Рейтинг: 7

Re: C Programming (степенен ред)

Мнениеот WEBER » 18 Мар 2011, 19:44

Ето ако някой се интересува от вярното решение на задачата, скоро го написах:

#include <stdio.h>
main()
{ int n;
double sum_shx,u,x,eps;
printf("Enter fonction argument=");
scanf("%lf",&x);
do{
printf("Enter eps=");
scanf("%lf",&eps);
}while ((eps<=0) || (eps>1));
for(sum_shx=x,n=1,u=x;u>eps;n+=2)
{
u*=(x/(n+1))*(x/(n+2));
sum_shx+=u;
}
printf("The sum is=%1.10f\n",sum_shx);
}
Аватар
WEBER
Напреднал
 
Мнения: 256
Регистриран на: 26 Фев 2010, 14:17
Местоположение: София
Рейтинг: 7

Re: C Programming (степенен ред)

Мнениеот maieutiquer » 16 Апр 2011, 21:44

Интересуваме се, мерси! (:

ins- написа:Напиши метод дето да ти смята факториел

Ето и моята версия на C++:

Код: Избери целия код
long double faktoriel()
{
   long double zadadena, k, rezult;
   k = 0;
   rezult = 0;
   
   cout << "Kolko fakturiel: " << endl;
   cin >> zadadena;

   while (k < zadadena)
   {
      k++;
      rezult = rezult + k;
   }
   return rezult;
}


Как е?
Аватар
maieutiquer
Нов
 
Мнения: 41
Регистриран на: 13 Яну 2011, 15:31
Местоположение: Сливен
Рейтинг: 2

Re: C Programming (степенен ред)

Мнениеот ins- » 17 Апр 2011, 07:54

maieutiquer написа:Интересуваме се, мерси! (:

ins- написа:Напиши метод дето да ти смята факториел

Ето и моята версия на C++:

Код: Избери целия код
long double faktoriel()
{
   long double zadadena, k, rezult;
   k = 0;
   rezult = 0;
   
   cout << "Kolko fakturiel: " << endl;
   cin >> zadadena;

   while (k < zadadena)
   {
      k++;
      rezult = rezult + k;
   }
   return rezult;
}


Как е?

Добре е, но не смята факториел, а нещо друго като го гледам.
Аватар
ins-
Математик
 
Мнения: 1264
Регистриран на: 11 Яну 2010, 21:57
Рейтинг: 254

Re: C Programming (степенен ред)

Мнениеот maieutiquer » 18 Апр 2011, 23:04

Е нали факториел е сбора на всички цели числа, по-малки и равни на дадено цяло число?
Тука като въведа 5 се получава 15, при 6 се получава 21 и т. н.

Всъщност ето ми я програмката,
с която се занимавам в момента от личен интерес,
конзолен проект на win32,
просто ще я оставя тук:

Ъпдейт:
Код: Избери целия код
// KoreniNaUravnenie.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "string"

using namespace std;

long double a, b, c, D, x1, x2, x;


void exit()
{
     cout<<"Press any key to continue...";
     cin.ignore(0,'\n');
     _getch();
}

long double sqr(long double z)
{
   z = z*z;
   return z;
}

void GetValues()
{
   cout << "Vyvedi a: ";
   cin >> a ;
   cout << "Vyvedi b: ";
   cin >> b ;
   cout << "Vyvedi c: ";
   cin >> c;
   
   D = sqr(b) - 4*a*c; //namirame diskriminantata o6te tuk, ponezhe 6te se nalaga da go pravim vinagi
}

void kvadratnoUravnenie()
{
   GetValues();

   if (D > 0)
   {
      x1 = (-b - sqrt(D)) / (2*a);
      x2 = (-b + sqrt(D)) / (2*a);

      cout << "x1=" << x1 << endl
         << "x2=" << x2 << endl;
   }

   else if (D == 0)
   {
      x= (-b)/(2*a);
      cout << "x=" << x << endl;
   }

   else
   {
      cout << "D < 0 => Niama Reshenie" << endl;
   }

   
}

void bikvadratnoUravnenie()
{
   long double y1, y2, y;
   
   GetValues();

   if (D > 0)
   {
      y1 = (-b - sqrt(D)) / (2*a);
      y2 = (-b + sqrt(D)) / (2*a);
      
      if (y1 >= 0)
      {
         x1 = sqrt(y1); //vryshtame se kym polaganeto
         cout << "x1 = +- " << x1 << endl;
      }

      if (y2 >= 0)
      {
         x2 = sqrt(y2); //vryshtame se kym polaganeto
         cout << "x2 = +- " << x2 << endl;
      }

      if(y1 < 0 && y2 < 0)
      {
         cout << "y1 < 0; y2 < 0  => Niama reshenie" << endl; //ne prinadlezhat na D za x
      }


   }

   else if (D == 0)
   {
      y = -b / (2*a);
      if (y >= 0)
      {
      x = sqrt(y); //vryshtame se kym polaganeto
      cout << "x= +- " << x << endl;
      }
      else
      {
         cout << "D = 0;" << endl
            << "y < 0 => Niama reshenie" << endl;
      }
   }

   else
   {
      cout << "D < 0 => Niama reshenie" << endl;
   }
   
   
}

void infinityx()
{
   cout << "x e (-bezkrainost; " << x1 << " ) U ( " << x2 << " ; +bezkrainost)" << endl;
}

void noinfinityx()
{
   cout << "x e ( " << x1 << "; " << x2 << " )" << endl;
}

void kvadratnoNeravenstvo()
{
   string znak;
   
   GetValues();

   cout << "Izberi znak na neravenstvoto ( < ili > ) : " << endl;
   cin >> znak;

   x1 = (-b - sqrt(D)) / (2*a);
   x2 = (-b + sqrt(D)) / (2*a);

   if (znak == ">")
   {
      if (a > 0)
      {
         infinityx();
      }
      else
      {
         noinfinityx();
      }
   }
   else if (znak == "<")
   {
      noinfinityx();
   }
   else
   {
      cout << "Ne izbrahte znak." << endl;
   }

   
}

long double faktoriel()
{
   long double zadadena, k, rezult;
   k = 0;
   rezult = 0;
   
   cout << "Kolko fakturiel: " << endl;
   cin >> zadadena;

   while (k < zadadena)
   {
      k++;
      rezult = rezult + k;
   }
   return rezult;
}


int _tmain(int argc, _TCHAR* argv[])
{
   int choice;
   cout << "Izberi tip zadacha:" << endl
      << "1 - kvadratno uravnenie" << endl
      << "2 - bikvadratno uravnenie" << endl
      << "3 - kvadratno neravenstvo" << endl
      << "4 - faktoriel" << endl;
   cin >> choice;

   switch (choice)
   {
   case 1:
      kvadratnoUravnenie();
      break;
   case 2:
      bikvadratnoUravnenie();
      break;
   case 3:
      kvadratnoNeravenstvo();
      break;
   case 4:
      cout << faktoriel() << endl;
      break;
   default:
      exit();
      return 0;
   }

   exit();
   return 0;
}
Аватар
maieutiquer
Нов
 
Мнения: 41
Регистриран на: 13 Яну 2011, 15:31
Местоположение: Сливен
Рейтинг: 2

Re: C Programming (степенен ред)

Мнениеот ins- » 19 Апр 2011, 00:18

"Е нали факториел е сбора на всички цели числа, по-малки и равни на дадено цяло число? "
Не е.
Ако n e цяло, неотрицателно число, с n! се означава n-факториел.
n!=1.2.3...n
Примери:
1! = 1 = 1
2! = 1.2 = 2
5! = 1.2.3.4.5 = 120
(По определение 0!=1)
Аватар
ins-
Математик
 
Мнения: 1264
Регистриран на: 11 Яну 2010, 21:57
Рейтинг: 254


Назад към Друго



Кой е на линия

Регистрирани потребители: Google [Bot]

Форум за математика(архив)