C# Probleme wegen Datentyp-Konvertierung

>|Sh4d0w|<

Commander
Registriert
Jan. 2009
Beiträge
2.519
Hallo Luute, ich übe gerade eine Konsolenanwendung in C# in Visual Studios 2005, weil wir nächste Woche eine Kurzarbeit schreiben. Ich habe versucht einen Währungsrechner zu schreiben, der funktioniert aber nicht so ganz wie ich es will.

Am Anfang soll ein Menü mit den Auswahlmöglichkeiten 1, 2 und 9 kommen.

Bei:
Eingabe einer 1 soll ich ins Untermenü kommen, wo der ich eine DM Zahl eingebe und anschließend in Euro ausgegeben wird.

Das selbe mit der Eingabe 2 im Hauptmenü, nur dass hier Euro in DM umgerechnet wird.

Man soll nach der alten Eingabe erneut eine DM / Euro Zahl eingeben können (Wiederholung), bis man eine 0 eingibt, die einen wieder ins hauptmenü zurückwirft

Bei einer Eingabe 9 im Hauptmenü soll sich das Programm beenden..



Kann es sein dass es an der fehlenden Datentyp-Konvertierung fehlt? Ich verstehe es noch nicht so richtig wann und weshalb man Datentypen konvertieren muss..

Schaut euch mal meinen Quellcode an. Vielleicht habe ich noch mehr Fehler, die ich nicht



Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace übung
{
    class Program
    {
        static void Main(string[] args)
        {
            //Variablendefinition
            double dM = 0.0;
            double dEuro = 0.0;
            double dFaktor = 1.95583;
            int iAuswahl = 0;

            //Wiederholungsschleife
            do
            {

                //Startbildschirm/Menü
                Console.WriteLine("Währungsrechner\n");
                Console.WriteLine("1 DM -> Euro");
                Console.WriteLine("2 Euro -> DM");
                Console.WriteLine("9 Abbruch\n");
                Console.Write("Auswahl:");
                Console.ReadLine();
                int iAuswahl = Console.ReadLine();

                //Auswahl
                switch (iAuswahl)
                    {
                        case 1:
                                do
                                {

                                    Console.Write("DM: ");
                                    Console.ReadLine();
                                    double dDM = Console.ReadLine();
                                    double dEuro = dDM / dFaktor;
                                    Console.WiteLine("Euro: " + dEuro); break;

                                }while (dDM != 0);

                        case 2:
                                do
                                {
                                    Console.Write("Euro: ");
                                    Console.ReadLine();
                                    double dEuro = Console.ReadLine();
                                    double dDM = dEuro * dFaktor;
                                    Console.WriteLine("DM: " + dDM);

                                }while (dEuro != 0); break;

                        case 9: Console.WriteLine("Falsche Ausgabe"); break;
                    }
            }while (iAuswahl != 9);
        }





        }
    }
}
 
Zuletzt bearbeitet:
Hat "der funktioniert aber nicht so ganz wie ich es will." auch eine Fehlermeldung? Wenn ja: lesen und posten.
 
probier doch einfach beim switch statement auf strings abzufragen.
Denn Console.ReadLine(); gibt einen String zurück -> wenn du das dann in eine int variable packen willst gibts ienen fehler ...
Dann musste entweder iAuswahl = Int32.Convert(Console.ReadLine());
oder einfach mein beispiel ;)

Außerdem hast du ein Console.ReadLine zuviel ...
wenn du das nicht sofort einer variable zuweist, war das für nix und der benutzer muss 2x die zahl eingeben
Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace übung
{
    class Program
    {
        static void Main(string[] args)
        {
            //Variablendefinition
            double dM = 0.0;
            double dEuro = 0.0;
            double dFaktor = 1.95583;
            string strAuswahl = 0;

            //Wiederholungsschleife
            do
            {

                //Startbildschirm/Menü
                Console.WriteLine("Währungsrechner\n");
                Console.WriteLine("1 DM -> Euro");
                Console.WriteLine("2 Euro -> DM");
                Console.WriteLine("9 Abbruch\n");
                Console.Write("Auswahl:");                
                string strAuswahl = Console.ReadLine();

                //Auswahl
                switch (strAuswahl)
                    {
                        case "1":
                                do
                                {

                                    Console.Write("DM: ");
                                    Console.ReadLine();
                                    double dDM = Console.ReadLine();
                                    double dEuro = dDM / dFaktor;
                                    Console.WiteLine("Euro: " + dEuro); break;

                                }while (dDM != 0);

                        case "2":
                                do
                                {
                                    Console.Write("Euro: ");
                                    Console.ReadLine();
                                    double dEuro = Console.ReadLine();
                                    double dDM = dEuro * dFaktor;
                                    Console.WriteLine("DM: " + dDM);

                                }while (dEuro != 0); break;

                        case "9": Console.WriteLine("Falsche Ausgabe"); break;
                    }
            }while (strAuswahl != "9");
        }





        }
    }
}

