Entwickler-Ecke
C# - Die Sprache - Case Syntax
N23 - So 10.01.10 16:12
Titel: Case Syntax
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
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 - 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 - 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:
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 - 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
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 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!