Strona 1 z 2

Programik w C

: 21 paź 2007, o 11:53
autor: profesorq
Mam napisać program obliczający z zadaną dokładnością n wartość funkcji \(\displaystyle{ y=exp(-x^2)}\) w zadanym punkcie x korzystając z rozwinięcia w szereg:
\(\displaystyle{ exp(-x^2)=1-x^2+ \frac{x^4}{2!}-\frac{x^6}{3!} + \frac{x^8}{4!} - ....+\frac{(-1)^n x^{2n}}{n!}}\) , n - całkowite nieujemne

Ponadto program powinien obliczyć wartość błedu względnego w stosunku do wartości uzyskanej przy pomocy standardowej funkcji bibliotecznej języka C. Formuła błedu:
\(\displaystyle{ blad=\frac{y-yo}{yo} *100%%}\)%,
gdzie y-wartość obliczona przy pomocy szeregu, yo- wartość obliczona przy pomocy funkcji standardowej.

Programik w C

: 21 paź 2007, o 12:38
autor: aNom4Ly
Napisałem dla Ciebie programik - jeden minus - dla dużych wartości n nie obliczy silni (typ integer nie zmieści bardzo (ale to bardzo) dużych liczb). Jesli tak sie zdarzy, to zamiast liczby otrzymasz na ekranie: #IND

Oto program (pisany w Dev-C++):

#include
#include
#include
using namespace std;

int n,silnia;
float x,y,y_funkcja,blad;

