Zum Inhalt springen

flashpixx

Mitglieder
  • Gesamte Inhalte

    8302
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von flashpixx

  1. Ich habe den Code nur überflogen, also nicht gesehen. Da würde ich Dir Git ans Herz legen, denn Du kannst im Moment das ganze "dateibasiert" nutzen, wenn das Projekt größer wird, packst Du das Repo auf einen Server und die Plugins kannst Du über die Git-SVN Schnittstelle direkt dann aus dem SVN in das CMS ziehen. Wieso !? Das MVC Pattern besagt nur, dass wir eine Komponente haben, die Daten vorhält bzw diese pusht. Dann haben wir eine Komponente, die die Daten in irgendeiner Weise rendert und einen Controller, der zwischen diesen Schichten vermittelt. Schau Dir Deinen Code an, Du rufst doch z.B. im Code "klasse::BR" auf, was so denke ich, einen br-Tag im HTML Code erzeugt, d.h. aber bei Dir würde der Controller fehlen, denn Dein Model pusht die Daten direkt an den View. Da würde mich interessieren, wie Du Vererbungshierarchien umsetzt, denn dies sehe ich bei ORMs als generelles Problem. Man erzeugt durch den MDA Ansatz viele Tabellen ohne wirklich nennenswerte Informationsstruktur zu gewinnen. Ich halt eigentlich eine Mixtur, aus agil und klassischem Ansatz für sinnvoll. Agil in dem Bereich wo ich schnell reagieren muss, klassisch in den Bereichen bei denen ich über längere Zeiträume planen kann. Ich bin beides, da ich über einige Jahre Praxis und Theorie verfüge. Ich denke eine rein "gefühlsbasierte" Entwicklung wird bei großen / komplexeren Projekten scheitern, denn gerade dort benötigt man das Fachwissen. Ohne Fachwissen geht es nicht und zusätzlich macht das Fachwissen an vielen Stellen das Design leichter. Du kannst, ich hatte dies hier auch schon mal gepostet, unter WebLaTeX | flashpixx.de hineinschauen. Dies ist zwar kein CMS im eigentlichen Sinne, sondern dafür gedacht LaTeX über ein Webinterface im Rahmen von Arbeitsgruppen zur Verfügung zu stellen. Als weiteres Projekt, das nicht PHP bezogen ist, ist Machine Learning Framework | flashpixx.de Deinen Ansatz bezüglich ORM überdenke ich zurzeit, ob ich diesen eben nicht in mein WebLaTeX Projekt übernehmen soll. Ich sehe eben bei ORM nur das Problem der Hierarchien Dies ist ja auch nicht böse gemeint, sondern meistens hilft es die eigene Arbeit auch mal kritisch zu sehen Das mache ich durchaus gerne. Gruß und frohes Schaffen fpx
  2. flashpixx

    Metadaten

    siehe Internationales Einheitensystem
  3. Ich habe das ganze einmal als Blogeintrag inkl Quellcode beschrieben Damenproblem | flashpixx.de Vieles davon hat Ne0Nebul0sa in ähnlicher Weise umgesetzt. Ich habe in diesem Beispiel sowohl den klassischen Backtracking Ansatz programmiert, wie auch einen heuristischen / zufallsbasierten Ansatz gewählt. Man kann die Vorteile bei großen Brettern mit vielen Figuren erkennen. Die Theorie, dass dies genauso funktioniert, wie Backtracking bzw. in Kombination auch das richtige macht, möchte ich hier nicht im Detail ausführen, da dies dann doch recht komplex wird. Ob man nun Top-Down oder Bottom-Up als Design Grundlage anwendet ist wohl jedem selbst überlassen. Ich denke Top-Down mit dem Bellmannprinzip kombiniert ist wohl die beste Wahl. Bezüglich dem Struktogramm würde ich nicht zwingend sagen, dass sie "überflüssig" sind, denn die einzelne Methode kann als Struktogramm beschrieben werden, was durchaus sinnvoll sein kann. Ansonsten stimme ich damit überein, dass hier die Lehrer leider auch versuchen alte Diagrammemodellierungen in OOP zu pressen, was man häufig sieht, dann schief geht.
  4. Sind ggf Leerzeichen / Umlaute im Dateinamen?
  5. ein CMS zu entwickeln ist durchaus eine sinnvolle Aufgabe, nur wenn Du hier ein Posting verfasst "ich entwickle ein CMS, wer will mit machen", dann ist die erste Frage "warum". Ich selbst nutze z.B. Wordpress und entwickle dafür entsprechende Plugins, denn die Plattform Wordpress bietet im Gegensatz zu Deinem CMS durchaus schon wesentlich mehr. Wenn es Dir darum geht, ein CMS von Grund her aufzubauen, warum möchtest Du die Core Entwicklung selbst machen. Bei meinem flüchtigen Überfliegen des Codes sind noch immense Punkte im Core, die in meinen Augen überarbeitet werden müssen, so dass Du erst einmal ein funktionierendes Core haben musst, damit Du alle weiteren Komponenten sinnvoll anbinden kannst. Das ist aber Grundvoraussetzung, wenn man mit mehreren an einem Projekt arbeitet, denn niemand kann den Code nachvollziehen, wenn dieser nicht kommentiert ist. Aus der Praxis bietet es sich zusätzlich an auf ein einheitliches System wie Kommentierung, Variablen- / Klassen- / Methodenbenennung und Struktur zu einigen (Stichwort Styleguide), damit alle Codes später konsistent sind. Selbst wenn Du allein an einem System entwickelst eine Repository ist eine hilfreiche Investition, vor allem wenn Projekte sich über längere Zeiträume hinziehen. Warum mischst Du dann Ausgabe und Verarbeitung? Man trennt diese Komponenten, gerade in einem CMS möchtest Du die Ausgabe ja individuell z.B. durch Themes anpassen können, d.h. Du benötigst nur ein abstraktes Interface für die Ausgabe, dass dann anhand der Konfiguration überladen wird. Klassisch würde man wohl ein 3-Schicht-Modell (eben MVC) entwerfen, je nach Struktur können auch mehr Schichten vorhanden sein z.B. wenn Du mehrere CMS in einer Ausgabe verbinden willst (Stichwort Mandantenfähigkeit) Nehmen wir mal an, ich kann Deinem CMS eine Extension unterschieben und durch unabgesicherte Funktionsaufrufe Variablen verändern. In diesem Fall kann ich Deinem Script dann ein eigenes unterschieben, das dann vorgaukelt das zu tun, was es tun soll, aber vielleicht noch ganz andere Dinge macht z.B. Passwörter abgreifen bevor sie gehasht werden. Selbst wenn ich nur an gehashte Passwörter komme, dann kann ich aber, weil Du keinen Salt verwendest evtl mit Hilfe einer Rainbow-Table entsprechende Passwörter generieren und mich in Dein System einloggen bzw. mir dadurch auch evtl andere Rechte erschleichen. Ich kann evtl ebenso die Datenbankverbindungsdaten umbiegen bzw. Datenbankzugriffe manipulieren oder ein Cross-Site-Scripting verwenden. Ich verweise Dich einmal auf die PHP Dokumentation PHP: include - Manual auf das Beispiel 3. Wenn es mir möglich ist, dass ich den include-Pfad so verändern kann und erlaubt ist eine URL dort zu platzieren und auszuführen, kann ich Deinem CMS jeden beliebigen PHP Code unterschieben. Generell gilt immer: Niemals ungeprüfte Eingaben verwenden. Zusätzlich ist dieses zusammenbauen von Includepfaden schwer wartbar und auch ein großes Sicherheitsrisiko. Wenn man schon einen OOP Ansatz verwendet, dann sollte man auch die Autoload-Methode von PHP verwenden ( PHP: Autoloading - Manual ). Damit kann ich zentral Codedateien nachladen und vor allem ich kann die Eingaben zentral prüfen. Verwendet man noch Namespaces, dann kann man die Steuerung der zu includieren Dateien sehr fein differenzieren. Da Du intern ein ORM Framework verwendest und soweit ich gesehen habe, es ebenfalls von Dir ist, wäre die Frage warum nutzt Du nicht etwas fertiges wie z:b. Propel, ReadBeanPHP oder Doctrine? Bzw. warum abstrahierst Du die Datenbankanbindung nicht von Deinem ORM z.B. mit PDO oder ADODB? Der Vorteil einer weiteren Abstraktion ist, dass Du nicht weitgehend datenbankunabhängig bist, zusätzlich die Eingaben korrekt für die Datenbank maskiert werden und Du letztendlich viel einfachere mehrere Systeme supporten kannst. Nutzt Du ein fertiges ORM kannst Du es einfach verwenden und der Pflegeaufwand / Bugfixing würde für Dich wegfallen. Die Anmerkungen, die ich geschrieben habe, sind für mich eigentlich die wichtigen Punkte, denn bevor man Themes oder Extensions entwickeln kann, muss das Core auf soliden Füßen stehen, denn wenn z.B. das Interface der Extensions nicht gut durchdacht ist und dieses geändert werden muss, dann zieht dies auch noch zusätzlich viele Änderungen und Inkompatibilitäten der Extensions mit sich. Wenn Du im Core Lücken bezüglich der Sicherheit und Struktur hast, dann wird es mit der Zeit sehr schwierig diese zu isolieren und zu beheben, denn je umfangreicher das Core wird, um so wichtiger ist es dass das Core übersichtlich ist. Wenn ich bei einem solchen Projekt mitarbeiten würde, dann setze ich also voraus, dass ich mich auf ein funktionierendes Core verlassen kann (und mich nicht darum kümmern muss) oder ich eben zuerst einmal mit anderen Entwicklern Zeit investieren muss, damit das Core funktioniert, bevor man überhaupt andere Entwicklungen angehen kann. Ein Core zu entwickeln während noch andere Dinge parallel laufen ist ein fast unmögliches Unterfangen.
  6. Warum ein neues CMS? Ich denke in diesem Bereich gibt es schon sehr viel. Weiterhin, was mir bei der Durchsicht des Codes aufgefallen ist, dass die Kommentierung sehr dürftig ist, ich hätte keine Lust mich in einen solchen Code einzuarbeiten. Zusätzlich ist die Einrückung des Code nicht konsistent, was es ebenfalls sehr schwer macht den Code zu lesen. Außerdem solltest Du auf ein MVC Pattern übergehen, damit die einzelnen Bereiche passend getrennt werden. Gerade wenn man mit mehreren Personen an einem Projekt arbeitet, ist die Verbreitung des Code mit einem FTP Download extrem ineffizient und wird zu unterschiedlichen Ständen der Codeentwicklung führen. Du solltest auf Systeme wie Git oder Subversion setzen, entsprechende Projektseiten gibt es z.B. von Google oder Sourceforge. Die Dokumentation solltest Du mit Tools wie Doxygen erstellen, dafür muss aber der Code richtig kommentiert sein, wobei sich dann auch direkt PDF generieren lassen können. Den Editor für die Eingabe innerhalb des CMS ist aktuell sehr spartanisch, zusätzlich muss man diesen nicht selbst entwickeln, denn dafür gibt es fertige z.B. unter GPL stehende Editoren (wie z.b. CKEditor), die auch in bekannten CMS eingesetzt werden. require_once("includes/DBC/$connector.php" ); [/quote] Solche Aufrufe, die ungefiltert Daten includieren, sollten niemals verwendet werden. Außerdem kann je nach Einstellungen des Servers der Aufruf an sich fehlschlagen, hier sollte man mit absoluten Pfaden includieren. [code] $chkUser->password = md5($_REQUEST['password']); Der MD5-Hash gilt als nicht mehr sicher ( Message-Digest Algorithm 5 ), vor allem weil hier auch unsalted ist. Hier sollte man zu stärkeren Hashfunktionen und vor allem welchen mit einem Salt greifen, dieses gibt es auch schon als fertige Pakete.
  7. ohne jetzt die Details zu kennen, ich würde mal vermuten dass gar kein Timeout auftritt. Also das PHP Script baut die Verbindung auf, der Socket wird erzeugt, aber es kommen einfach keine Daten, d.h. technisch es existiert schon ein Socket und damit entsteht auch kein Timeout Das Problem wirst Du letztendlich nur mit einer Art Threadding in den Griff bekommen, d.h. in einem Thread baust du die Verbindung auf und der andere Prüft wie lange die Verbindung schon läuft (aber Multithreadding unter PHP geht so direkt nicht). Ich würde ggf die Sensoren anpassen
  8. OOP soll möglichst nahe an die Realität angelehnt werden, also wäre eben eine Dame ohne Brett nicht möglich ( siehe http://de.wikipedia.org/wiki/Assoziation_(UML) ). Eine Klasse Brett ist sicherlich in Ordnung, man kann das natürlich auch allgemeiner machen. Du brauchst Koordinaten, aber Du musst 2 Fragen klären, wie stellst Du sicher, dass die Dame immer auf gültigen Koordinaten steht, d.h. also nicht außerhalb des Bretts und wer speichert die Koordinaten, das Brett oder die Dame oder irgendetwas anderes. Joah das ist doch so alles richtig. Naja was ist denn die Steigung und die Konstante, sind doch eigentlich nur Zahlen und diese Werten in eine bestimmte Form gebracht f(x) = m*x+b. x wollen wir flexibel einsetzen können Naja, also um lineare Funktionen OOP-like zu verwenden reicht eine Klasse. Ich meine nur mal so als Gedanke, Du musst Dir ja irgendwie überlegen, wie Du die Steigung und die Konstante berechnest. Das ist Teil der linearen Funktion, d.h. Du kannst in Deine Klasse eben etwas Code setzen, das Dir z.B. aus zwei Punkten die Funktion aufstellt, d.h. Du gibst dann an die Methode einfach zwei Koordinatenpaare und bekommst ein Objekt "linearFunction" und dann kannst Du einfach "linearFunction.getValue(5)" machen und bekommst, dann den Wert für Y, wenn Du als X=5 einsetzt. Wobei wir beim nächsten Punkt sind, wie Du auch die Koordinaten verwaltest !? Ja das passt so. Es ist nicht rekursiv, sondern iterativ, soviel zum fachlichen. Das hier kannst Du als Struktogramm darstellen, aber es wird nachher nur eine einzelne Methode. Dieser Fall ist erst beim Backtracking relevant. Wenn Du Brett mit NxN Feldern hast, dann kannst <= N Damen definitiv positionieren. Du brauchst schon Schleifen, aber diese haben im Hauptprogramm nichts zu suchen. OOP und Rekursion sind zwei "Strukturansätze". OOP ist ein Programmierparadigma und Rekursion in diesem Fall eine Entwurfsstruktur für einen Algorithmus. Die Frage ist ähnlich zu der Frage ob ich einen Obstsalat mit Äpfeln machen kann. Nein 2 Bretter beliebiger Größe mit n verschiedenen Damen, d.h. wenn ein Brett 8x8 stehen dort 8 Damen drauf, wenn es 200x200 eben 200 Damen Ja, das passt *g* naja ich geb' mal den Hinweis darauf, aus was besteht denn das Schachbrett und wie beschreibe ich jede Position auf dem Brett, jetzt sollte es klingeln..... Naja aber Du zeigst doch gerade, dass Du langsam in die Richtung läuft, langsam aber es wird.... Mein Tipp: Programmieren ist wie eine mathematische Funktion (naja rein formal liegt hinter einer Programmiersprache auch nur formale Logik). Beschränke Dich auf das Wesentliche. Hab Dir noch eine PN geschrieben
  9. Die main-Methode ist der Einstiegspunkt für die JRE. Noch einmal als Anmerkung, kann eine Dame ohne Schachbrett existieren, also ist dies sinnvoll? Damit kannst Du die Frage auch selbst beantworten. Ja Du kannst doch auch z.B. wenn der König im Schach stehen würde ihn nicht auf dieses Feld setzen Das ist das gleiche Problem, wie bei Deinem Damenproblem, Du musst Dir überlegen durch welche Komponenten eine lineare Funktion repräsentiert ist und Du kannst dies z.B. sehr allgemein halten und wenn Du es sehr detailliert machen willst als eigene OOP Struktur entwerfen (theoretisch brauchst Du dies hier aber nicht, zur Übung wäre es aber sinnvoll). Sprich was muss eine lineare Funktion alles an Eigenschaften und Methoden haben, damit Du sie eben der mathematischen Repräsentation verwenden kannst. In realen Projekten hast Du so etwas nicht, d.h. gewöhne Dich nicht daran. Der Algorithmus (!) kann ohne diese SuM Funktionen entworfen werden und genau das solltest Du tun. Je weniger Overhead Du in einem Algorithmus hast um so effizienter wird er. Die graphische Darstellung kannst Du meinetwegen mit SuM machen, aber im Moment sollst Du nur den Algorithmus entwerfen! Du brauchst eine Liste, aber in dieser werden keine Koordinaten gespeichert. OOP hat nichts mit Rekursion zu tun und soweit bist Du nicht. Bevor Du überhaupt das Backtracking entwerfen kannst, setzte das vereinfachte Beispiel um, d.h. zwei Schachbretter (bzw. n Bretter) und auf jedem Brett n Damen so positioniert, dass auf keinem Feld mehr als zwei Damen stehen können. Am Ende ja und wenn Du vorher das ganze ordentlich aufgebaut hast, dann ist die GUI mit wenigen Codezeilen gemacht. Wieso prüft eine "externe Funktion" ob eine Kollision mit einer anderen Dame existiert. Jede Dame kann selbst prüfen, ob sie mit einer anderen in Kollision steht Wieso gehört die Kollisionserkennung nicht zum Hauptprogramm und nicht zur Dame? OOP != Rekursion !! Was ist denn ein Schachbrett in der Realität? Das muss gar nicht explizit geprüft werden, wenn Du Kollisionserkennung richtig ist, dann schließt sie automatisch aus, dass eine Dame auf das gleiche Feld einer anderen gesetzt werden kann Eine, genau eine, Liste brauchst Du, aber nicht für die Koordinaten !! Dieser Ansatz ist wieder ein sequentieller und der ist gerade bei Java falsch ! Du musst das OOP Paradigma beherrschen, d.h. bilde die Realität genauso in Klassen, Methoden und Properties ab, dass der Code möglichst nahe an der Realität ist. Dein Ansatz wird so nicht funktionieren, denn OOP funktioniert nicht zwingend sequentiell.
  10. flashpixx

    Webcrawler

    http://de.wikipedia.org/wiki/Graph_(Graphentheorie) z.b. http://de.wikipedia.org/wiki/Skalenfreies_Netz
  11. der CPU übernimmt bei Dir das erzeugen und zeichnen und das ist nun mal langsam. Nimm einen Shader und lade die Textur in den Speicher der GraKa.
  12. flashpixx

    Webcrawler

    Nein, Google z.B. verfolgt den Webgraphen, sowohl in normaler, wie auch inverser Richtung
  13. Man kann die Textur in den Speicher der GraLaden und direkt darauf verweisen bzw. direkt auch Shader verwenden. Dies hat aber nichts mit Java zu tun sondern ist genereller Bestandteil von OpenGL
  14. wir kommen langsam in die richtige Richtung. Mein Tipp, die lineare Funktion wird einfacher, wenn man immer die Dame, die man schon auf dem Brett stehen hat, gedanklich in den Koordinatenursprung legt. Ich hatte was über Klassen geschrieben und ich hatte etwas Pseudocode zur Kollisionserkennung gepostet. Du brauchst keine Liste mit Koordinaten ja Erzeugung = Konstruktor Entfernen = Destruktor, brauchst Du hier aber nicht laufen = anderes Feld besetzen Kollision erkennen mit einer anderen Dame Ein Struktogramm bringt Dir hier nichts, außerdem ist es auch eine veraltete Darstellung. Ein Struktogramm kannst Du nur verwenden, wenn Du eine einzelne Methode darstellen willst, für die Strukturen von Klassen wird UML verwendet (bzw. andere Diagramme) http://de.wikipedia.org/wiki/UML http://de.wikipedia.org/wiki/Aktivitätsdiagramm http://de.wikipedia.org/wiki/Sequenzdiagramm OOP ist nichts anderes als das man "jedes Ding aus der realen Welt" in eine Klassenstruktur packt und sich eben überlegt was dieses "Ding" innerhalb des Programms können muss (=Methodenname). Welche Inhalte das "Ding" dann hat ist dann das Property. Also Auto, Farbe, fahren: Auto = Klasse Farbe = Property fahren = Methode Jedes "Ding" also jede Klasse, steht mit anderen "Dingen" in Bezieheung z.B. Auto und Reifen. Wie wäre es, wenn Du diesen Quark von SuM in die Tonne trittst und es erst mal mit den normalen Standard Java Strukturen machst Random (Java 2 Platform SE v1.4.2) "generatePosition" ist einfach ein Methodenname, man kann selbst die Namen festlegen. Dieser Methodenname sollte verdeutlichen, dass eine Position erzeugt (generiert) wird. Wieso generiert das Schachbrett die Positionen? Das Brett hat keine Position. Das Brett ist lediglich ein Koordinatensystem und hat eine Liste mit n Damen. Wieso wird in der Schleife gezeichnet, wenn es OOP sein soll, dann muss das Brett sich zeichnen können und jedes Objekt, das durch das Brett dargestellt wird, muss zeichnen können. Aber GUI fällt raus, ebenso wie SuM ! Wieso soll das Hauptprogramm generierePositionen aufrufen? Ich kann keine Dame ohne ein Schachbrett setzen und wieso "alleDamensetzen", Du setzt eine Dame nach der anderen Wieso eine seperate Klasse? Noch einmal der Hinweis den Algorithmus kann man ohne SuM machen. Du solltest erst einmal versuchen, dass Du ein Schachbrett beliebiger Größe erzeugen kannst und darauf n Damen platzierst, wobei auf jedem Feld immer nur eine Dame stehen darf. Dein Hauptprogramm soll somit verschiedene Schachbretter unterschiedlicher oder gleicher Größe erzeugen können und auf jedem dieser Bretter sollen einfach n Damen platziert werden ohne dass zwei Damen auf den gleichen Positionen stehen. Das Ergebnis kannst Du auf der Konsole ausgeben. Das Hauptprogramm sollte dann ungefähr so aussehen: public static void main(String[] argc) { Brett x = new Brett(2); Brett y = new Brett(8); System.out.println("Ausgabe Brett 1:\n"+x); System.out.println("Ausgabe Brett 2:\n"+y); } Die Ausgabe kann dann so aussehen Ausgabe Brett 1: Dame auf Position (1,1) Dame auf Position (2,2) Ausgabe Brett 2: Dame auf Position (1,1) Dame auf Position (4,5) Dame auf Position (6,8) Dame auf Position (2,4) Dame auf Position (3,7) Dame auf Position (5,4) Dame auf Position (3,2) Dame auf Position (1,4)
  15. Wie bedeutet denn "bedroht"? Das heißt, dass eine Dame auf der gleichen Horizontalen / Vertikalen / Diagonalen steht, wie schon eine andere. Du kannst die Horizontale und Vertikale extrem einfach prüfen, die Diagonale durch die lineare Funktion, d.h. Du musst eine Funktion aufstellen, in die Du die x-Koordinate einer neuen Dame einsetzt, diese Funktion berechnet dann eine Y-Koordinate und wenn diese gleich der Y-Position der neuen Dame ist, dann hast Du eine Kollision. Wie man diese lineare Funktion aufstellt, steht in den Verlinkten Wikipediaartikeln (Stichwort Steigungsdreieck) Was muss denn eine Damen alles können? Im Moment knallst Du den Quellcode in eine Klasse ohne sinnvoll zu strukturieren. Das was Du dort fabrizierst ist Spagetthicode. Ich habe schon so viele Anregungen gepostet (auch im letzten Post), im Grunde muss Du das nur noch in Quellcode gießen. Man braucht weder setze noch lösche Dame, denn ich kann durch einen einzigen Aufruf (generatePosition) die Koordinaten für eine Dame generieren und kann dann prüfen, ob eine Kollision auftritt, wenn ja generiere ich neue Positionen. Bei Dir klappt noch nicht einmal der Algorithmus und bevor der nicht funktioniert, würde ich an so etwas wie GUI überhaupt nicht denken. GUI kommt zum Schluss. auch das habe ich in meinem letzten Post ausgeführt, nennt sich genetische Algorithmen. Fang doch einmal damit an überhaupt ohne diesen ganzen sum.kern Quatsch das Problem zu lösen. Schreibe ein einfaches Hauptprogramm und dann brauchst Du dazu zwei Klassen mehr nicht um den Algorithmus überhaupt erst einmal funktionsfähig zu bekommen. Erst wenn der Algorithmus fest ist, dann kannst Du über die GUI nachdenken.
  16. Also ich denke, dass Du von der Graphikseite schon eine recht gute Anbindung hast. Ist halt OpenGL das wird sehr performant sein
  17. I will answer in englisch. Please take a look to the picture in this post. You see the queen (red circle), and the lines are the fields which can not be used by a new queen. You use loops for detecting this problem. This is very slow and inefficient. Please think about the chessboard, your board is a NxN array, each field in the board can be addressed by its numbers (x,y). So you only need to store the size of the board. On the first step I set my first queen into the field, it is a good solution to do this random. You can do this because there exists a theorem that a random algorithm is not better / worse to another. Here comes the backtracking now. So next we will try to set the next queen and we get the position also with random, but now we must check if we can place the queen. So this can be do with a little math. You see the green lines, which are parallel to the axis, so we can check both situation with an if contraint. The blue lines are the diagonal lines which can describe with lineare functions ( Linear function - Wikipedia, the free encyclopedia ). The yellow triangular help you to create the lineare function. Each lineare function can be written as y = m*x+b so x and y are the coordinates, m the rise and b the value of the y-axis. So if I would place a new queen, I would check only all lineare function on all other queens. If there is a collision, the f(x)=y (f = lineare function) equation is satisfied. So on each placed queen you must create this linear function f (you need only one f, because you see in the picture, that the blue lines are symmetric, this changes only the sign in a parameter of the lineare function f). You generate new coordinates until you can place the queen or you have all fields are visited. If we can not place a queen, than we step back within the backtracking and create for the prior queen a new position. Attention about the recursion: Each queen must be stored a mark, which field(s) is / are visited. If a queen has visited all board fields, the backtracking must be stopped, because there does not exists a solution. You must step back in the backtracking. Generally you can place n queens on a NxN field, so first you should check if there are more queens like the board dimension, if yes, there exists no optional solution. You need only one loop for creating the coordinates of a new queen. My hint is, that you use classes, so you create a queen class in which the linear function is stored and you can check the collision like bool collision = false; foreach(queen in queenlist && !collision) collision = queen.checkCollision(new_queen) if (collision) new_queen.generatePosition() Than you create only a board class, which stores the size of the board and a list of the placed queens. Your code is very large and you do a lot of unnecessary operation. You need only the size of the board, a list of queens and each queen must / can be check if there is a collision with another queen. So the queen must stored the position of itself. The lineare function can be create relative to the queen or global to the board (the picture shows the relative solition). You create a native solution, that means you try to solve problem with iterate over all solution. This works for small problems only, but not for complex problems. You can calculate if your board has a size 1000x1000 fields and you will place 200 queens on it, how many backtracking steps are needed to create a solutions. On a board with 8x8 fields you must check 2^48 different options to find a solution in the worst-case. Other algorithms like generic algorithms are better, so my hint to add a random component can help you. Your code is a sequential code without any object-orientated structures, so the first is, that you use this paradigm to describe the problem. A sequential code creates a lot of problems, because you must create the correct structures and calls in it. A class is a black box structure, so you can use it, but you do not know the content. Also split input, output and algorithms, do not mix output and algorithm, because this is very confusing. If you would like to debug your code, use a debugger or add a logger to the code. You do not need any rotation option on the queen position or board position, because with the maths I can calculate each position directly and need no iteration over the fields. Looping over large datasets are very slow, so try to beware loops if you can determine the position / result directly. Reduce your code and you can find the bugs easy, also keep in mind, that you create a efficient algorithms a brute-force method is not efficient
  18. new wird immer benötigt, da alle Datenstrukturen in Java Objekte sind und somit der Konstruktor der Klasse für die Erzeugung im Speicher aufgerufen werden muss (abgesehen von primitiven Datentypen wie z.B. int).
  19. Nach dem Bild und dem Schema Präfix zu urteilen handelt es sich nicht um mySQL sondern MSSQL
  20. setze das einmal in Beziehung zu "linearen Funktionen". Mit Hilfe von ein wenig Mathematik kann man diese Prüfung recht effizient machen. für diese beiden Fälle braucht man keine Schleife, das kann ohne prüfen.
  21. Überleg Dir das doch einfach mal etwas praktisch, wenn Du zwei Damen hast, wann tritt eine "Kollision" auf, einmal wenn zwei Damen in der gleichen Zeile oder Spalte oder Diagonalen stehen. Nehmen wir mal praktisch an, Du hast eine Dame auf dem Feld (3,4) stehen, welche Felder sind dann ausgeschlossen, auf denen Du eine Dame stellen kannst?
  22. Ich poste da mal den Link zu Wiki, falls es jemand auch nachlesen mag Damenproblem also sieht schon mal gar nicht schlecht aus, leicht verwirrend Dein Pseudocode aber durchaus okay. Ob es jetzt performant und auch korrekt arbeitet habe ich auf die Schnelle nicht geprüft. Da werd ich ja gleich rot....... Einmalig: int x,y = 1 Methode(a) [Damen setzen]: Solange noch nicht alle acht Damen gesetzt wurden -> rufe Methode( auf Methode( [Damen setzen: durchlaufe das Schachbrett]: 1. Struktogramm: (2te Schleife in erster Schleife) 1. (while-)Schleife: Solange y kleiner gleich 8 1.2. (while-)Schleife: Solange x kleiner gleich 8 1.2.1 if-Abfrage: Dame bedroht? 1.2.1.1 Fall ja (erhält false - s. anderes Struktogramm): x+1 1.2.1.2 Fall nein (erhält true - s. anderes Struktogramm): Dame setzen, return true. 1. y+1, x=1 setzen (eigentliches Backtracking) 1.2.2 if-Abfrage: x,y gleich 8 1.2.2.1 Fall ja: gehe zu Position letzte Dame, lösche letzte Dame, 1.2.2.1.1 if-Abfrage: x kleiner 8 1.2.2.1.1.1 Fall ja: x+1 1.2.2.1.1.2 Fall nein: y+1, x=1 setzen 1.2.2.1.2 Dame setzen 1.2.2.2 Fall nein : rufe Methode rekursiv auf Methode(c) [ist die Dame bedroht?]: [I]Allgemeiner Gedanke:[/I] Fall 1 - Diagonaler Lauf (rechts unten nach oben links): x-y=1 Fall 2 - Diagonaler Lauf (links oben nach rechts unten): x+y=11 Von x,y = 1 ausgehend: Fall 3 - waagerechter Lauf: y festgelegt, x+1 Fall 4 - senkrechter Lauf: x festgelegt, y+1 [/code]
  23. Ich nutze TextMate und erweitere mir das ggf selbst. Bei PHP Dateien kann ich immer ein php -l dann machen.
  24. flashpixx

    String-Formel berechnen

    Nein mit Java Methoden alleine nicht. Entweder musst Du einen Parser für mathematische Ausdrücke schreiben und dann selbst das ganze machen oder Du nutzt fertige Komponenten z.B. Jep Java - Math Expression Parser - Singular Systems bzw Download exp4j oder z.B. GiNaC is Not a CAS
  25. Nein mit Java nicht, wenn JavaScript, im Großen und Ganzen wird so etwas z.B. mit jQuery gemacht

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...