Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Suche » Suchergebnis » Hallo Gast [Anmelden|Registrieren]
Zeige Beiträge 1 bis 15 von 242 Treffern Seiten (17): [1] 2 3 nächste » ... letzte »
Autor Beitrag
Thema: Äquivalenz von Turingmaschinen und Automaten
InformaTiger

Antworten: 4
Hits: 7.377
29.02.2020 15:18 Forum: Berechenbarkeits- und Komplexitätstheorie


NixJava, ok das macht natürlich Sinn. Nach unserer Definition ist ein 2-Kellerautomat allerdings ein endlicher Automat, mit noch zusätzlich 2 Kellern (Stapel). Ich war warscheinlich deshalb etwas verwirrt. Ist jetzt klar, danke Daumen hoch
Thema: Äquivalenz von Turingmaschinen und Automaten
InformaTiger

Antworten: 4
Hits: 7.377
Äquivalenz von Turingmaschinen und Automaten 29.02.2020 13:24 Forum: Berechenbarkeits- und Komplexitätstheorie


Hallo liebe Community,

ich bin gerade bei der Klausurvorbereitung "Diskrete Mathematik" und habe dort eine Multiple-Choice Aufgabe die folgendermaßen lautet:

Zitat:

Welche der folgenden Aussagen zu Turingmaschinen und regulären Sprachen ist richtig?

  1. Die Teilmengenkonstruktion wandelt eine nichtdeterministische Turingmaschine in eine deterministische um
  2. Bei einer 3-Band Turingmaschine, die einen DEA simuliert, bewegen sich die Leseköpfe immer in unterschiedliche Richtungen.
  3. Die Klasse der Sprachen, die von einer Mehrband-Turingmaschine akzeptiert werden, ist echt größer als die Klasse der Sprachen, die von einer 1-Band-Turingmaschine akzeptiert werden.
  4. Jede Turingmaschine kann in einen äquivalenten epsilon-NEA umgewandelt werden.
  5. Keine der Aussagen.



Laut Antwortenschlüssel müsste E richtig sein. Jedoch ist meiner Meinung nach D richtig. Laut unserem Skriptum besteht eine Äquivalenz zwischen DTM und NTM. Desweiteren sind Turingmaschinen und 2-Kellerautomaten äquivalent. Ein Kellerautomat ist ein endlicher Automat. Da Automaten, also DEA, NEA und epsilon-NEA untereinander äquivalent sind, sollte aus jeder Turingmaschine ein äquivalenter epsilon-NEA gebaut werden können.

Die Recherche im Internet bestätigt diese Vermutung. Liege ich damit richtig oder habe ich irgendwo einen Denkfehler?

smile

Mit freundlichen Grüßen,
InformaTiger
Thema: HTML, CSS und PHP lernen - Wo?
InformaTiger

Antworten: 1
Hits: 3.961
RE: HTML, CSS und PHP lernen - Wo? 05.05.2018 13:36 Forum: Praktische Informatik


Hallo Starlord77,

es gibt Online unter folgender Adresse einige der besten Lernseiten für HTML, CSS und PHP: w3schools.com. Die Voraussetzung dafür ist halt, dass du Englisch kannst. Eine Alternative wäre (wiederum in Englisch) tutorialspoint.com welche ebenso eine Vielzahl an Tutorials (auch Videotutorials) anbietet.

Ich hoffe ich konnte helfen smile

Mit freundlichen Grüßen
InformaTiger
Thema: Vererbung in C++
InformaTiger

Antworten: 0
Hits: 2.965
Vererbung in C++ 05.05.2018 13:06 Forum: Praktische Informatik


Liebes Forum,

ich bin ein relativ erfahrener Java Programmierer weswegen mir folgendes Szenario in C++ etwas Schwierigkeiten bereitet. Ich habe eine Klassenstruktur für einige Parser und deren EventListener. Soweit ich das mitbekommen habe ist es in C++ nicht möglich etwas wie template<class T extends Entity> zu deklarieren aus diversen Kompilergründen. Beziehungsweise ist es schon möglich aber nur über den Umweg von static_casts und dererlei Funktionen.

