Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Fragen und Antworten ->"Expertensysteme"

Diskussion: Fragen und Antworten ->"Expertensysteme" im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Eingereicht von Ook! Zitat: Es geht darum, eine Anwendung zu bauen, die physikalische Fragen beantworten kann. Das Teilgebiet ist frei ...

Antwort
Alt 25.11.08, 23:04   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard Fragen und Antworten ->"Expertensysteme"


Eingereicht von Ook!

Zitat:

Es geht darum, eine Anwendung zu bauen, die physikalische Fragen beantworten kann. Das Teilgebiet ist frei wählbar (Bewegung, Gravitation, Magnetismus, Relativität, Quantenmechanik oder was euch einfällt). Schön wäre, wenn die Anwendung min. zwei Gebiete abdeckt.
Ein Beispiel für Bewegung wäre:
Ook läuft durchschnittlich 10km/h auf einer Strecke von 5km. Wie lange braucht er für seine Strecke?

Eine Lösungsvariante wäre, dass der Benutzer die drei Daten eingibt:
1. 10km/stunde
2. 5 km
3. ? <Einheit>
Lösung: 0,5 Stunden oder 30 Minuten

Ein weiteres Beispiel für die Angaben:
1. 10km/stunde
2. 30 minuten
3. ? meter
Lösung: 5000 meter
Also: nimm Dir ein Gebiet vor und programmiere eine Anwendung, welche auf diesem Gebiet die Benutzerfragen beantwortet.
Dazu gibt der Benuter natürlich erforderliche Daten ein - und erhält eine Antwort.

Schwierigkeit: beliebig steigbar ;)
Denn: Schwierigkeit1: feste Menüstruktur, Nutzer wählt aus, was er beantwortet haben möchte und das Programm liest erforderliche Daten ein.
Schwierigkteit2: Nutzer gibt Daten ein (unter festen Menüpunkten) und sobald genug Daten eingegeben wurden, werden die Fehlenden ergänzt.
Schwierigkeit3: Nutzer gibt einfach Daten ein wie "5000m" "10km/h" (ohne feste Strukturen mit variablen Messeinheiten)
Schwierigkeit3+: Eingabe in Satzform, Programm erkennt "Absicht" (über Schlüsselworte), Bsp: "Bis zum Bäcker sind es 200m, mein Auto fährt mit 120km/h, wie lange brauche ich?"
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 30.07.10, 13:15   #2 (permalink)
Moderator
 
Benutzerbild von Tarantoga
 
Registriert seit: 11.02.06
Tarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga Quadcore
Likes: 195
Standard

Erstens kann ich gar nicht verstehen warum zu dieser interessanten Aufgabe niemand etwas gecodet hat, zweitens passen die Anforderungen (Analyse von Zeichenketten und Datenextraktion) ganz gut zu der Thematik, mit der ich mich gerade sowieso beschäftige.
Außerdem wird sich der Punk Entwicklung eines wissenschaftlichen Expertensystems gut in meinem Lebenslauf machen...

Als ersten Lösungsansatz habe ich eine kleine Java-Anwendung gebaut, die Fragen zur Bewegung & zur elektrischen Leistung beantworten kann. Die Frage kann dabei sowohl ausformuliert eingegeben werden, also z. B.: "Wie schnell fährt ein Auto das 100km in 10h schafft?" oder minimalistisch durch Nennung zweier Werte "100km" und "10h" gestellt werden - die Anwendung würde in beiden Fällen korrekt antworten. Der User muss lediglich darauf achten die Größen in Zahlen anzugeben, die ohne Leerzeichen direkt vor der Einheit stehen. Und der Wert nachdem gefragt wird darf nicht als Abkürzung in der Frage vorkommen.
Also für die Bewegung z.B. 10km oder 10km/h oder 10h
Und für die elektrische Leistung: 10V (Volt) oder 12W (Watt) oder 0.43A (Ampere)
Kommatas sind natürlich als Punkte einzugeben...

Quellcode   

Code:
import java.io.*;
import java.util.regex.*;

