Dokaze niekto vyriesit toto? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dokaze niekto vyriesit toto? – C / C++ – Fórum – Programujte.comDokaze niekto vyriesit toto? – C / C++ – Fórum – Programujte.com

 

Rado
~ Anonymní uživatel
45 příspěvků
25. 9. 2014   #1
-
0
-

Dobry den, mam len zakladnu snalost voblasi jazyka C++ a po viacerých neuspesnych pokusoch som sa rozhodol obratit na skutocnych odbornikov.

Zostavte program výpočtu funkcie sin x pomocou radu sin x = x-x3/3!+x5/5!-x7/7!-......,kde x je uhol zadaný v radiánoch cez klávestnicu.Nové členy radu pričítajte tak dlho, až bude posledný člen radu menší ako vami zvolené veľmi malé číslo eps zadané cez klávesnicu. Vypočítaný sin x zobrazte a porovnajte s hodnotou funkcie vyrátanej priamo.

Za pomoc vopred dakujem.

Nahlásit jako SPAM
IP: 176.24.3.–
25. 9. 2014   #2
-
0
-

Aplikace si vyžádá zadání x a eps.  Jedna možnost je členy počítat v cyklu, ukončovací podmínka cyklu je vypočtený člen menší než eps. Druhá možnost je člen počítat ve funkci a tu rekurzívně volat. Ukončovací podmínka rekurze je stejná jako u řešení s cyklem. pak necháš spočítat sin x pomocí funkce (asi bude v math.h) a oba výsledky zobrazíš, popř. stanovíš o kolik se liší (rozdíl). 

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:9987:82...–
Rado
~ Anonymní uživatel
45 příspěvků
25. 9. 2014   #3
-
0
-

#2 hlucheucho
Takto to ma byt?

 #include <cstdlib>
 #include <iostream>
 #include <stdio.h>
 #include <math.h>

 using namespace std;

 int factorial(int a);
 int n,b;
 int lngFract[20];
 int main(){

 system("PAUSE");

 int m,i,j;
 float z,y,x,sinx;
 printf("input a value for x :");
 scanf("%f",&x);
 printf("d= %f",x);

 system("PAUSE");

 b=1;
 n=1;
 j=3;
 m=2;
 i=1;
 sinx=0;

 while (i<5){
 if (i == 1)
 sinx = sinx + x;
 else
 {
 z = pow(x,m + 1);
 //printf("x= %f",z);
 n = factorial(j);
 //printf("n= %d",n);
 y = z/n;
 //printf("y= %f",y);
 m = m + 2;
 j = j + 2;
 sinx = sinx + y;
 //printf("sin%f=%f",x, sin(x));
 }
 ++i;
 }
 printf("sin%f=%f",x, sin(x));
 system("PAUSE");
 return EXIT_SUCCESS;
 //scanf_s("%f",&x); return 0;
 }

 int factorial(int a)
 {
 //printf("d= %d",n);
 if (b==1)
 {
 n =a;
 lngFract[b-1] = a;
 b++;
 }
 else
 {
 lngFract[b-1] = a;
 n = lngFract[b-1] * n;
 //printf("d= %d",n);
 b++;
 }
 if (a > 1)
 {
 factorial (a-1);
 }
 b=1;
 return n;
 }

Nahlásit jako SPAM
IP: 176.24.3.–
KIIV
~ Moderátor
+43
God of flame
25. 9. 2014   #4
-
0
-

Jelikoz to neni vlozeny jako kod a je to zcukly na paskvil bez odsazeni, tak to ani nebudu zkoumat...

Kazdopadne od oka je to podezrele moc dlouhy.. nejspis vsechno furt pocitas dokola znovu a znovu a cim dal vic iteraci... (proste to bude brutalne pomaly oproti tomu, jak se to da udelat poradne)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Rado
~ Anonymní uživatel
45 příspěvků
25. 9. 2014   #5
-
0
-

#4 KIIV
Ok teda sorac, mozes mi ukazat jak to spravit poradne? Dik

Nahlásit jako SPAM
IP: 176.24.3.–
25. 9. 2014   #6
-
0
-