alles aus dem kopf, also keine garantie ...
hab grad keine IDE hier und kenn die methoden etc. nicht auswendig
 
Zuletzt bearbeitet:
es kommen zwei Sachen. Vorallem der Hinweis unten in der Fehlerliste ist komisch

http://www.pictureupload.de/originals/pictures/120209174851_Unbenannt.JPG


EDIT: wenn der Befehl "Console.ReadLine()" einen string zurückgibt dann müsste ich ja normalerweise hier auch noch konvertieren:


Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace übung
{
    class Program
    {
        static void Main(string[] args)
        {
            //Variablendefinition
            double dM = 0.0;
            double dEuro = 0.0;
            double dFaktor = 1.95583;
            string strAuswahl = 0;

            //Wiederholungsschleife
            do
            {

                //Startbildschirm/Menü
                Console.WriteLine("Währungsrechner\n");
                Console.WriteLine("1 DM -> Euro");
                Console.WriteLine("2 Euro -> DM");
                Console.WriteLine("9 Abbruch\n");
                Console.Write("Auswahl:");                
                string strAuswahl = Console.ReadLine();

                //Auswahl
                switch (strAuswahl)
                    {
                        case "1":
                                do
                                {

                                    Console.Write("DM: ");
                                    Console.ReadLine();
[B]                                    double dDM = Console.ReadLine();[/B]
                                    double dEuro = dDM / dFaktor;
                                    Console.WiteLine("Euro: " + dEuro); break;

                                }while (dDM != 0);

                        case "2":
                                do
                                {
                                    Console.Write("Euro: ");
                                    Console.ReadLine();
[B]                                    double dEuro = Console.ReadLine();[/B]
                                    double dDM = dEuro * dFaktor;
                                    Console.WriteLine("DM: " + dDM);

                                }while (dEuro != 0); break;

                        case "9": Console.WriteLine("Falsche Ausgabe"); break;
                    }
            }while (strAuswahl != "9");
        }





        }
    }
}
 
Zuletzt bearbeitet von einem Moderator: (übergroßes bild entfernt.)
ja im prinzip schon ...
verstehe nicht wieso da nicht auch eine fehlermeldung kommt?
ich installe grade visual studio 2008, dann kuck ich gleich mal
 
da ist ne } zu viel
 
du hast da echt ganz schön viele fehler gemacht.

1. Variablen nur einmal deklarieren. ( d.h. datentyp + variabelname = wert, beim nächstenmal wenn du einen wert zuweist brauchst du nurnoch variabelname = wert );
2. Ein } zuviel
3. ein Console.ReadLine(); zuviel
4. Datenttypen konvertiert man z.b. mit Convert.ToDouble(strVar1); <- explizite Konvertierung

Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace übung
{
    class Program
    {
        static void Main(string[] args)
        {
            //Variablendefinition
            double dDM = 0.0;
            double dEuro = 0.0;
            double dFaktor = 1.95583;
            string iAuswahl = "0";

            //Wiederholungsschleife
            do
            {

                //Startbildschirm/Menü
                Console.WriteLine("Währungsrechner\n");
                Console.WriteLine("1 DM -> Euro");
                Console.WriteLine("2 Euro -> DM");
                Console.WriteLine("9 Abbruch\n");
                Console.Write("Auswahl:");               
                iAuswahl = Console.ReadLine();

                //Auswahl
                switch (iAuswahl)
                    {
                        case "1":
                                do
                                {

                                    Console.Write("DM: ");
                                    Console.ReadLine();
                                    dDM = Convert.ToDouble(Console.ReadLine());
                                    dEuro = dDM / dFaktor;
                                    Console.WriteLine("Euro: " + dEuro); 
                                   

                                }while (dDM != 0);
                                break;

                        case "2":
                                do
                                {
                                    Console.Write("Euro: ");
                                    Console.ReadLine();
                                    dEuro = Convert.ToDouble(Console.ReadLine());
                                    dDM = dEuro * dFaktor;
                                    Console.WriteLine("DM: " + dDM);

                                }while (dEuro != 0); break;

                        case "9": Console.WriteLine("Falsche Ausgabe"); break;
                    }
            }while (iAuswahl != "9");
        }





        }
}

