womit bei boost am "geschicktesten" beginnen?



  • Z.B. boost::rational für Bruchrechnen:

    #include <iostream>
    #include <conio.h> // getch()
    #include <boost/rational.hpp>
    using namespace std;
    using namespace boost;
    
    int main()
    {
      rational<int> a, b, c;
      cout << "Bruch 1:  "; cin >> a;
      cout << "Bruch 2:  "; cin >> b;
      c = a * b;
      cout << "Resultat: " << c << " = " << rational_cast<double>(c);
      getch();
    }
    

    Ausgabe:

    Bruch 1: 33/234
    Bruch 2: 44/444
    Resultat: 121/8658 = 0.0139755

    Zufallszahlen:

    #include <conio.h>
    #include <iostream>
    #include <boost/random/linear_congruential.hpp>
    #include <boost/random/uniform_real.hpp>
    #include <boost/random/variate_generator.hpp>
    using namespace std;
    
    int main()
    {
      int n; 
      double start, ende, zufallszahl, m = 0.0;
    
      cout << "Anzahl:    "; cin >> n;
      cout << "Startzahl: "; cin >> start;
      cout << "Endzahl:   "; cin >> ende; 
    
      boost::minstd_rand  generator(42u);
      generator.seed( unsigned (time(0)) );
      boost::uniform_real<> uni_dist(start,ende);
      boost::variate_generator<boost::minstd_rand&, boost::uniform_real<> > uni(generator, uni_dist);
    
      cout.setf(ios::fixed);
      cout << n << " samples of a uniform distribution in [" << start <<".."<< ende << "]:\n\n";
      for(int i = 0; i < n; ++i)
      {
        zufallszahl = uni();
        cout << zufallszahl << '\t';
        m += zufallszahl;
      }
      m /= n;
      cout << "\n\nMittelwert: " << m << endl;   
    
      getch();
    }
    

    Normalverteilung:

    #include <boost/random.hpp>
    #include <conio.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
     boost::mt19937 generator;
     boost::normal_distribution<> normal_dist(90,5);
     boost::variate_generator< boost::mt19937&, boost::normal_distribution<> > random(generator, normal_dist);
    
     cout << "Mittelwert:         " << normal_dist.mean()  << endl;
     cout << "Standardabweichung: " << normal_dist.sigma() << endl; 
     cout << "Varianz:            " << normal_dist.sigma()*normal_dist.sigma() << endl << endl; 
     for (int i=0;i<30;++i)
         cout << random() << endl;
    
       getch();
    }
    


  • noch ne letzte frage für heute, weil ichd azu in der doku nichts gefunden hab: besitzt boost ein grundgerüst für finite state machines? oder für den tokenizer eine einfache grammatik um einen string nach den gesichtspunkten zahl/bezeichner/mathematische zeichen aufzuteilen?



  • gibts eine datums / zeit klasse in boost ? ( ich find da nix )



  • ja, schau mal date_time an 🙂



  • otze schrieb:

    noch ne letzte frage für heute, weil ichd azu in der doku nichts gefunden hab: besitzt boost ein grundgerüst für finite state machines? oder für den tokenizer eine einfache grammatik um einen string nach den gesichtspunkten zahl/bezeichner/mathematische zeichen aufzuteilen?

    boost::tokenizer benutzt Delimiters, um einen string in Tokens aufzuteilen, siehe z.B. boost::char_separator. Oder vielleicht suchst du lexical_cast?



  • otze schrieb:

    was eigentlichd er sinn des boost::weak_ptr ist?

    Er erhält ein Objekt nicht am Leben. Das ist ein Feature. Manchmal will man ein Objekt nur beobachten. (Für Caches z.B. sehr praktisch.)



  • ne, das is nicht das was ich suche, ich will schon ne tokenizer funktion benutzen, nur halt was andres als boost::char_separator, etwas was wie eine finite state machine funktioniert, aber am besten zeige ichs an einem beispiel:

    15+cos(30+45)+20sin(10)
    wird zu
    <15> <+> <cos> <(> <30> <+> <45> <)> <+> <20> <
    > <sin> <(> <10> <)>

    wobei <> die einzelnen token abtrennen
    dazu brauch ich halt ne kleine grammatik, und die wird am besten mit einer finite state machine implementiert.

    @operator void thx, sowas hab ich mir schon gedacht, aber noch keine sinnvolle anwendungsmöglichkeit dazu entdeckt, oder ist das sowas wie:
    wenn du den pointer locken kannst, dann mach was damit sonst lösche ihn aus der liste, da das objekt zerstört ist



  • Ich habe es zwar noch nie benutzt, aber vielleicht spirit? tokenizer ist dafür definitiv ungeeignet.
    http://www.boost.org/libs/spirit/



  • gut, spirit als micro parser wird für den tokenizer ausreichen, da es mir erstmal nur um die tokens geht(ich will über die tokens dann ein paar sachen ausprobieren)

    //edit ok den tokenizer brauch man wirklich nicht, der parser kann das ziemlich gut^^



  • ah merde, mein compielr ist zu alt-.-

    #if defined(__BORLANDC__) && (__BORLANDC__ <= 0x570)
    # error "Compiler not supported. See note in <boost/spirit/core/config.hpp>"
    

    und? was steht bei mir in der docu?

    __BORLANDC__	0x0560
    

    arrgh, also: neuen compiler suchen-.-

    //edit wa meint ihr, packts der neueste mingw? wollte den schon länger ma ausprobeiren,d er liegt da schons eit fast enr woche in nem ordner rum^^

    //edit2 o der raffts, sieht übrigens ziemlich geil aus, ich werd den bcb wohl doch nicht so sehr missen wie gedacht 😮



  • otze schrieb:

    ja, schau mal date_time an 🙂

    danke
    irgendwie hab ich ein prob mit dieser suchmaschine auf boost.net
    wenn ich time oder date eingeb oder wenn ich sogar data_time eingeb dann findet es nichts



  • ich orientiere mich nicht auf boost.net ich geh in den include ordner schau mir an was es gibt, und wenns sich interessant anhört, folge ich dem link, der im header steht 🙂



  • naja der scource code ist ja nicht wirklich gut lesbar
    ist ja alles stl style 😞



  • es reicht den kommentar im obersten drittel zu lesen, also nix mit stl style^^



  • so, hab jetztw as mit spirit rumexperimentiert, nachdem ich die dokumentation durchgelesen hab, und komm irgendwie nicht weiter,kommen ziemlich viele compilefehler...

    wenn hier jemand unter den anwesenden ist, der sich ein bischen mit spirit auskennt,darf er sich melden 🙂

    #define BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE
    #include <boost/spirit/core.hpp>
    #include <iostream>
    using namespace std;
    using namespace boost::spirit;
    
    void print_number(double i){
    	cout<<i;
    }
    
    void add(char const*, char const*){
    	cout<<'+';
    }
    void sub(char const*, char const*){
    	cout<<'-';
    }
    void mul(char const*, char const*){
    	cout<<'*';
    }
    void div(char const*, char const*){
    	cout<<'/';
    }
    void group(char const*, char const*){
    	cout<<"group";
    }
    struct calculation:public grammar<calculation>{
    	template <typename ScannerT>
    	struct definition{
    		subrule<0> real;
    
    		subrule<1> expression;
    		subrule<2> term;
    		subrule<3> group;
    		subrule<4> summand;
    
    		rule<ScannerT> first;
    
    		definition(calculation const& self){
    			first=
    			(
    				expression=term|real,
    				term=
    					 summand
    					 >>*(		('+'>>summand)[&add]
    						|		('-'>>summand)[&sub]
    						),
    				summand=
    						(real|group)
    						>>*(	('*'>>(real|group))[&mul]
    						|		('/'>>(real|group))[&div]
    						),
    				group=ch_p('(')>>term>>ch_p(')')[&group],
    
    				real=real_p[&print_number]
    			);
    		}
    		rule<ScannerT> const& start() const{
    			return first;
    		}
    	};
    };
    
    int main()
    {
    	calculation a;
        parse("3.143+3.144*(1+2)",a,space_p);
    	int i;
    	cin>>i;
        return 0;
    }
    

    //edit mom ich such mal die verwendbaren programmierfehler raus, der mingw schickt mich andauernd in die header des boosts um den fehler zu suchen^^

    also hier die verwertbaren fehler:

    main.cpp:45: error: no match for 'operator[]' in '
    boost::spirit::operator>>(char, const boost::spirit::parser<DerivedT>&)
    

    //edit 2 fehler gefunden, gab 2 namensproleme. ansonsten is es so richtig-.-
    ps: boah braucht das lange zum compilen, die paar zeilen aufm mingw ca 10secs 😮


Anmelden zum Antworten