Hilfe Problem mit Programmcode - bitte mal anschauen
-
#include "stdafx.h" #include <cmath> #include <vector> #include <conio.h> #include <cstring> #include <iostream> #include <iomanip> #include <fstream> #include <sstream> #include <stdexcept> using namespace std; //using namespace std; namespace my { template < typename Out , typename In > Out lexical_cast( In data) { Out tmp; std::stringstream sstr; sstr << data; if(!(sstr >> tmp)|| !sstr.good() || sstr.eof()) throw std::bad_cast(); return tmp; } } class Lagerdaten { public: explicit Lagerdaten(string LagerDatei):Datei(LagerDatei){} virtual ~Lagerdaten(){} void Einlesen(); std::size_t get_d_size() const { return d.size(); } int get_D(size_t idx) const; std::string const & get_typ(size_t idx) const; int get_d( size_t idx ) const { return d[idx]; } protected: std::vector< int > d; std::vector <float> e, dynC, statC, y, y0; std::string Datei; vector <int> D; vector <string> typ; }; template< typename Type > void MyInsert(std::ifstream & ifs , std::vector<Type> & vec ) { std::string tmp; getline(ifs , tmp , '\t' ); vec.push_back(my::lexical_cast<Type>(tmp)); } int Lagerdaten::get_D(size_t idx) const { return D[idx]; } std::string const & Lagerdaten::get_typ(size_t idx) const { return typ[idx]; } void Lagerdaten::Einlesen() { ifstream Lagerliste(Datei.c_str()); Lagerliste.seekg(ios::beg); std::string tmp; while (!Lagerliste.eof() && !Lagerliste.fail() ) { MyInsert(Lagerliste, d); MyInsert(Lagerliste, D); MyInsert(Lagerliste, dynC); MyInsert(Lagerliste, e); MyInsert(Lagerliste, y); MyInsert(Lagerliste, statC); MyInsert(Lagerliste, y0); getline(Lagerliste,tmp); typ.push_back(tmp); } } class dynBeanspruchung : public Lagerdaten { public: dynBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string const & LAGERDATEI) : Lagerdaten(LAGERDATEI), Fr(FR), Fa(FA), L(LL), n(N), axial(AXIAL) {} int SucheLagerDyn(int y); private: double p(int z); double Fr; double Fa; int L; int n; int axial; }; int dynBeanspruchung::SucheLagerDyn(int y) { Einlesen(); double CTRAG; int IndexOpt; CTRAG= pow( ( L * n * 60 / 1000000 ) , ( 3 / 10 ) ) * p(y) ; if (axial==2) CTRAG=CTRAG/1.715; if (dynC[y]<=CTRAG) IndexOpt=y; return IndexOpt; } double dynBeanspruchung::p(int z) { double p; if ( (Fa/Fr)<=e[z] ) { if (axial==1) p = Fr; else p = Fr + 1.12 * y[z] * Fa; } else { if (axial==1) p=0,4*Fr+y[z]*Fa; else p= 0.67 * Fr + 1.68 * y[z] * Fa; } return p; } class statBeanspruchung : public Lagerdaten { public: statBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string const & LAGERDATEI) : Lagerdaten(LAGERDATEI), Fr(FR), Fa(FA), L(LL), n(N), axial(AXIAL) {} int SucheLagerStat(int y); private: double p(int z); double Fr; double Fa; int L; int n; int axial; }; int statBeanspruchung::SucheLagerStat(int y) { Einlesen(); double CTRAG; int IndexOpt; CTRAG=pow((L*n*60/1000000),(3/10))* p(y); if (axial==2) CTRAG=CTRAG/1.715; if (statC[y]<=CTRAG) IndexOpt=y; return IndexOpt; } double statBeanspruchung::p(int z) { double p; if ((Fa/Fr)<=(1/(2*y0[z]))) { if (axial==1) p=Fr; else p= 0.5 * Fr + y0[z] * Fa; } else { p = Fr + 2 * y0[z] * Fa; } return p; } int main() { double Fa, Fr; int axial, L, d, n, optLager; string LagerDatei = "lager.txt"; cout << "Lagerbestimmungsprogramm am Bsp. FAG Kegelrollenlager\n\n" << endl; cout << "Geben Sie die konstruktiven Merkmale an:" << endl; cout << "\n\nAxialkraft in kN: "; cin >> Fa; Fa=fabs(Fa); cout << "\nRadialkraft in kN: "; //cin << Fr; cin >> Fr; Fr=fabs(Fr); cout << "\n(1)einseitige oder (2)zweiseitige axiale Belastung?: "; do { cin >> axial; if(axial == 1 || axial == 2 ) break; } while(1); cout << "\nGewünschte Lebensdauer: "; cin >> L; cout << "\nWellendurchmesser: "; cin >> d; cout << "\nDrehzahl in min^-1: "; cin >> n; if(n<=10) { statBeanspruchung statBea(Fr, Fa, L, n, axial, LagerDatei); for(unsigned x =0; x<= statBea.get_d_size(); x++) if( statBea.get_d(x) == d ) optLager = statBea.SucheLagerStat(x); cout << "\n\nDas entsprechende Lager entspricht FAG" << statBea.get_typ(optLager) << " und hat eine Einbaudurchmesser D von " << statBea.get_D(optLager) << endl; } else { dynBeanspruchung dynBea(Fr, Fa, L, n, axial, LagerDatei); for(unsigned x=0; x<=dynBea.get_d_size(); x++) if(dynBea.get_d(x)==d) optLager = dynBea.SucheLagerDyn(x); cout << "\n\nDas entsprechende Lager entspricht FAG" << dynBea.get_typ(optLager) << " und hat eine Einbaudurchmesser D von " << dynBea.get_D(optLager) << endl; } getch(); return 0; }Es ist immer noch nicht das grüne vom Ei, aber ich hab keine Ahnung was du da berechnest. Das ist auch der Grund warum ich deins nur noch mal überarbeitet habe.
Ich wüsste nur gern wie du auf den Gedanken kommst ich sei Informatik-Student.
Ich bin weder Student noch habe ich Abitur oder einen IT-Beruf erlernt. Ich hab mir alles auch nur selbst bei gebracht....
MfG
-
evilissimo schrieb:
Es ist immer noch nicht das grüne vom Ei

