Witam
Mam takowy problem, że przy wprowadzaniu przy użyciu scanf_s i cin wychodza inne wyniki obliczeń. Czym to jest spowodowane?
Bo mój wykłądowca uczy nas pisać scanf_s, printf itd jak ja sie w własnym zakresie ucze to używam cin cout? Z tego co rozumiem to te scanf prinf to jest stara składnia C a cin cout c++, ale nie rozumiem jakie to ma znaczenie dla wyników obliczeń?
0
1
Pokaż kod. Nie powinno być żadnej różnicy, zatem nie w tym tkwi problem.
0
Althorion napisał(a):
Pokaż kod. Nie powinno być żadnej różnicy, zatem nie w tym tkwi problem.
#include <iostream>
#include <math.h>
#include <cstdlib>
using namespace std;
float fun(float x)
{
float wynik;
wynik = cos(x) - x;
return wynik;
}
float fun_pochodna(float x)
{
float pochodna;
pochodna = -sin(x) - 1;
return pochodna;
}
float x_bisec;
#include "bisekcja.h"
void main(void)
{
float a, b, eps, blad_b;
float x_si0, x_si1, x_si2, blad_si, x_st0, x_st1, blad_st;
int itera_b, itera_si, itera_st, i, ieps;
printf("Podaj poczatek i koniec obszaru calkowania: a,b\n");
//scanf_s("%f,%f", &a, &b);
cin >> a >> b;
for (ieps = -3; ieps >= -20; ieps--)
{
eps = pow(2.0, ieps);
itera_b = bisec(a, b, eps);
blad_b = fabs(fun(x_bisec));
x_si0 = a;
x_si1 = b;
for (i = 0; i < 1000; i++)
{
x_si2 = x_si1 - fun(x_si1) * (x_si1 - x_si0) / (fun(x_si1) - fun(x_si0));
if (fabs(fun(x_si2)) <= eps && fabs(x_si2 - x_si1) <= eps)
break;
x_si0 = x_si1;
x_si1 = x_si2;
}
itera_si = i + 1;
blad_si = fabs(fun(x_si2));
x_st0 = (a + b) / 2.0;
for (i = 0; i < 1000; i++)
{
x_st1 = x_st0 - fun(x_st0) / fun_pochodna(x_st0);
if (fabs(fun(x_st1)) <= eps && fabs(x_st1 - x_st0) <= eps)
break;
x_st0 = x_st1;
}
itera_st = i + 1;
blad_st = fabs(fun(x_st1));
printf("Dokladnosc epsylon: %f\n", eps);
printf("Metoda bisekcji: %f\t %d\t %f\n", x_bisec, itera_b, blad_b);
printf("Metoda siecznych: %f\t %d\t %f\n", x_si2, itera_si, blad_si);
printf("Metoda stycznych: %f\t %d\t %f\n", x_st1, itera_st, blad_st);
printf("\n");
}
system("pause");
}
//--------------------------------------------------------------------------
// Funkcja rozwiazuje rownanie fun(x)=0 metoda bisekcji
// a,b to granice przedzialu, w ktorym poszukuje sie pierwiastka
// UWAGA: musi byc spelniony warunek: fun(a)*fun(b) <= 0
// Funkcja zwraca poszukiwany pierwiastek okreslony z dokladnoscia "eps"
// Wartosc pierwiastka jest podstawiana pod zmienna globalna x_bisec
//--------------------------------------------------------------------------
int bisec(float a, float b, float eps)
{
int i;
float xa,xb,xc,fa,fb,fc;
xa = a;
xb = b;
fa = fun(a);
fb = fun(b);
if(fa*fb>=0) return 0;
for(i=0;i<1000;i++)
{
xc=(xa+xb)/2;
fc=fun(xc);
if(fa*fc<=0.)
{
xb = xc;
fb = fc;
}
else
{
xa = xc;
fa = fc;
}
if(fabs(fc)<=eps && fabs(xb-xc)<=eps) break;
}
x_bisec = xc;
return i+1;
}
w momencie jak zmieniam cin na scanf to zmieniają się wyniki.
1
Przecinek w scanf
oznacza, że musisz go wprowadzić w inpucie. Robisz to?
0
O jezu, a ja się zastanawiam co tu jest nie tak z kodem jak to ze mną jest coś nie tak :D absolutnie zapomniałem o tym przecinku tam. Dziekuję wielkie za pomoc. :)