Der Code klappt, wollte dir das jetzt nicht vorwegnehmen, aber schau dir mal die unterschiede an ;)
 
Zuletzt bearbeitet:
Ist doch nicht so schwer, du hast ne Klammer "}" zu viel. Die ist auf dem Bild sogar im Editor rot unterstrichen. Beim nächsten mal bitte gleich Fehlermeldung posten "geht nicht" ist keine Problembeschreibung.
 
sorry aber die klammer ist sein geringstes problem ...
 
BloodHunter2k8 schrieb:
sorry aber die klammer ist sein geringstes problem ...
Nein, aber dann kriegt er ne vernünftige Fehlermeldung und damit soll er sich dann erstmal selbst rumschlagen. Zum Konvertieren würde ich lieber Double.TryParse nehmen...
 
naja wie schon erwähnt, klammer weg machen dann siehst du was alles falsch ist... der compiler meldet sich ja, und dann die geeigneten Typkonvertierungen durchführen
 
ich habe noch zwei Fragen. Muss man bei der Switch-case Funktion die Zahl in Anführungszeichen setzen oder nicht? Ich habe es eigentlich ohne diese Zeichen gelernt. Oder spielt soetwas keine Rolle?

Code:
dEuro = Convert.ToDouble(Console.ReadLine());
Code:
dDM = Convert.ToDouble(Console.ReadLine());

die Variablen sind doch schon als double Datentyp definiert.

Wieso muss man den Wert im Untermenü zweimal eingeben bis die Umrechnung erfolgt?

Die Befehle Console.Write und dem Console.ReadLine() bedeuten doch dass der Text ausgegeben wird und in der selben Zeile hinter dem Text der Wert eingegeben werden kann, damit die Umrechnung erfolgt....
 
  1. wenn du einen switch über string machst dann nicht. Strings werden immer mit " " geschrieben
  2. 2 malige eingabe, weil du schreibst ja auch 2 mal ReadLine();
  3. Bei Expliziten Typkonvertierungen meistens mit Exceptions behandeln, da diese da auftreten können

Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace übung
{
    class Program
    {
        static void Main(string[] args)
        {
            //Variablendefinition
            double dDM = 0.0;
            double dEuro = 0.0;
            double dFaktor = 1.95583;
            string iAuswahl = "0";

            //Wiederholungsschleife
            do
            {

                //Startbildschirm/Menü
                Console.WriteLine("Währungsrechner\n");
                Console.WriteLine("1 DM -> Euro");
                Console.WriteLine("2 Euro -> DM");
                Console.WriteLine("9 Abbruch\n");
                Console.Write("Auswahl:");               
                iAuswahl = Console.ReadLine();

                //Auswahl
                switch (iAuswahl)
                    {
                        case "1":
                                do
                                {
			try
                                   {
	                                    Console.Write("DM: ");
	                                    //Console.ReadLine();
	                                    dDM = Convert.ToDouble(Console.ReadLine());
	                                    dEuro = dDM / dFaktor;
	                                    Console.WriteLine("Euro: " + dEuro); 
			}
			catch(Exception ex)
                                    {
                                         // Fehlerbehandlung
                                    }

                                }while (dDM != 0);
                                break;

                        case "2":
                                do
                                {
			try
                                   {
	                                    Console.Write("Euro: ");
	                                   // Console.ReadLine();
	                                    dEuro = Convert.ToDouble(Console.ReadLine());
	                                    dDM = dEuro * dFaktor;
	                                    Console.WriteLine("DM: " + dDM);
			}
			catch(Exception ex)
                                   {
                                         //Fehlerbehandlung
                                   }
                                }while (dEuro != 0); break;

                        case "9": Console.WriteLine("Falsche Ausgabe"); break;
                    }
            }while (iAuswahl != "9");
        }
    }
}

hoffe das man mir die schlampige einrückung nachsieht ;)
 
Soo, ich habe mal wieder ein erneutes Problem, ich habe gerade wieder eine Übung gemacht, allerdings meckert Visual Studios rum.

"Eine impliziete konvertierung von bool nach string ist nicht möglich".
Ich benutze aber keinen bool Datentypen??


hab auch gleich noch ne Frage. Wenn ich den Datentyp konvertiere - z. B string nach double. Muss ich dann den neuen Datentyp double mit seinen beiden Variablen oben in der Variablendefinition neu festlegen, indem ich sie dazuschreibe? Oder holt sich das programm die Informationen von der Konvertierung auch ohne?


Hier mal mein Quellcode^^