Jetzt habe ich klarerweise das Problem, dass ich auch die Parser-Implementierungen wie bspw. BlockParser der eigentlich ein Parser<Block> ist und von Parser<Entity> erben müsste (Entity ist die Basisklasse von Block, Tag und Attribute) nicht in einen Parser<Entity> umwandeln kann (außer durch expliziten cast, wie ich das bisher umgesetzt habe). Und auch, dass ich auf meinem Scanner in der Methode add_parser(Parser<Entity>* parser) kein parser->add_listener(this) aufrufen kann weil der Scanner ja lediglich ein Block und TagEventListener ist.

Hat jemand eine Idee wie ich das geschickt lösen könnte?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
// parser.h
#include "entity.h"

template <class T>
class ParserEventListener {
    public:
        virtual void update(T entity) = 0;
};

template <class T>
class Parser {
    public:
        virtual void add_listener(ParserEventListener<T*>* listener) = 0;
        virtual void remove_listener(ParserEventListener<T*>* listener) = 0;
        virtual void consume(char c, int pos) = 0;
        virtual Array<T*>* get_result() = 0;
        virtual void reset() = 0;
};

template <class T>
class AbstractParser: public Parser<T>, public ParserEventListener<T*> {
    public:
        static const int ZERO_STATE = 0;
        AbstractParser();
        virtual ~AbstractParser();
        void add_listener(ParserEventListener<T*>* listener);
        void remove_listener(ParserEventListener<T*>* listener);
        void update(T* entity);
        virtual void consume(char c, int pos) = 0;
        Array<T*>* get_result();
        virtual void reset() = 0;               
    protected:
        void add_context(T* value);
        bool has_state(int n, ...);
        int _state;
    private:
        Array<ParserEventListener<T*>*> _listeners;
        Array<T*> _context;
};


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
// scanner.h
#include "entity.h"
#include "parser.h"

#define CAPACITY 16
#define BUFFER_SIZE 1024

class Scanner: public ParserEventListener<Block*>, public ParserEventListener<Tag*>{
    public:
        Scanner();
        ~Scanner();
        void add_parser(Parser<Entity>* parser);
        void update(Block* block);
        void update(Tag* tag);
        Array<Entity*>* scan(char* source);
    private:
        Array<char>* read_source(char* source);
        Array<Entity*>* get_document();
        Block* _last_block;
        Array<Parser<Entity>*> _context;
};


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
// wsc.cpp
#include "parser.h"
#include "scanner.h"

using std::cout;
using std::cerr;
using std::endl;

void ws_export(Array<Entity*>*, std::string);
std::string ws_name(std::string);

int main(int argc, char** argv){
    Scanner scn;
    try {
        Parser<Entity>* parser = (Parser<Entity>*)new BlockParser;
        scn.add_parser(parser);
        
        parser = (Parser<Entity>*)new TagParser;
        scn.add_parser(parser);
        
        Array<Entity*>* doc = scn.scan(argv[1]);
        ws_export(doc, argv[1]);
        
        array_free(doc, true);
    } catch (const char* msg){
        cerr << msg << endl;
    }    
    return EXIT_SUCCESS;
}


Danke schonmal im voraus smile

Mit freundlichen Grüßen
InformaTiger
Thema: Telnet Verbindung via ip
InformaTiger

Antworten: 1
Hits: 4.280
RE: Telnet Verbindung via ip 22.02.2018 12:41 Forum: Softwaretechnik


Hallo Rafaelloo,

versuche doch mal einen Portscan auf der Adresse deines Geräts durchzuführen. Damit kannst du herausfinden, ob das Gerät überhaupt erreichbar ist und wenn über welchen Port.
Falls du mit Linux arbeitest ist nmap bereits integriert unter Windows kannst du dir das hier holen.

Mit freundlichen Grüßen
InformaTiger
Thema: Speicherverwaltung
InformaTiger

Antworten: 1
Hits: 3.439
RE: Speicherverwaltung 28.01.2018 20:14 Forum: Praktische Informatik


Hallo Informatics,

