Ich steh auf der Leitung , benötige bitte einen Lösungsansatz.
-
Hallo zusammen,
ich bin ein absoluter C++ Neuling und möchte mich ein bisschen einarbeiten.
Vielleicht hat ja der ein oder andere einen Lösungsansatz für mich.
Ich möchte ein Programm erstellen, indem ich 10 Messwerte eingeben kann.
Diese dürfen aber eine vorher definierte min und max Grenze( z.B. nur Werte zwischen 0 - 10) nicht unter- bzw. überschreiten. Ansonsten soll dieser Wert nicht gewertet werden und somit nicht zu den 10 Messwerten dazugerechnet werden. ( Ausschuss)
Beginnen wollte ich das mit einer for-schleife da die Anzahl der Wiederholungen ja bekannt ist. Anschließend eine if-else anweisung.
Bin ich da komplett auf dem Holzweg??????
Vielen herzlichen Dank.
MFG Pauli
-
nein, bist du nicht.
wenn du ein konkretes problem hast, dann frag nochmal nach.
-
Aus deiner Beschreibung kann ich nicht entnehmen ob die Anzahl der "Wiederholungen" bekannt ist oder nicht -- ich hätte es eher anders interpretiert: so lange Werte holen bis 10 passende gefunden sind. Und das kann von min. 10 bis unendlich viel Versuche brauchen. Aber das musst natürlich du wissen, also wie die Anforderung genau ist.
-
Nicht geteststet
class Messwert{ std::vector<double> m_Dat; public: bool NeuerWert(double Val){ //Hier Prüfen ob wert gültig, wenn nicht, wert nich hinzufügen und //fals zurückgeben } //Anzahl der Messweerte int Anzahl(){ return m_Dat.size(); } }; Messwert Daten; double Wert=0.0; while(Messwert.Anzahl() < 10 ){ std::cin >> Wert; if( !Messwert.NeuerWert(Wert)) std::cout<<"Wert nicht im gütligen Bereich"<<Wert<<"\n"; else std::cout<<"Wert hinzufügt"<<Wert<<"\n"; std::cout<<"Bisher"<< Messwert.Anzahl() << "Werte\n"; }
-
Was sind denn das für wissenschaftliche Methoden, sich die Messwerte "passend" zusammen zu suchen?

-
Erhard Henkes schrieb:
Was sind denn das für wissenschaftliche Methoden, sich die Messwerte "passend" zusammen zu suchen?

durchaus üblich, outliers rauszuschmeissen. selbst bei klinischen studien

-
durchaus üblich, outliers rauszuschmeissen. selbst bei klinischen studien
Klar, aber nicht wegen des Messwertes, sondern wegen der Ursachen. Das ist ein kleiner, aber feiner Unterschied.

-
Vielen Dank für eure Antworten, .......

Da habt ihr vollkommen recht die Anzahl der Wiederholungen ist ja nicht bekannt. --- deshalb fällt die for-Schleife flach und ich probiere es mal mit einer while schleife.
Das ganze soll für eine Metzgerei sein. Die Dame soll einen Karton packen in dem 10 Fleischstücke sind. Diese dürfen aber (pro Stück) nihct weniger als 80g und mehr als 90g haben.
Zum Schluss soll noch die Gesamtsumme und der Mittelwert ausgegeben werden.
-
Es gibt da ganz unterschiedliche Varianten, deine Variante mit for und if/else würde auch funktionieren, aber würde den Sinn einer for-Schleife etwas unterlaufen, weil man die Zählvariable in der Schleife hochzählen müsste oder man muss sie wieder nach unten setzen, wenn ein falscher Wert eingegeben wurde. Mit ner for- und eine do-while-Schleife wäre es auch möglich. Aber wenn du am Anfang erstmal in der prozedualen Programmierung bleiben willst, ist die einfachste Variante wohl eine do-while-Schleife allein. Ansonsten ist die Variante von littleexample eben eine objektorientierte Variante, die auch funktionieren wird.
MfG
-
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;int main(int argc, char *argv[])
{do
{
cout << "Bitte geben Sie einen Messwert ein.\n";
cin >> m;if ((m<=80) && (m>=90))
{cout << "Der Messwert liegt nicht im Toleranzbereich.\n";
cout << " Bitte geben Sie erneut einen Wert ein.\n";else
{cout << " Bitte geben sie einen weiteren Messwert ein:\n;
}while // hier müssten irgend wie die 10 Wiederholungen rein????
system("PAUSE");
return EXIT_SUCCESS;
}Wäre nett wenn jemand noch ein paar Verbesserungsvorschläge liefern könnte.
Vielen Dank......
-
PauliBär schrieb:
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;int main(int argc, char *argv[])
{do
{
cout << "Bitte geben Sie einen Messwert ein.\n";
cin >> m;if ((m<=80) && (m>=90))
{cout << "Der Messwert liegt nicht im Toleranzbereich.\n";
cout << " Bitte geben Sie erneut einen Wert ein.\n";else
{cout << " Bitte geben sie einen weiteren Messwert ein:\n;
}while // hier müssten irgend wie die 10 Wiederholungen rein????
system("PAUSE");
return EXIT_SUCCESS;
}Wäre nett wenn jemand noch ein paar Verbesserungsvorschläge liefern könnte.
Vielen Dank......
Also ich würde keine do-while Schleife benutzen, sondern eine while:
(ungetestet)#include <iostream> #include <vector> int main() { int input; std::vector<int> values; //Container für die 10 Werte while(values.size() <= 10) //Prüfen, ob im Container mehr als 10 Werte sind { std::cin>>input; //Wert eingeben if(input >= 80 && input <= 90) //Prüfen, ob Wert zwischen 80 und 90 liegt values.push_back(input); //Wenn Wert im Wertebereich liegt, einfach in den Container fügen } return 0; }
-
Bitte CPP-Tags benutzen, um den Code lesbar zu machen.
Noch ein paar Anmerkungen am Rand:
#include <cstdlib> #include <iostream> #include <math.h> // veraltet, nimm stattdessen <cmath> using namespace std; int main(int argc, char *argv[]) // Du kannst auch int main() schreiben (deine Version ist auch erlaubt) { // ... system("PAUSE"); // hat gewisse Nachteile (siehe FAQ) return EXIT_SUCCESS; // überflüssig, am Ende von main() wird automatisch 0 zurückgegeben }Ansonsten kann ich Speedy_92s Version zustimmen. Von den Headern brauchst du wie bei ihm im Code nur <iostream> und <vector>. Eventuell solltest du dir auch einen Umstieg von
using namespace std;nachstd::cout,std::endletc. überlegen, dann hast du später sicher keine Probleme mit Namensräumen (z.B. in Headern).Bei der Eingabe (
std::cin) solltest du noch eine Überprüfung auf Fehleingaben (z.B. Buchstaben) einbauen.
-
Puhhh, kann man das ganze auch ohne vectoren lösen? So weit sind wir noch nicht.
Dieses Programm kommt schon nah dran aber die min max begrenzung fehlt mir noch.
P.s. wie kann ich mein c++ programm so schön farbig hochladen wie ihr?
Test:
[cpp]
#include <cstdlib>
#include <iostream>
#include <math.h>using namespace std;
int main(int argc, char *argv[])
{
int i, n;
double wert[n], maxi, mini, summe, x, s, zaehler, b, term[n];summe = 0; zaehler = 0; n=10; s=0;
cout << "Bitte geben sie 10 Messwerte ein: \n\n ";
for (i=1; i<(n+1); i++)
{
cout << "Geben Sie den Messwert ";
cout << i;
cout << " ein ";
cin >> wert[n];// Mittelwertberechnung
summe = summe + wert[n];
x = summe / n;// Maximum
if (i==1)
maxi = wert[n];
if (wert[n] > maxi)
maxi = wert[n];
// Minimum
if (i==1)
mini = wert[n];
if (wert[n] < mini)
mini = wert[n];term[n] = (wert[n]-x)*(wert[n]-x);
zaehler = zaehler + term[n];
}
s = sqrt(zaehler/(n-1));cout << "\n";
cout << "Die Gesamtsumme beträgt:";
cout << summe;
cout << "\n";
cout << "Der groesste Messwert ist: ";
cout << maxi;
cout << "\n";
cout << "Der kleinste Messwert ist: ";
cout << mini;
cout << "\n";
cout << "Der Mittelwert ist: ";
cout << x;
cout << "\n";
cout << "Die Standardabweichung betraegt: ";
cout << s;
cout << "\n";
cout << "\n";cout << "Wollen sie einen neuen Karton Packen? ja = 1, nein = 0: \n";
cin >> b;if (b==0)
{cout << "Sie wollen das Programm beenden!\n";
cout << "\n";
system("PAUSE");
return EXIT_SUCCESS;}
-
PauliBär schrieb:
P.s. wie kann ich mein c++ programm so schön farbig hochladen wie ihr?
Eben dafür wären die CPP-Tags. Am Anfang des Codes [ cpp ] und am Schluss [ /cpp ] (ohne die Leerzeichen) schreiben (oder erste weisse Schaltfläche benutzen).
Ausserdem hab ich dir im oberen Post noch einige Tipps bezüglich Headern und so gegeben...
#include <cstdlib> #include <iostream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { int i, n; double wert[n], maxi, mini, summe, x, s, zaehler, b, term[n]; // verteil das auf mehrere Zeilen summe = 0; zaehler = 0; n=10; s=0; // das auch cout << "Bitte geben sie 10 Messwerte ein: \n\n "; for (i=1; i<(n+1); i++) // Fehler: Array beginnt bei 0 und hört bei n-1 auf!! { cout << "Geben Sie den Messwert "; cout << i; // hier evtl. i+1 schreiben, da erster Messwert Index 0 hat cout << " ein "; cin >> wert[n]; // Mittelwertberechnung summe = summe + wert[n]; // einfacher: summe += wert[n]; x = summe / n; // Maximum // die folgenden Abfragen könntest du mit OR (operator ||) zu einer zusammenhängen if (i==1) maxi = wert[n]; if (wert[n] > maxi) maxi = wert[n]; // Minimum if (i==1) mini = wert[n]; if (wert[n] < mini) mini = wert[n]; term[n] = (wert[n]-x)*(wert[n]-x); // da gibt es die Funktion pow() zaehler = zaehler + term[n]; // wieder mit += } s = sqrt(zaehler/(n-1)); cout << "\n"; cout << "Die Gesamtsumme beträgt:"; cout << summe; cout << "\n"; cout << "Der groesste Messwert ist: "; cout << maxi; cout << "\n"; cout << "Der kleinste Messwert ist: "; cout << mini; cout << "\n"; cout << "Der Mittelwert ist: "; cout << x; cout << "\n"; cout << "Die Standardabweichung betraegt: "; cout << s; cout << "\n"; cout << "\n"; cout << "Wollen sie einen neuen Karton Packen? ja = 1, nein = 0: \n"; cin >> b; if (b==0) {cout << "Sie wollen das Programm beenden!\n"; cout << "\n"; system("PAUSE"); return EXIT_SUCCESS;}PauliBär schrieb:
Dieses Programm kommt schon nah dran aber die min max begrenzung fehlt mir noch.
Du könntest es mit einer If-Abfrage machen, d.h. wenn die Messwerte nicht okay sind, wiederholst du den Schleifendurchgang mit
continue;(nicht vergessen, die Zählvariable zu dekrementieren) und fragst nochmals ab.
-
int i, n; double wert[n], maxi, mini, summe, x, s, zaehler, b, term[n]; summe = 0; zaehler = 0; n=10; s=0;Dieser Teil dürfte doch eigentlich nicht so funktionieren, wie er soll...
Erst den Variablen einen Vert zuweisen, und dann die Arrays deklarieren.Also so:
int i; int n = 10; // Erst nach n = 10; darfst du die Arrays deklarieren: double wert[n]; double term[n]; double maxi; double mini; double summe = 0; double x; double s = 0; double zaehler = 0; double b;Wenn du das Array vor der Initialisierung von "n" deklariert hättest, dann hätte der Kompiler meines Wissens nach ein undefiniertes Verhalten vergerufen (ist das richtig so?) weil "n" irgendeinen Wert zugewiesen bekommt.
-
Schöne Liste der Initialisierungen, das würde ich dir in Zukunft auch raten, PauliBär. Generell solltest du nur in Ausnahmefällen mehr als eine Anweisung pro Zeile haben. Ausserdem brauchst du die Variablen eigentlich nicht lange bevor du sie brauchst zu deklarieren (besser so spät wie möglich, am besten gleich eine Initialisierung machen wo es möglich ist). Auch Zählvariablen in Schleifen sollten erst im Schleifenkopf deklariert sein.
Schade, dass ich um diese Zeit nicht mehr ganz fähig bin, Logikfehler zu finden, das mit dem
nhabe ich z.B. komplett übersehen
Speedy_92 schrieb:
Wenn du das Array vor der Initialisierung von "n" deklariert hättest, dann hätte der Kompiler meines Wissens nach ein undefiniertes Verhalten vergerufen (ist das richtig so?) weil "n" irgendeinen Wert zugewiesen bekommt.
Mir fällt gerade auf, dass das in dieser Form eh nicht geht, da für die Dimension ein konstanter Wert erwartet wird. Das heisst, es muss so stehen (was eine Initialisierung erfordert, von daher kann
ngar nicht undefiniert sein):const int n = 100;Aber für normale Variablen gilt das natürlich, was du gesagt hast. Bei keiner Initialisierung oder Zuweisung steht ein willkürlicher Wert in der Variable, was oft zu Abstürzen führt.
-
Super vielen lieben Dank euch.
Und das zu so später Stunde Danke an Nexus und Speedy_92
Macht langsam riesig Spass mit C++ zu arbeiten.
Habe gerade mein erstes richtiges Programm zum laufen bekommen....
Der ein oder andere wird sicher schmunzeln wenn er das sieht.....Ein Problem hätte ich noch: Ich würde gerne am ende eine Frage ausgeben : Wollen sie erneut einen Karton packen? Diese soll dann mit ja / nein beantwortet werden.
Kann ich z.b. ja=1 und nein=0 zuordnen und das mit einer if/else Anweisung abarbeiten?
Wie komme ich dann an den Anfang vom Programm zurück.
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int Messwert, Wert, Summe; Messwert=0; while(Messwert<10) { cout<<"Bitte geben Sie einen Messwert ein:\n"; Messwert++; cin>>Wert; if(Wert<5) {cout<<"Messwert ist zu klein.\n"; Messwert--;} if(Wert>10) {cout<<"Messwert ist zu gross.\n"; Messwert--;} } Summe= Summe+Wert; cout<<"Die Summe beträgt:\n"; cout<< Summe; system("PAUSE"); return EXIT_SUCCESS; }
-
Ups da hat ein bisschen was gefehlt. Sorry
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int Messwert, Wert, Summe, Mittelwert, b; Messwert=0; Summe=0; b=0; while(Messwert<10) { cout<<"Bitte geben Sie einen Messwert ein:\n"; Messwert++; cin>>Wert; if(Wert<80) {cout<<"Messwert ist zu klein.\n"; Messwert--;} if(Wert>90) {cout<<"Messwert ist zu gross.\n"; Messwert--;} } Summe=Summe+Wert+Wert+Wert+Wert+Wert+Wert+Wert+Wert+Wert+Wert; cout<<"\n"; cout<<"Die Gesamtsumme betraegt:\n"; cout<< Summe; cout<<"\n"; Mittelwert=Summe/10; cout<<"Der Mittelwert betraegt:\n"; cout<<Mittelwert; cout<<"\n"; system("PAUSE"); return EXIT_SUCCESS; }
-
Summe=Summe+Wert+Wert+Wert+Wert+Wert+Wert+Wert+Wert+Wert+Wert;Was? Weisst aber schon,dass 'Wert' immer den selben Wert hat (nämlich den zuletzt eingegebenen)?
-
PauliBär schrieb:
Puhhh, kann man das ganze auch ohne vectoren lösen? So weit sind wir noch nicht.
Das ist egal. Vektoren sind wirklich wahnsinnig praktische Dinger. Vereinfachen viele Dinge. Und sie sind leicht zu bedienen. Klar die Syntax sieht am Anfang schwierig aus (im Vergleich zu new und delete), aber es ist wirklich total easy

OnTopic:
deine Summe solltest du überdenken:
summe += 10 * wert(hab jetzt nicht gezählt wie oft du Wert addieren willst)