int main()
{

coutx;
coutn;

if (n

Programik w C

: 21 paź 2007, o 12:45
autor: luka52
aNom4Ly, plik nagłówkowy iostream nie należy do standardowej biblioteki C...

Programik w C

: 21 paź 2007, o 15:28
autor: profesorq
mógłbym to ktoś tak zmienić żeby było zgodne z poleceniem, bardzo was proszę

jak to można łatwo zamienić?

Programik w C

: 21 paź 2007, o 16:00
autor: aNom4Ly
Proszę, teraz jest beż użycia iostream:

#include
#include

int n,silnia;
float x,y,y_funkcja,blad;

int main()
{

printf("
Podaj wartosc x: "); scanf("%f", &x);
printf("
Podaj wartosc n: "); scanf("%d", &n);

if (n

Programik w C

: 21 paź 2007, o 17:44
autor: profesorq
jeszcze mam takie może banalne pytanie (zaczynam programowanie w C) jak najlepiej skompilować taki program skoro mam windowsa xp a to musi chodzic na linuxie/unixie.
mam zainstalowane takei programy:
winscp
putty
cygwin
openssh
jakie komendy pisać i w jakim programie?

Programik w C

: 21 paź 2007, o 17:54
autor: soku11
Jak mi sie zdaje to sa programy TYLKO do laczenia sie ssh z kompami w lab, a nie do kompilowania programow pod unixa. Ja robie wszystko w DEV-Cpp, zapisuje jako *.c i kompiluje pod wind. Teraz sobie rowniez wyslalem projekt na maila ktorego odbiore podczas laborek i tam sprawdze ewentualne bledy podczas kombilacji.

BTW. Ostatnio mialem laboratoria w 09 i tam nie dzialaly standardowe funkcje z math.h typu sin, exp, log.... Nawet prowadzacy nie wiedzial co jest POZDRO

Programik w C

: 21 paź 2007, o 18:14
autor: profesorq
a ty jakie masz zadanie?
a myślisz że jak skompiluje w dev-cpp na windowsie to bedzie chodzic na unixie?

ale to zawsze nie działają czy akurat tego dnia?

Programik w C

: 21 paź 2007, o 18:31
autor: luka52
a myślisz że jak skompiluje w dev-cpp na windowsie to bedzie chodzic na unixie?
Binarny plik z windowsa na pewno natywnie na systemach uniksopodobnych się nie uruchomi.
Jeżeli jednak program korzysta jedynie ze standardowej biblioteki C to powinien się bezproblemów skompilować na każdej platformie wyposażonej w odpowiednie narzędzia programistyczne (tj. kompilator).

Programik w C

: 21 paź 2007, o 18:35
autor: profesorq
ten program chyba coś do końca nie działa poprawnie mógłby go ktoś wnieść jakieś poprawki?

ja zrobiłem troszkę poprawek i w tej chwili wygląda tak:
to jeszcze nie jest dobra wersja, dla x i n rownych 1,2,3,4 raczej wychodzi prawidłowo ale pozniej to juz jest cos nie tak.

Proszę o próbę jakiś popraw

#include
#include

int n,i,k;
double silnia;
float x,y,y_funkcja,blad;

int main()
{

printf("
Podaj wartosc x: "); scanf("%f", &x);
printf("
Podaj wartosc n: "); scanf("%d", &n);

if (n

Programik w C

: 22 paź 2007, o 21:10
autor: Undre
soku11 pisze:Jak mi sie zdaje to sa programy TYLKO do laczenia sie ssh z kompami w lab, a nie do kompilowania programow pod unixa.
No odnośnie cygwin to chyba nie do końca. Właśnie sobie zresztą instaluję cygwin i do wyboru wśród packages wybrałem gcc ;]
W sumie jest nawet kde, całość się zainstaluje to zobaczymy co to za cudo, może nawet taka namiastka linuxa na windows

Programik w C

: 23 paź 2007, o 00:02
autor: profesorq
no właśnie raczej Undre masz racje
cygwin ma duże możliwości tylko że trzeba odpowiednie pakiety zainstalować.

a co do programu to jak zrobić żeby jak ktoś wpisuje liczbę n nie całkowitą napisało komunikat niepoprawna liczba a nie tak jak teraz się program wyłącza?

Programik w C

: 23 paź 2007, o 02:55
autor: kadiii
Możesz na przykład pobierać liczbę n jako zmiennoprzecinkowa np. float i potem zrobić pętlę

Kod: Zaznacz cały

float n=1.1;//1.1 żeby na początku weszło w pętlę
while(n-(int)n!=0)
{
  scanf("%f",&n);
  printf("n musi być calkowite-probuj do skutku :)
");
}
A swoj ą drogą fajny jest ten tekst:
Ja robie wszystko w DEV-Cpp, zapisuje jako *.c i kompiuje pod wind. Teraz sobie rowniez wyslalem projekt na maila ktorego odbiore podczas laborek i tam sprawdze ewentualne bledy podczas kombinacji.
Wiem, że to literówki, ale w jednym zdaniu...? Pozdrawiam

Programik w C

: 24 paź 2007, o 16:52
autor: profesorq
a mógłby ktoś ten program przetestować bo wg mnie dla x=5 i (n=50 lub n=60) sa takie same wyniki (dane przykaldowe)

Programik w C

: 24 paź 2007, o 22:01
autor: smiechowiec
Przetestowałem ten program na kompilatorze gcc używanym przez Dev-cpp i wyniki dla podanych przez Ciebie liczb nie pokrywają się.
Wynika to z przekroczenia zakresów liczb 50! czy 5 do potęgi 100 są poza zakresem podstawowych typów i po przekręceniu się liczby dają wyniki raczej losowe, w każdym razie nie wiarygodne.
Dla x = 2
y dla dokladnosci n= 50 wynosi: 0.018316
y obliczone z funkcji e^(-4) wynosi: 0.018316
Blad wynosi: 0.000000

Dla x = 3
y dla dokladnosci n= 50 wynosi: 0.000123
y obliczone z funkcji e^(-9) wynosi: 0.000123
Blad wynosi: 0.000000

Dla x = 4
y dla dokladnosci n= 50 wynosi: 0.000013
y obliczone z funkcji e^(-16) wynosi: 0.000000
Blad wynosi: 11251.745802
widać że wynik już jest poza dopuszczalnym zakresem

Dopisałem do kodu wypisywanie kolejnych wyrazów szeregu, aby łatwiej można było analizować czy wystąpiło przepełnienie.

Kod: Zaznacz cały

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


long double fsilnia(int n) {
  long double wynik = 1.0;
  for(int i = 2; i <= n; i++)
	wynik = wynik * i;
  return wynik;
}

double fszereg(double x, int n) {
  double wynik = 1;
  long double felement = 0;
  int bznak = 1;
  printf("*** Obliczenia wartosci elementow szeregu *** 
");
  for(int i = 1; i <= n; i++) {
	felement = (long double) (bznak = -bznak) * ( pow(x, 2 * i) / fsilnia(i) );
	wynik = wynik + felement;
	printf("%2i(%lf^%i)/%g = %g
", bznak, x, 2 * i, (double) fsilnia(i), (double) felement );
  }
  printf("*** *** ***
");
  return wynik;
}

int main() {
  int n;
  double x, y, y_funkcja, blad;
  char s[80] = "zmienna pomocnicza";

  printf("
Podaj wartosc x: "); scanf("%lf", &x);
  printf("
Podaj wartosc n: "); scanf("%d", &n);

  if ( n < 0) {
	printf("
Wartosc jest ujemna. Podaj nieujemna wartosc n: "); 
    scanf("%d", &n);
  }

  y = fszereg(x, n);
  y_funkcja = exp( - (x * x) ); 
  blad = (fabs((y - y_funkcja) / y_funkcja) * 100);

  printf("
 y dla dokladnosci n= %d wynosi: %lf", n, y);
  printf("
 y obliczone z funkcji e^(-%g) wynosi: %lf", x * x, y_funkcja);
  printf("
 Blad wynosi: %lf ", blad);
  puts("
Wcisnij Enter, aby zakonczyc");
  gets(s);
  return 0;
}