Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Programm für Mittelwert und Varianz eines Vektors

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]
020
09.01.2004, 00:16 Uhr
(un)wissender
Niveauwart


Warum ist das denn kompliziert, bitte?
Intuitiver, allgemeiner und sicherer geht es doch nicht...
Wollte mal valarray ausprobieren, habe ich noch nie mit gearbeitet, ist aber toll.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
09.01.2004, 00:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Wollte mal valarray ausprobieren, habe ich noch nie mit gearbeitet, ist aber toll.


ich auch nicht...
vermutlich hast du recht mich hat mehr abgeschreckt das ich den code für eine solche kindergartenaufgabe nicht auf anhieb überblicke sondern auch erstmal genauer hingucken musste...
sah für mich so aufgebläht aus gegenüber einem vermutlich 70 zeichen Golfrätsel....

Nacht...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 09.01.2004 um 00:20 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
09.01.2004, 00:31 Uhr
(un)wissender
Niveauwart


Nacht!

Das ist der eigentliche Code, ich denke viel kürzer geht es gar nicht, wenn ich jetzt die Variablen mit a,b,... nenne, siehst du beim golfen (sehr) alt aus.


C++:
my_value mittelwert = testValarray.sum() / testValarray.size();
    
testValarray -= mittelwert;
        
testValarray *=testValarray;
  
my_value varianz = testValarray.sum() / (testValarray.size() - 1);



Darum, es geht nicht kürzer, allgemeiner, intuitiver und sicherer, deshalb meine ich auf keinen fall, dass der Code aufgebläht ist.

Boh, bin ich müde...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
09.01.2004, 10:33 Uhr
~Gizzzy
Gast


@ Windalf --> Du bist mein Held ! ! !
-hab ich nie gesagt das wir informatik studieren
-das ist nur ein teil der "Kindergartenaufgabe"
-ok, abschlussarbeit wahr falsch formuliert, sagen wir: die letzte und am meisten bewertete Aufgabe von dreien.


@(un)wissender

vielen dank für deinen post, bringt uns auf jeden mehr als albernes gelaber

@all
werd das prog nochma durchgehen und die einzelnen probleme posten
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
09.01.2004, 11:11 Uhr
~Gizzzy
Gast


Lach ruhig über uns windalf !
hier is unser Ansatz :


C++:
#include <iostream.h>
#include "PointIo.h"
#include "MeanVarCalculation.h"
#include <stdlib.h>


int main()
{
    float Middle;
    Middle=CalculateMean;
    cout<< "Der Mittelwert des Vektors beträgt : "<<Middle<< "./n";

    float Varianz;
    Varianz=CalculateVar;
    cout<< "Die Varianz des Vektors beträgt : "<<Varianz<< "./n";

    return 0;
}



C++:
#include "PointIo.h"
#include <stdlib.h>


float CalculateMean (float xDataOut[],float getNumberOfDataPoints)
{
    
    char File[]="values.dat";
    float NumberOfValues;
    NumberOfValues = getNumberOfDataPoints(File);
    
    
    float *xData;
    xData = new float[NumberOfValues];
    float ContentOfFile;
    ContentOfFile[] = readDataPoints (File,xData,NumberOfValues);
    
    float i;
    float SumOfValues=0;
    float Mean=0;
    for(i=0;i<NumberOfValues;i++)
    {
        SumOfValues += ContentOfFile[i];
    }
    
    Mean=SumOfValues/NumberOfValues;

        
    return Mean;
}





