WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Programmierung einer Aufgabe

 

blueeyes
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2012, 09:30     Titel: Programmierung einer Aufgabe
  Antworten mit Zitat      
Hallo erstmal,
habe folgenes problem, soll eine Logelei mit dem Programm lösen.
Die logelei in kurzvorm lautet das jemand ein packet mit ner Bombe bekommt wo 6 Schalter angebracht sind und nur wenn die richtige kombination gefunden wurde explodiert sie nicht.
Folgende Aussagen sind gegeben:
1. Wenn Schalter 1 nach links und außerdem sowohl Schalter 2 als auch Schalter 5 nach rechts sind, knallts.
2. Wenn Schalter 3 nach rechts und außerdem von den beiden Schaltern 1 und 6 mindestens einer nach rechts ist, knallts.
3. Wenn Schalter 1 nach links und außerdem die Schalter 2,4 und 5 nach rechts sind, knallts.
4. Wenn Schalter 4 nach links und zudem Schalter 6 nach rechts ist, knallts.
5. Wenn Schalter 2 und außerdem mindestens einer der beiden Schalter 1 und 6 nach links gestellt sind , knallts.
6. Wenn Schalter 4 nach rechts und zugleich Schalter 3 nach links ist, knallts.
7. Wenn sowohl Schalter 5 als auch Schalter 6 nach links gekippt sind, knallts.

Dies ist mein Ansatz:

Code:

Matrix=char('links gedrueckt','nicht gedrueckt', 'rechts gedrueckt') ;
[N,M]=size(Matrix);
for schalter1 = 1:3
    for schalter2 =1:3
        if schalter1 == schalter2
            continue
        end
        for schalter3 = 1:3
            if schalter3 == schalter1 | schalter3 == schalter2
                continue
            end
            for schalter4= 1:3
                if schalter4 == schalter1 | schalter4 == schalter2 | schalter4 == schalter3
                    continue
                end
                for schalter5= 1:3
                    if schalter5 == schalter1|schalter5 == schalter2|schalter5 == schalter3|schalter5 == schalter4
                        continue
                    end
                    for schlater6= 1:3
                        if schalter6 == schalter1|schalter6 == schalter2|schalter6 == schalter3|schalter6 == schalter4|schalter6 == schalter5
                            continue
                        end
                a1 = schalter1 == 1||schalter2 == 3 || schalter5 == 3;
                a2 = schalter3 == 3||schalter1 == 3;
                a3 = schalter3 == 3||schalter6 == 3;
                a4 = schalter1 == 1||schalter2 ==3||schalter4==3||schalter5==3;
                a5=schalter4 ==1||schalter6==3;
                a6=schalter2==1||schalter1==1;
                a7=schalter2==1||schalter6==1;
                a8=schalter4==3||schalter3==1;
                a9=schalter5==1||schalter6==1;
                gesamt = a1 && a2 && a3 && a4 && a5 && a6 && a7 && a8 && a9;
                if (gesamt)
                    fprintf('Schalter1 ist %s\n', Matrix (schalter1,1:N));
                    fprintf('Schalter2 ist %s\n', Matrix (schalter2, 1:N));
                    fprintf('Schalter3 ist %s\n', Matrix (schalter3, 1:N));
                    fprintf('Schalter4 ist %s\n', Matrix (schalter4, 1:N));
                    fprintf('Schalter5 ist %s\n', Matrix (schalter5,1:N));
                    fprintf('Schalter6 ist %s\n', Matrix (schalter6,1:N));
                end
                    end
                end
            end
        end
    end
end
 


jetzt meine Frage: ich habe die Bedingungen ja aufgestellt nur leider bekomme ich keine Ergebnisse.
Zudem weiß ich auch recht nicht ob die Aussagen die ich aufgestellt habe so richtig geschrieben wurden, wäre schön wenn mir jemand bei dem Problem helfen könnte.

MFG
Private Nachricht senden Benutzer-Profile anzeigen


flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2012, 12:37     Titel:
  Antworten mit Zitat      