ich habe mir soeben deine Aufgabenstellung durchgesehen und bin zu folgendem Ergebnis gekommen:

  1. hier ist das Problem, wie du ganz richtig erkannt hast, dass der Speicher den du anlegst nicht mehr freigegeben wird und der Pointer einfach mit einer neuen Adresse überschrieben wird, so dass der alte Wert für immer im Speicher verschwindet
  2. die Variable ret ist zu beginn auf einen willkürlichen Wert gesetzt, das heißt sollte z nicht gerader größer als 1000 sein kann ret mal true mal false zurückggeben
  3. ich denke hier liegt das Problem viel mehr daran, dass du einfach über den "Rand" des Arrays hinausgreifst (das Array ist nur n - 1 groß und in Zeile 20 erfolgt ein Zugriff auf n)
  4. hier wird die Variable n einfach eliminiert bevor der return-Befehl ausgeführt wird (nein, man kann &z nicht zurückgeben, da es sich dort um eine lokale Adresse vom Stack handelt die beim return-Befehlt verworfen wird)
  5. hier passiert genau das was ich in 4. angekündigt habe - es wird ein lokaler Zeiger zurückgegeben der nicht mehr gültig ist, sobald du den scope der Funktion lv verlässt


Ich hoffe ich konnte helfen smile

Mit freundlichen Grüßen
InformaTiger
Thema: Informatik
InformaTiger

Antworten: 1
Hits: 3.601
RE: Informatik 04.01.2018 09:13 Forum: Sonstige Fragen


Hallo Soviet knight,

Informatik ist sehr vielfältig - man kann sich in vielen verschiedenen Bereichen spezialisieren. So zum Beispiel in Richtung Netzwerktechnik, Softwareentwicklung/Programmierung, Robotik, Systemverwaltung/Administration, und und und. Im Bachelorstudium lernst du die Grundstrukturen für alle Teilbereiche und kannst dich dann entscheiden worauf du dich im Master spezialisieren möchtest. Du wirst unter anderem Seminare im Bereich Algorithmen & Datenstrukturen, Programmiermethodik, Betriebssysteme, Computergrafik, Logik, Theoretische und Technische Informatik besuchen (um nur einige zu nennen).
Nach dem Studium kannst du eben einen der obengenannten Teilbereiche der Informatik belegen zum Beispiel als Programmieren, Webentwickler, Systemadministrator, Netzwerktechniker oder was immer du für eine Sparte wählen möchtest. Besuchen kannst du es (in Österreich) in Wien, Salzburg (glaube ich auch) und Innsbruck - in Deutschland habe ich aber leider keine Ahnung bis auf München.

Mit freundlichen Grüßen
InformaTiger
Thema: Scanner Java
InformaTiger

Antworten: 1
Hits: 3.983
RE: Scanner Java 04.01.2018 08:58 Forum: Informatik in der Schule


Hallo WeisserBitcode,

ich habe dein Programm jetzt mal für diesen Zweck angepasst. Du kannst eine Liste verwenden und beliebig viele Werte speichern (sofern das dein Speicher zulässt - also doch nur endlich viele Augenzwinkern ). Solange der Nutzer nun nicht eine leere Eingabe tätigt wird jeweils ein String von der Komandozeile eingelesen und in einen Double konvertiert. Anschließend landet das ganze in der Liste.
Bricht der Nutzer ab, wird die Liste (per Java 8 API) summiert und deine Berechnungen durchgeführt.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;

public class BankingAccount {

    public static void main(String[] args){
        List<Double> account = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);

        System.out.println("Bitte geben Sie Ihre Einzahlungen/Abbuchungen ein.");
        System.out.println("Sie beenden die Eingabe mit einer Leerzeile");
                
        String input;
        while ((input = scanner.nextLine()) != null){
            if (input.equals("")){
                break;
            }
            account.add(Double.valueOf(input));
        }
        double sum = account.stream().mapToDouble(Double::doubleValue).sum();

        double zins = 50;
        double result = sum * ((zins / 100) + 1);

        double diff = result - sum;

        if (zins > 0){
            System.out.println("Gewinn durch Zinsen: " + diff);
        } else {
            System.out.println("Verlust durch Zinsen: " + diff);
        }
        scanner.close();
    }
}


Ich hoffe ich konnte helfen. smile

Mit freundlichen Grüßen
InformaTiger
Thema: Dynamische Objekterzeugung vs Singleton
InformaTiger

Antworten: 1
Hits: 4.088
RE: Dynamische Objekterzeugung vs Singleton 27.11.2017 18:04 Forum: Praktische Informatik


