[Aufgabe] Messwerte einlesen und verarbeiten
-
macht nix
passiert mir auch manchmalso ich habs nun soweit:
//b) Definieren von einer Reihung Messwerte float *pmesswerte = new float[nAnzahl]; //c) lesen der Datei in messwerte 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]; input2.close(); // edit hatte ich vergessensomit wäre ja dann c) abgehackt oder?
Eine Frage habe ich allerdings dazu noch, hab ich das nun richtig verstanden das er mit dem befehl input immer eine komplette Zeile einliest? Wie müsste ich es machen wenn die Messwerte.txt so aussehen würde:1 2 3 4 5 6 7 8 ...
so in der Art --> lese alles ein bis zum nächsten Leerzeichen?!
mfg fraggelfragger
//edit deklaration von input in input2 umgeändert wegen Namensdoppelbelegung
//edit2 habe das Program c) mal in Einzelschritt ausgeführt leider schreibt der nun in den Pointer messwerte nur den ersten Wert von der Text Datei rein. Alle anderen Werte gehen unter ( es scheint so das die Schleife immer wieder bei der ersten Zeile anfängt.
-
Ja, so wie du es geschrieben hast, ist es richtig.
Laß dir doch danach einfach mal die Meßwerte ausgeben:
for(int i=0; i < nAnzahl; i++) { input2 >> pmesswerte[i]; cout << pmesswerte[i] << endl; }Bei der Datei ist es egal, ob zwischen den Zahlenwerten Leerzeichen, Zeilenenden oder sonstige sog. Whitespaces stehen, diese werden alle überlesen.
Hast du evtl. beim Debuggen immer nur den Wert von 'pmesswerte' dir angeschaut, dieser entspricht ja einfach dem ersten Wert des Arrays.
Du mußt schon explizit 'pmesswerte[i]' dir anschauen (watch).
-
stimmt du hattest recht, musste das per Hand in die Überwachung eintragen.
Ich werd mich nun mal an den nächsten Aufgabenteil ranmachen.
An dieser Stelle möchte ich mich aber erstma noch bedanken für deine Hilfe.
mfg fraggelfragger
-
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