[Aufgabe] Messwerte einlesen und verarbeiten



  • Gern geschehen -)



  • So also das ist erstma d)

    //b) Definieren von einer Reihung Messwerte
    float *pmesswerte = new float[nAnzahl];
    
    //c) messwerte einlesen
    ifstream input2;
    input2.open(dateiname.c_str(), ios_base::in);
    if (!input2)
    		{
    		cout << "Datei kann nicht geöffnet werden";
    		return -1;
    		}
    
    for(int i=0; i < nAnzahl; i++)
    	{
    	input2 >> pmesswerte[i];
    
    		if (nAnzahl <= 20)
    			{
    			cout << pmesswerte[i]<< endl;
    			}
    		else;
    	}
    
    input2.close();
    
    //d) Bei mehr als 20 Werte --> nur ersten 10 und letzte 3 ausgeben
    if (nAnzahl > 20) 
    {
    	for(int j=0; j < 10 ; j++)
    		{
    		cout << pmesswerte[j]<< endl;
    		}
    
    	for(int k=nAnzahl-3; k < nAnzahl ; k++)
    		{
    		cout << pmesswerte[k]<< endl;
    		}
    }
    

    bei der e) hab ich noch etwas Probleme, kann man das mit der getExtremes() Funktion machen?
    oder doch eher mit Schleife und einzelne Werte vergleichen und vertauschen?

    mfg
    fraggelfragger



  • zu d:

    Du solltest die zwei Ausgabe-Schleifen am besten einfach als if ... else ... realisieren (die Ausgabe aus der Einleseschleife wieder entfernen):

    if(anzahl <= 20)
    {
      for(int i=0; i < nAnzahl; i++)
        cout << pmesswerte[i]<< endl;
    }
    else
    {
      // Schleife mit ersten 10
      // Schleife mit letzten 3
    }
    

    Tipp: Du solltest dir für jede Teilaufgabe eine eigene Funktion implementieren
    (Idealerweise sogar eine Klasse dafür definieren, falls du schon weißt, was das ist?)

    zu e:
    im Header <algorithm> gibt es die Funktionen std::min_element() und std::max_element.
    Die Funktion 'getExtremes()' kenne ich nicht.

    und f sollte dann ja auch einfach für dich sein...

    P.S. Anhand welches Tutorials oder welchen Buchs lernst du denn?



  • Th schrieb:

    Tipp: Du solltest dir für jede Teilaufgabe eine eigene Funktion implementieren
    (Idealerweise sogar eine Klasse dafür definieren, falls du schon weißt, was das ist?)

    okey ich werde das mal ändern, Klassen habe ich auch schon gehört aber praktisch in der Programierung angewend habe ich diese leider noch nicht.
    Ist dir evtl. ein Buch bekannt in dem Übungen mit Lösungen vorhanden sind? Denke so könnte ich am besten lernen.

    Th schrieb:

    P.S. Anhand welches Tutorials oder welchen Buchs lernst du denn?

    Ich lerne nach einem Skript, dabei musste ich mich allerdings einem Skript von einem anderen Professor bedienen, da mein eigener Prof kein Skript hat ( der gute Mann ist schon etwas älter und war schon im Ruhestand --> er wurde zurückbeordert)

    Deshalb muss ich mich halt da etwas durchbeisen, hast du irgendwelche Tips für mich ? Buchtips?



  • Schau dich mal hier im Forum unter dem Link 'Tutorials' oder 'Bücher' bei C++ um, dort sind einige hinterlegt.
    Es ist immer gut, wenn man mehrere zur Auswahl hat. Nicht alle C++ Tuts bzw. Bücher sind didaktisch gut bzw. häufig auch noch etwas veraltet.
    Wenn die Standard-Header-Dateien z.B. noch <iostream.h> heißen, dann ist dies ein Anzeichen für einen Wechsel (insbesondere wenn der Compiler dann nur Fehler wirft -).
    Ich weiß ja nicht, auf welchem Stand dein Script ist?

    Aber gerade Funktionen sollten schon am Anfang erklärt werden, bevor man z.B. komplexe Ein- und Ausgaben macht.

    Je größer die Programme werden, desto mehr Wert muß man auf eine gute Struktur legen (und dies wird durch gut benannte Funktionen bzw. Klassen unterstützt).



  • vielen dank für die tips das werd ich mir mal anschauen.

    Und dann das Programm mit Unterfunktionen realisieren.

    mfg
    fraggelfragger



  • okey so sieht das ganze nun mit Funktionen aus:

    was könnte ich da noch besser machen? ist das alles so korrekt?

    Mit Klassen würd ichs glaube ich auch gerne versuchen. Weil es ja noch Professioneller dann ist.

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    //Prototypen
    long Werte_Anzahl(string name);
    int einlesen(string name,int b,float *pmesswerte);
    void ausgabe(int b, float *pmesswerte); 
    float minimum(int b, float *pmesswerte);
    
    int main()
    {
    string dateiname = "MESSWERTE.TXT"; 
    
    //a) Anzahl der Messwerte bestimmen
    int nAnzahl = Werte_Anzahl(dateiname);
    
    //b) Definieren von einer Reihung Messwerte
    float *pmesswerte = new float[nAnzahl];
    
    //c) Messwerte einlesen
    einlesen(dateiname,nAnzahl,pmesswerte);
    
    //d) 20 Werte --> ersten 10 und letzten 3 ausgeben ansonsten alle
    ausgabe(nAnzahl,pmesswerte);
    
    //e)Minimum suchen
    float min = minimum(nAnzahl,pmesswerte);
    
    //f) nAnzahl ausgeben und minmum ausgeben
    cout << "Anzahl der Werte: " << Werte_Anzahl(dateiname) << endl;
    cout << "Minimum: " << min << endl;
    
    delete [nAnzahl] pmesswerte;
    
    return 0;
    }
    

    //Unterfunktionen

    long Werte_Anzahl(string name)
    {
    	//Datei öffnen
    	ifstream input;
    	input.open(name.c_str(), ios_base::in);
    
    	//Wenn Datei nicht vorhanden
    	if (!input)
    		{
    			cout << "Datei kann nicht geöffnet werden";
    			return -1;
    		}
    
    float f;
    int nAnzahl = 0;
    
    //Werte-Anzahl bestimmen
    while(true)
    	{
        		if(!(input >> f))
        			break;
    
        		nAnzahl++;
    	}
    
    //Datei schließen
    input.close();
    
    //Rückgabe von Anzahl der Werte in Datei
    return nAnzahl;
    }
    
    int einlesen(string name,int b,float *pmesswerte)
    {
    ifstream input2;
    input2.open(name.c_str(), ios_base::in);
    if (!input2)
            {
            	cout << "Datei kann nicht geöffnet werden";
            	return -1;
            }
    
    for(int i=0; i < b; i++)
        {
        	input2 >> pmesswerte[i];
        }
    
    input2.close();
    }
    
    void ausgabe(int b, float *pmesswerte)
    {
    if (b > 20) 
    	{
    		for(int j=0; j < 10 ; j++)
    			{
    				cout << pmesswerte[j]<< endl;
    			}
    
    		for(int k=b-3; k < b ; k++)
    			{
    				cout << pmesswerte[k]<< endl;
    			}
    	}
    else
    	{
    		for(int l=0; l < b ; l++)
    			{
    				cout << pmesswerte[l]<< endl;
    			}
    	}
    }
    
    float minimum(int b, float *pmesswerte)
    {
    float minimum = *min_element(pmesswerte, pmesswerte+b);
    
    return minimum;
    }
    

    ∞



  • Deine "Einrückung" ist katastrophal bzw. gar nicht vorhanden! Ändern das!!!!



  • Habs oben editiert, nun besser so?



  • Deine Code-Formatierung ist gewöhnungsbedürftig. Normalerweise rückt man alle Teile innerhalb der Blockklammern um einen Tabulator (oder wahlweise Leerzeichen) ein:

    int main()
    {
        while(true)
        {
             if(flag)
             {
                f();
             }
             else
             {
                g();
             }
        }
    }
    

    Aber inhaltlich ist dein Code schon sehr gut aufgeteilt auf die Funktionen (du könntest höchstens noch einige Variablen noch besser benennen, z.B. 'b').

    Und wenn du dich in Klassen eingelesen hast, dann wirst du merken, daß du dann nicht mehr bei jeder Funktion die Parameter 'pmesswerte' angeben mußt.

    Aber du bist auf jeden Fall auf einen guten Weg zum erfolgreichen C++ Programmierer -)



  • Th schrieb:

    Deine Code-Formatierung ist gewöhnungsbedürftig. Normalerweise rückt man alle Teile innerhalb der Blockklammern um einen Tabulator (oder wahlweise Leerzeichen) ein

    okey, ich werde das nächste mal versuchen, es komplett so zu machen, und das mir so anzugewöhnen.

    Th schrieb:

    du könntest höchstens noch einige Variablen noch besser benennen, z.B. 'b').

    Da hast du recht, habe das etwas einfallslos benannt.
    Ich wollte hauptsächlich das bei den Funktionsdefinitionen, nicht unbedingt die Variablen stehen die auch übergeben werden.

    Th schrieb:

    Aber du bist auf jeden Fall auf einen guten Weg zum erfolgreichen C++ Programmierer -)

    freut mich zu hören 🙂

    Vielen dank das du nochmal über den Code drüber geschaut hast und mir etwas Feedback zukommen gelassen hast.
    Es hilft wirklich viel wenn man von einem erfahrenen Programmierer Tips bekommt 🙂


Anmelden zum Antworten