1. Mocniny x se dají počítat jako součin. Všiml jsem si, že se používají liché mocniny. x^3 = x + x^2. x^5 = x^3 * x^2.... atd - tedy pokud se opravdu používají mocniny x. Z "prvotního" popisu zadání to nebylo zřejmé

2. Faktoriál je možné počítat také součinem. 3! = 1*2*3 ( = 6, asi by šel zadat jako počáteční hodnota proměnné).  5! = 3! *4*5 ... atd

3. Uniklo mi, kde si program vyžádá eps

4. Z proměnných potřebuješ:
 a) x a eps - zadané hodnoty
 b) i - řídící proměnná cyklu
 c) moc pro uložení poslední spočítané mocniny x a fak pro uložení posledního spočítaného faktoriálu
 d) zn - uložení mocniny (-1) - vytváří znaménko
 e) clen - proměnnou pro uložení členu
 f) a konečně proměnnou pro součtu členů

Pak stačí si "šikovně" rozebrat vzoreček pro výpočet, stanovit počáteční hodnoty proměnných a správně stanovit kroky prováděné v těle cyklu.

K připomínkám o formátování kódu se připojuji - je to nepřehledné.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:9987:82...–
KIIV
~ Moderátor
+43
God of flame
25. 9. 2014   #7
-
0
-

#5 Rado
abych nezapomel:

Mam to na 32 radku, z toho 6 prazdnejch, 5 vstup a vystup, jeden debug vystup, 8 radku s definicema a deklaracema promennejch a celkem 5 radku vypoctu + dva radky cyklus, jeden na konec mainu } a dva includy + using namespace std na dalsim...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
25. 9. 2014   #8
-
0
-

#1 Rado
Do pomocné proměnné si dáš x.

V každém kroku to vynásobíš -x*x/2/3, pak -x*x/4/5, -x*x/6/7, ... Čísla 2, 3, 4,... získáš postupnou inkrementací další proměnné.

Krok za krokem to budeš kumulovat do další proměnné - celkového součtu.

Skončíš ve chvíli, kdy absolutní hodnota v pomocné proměnné klesne pod eps.

Výsledek je v celkovém součtu.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Béďa
~ Anonymní uživatel
18 příspěvků
25. 9. 2014   #9
-
0
-

#8 Kit
 

MujSin(x):=block([a,z,i,j], 
    a: 0,
    z: x,
    i: 1,
    f: 1,
    while is(abs(a-z)>(1e-14)) do (
        a: z,
        j: 2*i,
        f: f*(j)*(j+1),
        z: z+(-1)^i*x^(j+1)/f,
        i: i+1
    ), z
);

Tohle funguje bez chyby, přepiš si to do Céčka..., funkce vrací výsledek z proměnné z

Nahlásit jako SPAM
IP: 109.238.215.–
Béďa
~ Anonymní uživatel
18 příspěvků
25. 9. 2014   #10
-
0
-

#9 Béďa
 

MujSin(x):=block([a,y,z,i,f], 
    a: 1,
    z: x,
    y: x*x,
    i: 2,
    f: 1,
    while is(abs(a)>(1e-14)) do (        
        f: f*(i)*(i+1),
        x: -x*y,
        a: x/f,
        z: z+a,
        i: i+2
    ), z
)$


A nebo takhle - nepoužívá umocňování ...

Nahlásit jako SPAM
IP: 109.238.215.–
Béďa
~ Anonymní uživatel
18 příspěvků
25. 9. 2014   #11
-
0
-

#10 Béďa
 

MujSin(x):=block([y,z,i],    
    y: x*x,
    z: x,
    i: 2,
    while is(abs(x)>(1e-14)) do ( 
        x: -x*y/((i)*(i+1)),
        z: z+x,
        i: i+2
    ),z
)$


Stále tam byly zbytečnosti, tak jsem to promazal ... A pořád to funguje :-)

Nahlásit jako SPAM
IP: 109.238.215.–
Rado
~ Anonymní uživatel
45 příspěvků
25. 9. 2014   #12
-
0
-


Dakujem za vsetky prispevky, ked to vidim tymto spôsobom tak je to really simple :)

Nahlásit jako SPAM
IP: 176.24.3.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý