Program w C++ (Funkcja)

piasektt
Użytkownik
Użytkownik
Posty: 195
Rejestracja: 14 paź 2007, o 20:59
Płeć: Mężczyzna
Lokalizacja: MM
Podziękował: 29 razy

Program w C++ (Funkcja)

Post autor: piasektt »

Witam
Obliczyć :
\(\displaystyle{ t=\frac{\overline{x}-n}{S}}\)

gdzie \(\displaystyle{ \overline{x}=\frac{1}{n}\sum_{i=1}^{n} x_{i}}\) , \(\displaystyle{ S=\sqrt{\frac{1}{n}\sum_{i=1}^{n} (x_{i}-\overline{x})^{2}}}\) , \(\displaystyle{ x_{i} i=1,2,...,n.}\)
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

Program w C++ (Funkcja)

Post autor: kadiii »

A w czym tu widzisz problem. No chyba, że nie potrafisz programować, ale wtedy odsyłam do jakiegoś kursu C++. Jeśli jednak znasz podstawy to poprostu obliczasz sobie te wartości. Masz dane n i zbiór x1,...,xn, który może być np. reprezentowany przez tablicę z danymi wartościami. Sumowanie wykonujesz oczywiście w pętli. Pozdro
piasektt
Użytkownik
Użytkownik
Posty: 195
Rejestracja: 14 paź 2007, o 20:59
Płeć: Mężczyzna
Lokalizacja: MM
Podziękował: 29 razy

Program w C++ (Funkcja)

Post autor: piasektt »

Właśnie zaczynam się uczyć programowania i dostałem do zrobienia taki program, ale nie wiem jak się za to zabrać, jak np wyliczyć S?
Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

Program w C++ (Funkcja)

Post autor: Dumel »

sumujesz wszystko w pętli, dzielisz przez n, a pierwiastek uzyskujesz za pomocą funkcji sqrt() z biblioteki
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

Program w C++ (Funkcja)

Post autor: kadiii »

Żebyś wiedział jak zacząć;

Kod: Zaznacz cały

wyrażenie=0;
for(i=1;i<=n;i++)    // <-powoduje zwiększanie się wartości zmiennnej iteracyjnej i od 1 do n
 wyrażenie+=x[i];   // <-gdzie x[i] to i-ta wartość
czyli w zmiennej wyrażenie będziesz miał sumę elementów tablicy x, czyli twoich wartości xi. Teraz tą wartością zmiennej posługujesz się w dalszych obliczeniach(np. dzielisz przez n). Teraz już chyba kłopotu być nie powinno
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Program w C++ (Funkcja)

Post autor: matshadow »

Kod: Zaznacz cały

#include <iostream>
#include <cmath>
using namespace std;

main()
{
      ios_base::sync_with_stdio(0);
      double a=0,suma,t,S;
      int n;
      long long *tab;
      tab=new long long [n+1];
      printf("Wczytaj n: ");
      cin>>n;
      for(int i=1;i<=n;i++)
      {
        cin>>tab[i];
        a+=tab[i];
      }
      a/=n;
      suma=S=t=0;
      for(int i=1;i<=n;i++)
       suma=suma+((tab[i]-a)*(tab[i]-a));
      suma/=n;
      S=sqrt(suma);
      if(S==0)
        printf("S=0, nie mozna dzielic przez zero!
");
      else
      {
          t=(a-n)/S;
          printf("t rowna sie (zaokraglone do 3 miejsc po przecinku) %.3lf
",t);
      }
}
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

Program w C++ (Funkcja)

Post autor: kadiii »

Do matshadow, po co wklejasz pełny kod jeśli pojawia się wskazówka, która może wystarczyć i do tego umożliwi element samodzielności w rozwiązaniu, dla osoby, która sie tego dopiero uczy. A jak już bardzo chciałeś się wykazać i wyręczyć autora tematu to trzaba było podać bezbłedne źródło.
Wrzucam poprawną wersję, choć na pewno dla piasektt byłoby lepiej gdyby doszedł do tego sam, więcej się wtedy nauczy.

Kod: Zaznacz cały

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
 int n,i;
 cin>>n;
 double t,a=0,*x=new double[n];
 for(i=0;i<n;i++) cin>>x[i];
 //^^^To sa dane
 for(i=0;i<n;i++) a+=x[i];
 a/=n;
 for(i=0;i<n;i++) t=pow(x[i]-a,2);
 if(!sqrt(t/n)) cout<<"Odchylenie równe 0, t nieokreslone"; //dodałem negację bo sam zapomniałem ;)
 else{
  t=(a-n)/sqrt(t/n); // podstawienie do wzoru t=(a-n)/S
  cout<<t;
 }
 return 0;
}
Ostatnio zmieniony 1 maja 2008, o 14:05 przez kadiii, łącznie zmieniany 3 razy.
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Program w C++ (Funkcja)

Post autor: matshadow »

Hmm masz racje, niepotrzebnie wklejałem. Ale jak już mnie poprawiasz, to mi powiedz gdzie mam źle, bo ja błędu nie widzę w moim programie W twoim natomiast nie działa gdy wpiszesz 1 a potem 7
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Program w C++ (Funkcja)

Post autor: soku11 »

Zapewne chodzi o ten fragment kodu:

Kod: Zaznacz cały

int n;
long long *tab;
tab=new long long [n+1];
printf("Wczytaj n: ");
cin>>n; 
Najpierw tworzysz tablice, a pozniej pytasz o jej rozmiar... Nawet jesli takie bylo zamierzenie, to w tym przypadku tworzy ci sie tablica o teoretycznie losowym wymiarze (nie wiadomo co ma zmienna n w sobie). kadiii, to poprawil poprzez wczytanie najpierw wartosci n a pozniej utworzenie tablicy. Dalej sie ne przygladalem POZDRO
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

Program w C++ (Funkcja)

Post autor: kadiii »

Tak, ta dziwna alokacja najbardziej raziła. Ale poza tym zupełnie nieuzasadnione łączenie printf i cin. I żeby już wyczerpać to jeszcze dodałbym parę juz takich drobnostek(jakby były tylko one to bym się nie czepił ) - tworzysz tablicę long long a potem sumujesz z niej składniki do double, zerujesz zmienne S i t chociaz zaraz potem do nich przypisujesz wartości. I żebyś nie zrozumiał mnie źle, że chcę wytknąć twoje błędy ponieważ mój główny zamiar ująłeś trafnie w słowach
Hmm masz racje, niepotrzebnie wklejałem (kod źródłowy przyp.kadiii)
Pozdro
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Program w C++ (Funkcja)

Post autor: matshadow »

Ale wstyd, ja nie moge, że nie zauważyłem że czytam n później niż ustalam rozmiar tablicy Oczywiście że Cię źle nie rozumiem Tylko jeszcze jedno pytanie: wiem że nie wolno mieszać scanf i cin, ale cin i printf chyba można, prawda?
Pozdrawiam
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Program w C++ (Funkcja)

Post autor: soku11 »

Pytanie tylko po co?? Przeciez piszac w C++ masz gotowe strumienie, ktore sa IMHO wygodniejsze. Dziala na takiej samej zasadzie, chociaz jak dla mnie to lepiej jest zamiast pisac nawiasy napisac
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Program w C++ (Funkcja)

Post autor: matshadow »

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

Program w C++ (Funkcja)

Post autor: soku11 »

... d-idea.htm

http://forums.devx.com/showthread.php?threadid=167768
http://www.daniweb.com/forums/post155393.html
I wiele wiele innych... Mozesz poczytac sa tam opisane zalety i wady tych dwoch metod. A co do szybkosci - sory, ale w takim programie to naprawde szybkosc wypisania tekstu sie nie liczy POZDRO
ODPOWIEDZ