Kalkulator - funkcje statyczne w klasie

0

Cześć!

Mam problem w napisaniu kalkulatora w klasie. Jeszcze za bardzo nie orientuje się w tym jak poprawnie pisać funkcje statyczne. W tym przypadku kiedy chcę zrobić dodawanie wyświetla się wynik i jedna z wprowadzonych liczb. W jaki sposób mogę to zaimplementować aby kod działał poprawnie?

I jeszcze jedno pytanie, jeżeli chcę zrobić dodawanie/odejmowanie z pamięci czyli (M+ i M-) to w jaki sposób mogę to zapisać? Nie wiem za bardzo jak to zrobić.

Pozdrawiam

class Kalkulator2
    {
        double a;
        double b;
        public Kalkulator2(double a, double b)
        {
            this.a = a;
            this.b = b;
        }
        public double GetA()
        {
            return a;
        }
        public double GetB()
        {
            return b;
        }
        public override string ToString()
        {
            return String.Format("Dane liczby: {0} {1}", a, b);
        }
        public void Wypisz()
        {
            Console.WriteLine("{0} {1}", a, b);
        }
        public static Kalkulator2 Dodaj2(Kalkulator2 w)
        {
            w.a= w.a + w.b;
            return w;
        }
    }
    static void Main(string[] args)
    {
         Kalkulator2 y = new Kalkulator2(4, 1);
         Console.WriteLine(y.ToString()); //wyświetla 5,1
         Console.WriteLine(Kalkulator2.Dodaj2(y));
         Console.ReadKey();           
     }
0

Tak krótki kod a taki zły. Aż nie wiem od czego zacząć.

  public double GetA()
        {
            return a;
        }
        public double GetB()
        {
            return b;
        }

od tego sa propertisy https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

public Kalkulator2(double a, double b)
{
            this.a = a;
            this.b = b;
}

Jaki jest sens tego wiesz w ogóle co robisz ?

public static Kalkulator2 Dodaj2(Kalkulator2 w)
{
     w.a= w.a + w.b;
      return w;
}

metoda dodaj w klasie kalkulator przyjmuje klase kalkulator.. tutaj chyba powinny być liczby które chcesz dodać?

Chyba powinno być tak ?

public int Dodaj(int a,int b)
{
    
      return a+b;
}

Po co chcesz żeby ta metoda była statyczna ? Jaki masz w tym cel ?

0
public Kalkulator2(double a, double b)
{
            this.a = a;
            this.b = b;
}

tworzę konstruktora

public static Kalkulator2 Dodaj2(Kalkulator2 w)
{
     w.a= w.a + w.b;
      return w;
}

rozwiązanie niestatyczne jest oczywiste, w jakim celu chcę by było statyczne? To proste, aby nauczyć się operować na klasach gdzie metody są statyczne bądź nie. Mieliśmy zadanie aby napisać na dwa sposoby. W sposób niestatyczny kalkulator napisałem i jest jasne, jednak kiedy te same funkcje chce zapisać statycznie mam duży problem.

0

Oprócz tego w jaki sposób zrobić dodawanie/odejmowanie z pamięci czyli (M+ i M-) ? Znalazłem strony gdzie jest to zrobione ale na wersjach okienkowych, nie wiem za bardzo w jaki sposób przenieść to na klasy.

1
public static class Kalkulator
{
  public static int Dodaj(int a,int b)
   {
        return a+b;
   }
}

Co do operacji M- i M+ to przypisz wynik do jakiejś zmiennej i na niej bazuj..

0

Bardzo dziękuję za pomoc, ale nikomu nie udało się mi pomóc, trochę pokombinowałem i doszedłem do tego by napisać to w ten sposób:

class Kalkulator2
    {
        double a;
        double b;
        public Kalkulator2(double a, double b)
        {
            this.a = a;
            this.b = b;
        }
        public double GetA()
        {
            return a;
        }
        public double GetB()
        {
            return b;
        }
        public override string ToString()
        {
            return String.Format("Dane liczby: {0}", a);
        }
        public void Wypisz()
        {
            Console.WriteLine("Dane liczby: {0} {1}", a,b);
        }
        public static Kalkulator2 Dodaj2(Kalkulator2 w)
        {
            return new Kalkulator2(w.GetA() + w.GetB(),w.GetB()+w.GetA());
        }        
    }
    static void Main(string[] args)
    {
            Kalkulator2 y = new Kalkulator2(4,1);
            y.Wypisz();
            Console.WriteLine(Kalkulator2.Dodaj2(y));
            Console.ReadKey();
   }
1

Ja proponuję coś takiego:

    public static class MyMath
    {
        public static decimal Add(decimal numA, decimal numB)
        {
            return numA + numB;
        }

        public static decimal Substract(decimal numA, decimal numB)
        {
            return numA - numB;
        }

    }

    public class Calculator
    {
        private decimal _mem = 0;

        public Calculator()
        {

        }

        public decimal Add(decimal numA, decimal numB)
        {
            return MyMath.Add(numA, numB);
        }

        public decimal Substract(decimal numA, decimal numB)
        {
            return MyMath.Substract(numA, numB);
        }

        public void MemorySave(decimal numA)
        {
            _mem = numA;
        }

        public void MemoryAdd(decimal numA)
        {
            _mem += numA;
            /*
             Mozna jeszcze tak:
            _mem = MyMath.Add(_mem, numA);
             */

        }

        public void MemorySubstract(decimal numA)
        {
            _mem -= numA;
        }

        public void MemoryReset()
        {
            _mem = 0;
        }

        public decimal MemoryGet()
        {
            return _mem;
        }
    }

Oczywiście nie ma tutaj obsłużenia wyjątków czy sprawdzania argumentów.

0

Czy w ogóle ogarniasz, czym jest statyczna metoda? Statyczna metoda to taka, którą możesz wykonać na rzecz KLASY, a nie OBIEKTU. Wiesz, czym się różni obiekt od klasy? Wyobraź to sobie tak. Klasa to pewien opis. Np. to może być projekt biurka. Obiekt to... obiekt powstały na podstawie tego projektu. Czyli o ile klasa będzie projektem biurka, o tyle obiekt będzie tym biurkiem.

Projekt określa tylko budowę biurka. Jego "kształt" i funkcjonalność (np. dwie szuflady). Nie określa jego koloru ani materiałów. Teraz załóżmy, że powstało 10 biurek na podstawie tego projektu. Każde biurko w innym kolorze, każde z innego drewna. Ale wszystkie są takie same, jeśli chodzi o kształt i funkcjonalność. Teraz wchodzisz ze swoją czarodziejską różdżką i mówisz: "Ja chcę, żeby wszystkie biurka z tego projektu były wykonane z dębu". Robisz zmianę w projekcie i w magiczny sposób wszystkie biurka nagle stają się dębowe. Robiąc zmianę w projekcie wywołałeś metodę statyczną.

Teraz przykład z życia wzięty.
Napisz taką klasę, która zwraca Ci ilość obiektów utworzonych z niej. To jest zadanie dla Ciebie. Jak je zrobisz, zakumasz, czym tak naprawdę są metody statyczne. Podpowiem Ci, że potrzebujesz też zmiennej statycznej.

A, żeby jeszcze trochę utrudnić, niech każdy obiekt tej klasy ma unikalne ID, o którym decyduje ta klasa.

0
Juhas napisał(a):

Czy w ogóle ogarniasz, czym jest statyczna metoda? Statyczna metoda to taka, którą możesz wykonać na rzecz KLASY, a nie OBIEKTU. Wiesz, czym się różni obiekt od klasy? Wyobraź to sobie tak. Klasa to pewien opis. Np. to może być projekt biurka. Obiekt to... obiekt powstały na podstawie tego projektu. Czyli o ile klasa będzie projektem biurka, o tyle obiekt będzie tym biurkiem.

