Programik w C

profesorq
Użytkownik
Użytkownik
Posty: 384
Rejestracja: 12 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: wawa
Podziękował: 77 razy
Pomógł: 1 raz

Programik w C

Post autor: profesorq » 21 paź 2007, o 11:53

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.
Rekrutacja Instytut Matematyczny, Uniwersytet Wrocławski (gif)

Awatar użytkownika
aNom4Ly
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 5 sty 2007, o 19:08
Płeć: Mężczyzna
Lokalizacja: Gliwice
Pomógł: 10 razy

Programik w C

Post autor: aNom4Ly » 21 paź 2007, o 12:38

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

luka52
Gość Specjalny
Gość Specjalny
Posty: 8602
Rejestracja: 1 maja 2006, o 20:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 47 razy
Pomógł: 1817 razy

Programik w C

Post autor: luka52 » 21 paź 2007, o 12:45

aNom4Ly, plik nagłówkowy iostream nie należy do standardowej biblioteki C...

profesorq
Użytkownik
Użytkownik
Posty: 384
Rejestracja: 12 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: wawa
Podziękował: 77 razy
Pomógł: 1 raz

Programik w C

Post autor: profesorq » 21 paź 2007, o 15:28

mógłbym to ktoś tak zmienić żeby było zgodne z poleceniem, bardzo was proszę

jak to można łatwo zamienić?

Awatar użytkownika
aNom4Ly
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 5 sty 2007, o 19:08
Płeć: Mężczyzna
Lokalizacja: Gliwice
Pomógł: 10 razy

Programik w C

Post autor: aNom4Ly » 21 paź 2007, o 16:00

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

profesorq
Użytkownik
Użytkownik
Posty: 384
Rejestracja: 12 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: wawa
Podziękował: 77 razy
Pomógł: 1 raz

Programik w C

Post autor: profesorq » 21 paź 2007, o 17:44

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?

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1822 razy

Programik w C

Post autor: soku11 » 21 paź 2007, o 17:54

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
Ostatnio zmieniony 26 paź 2007, o 18:52 przez soku11, łącznie zmieniany 1 raz.

profesorq
Użytkownik
Użytkownik
Posty: 384
Rejestracja: 12 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: wawa
Podziękował: 77 razy
Pomógł: 1 raz

Programik w C

Post autor: profesorq » 21 paź 2007, o 18:14

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?

luka52
Gość Specjalny
Gość Specjalny
Posty: 8602
Rejestracja: 1 maja 2006, o 20:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 47 razy
Pomógł: 1817 razy

Programik w C

Post autor: luka52 » 21 paź 2007, o 18:31

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

profesorq
Użytkownik
Użytkownik
Posty: 384
Rejestracja: 12 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: wawa
Podziękował: 77 razy
Pomógł: 1 raz

Programik w C

Post autor: profesorq » 21 paź 2007, o 18:35

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

Awatar użytkownika
Undre
Gość Specjalny
Gość Specjalny
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

Programik w C

Post autor: Undre » 22 paź 2007, o 21:10

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

profesorq
Użytkownik
Użytkownik
Posty: 384
Rejestracja: 12 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: wawa
Podziękował: 77 razy
Pomógł: 1 raz

Programik w C

Post autor: profesorq » 23 paź 2007, o 00:02

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?

Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

Programik w C

Post autor: kadiii » 23 paź 2007, o 02:55

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

profesorq
Użytkownik
Użytkownik
Posty: 384
Rejestracja: 12 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: wawa
Podziękował: 77 razy
Pomógł: 1 raz

Programik w C

Post autor: profesorq » 24 paź 2007, o 16:52

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)

smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

Programik w C

Post autor: smiechowiec » 24 paź 2007, o 22:01

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;
}

ODPOWIEDZ