public class KlugscheisserHaBo 
{//Klasse
    private static void leistung()throws IOException
    {//leistung()
        String frage;
        float P=0, U=0, I=0;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("Bitte geben Sie Ihre Frage ein:");
        frage=ein.readLine();
        
        //Definition der regulären Ausdrücke zur Mustererkennung
        Pattern leistung=Pattern.compile("([\\d]+)W");
        Pattern spannung=Pattern.compile("([\\d]+)V");
        Pattern strom=Pattern.compile("([\\d]+)A");
        Matcher pMuster=leistung.matcher(frage);
        Matcher uMuster=spannung.matcher(frage);
        Matcher iMuster=strom.matcher(frage);
        
        //Extraktion der Zahlen zur Initalisierung der Variablen
        if(pMuster.find())
        {
            if(pMuster.groupCount()==1)
            {
                P=Float.valueOf(pMuster.group(1));
            }
        }
        if(uMuster.find())
        {
            if(uMuster.groupCount()==1)
            {
                U=Float.valueOf(uMuster.group(1));
            }
        }
        if(iMuster.find())
        {
            if(iMuster.groupCount()==1)
            {
                I=Float.valueOf(iMuster.group(1));
            }
        }
        
        //Berechnen der Antwort
        if(P==0)
        {
            P=Math.round(U*(I/100));
            System.out.println("Die Leistung beträgt: "+P+"Watt\n");
        }
        if(U==0)
        {
            U=Math.round(P/(I/100));
            System.out.println("Die Spannung beträgt: "+U+" Volt\n");
        }
        if(I==0)
        {
            I=Math.round(P/U);
            System.out.println("Die Stromstärke beträgt: "+I+" Ampere\n");
        }
        menue();
    }//leistung()
    private static void bewegung()throws IOException
    {//bewegung()
        String frage;
        float v=0, s=0, t=0;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("Bitte geben Sie Ihre Frage ein:");
        frage=ein.readLine();
        
        //Definition der regulären Ausdrücke zur Mustererkennung
        Pattern geschwindigkeit=Pattern.compile("([\\d]+)km/h");
        Pattern zeit=Pattern.compile("([\\d]+)h");
        Pattern weg=Pattern.compile("([\\d]+)km(?!/h)");
        Matcher vMuster=geschwindigkeit.matcher(frage);
        Matcher tMuster=zeit.matcher(frage);
        Matcher sMuster=weg.matcher(frage);
        
        //Extraktion der Zahlen zur Initalisierung der Variablen
        if(vMuster.find())
        {
            if(vMuster.groupCount()==1)
            {
                v=Float.valueOf(vMuster.group(1));
            }
        }
        if(tMuster.find())
        {
            if(tMuster.groupCount()==1)
            {
                t=Float.valueOf(tMuster.group(1));
            }
        }
        if(sMuster.find())
        {
            if(sMuster.groupCount()==1)
            {
                s=Float.valueOf(sMuster.group(1));
            }
        }
        
        //Berechnen der Antwort
        if(v==0)
        {
            v=s/t;
            System.out.println("Die Geschwindigkeit beträgt: "+v+" km/h\n");
        }
        if(t==0)
        {
            t=s/v;
            System.out.println("Die Zeitdauer beträgt: "+t+" h\n");
        }
        if(s==0)
        {
            s=v*t;
            System.out.println("Die Strecke beträgt: "+s+" km\n");
        }
        menue();
    }//bewegung()
    private static void menue()throws IOException
    {//menue()
        String auswahl;
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("*** HaBo-Klugscheißer ***");
        System.out.println("1 - Bewegung");
        System.out.println("2 - elektrische Leistung");
        System.out.println("3 - Programm beenden");
        System.out.println("Ihre Wahl?");
        auswahl=ein.readLine();
        
        if(auswahl.equals("1"))
        {
            bewegung();
        }
        else if(auswahl.equals("2"))
        {
            leistung();
        }
        else if(auswahl.equals("3"))
        {
            System.out.println("Programm beendet...");
            System.exit(0);
        }
        else
        {
            System.out.println("Ungültige Eingabe!\n");
            menue();
        }
    }//menue()
    public static void main(String[]args)throws IOException
    {//main()
        menue();
    }//main()
}//Klasse

Geändert von Tarantoga (02.11.10 um 22:38 Uhr)
Tarantoga ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 13.12.10, 13:41   #3 (permalink)
 
Registriert seit: 10.11.10
DMRMcK Leistung: Z3
Likes: 0
Standard

Konsolenanwendung in VB.
Da ich von den ganzen anderen Sachen (Magnetismus, Elektrizität, etc.) nicht wirklich viel Ahnung habe (war in Naturwissenschaften leider nie besonders), hab ich als zweite Möglichkeit der Berechnung einen BMI-Rechner eingebaut.
Reihenfolge der Eingaben der Werte ist egal - die Frage kann auch ausformuliert gestellt werden. Einzig die Angabe am Anfang - ob Geschw. oder BMI - ist nötig.
Mehrere Abfragen nacheinander sind möglich.

VB   
Code:
Imports System.Console

