jak zrobić trochę inny kalkulator

0

Mam problem z kalkulatorem tj.poniżej.
Po wybraniu żądanej operacji (np. dodawania), dane powinny być wprowadzane następująco: 2,3,4 . Kolejne liczby oddzielane są przecinkami, a operacją na nich wykonywaną w tym przypadku będzie dodawanie (2+3+4). Wynik ma się wyświetlać po zaakceptowaniu wprowadzonych liczb klawiszem enter.
Zwykły kalkulatro umiem zrobić.
Kto podpowie?

0

Stawiam, że dane wprowadzasz za pomocą stringa? W takim wypadku, po wprowadzeniu liczb musisz użyć funkcji Split() i oddzielić liczby po przecinku. Później tylko wykonujesz konkretną operację arytmetyczną na danym ciągu.
Innym sposobem jest bezpośrednie wprowadzanie liczb i wykonywanie (w tym przypadku) sumy na bieżąco. Szybszy sposób i mniej skomplikowany.

0

Ja dopiero zaczynam przygodę z c#.Możecie mi podpowiedzieć gdzie wstawić funkcję split.kod poniżej.Ale mi chodzi też o to że gdy na formie stworzyłem sobie przyciski to po wybraniu z menu kalkulatora np.dodawania zaczynam dopiero wpisywać liczy po przecinku, a potem naciskam = i jest wynik.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Kalkulator

{
public partial class frmKalkulator : Form
{
const int PLUS = 1;
const int MINUS = 2;
const int RAZY = 3;
const int PODZIELIC = 4;

    double a = 0;
    double b = 0;
    int dzialanie = 0;
    int kropka = 0;
    int ilepoprzecinku = 0;
    int znak = PLUS;
    bool czykasowacekran = false;
    

    public void pokazznaki()
    {
        cmdSuma.Enabled = true;
        cmdRoznica.Enabled = true;
        cmdIloczyn.Enabled = true;
        cmdIloraz.Enabled = true;
        if (dzialanie != 0) cmdWynik.Enabled = true;
        cmdZnak.Enabled = true;
        cmdAnuluj.Enabled = true;
        cmdKropka.Enabled = true;

    }

    public void ukryjznaki()
    {
        cmdSuma.Enabled = false;
        cmdRoznica.Enabled = false;
        cmdIloczyn.Enabled = false;
        cmdIloraz.Enabled = false;
        cmdWynik.Enabled = false;
        cmdAnuluj.Enabled = false;


    }

    public void cyfry(int i)
    {
        pokazznaki();
        if (dzialanie != 0)
        {
        

        }
        else
        {
        }

        if (czykasowacekran)
        {
            txtWynik.Text = "";
            czykasowacekran = true;
            znak = PLUS;
        }
        txtWynik.Text += i.ToString();
    }

    public double dzialaj(int dz, double x, double y)
    {
        pokazznaki();
        double wynik = 0;
        if (dzialanie != 0)
        {
            switch (dzialanie)
            {
                case PLUS: wynik = y + x; break;
                case MINUS: wynik = y - x; break;
                case RAZY: wynik = y * x; break;
                case PODZIELIC: wynik = y / x; break;
            }
            
            txtWynik.Text = wynik.ToString();
            a = 0;
        }
        else wynik = y;
        dzialanie = dz;
        czykasowacekran = true;
        cmdKropka.Enabled = true;
        ilepoprzecinku = 0;
        return wynik;
    }



    public frmKalkulator()
    {
        InitializeComponent();
    }

    private void cmd1_Click(object sender, EventArgs e)
    {
        cyfry(1);
    }

    private void cmd2_Click(object sender, EventArgs e)
    {
        cyfry(2);
    }

    private void cmd3_Click(object sender, EventArgs e)
    {
        cyfry(3);
    }

    private void cmd4_Click(object sender, EventArgs e)
    {
        cyfry(4);
    }

    private void cmd5_Click(object sender, EventArgs e)
    {
        cyfry(5);
    }

    private void cmd6_Click(object sender, EventArgs e)
    {
        cyfry(6);
    }

    private void cmd7_Click(object sender, EventArgs e)
    {
        cyfry(7);
    }

    private void cmd8_Click(object sender, EventArgs e)
    {
        cyfry(8);
    }

    private void cmd9_Click(object sender, EventArgs e)
    {
        cyfry(9);
    }

    private void cmd0_Click(object sender, EventArgs e)
    {
        cyfry(0);
    }

    private void cmdKropka_Click(object sender, EventArgs e)
    {

        b = dzialaj(PLUS, a, b);
        b = dzialaj(MINUS, a, b);
        b = dzialaj(RAZY, a, b);
        b = dzialaj(PODZIELIC, a, b);
  
        
        }

    private void cmdSuma_Click(object sender, EventArgs e)
    {
      
    }

    private void cmdRoznica_Click(object sender, EventArgs e)
    {
        
    }

    private void cmdIloczyn_Click(object sender, EventArgs e)
    {
       
    }

    private void cmdIloraz_Click(object sender, EventArgs e)
    {
      
    }

    private void cmdZnak_Click(object sender, EventArgs e)
    {
        if (znak == PLUS) znak = MINUS;
        else znak = PLUS;

        if (dzialanie != 0) { a = -a; txtWynik.Text = a.ToString(); }
        else { b = -b; txtWynik.Text = b.ToString(); }
    }

    private void cmdWynik_Click(object sender, EventArgs e)
    {
        b = dzialaj(dzialanie, a, b);
        txtWynik.Text = b.ToString();
        cmdKropka.Enabled = true;
        dzialanie = PLUS;
        a = 0;
        pokazznaki();
        cmdWynik.Enabled = false;
        cmdZnak.Enabled = false;
    }

    private void cmdAnuluj_Click(object sender, EventArgs e)
    {
        a = b = 0;
        dzialanie = 0;
        kropka = 0;
        ilepoprzecinku = 0;
        txtWynik.Text = "";
        znak = PLUS;
        czykasowacekran = false;
        ukryjznaki();
    }



    private void txtWynik_TextChanged(object sender, EventArgs e)
    {

    }

    private void frmKalkulator_Load(object sender, EventArgs e)
    {

    }

    private void dodawanieToolStripMenuItem_Click(object sender, EventArgs e)
    {


        b = dzialaj(PLUS, a, b);
        
    }

private void frmKalkulator_KeyPress(object sender, KeyPressEventArgs e)
{
switch (e.KeyChar)
{
case 'a': if (cmdSuma.Enabled) cmdSuma_Click(sender, e); return;
case 'b': if (cmdRoznica.Enabled) cmdRoznica_Click(sender, e); return;
case 'c': if (cmdIloczyn.Enabled) cmdIloczyn_Click(sender, e); return;
case 'd': if (cmdIloraz.Enabled) cmdIloraz_Click(sender, e); return;

            case (char)13: if (cmdWynik.Enabled) cmdWynik_Click(sender, e); return; // enter
            case (char)27: cmdAnuluj_Click(sender, e); return; // escape
            case '.':
            case ',': if (cmdKropka.Enabled) cmdKropka_Click(sender, e); return;
        }
        int n = (int)e.KeyChar;
        if (n < 48 || n > 57) return; // jak nie nacisnelismy cyfry to wychodzimy z funkcji
        n = int.Parse(e.KeyChar.ToString());
        cyfry(n);
        return;
    }

private void wyjścieToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}

   private void textBox1_KeyDown(object sender, KeyEventArgs e)

{

   }

   private void odejmowanieToolStripMenuItem_Click(object sender, EventArgs e)
   {
       b = dzialaj(MINUS, a,b);
   }

   private void dzielenieToolStripMenuItem_Click(object sender, EventArgs e)
   {
       b = dzialaj(PODZIELIC, a, b);
   }

   private void mnożenieToolStripMenuItem_Click(object sender, EventArgs e)
   {
       b = dzialaj(RAZY, a, b);
   }

   private void wyjścieToolStripMenuItem1_Click(object sender, EventArgs e)
   {

   }



    }


  
}
0

