
Orffi
Mitglieder-
Gesamte Inhalte
252 -
Benutzer seit
-
Letzter Besuch
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Alle Inhalte von Orffi
-
Ich schließe aus Deinem Quelltext, daß Du C++ benutzt. In C++ gibt es die Klassen string und stringstream. Die kannst Du Dir ja mal ansehen, die organisieren den Speicherbedarf selber. HTH Jan PS: Das kann nicht gehen, weil Du für char* ja Speciher beschaffen mußt und Du letztendlich wieder beim Array-Problem bist
-
Wenn schon, dann so:Ganz einfach, weil es im Standard festgeschrieben ist (siehe Abschnitt 8.3.4 im C++ Standard). Aber Klotzkopp hat den Nagel schon auf den Kopf getroffen und auch eine viel anschaulichere Antwort gegeben. Der Compiler versteht array[5] als *(array + 5), was ja bedeutet, daß man 5 auf seine Ursprungsadresse aufaddiert und davon sich den Inhalt geben läßt. Da man aber schon an der ersten Adresse (*array) schon Daten speichern kann und es auch tut, weil man sonst Speicher verschenken würde, ist array[5] das 6. Datum. Aber nicht verwechseln: type array[5] sind hat nur Platz für 5 Daten; nämlich von array[0]..array[4]. Da der Compiler nur *(array + 5) sieht, darf man auch, wie Klotzkopp schon schrieb, auch 5[array] schreiben, weil es für den Compiler *(5 + array) aussieht. Da wir uns in abelschen mathematischen Gebilden befinden, ist 5+array=array+5. Daß man bei 0 anfängt zu zählen, ist also zum Einen im Standard festgelegt und zum Anderen durch die Vernunft, denn wenn man bei 1 anfangen würde, würde man einen Speicherpaltz verschenken. Natürlich könnte man array[5] als *(array + 5 - 1 ) definieren, aber dann müßte man immer rechnen un das kostet (wenn auch nicht viel) Zeit. Jan
-
cout und cin sind keine Befehle. Es sind beides Objekte. cout ist vom Typ ostream und cin ist vom Typ istream. << ist der normale Operator zum Verschieben von Bits, wurde aber bei diesen Typen überladen. Jan
-
Borland o. Microsoft C++, was ist besser?
Orffi antwortete auf sricky's Thema in C++: Compiler, IDEs, APIs
Ich dachte immer, daß was der Erfinder zu seiner Sprache sagt, wäre korrekt, aber hier habt alle wahrscheinlich die richtige Ausgabe vom Stroustrup und nur meine ist falsch, wo ketzerisch behaupt wird, daß es c plus plus heißt. Aber bevor ich wieder schuld bin, daß ein Thread geschlossen wird: Ich stimme Manne zu. Zum C++ lernen braucht man keine große Compiler-Umgebungen. Es versperrt den Blick auf ISO-C++, da es in den Entwicklungsumgebungen so viele Erweiterungen gibt, die nicht Standard sind. Aber die Standardkonformität vom BCB ist sehr löblich und es macht keinen Sinn mit einem alten C++-Compiler C++ zu lernen, weil dort vielleicht schöne "Features" wie Templates fehlen. Außerdem hat der BCB ein Kommandozeilenprogramm, so daß man mit einem x-beliebigem Editor seine Programme schreiben kann und sie via Kommandozeile compilieren kann. Bei den ersten Schritten kann man so auf die Entwicklungsumgebung verzichten und wird nicht von "unnötigen Beiwerk" erschlagen. Jan -
Borland o. Microsoft C++, was ist besser?
Orffi antwortete auf sricky's Thema in C++: Compiler, IDEs, APIs
Das T bei zum Beispiel TEdit steht für Type. Ich kenn aber keine Programmiersprache die C doppelplus heißt, höchstens C plusplus ;-) Nachzulesen im Stroustrup. Aber jetzt zur Frage, welcher Compiler der Bessere ist. Wie schon viele vor mir meinten, ist es sicherlich eine Geschmackssache. Ohne selbst richtig mit MS Visual C++ gearbeitet zu haben, kann ich aber sagen, daß MSVC++ besser geeignet ist, wenn man in den Eingeweiden von Windows 'rumgraben möchte. Im Netz findet man natürlich auch viel mehr Beispiel für MSVC++. Was mich ein wenig an BCB stört, ist, daß die VCL in Pascal geschrieben ist. Ab und zu erinnert der BCB sowieso eher an Delphi, der nur C++-Syntax statt Objekt-Pascal benutzt. Aber ich bin trotzdem (ich habe ja nur Negativpunkte angeführt) sehr, sehr zufrieden mit BCB und, daß er über dermaßen unstabil sein soll kann ich nicht bestätigen. BCB 1.0 war wohl extrem schlecht und auch die 5.0 soll (ich selbst habe nur mit 3.0 und 4.0 gearbeitet) soll vor dem 1. Update ein wenig "wackelig" gewesen sein. HTH Jan -
Zuerst etwas Wichtiges vorweg: Ich bin davon ausgegangen, daß DU die Flächen von regelmäßigen n-Ecken berechnen möchtest. Dann ist auch die Berechnung von alpha klar: alpha = 360/n. Jetzt solltest Du alles zusammen haben, es sei denn Du willst Flächen von nicht regelmäßigen n-Ecken berechnen... HTH Jan
-
Normalerweise hätte ich jetzt mit einem Link zu den Online-Seiten vom Bronstein geantwortet, aber die Seiten sind zur Zeit nicht erreichbar, weil die Lizenz ausgelaufen ist und die Neuverhandlungen noch laufen. Flächeninhalt: 0.5n*a*r, wobei n die Anzahl der Ecken ist, a, die Kantenlänge und r der Innenkreisradius. Inkreisradius will heißen: Die Länge vom Mittelpunkt aus zum Rand (nicht zur Ecke, sondern wirklich zur Kante). Also vonder Mitte einen geraden Strich nach oben, unten links, rechts. Wenn Du keinen Inkreisradius hast, dann kannst Du folgende, etwas andere Formel nehmen: 0.25*n*a²cot(alpha/2), wobei alpha folgender Winkel ist: Zwei benachbarte Ecken, von denen jeweils eine Linie zum Mittelpunkt führt. Der Winkel alpha ist der Winkel mit dem sich die beiden Linien im Mittelpunkt treffen. Den sollte man ausrechnen können... HTH Jan
-
Gut, dann hast du ja auch noch 1,5 Jahre Zeit, die richtige Einstellung zum Studium zu bekommen. Natürlich besteht ein Studium nicht nur aus Auswendiglernen, sondern auch aus Verstehen und Anwenden. Glaube aber nicht, daß man für Verstehen und Anwenden keine Zeit aufwenden muß. Es dauert schon seine Zeit bis man sich seine "Trickkiste" angelegt hat und den mathematischen Blick besitzt. Es ist auch normal, daß man eine Aufgabe bekommt, für die man gerne mal einen Nachmittag braucht. Den Uni-Alltag kann man überhaupt nicht mit dem Schul-Alltag vergleichen. Jan
-
@Hoernchenmeister81: Ich will Dich ja nicht entmutigen, aber es ist nicht ganz so einfach, wie Du Dir das Vorstellst. Ich weiß nicht, wie gut Du in Mathe bist, aber ich kenne nicht all zu viele Studenten, die ein Mathematikstudium durchziehen und nachmittags arbeiten. In den Semesterferien muß man je nach Uni für seine Prüfungen lernen, denn die liegen außerhalb der Vorlesungszeit. Aber das kann sich je nach Uni unterscheiden, da will ich mich nicht festlegen. Dann zum Thema Doktor: So einfach ist das auch nicht, je nach dem wo Du den Doktor machen willst; an der Uni oder im Betrieb. Es ist auf jeden Fall eine gute Idee sich mal ein Mathematik Vorlesungen anzuhören. Ansonsten wünsche ich Dir viel Erfolg. Jan
-
Gleich bekomme ich vom Moderator auf dem Kopf, weil es nicht mehr zum Thema gehört, aber trotzdem: Nur weil irgendetwas in irgendeinem Compiler funktioniert ist es noch lange nicht Standard. Ich weiß, daß es in ganz vielen Entwicklungsumgebungen funktioniert, aber daß erhebt die Schreibweise nicht zum Standard und macht sie auch nicht richtig. HTH Jan
-
"die Include Dateien sind alles *.h Dateien. " Da die Frage für C++ gilt, ist Deine Antwort nicht richtig. In C++ wird, wenn man den Standard mal genau liest, kein .h angehängt. Und zwar bei keiner Standarddatei. Es heißt #include <iostream> und nicht #include <iostream.h> weiter heißt es #include <cmath> und nicht #include <math.h>! HTH Jan
-
Du bist hier im falschen Forum. "C++: Compiler, IDEs, APIs" wäre das richtige Forum gewesen. Vielleicht verschiebt Dich ein Moderator in das richtige Forum... Zu Deiner Frage: In den Hilfedateien, die mit dem C++Builder mitgeliefert werden, findet sich alles, was Du brauchst, sogar mit Beispielen. Starte einfach den C++Builder und klicke unter Hilfe Index ein. Dort einfach TIniFile eingeben und Du findest alles. HTH Jan
-
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
-
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
-
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
-
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
-
"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
-
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
-
Das ist leider nicht richtig. Ein BubbleSort ist immer mit einer Sortierung verbunden. Nur das Minimum zu finden sortiert die Daten nicht und verändert sie, im Gegensatz zu BubbleSort, auch nicht. Jan
-
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
-
Wenn Du BCB benutzt, dann gibt es in der Klasse TApplication eine Eigenschaft Namens ExeName. Dort ist der Name der Datei und der Pfad enthalten. HTH Jan
-
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
-
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
-
Ist es eine Konsolenanwendung? Benutzt Du Win2k als Betriebssystem? Wenn Du beide Fragen mit ja beantworten kannst/mußt, gibt es keine Lösung. Jan
-
Bruce Eckel stellt auf seinen Seiten auch ein Java-Buch zum download zur Verfügung. http://www.mindview.net/Books Jan