Module Module1
    Private text As String
    Private text2 As String
    Private kategorie As Integer
    Private nochmal As Char

    Sub Main()
        Do
            WriteLine("Für Bewegungsberechnungen bitte ""std"", ""meter"" oder ""km/h"" nutzen:")
            WriteLine("Für BMI-Berechnungen bitte ""cm"", ""kg"" oder ""bmi"" nutzen:")
            WriteLine("Was möchten Sie berechnen? (1=Geschwindigkeit, 2=BMI)")
            kategorie = CInt(ReadLine())
            WriteLine("Frage eingeben:")
            WriteLine()
            text = ReadLine()


            Select Case Suchen(text, kategorie)
                Case 1
                    text2 = text.Substring(0, text.IndexOf("meter"))
                    Dim meter As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    text2 = text.Substring(0, text.IndexOf("std"))
                    Dim std As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    WriteLine(meter & " Meter in " & std & " Stunden entspricht " & (meter / 1000 / std).ToString & "km/h")
                Case 2
                    text2 = text.Substring(0, text.IndexOf("km/h"))
                    Dim kmh As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    text2 = text.Substring(0, text.IndexOf("std"))
                    Dim std As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    WriteLine(kmh & "km/h über einen Zeitraum von " & std & " Stunden entspricht einer zurückgelegten Strecke von " & (kmh * std).ToString & " Metern")
                Case 3
                    text2 = text.Substring(0, text.IndexOf("km/h"))
                    Dim kmh As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    text2 = text.Substring(0, text.IndexOf("meter"))
                    Dim meter As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    WriteLine("Eine Strecke von " & meter & " Metern wird bei " & kmh & "km/h in " & (meter / 1000 / kmh).ToString & " Stunden (" & (meter / 1000 / kmh * 60).ToString & " Minuten) zurückgelegt")
                Case 4
                    text2 = text.Substring(0, text.IndexOf("cm"))
                    Dim cm As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    text2 = text.Substring(0, text.IndexOf("kg"))
                    Dim kg As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    WriteLine("Ihr BMI beträgt: " & (kg / ((cm / 100) ^ 2)).ToString)
                Case 5
                    text2 = text.Substring(0, text.IndexOf("cm"))
                    Dim cm As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    text2 = text.Substring(0, text.IndexOf("bmi"))
                    Dim bmi As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    WriteLine("Für einen BMI von " & bmi & " bei " & cm & " cm Körpergröße müssten Sie " & (bmi * ((cm / 100) ^ 2)).ToString & " kg wiegen")
                Case 6
                    text2 = text.Substring(0, text.IndexOf("bmi"))
                    Dim bmi As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    text2 = text.Substring(0, text.IndexOf("kg"))
                    Dim kg As Double = CDbl(text2.Substring(text2.LastIndexOf(" ") + 1))
                    WriteLine("Für einen BMI von " & bmi & " bei einem Gewicht von " & kg & "kg müssten sie " & ((Math.Sqrt(kg / bmi)) * 100) & "cm groß sein")
            End Select
            WriteLine("Noch eine Berechnung durchführen? (j/n):")
            nochmal = ReadLine()
        Loop While nochmal = "j"

    End Sub

    Private Function Suchen(ByVal text As String, ByVal kategorie As Integer) As Integer
        If kategorie = 1 Then
            If text.IndexOf("km/h") = -1 Then
                Return 1
                Exit Function
            End If
            If text.IndexOf("meter") = -1 Then
                Return 2
                Exit Function
            End If
            If text.IndexOf("std") = -1 Then
                Return 3
                Exit Function
            End If
        Else
            If text.IndexOf("bmi") = -1 Then
                Return 4
                Exit Function
            End If
            If text.IndexOf("kg") = -1 Then
                Return 5
                Exit Function
            End If
            If text.IndexOf("cm") = -1 Then
                Return 6
                Exit Function
            End If
        End If

    End Function

End Module
DMRMcK ist offline   Mit Zitat antworten
Alt 21.05.11, 14:25   #4 (permalink)
 
Registriert seit: 03.03.10
fr33g Leistung: Facit NTK
Likes: 0
Standard

Hey, finde das ist echt ne coole Aufgabe dir du dir da ausgedacht hast;-) Vor allem weil sie so beliebig erweiterbar ist. Da ich im Moment sowieso viel mit Physik zu tun habe, passt mir das eigentlich sehr gut
Werde mich in nächster Zeit auch mal an mein "Expertensystem" machen, sehr interessant finde ich die Eingabe als Satz, denn das kann man auch immer weiter verbessern. Mache mich also demnächst mal dran und poste dann erste Lösungen:-P

Lg fr33g
fr33g ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Fragen und Antworten ->"Expertensysteme"
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Antworten NMK Hackerboard.de-Feedback 9 07.03.06 01:04
WHAX 3.0 --- Newbies fragen -- Pros antworten Ricci WLAN-Zone 12 03.03.06 18:31
2 Fragen vllt auch 2 antworten :) were nett :D jogy Windows 8 20.02.05 15:35


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