Moze mi ktoś podpowiedzieć jak wyjść z programu za pomocą przycisku klawiatury q.
Napisałam tak:
switch (e.KeyChar)
{
case 'a': if (dodawanieToolStripMenuItem.Enabled) dodawanieToolStripMenuItem_Click(sender, e); return;
case 'b': if (odejmowanieToolStripMenuItem.Enabled) odejmowanieToolStripMenuItem_Click(sender, e); return;
case 'c': if (mnożenieToolStripMenuItem.Enabled) mnożenieToolStripMenuItem_Click(sender, e); return;
case 'q': Application.exit();
}
ale nie działa

2

Powiem Ci, że nie wiem gdzie masz to wstawić bo nic nie widzę w tym kodzie...
Wyrzuć puste metody, sformatuj kod, wrzuć w tagach - wtedy pogadamy. Póki co nie ma sensu czytać tego bałaganu.

3

Według mnie niepotrzebnie mieszasz... Chcesz zrobić sumowanie wielu liczb na raz, to zrób to w konsoli, a w momencie kiedy zobaczysz i zrozumiesz jak to działa przenieś to do swojego bardziej skomplikowanego projektu. Poniżej masz przykład:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main( string[] args )
        {
            // Na przykład: wejscie == "1,7,3,-5"
            string wejscie = Console.ReadLine();

            string[] liczbyString = wejscie.Split(',');

            int[] liczbyInt = new int[liczbyString.Length];
            for(int i = 0; i < liczbyString.Length; i++)
                liczbyInt[i] = int.Parse(liczbyString[i]);

            int wynik = 0;
            foreach(int liczba in liczbyInt)
                wynik += liczba;

            Console.WriteLine("Suma liczby wynosi {0}.", wynik);
            Console.ReadLine();
        }
    }
}
0

Treść zadania w ogóle sugeruje, że tu chodzi o program konsolowy, a nie okienkowy.

0

zadanie ma być wykonane w windows forms,mam zrobione przyciski i textbox do wyswietlania wyniku,zaraz trochę pozmieniam kod i wyślę,dzieki za odpowiedzi.

0

ponizej poprawiony kod.
A jak zrobić wyjście z programu za pomocą jeszcze kawiatury np wciskam q z klawiatury i wychodzę,w programie moim mam jeszcze wyjscie za pomocą menu tam gdzie pisze wyjście.

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

namespace Kalkulator
{
    public partial class frmKalkulator : Form
    {
        const int PLUS = 1;
        const int MINUS = 2;
        const int RAZY = 3;
        const int PODZIELIC = 4;

        double a = 0;
        double b = 0;
        int dzialanie = 0;
        bool kropka = false;
        int ilepoprzecinku = 0;
        int znak = PLUS;
        bool czykasowacekran = false;

        public void pokazznaki()
        {
            dodawanieToolStripMenuItem.Enabled = true;
            odejmowanieToolStripMenuItem.Enabled = true;
            mnożenieToolStripMenuItem.Enabled = true;
            dzielenieToolStripMenuItem.Enabled = true;
            if (dzialanie != 0) obliczWyrażenieToolStripMenuItem.Enabled = true;
            cmdZnak.Enabled = true;
        }

        public void ukryjznaki()
        {
            dodawanieToolStripMenuItem.Enabled = false;
            odejmowanieToolStripMenuItem.Enabled = false;
            mnożenieToolStripMenuItem.Enabled = false;
            dzielenieToolStripMenuItem.Enabled = false;
            obliczWyrażenieToolStripMenuItem.Enabled = false;
            cmdZnak.Enabled = false;
        }

        public void cyfry(int i)
        {
            pokazznaki();
            if (dzialanie != 0)
            {
                if (!kropka) a = 10 * a + i;
                else
                {
                    if (i != 0) a = a + i / (Math.Pow(10, ilepoprzecinku++));
                    else ++ilepoprzecinku;
                }
            }
            else
            {
                if (!kropka) b = 10 * b + i;
                else
                {
                    if (i != 0) b = b + i / (Math.Pow(10, ilepoprzecinku++));
                    else ++ilepoprzecinku;
                }
            }

            if (czykasowacekran)
            {
                txtWynik.Text = "";
                czykasowacekran = false;
                znak = PLUS;
            }
            txtWynik.Text += i.ToString();
        }

        public double dzialaj(double x, double y, int dz)
        {
            ukryjznaki();
            double wynik = 0;
            if (dzialanie != 0)
            {
                switch (dzialanie)
                {
                    case PLUS: wynik = y + x; break;
                    case MINUS: wynik = y - x; break;
                    case RAZY: wynik = y * x; break;
                    case PODZIELIC: wynik = y / x; break;
                }
                txtWynik.Text = wynik.ToString();
                a = 0;
            }
            else wynik = y;
            dzialanie = dz;
            czykasowacekran = true;
            cmdKropka.Enabled = true;
            ilepoprzecinku = 0;
            return wynik;
        }



        public frmKalkulator()
        {
            InitializeComponent();
        }

        private void cmd1_Click(object sender, EventArgs e)
        {
            cyfry(1);
        }

        private void cmd2_Click(object sender, EventArgs e)
        {
            cyfry(2);
        }

        private void cmd3_Click(object sender, EventArgs e)
        {
            cyfry(3);
        }

        private void cmd4_Click(object sender, EventArgs e)
        {
            cyfry(4);
        }

        private void cmd5_Click(object sender, EventArgs e)
        {
            cyfry(5);
        }

        private void cmd6_Click(object sender, EventArgs e)
        {
            cyfry(6);
        }

        private void cmd7_Click(object sender, EventArgs e)
        {
            cyfry(7);
        }

        private void cmd8_Click(object sender, EventArgs e)
        {
            cyfry(8);
        }

        private void cmd9_Click(object sender, EventArgs e)
        {
            cyfry(9);
        }

        private void cmd0_Click(object sender, EventArgs e)
        {
            cyfry(0);
        }

        private void cmdKropka_Click(object sender, EventArgs e)
        {
            if (czykasowacekran)
            {
                txtWynik.Text = "";
                czykasowacekran = false;
                znak = PLUS;
            }
            if (txtWynik.Text == "") txtWynik.Text = "0";
            txtWynik.Text += ",";
            cmdKropka.Enabled = false;
            kropka = true;
            ilepoprzecinku = 1;
        }

     

      

      

       

        private void cmdZnak_Click(object sender, EventArgs e)
        {
            if (znak == PLUS) znak = MINUS;
            else znak = PLUS;

            if (dzialanie != 0) { a = -a; txtWynik.Text = a.ToString(); }
            else { b = -b; txtWynik.Text = b.ToString(); }
        }

  

        private void cmdAnuluj_Click(object sender, EventArgs e)
        {
            a = b = 0;
            dzialanie = 0;
            kropka = false;
            ilepoprzecinku = 0;
            txtWynik.Text = "";
            znak = PLUS;
            czykasowacekran = false;
            ukryjznaki();
        }

        private void frmKalkulator_KeyPress(object sender, KeyPressEventArgs e)
        {
            switch (e.KeyChar)
            {
                case 'a': if (dodawanieToolStripMenuItem.Enabled) dodawanieToolStripMenuItem_Click(sender, e); return;
                case 'b': if (odejmowanieToolStripMenuItem.Enabled) odejmowanieToolStripMenuItem_Click(sender, e); return;
                case 'c': if (mnożenieToolStripMenuItem.Enabled) mnożenieToolStripMenuItem_Click(sender, e); return;
                case 'd': if (dzielenieToolStripMenuItem.Enabled) dzielenieToolStripMenuItem_Click(sender, e); return;
                case (char)13: if (obliczWyrażenieToolStripMenuItem.Enabled) obliczWyrażenieToolStripMenuItem_Click(sender, e); return; // enter
                case (char)27: cmdAnuluj_Click(sender, e); return; // escape
                case '.':
                case ',': if (cmdKropka.Enabled) cmdKropka_Click(sender, e); return;
            }
            int n = (int)e.KeyChar;
            if (n < 48 || n > 57) return;
            n = int.Parse( e.KeyChar.ToString() );
            cyfry(n);
            return;
        }

        private void obliczWyrażenieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, dzialanie);
            txtWynik.Text = b.ToString();
            cmdKropka.Enabled = true;
            dzialanie = PLUS;
            a = 0;
            pokazznaki();
            obliczWyrażenieToolStripMenuItem.Enabled = false;
            cmdZnak.Enabled = false;
        }

        private void dodawanieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, PLUS);
        }

        private void odejmowanieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, MINUS);
        }

        private void mnożenieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, RAZY);
        }

        private void dzielenieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, PODZIELIC);
        }

        private void frmKalkulator_Load(object sender, EventArgs e)
        {

        }

        private void wyjścieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}
1

No, ale gdzie masz implementację algorytmu podanego przez kolegę dwa posty wyżej? Jak na moje oko to nie wiem jakim cudem Ci to działa o ile w ogóle działa. Straszliwie mieszasz i piszesz herezję, których się czytać nie da, a co dopiero rozumieć o co chodzi.
Dam Ci radę - wywal ten program i zacznij od początku, jeszcze raz. Uważnie popatrz na algorytm, który masz wyżej bo w 100% spełnia Twoje oczekiwania. Następnie wsadź to po prostu w swój program okienkowy i wywołaj tą funkcję do działania. Tyle, żadnej filozofii i herezji nie będzie.

0

program działa bardzo dobrze.
Ale implementacja kolegi jest w trybie konsolowym a mi trzeba w okienkowym. Czy ktoś mi pomoze patrząć sie na mój kod?

0

wsadziałam ten kod kolegi w trybie konsolowym do mojego programu okienkowego i wyskakują błędy, jak może mi działać program jak w trybie okienkowym mam przyciski itd a w tym kolegi kodzie nie ma odwołania nawet do windows form.Niewiem czy dobrze rozumiem,ale dopiero zaczynam c#.Fajnie by było gdyby ktoś popatrzał na mój kod i podpowiedział mi trochę.

0

Bo musisz go przystosować. I Wygląda na to, że dłużej musisz posiedzieć nad podstawami w trybie konsoli.

0

A jak go przystosować.Mała podpowiedź-proszę

2

Dobra, to tak:

  • bierzesz algorytm, który został podany i wrzucasz go do jakiejś osobnej metody.
  • tworzysz formatki, textBox'y, przyciski itd.
  • wybierasz przycisk, który ma za zadanie zsumować podane elementy w textBox'ie
  • przekazujesz string z textBox'a do swojej metody i otrzymujesz wynik
  • otrzymany wynik wyświetlasz w innym (bądź tym samym) textBox'ie
0

dobre a ja jestem dziewczyną piszę od brata hehe dobre niestety nie uda się wam:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1