Um mir hier mal selbst eine Antwort geben zu können, habe ich mir einen kleinen Test geschrieben der wie folgt aussieht:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
package org.performance.test;

import java.util.ArrayList;
import org.performance.test.entity.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PerformanceTest {

    public static void main(String[] args) throws ReflectiveOperationException {        
        testMap1();        
        testMap2();
    }
    
    public static void testMap1() throws InstantiationException, IllegalAccessException{
        System.out.println("Type 1 test");
        System.out.println("Map<Class, Class<? extends Agent>");
        System.out.println("-----------");
        
        gc();
        
        long mem = Runtime.getRuntime().freeMemory();
        System.out.println("Memory before map creation: " +  mem);
        
        Map<Class, Class<? extends Agent>> var1 = constructType1();
        
        gc();
        
        long mem2 = Runtime.getRuntime().freeMemory();
        
        System.out.println("Memory after map creation: " + mem2);
        System.out.println("Memory delta: " + (mem - mem2));
        System.out.println("Entry size: " + ((mem - mem2) / var1.size()));
        
        List<Long> timespan = new ArrayList<>();        
        for (int i = 0; i < 1000; i++){
            long start = System.nanoTime();
            
            Class<? extends Agent> type = var1.get(Boolean.class);
            Agent agent = type.newInstance();
            
            agent.doAction(false);
            
            long end = System.nanoTime();            
            timespan.add(end - start);
        }
        double avg = timespan.stream().mapToLong(v -> v).average().getAsDouble();
        System.out.println("\nAvg Performance: " + avg);
    }
    
    public static void testMap2(){    
        System.out.println("\nType 2 test");
        System.out.println("Map<Class, Agent>");
        System.out.println("-----------");
        
        gc();
        
        long mem = Runtime.getRuntime().freeMemory();
        System.out.println("Memory before map creation: " + mem);

        Map<Class, Agent> var2 = constructType2();        
        
        gc();
        
        long mem2 = Runtime.getRuntime().freeMemory();
        
        System.out.println("Memory after map creation: " + mem2);
        System.out.println("Memory delta: " + (mem - mem2));
        System.out.println("Entry size: " +  ((mem - mem2) / var2.size()));
        
        List<Long> timespan = new ArrayList<>();
        for (int i = 0; i < 1000; i++){
            long start = System.nanoTime();
            
            Agent agent = var2.get(Boolean.class);
            agent.doAction(false);
            
            long end = System.nanoTime();            
            timespan.add(end - start);
        }
        double avg = timespan.stream().mapToLong(v -> v).average().getAsDouble();
        System.out.println("\nAvg Performance: " + avg);
    }
    
    public static Map<Class, Class<? extends Agent>> constructType1(){
        Map<Class, Class<? extends Agent>> map = new HashMap<>();
        map.put(Boolean.class, BooleanAgent.class);
        map.put(Double.class, DoubleAgent.class);
        map.put(Float.class, FloatAgent.class);
        map.put(Integer.class, IntegerAgent.class);
        map.put(Object.class, ObjectAgent.class);
        map.put(Short.class, ShortAgent.class);
        map.put(String.class, StringAgent.class);        
        
        return map;
    }
    
    public static Map<Class, Agent> constructType2(){
        Map<Class, Agent> map = new HashMap<>();
        map.put(Boolean.class, new BooleanAgent());
        map.put(Double.class, new DoubleAgent());
        map.put(Float.class, new FloatAgent());
        map.put(Integer.class, new IntegerAgent());
        map.put(Object.class, new ObjectAgent());
        map.put(Short.class, new ShortAgent());
        map.put(String.class, new StringAgent());
        
        return map;
    }
    
    public static void gc(){
        Runtime rt = Runtime.getRuntime();
        
        for (int i = 0; i < 500; i++){
            rt.gc();
        }
    }    
}


Der Test gibt dann folgendes aus:

Zitat:
Type 1 test
Map<Class, Class<? extends Agent>
-----------
Memory before map creation: 64202408
Memory after map creation: 64197200
Memory delta: 5208
Entry size: 744

Avg Performance: 8897.376

Type 2 test
Map<Class, Agent>
-----------
Memory before map creation: 63926560
Memory after map creation: 63926192
Memory delta: 368
Entry size: 52

Avg Performance: 750.258


