» »

Kalkulator

Kalkulator

kiko12 ::

Pozdravljeni!
Naletel sem na težavo pri izdelavi naloge, ki jo moremo narediti na faxu. Problem se pojavi ker nevem kako naj napišem kodo ki bo izračunala rezultat in pri tem program pri izračunu upošteva prednost operatorjev.
Programska koda:
 static void Main(string[] args)
        {
            string vnos;
            Console.WriteLine("Vnesi:");
            vnos = Console.ReadLine();

            int a = 0;
            int b = 0;
            string[] znak = new string[2];
            string[] stevilo = new string[3];
            int j = vnos.Length;

            for (int i = 0; i < j; i = i + 1)
            {
                if (vnos[i].ToString() == "+" || vnos[i].ToString() == "-" || vnos[i].ToString() == "*" || vnos[i].ToString() == "/")
                {
                    znak[a] = vnos[i].ToString();
                    a++;
                    b++;
                }
                else
                {
                    stevilo[b] = stevilo[b] + vnos[i].ToString();
                }
            }

            int izracun;

            
            
           

        }
    }
}


hvala za pomoč!
  • spremenil: bluefish ()

lebdim ::

jaz ne bi kompliciral. prebral bi dve števili (uporabnik naj jih vnese), naredil bi izbiro operatorjev (+, -, * in /) in izpisal rezultat.

kiko12 ::

težava je v tem da navodila zahtevajo to...
Izdelajte program za enostaven "kalkulator".

Program naj prebere niz, ki vsebuje do tri cela števila in do dva operatorja (število1 operator1 število2 ali število1 operator1 število2 operator2 število3 - primer vhoda: "5 % 2 / 3").

Nato program preveri pravilnost vnesenega izraza in izračuna njegov rezultat, pri čemer upošteva prednost operatorjev (npr. množenje se izvede pred seštevanjem).

Operatorji so lahko: +, -, *, /, ^ (potenca) in % (celoštevilski ostanek).

lebdim ::

če je to naloga za c, potem moraš v nalogi napisati in predvideti, kakšne podatke pričakuješ od uporabnika.
se pravi, vsi ti znaki so tipa char, števila pa so tipa integer. potem pa, ko pišeš podprogram za kalkulator uporabiš case-stavek.
kolikor se spomnim, se v c niz prebere z ukazom gets.

Zgodovina sprememb…

  • spremenil: lebdim ()

black ice ::

Če nisi opazil, je OP podal kodo v C# sintaksi.

Postopek na hitro: preveriš pravilnost izraza (ustrezno število oklepajev in zaklepajev, preverjanje, če izraz vsebuje črke ter preverjanje, da ni dvojnih operatorjev), ugotoviš prednost operatorjev, izluščiš števila in izvedeš operacije nad njimi.

boogie_xlr ::

Najlažje gre, če infix pretvoriš v postfix, nato pa izračunaš s pomočjo sklada.

black ice ::

Čisto pozabil na tole. OP, priporočam izvedbo kot ti jo je predlagal boogie. Ne samo, da je izvedba zelo hitra, boš verjetno naredil tudi dober vtis na asistenta. :)

Če si že obiskoval Algoritme in podatkovne strukture (oz. variacijo tega predmeta) bi morali to snov že pokriti.

lebdim ::

@black ice, ponavadi se piše enostavni kalkulator takole: (oz. jaz bi ga tako napisal)
-> vpišeš 1. število in ga prebereš
-> vpišeš 2. število in ga prebereš
-> vpišeš operacijo
-> narediš case stavek (oz. switch case v C)
-> izpišeš rezultat

Math Freak ::

Računaš po vrstnem redu, razen če je prvi znak + ali - in drugi znak nekaj drugega.

            
            if (znak[0] == "+" || "-")
            {
                if (znak[1] != "+" || "-")
                {
                    poračunaš najprej zadnje dva;
                }
            else
            {
                po vrstnem redu;
            }

Math Freak ::

En način rešitve za 3 števila in dva znaka (koda se da še veliko izboljšati in polepšati, je pa ideja):
    class Program
    {
        static double rezultat(int a, int b, char c)
        {
            double rez = 0;
            switch (c)
            {
                case '+':
                    rez = a + b;
                    break;
                case '-':
                    rez = a - b;
                    break;
                case '*':
                    rez = a * b;
                    break;
                case '/':
                    rez = (double)a / b;
                    break;
                case '%':
                    rez = a % b;
                    break;
                case '^':
                    rez = a ^ b;
                    break;
            }
            return rez;
        }

        static double rezultat(double a, double b, char c)
        {
            double rez = 0;
            switch (c)
            {
                case '+':
                    rez = a + b;
                    break;
                case '-':
                    rez = a - b;
                    break;
                case '*':
                    rez = a * b;
                    break;
                case '/':
                    rez = a / b;
                    break;
                case '%':
                    rez = a % b;
                    break;
            }
            return rez;
        }

        static void Main(string[] args)
        {
            string vnos;
            Console.WriteLine("Vnesi:");
            vnos = Console.ReadLine();

            int a = 0;
            int b = 0;
            char[] znak = new char[2];
            string[] stevilo = new string[3];
            int j = vnos.Length;

            for (int i = 0; i < j; i = i + 1)
            {
                if (vnos[i].ToString() == "+" || vnos[i].ToString() == "-" || vnos[i].ToString() == "*" || vnos[i].ToString() == "/" || vnos[i].ToString() == "%" || vnos[i].ToString() == "^")
                {
                    znak[a] = vnos[i];
                    a++;
                    b++;
                }
                else
                {
                    stevilo[b] = stevilo[b] + vnos[i].ToString();
                }
            }


            double delni = 1;
            double koncni = 1;
            if ((znak[0] == '+' || znak[0] == '-') && (znak[1] != '+' && znak[1] != '-'))
            {
                delni = rezultat(Convert.ToInt16(stevilo[1]), Convert.ToInt16(stevilo[2]), znak[1]);
                koncni = rezultat(Convert.ToInt16(stevilo[0]), delni, znak[0]);
            }
            else
            {
                delni = rezultat(Convert.ToInt16(stevilo[0]), Convert.ToInt16(stevilo[1]), znak[0]);
                koncni = rezultat(delni, Convert.ToInt16(stevilo[2]), znak[1]);
            }

            Console.WriteLine(koncni);
            Console.ReadLine();
        }
    }
}


Problem je tudi, kaj če je prvo število negativno, potem je treba poskrbeti še za izjeme, če deliš z 0 ali če potenciraš števila, ki niso cela, ali pa sama potenca ni celo število, itd.

Math Freak ::

Seveda, če ste vzeli sklade, drevesa ali kaj podobnega, potem je bolje da uporabiš tisto znanje.

lebdim ::

skladi se jemljejo pri algoritmih in podatkovnih strukturah. zdej, če je to naloga iz "klasičnega programiranja", potem verjetno še ne znajo delat s skladom.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# program za pretvorbo v desetiško število z rekurzijo

Oddelek: Programiranje
81368 (1091) MrStein
»

C# težava

Oddelek: Programiranje
233465 (2311) mladec
»

[C#] Operacija IN in ALI med dvema int številoma

Oddelek: Programiranje
111086 (899) LeQuack
»

[C#] branje ter urejanje podatkov

Oddelek: Programiranje
181504 (1279) maticm
»

Kako številu vsako cifro posebej identificirati?

Oddelek: Programiranje
5949 (889) sverde21

Več podobnih tem