webForumDet fria alternativet

Växel till en kassa - ännu ett enkelt problem

C/C++

16 svar · 2 953 visningar · startad av enrosabanan

Medlem sedan maj 200736 inlägg
Frågan#1

Nu behöver jag lite hjälp här igen av någon vänlig själ.

Jag har gjort ett program som registrerar köp av en kund, problemet handlar om växeln. Nu visas växeln bara i hur mycket som ska ges tillbaka till kunden men programmet ska skriva ut hur många 500, 100, 50, 20, 10, 5 och 1 lappar/kronor som kunden ska ha tillbaka med. Jag har inte en aning om hur jag ska göra detta, ni behöver ju inte skriva ner exakt hur koden ska se ut utan till en början räcker det med att ni ger mig lite råd och hjälp.

Tack!

Medlem sedan dec. 2004736 inlägg
#2

Säg att växeln anges av v, så är det enklaste att:
Är v >= [högsta växelbelopp] ?
I så fall, ger v / [högsta växelbelopp] det antalet sedlar av den typen kunden skall ha. Dra sedan bort [högsta växelbelopp] * antal från v.
Sen fortsätter du tills v == 0. Lämpligtvis i en loop, och alla belopp i en fin array.
Det är min idé, vet inte om den är bäst, men jag hade gjort så!

Edit: Tänkte inte alls på vad jag skrev när jag förklarade verkar det som..

Medlem sedan juni 20014 421 inlägg
#3

Ahh, typisk skoluppgift. Fick precis likadan fast i Java när jag pluggade. Du bör ha ganska bra exempel på tänket bakom i din kursbok. Om inte så borde era kursledare kunna vara väldigt behjälplig.

Medlem sedan dec. 20051 420 inlägg
#4

Jag hade samma uppgift i en C++kurs för ett par år sen.
Jag gillar inte att ge färdiga svar.. så jag klistrar bara in en bit av koden så du ser idén..

    int kostar;
    int betalade;

    cout << "Kostar: ";
    cin >> kostar;
    cout << "Betalade: ";
    cin >> betalade;
    
    int tillbaka = betalade - kostar; //beräkna summa som ska tillbaka

    int hundra = tillbaka / 100; //antal hundralappar
    tillbaka = tillbaka % 100; //rest
    int femtio = tillbaka / 50;
    tillbaka = tillbaka % 50;

%-tecknet kallas modulus och "drar ifrån" så många hela tal som går från det första talet. 500 % 100 ger resten 0 tex. 501 % 100 ger resten 1. 499 % 100 ger resten 99.

Medlem sedan maj 200736 inlägg
#5

Är det samma tänk i C# som C++?
Det är alltså i C# jag ska göra det.

Medlem sedan dec. 20051 420 inlägg
#6

enrosabanan skrev:

Är det samma tänk i C# som C++?
Det är alltså i C# jag ska göra det.

Det här är grundmatte, det är samma tänk i alla språk.

Medlem sedan juni 20006 031 inlägg
#7

enrosabanan skrev:

Är det samma tänk i C# som C++?
Det är alltså i C# jag ska göra det.

C# använder också % tecknet som modulus.
Så HiDensity's exempel går nästan att använda rakt av till C#

Exempel i C#

int betalade, pris, tillbaka, resultat;

betalade = 1000;
pris = 511;
tillbaka = betalade - pris;

resultat = tillbaka / 500;
Console.WriteLine("Antal 500 lappar: {0}", resultat);
tillbaka = tillbaka % 500;

resultat = tillbaka / 100;
Console.WriteLine("Antal 100 lappar: {0}", resultat);
tillbaka = tillbaka % 100;

resultat = tillbaka / 50;
Console.WriteLine("Antal 50 lappar: {0}", resultat);
tillbaka = tillbaka % 50;

// osv.....
Medlem sedan maj 200736 inlägg
#8

Annars kanske detta går att använda? Vet inte riktigt hur, hehe, jag är inte så duktig på sånt här. Hittade i alla fall detta i några lektionsanteckningar:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Array
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private const int antal = 15;
    private int\[\] talLista = new int\[antal + 1\];

    private int i = 0;

   

    private void btnAddValue_Click(object sender, EventArgs e)
    {
        talLista *\= Convert.ToInt32(txtValue.Text);
        i++; 
        txtValue.Text = "";
        listBox1.Items.Clear();
        for (int j = 0; j \< antal; j++)
        {
            listBox1.Items.Add("talista\[" + j + "\]= " + talLista\[j\].ToString()); 
        }
        
        txtValue.Focus();
    }

}*

Medlem sedan juni 20006 031 inlägg
#9

Exemplet där är hur du skapar en array som du fyller med summor från en textbox och sen visar i en listbox, så det har du inte någon större nytta av i din kassaberäkning.

Medlem sedan maj 200736 inlägg
#10

Jag vet inte riktigt vad jag gör för fel med mitt program men det funkar inte nu i alla fall att få fram hur många lappar/kronor man ska få tillbaka. Lägger in hela koden inom klickeventet så du/ni kan bilda er en uppfattning om hur programmet ser ut. (bry er inte om mina kommentarer i koden, säkert jättekonstiga kommentarer men jag är inget proffs)

private void btnBerakna_Click(object sender, EventArgs e)
{
double summamoms, betala, moms, summavaxel, mottaget, tal1, tal3, tal2 = (0.01); //deklarerar double för uträkning av moms
try //testar kod inom try för felsökning
{
moms = Convert.ToDouble(txtBoxMoms.Text); //konverterar till double och döper om till moms
betala = Convert.ToDouble(txtBoxBetala.Text); //konverterar till double och döper om till betala
tal1 = moms * (tal2);
tal3 = tal1 + 1;
summamoms = (tal3) * betala; //gångar ihop moms och betala och ger summan namnet summa
lblMoms.Text = Convert.ToString(summamoms); //skriver ut summan och konverterar till string

            mottaget = Convert.ToDouble(txtBoxMottaget.Text); //konverterar till double och döper om till mottaget
            summavaxel = mottaget - summamoms; //tar mottaget och subtraherar det med summamoms
            lblVaxel.Text = Convert.ToString(summavaxel); //skriver ut hur mycket växel kunden ska få tillbaka och konverterar int till string

            double resultat;

            resultat = Convert.ToDouble(lblTillbaka.Text);

            resultat = summavaxel / 500;
            Console.WriteLine("Antal 500 lappar: {0}", resultat);
            summavaxel = summavaxel % 500;

            resultat = summavaxel / 100;
            Console.WriteLine("Antal 100 lappar: {0}", resultat);
            summavaxel = summavaxel % 100;

            resultat = summavaxel / 50;
            Console.WriteLine("Antal 50 lappar: {0}", resultat);
            summavaxel = summavaxel % 50;

            resultat = summavaxel / 20;
            Console.WriteLine("Antal 20 lappar: {0}", resultat);
            summavaxel = summavaxel % 20;

            resultat = summavaxel / 10;
            Console.WriteLine("Antal 10 kronor: {0}", resultat);
            summavaxel = summavaxel % 10;

            resultat = summavaxel / 5;
            Console.WriteLine("Antal 5 kronor: {0}", resultat);
            summavaxel = summavaxel % 5;

            resultat = summavaxel / 1;
            Console.WriteLine("Antal 1 kronor: {0}", resultat);
            summavaxel = summavaxel % 1;

        }

        catch //om fel inträffar sker det som står inom catch
        {
            lblVaxel.Text = "Alla uppgifter måste fyllas i"; //text inom "" skrivs ut i lblVaxel.Text
            lblMoms.Text = "Alla uppgifter måste fyllas i"; //text inom "" skrivs ut i lblMoms.Text
        }
    }
Medlem sedan juni 20006 031 inlägg
#11

Mitt exempel var för en Konsoll application så du kan inte använda Console.WriteLine(......)
Jag antar att du har en richtextbox eller något sånt du ska skriva ut resultatet i så du får ändra dom raderna till något som passar din applikation.

Medlem sedan maj 200736 inlägg
#12

Kan man använda en label och lägga det i? Hur skriver man då? Det funkar inte för mig nu när jag testar...

Medlem sedan juni 20006 031 inlägg
#13

Exempel med label där du ska visa hur många 500 lappar:

lbl500Lappar.Text = String.Format("Antal 500 lappar: {0}", resultat);
Medlem sedan maj 200736 inlägg
#14

Finns det något gratisprogram till C#? Jag har lämnat in den datorn nu och har inte programmet. Så jag kan inte göra klart uppgiften. Ja, att det är ett skolarbete har väl alla redan förstått.

Medlem sedan dec. 2004736 inlägg
#15

http://www.microsoft.com/express/ kan du hitta, något begränsade, gratisversioner av Visual Studio.

Medlem sedan maj 200736 inlägg
#16

Så här ser det ut nu, men jag får exempelvis 1,35 500-lappar. Är det på grund av att jag använder double? Hur ska jag göra för att det ska fungera? Om jag bara byter till int fungerar det inte eftersom jag har haft double innan och var tvungen att ha double innan.

private void btnBerakna_Click(object sender, EventArgs e)
{
double summamoms, betala, moms, summavaxel, mottaget, tal1, tal3, tal2 = (0.01); //deklarerar double för uträkning av moms
try //testar kod inom try för felsökning
{
moms = Convert.ToDouble(txtBoxMoms.Text); //konverterar till double och döper om till moms
betala = Convert.ToDouble(txtBoxBetala.Text); //konverterar till double och döper om till betala
tal1 = moms * (tal2);
tal3 = tal1 + 1;
summamoms = (tal3) * betala; //gångar ihop moms och betala och ger summan namnet summa
lblMoms.Text = Convert.ToString(summamoms); //skriver ut summan och konverterar till string

            mottaget = Convert.ToDouble(txtBoxMottaget.Text); //konverterar till double och döper om till mottaget
            summavaxel = mottaget - summamoms; //tar mottaget och subtraherar det med summamoms
            lblVaxel.Text = Convert.ToString(summavaxel); //skriver ut hur mycket växel kunden ska få tillbaka och konverterar int till string

            double resultat;

            resultat = summavaxel / 500;
            lbl500lappar.Text = String.Format("Antal 500 lappar: {0}", resultat);
            summavaxel = summavaxel % 500;

            resultat = summavaxel / 100;
            lbl100lappar.Text = String.Format("Antal 100 lappar: {0}", resultat);
            summavaxel = summavaxel % 100;

            resultat = summavaxel / 50;
            lbl50lappar.Text = String.Format("Antal 50 lappar: {0}", resultat);
            summavaxel = summavaxel % 50;

            resultat = summavaxel / 20;
            lbl20lappar.Text = String.Format("Antal 20 lappar: {0}", resultat);
            summavaxel = summavaxel % 20;

            resultat = summavaxel / 10;
            lbl10kronor.Text = String.Format("Antal 10 kronor: {0}", resultat);
            summavaxel = summavaxel % 10;

            resultat = summavaxel / 5;
            lbl5kronor.Text = String.Format("Antal 5 kronor: {0}", resultat);
            summavaxel = summavaxel % 5;

            resultat = summavaxel / 1;
            lbl1kronor.Text = String.Format("Antal 1 kronor: {0}", resultat);
            summavaxel = summavaxel % 1;
             

        }

        catch //om fel inträffar sker det som står inom catch
        {
            lblVaxel.Text = "Alla uppgifter måste fyllas i"; //text inom "" skrivs ut i lblVaxel.Text
            lblMoms.Text = "Alla uppgifter måste fyllas i"; //text inom "" skrivs ut i lblMoms.Text
        }
    }
Medlem sedan juni 20006 031 inlägg
#17

Ta en titt på klassen Math.
Där finns metoder för att göra beräkningar/förändra tal.
T.ex så finns metoden Floor som jag använder i exemplet nedan.

Slängde även bort alla dina labels och använder en RichTextBox (rtbResultat) för att visa resultatet i.

private void btnBerakna_Click(object sender, EventArgs e)
{
    rtbResultat.Clear();

    double summamoms, betala, moms, summavaxel, mottaget, tal1, tal3, tal2 = (0.01); //deklarerar double för uträkning av moms
    try //testar kod inom try för felsökning
    {
        moms = Convert.ToDouble(txtBoxMoms.Text); //konverterar till double och döper om till moms
        betala = Convert.ToDouble(txtBoxBetala.Text); //konverterar till double och döper om till betala
        tal1 = moms * (tal2);
        tal3 = tal1 + 1;
        summamoms = (tal3) * betala; //gångar ihop moms och betala och ger summan namnet summa

        SkrivResultat("Summa moms: "+Convert.ToString(summamoms)); //skriver ut summan och konverterar till string
        
        mottaget = Convert.ToDouble(txtBoxMottaget.Text); //konverterar till double och döper om till mottaget
        summavaxel = mottaget - summamoms; //tar mottaget och subtraherar det med summamoms
        SkrivResultat("Växel: "+Convert.ToString(summavaxel)); //skriver ut hur mycket växel kunden ska få tillbaka och konverterar int till string

        double resultat;

        resultat = Math.Floor(summavaxel / 500);
        SkrivResultat(String.Format("Antal 500 lappar: {0}", resultat));
        summavaxel = summavaxel % 500;

        resultat = Math.Floor(summavaxel / 100);
        SkrivResultat(String.Format("Antal 100 lappar: {0}", resultat));
        summavaxel = summavaxel % 100;

        resultat = Math.Floor(summavaxel / 50);
        SkrivResultat(String.Format("Antal 50 lappar: {0}", resultat));
        summavaxel = summavaxel % 50;

        resultat = Math.Floor(summavaxel / 20);
        SkrivResultat(String.Format("Antal 20 lappar: {0}", resultat));
        summavaxel = summavaxel % 20;

        resultat = Math.Floor(summavaxel / 10);
        SkrivResultat(String.Format("Antal 10 kronor: {0}", resultat));
        summavaxel = summavaxel % 10;

        resultat = Math.Floor(summavaxel / 5);
        SkrivResultat(String.Format("Antal 5 kronor: {0}", resultat));
        summavaxel = summavaxel % 5;

        resultat = Math.Floor(summavaxel / 1);
        SkrivResultat(String.Format("Antal 1 kronor: {0}", resultat));
        summavaxel = summavaxel % 1;

    }

    catch (Exception ex)//om fel inträffar sker det som står inom catch
    {
        rtbResultat.AppendText(ex.Message);
    }
}

private void SkrivResultat(string p)
{
    rtbResultat.AppendText(p + "\n");
}
277 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
134 ms — ändringar (db)