Auch bei mehrmaligem ausführen verändern sich die Ergebnisse kaum, weshalb ich zum Ergebnis kommen kann, dass die zweite Variante um einiges schneller und auch mit wesentlich weniger Speicheraufwand läuft.

smile

Mit freundlichen Grüßen
InformaTiger
Thema: Dynamische Objekterzeugung vs Singleton
InformaTiger

Antworten: 1
Hits: 4.088
Dynamische Objekterzeugung vs Singleton 24.11.2017 22:22 Forum: Praktische Informatik


Guten Abend,

ich beschäftige mich derzeit mit einer Writer und Readerlogik von einem meiner Programme und möchte hierzu gerne wissen, welche Variante schneller bzw. besser ist:

Variante 1

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
public interface Writer<T> {

    public static class Registry {

        private static final Map<Class, Writer> REGISTRY;

        static {
            REGISTRY = new HashMap<>();
            initDefaults();
        }

        private static void initDefaults(){
            register(Byte.class, new ByteWriter());
            register(Short.class, new ShortWriter());
            // [...]
            register(Object.class, new ObjectWriter());
        }

        public static <T> void register(Class<T> type, Writer<T> writer){
            REGISTRY.put(type, writer);
        }

        public static Writer<T> get(Class<T> type){
            return REGISTRY.get(type);
        }
    }

    public void write(/* whatsoever */);
}


Variante 2

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
public interface Writer<T> {

    public static class Registry {

        private static final Map<Class, Class> REGISTRY;

        static {
            REGISTRY = new HashMap<>();
            initDefaults();
        }

        private static void initDefaults(){
            register(Byte.class, ByteWriter.class);
            register(Short.class, ShortWriter.class);
            // [...]
            register(Object.class, ObjectWriter.class);
        }

        public static <T> void register(Class<T> type, Class<Writer<T>> writer){
            REGISTRY.put(type, writer);
        }

        public static Writer<T> get(Class<T> type) throws Exception{
            Class<Writer<T>> writerType = REGISTRY.get(type);

            if (writerType == null){
                throw new NullPointerException("No writer registered for class " + type.getName());
            }
            return writerType.newInstance();
        }
    }

    public void write(/* whatsoever */);
}


Ich kann mir sicherlich vorstellen, dass beide ihre Vor- und Nachteile haben. Ersteres greift automatisch immer auf dasselbe Writer-Objekt zu und spart deshalb den Zeitaufwand ein neues Objekt anzulegen. Nachteil klarerweise ist der dadurch permanent belegte Speicher, der nicht anderweitig verwendbar ist. Soweit ich informiert bin und hier zu finden ist, verbraucht ein gängiges Java-Objekt ohne Membervariablen 8 Bytes an Speicher - was an sich ja nicht so viel wäre.
Zweiteres hingegen muss auch eine Instanz der ReflectionKlasse halten und gegebenenfalls eine Objektinstanz anlegen falls ein get-Aufruf erfolgt. Leider habe ich keinerlei Anhaltspunkt, wie aufwendig ein Aufruf der newInstance Methode im Vergleich zur gängigen Instanzierung ist. Desweiteren habe ich ebenso keine Ahnung wie viel Speicher eine ReflectionClass verbraucht.

Könnt ihr mir diesbezüglich ein paar Tipps geben?
Danke schon mal im voraus.

smile

Mit freundlichen Grüßen
InformaTiger
Thema: UNIX Komando
InformaTiger

Antworten: 1
Hits: 3.856
RE: UNIX Komando 24.11.2017 21:26 Forum: Sonstige Fragen


Hallo minnn,

ich nehme mal an du hast das hier gemeint:
code:
1:
cp <datei> ../
und
code:
1:
cp -R <verzeichnis> ../


Mit freundlichen Grüßen
InformaTiger
Thema: Parser für polynomielle Ausdrücke
InformaTiger

Antworten: 4
Hits: 5.213
26.10.2017 12:12 Forum: Praktische Informatik


Hurray Tanzen

ich habe es mittlerweile geschafft den Parser so zu schrieben, dass er mehrere Ausdrücke parst und auch berechnet. Was ich allerdings außer Acht gelassen habe ist die Präzedenz bzw. die Priorität der Operatoren.

