[Aufgabe] Messwerte einlesen und verarbeiten
-
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