Program niepoprawnie wypisuje wyniki

0
int _tmain(int argc, _TCHAR* argv[])

{

        double x,y;

        for (x=0.1; x<0.2; x+=0.005)
        { 
            y=(1.2*exp(x))/(1+cos(exp(x))) ;
            cout << x << "\t" << y << endl;

        }

        for ((x>=0.2); x<0.4; x+=0.005)
        {
            y=pow(x,cos(x));

            cout << x << "\t" << y << endl;

        } 

        for ((x>=0.4); (x<=0.7); x+=0.005)
        {
            y=(0.5*exp(x))/(0.7-sin(exp(x))) ;

            cout << x << "\t" << y << endl;

        }

            system("pause");
    return 0;
        }

Witam mam 3 pytanie jeśli ktoś był by skłonny odpowiedzieć był bym bardzo wdzięczny.

  1. Mam problem z powyższym kodem mianowicie po skompilowaniu programu wypisuje mi wyniki tylko od 0.1 do 0.695 a nie wypisuje 0.7 wie ktoś gdzie może wynikać problem ?
  2. Nie mogę sobie poradzić w jaki sposób mogę otrzymać takie wypisanie wyników aby samej górze była podana zmienna x a pod nią wszystkie wartości i obok zmienna y i pod nią wartości zależne od tego x.
  3. W jaki sposób mogę uzyskać aby wszystkie liczby miały taką samą długość tzn aby przy wypisaniu wyników nie wypisywało 0.6 oraz 0.695 tylko żeby wypisało 0.600 oraz 0.695

Przepraszam za tak proste zapewne pytania ale nie mogę nigdzie znaleźć na nie odpowiedzi;

dodanie znacznika <code class="c"> - @furious programming

2

Ad 2,3:

#include <iomanip>
...
cout << fixed << setprecision(3) << setw(8) << x << fixed << setprecision(3) << setw(10) << y << endl;

Ad 1. Chodzi o to że 0.005 nie da się zapisać dokładnie w systemie binarnym tak samo jak 1/3 nie da się zapisać dokładnie w systemie dziesiętnym (ma się na myśli w skończonej ilości znaków).
Wiec ostatnią wartość która ci się pokazuje to nie 0.695 tylko np 0.6950000000000063 więc kolejnym krokiem jest odpowiednio 0.7000000000000063 co oczywiście nie spełnia warunku x<=0.7
Najprostsze rozwiązanie: x<0.7001
Poprawne rozwiązanie wyliczanie x parametryczne: x=0.1+i*0.005; gdzie i jest zmienną całkowitą:

double x=0,y;
for(int i=0;(x=0.1+i*0.005)<0.7001;++i)
  {
   if(x<=0.2) y=(1.2*exp(x))/(1+cos(exp(x))) ;
   else if(x<=0.4) y=pow(x,cos(x));
   else y=(0.5*exp(x))/(0.7-sin(exp(x))) ;
   cout << fixed << setprecision(3) << setw(8) << x << fixed << setprecision(3) << setw(10) << y << endl;
  }
2

1) http://edu.i-lo.tarnow.pl/inf/utils/001_2008/0119.php

for ((x>=0.2); x<0.4; x+=0.005)

(x>=0.2) nic nie robi, nie do tego służy to miejsce w pętli for. Być może chcesz coś takiego:

for(; x >= 0.2 && x < 0.4; x += 0.005)

Ale akurat w tym przypadku ten warunek x>=0.2 będzie naturalnie spełniony, więc jest zbędny.

0

Jeszcze jedno pytanie aby w takiej samej formie wyświetliły się wyniki w pliku tekstowym wystarczy, że zapisze to tak

int _tmain(int argc, _TCHAR* argv[])
{   fstream file;
    file.open("wyniki",ios_base::out|ios_base::trunc);
    double x,y;
    int i; // i jest liczba calkowita
for(i=0;(x=0.1+i*0.005)<0.7001;++i) 
  {
   if(x<0.2) y=(1.2*exp(x))/(1+cos(exp(x))) ; 
   else if(x<0.4) y=pow(x,cos(x));      
   else y=(0.5*exp(x))/(0.7-sin(exp(x))) ;
   cout << fixed << setprecision(3) << setw(8) << x << fixed << setprecision(3) << setw(10) << y << endl; 
   file << fixed << setprecision(3) << setw(8) << x << fixed << setprecision(3) << setw(10) << y << endl;

}
file.close();
system("pause");
    return 0;
}

Czy można to zrobić jeszcze jakoś inaczej ?

1
pargizon napisał(a):

Jeszcze jedno pytanie aby w takiej samej formie wyświetliły się wyniki w pliku tekstowym wystarczy, że zapisze to tak
Nie jesteś w stanie uruchomić i sprawdzić?

pargizon napisał(a):

Czy można to zrobić jeszcze jakoś inaczej ?

Tak:

ofstream file("wyniki.txt");
0

Dzięki ! Źle trochę sformułowałem to pytanie chodziło mi o tą drugą część wiedziałem, że ta pierwsza część działa bo to sprawdziłem lecz musiał być inny sposób na zapisanie tego aby kod był bardziej czytelny.

Przepraszam za kłopot i pozdrawiam !:)

1

Jeżeli o to chodzi to zrób funkcje:

void showpoint(ostream &sout,double x,double y) { sout << fixed << setprecision(3) << setw(8) << x << fixed << setprecision(3) << setw(10) << y << endl; }

i użyj ją dwukrotnie w myśl zachowania zasady DRY

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