Autor Beitrag
N23
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 10.01.10 16:12 
Hi Leute .

Ich hab wieder mal ein Aufgabenbeispiel von der Schule wo ich hänge, obwohl ich nicht weiss ob das jetzt nur ein Syntax Problem ist oder es von grund auf falsch aufgebaut ist.

Hab auch versucht bei der Case mit den "or = |" Operator zu verwenden aber bekomme immer einen Syntax Fehler egal wie ich es schreibe. Ist es überhaupt möglich einer "case" mehere Werte zu geben ?

greetz n23


Angabe:
// Beispiel 3)
//Grundstückspreis Kalkulator.

//Lesen Sie einen Bezirk (zahl) ein und einen Quadratmeter Anzahl (Gleitkommazahl)

//Ermitteln Sie nun den Wert des Gründstückes aufgrund folgender Tabelle

//Bezirk Preis/m2
//1 500
//2-5 450
//6-9 475
//10-14 395
//15-20 350
//21-23 275

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:
57:
58:
59:
60:
61:
62:
63:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mayer_Bernhard_Beispiel2_3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bitte geben Sie einen Bezirk in dem Sie das grundstück berechnen wollen 1-23");
            int bez = Convert.ToInt32(Console.ReadLine());
            

            

            if (bez > 23)
           {
                Console.WriteLine("Diesen Bezirk gibt es nicht. ProgrammEnde!");    
           }

            else
            {
            Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

            double grbez = Convert.ToDouble(Console.ReadLine());

           string bez1 = Convert.ToString(bez);

           switch (bez1)
           {
               case "1"double grpreis = grbez * grbez * 1000 * 500;
                   Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis + "Euro");break;

               case "2,3,4,5"double grpreis2 = grbez * grbez * 1000 * 450;
                   Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis2 + "Euro"); break;


               case "6,7,8,9"double grpreis3 = grbez * grbez * 1000 * 475;
                   Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis3 + "Euro"); break;


               case "10,11,12,13,14"double grpreis4 = grbez * grbez * 1000 * 395;
                   Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis4 + "Euro"); break;


               case "15,16,17,18,19,20"double grpreis5 = grbez * grbez * 1000 * 350;
                   Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis5 + "Euro"); break;


               case "21,22,23"double grpreis6 = grbez * grbez * 1000 * 275;
                   Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis6 + "Euro"); break;


               default: Console.WriteLine("Fehler im Programm wird beendet"); break;
           }
           Console.ReadLine();  
            } 
            
        }
    }
}
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: So 10.01.10 17:19 
Eine case-Marke hat genau einen Wert. Was hier benötigt wird nennt sich Fall-Through. Google hilft bestimmt, wenn nicht, dann frage einfach nach.

Grüße, JasonDelife.
Kenpachi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30

Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
BeitragVerfasst: So 10.01.10 17:20 
Hallo, N23.

Deine Herangehensweise ist ein bischen fehlgeschlagen. ;)
Du brauchst deinen Integer-Wert für den Bezirk nicht in einen String konvertieren, sondern kannst direkt einen Switch auf den Integer-Wert machen.
Wenn du möchtest, dass mehrere Werte das selbe Ereignis auslösen, kannst du einfach einen "Fall-Through" machen.

Das sähe dann so aus:
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:
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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mayer_Bernhard_Beispiel2_3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bitte geben Sie einen Bezirk in dem Sie das grundstück berechnen wollen 1-23");
            int bez = Convert.ToInt32(Console.ReadLine());
            

            

            if (bez > 23)
           {
                Console.WriteLine("Diesen Bezirk gibt es nicht. ProgrammEnde!");    
           }

            else
            {
            Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

            double grbez = Convert.ToDouble(Console.ReadLine());

           

           switch (bez)
           {
        case 1:
          double grpreis = grbez * grbez * 1000 * 500;
          Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis + "Euro");break;

        case 2:
        case 3:
        case 4:
        case 5:
          double grpreis2 = grbez * grbez * 1000 * 450;
          Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis2 + "Euro"); break;

        case 6:
        case 7:
        case 8:
        case 9
          double grpreis3 = grbez * grbez * 1000 * 475;
          Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis3 + "Euro"); break;

        case 10:
        case 11:
        case 12:
        case 13
        case 14
          double grpreis4 = grbez * grbez * 1000 * 395;
          Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis4 + "Euro"); break;

        case 15:
        case 16:
        case 17:
        case 18
        case 19:  
        case 20
          double grpreis5 = grbez * grbez * 1000 * 350;
          Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis5 + "Euro"); break;

        case 21:
        case 22:
        case 23:
          double grpreis6 = grbez * grbez * 1000 * 275;
          Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis6 + "Euro"); break;

        default: Console.WriteLine("Fehler im Programm wird beendet"); break;
           }
           Console.ReadLine();  
            } 
            
        }
    }
}