Ich hatte mir gedacht, die Ausdrücke in eine PriorityQueue zu packen und nach Priorität des Operators zu sortieren - was ich dabei aber nicht bedacht habe ist, dass dies an meiner Situation nicht wirklich etwas ändert. Hat jemand einen Tipp für mich wie ich die Ausdrücke so anordnen kann, dass Punkt vor Strich gilt (derzeit rechnet mein Evaluator einfach stur von links nach rechts)?

Ich hänge mal die neuen Sourcefiles in den Anhang.

edit: Polnische Notation sagt mir was bzw. ist allgemein als Schreibweise mathematischer Ausdrücke in der Informatik recht angesehen. Leider habe ich aber keine Ahnung wie ich die hier einbauen sollte Zunge raus

Mit freundlichen Grüßen
InformaTiger
Thema: Parser für polynomielle Ausdrücke
InformaTiger

Antworten: 4
Hits: 5.213
26.10.2017 09:33 Forum: Praktische Informatik


Also, vielleicht irre ich mich auch mit der Terminologie etwas da ich sowas ansonsten nie mache, aber es sollte ungefähr so aussehen:

EBNF (vermutlich nicht ganz formal korrekt, da dies mein erster Versuch ist, das zu beschreiben was ich haben möchte)
code:
1:
2:
3:
4:
5:
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
integer = digit, { digit };
operator = "+" | "-" | "*" | "^";
variable = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z";
polynomial = digit | variable, operator, { polynomial }


Wie bereits erwähnt sollen alle Operationen explizit angegeben werden (z.B 3*x und nicht 3x). Erlaubt sind nur die Operatoren Plus, Mal, Minus und Hoch. Unter Ausdrücke verstehe ich folgendes:

code:
1:
2:
3^x // ein Ausdruck
3^x + 6 - 19 // mehrere Ausdrücke


Ich hoffe das machte es halbwegs verständlich, was mein Resultat sein sollte. Und für einen Ausdruck funktioniert das ganze ja auch, ich brauche nur noch die Möglichkeit, dass da als linke Rechenoperation auch ein Polynom bzw ein Ausdruck stehen kann, da ansonsten beispielsweise nur sowas gültig wäre:

code:
1:
2:
3^x 6 + 8 19 - 5 // derzeit gültig bzw. so falsch
3^x + 6 - 19 // mein Ziel bzw. richtig


smile

Mit freundlichen Grüßen
InformaTiger
Thema: Parser für polynomielle Ausdrücke
InformaTiger

Antworten: 4
Hits: 5.213
Parser für polynomielle Ausdrücke 25.10.2017 21:06 Forum: Praktische Informatik


Hallo,

ich bastle derzeit an einem simplen Parser und Evaluator für polynomielle Ausdrücke. Mein derzeitiger Stand erlaubt nur das Parsen eines einzelnen Ausdrucks aufgrund des statischen Konzepts meines Parsers.

Ich habe aber leider keine Idee wie ich das Modell ändern könnte, dass er mehrere Ausdrücke zusammen parsen kann. Hat jemand Tipps für mich?

edit: unterstützte Operatoren sind nur plus, mal, minus und Potenzen. Des weiteren sind alle Operatoren explizit hinzuschreiben (bspw. 3x ist ungültig).

Danke schon im voraus smile

Mit freundlichen Grüßen
InformaTiger

PS: Quellcode befindet sich als NetBeans Projekt im Anhang
Thema: Integerwerte in einer ArrayList casten
InformaTiger

Antworten: 7
Hits: 7.696
RE: Integerwerte in einer ArrayList casten 31.05.2017 18:54 Forum: Algorithmen


Hallo Havelin,

habe es soeben getestet: du musst die Integer gar nicht casten falls du dein Array anders anlegst. Und zwar kannst du dir die generischen Ausdrücke zunutze machen in etwa eben so:

code:
1:
ArrayList<Integer>[] group = new ArrayList[8];


dadurch erzielst du, dass deine ArrayLists nur mehr Integer aufnehmen können und die Objekte daher nicht nur als Standardobjekt von Java darin abgelegt werden.

smile

Mit freundlichen Grüßen
InformaTiger
Zeige Beiträge 1 bis 15 von 242 Treffern Seiten (17): [1] 2 3 nächste » ... letzte »