problem z kompilacja
Ostatnio zmodyfikowano 2008-12-01 19:54
emdzej Temat założony przez niniejszego użytkownika |
problem z kompilacja » 2008-11-29 18:46:59 program zle liczy mi arctg nie moge znalezc bledu z gory wielkie dzieki za pomoc Tu jest polecenie do programu: http://www.konto4.mordy.pl/zadanie.jpga tu kod: #include <stdio.h> #include <math.h> #include <ctype.h> #include <stdlib.h>
#define ATAN_MAX 1 #define ATAN_MIN -1
#define MIN_KROK 0.0001 #define MAX_KROK 2
#define MIN_DOKLADNOSC 0.0001 #define MAX_DOKLADNOSC 99.01
#define KEY_BUF_SIZE 100
#define EPSILON 0.1
#define BLADP 0.273239 #define WART_ATAN 0.785398
#define KROPKA '.' #define MINUS '-' #define ENTER '\n' #define ZERO 0
double wczytaj_wartosc( const char str[], double min, double max ) { char bufor[ KEY_BUF_SIZE ]; double wynik; int i = 0; int ok =- 1; int bad_num; int ilosc_kropek; while( ok != 1 ) { bad_num = 0; ilosc_kropek = 0; for( i = 0; i < KEY_BUF_SIZE; i++ ) bufor[ i ] = 0; printf( "%s", str ); fflush( stdin ); fgets( bufor, KEY_BUF_SIZE, stdin ); for( i = 0; i < KEY_BUF_SIZE; i++ ) { if( isdigit( bufor[ i ] ) == 0 ) { switch( bufor[ i ] ) { case KROPKA: if( i == 0 ) bad_num = 1; else if( bufor[ i + 1 ] == ENTER ) bad_num = 1; else ilosc_kropek++; break; case ZERO: if( i == 0 ) bad_num = 1; break; case ENTER: if( i == 0 ) bad_num = 1; break; case MINUS: if( i != 0 ) bad_num = 1; if( bufor[ i + 1 ] == KROPKA ) bad_num = 1; if( bufor[ i + 1 ] == ENTER ) bad_num = 1; break; default: bad_num = 1; } } } if( ilosc_kropek > 1 ) bad_num = 1; if( bad_num == 1 ) { puts( "Wprowadziles bledne dane!" ); continue; } wynik =( double ) atof( bufor ); if(( wynik <= min ) ||( wynik > max ) ) { puts( ">>Podana wartosc wykracza poza zakres przyjmowanych liczb." ); continue; } ok = 1; } return wynik; }
int atan_przyblizone( double dokladnosc ) { int wynik = 0; double blad =( 1 -( dokladnosc / 100 ) ); int i = 0; double w_blad = BLADP; double wart_szeregu = 0; while( blad >= w_blad ) { ++i; wart_szeregu += fabs(( pow( - 1, i ) /(( 2 * i ) + 1 ) ) ); w_blad =(( fabs( wart_szeregu - WART_ATAN ) ) / WART_ATAN ); } wynik = i; return wynik; }
double policz_atan_z_szeregu( double x, double dokladnosc ) { double wynik = 0; double wartosc_x = x; int i = 0; int ilosc_krokow; ilosc_krokow = atan_przyblizone( dokladnosc ); for( i; i <= ilosc_krokow; i++ ) { wynik +=(( pow( - 1, i ) ) /( 2 * i + 1 ) ) /( pow( wartosc_x, 2 * i + 1 ) ); } return wynik; }
void policz_przedzial( double x_poczatkowy, double x_koncowy, double krok, double dokladnosc ) { double ilosc_iteracji =( fabs( x_poczatkowy - x_koncowy ) ) / krok; double krok_war = 0; int max_iter =( int ) floor( ilosc_iteracji ); int i = 0; if( x_poczatkowy - x_koncowy == 0 ) max_iter = 0; printf( "\n Wartosc X\t Wartosc Funkcji arctg(x)\n" ); for( i; i <= max_iter; i++ ) { printf( " %f\t %f\n", x_poczatkowy + krok_war, policz_atan_z_szeregu( x_poczatkowy + krok_war, dokladnosc ) ); krok_war += krok; } }
int main() { double x_poczatkowy, x_koncowy, krok, dokladnosc; double temp; char flaga = 't'; puts( "\n\nMichał Rowicki\n" ); puts( "Program do obliczania wartosci arcusa tangensa w podanym przedziale." ); puts( "Uwaga: im wyzszy procent dokladnosci tym precyzyjniej podany zostanie wynik." ); puts( "Program zczytuje wszelkie znaki np.: spacje,ctr-e i nie dopuszcza ich stosowania podczas wprowadzania danych" ); puts( "Program przyjmuje liczby jedynie w postaci dziesietnej innych nie rozpozna. Liczby wymierne nalezy podawac oddzielajac je kropka\n\n" ); while( flaga != 'n' ) { x_poczatkowy = wczytaj_wartosc( "Podaj wartosc x poczatkowego z przedzialu (-1;1>: ", ATAN_MIN, ATAN_MAX ); x_koncowy = wczytaj_wartosc( "Podaj wartosc x koncowego z przedzialu (-1;1>: ", ATAN_MIN, ATAN_MAX ); if( x_poczatkowy > x_koncowy ) { temp = x_poczatkowy; x_poczatkowy = x_koncowy; x_koncowy = temp; } krok = wczytaj_wartosc( "Podaj krok z przedzialu: (0.0001;2>: ", MIN_KROK, MAX_KROK ); if( krok >( x_koncowy - x_poczatkowy ) ) { krok = x_koncowy - x_poczatkowy; printf( "Podany krok jest zbyt duzy i zostanie zmniejszony do maksymalnego mozliwego:\n>>%f\n", krok ); } dokladnosc = wczytaj_wartosc( "Podaj dokladnosc obliczen z przedzialu: (0.0001;99>: ", MIN_DOKLADNOSC, MAX_DOKLADNOSC ); policz_przedzial( x_poczatkowy, x_koncowy, krok, dokladnosc ); flaga = 'x'; while( flaga != 't' && flaga != 'n' ) { printf( "\nCzy chcesz wyjsc z programu? ['t'=tak/'n'=nie]: " ); scanf( "%c", & flaga ); fflush( stdin ); } printf( "\n\n" ); } return 0; }
|
|
lynx |
» 2008-11-29 22:54:00 Popraw ten post tam gdzie jest kod na : [ code src="C++"]...kod...[/code]
/edit1: Sorry że bawię się moderatora, ale taki kod jest ciężko zrozumieć, i brzydko wygląda. |
|
EdekMaestro |
» 2008-12-01 19:54:13 Witam, Jeden znaczek a takie problemy :) Bylo: wynik +=(( pow( - 1, i ) ) /( 2 * i + 1 ) ) /( pow( wartosc_x, 2 * i + 1 ) ); Powinno byc: wynik +=(( pow( - 1, i ) ) /( 2 * i + 1 ) ) *( pow( wartosc_x, 2 * i + 1 ) ); Pozdr. |
|
« 1 » |