Projekt określa tylko budowę biurka. Jego "kształt" i funkcjonalność (np. dwie szuflady). Nie określa jego koloru ani materiałów. Teraz załóżmy, że powstało 10 biurek na podstawie tego projektu. Każde biurko w innym kolorze, każde z innego drewna. Ale wszystkie są takie same, jeśli chodzi o kształt i funkcjonalność. Teraz wchodzisz ze swoją czarodziejską różdżką i mówisz: "Ja chcę, żeby wszystkie biurka z tego projektu były wykonane z dębu". Robisz zmianę w projekcie i w magiczny sposób wszystkie biurka nagle stają się dębowe. Robiąc zmianę w projekcie wywołałeś metodę statyczną.

Teraz przykład z życia wzięty.
Napisz taką klasę, która zwraca Ci ilość obiektów utworzonych z niej. To jest zadanie dla Ciebie. Jak je zrobisz, zakumasz, czym tak naprawdę są metody statyczne. Podpowiem Ci, że potrzebujesz też zmiennej statycznej.

A, żeby jeszcze trochę utrudnić, niech każdy obiekt tej klasy ma unikalne ID, o którym decyduje ta klasa.

Nie wiem w zasadzie, ale czy chodziło Ci np o coś takiego? (mało tych metod napisałem)


using System;
namespace ConsoleApplication1
{
    class Testy
    {
        public int test1;
        public int test2;        
        public Testy(int test1, int test2)
        {
            this.test1 = test1;
            this.test2 = test2;            
        }        
        public static Testy Statek( Testy m)
        {
            return new Testy(m.test1+m.test2,m.test2+m.test1);
        }
        public override string ToString()
        {
            return String.Format("{0}", test1);
        }
        //podobnie jak kalkulator pisałem, co w tym złego? Działa przecież
    }
    class Testy2
    {
        public string x;
        public string y;
        public Testy2(string x, string y)
        {
            this.x = x;
            this.y = y;
        }
        public override string ToString()
        {
            return String.Format("{0} {1}", x, y);
        }
        public static Testy2 Mundur(Testy2 xxx)
        {
            return new Testy2(xxx.x,xxx.y);
        }
        public static Testy2 Mundur2(Testy2 ooo, string zmienna)
        {
            ooo.x = ooo.x + zmienna;
            ooo.y = ooo.y + zmienna;
            return ooo;
        }
        public static Testy2 Mundur3(Testy2 kkk, string x1, string x2)
        {
            kkk.x = kkk.x + x1;
            kkk.y = kkk.y + x2;
            return kkk;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Testy y = new Testy(2, 5);
            Console.WriteLine("Wynik: {0}",Testy.Statek(y));

            Testy2 y1 = new Testy2("ala", "ma");
            Console.WriteLine("{0} kota",Testy2.Mundur(y1));

            Testy2 y2 = new Testy2("bakłażan ", "marchewka ");
            Console.WriteLine(" {0}",Testy2.Mundur2(y2,"Warzywa\n"));

            Testy2 y3 = new Testy2("biurko ", "stolik ");
            Console.WriteLine("{0}",Testy2.Mundur3(y3,"żółte\t", "pomarańczowy"));
            Console.ReadKey();
        }
    }
}

0

Coś bardziej w ten deseń:

     public class Test
    {
        private static int _numberOfTests; //Statyczna liczba obiektów tej klasy.
        
        public Test() //Podczas tworzenia nowego obiektu tej klasy podbijamy licznik o jeden do góry.
        {
            _numberOfTests++;
        }

        ~Test() //Gdy GC chce go usunąć to zbijamy licznik o jeden.
        {
            _numberOfTests--;
        }


        public bool DoSomething()
        {
            return true;
        }

        public int GetNumberOfTests()
        {
            return _numberOfTests;
        }
    }

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