-
Michael E. schrieb:
evilissimo schrieb:
Es ist immer noch nicht das grüne vom Ei

lol
hab ich gar net gecheckt *g*
-
So ich hab mir den Code mit eurer Hilfe nochmal verbessert. Ist soweit auch auführber, nur das er mir ein acccess volation ausspuckt. Er meint, wenn ich folgende Eingaben mache:
Fr=1
axial=1
Fr=1
d=25
n=3000
L=20000, dass optLager=-8xxxxxxxxx ist.
// Lagersoftware.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <cmath> #include <vector> #include <conio.h> #include <string> #include <iostream> #include <iomanip> #include <fstream> #include <boost/lexical_cast.hpp> using namespace std; class Lagerdaten { protected: vector <float> e, dynC, statC, y, y0; string Datei; public: vector <int> d; vector <int> D; vector <string> typ; Lagerdaten(string LagerDatei) { Datei=LagerDatei; } void Einlesen(); }; void Lagerdaten::Einlesen() { ifstream Lagerliste(Datei.c_str()); Lagerliste.seekg(ios::beg); std::string tmp; while (!Lagerliste.eof() && !Lagerliste.fail() ) { getline(Lagerliste,tmp,'\t'); d.push_back(boost::lexical_cast<int>(tmp)); getline(Lagerliste,tmp,'\t'); D.push_back(boost::lexical_cast<int>(tmp)); getline(Lagerliste,tmp,'\t'); dynC.push_back(boost::lexical_cast<float>(tmp)); getline(Lagerliste,tmp,'\t'); e.push_back(boost::lexical_cast<float>(tmp)); getline(Lagerliste,tmp,'\t'); y.push_back(boost::lexical_cast<float>(tmp)); getline(Lagerliste,tmp,'\t'); statC.push_back(boost::lexical_cast<float>(tmp)); getline(Lagerliste,tmp,'\t'); y0.push_back(boost::lexical_cast<float>(tmp)); getline(Lagerliste,tmp); typ.push_back(tmp); } } class dynBeanspruchung : public Lagerdaten { double Fr, Fa; int L, n, axial; double p(int z); public: dynBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { FR=Fr; FA=Fa; LL=L; N=n; AXIAL=axial; } int SucheLagerDyn(int y); }; double dynBeanspruchung::p(int z) { double p; if ((Fa/Fr)<=e[z]) { if (axial==1) p=Fr; else p=Fr+1.12*y[z]*Fa; } else { if (axial==1) p=0,4*Fr+y[z]*Fa; else p=0.67*Fr+1.68*y[z]*Fa; } return p; } int dynBeanspruchung::SucheLagerDyn(int y) { Einlesen(); double CTRAG; int IndexOpt=1; CTRAG=pow((L*n*60/1000000),(3/10))*p(y); if (axial==2) CTRAG=CTRAG/1.715; if (dynC[y]<=CTRAG) IndexOpt=y; return IndexOpt; } class statBeanspruchung : public Lagerdaten { double Fr, Fa; int L, n, axial; double p(int z); public: statBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { FR=Fr; FA=Fa; LL=L; N=n; AXIAL=axial; } int SucheLagerStat(int y); }; double statBeanspruchung::p(int z) { double p; if ((Fa/Fr)<=(1/(2*y0[z]))) { if (axial==1) p=Fr; else p=0.5*Fr+y0[z]*Fa; } else { p=Fr+2*y0[z]*Fa; } return p; } int statBeanspruchung::SucheLagerStat(int y) { Einlesen(); double CTRAG; int IndexOpt=1; CTRAG=pow((L*n*60/1000000),(3/10))*p(y); if (axial==2) CTRAG=CTRAG/1.715; if (statC[y]<=CTRAG) IndexOpt=y; return IndexOpt; } int main() { double Fa, Fr; int axial, L, durchmesser, n, optLager; string LagerDatei = "lager.txt"; cout << "Lagerbestimmungsprogramm am Bsp. FAG Kegelrollenlager\n\n" << endl; cout << "Geben Sie die konstruktiven Merkmale an:" << endl; cout << "\n\nAxialkraft in kN: "; cin >> Fa; Fa=fabs(Fa); cout << "\n(1)einseitige oder (2)zweiseitige axiale Belastung?: "; do cin >> axial; while(!axial==1 || !axial==2); cout << "\nRadialkraft in kN: "; cin >> Fr; Fr=fabs(Fr); cout << "\nWellendurchmesser: "; cin >> durchmesser; cout << "\nDrehzahl in min^-1: "; cin >> n; cout << "\nGewünschte Lebensdauer: "; cin >> L; if(n<=10) { class statBeanspruchung statBea(Fr, Fa, L, n, axial, LagerDatei); for(int x=1; x<=statBea.d.size(); x++) { if(statBea.d[x]==durchmesser) optLager = statBea.SucheLagerStat(x); } cout << "\n\nDas entsprechende Lager entspricht FAG" << statBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << statBea.D[optLager] << endl; } else { class dynBeanspruchung dynBea(Fr, Fa, L, n, axial, LagerDatei); for(int x=1; x<=dynBea.d.size(); x++) { if(dynBea.d[x]==durchmesser) optLager = dynBea.SucheLagerDyn(x); } cout << "\n\nDas entsprechende Lager entspricht FAG" << dynBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << dynBea.D[optLager] << endl; } getch(); return 0; }Hier die Textdatei lager.txt!
15 35 15 0,35 1,73 14,3 0,95 30202A 15 42 23,2 0,29 2,11 20,8 1,16 30302A 17 40 19,3 0,35 1,74 19 0,96 30203A 17 40 29 0,31 1,92 30 1,06 32203A 17 47 28 0,29 2,11 25 1,16 30303A 17 47 36,5 0,29 2,11 36,5 1,16 32303A 20 42 24 0,37 1,6 29 0,88 32004X 20 47 27,5 0,35 1,74 27,5 0,96 30204A 20 52 34,5 0,3 2 33,5 1,1 30304A 20 52 31 0,73 0,82 30,5 0,45 31304 20 52 46,5 0,3 2 48 1,1 32304A 25 47 26,5 0,43 1,39 34 0,77 32005X 25 52 32,5 0,37 1,6 35,5 0,88 30205A 25 52 40,5 0,36 1,67 45 0,92 32205A 25 52 49 0,35 1,71 58,5 0,94 33205 25 62 47,5 0,3 2 46,5 1,1 30305A 25 62 38 0,83 0,73 39 0,4 31305A 25 62 63 0,3 2 65,5 1,1 32305A 28 52 34 0,43 1,39 40,5 0,77 320/28XWoran kann das liegen.
-
Was mir suspekt vorkommt ist
for(int x=1; x<=dynBea.d.size(); x++) { if(dynBea.d[x]==durchmesser) optLager = dynBea.SucheLagerDyn(x); }es sollte vielmehr
for(int x=0; x<dynBea.d.size(); x++) { if(dynBea.d[x]==durchmesser) optLager = dynBea.SucheLagerDyn(x); }heissen da bei einem vektor die indizes von 0 bis size() -1 gültig sind
Das selbe gilt natürlich auch bei der statischen beanspruchung.
Kurt
-
Weiß den keine, was hier der elementare Fehler ist?!?!?!
#include "stdafx.h" #include <cmath> #include <vector> #include <conio.h> #include <string> #include <iostream> #include <iomanip> #include <fstream> using namespace std; class Lagerdaten { protected: vector <int> d; vector <float> e, dynC, statC, y, y0; string Datei; public: vector <int> D; vector <string> typ; Lagerdaten(string LagerDatei) { Datei=LagerDatei; } void Einlesen(); }; void Lagerdaten::Einlesen() { int dtmp, Dtmp; float dynCtmp, etmp, ytmp, statCtmp, y0tmp; string typtmp; ifstream liste((char*) &Datei,ios::binary); liste.seekg(ios::beg); do { liste.getline((char*) &dtmp,sizeof(dtmp),'\t'); d.push_back(dtmp); liste.getline((char*) &Dtmp,sizeof(Dtmp),'\t'); D.push_back(Dtmp); liste.getline((char*) &dynCtmp,sizeof(dynCtmp),'\t'); dynC.push_back(dynCtmp); liste.getline((char*) &etmp,sizeof(etmp),'\t'); e.push_back(etmp); liste.getline((char*) &ytmp,sizeof(ytmp),'\t'); y.push_back(ytmp); liste.getline((char*) &statCtmp,sizeof(statCtmp),'\t'); statC.push_back(statCtmp); liste.getline((char*) &y0tmp,sizeof(y0tmp),'\t'); y0.push_back(y0tmp); liste.getline((char*) &typtmp,sizeof(typtmp)); typ.push_back(typtmp); } while (!liste.eof() && !liste.fail()); } class dynBeanspruchung : public Lagerdaten { double Fr, Fa; int L, n, axial; double p(int z); public: dynBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { Fr=FR; Fa=FA; L=LL; n=N; axial=AXIAL; } int SucheLagerDyn(int durchmesser); }; double dynBeanspruchung::p(int z) { double p; if ((Fa/Fr)<=e[z]) { if (axial==1) p=Fr; else p=Fr+1.12*y[z]*Fa; } else { if (axial==1) p=0.4*Fr+y[z]*Fa; else p=0.67*Fr+1.68*y[z]*Fa; } return p; } int dynBeanspruchung::SucheLagerDyn(int durchmesser) { Einlesen(); double CTRAG; int IndexOpt=-1; for(unsigned short int x=0; x<=d.size(); x++) { if(d[x]==durchmesser) { CTRAG=pow((L*n*60/1000000),(3/10))*p(x); if (axial==2) CTRAG=CTRAG/1.715; if (dynC[x]<=CTRAG) IndexOpt=x; } } return IndexOpt; } class statBeanspruchung : public Lagerdaten { double Fr, Fa; int L, n, axial; double p(int z); public: statBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { FR=Fr; FA=Fa; LL=L; N=n; AXIAL=axial; } int SucheLagerStat(int y); }; double statBeanspruchung::p(int z) { double p; if ((Fa/Fr)<=(1/(2*y0[z]))) { if (axial==1) p=Fr; else p=0.5*Fr+y0[z]*Fa; } else { p=Fr+2*y0[z]*Fa; } return p; } int statBeanspruchung::SucheLagerStat(int durchmesser) { Einlesen(); double CTRAG; int IndexOpt=-1; for(unsigned short int x=0; x<=d.size(); x++) { if(d[x]==durchmesser) { CTRAG=pow((L*n*60/1000000),(3/10))*p(x); if (axial==2) CTRAG=CTRAG/1.715; if (statC[x]<=CTRAG) IndexOpt=x; } } return IndexOpt; } int main() { double Fa, Fr; int axial, L, durchmesser, n; int optLager; string LagerDatei = "lager.txt"; cout << "Lagerbestimmungsprogramm am Bsp. FAG Kegelrollenlager\n\n" << endl; cout << "Geben Sie die konstruktiven Merkmale an:" << endl; cout << "\n\nAxialkraft in kN: "; cin >> Fa; Fa=fabs(Fa); cout << "\n(1)einseitige oder (2)zweiseitige axiale Belastung?: "; cin >> axial; cout << "\nRadialkraft in kN: "; cin >> Fr; Fr=fabs(Fr); cout << "\nWellendurchmesser: "; cin >> durchmesser; cout << "\nDrehzahl in min^-1: "; cin >> n; cout << "\nGewünschte Lebensdauer: "; cin >> L; if(n<=10) { class statBeanspruchung statBea(Fr, Fa, L, n, axial, LagerDatei); optLager = statBea.SucheLagerStat(durchmesser); if(optLager>=0) cout << "\n\nDas entsprechende Lager entspricht FAG" << statBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << statBea.D[optLager] << endl; else cout << "Fehler!" << endl; } else { class dynBeanspruchung dynBea(Fr, Fa, L, n, axial, LagerDatei); optLager = dynBea.SucheLagerDyn(durchmesser); if(optLager>=0) cout << "\n\nDas entsprechende Lager entspricht FAG" << dynBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << dynBea.D[optLager] << endl; else cout << "Fehler!" << endl; } getch(); return 0; }
-
Die funktion Lagerdaten::Einlesen() ist total falsch. ifstream::getline() liest einen string und den kannst du nicht einfach in ein integer oder float casten.
Die Version mit boost::lexical_cast war schon richtig.
Kurt
-
Selbst dann funktioniert es nicht. Probiert es doch mal bitte aus, die lager.txt hab ich doch oben schon geposted. Ich bin echt verzweifelt!!!!!

