Różne wyniki dla różnych metod wprowadzania

0

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ń?

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. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1