Ich würde davon absehen, dass via "hau drauf if-Abfragen" zu erzeugen.
Ein fachlicher Ansatz wäre:
http://de.wikipedia.org/wiki/Karnaugh-Veitch-Diagramm
http://de.wikipedia.org/wiki/Verfahren_nach_Quine_und_McCluskey
http://de.wikipedia.org/wiki/Disjunktive_Normalform
http://de.wikipedia.org/wiki/Konjunktive_Normalform

Damit lässt sich das ganze als Boolscher Ausdruck minimal beschreiben und dann sollte der Code auch um ein Vielfaches kürzer werden
Private Nachricht senden Benutzer-Profile anzeigen
 
blueeyes
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2012, 10:48     Titel:
  Antworten mit Zitat      
Danke für den Tip habe jetzt die Bedingungen geschrieben, nur bekomme ich jetzt keine ergebnisse angezeigt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 15.05.2012, 11:03     Titel:
  Antworten mit Zitat      
"nur bekomme ich jetzt keine ergebnisse angezeigt. " Das ist nicht wirklich hilfreich... Very Happy

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.05.2012, 11:17     Titel:
  Antworten mit Zitat      
Hallo

entferne alle deine Bedingungen mit CONTINUE, da erstens diese an dieser Stelle ganz unnötig sind und zweitens machen diese keinen Sinn.
Wie willst du erreichen mit 3 Werten, dass alle 6 Schalter unterschiedliche Werte annehmen, also kommst damit nicht mal bis zu vierten Schalter.

Außerdem hast in FOR den Namen "schalter6" falsch geschrieben
Private Nachricht senden Benutzer-Profile anzeigen
 
blueeyes
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2012, 20:10     Titel:
  Antworten mit Zitat      
Danke schon mal im vorraus für die wertvollen Tips, also mit ergebnisse mein ich, wenn ich das skript ins Programm ziehe werden mir keine ergebnisse angezeigt, normalerweise habe ich ja in den letzten Befehlen das Programm aufgefordert mir die gewissen Schalter mit einer antwort aus zu geben wie Schater1 ist gedrückt.

An denny der tip mit den Bedingungen nach den Variablen hat mich überzeugt, aber das mit den Schaltern hab ich nicht ganz Verstanden, am Ende kann ja jeder schalter nur jeweils drei bedingungen annehmen, bzw drei stellungen haben links gedrückt, rechts gedrückt und gar nicht gedrückt???
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.05.2012, 11:34     Titel:
  Antworten mit Zitat      
blueeyes hat Folgendes geschrieben:

An denny der tip mit den Bedingungen nach den Variablen hat mich überzeugt, aber das mit den Schaltern hab ich nicht ganz Verstanden, am Ende kann ja jeder schalter nur jeweils drei bedingungen annehmen, bzw drei stellungen haben links gedrückt, rechts gedrückt und gar nicht gedrückt???


Ja es gibt 3 Positionen, welche die Schalter annehmen können.
Du versuchst es aber vorab zu prüfen, und dann diese Schalterposition zu überspringen, also kommt dann vor, dass an der Stelle
Code:

if schalter4 == schalter1 | schalter4 == schalter2 | schalter4 == schalter3

end
 

immer aus der Schleife hinausspringst. Weil vorher hast du ja schon geprüft, dass der Schalter1 und Schalter2 und Schalter 3 unterschiedlich. sein sollen. 3 Schalter Positionen bereits besetzt und du verlangst von Schalter4, dass es anders gesetzt ist als vorherige Schalter. Das Funktioniert nicht, weil wie bereits erwähnt hast nur 3 Positionsmöglichkeiten. Also kommst du nie bis zum Schalter6.

Außerdem hast du ja bereits die Stelle wo du abprüfst, das IF (gesamt) .
Das genügt. Also sind die anderen Bedingungen überflüssig.
Private Nachricht senden Benutzer-Profile anzeigen
 
blueeyes
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2012, 12:50     Titel:
  Antworten mit Zitat      
also danke dir danny,
habe jetzt den quellcode so umgeändert wie du meintest.
ich glaube aber das das ergebnis nicht richtig stimmt mit den Bedingungen, wäre schön wenn du mir noch dabei helfen könntest...