Code:
using System;
using System.Collections.Generic;
using System.Text;
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Variablendefinition
            double dPi = 3.1415, Flaeche = 0.0, a = 0.0, b = 0.0;
            string WahlFigur = "", WahlWiederholen = "", sa = "", sb = "";

            //Wiederholungsschleife
            do
            {
                //Bildschirm löschen
                Console.Clear();

                //Menü
                Console.WriteLine("Flaeche zu welcher geometrischen Figur");
                Console.WriteLine("=================================================\n");
                Console.WriteLine("  Quadrat:  q");
                Console.WriteLine("  Rechteck:  r");
                Console.WriteLine("  Kreis:  k");
                Console.WriteLine("  Ellipse:  e\n");
                Console.Write("Deine WahlFigur? ");
                WahlFigur = Console.ReadLine();


                switch(WahlFigur)
                {
                    case "q":
                        Console.Write("\n\nSeitenlänge des Quadrats: ");
                        sa = Console.ReadLine();
                        //Konvertierung
                        a = Convert.ToDouble(sa);
                        //Berechnung
                        Flaeche = a * a;
                        Console.WriteLine("\n...... Flaeche = " + Flaeche);
                        Console.WriteLine("\nMöchten Sie weiterrechnen ? (j oder n)");
                        break;

                    case "r":
                        Console.Write("\n\nLaenge der 1. rechteckseite: ");
                        sa = Console.ReadLine();
                        //Konvertierung
                        a = Convert.ToDouble(sa);
                        Console.Write("\n\nLaenge der 2. Rechteckseite: ");
                        sb = Console.ReadLine();
                        b = Convert.ToDouble(sb);
                        //Berechnung
                        Flaeche = a * b;
                        Console.WriteLine("\n...... Flaeche = " + Flaeche);
                        Console.WriteLine("\nMöchten Sie weiterrechnen ? (j oder n)");
                        break;

                    case "k":
                        Console.Write("\n\nRadius des Kreises: ");
                        sa = Console.ReadLine();
                        //Konvertierung
                        a = Convert.ToDouble(sa);
                        //Berechnung
                        Flaeche = a * a * dPi;
                        Console.WriteLine("\n...... Flaeche = " + Flaeche);
                        Console.WriteLine("\nMöchten Sie weiterrechnen ? (j oder n)");
                        break;

                    case "e":
                        Console.Write("\n\nRadius der x-Achse: ");
                        sa = Console.ReadLine();
                        //Konvertierung
                        a = Convert.ToDouble(sa);
                        Console.WriteLine("\n\nRadius der y-Achse: ");
                        sb = Console.ReadLine();
                        b = Convert.ToDouble(sb);
                        //Berechnung
                        Flaeche = a * b * dPi;
                        Console.WriteLine("\n...... Flaeche: " + Flaeche);
                        Console.WriteLine("\nMöchten Sie weiterrechnen ? (j oder n)");
                        break;

                    default:
                        Console.WriteLine("falsche Auswahl");
                        break;

                }

                Console.Write(" Möchten Sie weiterrechnen ?");
                WahlWiederholen = Console.ReadLine();

            } while(WahlWiederholen = "j");




                


        }
    }
}
 
Zuletzt bearbeitet:
vergleicht man nicht auch in c# mit "==" ? das sollte dein Fehler beheben.

was meinst du mit deiner Frage?
 
Jup, entweder == oder .Equals()

Und ich bin mir nicht sicher aber du solltest deine Ausgabe zu einem
StringConvertieren ---> Console.WriteLine("Euro: " + dEuro);
 
heimtückisches C-Sharp :). Aber wieso muss man das dann nicht bei "!=" 2 "==" machen?
 
Öhm, weil das mehr Tipparbeit wäre? Ich glaube auf diese Frage gibt es keine wirklich sinnvolle Antwort. Haben die Erfinder eben so festgelegt.
 
>|Sh4d0w|< schrieb:
heimtückisches C-Sharp :). Aber wieso muss man das dann nicht bei "!=" 2 "==" machen?

Weil = eine Zuweisung ist und == ein Vergleich von zwei Variablen.

In deinem Fall willst du in WahlWiederholen den string "j" abspeichern.
While verlangt allerdings true oder false zwischen den runden Klammern, was bei einer Zuweisung so nicht möglich ist.
 
>|Sh4d0w|< schrieb:
heimtückisches C-Sharp :). Aber wieso muss man das dann nicht bei "!=" 2 "==" machen?

Weil du hier nicht prüfst ob der Wert gleich( == ) 2 ist sondern ob er nicht (!= ) 2 ist. ! Ist halt zum verneinen, bzw. der nicht Operator wie in eigentlich jeder Sprache die ich kenne :p
 
Zurück
Oben