float CalculateVar (float xDataOut[],float getNumberOfDataPoints)
{
    char File[]="values.dat";
    float NumberOfValues;
    NumberOfValues = getNumberOfDataPoints(File);
    
    int i;
    float SumOfValues;
    float Mean=0;
        
    for(i=0;i<NumberOfValues;i++)
        {
            SumOfValues += xDataOut[i];
        }
    Mean=SumOfValues/NumberOfValues;

    
    int a;
    int b;
    float DeviationOne[a];//Abweichungen
    float DeviationTwo[ b ];
    
    while(NumberOfValues == (a+b));
    
    do
    {
        int j;
        for(j=0;j<NumberOfValues;j++)
        {
            if (j>Mean)
                {
                DeviationOne[a]=(j-Mean)*(j-Mean);
                }
            
            if (j<Mean)
                {
                DeviationTwo[ b ]=(Mean-j)*(Mean-j);
                }
    }
    
    float Var=0;
    Var=(DeviationOne[a]+DeviationTwo[ b ])/(NumberOfValues-1);

    return Var;
}



C++:
#include <iostream>
#include <fstream>

using namespace std;

#include "PointIo.h"


// -------------------------------------------------------------------
// getNumberOfDataPoints returns the number of points in the data file
// Input szFileName: ZeroTerminted String which contains the complete Path and FileNAme
// return Value is the number of DataPoints in the File
// negative Values indicate an error
//                 -1 : File could not be found or openend
//                 -2 : File has not the correct format
// -------------------------------------------------------------------
float getNumberOfDataPoints(char *values)
{
    float NrOfPoints;
    ifstream NeueDatei(values,ios::out|ios::in);

    if (NeueDatei.fail())
        return -1;

    NeueDatei >> NrOfPoints;

    if (NrOfPoints < 1)
        return -2;

    NeueDatei.close();

    return NrOfPoints;
}
// -------------------------------------------------------------------
// readDataPoints reads data points from a file
// Input  : szFileName: ZeroTerminted String which contains the complete Path and FileNAme
//        : NrOfPoints: integer to indicate the memory allocation for the points (only for safety reasons)
// Output : xDataOut and yDataOut pointer to allocated memory for the data points to read.
//          If the function returns without any error the memory contains the data
// return : ErrorCode
//                 -1 : File could not be found or openend
//                 -2 : The saved Number of Data Points are not fitting the requested number
//                 -3 : ReadError
// -------------------------------------------------------------------
float readDataPoints (char *values, float *xDataOut, float NrOfPoints)
{
    float ReadNrOfPoints;
    ifstream NeueDatei(values,ios::out|ios::in);

    if (NeueDatei.fail())
        return -1;

    NeueDatei >> ReadNrOfPoints;

    if (NrOfPoints != ReadNrOfPoints)
        return -2;

    float kk;
    for (kk = 0; kk < NrOfPoints; kk++)
    {
        NeueDatei >> xDataOut[kk];
        

        if (!NeueDatei)
            return -3;
    }

    NeueDatei.close();

    return 0;
}



Das klappt so natürlich nich, 15 fehler oder so und wir wissen nich wie wir sie beheben können.


Bearbeitung von Pablo:

[ b ] Fehler behoben



Bearbeitung von loddab:

noch zwei [ b ] Fehler gefunden und behoben


Dieser Post wurde am 09.01.2004 um 14:12 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
09.01.2004, 11:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


2Stk habe ich gefunden: sind hier:


C++:
Middle=CalculateMean;



und hier:


C++:
Varianz=CalculateVar;



Du rufst eine Funktion auf, übergibst ihr aber keine Parameter bzw überhaupt einen Funktionskopf.

Dann geht das hier auch schief:


C++:
float CalculateVar (float xDataOut[],float [b]getNumberOfDataPoints[/b])
{
    NumberOfValues = [b]getNumberOfDataPoints[/b](File);


du benennst einen Parameter der Funktion genauso wie eine andere funktion und versuchst diese in deiner Funktion aufzurufen. Das gibt meistens schöne "Redefinition of ..."-Errors.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
09.01.2004, 12:07 Uhr
~Gizzzy
Gast


ok, ham wir geändert
laufen tuts noch nich aber trotzdem danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
09.01.2004, 12:15 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


poste mal ausführlich die fehlermeldungen, die glaskugel ist bei dem Wetter zu undurchsichtig
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
09.01.2004, 12:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Gizzzy
Oh Sorry da hab ich euch wohl völlig falsch eingeschätzt...
das liegt wohl daran das hier öfter informatiker kommen und sich die hausaufgaben machen lassen wollen...

ihr habt das recht kompliziert aufgebaut..., das haut euch wahrscheinlich die beine weg

Ich würde sowas empfehlen
zum ersten ist es einfach wenn ihr sowas wie std::vector verwendet weil ihr euch dann nicht mit dummen speicherallokierereien rumärgern müsst...so könnt ihr dann quasi beliebig viele datensätze hinzufügen ohne neuen speicher allokieren zu müssen bzw. ohne vorher zu wissen wieviel speicher ihr eigentlich braucht

Ich bin davon ausgegangen das ihr das hier wissen wollt und deshalb dachten wird das ihr euch die hausaufgaben machen lassen wollt ohne eine finger krum zu machen...

auf jeden fall würde ich das auslesen aus der datei von der eigentlichen rechnung trennen....

C++:
double meanvalue(double* values,int n){
    double rv=0;
    for(int i=0;i<n;++i)rv+=values[i];
    return rv/n;
}

double var(double* values,int n){
    double rv=0,mean=meanvalue(values,n);
    for(int i=0;i<n;++i)rv+=(values[i]-mean)*(values[i]-mean);
    return rv/--n;
}




man könnte sich das leben wie gesagt einfacher machen indem man nur einen std::vector nimmt um die daten einzulesen und dann der mittelwertfunktion einen std::vector übergeben...
aber es geht natürlich auch so...


am besten schreibt ihr euch einfach eine funktion die die werte aus der datei liest...
das hängt insbesonder davon ab wie die datei aussieht aus der ihr die werte lest.
Ich würde da sowas in der art vorschlagen

C++:
int readDataFromFile(const char *filename,double* &data,int &n) { // in data sollen nachher die werte stehen und in n die anzahl der werte...
int i;
//datei öffnen...
//als erstes in n die anzahl einlesen
data=new double[n]; //der vorteil von dem std::vector an der stelle wäre das man nicht n wissen muss und einfach beliebig viele daten reinschieben kann, man muss also n nicht vorher wissen
for(i=0;i<n;++i) //in values[i] die datenwerte einlesen....
//datei schliessen und fertig
return 0; //für alles ok
}


der trick hierbei ist das die werte als referenz übergeben werden das heisst sie sind dann nachher auch noch "gültig"

mainproggie sieht dann in ewta so aus

C++:
int main(){
int n;
double *values;
readDataFromFile("test.txt",values,n)
std::cout<<"Mittelwert"<<meanvalue(values,n)<<std::endl;
std::cout<<"Varianz"<<var(values,n)<<std::endl;
delete []values;
return 0;
}



--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 09.01.2004 um 13:01 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
09.01.2004, 13:28 Uhr
~Gizzzy
Gast


Wir ham das jetzt nochmal überarbeitet, vielleicht nicht unbedingt so, wie von euch vorgeschlagen, jetzt sind nur noch drei Linker-Fehler da, und wir wissen nicht wo die herkommen!




MAINDATEI:

C++:
#include <stdlib.h>
#include <iostream.h>
#include "PointIo.h"
#include "MeanVarCalculation.h"

int main()
{
    float Middle, Varianz;
    char File[]="values.dat";
    int Anzahl;

    Anzahl = getNumberOfDataPoints(File);
    Middle=CalculateMean(Anzahl);
    cout<< "Der Mittelwert des Vektors beträgt : "<<Middle<< "./n";

    Varianz=CalculateVar(Anzahl);
    cout<< "Die Varianz des Vektors beträgt : "<<Varianz<< "./n";

    return 0;
}



BERECHNUNGSDATEI :

C++:
#include <stdlib.h>
#include "PointIo.h"

int CalculateMean (int xDataOut[])
{
    
    char File[] = "values.dat";
    int NumberOfValues, ContentOfFile, *xData, SumOfValues = 0, Mean = 0;
    
    NumberOfValues = getNumberOfDataPoints(File);
    
    xData = new int[NumberOfValues];
    
    ContentOfFile = readDataPoints (File,xData,NumberOfValues);

    for(int i = 0; i < NumberOfValues; i++)
    {
        SumOfValues += ContentOfFile;
    }
    
    Mean = SumOfValues/NumberOfValues;
        
    return Mean;
}

int CalculateVar (int xDataOut[])
{
    char File[]="values.dat";
    int NumberOfValues, a = 0, b = 0, SumOfValues, Mean = 0, Var = 0;

    NumberOfValues = getNumberOfDataPoints(File);
            
    for(int i = 0; i < NumberOfValues; i++)
    {
        SumOfValues += xDataOut[i];
    }

    Mean=SumOfValues/NumberOfValues;

    int DeviationOne[50], DeviationTwo[50]; ;//Abweichungen
    
    do
    {
        for(int j=0;j<NumberOfValues;j++)
        {
            if (j>Mean)
            {
                DeviationOne[j]=(j-Mean)*(j-Mean);
            }
            
            if (j<Mean)
            {
                DeviationTwo[j]=(Mean-j)*(Mean-j);
            }
        }
    }    while(NumberOfValues == (a+b));

    Var=(DeviationOne[a]+DeviationTwo[ b ])/(NumberOfValues-1);

    return Var;
}



DATEI ZUM AUSLESEN DES VEKTORS :


C++:
#include <iostream>
#include <fstream>

using namespace std;

#include "PointIo.h"


// -------------------------------------------------------------------
// getNumberOfDataPoints returns the number of points in the data file
// Input szFileName: ZeroTerminted String which contains the complete Path and FileNAme
// return Value is the number of DataPoints in the File
// negative Values indicate an error
//                 -1 : File could not be found or openend
//                 -2 : File has not the correct format
// -------------------------------------------------------------------
int getNumberOfDataPoints(char *values)
{
    int NrOfPoints;
    ifstream NeueDatei(values,ios::out|ios::in);

    if (NeueDatei.fail())
        return -1;

    NeueDatei >> NrOfPoints;

    if (NrOfPoints < 1)
        return -2;

    NeueDatei.close();

    return NrOfPoints;
}
// -------------------------------------------------------------------
// readDataPoints reads data points from a file
// Input  : szFileName: ZeroTerminted String which contains the complete Path and FileNAme
//        : NrOfPoints: integer to indicate the memory allocation for the points (only for safety reasons)
// Output : xDataOut and yDataOut pointer to allocated memory for the data points to read.
//          If the function returns without any error the memory contains the data
// return : ErrorCode
//                 -1 : File could not be found or openend
//                 -2 : The saved Number of Data Points are not fitting the requested number
//                 -3 : ReadError
// -------------------------------------------------------------------
int readDataPoints (char *values, int *xDataOut, int NrOfPoints)
{
    int ReadNrOfPoints;
    ifstream NeueDatei(values,ios::out|ios::in);

    if (NeueDatei.fail())
        return -1;

    NeueDatei >> ReadNrOfPoints;

    if (NrOfPoints != ReadNrOfPoints)
        return -2;

    int kk;
    for (kk = 0; kk < NrOfPoints; kk++)
    {
        NeueDatei >> xDataOut[kk];
        

        if (!NeueDatei)
            return -3;
    }

    NeueDatei.close();

    return 0;
}





BERECHNUNGS HEADER :


C++:
#ifndef MEANVARCALCULATION_IHA_H_
#define MEANVARCALCULATION_IHA_H_

int CalculateMean (int xDataOut);

int CalculateVar (int xDataOut);

#endif



AUSLESE HEADER :


C++:
/******************************************************************************************
FileName        : PointIo.h
Purpose         : Read and Write of Data Points
Date Of Creation: 16.12.2003
Modification History :
Version     Date        Modifications                 By Whom
0.1    16.12.2003      First Build               Joerg Bitzer
******************************************************************************************/



#ifndef POINT_IO_IHA_H_
#define POINT_IO_IHA_H_
// --------------------
// Point Definition
//---------------------
struct Point
{
    float x;
};

// -------------------------------------------------------------------
// getNumberOfDataPoints returns the number of points in the data file
// Input szFileName: ZeroTerminted String which contains the complete Path and FileNAme
// return Value is the number of DataPoints in the File
// negative Values indicate an error
//                 -1 : File could not be found or openend
//                 -2 : File has not the correct format
// -------------------------------------------------------------------
int getNumberOfDataPoints(char *values);
// -------------------------------------------------------------------
// readDataPoints reads data points from a file
// Input  : szFileName: ZeroTerminted String which contains the complete Path and FileNAme
//        : NrOfPoints: integer to indicate the memory allocation for the points (only for safety reasons)
// Output : xDataOut and yDataOut pointer to allocated memory for the data points to read.
//          If the function returns without any error the memory contains the data
// return : ErrorCode
//                 -1 : File could not be found or openend
//                 -2 : The saved Number of Data Points are not fitting the requested number
//                 -3 : ReadError
// -------------------------------------------------------------------
int readDataPoints (char *values, int *xDataOut, int NrOfPoints);


#endif



DATA.DAT MESSWERTE DES VEKTORS :


C++:
15
2
46
58
96
45
67
34
56
8
98
67
123
43
67
78  




Bearbeitung von Pablo:

[ b ] Fehler behoben


Dieser Post wurde am 09.01.2004 um 13:30 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: