kostenloser Webspace werbefrei: lima-city


Ich habe Probleme mit diesem Code

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    kovaandr

    kovaandr hat kostenlosen Webspace.

    Die Aufgabe lautet:
    Stückeln Sie den über Konsole eingegebenen Geldbetrag in möglichst wenig Euro Scheine und Münzen. Unterstützen Sie auch Fliesskommabeträge und alle Euro Scheine und Münzen inkl der Cent Münzen.

    Es zeigt mir im Visual Studio ca. 230 Fehler an. Ich hab gehört das geht auch mit Arrays, nur kenn ich mich damit nicht aus.

    int x1= 0,01;
    int x2= 0,02;
    int x3= 0,05;
    int x4= 0,10
    int x5= 0,20;
    int x5= 0,50;
    int x6= 1;
    int x7= 2;
    int x8= 5;
    int x9= 10;
    int x10= 20;
    int x11= 50;
    int x12= 100;
    int x13= 200;
    int x14= 500;
    int i = 0;
    
    
    Console.WriteLine("Geben Sie eine beliebige Zahl ein: ");
    double eincon = Convert.ToDouble(Console.ReadLine());
    
    if (eincon > 500){
    
    
    do{
    
    i=++
    x1=i;
    Console.WriteLine (x1);
    }while(eincon > 500);
    
    
    
    else if ((eincon < 500) && (eincon > 200)){
    
    do{
    
    i=++;
    x2=i;
        Console.WriteLine (x2);
    }
    while(eincon > 200);
    
    
    
    else if((eincon > 100) && (eincon > 200));{
    
    do{
    
    i=++;
    x3=i;
        Console.WriteLine (x3);
    }
    while(eincon > 100);
    
    
    
    else if((eincon > 50) && (eincon > 100));{
    
    do{
    
    i=++;
    x4=i;
        Console.WriteLine (x4);
    }
    while(eincon > 50);
    
    
    
    else if((eincon > 20) && (eincon > 50));{
    
    do{
    
    i=++;
    x5=i;
        Console.WriteLine (x5);
    }
    while(eincon > 20);
    
    
    
    else if((eincon > 10) && (eincon > 20));{
    
    do{
    
    i=++;
    x6=i;
        Console.WriteLine (x6);
    }
    while(eincon > 10);
    
    
    
    else if((eincon > 5) && (eincon > 10));{
    
    do{
    
    i=++;
    x7=i;
        Console.WriteLine (x7);
    }
    while(eincon > 5);
    
    
    
    else if((eincon > 2) && (eincon > 5));{
    
    do{
    
    i=++;
    x8=i;
        Console.WriteLine (x8);
    }
    while(eincon > 2);
    
    
    
    else if((eincon > 1) && (eincon > 2));{
    
    do{
    
    i=++;
    x9=i;
        Console.WriteLine (x9);
    }
    while(eincon > 1);
    
    
    
    else if((eincon > 0,50) && (eincon > 1));{
    
    do{
    
    i=++;
    x10=i;
        Console.WriteLine (x10);
    }
    while(eincon > 0,25);
    }
    
    
    else if((eincon > 0,20) && (eincon > 0,50));{
    
    do{
    
    i=++;
    x11=i;
        Console.WriteLine (x11);
    }
    while(eincon > 0,20);
    }
    
    
    else if((eincon > 0,10) && (eincon > 0,05));{
    
    do{
    
    i=++;
    x12=i;
        Console.WriteLine (x12);
    }
    while(eincon > 0,10);
    }
    
    
    else if((eincon > 0,05) && (eincon > 0,10));{
    
    do{
    
    i=++;
    x13=i;
        Console.WriteLine (x13);
    }
    while(eincon > 0,05);
    }
    
    
    else if((eincon > 0,02) && (eincon > 0,05));{
    
    do{
    
    i=++;
    x14=i;
        Console.WriteLine (x14);
    }
    while(eincon > 0,02);
    }
    
    
    else if((eincon > 0,01) && (eincon > 0,02));{
    
    do{
    
    i=++;
    x15=i;
        Console.WriteLine (x15);
    }while (eincon > 0,01); 
    
    
                
            }


    Beitrag zuletzt geändert: 12.12.2014 10:21:54 von burgi
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Das Teil strotzt nur so vor Fehler, wenn ich das überfliege...

    -> es fehlen Semikolons(;) 2 Fehler
    -> die ersten 6 Zeilen enthalten schon 12 Fehler:


    int x1= 0,01;
    int x2= 0,02;
    int x3= 0,05;
    int x4= 0,10
    int x5= 0,20;
    int x5= 0,50;

    erstmal, gebrochene Zahlen passen in keinen Ganzzahlendatentyp(int), versuchs mal mit float oder double
    dann hast du das falsche Trennzeichen, es muss ein . sein und kein komma

    dann hast du einen fetten logischen fehler... deine variablen x1...x14 sind aufsteigend angeordnet, geprüft wird absteigend... das Ergebnis kann niemals stimmen

    deine if und else if machen jeweils eine neue klammer auf, aber schließen die alte nicht... 15 Fehler
    außerdem sind die bedingungen, die du abfragst unlogisch... eine zahl größer als 5 ist auch automatisch größer als 2... dann hängst du dahinter immer ein Semikolon, das sind nochmal insgesamt 14 Fehler...

    i=++

    das sind nochmal 15 fehler, ein inkrement schaut anders aus
    i++;

    zumal du hier einen weiteren logischen Fehler hast, da er dir die gesamtzahl der Währungseinheiten zählst und nciht der einzelnen Währungseinheiten, weil dein i hochinkrementiert wird bis ultimo...

    ich hoffe, das war nciht die gesamte Datei, da fählt nämlich der programmeinsprung, von wo er versucht, das Chaos zu verursachen... ich bräuchte für das teil etwa 30 Zeilen. Darf man fragen, welche Schulart du da besuchst, wo ihr diese Aufgabe löst?



  4. Autor dieses Themas

    kovaandr

    kovaandr hat kostenlosen Webspace.

    Danke für die Antwort! Ich besuche eine Fachhochschule, konnte aber bei vielen Unterrichtseinheiten nicht dabei sein.
  5. wenn du hilfe brauchst, ich habs mal schnell nachgebaut, aber sehr ausführlich... würde ich es machen, würde der Code ganz anders aussehen und viel kürzer, aber der Code sollte für dich reichen es nachzuvollziehen:

    class Program	{
    	static void Main(string[] args)		{
    		const int size = 15;
    		double[,] geldmittel = new double[size,2] { { 500, 0 }, { 200, 0 }, { 100, 0 }, { 50, 0 }, { 20, 0 }, { 10, 0 }, {5, 0 }, {2,0 }, {1,0 }, {0.5,0 }, {0.2,0 }, {0.1,0 }, {0.05,0 }, {0.02,0 }, {0.01, 0} };
    
    		Console.WriteLine("Geben Sie eine beliebige Zahl ein:");
    		double eincon = Convert.ToDouble(Console.ReadLine());
    		for (int i = 0; i < size; i++)
    		{ 
    			geldmittel[i, 1] = testMoney(eincon, geldmittel[i, 0]);
    			eincon -= geldmittel[i, 0] * geldmittel[i, 1];
    			if (eincon == 0) break;
    		}
    
    		//Ausgabe
    		for (int i = 0; i < size; i++)
    			Console.WriteLine("Einheit " + geldmittel[i, 0] + "; Anzahl " + geldmittel[i, 1]);
    
    		//Pause
    		Console.ReadLine();
    	}
    
    	static double testMoney(double money, double step)		{
    		int i=0;
    		while (money >= step)	{
    			money -= step;
    			i++;
    		}
    		return i;
    	}
    }



    Beitrag zuletzt geändert: 12.12.2014 9:51:19 von sebulon
  6. Hallo,

    habe den Code von sebulon getestet, hierbei habe ich ein Problem mit dem Input "0,15" festgestellt.
    Der "Bankautomat" wollte mir 1x 10cent und 2x 2cent geben.
    Problem ist die Genauigkeit von double.

    Lösung: alle Variablen auf float umstellen, Arraywerte mit Suffix "f" versehen und bei der Convert ToSingle nutzen.

    Problem gelöst ;-)


    Bei meinem Lösungsansatz wird bei 0,75 auch wieder ein ähnliches Problem angezeigt (1x 50 cent, 1x 20 cent, 2x 2 cent).

    Neuer Lösungsansatz: Decimal, Suffix "m", Convert.ToDecimal.
    Bisher keine Probleme festgestellt.
    Schreibe gleich noch ein auto.Test.

    testing-code:
    decimal input = 0.01m;
                decimal value = 0.01m;
    
                while (value < 1000m)
                {
                    decimal[,] notes = new decimal[size, 2] { { 500.00m, 0 }, { 200.00m, 0 }, { 100.00m, 0 }, { 50.00m, 0 }, { 20.00m, 0 }, { 10.00m, 0 }, { 5.00m, 0 }, { 2.00m, 0 }, { 1.00m, 0 }, { 0.50m, 0 }, { 0.20m, 0 }, { 0.10m, 0 }, { 0.05m, 0 }, { 0.02m, 0 }, { 0.01m, 0 } };
    
                    input = value;
    
                    for (int i = 0; i < size; i++)
                    {
                        notes[i, 1] = testMoney(input, notes[i, 0]);
                        input -= notes[i, 0] * notes[i, 1];
    
                        if (input == 0)
                        {
                            break;
                        }
                    }
    
                    decimal output = 0;
    
                    for (int i = 0; i < size; i++)
                    {
                        output += notes[i, 0] * notes[i, 1];
                    }
    
                    if (value != output)
                    {
                        Console.WriteLine(value + "/t" + output);
                    }
    
                    value += 0.01m;
                }


    Testing bestätigt meine Vermutung: Decimal ist der richtige Weg.
    (Manchmal sieht man den Wald vor lauter Datentypen nicht).

    MfG Trancer

    Beitrag zuletzt geändert: 16.12.2014 10:40:21 von trancedrome
  7. claushoffmann

    claushoffmann hat kostenlosen Webspace.

    Hallo kovaandr,

    da ich nicht in C programmiere stelle ich mal ein Gerüst vor,
    wie ich es mal in javascript angegangen bin und hierfür angepasst habe.
    Rundungsfehler sind so ausgeschlossen !
    Kurz und knapp :-)
    var betrag = Math.round(prompt("Betrag eingeben (Punkt statt Komma!)", "0.00")*100);
    var wert = [50000,20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1];
    var ausgabe = (betrag/100) + " ergeben\n";
    for(i=0;i<wert.length;i++){
      var anzahl = 0;
      while (betrag >= wert[i]){
        anzahl += 1;
        betrag -= wert[i];
      }
      if (anzahl>0){  // Nur benutzte Werte ausgeben
        ausgabe += anzahl + " * " + wert[i]/100 + "\n";
      }
    }
    alert(ausgabe);


    Ich hoffe es ist hilfreich. Quick and dirty.
    Hier zum Testen : http://claushoffmann.lima-city.de/stueckeln.htm
    Gruß Claus


    Beitrag zuletzt geändert: 25.12.2014 20:30:11 von claushoffmann
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!