-
Habe ein paar fehler gefunden.
lager.txt hat ein falsches format. die tabs als trennzeichen zwischen den werten sind verschwunden ( möglicherweise durchs forum ). ausserdem sind die kommas im file beistriche. ( zumindest mein compiler will punkte ).15 35 15 0.35 1.73 14.3 0.95 30202A 15 42 23.2 0.29 2.11 20.8 1.16 30302A 17 40 19.3 0.35 1.74 19 0.96 30203A 17 40 29 0.31 1.92 30 1.06 32203A 17 47 28 0.29 2.11 25 1.16 30303A 17 47 36.5 0.29 2.11 36.5 1.16 32303A 20 42 24 0.37 1.6 29 0.88 32004X 20 47 27.5 0.35 1.74 27.5 0.96 30204A 20 52 34.5 0.3 2 33.5 1.1 30304A 20 52 31 0.73 0.82 30.5 0.45 31304 20 52 46.5 0.3 2 48 1.1 32304A 25 47 26.5 0.43 1.39 34 0.77 32005X 25 52 32.5 0.37 1.6 35.5 0.88 30205A 25 52 40.5 0.36 1.67 45 0.92 32205A 25 52 49 0.35 1.71 58.5 0.94 33205 25 62 47.5 0.3 2 46.5 1.1 30305A 25 62 38 0.83 0.73 39 0.4 31305A 25 62 63 0.3 2 65.5 1.1 32305A 28 52 34 0.43 1.39 40.5 0.77 320/28Xich habe noch ein paar logikfehler gefunden. sind in code als kommentar gekennzeichnet. Ich verstehe nicht wirklich was du da rechnest und wie diese liste zu lesen ist daher sihh dir meine änderungen noch mal an. Ausserdem habe ich ein paar debug-outputs eingefügt, das sollte bei der fehlersuche hilfreich sein.
#include <cmath> #include <vector> #include <string> #include <iostream> #include <iomanip> #include <fstream> using namespace std; class Lagerdaten { protected: vector <int> d; vector <float> e, dynC, statC, y, y0; string Datei; public: vector <int> D; vector <string> typ; Lagerdaten(string LagerDatei) { Datei=LagerDatei; } void Einlesen(); }; void Lagerdaten::Einlesen() { char typtmp[200]; ifstream liste(Datei.c_str()); // cast geht nicht liste.seekg(ios::beg); // warum binär ?? do { liste.getline( typtmp,sizeof(typtmp),'\t'); d.push_back(atoi(typtmp)); liste.getline( typtmp,sizeof(typtmp),'\t'); D.push_back(atoi(typtmp)); liste.getline( typtmp,sizeof(typtmp),'\t'); dynC.push_back(atof(typtmp)); liste.getline( typtmp,sizeof(typtmp),'\t'); e.push_back(atof(typtmp)); liste.getline( typtmp,sizeof(typtmp),'\t'); y.push_back(atof(typtmp)); liste.getline( typtmp,sizeof(typtmp),'\t'); statC.push_back(atof(typtmp)); liste.getline( typtmp,sizeof(typtmp),'\t'); y0.push_back(atof(typtmp)); liste.getline( typtmp,sizeof(typtmp),'\n'); // hier bis end of line typ.push_back(typtmp); } while (!liste.eof() && !liste.fail()); // for ( int i= 0; i < d.size(); i++ ) { // cout << d[i] << "\t" << D[i] << "\t" << dynC[i] << "\t" << e[i] << "\t" << y[i] << "\t" << statC[i]; // cout << "\t" << y0[i] << "\t" << typ[i] << endl; // } } class dynBeanspruchung : public Lagerdaten { double Fr, Fa; int L, n, axial; double p(int z); public: dynBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { Fr=FR; Fa=FA; L=LL; n=N; axial=AXIAL; cout << "dynBeanspruchung::dynBeanspruchung( Fr=" << Fr << " Fa=" << Fa << " L="<< L << " n=" << n << " axial=" << axial << ")" << endl; } int SucheLagerDyn(int durchmesser); }; double dynBeanspruchung::p(int z) { double p; if ((Fa/Fr)<=e[z]) { if (axial==1) p=Fr; else p=Fr+1.12*y[z]*Fa; } else { if (axial==1) p=0.4*Fr+y[z]*Fa; else p=0.67*Fr+1.68*y[z]*Fa; } cout << "double dynBeanspruchung::p( z = " << z << " ) returns " << p << endl; return p; } int dynBeanspruchung::SucheLagerDyn(int durchmesser) { Einlesen(); cout << "dynBeanspruchung::SucheLagerDyn( durchmesser = " << durchmesser << " )" << endl; double CTRAG; int IndexOpt=-1; for(unsigned short int x=0; x < d.size(); x++) { // index 0 bis size -1 if(d[x]==durchmesser) { CTRAG=pow((double)(L*n*60/1000000),(3/10))*p(x); if (axial==2) CTRAG=CTRAG/1.715; cout << "CTRAG= " << CTRAG << " dynC[x]= " << dynC[x] << endl; // if (dynC[x]<=CTRAG) { if (dynC[x]>=CTRAG) { //gefunden wenn dynC > CTRAG ?? IndexOpt=x; cout << "returning " << typ[x] << endl; break; // ??? } } } return IndexOpt; } class statBeanspruchung : public Lagerdaten { double Fr, Fa; int L, n, axial; double p(int z); public: statBeanspruchung(double FR, double FA, int LL, int N, int AXIAL, string LAGERDATEI) : Lagerdaten(LAGERDATEI) { Fr=FR; Fa=FA; L=LL; n=N; axial=AXIAL; cout << "statBeanspruchung::statBeanspruchung( Fr=" << Fr << " Fa=" << Fa << " L=" << L << " n=" << n << " axial=" << axial << " )" << endl; } int SucheLagerStat(int y); }; double statBeanspruchung::p(int z) { double p; if ((Fa/Fr)<=(1/(2*y0[z]))) { if (axial==1) p=Fr; else p=0.5*Fr+y0[z]*Fa; } else { p=Fr+2*y0[z]*Fa; } cout << "double statBeanspruchung::p( z = " << z << " ) returns " << p << endl; return p; } int statBeanspruchung::SucheLagerStat(int durchmesser) { Einlesen(); cout << "statBeanspruchung::SucheLagerStat( durchmesser = " << durchmesser << " )" << endl; double CTRAG; int IndexOpt=-1; for(unsigned short int x=0; x < d.size(); x++) { // index 0 bis size -1 if(d[x]==durchmesser) { CTRAG=pow(( double )(L*n*60/1000000),(3/10))*p(x); if (axial==2) CTRAG=CTRAG/1.715; cout << "CTRAG= " << CTRAG << " dynC[x]= " << dynC[x] << endl; // if (statC[x]<=CTRAG) { if (dynC[x]>=CTRAG) { //gefunden wenn dynC > CTRAG ?? IndexOpt=x; cout << "returning " << typ[x] << endl; break; // don't know ?? } } } return IndexOpt; } int main() { double Fa, Fr; int axial, L, durchmesser, n; int optLager; string LagerDatei = "lager.txt"; cout << "Lagerbestimmungsprogramm am Bsp. FAG Kegelrollenlager\n\n" << endl; cout << "Geben Sie die konstruktiven Merkmale an:" << endl; cout << "\n\nAxialkraft in kN: "; cin >> Fa; Fa=fabs(Fa); cout << "\n(1)einseitige oder (2)zweiseitige axiale Belastung?: "; cin >> axial; cout << "\nRadialkraft in kN: "; cin >> Fr; Fr=fabs(Fr); cout << "\nWellendurchmesser: "; cin >> durchmesser; cout << "\nDrehzahl in min^-1: "; cin >> n; cout << "\nGewünschte Lebensdauer: "; cin >> L; if(n<=10) { class statBeanspruchung statBea(Fr, Fa, L, n, axial, LagerDatei); optLager = statBea.SucheLagerStat(durchmesser); if(optLager>=0) cout << "\n\nDas entsprechende Lager entspricht FAG" << statBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << statBea.D[optLager] << endl; else cout << "Fehler!" << endl; } else { class dynBeanspruchung dynBea(Fr, Fa, L, n, axial, LagerDatei); optLager = dynBea.SucheLagerDyn(durchmesser); if(optLager>=0) cout << "\n\nDas entsprechende Lager entspricht FAG" << dynBea.typ[optLager] << " und hat eine Einbaudurchmesser D von " << dynBea.D[optLager] << endl; else cout << "Fehler!" << endl; } return 0; }viel spass Kurt
-
sehr viele unsigned signed mischungen
-
nicht gut

