Autor Beitrag
0jeppa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 28.10.09 15:03 
Hallo Zusammen

Ich habe folgende Aufgabe probiert zu lösen. Leider funktioniert es aber nicht ganz. Könnt ihr mir weiterhelfen?


Die Integerzahl z lässt sich aus den beiden Wahrheitswerten p und q bestimmen mit:

z = 0 für p = false, q = false
z = 1 für p = true, q = false
z = 2 für p = true, q = true
z = 3 für p = false, q = true

ausblenden volle Höhe C#-Quelltext
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:
 bool p;
            bool q;
            int z;

            Console.WriteLine("p = ");
            Console.ReadLine();
            Console.WriteLine("q = ");
            Console.ReadLine();


            if ((p = false) && (q = false)) ; 

            {z = 0;
            }
             else
            
                if ((p = true) && (q = false)); 
                {

                    z = 1;
                }
               else
            
                if ((p = true) && (q = true)); 
                {

                    z = 2;
                }
                else
            
                if ((p = false) && (q = true)); 
                {

                    z = 3;
                }

            Console.WriteLine(z);
            Console.ReadLine();
            }
    }
}
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mi 28.10.09 15:11 
Du weist deinen Veraiblen ja auch immer Werte zu.
Beachte:
= -> Zuweisung
== -> ist gleich?
=! -> ist ungleich?
! -> Negation

und da du sowieso schon Boolean Werte verwendest geht es noch einfacher z.B.
ausblenden C#-Quelltext
1:
if((p = true) && (q = true))					

bringt das selbe ergebnis wie
ausblenden C#-Quelltext
1:
if(p&&q)					

ausblenden C#-Quelltext
1:
if(p = false) && (q = true)					

bringt das selbe ergebnis wie
ausblenden C#-Quelltext
1:
if(!p&&q)					
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Mi 28.10.09 15:20 
Servus

ich sag mal die entscheidenen Sachen fehlen noch.

Als erstes fragst du einen String mit ReadLine() ab und erwartest, dass es ein bool wird.

Dort müsstest du also noch eine Konvertierung durchführen ... irgend sowas wie:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
  bool p = false;
  Console.WriteLine("Gebenen sie Wert für p ein J für true, sonst false");
  if(Console.ReadLine() == "J")
     p = true;
  else
    p = false// Den Else teil kannst du auch weglassen, da false ja schon gesetzt. 
...


Dann stimmen deine Abfragen auch nicht mit "p = false" machst du eine Zuweisung und "p == false" wäre die Abfrage.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
int z = 0

if(p == true && q == false)
  z = 1;
else if(p == true && q == true)
  z = 2;
else if(p == false && q ==true)
  z = 3;



Edit: hehe da war einer schneller
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 28.10.09 15:37 
user profile iconNemag hat folgendes geschrieben Zum zitierten Posting springen:
Als erstes fragst du einen String mit ReadLine() ab und erwartest, dass es ein bool wird.

Das passiert noch nicht einmal. ReadLine wird abgefragt, aber das Ergebnis wird nirgends zugewiesen - auch nicht einem String. Deshalb sag ich ebenfalls:
user profile iconNemag hat folgendes geschrieben Zum zitierten Posting springen:
ich sag mal die entscheidenen Sachen fehlen noch.

Deshalb muss der erste Schritt z.B. so lauten:
ausblenden C#-Quelltext
1:
2:
string result = Console.ReadLine().ToUpper();
//  sonst muss im späteren Verlauf immer doppelt abgefragt werden

In Bakachans Antwort ist der folgende Hinweis implizit enthalten; ich möchte es ausdrücklich hervorheben: [Tipp] Anfängerfehler == true / == false. Aber das spielt hier erst dann eine Rolle, wenn wir so etwas einbauen:
ausblenden C#-Quelltext
1:
bool p = result == "J";					

(Ich hoffe, das muss ich nicht erläutern, sondern 0jeppa versucht selbst eine Erklärung.)

Danach geht es mit Bakachans Lösung weiter.

Gruß Jürgen