also mein neuer Quellcode
Code:
Matrix=char('links gedrueckt','nicht gedrueckt', 'rechts gedrueckt') ;
[M,N]=size(Matrix);
for schalter1 = 1:3
    for schalter2 =1:3
       
        for schalter3 = 1:3
           
            for schalter4= 1:3
               
                for schalter5= 1:3
                   
                   
                    for schalter6= 1:3
                       
                a1 = schalter1 == 1 || schalter2 == 3 || schalter5 == 3;
                a2 = schalter3 == 3 || schalter1 == 3;
                a3 = schalter3 == 3 || schalter6 == 3;
                a4 = schalter1 == 1 || schalter2 == 3 || schalter4 == 3 || schalter5 == 3;
                a5 = schalter4 == 1 || schalter6 == 3;
                a6 = schalter2 == 1 & schalter1 == 1 | schalter2 == 1 & schalter6 == 1;
                a7 = schalter4 == 3 || schalter3 == 1;
                a8 = schalter5 == 1 || schalter6 == 1;
                a9 = schalter6 == schalter1|schalter6 == schalter2|schalter6 == schalter3|schalter6 == schalter4|schalter6 == schalter5|schalter1 == schalter2 |schalter3 == schalter1 | schalter3 == schalter2|schalter4 == schalter1 | schalter4 == schalter2 | schalter4 == schalter3|schalter5 == schalter1|schalter5 == schalter2|schalter5 == schalter3|schalter5 == schalter4;
                           
                gesamt = a1 && a2 &&  a3 && a4 && a5 && a6 && a7 && a8 && a9;
                if (gesamt)
                    fprintf('Schalter1 ist %s\n', Matrix (schalter1,1:N));
                    fprintf('Schalter2 ist %s\n', Matrix (schalter2, 1:N));
                    fprintf('Schalter3 ist %s\n', Matrix (schalter3, 1:N));
                    fprintf('Schalter4 ist %s\n', Matrix (schalter4, 1:N));
                    fprintf('Schalter5 ist %s\n', Matrix (schalter5,1:N));
                    fprintf('Schalter6 ist %s\n', Matrix (schalter6,1:N));
                end
                    end
                end
            end
        end
    end
end


und mein Ergebnis ist folgendes:

Schalter1 ist links gedrueckt
Schalter2 ist links gedrueckt
Schalter3 ist rechts gedrueckt
Schalter4 ist rechts gedrueckt
Schalter5 ist links gedrueckt
Schalter6 ist rechts gedrueckt
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.05.2012, 13:51     Titel:
  Antworten mit Zitat      
Hallo

du hast in der Aufgabe doch 7 Bedingungen , warum hast 9 definiert?
Bedingung Eins ist schon mal falsch:
Zitat:
Wenn Schalter 1 nach links und außerdem sowohl Schalter 2 als auch Schalter 5 nach rechts sind, knallts.

Du hast a1= schalter1==1||schalter2 == 3 || schalter5 == 3 sollte aber
a1 = schalter1 == 1 && schalter2 == 3 && schalter5 == 3;

Überprüfe alle deine Bedingungen.
Außerdem bedenke, dass es die Bedingungen sind wo die Bombe explodiert und du such die Schalterkombination, wo die Bombe entschärft wird.
Also wie sollte die GESAMT denn lauten?

Außerdem deine Annahme ist falsch, es müssen ja alle Schalter gedrückt sein, weil man ja nur eine Kombination hat, wo die Bombe nicht explodiert Also muss du Zustand "Nicht gedrückt" übersprungen werden
Private Nachricht senden Benutzer-Profile anzeigen
 
blueeyes
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2012, 15:00     Titel:
  Antworten mit Zitat      
Habe die Aussagen überarbeitet, nur weiß ich nicht ganz wie ich gesamt dann so hin bekomme das sie nicht knallt.

habe es so probiert aber so klappt es nicht:

Code:
a1 = schalter1 == 1 && schalter2 == 3 && schalter5 == 3;
                a2 = schalter3 == 3 && schalter1 == 3 | schalter6 == 3;
                a3 = schalter1 == 1 && schalter2 == 3 && schalter4 == 3 && schalter5 == 3;
                a4 = schalter4 == 1 && schalter6 == 3;
                a5 = schalter2 == 1 && schalter1 == 1 | schalter2 == 1 && schalter6 == 1;
                a6 = schalter4 == 3 && schalter3 == 1;
                a7 = schalter5 == 1 && schalter6 == 1;
               
                gesamt = ~(a1) && ~(a2) &&  ~(a3) && ~(a4) && ~(a5) && ~(a6) && ~(a7);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.05.2012, 15:39     Titel:
  Antworten mit Zitat      
Hallo
die Bedingung a2 ist noch nicht ganz richtig.
Sonst sind die anderen Bedingungen richtig. Auch gesamt ist richtig.

Wie Gesagt du muss auch "Nicht Gedrückt"-Zustand noch überspringen.
Private Nachricht senden Benutzer-Profile anzeigen
 
blueeyes
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2012, 15:53     Titel:
  Antworten mit Zitat      
eigentlich kann ich doch dieses nicht gedrückt weg lassen, wenn die annahme von kippschaltern ist...

habe jetzt bedingung 2 umgeschrieben und die schalter1-6 mit den zahlenwerten 1:2 benannt.

aber es gibt drei lösungen also denke ich das eine bedingung nicht richtig ist.

Code:
Matrix=char('links gedrueckt', 'rechts gedrueckt') ;
[M,N]=size(Matrix);
for schalter1 = 1:2
    for schalter2 =1:2
       
        for schalter3 = 1:2
           
            for schalter4= 1:2
               
                for schalter5= 1:2
                   
                   
                    for schalter6= 1:2
                       
                a1 = schalter1 == 1 && schalter2 == 2 && schalter5 == 2;
                a2 = schalter3 == 2 && schalter1 == 2 | schalter3 == 2 && schalter6 == 2;
                a3 = schalter1 == 1 && schalter2 == 2 && schalter4 == 2 && schalter5 == 2;
                a4 = schalter4 == 1 && schalter6 == 2;
                a5 = schalter2 == 1 && schalter1 == 1 | schalter2 == 1 && schalter6 == 1;
                a6 = schalter4 == 2 && schalter3 == 1;
                a7 = schalter5 == 1 && schalter6 == 1;
               
                gesamt = ~(a1) && ~(a2) &&  ~(a3) && ~(a4) && ~(a5) && ~(a6) && ~(a7);
                if (gesamt)
                    fprintf('Schalter1 ist %s\n', Matrix (schalter1,1:N));
                    fprintf('Schalter2 ist %s\n', Matrix (schalter2, 1:N));
                    fprintf('Schalter3 ist %s\n', Matrix (schalter3, 1:N));
                    fprintf('Schalter4 ist %s\n', Matrix (schalter4, 1:N));
                    fprintf('Schalter5 ist %s\n', Matrix (schalter5,1:N));
                    fprintf('Schalter6 ist %s\n', Matrix (schalter6,1:N));
                end
                    end
                end
            end
        end
    end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.05.2012, 16:29     Titel:
  Antworten mit Zitat      
Hallo das liegt an ODER Zeichen du nutzt es für Arrays | , vielleicht hat es höhere Priorität als && Zeichen

| durch || ersetzen dann läuft es
Code:

                  a1 = schalter1 == 1 && schalter2 == 2 && schalter5 == 2;
                  a2 = schalter3 == 2 && schalter1 == 2 || schalter3 == 2 && schalter6 == 2;
                  a3 = schalter1 == 1 && schalter2 == 2 && schalter4 == 2 && schalter5 == 2;
                  a4 = schalter4 == 1 && schalter6 == 2;
                  a5 = schalter2 == 1 && schalter1 == 1 || schalter2 == 1 && schalter6 == 1;
                  a6 = schalter4 == 2 && schalter3 == 1;
                  a7 = schalter5 == 1 && schalter6 == 1;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
blueeyes
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2012, 16:31     Titel:
  Antworten mit Zitat      
Ich danke dir rechtherzlich, du hast mir das ganze Wochenende gerettet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.