-
fürs verschönern fühl ich mich nicht zuständig.

Kurt
-
Irgendwie ist es doch ziemlich unnötige bei diesem Datenformat mit getline einzulesen. Was spricht gegen ein einfaches Einlesen mit dem op>>?
Dann eine struct bauen, wo jeweils die Werte einer Zeile drin sind.
Also:
struct record { int d; int D; float dynC; float e; float y; float statC; float y0; std::string typ; }; // nebst std::istream & operator>>(std::istream & in, record & object) { in >> object.d; in >> object.D; // ... in >> object.typ; return in; }Damit zerfällt die Einlese-Schleife zu:
std::vector<record> dataset; ifstream file(filename); for(record r; file >> r;) { dataset.push_back(r); }Das ist doch schon viel netter.
Jetzt zu den Funktionen. Da läufst Du ja immer über alle Einträge des dataset unr berechnest irgendwelche Sachen.
Trenne das. Schreib ne Funktion, die das was Du berechnen willst für einen Record tut und bau dann ne eigene Funktion, die nix anderes macht als ne Schleife zu laufen und die entsprechende Funktion für Records aufzurufen.---------------------------------------------------------------------------
Vielleicht lohnt es sich diese Funktionen ja in die record-struct zu verschieben?
Dann könnte man die Berechnungen in einem transform vornehmen -> Schleife weg.
Die Ergebnisse in nem vector sichern und mit maxelement das größte rausholen.Tatsächlich bräuchte man die Funktion mit der Schleife vielleicht nur einmal und man würde ihr als Parameter die Funktion übergeben, die sie berechnen soll.
Aber das führt jetzt vielleicht ein bißchen weit.
Bis zu den --------- lohnt es sich aber auf jeden Fall das mal umzusetzen. Du wirst sehen, ist der Code kürzer (bzw. die einzelnen Funktionen), so sieht man auch mehr und weiß genauer wo man hinlangen muß.
MfG Jester