Zum Inhalt springen

Orffi

Mitglieder
  • Gesamte Inhalte

    252
  • Benutzer seit

  • Letzter Besuch

Beiträge von Orffi

  1. Was geht denn hier ab?

    Wenn er die Frage nunmal hat, dann kann er sie ja auch stellen, wenn Du sie zu blöd findest, dann mußt Du ja nicht antworten.

    Aber das nur am Rande, worum es mir hauptsächlich geht, ist, daß MSDN hier völlig die falsche Adresse ist. Es mag sein, daß man dort eine Antwort findet (vielleicht sogar eine Richtige), aber MSDN ist nicht (ich wiederhole NICHT) die Instanz, die hier die Antworten gibt. Hier muß man im Sprachstandard nachsehen und nirgendwo sonst. Wenn man den nicht bei sich 'rumfliegen hat, dann kann mman auch in einem C++Buch nachsehen, aber nicht bei einem Hersteller von Compilern.

    Jan

  2. Dir braucht eigentlich keiner Aufschreiben, wie es funktioniert, denn mit dem C++Builder werden die Hilfedateien des MS SDK mitgeliefert. Dort findest Du alle Informationen. Am besten schaust Du Dir einmal an, wie ich GetComputerName benutzt habe und siehst Dir dann die Hilfe im SDK an. Das sollte einige Fragen klären, so daß Du alle API Befehlen benutzen kannst.

    Jan

  3. Abgesehen davon, daß ich den Begriff if-Schleife nicht besonders mag, muß man, so denke ich drei Dinge unterscheiden:

    break

    return

    exit

    break:

    Der C++ Standard besagt, daß break nur in "iteration statements" oder im switch block auftreten darf. Iteration statements sind while, do-while und for-Schleifen. break steigt aus der Schleife aus, beendet sie also. Wenn es noch eine äußere Schleife gibt wird die natürlich weiter ausgeführt.

    return:

    return springt aus der Funktion heraus, zurück zur aufrufenden Funktion.

    exit:

    exit ist eine Funktion aus <cstdlib>. exit (rückgabewert) beendet das Programm. Dem Aufrufenden Programm wird als Ergebnis der rückgabewert aus exit übergeben.

    Es gibt auch noch abort, dies sollte aber vermieden werden, weil híer das Programm nicht normal beendet wird.

    HTH

    Jan

  4. Ich habe mal schnell ein Beispiel für GetComputername zusammengekloppt. Es nicht besonders toll, zeigt wohl aber das Entscheidende.

    
    char compname[MAX_COMPUTERNAME_LENGTH+1];
    
        unsigned long len = MAX_COMPUTERNAME_LENGTH + 1;
    
    
        if ( ::GetComputerName ( compname, &len ) )
    
        {
    
            AnsiString name ( compname, len );
    
            ShowMessage ( name );
    
        }
    
    

    HTH

    Jan

  5. "generell kann man sagen, dass quick sort eigentlich das schnellste sortierverfahren ist, das existiert. "

    Und das kann man genau nicht sagen. Das von Dir schon erwähnte Heapsort ist im worst-case-Fall schneller als Quicksort. Quicksort hat im worst-case eine Laufzeit von O(n²) und im average-case O(n log n). Heapsort hat in beiden Fällen die Laufzeit O(n log n)!

    Es geht aber noch schneller: Wenn bestimmte Bedingungen erfüllt sind, kann ich auch in O(n) sortieren. Siehe Radix/BucketSort.

    Jan

  6. Du weißt aber schon, wie man Bubble Sort und Quick Sort in C++ programmiert, oder? Wenn dem so ist, dann sollte es ja nicht mehr so schwer sein, die Verfahren einzubinden.

    Die Frage, welcher Sortieralgorithmus am besten ist, läßt sich so generell nicht sagen. Aber wenn Du zum Beispiel nur 20 Einträge sortieren willst, dann kann man auch ganz gut mit einem Bubble Sort leben. Es lohnt sich manchmal eben nicht, irre viel Zeit und Komplexität in ein Sortierverfahren zu stopfen, das selten aufgerufen wird und keine großen Daten sortieren muß.

    HTH

    Jan

  7. Jetzt geht hier aber einiges durcheinander. Wenn ich das Minimum finden möchte, dann muß ich wohl oder übel durch meine ganzen Daten "durchwandern". Es sei denn, ich habe eine Struktur, die beim Einfügen (oder sonstwann) sortiert. Dann kann ich ja wissen, daß das Minimum vorne oder auch hinten steht (je nach dem, wie man sortiert). Mit BubbleSort hat das nicht so viel zu tun. Eine Hashtable ist eine Struktur, die nicht sortiert. Hier weiß man nicht, an welcher Stelle das Minimum gespeichert ist. Also muß ich mir alle Werte anschauen, um das Minimum zu erhalten.

    Hallo Welt und BubbleSort haben übrigens durchaus ihre Berechtigungen, aber das würde hier wohl zu weit vom Thema wegführen.

    Jan

  8. Ich habe vor langer Zeit auch mal so ein Programm geschrieben. Ist nicht besonders hübsch, aber wen es stört, kann es ja ändern. Heute morgen hatte ich jedenfalls keine Lust dazu. Ich habe meine Funktion, die berechnet werden soll als Klasse implementiert und dann an das Template übergeben.

    
    # include <iostream>
    
    # include <math>
    
    
    class TIntervall
    
    {
    
        private:
    
            double FIntervall[2];
    
            int FIntervallSwitch;
    
        public:
    
            TIntervall ( void );
    
            TIntervall ( double, double );
    
            void setIntervall ( double, double );
    
            double getLowerBorder ( void );
    
            double getHigherBorder ( void );
    
    };
    
    
    TIntervall :: TIntervall ( void )
    
    {
    
        FIntervallSwitch = 0;
    
    
        FIntervall[0] = 0.0;
    
        FIntervall[1] = 0.0;
    
    }
    
    
    TIntervall :: TIntervall ( double a, double b )
    
    {
    
        setIntervall ( a, b );
    
    }
    
    
    void TIntervall :: setIntervall ( double a, double b )
    
    {
    
        if ( a < b )
    
            FIntervallSwitch = 0;
    
        else
    
            FIntervallSwitch = 1;
    
    
        FIntervall[FIntervallSwitch%2] = a;
    
        FIntervall[FIntervallSwitch%2+1] = b;
    
    }
    
    
    double TIntervall :: getLowerBorder ( void )
    
    {
    
        return FIntervall[FIntervallSwitch%2];
    
    }
    
    
    double TIntervall :: getHigherBorder ( void )
    
    {
    
        return FIntervall[FIntervallSwitch%2+1];
    
    }
    
    
    //---------------------------------------------------------------------------
    
    
    template <class Function> class TTrapez
    
    {
    
        public:
    
            double integrate ( TIntervall, int );
    
    };
    
    
    template <class Function>
    
    double TTrapez <Function> :: integrate ( TIntervall inter, int n )
    
    {
    
        Function f;
    
        double ret = f ( inter.getLowerBorder () ) + f ( inter.getHigherBorder () );
    
        double step = ( inter.getHigherBorder () - inter.getLowerBorder () ) / n;
    
    
        for ( int i = 1; i < n; i++ )
    
            ret += 2 * f ( inter.getLowerBorder () + i * step );
    
    
        return ret * ( step / 2 );
    
    }
    
    
    //---------------------------------------------------------------------------
    
    
    template <class Function> class TSimpson
    
    {
    
        public:
    
            double integrate ( TIntervall, int );
    
    };
    
    
    template <class Function>
    
    double TSimpson <Function> :: integrate ( TIntervall inter, int n )
    
    {
    
        Function f;
    
        double ret = f ( inter.getLowerBorder () ) + f ( inter.getHigherBorder () );
    
        double step = ( inter.getHigherBorder () - inter.getLowerBorder () ) /
    
                        ( 2 * n );
    
    
        for ( int i = 1; i < ( 2 * n ); i++ )
    
            ret += ( 2 * ( i % 2 ) + 2 ) * f ( inter.getLowerBorder () + i * step );
    
    
        return ret * ( step / 3 );
    
    }
    
    
    //---------------------------------------------------------------------------
    
    
    class TSinus
    
    {
    
        public:
    
            double operator() ( double );
    
    };
    
    
    double TSinus :: operator () ( double x )
    
    {
    
        return std::sin ( x );
    
    }
    
    
    //---------------------------------------------------------------------------
    
    
    int main ( void )
    
    {
    
        TTrapez <TSinus> TrapezIntegral;
    
        TSimpson <TSinus> SimpsonIntegral;
    
        TIntervall intervall ( 0, 1 );
    
    
        std::cout.precision ( 20 );
    
        std::cout << "Ergebnisse fuer f(x) = sin(x) mit Trapezregel: " << std::endl;
    
    
        for ( int i = 1; i < 11; i++ )
    
        {
    
    	std::cout << "Fuer n = ";
    
            std::cout.width ( 2 );
    
            std::cout << i << ": " << TrapezIntegral.integrate ( intervall, i ) << std::endl;
    
        }
    
    
    	std::cout << std::endl << "Ergebnisse fuer f(x) = sin(x) mit Simpson-Regel: " << std::endl;
    
    
        for ( int i = 1; i < 11; i++ )
    
        {
    
    	std::cout << "Fuer n = ";
    
            std::cout.width ( 2 );
    
            std::cout << i << ": " << SimpsonIntegral.integrate ( intervall, i ) << std::endl;
    
        }
    
    
        return 0;
    
    }
    
    

    HTH

    Jan

  9. Ich muß ein wenig raten, denn Du hast keine Fehlermeldung mitgeschickt.

    cout und endl sind im Namespace std. Wenn Du die beiden benutzen willst, mußt std::cout und std::endl schreiben. Das könnte ein Fehler sein, wenn das das Problem nicht behebt, dann poste bitte die Fehlermeldung und ein bißchen Code.

    HTH

    Jan

  10. Ehrlich gesagt verstehe ich Klotzkopps Lösung nicht wirklich.

    Aber wenn ich ein Intervall [0,800] nach [-2.5,3] abbilden möchte, dann überlege ich mir zuerst, daß mein neues Intervall die "Länge" 5.5 hat. Also muß ich 800/5.5 berechnen (145.45...). Jetzt geht das Intervall aber von 0 bis 5.5. Um diesen Mißstand zu beheben zieht man noch 2.5 ab.

    Also x Element [0,800]:

    x' = x/145.45.. -2,5. x' ist der entsprechende Wert im neuen Intervall [-2.5,3]

    Im zweiten Fall ist das Intervall 0.5 "lang". Hier verschieben wir das Intervall nach 2.5 also sieht die "Formel" folgendermaßen aus:

    x' = x / 1600 + 2.5

    HTH

    Jan

  11. Die Java Documentation sagt zu java.lang.NullPointerException folgendes: "Thrown when an application attempts to use null in a case where an object is required."

    Das bedeutet zum Beispiel, daß Du auf ein Objekt zugreifen willst, für das Du noch keinen Konstruktor aufgerufen hast., also noch keinen Speicher reserviert hast.

    Jan

  12. @Goos: Wir sind hier im C/C++-Forum. Und void main ( void ) ist kein C/C++! Es ist also nicht OT. Und es sollte wirklich jeden interessieren, daß er richtigen Code schreibt und das in jedem Thread.

    @DocJunioR: Meine Bemerkung sollte eigentlich auch nur am Rande erscheinen und sollte nichts an Deiner Lösung schmälern. Eine Frage hätte ich aber doch:

    Aber mal abgesehen davon, dass ich seltenst Kommandozeilenparameter benutze,...

    Es hat nichts mit Kommandozeilenparametern zu tun. int main (void) ist sehr wohl Standard. Ich bezog mich auf das erste void (void main (void)). Der Standard sagt, man muß einen int zurückliefern.

    Jan

  13. Ich war immer der Meinung, daß PChar ein Zeiger auf ein Zeichen ist. Ich habe eben im C++Builder (obwohl PChar ursprünglich von Delphi stammt, kennt der C++Builder PChar) nachgesehen und der "behauptet" dasselbe.

    PChar ist also nicht ein einzelnes Zeichen, sondern ein Zeiger auf ein Zeichen. Das ist ein sehr wichtiger Unterschied.

    Jan

  14. Ich habe schon weiter oben erwähnt, daß es die Klasse string gibt. Wenn Du also nochmal posten mußt, daß es eine Klasse string gibt, dann mache es bitte auch richtig.

    #include <string.h> ist deprecated. Richtig ist:

    #include<string>

    Was meinst Du mit "...der einen String simuliert"? Mit der Klasse string kann man Strings verwalten. Mehr will man doch gar nicht haben.

    Außerdem kann man mit den Funktionen der Lib Strings durchsuchen, kopieren, aneinanderhängen, etc..

    Die Klasse string bringt diese Funktionalitäten mit. Man muß also nicht die ganze Bibliothek durchsuchen!

    Jan

  15. Ich wollte mit meinem vorherigen Post ja auch nicht sagen, daß man sich auf solche Stellenanzeigen nicht melden soll. Fragen kostet nichts und es kann im schlimmsten Fall ja nur eine Absage werden. Und wenn es klappt, dann ist es ja umso besser.

    Ich denke aber nicht, daß man eine Ausbildung zum Fachinformatiker mit einem Studium zum Dipl. Informatiker gleichsetzen kann.

    Jan

  16. Borland ist ab der Version 5.0 dazu übergegangen, seine Projektdateien in XML zu beschreiben.

    Selbst wenn es eine Möglichkeit gibt, die Projekte zu konvertieren, würde ich davon abraten, da der Builder 1.0 nicht der ganz große Wurf war.

    Im Allgemeinen sollte man versuchen möglichst neue Compiler zu verwenden, da diese sich besser an den Standard halten können. Als der Builder 1.0 erschien gab es noch gar keinen C++ Standard.

    Jan

  17. Wieso kann man in einer Konsolenanwendung nicht objektorientiert programmieren? Ich kann dort doch ebenso mit Klassen arbeiten. Und ehrlich gesagt braucht man auch keine Windows-Anwendung programmieren, um OOP zu verstehen. Ich würde sogar eher sagen, daß es hinderlich ist, weil der C++ Standard verwässert wird. Bei Konsolenanwendungen kann man in 100%igem ISO-C++ programmieren und lernt trotzdem was es heißt, objektorientiert zu programmieren.

    Jan

  18. Seit wann geht wotsit.org nicht mehr? Ich habe es eben mit IE 5.5 und Mozilla 0.99 getestet und es funktioniert wunderbar. Vielleicht hatte die Seite kurzzeitig Probleme aber meistens funktioniert sie ganz gut.

    wotsit.org ist auch DIE Ressource, wenn es um Dateiformate geht.

    Jan

  19. Eigentlich hat TschiTschi schon alles gesagt. Es ist von einem Studium die Rede und in solchen Zusammenhängen wird meistens mit "vergleichbare Ausbildung" ein Mathematik-Studium gemeint. Und es gibt in der Ausbildung zum Dipl. Informatiker schon Unterschiede, wenn man sie mit der Fachinformatik-Ausbildung vergleicht.

    Jan

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...