EDIT: Sorry, irgendwie hat es die Formatierung verschoben. oO
N23 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 10.01.10 17:51 
Hi Leute

So Danke mal für die vielen Antworten hab jetzt wieder was dazu gelernt! :D thx ^^

Hab`s aber in der zwischen Zeit auch umgeschrieben und so funktionierts auch. Welches jetzt mehr Sinn macht ob mit If´s oder den Case´s schau ich mir nochmal an.

greetz n23

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:
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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mayer_Bernhard_Beispiel2_3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bitte geben Sie einen Bezirk in dem Sie das grundstück berechnen wollen 1-23");
            int bez = Convert.ToInt32(Console.ReadLine());
            

            

            if (bez > 23)
           {
                Console.WriteLine("Diesen Bezirk gibt es nicht. ProgrammEnde!");    
           }
            else if (bez == 1)
            {
                int berzikswahl = 1;
                Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

                double grbez = Convert.ToDouble(Console.ReadLine());
                string bez1 = Convert.ToString(berzikswahl);

                double grpreis = grbez * grbez * 1000 * 500;
                Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis + "Euro");
            }

            else if (bez == 2 || bez == 3 || bez == 4 || bez == 5)
            {
                int berzikswahl = 2;
                Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

                double grbez = Convert.ToDouble(Console.ReadLine());
                string bez1 = Convert.ToString(berzikswahl);

                double grpreis2 = grbez * grbez * 1000 * 450;
                Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis2 + "Euro");
            }

            else if (bez == 6 || bez == 7 || bez == 8 || bez == 9)
            {
                int berzikswahl = 3;
                Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

                double grbez = Convert.ToDouble(Console.ReadLine());
                string bez1 = Convert.ToString(berzikswahl);

                double grpreis3 = grbez * grbez * 1000 * 475;
                Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis3 + "Euro");
            }

            else if (bez == 10 || bez == 11 || bez == 12 || bez == 13 || bez == 14)
            {
                int berzikswahl = 4;
                Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

                double grbez = Convert.ToDouble(Console.ReadLine());
                string bez1 = Convert.ToString(berzikswahl);

                double grpreis4 = grbez * grbez * 1000 * 395;
                Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis4 + "Euro");
            }

            else if (bez == 15 || bez == 16 || bez == 17 || bez == 18 || bez == 19 || bez == 20)
            {
                int berzikswahl = 5;
                Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

                double grbez = Convert.ToDouble(Console.ReadLine());
                string bez1 = Convert.ToString(berzikswahl);

                double grpreis5 = grbez * grbez * 1000 * 350;
                Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis5 + "Euro");
            }

            else if (bez == 21 || bez == 22 || bez == 23)
            {
                int berzikswahl = 6;
                Console.WriteLine("Bitte geben die die gr. des gewünschten Grundstücks in km ein");

                double grbez = Convert.ToDouble(Console.ReadLine());
                string bez1 = Convert.ToString(berzikswahl);

                double grpreis6 = grbez * grbez * 1000 * 275;
                Console.WriteLine("Der Preis des Grundstücks beträgt:" + grpreis6 + "Euro");
            }

            else
            {
                Console.WriteLine("Fehler im Programm wird beendet");
            }
            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: So 10.01.10 18:31 
Hallo,

das sieht doch schon ganz brauchbar aus. Hier noch ein paar Hinweise und Vorschläge:

1. switch ist erheblich übersichtlicher. Der Compiler macht daraus auch direkte Sprünge, anders als bei if-else if, wo alle Zweige durchlaufen werden. (Vielleicht optimiert er das auch zu einem switch, aber da bin ich mir nicht sicher.)

2. Du siehst, dass ständig die gleichen Abläufe vorkommen. Das kann verkürzt und vereinheitlicht werden: Entweder die Wiederholungen werden in eine einheitliche Methode ausgelagert; oder (das dürfte hier mit den wenigen Schritten besser sein) in die case-Teile kommen nur die Unterschiede, nämlich die Abfrage nach der Fläche; dahinter kommt alles, was gleich abläuft.

3. Convert.ToString ist überflüssig, weil durch ReadLine schon ein String zurückgegeben wird.

4. Convert.ToDouble ist riskant, weil auch etwas wie "1,2,3" oder "Quatsch" eingegeben werden kann; das knallt dann. Viel besser ist double.TryParse. Das gleiche gilt für die int-Abfrage.

Gruß Jürgen