@Michael
Bitte korrigiere deinen Beitrag; du hast 0jeppa's Fehler übernommen (2x).
0jeppa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 28.10.09 15:58 
Sieht jetzt ein bisschen anders aus. Mir ist aber nicht klar, wieso der zweite Teil überhaupt nicht abgefragt wird. z ist einfach immer 0. Wieso?
ausblenden volle Höhe C#-Quelltext
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:
{
    class Program
    {
        static void Main(string[] args)

        {
              bool p = false;
              Console.WriteLine("T für true, sonst false");
              if(Console.ReadLine() == "J")
              p = true;
              
             
              bool q = false;
              Console.WriteLine("T für true, sonst false");
              if(Console.ReadLine() == "J")
              q = true;


              int z = 0;
           

                 if ((p == false) && (q == false))
                 {
                     z = 0;
                 }


                 if ((p == true) && (q == false))
                 {

                     z = 1;
                 }


                 if ((p == true) && (q == true))
                 {

                     z = 2;
                 }


                 if ((p == false) && (q == true))
                 {

                     z = 3;
                 }



            Console.WriteLine(z);
            Console.ReadLine();
            }
    }
}
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Mi 28.10.09 16:10 
Wie der zweite Teil wird nie abgefragt? In deiner Anweisung werden jetzt immer alle 4 Teile abgefragt.
Schau dir am besten nochmals die Verwendung/Aufbau von If-Anweisung an.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
if(...) {}
else(...)
{
   //Hier wird nur reingesprungen wenn der if-Teil false zurücklieferte.
   //Dies solltest du auch für deine Abfragen verwenden. 
}
else

//besser wäre  eigentlich eh so was hier:

if(q) 
{
  if(p)
    z= ...//War jetzt zu faul nicht richtigen Werte für z rauszusuchen
  else
    z = ...
}
else
{
  if(p)
    z= ...
  else
    z = ...
}
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Mi 28.10.09 16:13 
Achso ich rate jetzt mal warum es immer 0 ist:

ausblenden C#-Quelltext
1:
2:
3:
4:
  bool p = false;
  Console.WriteLine("T für true, sonst false");
  if(Console.ReadLine() == "J")
    p = true;


Du gibst immer T ein im Programm wird aber auf J geprüft ... folglich sind dein q und p auch immer false.
Bei so was hilft übrigens der Debugger weiter...einfach mal Breakpoints setzen und schauen welche Werte die Variablen haben.
0jeppa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 28.10.09 16:28 
Oh, wie peinlich. Lag tatsächlich am J. Bin euch mega dankbar, habe wieder viel gelernt. Wahrscheinlich hätte ihr das ganze Programm ganz anders geschrieben, aber ich fange erst damit an und so ist es für mich jetzt auch verständlich. Darauf kann ich nun aufbauen und üben. Vielen Dank für eure Mithilfe.
PS: so funktioniert es jetzt.


ausblenden volle Höhe C#-Quelltext
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:
{
    class Program
    {
        static void Main(string[] args)
        {

             {
              bool p = false;
              Console.WriteLine("T für true, sonst false");
              if(Console.ReadLine() == "T")
              p = true;
              
             
              bool q = false;
              Console.WriteLine("T für true, sonst false");
              if(Console.ReadLine() == "T")
              q = true;


              int z = 0;
           

                 if ((p == false) && (q == false))
                 {
                     z = 0;
                 }


                 if ((p == true) && (q == false))
                 {

                     z = 1;
                 }


                 if ((p == true) && (q == true))
                 {

                     z = 2;
                 }


                 if ((p == false) && (q == true))
                 {

                     z = 3;
                 }



            Console.WriteLine(z);
            Console.ReadLine();
            }
    }
}
        }
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 28.10.09 16:53 
Aber auch wenn es jetzt funktioniert, ist es trotzdem eher sinnwidrig, es so zu schreiben. Du bist mehrfach auf "else if" hingewiesen worden; ebenso ist die Abfrage "== false" nicht sehr sinnvoll; Erläuterungen stehen in dem von mir angegebenen Link. Jürgen
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Mi 28.10.09 16:58 
Zum Helfen sind wir ja da...

will nochmal auf deine 4 If - Anweisung, diese werden immer alle durchlaufen. Verwende lieber

ein if / else if / else - Kombination wie in meinem vorletzten Post erwähnt.

@Edit: hehe da war einer schneller ;-)
0jeppa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 28.10.09 17:36 
Also kann ich das erste if ganz weglassen, weil ja beide male p==false und q==false steht. Also nur true abfragen, aber schaffe es einfach nicht das else sinnvoll reinzubasteln.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 28.10.09 19:17 
Schon wegen der Übersichtlichkeit und wegen der Zuweisung für z, die daraus abgeleitet werden soll, ist es in diesem Fall besser, alle Varianten stehenzulassen. Aber wie if...else if zu nutzen sind, steht schon in Nemags allererstem Beitrag; wie "== false" besser zu nutzen sind, hat bakachan ganz am Anfang gesagt, und es steht in dem von mir zweimal erwähnten Link.

Alle Antworten doppelt und dreifach zu schreiben ist auch nicht so angenehm. Jürgen