» »

kalkulator

kalkulator

majster123 ::

Imam problem pri programu Kalkulator... nekaj sem naredil a ne čisto do konca... help? :)


besedilo:

Izdelajte program za enostaven "kalkulator".

Program naj prebere niz, ki vsebuje do štiri pozitivna števila in do tri operatorje (število1 operator1 število2 ali število1 operator1 število2 operator2 število3 ali število1 operator1 število2 operator2 število3 operator3 število4 - primer vhoda: "5 ^ 2 / 3.5 * 4.1").

Program naj vpisan niz razbije na posamezna števila in operatorje ter preveri pravilnost vnesenega izraza. Nato izračuna njegov rezultat ter ga izpiše nazaj uporabniku, pri čemer se upošteva prednost operatorjev (npr. množenje se izvede pred seštevanjem). Če rezultata zaradi kakršnegakoli razloga (npr. manjka število za operatorjem) ni mogoče izračunati, naj se uporabniku izpiše opozorilo.

Operatorji so lahko: +, -, *, /, ^ (potenca).

Opomba: znak ^ ne boste mogli uporabiti direktno v v C# kodi, ker le-tega prevajalnik smatra kot operator za XOR. Tako da v primeru tega znaka, potenciranje implementirajte sami ali pa si pomagajte z matematično knjižnico.
Opomba 2: pri nalogi lahko uporabite Convert.ToInt32() ter Convert.ToDouble().



koda:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace kalkulator
{
    class Program
    {
        //podprogram, ki množi 2 števili.
        static double množenje(double stevilo1, double stevilo2)
        {
            double rez = stevilo1 * stevilo2;
            return rez;
        }
        //podprogram, ki zdeli 2 števili.
        static double deljenje(double stevilo1, double stevilo2)
        {
            double rez = stevilo1 / stevilo2;
            return rez;
        }
        //podprogram, ki potencira 2 števili.
        static double potenca(double stevilo1, double stevilo2)
        {
            double rez = Math.Pow(stevilo1, stevilo2);
            return rez;
        }
        //podprogram, ki sešteje 2 števili.
        static double seštevanje(double število1, double število2)
        {
            double rez = število1 + število2;
            return rez;
        }
        //podprogram, ki odšteje 2 števili.
        static double odštevanje(double število1, double število2)
        {
            double rez = število1 - število2;
            return rez;
        }
        //podprogram, ki vrne celoštevilski ostanek pri deljenju
        static double ostanek(double število1, double število2)
        {
            double rez = število1 % število2;
            return rez;
        }





        static void Main(string[] args)
        {

            //deklaracija potrebnih spremenljivk
            char operator1 = ' ', operator2 = ' ', operator3 = ' ';
            double št1, št2, št3, št4;
            double rezultat;

            //spremenljivka vmesni rezultat se rabi pri izračunu prednostnega dela.
            double vmesni_rezultat = 0;

            //izpis navodil uporabniku in vnos računa
            Console.WriteLine("Vpišite string");
            string a = Console.ReadLine();
            string[] ar = new string[3];
            int n = 0;

            int st_operatorjev = 0;

            //zanka gre čez celotno tabelo
            for (int i = 0; i < a.Length; i++)
            {
                //pogojni stavek s pomočjo for zanke za vsak indeks preverja, če je "operator".
                if (a[i] == '+' || a[i] == '*' || a[i] == '/' || a[i] == '/' || a[i] == '^')
                {
                    st_operatorjev++;


                    if (st_operatorjev == 1)
                    {
                        operator1 = a[i];
                    }
                    else if (st_operatorjev == 2)
                    {
                        operator2 = a[i];
                    }
                    continue;

                }

                else if (a[i] == '-')
                {
                    if ((a[i - 1] == '/' || a[i - 1] == '%' || a[i - 1] == '+' || a[i - 1] == '^' || a[i - 1] == '*') || (i == 0) && (i > 0))
                    {
                        //predznak dodam številu v isti index
                        ar[st_operatorjev] = ar[st_operatorjev] + a[st_operatorjev];
                        continue;
                    }
                    else
                    {
                        //števec operatorjev povečamo
                        st_operatorjev++;
                        if (st_operatorjev == 1)
                        {
                            operator1 = a[i];

                        }
                        else if (st_operatorjev == 2)
                        {
                            operator2 = a[i];

                        }
                        continue;
                    }
                }
                //če pogoj ni izpolnjen pomeni da je na trenutnem indeksu številska vrednost, katera se shrani v novo tabelo števil.                  
                ar[st_operatorjev] = ar[st_operatorjev] + a[i];


            }

            int[] st = new int[st_operatorjev + 1];

            //s pomočjo števca iz nove tabele v spremenljivko shranimo 1. število.

            //prvo število se shrani v prvo spremenljivko
            int j = 0;
            st[j] = int.Parse(ar[j]);
            št1 = st[j];
            j++;

            //s pomočjo števca iz nove tabele v spremenljivko shranimo 2. število.
            st[j] = int.Parse(ar[j]);
            št2 = st[j];
            j++;





            //v primeru da uporabnik poda 2 števili je pogoj izpolnjen
            if (st_operatorjev == 1)
            {
                //s pomočjo switch zanke ugotavljavmo, za kater operator gre.
                switch (operator1)
                {

                    case '*':
                        rezultat = množenje(št1, št2);
                        Console.WriteLine("Rezultat množenja je:" + " " + rezultat);
                        break;

                    case '/':
                        if (št2 != 0)
                        {
                            rezultat = deljenje(št1, št2);
                            Console.WriteLine("Rezultat deljenja je:" + " " + rezultat);
                            break;
                        }
                        else
                        {
                            Console.WriteLine("z 0 ne gre delit");
                            break;
                        }


                    case '+':
                        rezultat = seštevanje(št1, št2);
                        Console.WriteLine("Rezultat seštevanja je:" + " " + rezultat);
                        break;

                    case '-':
                        rezultat = odštevanje(št1, št2);
                        Console.WriteLine("Rezultat odštevanja je:" + " " + rezultat);
                        break;

                    case '^':
                        rezultat = potenca(št1, št2);
                        Console.WriteLine("Rezultat potenciranja je:" + " " + rezultat);
                        break;

                    case '%':
                        rezultat = ostanek(št1, št2);
                        Console.WriteLine("Rezultat celoštevilskega deljenja je:" + " " + rezultat);
                        break;

                    //v kolikor noben znak nebo ustrezal vnesenemu se izvede default del kode
                    default:
                        Console.WriteLine("Vnešen operator ni pravilen");
                        break;

                }



            }
            //če uporabnik kot drugi znak ne vnese '=' pomeni da bo vnesel 3 števila
            else if(st_operatorjev == 2)
            {

                //če je vnešenih več kot 2 števili se tretje shrani v tretjo spremenljivko
                st[j] = int.Parse(ar[j]);
                št3 = st[j];
                j++;



                //potenciranje ima prednost zato je potrebno preveriti prvi operator
                if (operator1 == '^')
                {

                    //rezultat potenciranja se shrani v vmesno vrednost
                    vmesni_rezultat = potenca(št1, št2);

                    if ((operator2 == '*') || (operator2 == '/') || (operator2 == '%') || (operator2 == '+') || (operator2 == '-'))
                    {

                        // sedaj izračunamo vmesni rezultat iz potenciranja pri prejšnjem koraku
                        switch (operator2)
                        {
                            //s pomočjo switch stavka ugotavljamo kakšen je drug operator.
                            case '*':
                                rezultat = množenje(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;
                            case '/':
                                if (št3 != 0)
                                {
                                    rezultat = deljenje(vmesni_rezultat, št3);
                                    Console.WriteLine("Rezultat je:" + " " + rezultat);
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine("Z 0 ne gre delit");
                                    break;
                                }


                            case '%':
                                rezultat = ostanek(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '+':
                                rezultat = seštevanje(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '-':
                                rezultat = odštevanje(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                        }


                    }


                }
                //podobno kot v prejšnjem koraku je potrebno preveriti, če je drugi operator potenciranje, če je pomeni da ima prednost pred ostalimi operatorji
                if (operator2 == '^')
                {
                    //prireditveni stavek izračuna rezultat potenciranja in shrani vrednost
                    vmesni_rezultat = potenca(št2, št3);


                    //z pogojnim stavkom poiščemo še prvi operator
                    if ((operator1 == '*') || (operator1 == '/') || (operator1 == '%') || (operator1 == '+') || (operator1 == '-'))
                    {

                        //drugi del izraza se najde s pomočjo switch stavka, se izračuna in izpiše uporabniku.
                        switch (operator1)
                        {
                            case '*':
                                rezultat = množenje(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '/':
                                //ker deljenje z 0 ne obstaja to preprečim z pogojnim stavkom

                                if (vmesni_rezultat != 0)
                                {
                                    rezultat = deljenje(št1, vmesni_rezultat);
                                    Console.WriteLine("Rezultat je:" + " " + rezultat);
                                    break;
                                }
                                else
                                {
                                    //ta del stavka se izvede v kolikor je prejšnji pogoj izpolnjen.
                                    Console.WriteLine("Z 0 ne gre delit");
                                    break;
                                }


                            case '%':
                                rezultat = ostanek(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '+':
                                rezultat = seštevanje(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '-':
                                rezultat = odštevanje(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;


                        }
                    }


                }
                // v kolikor prejšnja pogoja nista bila izpolnjena(ni bil operator za potenciranje)--> pomeni da je operator nek drug
                //izvede se pogojni stavek
                if ((operator1 == '*') || (operator1 == '/') || (operator1 == '%'))
                {
                    //s pomočjo switch stavka se išče operator 1, ki ustreza kriterijem.
                    switch (operator1)
                    {
                        case '*':
                            vmesni_rezultat = množenje(št1, št2);
                            break;

                        case '/':

                            vmesni_rezultat = deljenje(št1, št2);
                            break;


                        case '%':
                            vmesni_rezultat = ostanek(št1, št2);
                            break;

                    }


                    //ta del se izvede v kolikor se je v prejšnjem pogoju našel operator1. Ko se je našel operator 1 lahko program nadaljuje z iskanjem operatorja 2.
                    if ((operator2 == '*') || (operator2 == '/') || (operator2 == '%') || (operator2 == '+') || (operator2 == '-'))
                    {
                        //s pomočjo switch stavka program poišče operator2
                        switch (operator2)
                        {
                            case '*':
                                rezultat = množenje(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;


                            case '/':
                                //Zopet je potrebno z pogojnim stavkom preprečiti deljenje z 0
                                if (št3 != 0)
                                {

                                    rezultat = deljenje(vmesni_rezultat, št3);
                                    Console.WriteLine("Rezultat je:" + " " + rezultat);
                                    break;
                                }
                                // v kolikor pogoj ni izpolnjen (število je 0), se izpiše opozorilo o napaki. 
                                else
                                {
                                    Console.WriteLine("Z 0 ne gre delit");
                                    break;
                                }



                            case '%':
                                rezultat = ostanek(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '+':
                                rezultat = seštevanje(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '-':
                                rezultat = odštevanje(vmesni_rezultat, št3);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                        }
                    }
                }
                //če niti 1 operator ni bil najden se izvede ta pogojni stavek, ki preverja če je operator 2 kateri izmed spodnjih
                else if ((operator2 == '*') || (operator2 == '/') || (operator2 == '%'))
                {
                    //v kolikor je pogoj izpolnjen, bo program s switch stavkom poiskal ustrezen operator.
                    switch (operator2)
                    {
                        case '*':
                            vmesni_rezultat = množenje(št2, št3);
                            break;

                        case '/':
                            vmesni_rezultat = deljenje(št2, št3);
                            break;


                        case '%':
                            vmesni_rezultat = ostanek(št2, št3);
                            break;

                    }
                    // v kolikor je program našel 2. operator nadaljuje z iskanjem prvega
                    if ((operator1 == '*') || (operator1 == '/') || (operator1 == '%') || (operator1 == '+') || (operator1 == '-'))
                    {
                        //pogojni stavek poišče 1. operator
                        switch (operator1)
                        {
                            case '*':
                                rezultat = množenje(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;


                            case '/':
                                //z pogojnim stavkom preprečimo deljenje z številom 0
                                if (vmesni_rezultat != 0)
                                {
                                    rezultat = deljenje(št1, vmesni_rezultat);
                                    Console.WriteLine("Rezultat je:" + " " + rezultat);
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine("Z 0 ne gre delit");
                                    break;
                                }

                            case '%':
                                rezultat = ostanek(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '+':
                                rezultat = seštevanje(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                            case '-':
                                rezultat = odštevanje(št1, vmesni_rezultat);
                                Console.WriteLine("Rezultat je:" + " " + rezultat);
                                break;

                        }

                    }


                }
                //+ in - imata najmanjšo prioriteto, zato ju program išče nazadnje
                if ((operator1 == '+') || (operator1 == '-'))
                {
                    //v kolikor je pogoj izpolnjen
                    switch (operator1)
                    {
                        case '+':
                            vmesni_rezultat = seštevanje(št1, št2);
                            break;

                        case '-':
                            vmesni_rezultat = odštevanje(št1, št2);
                            break;


                    }
                    //poiščemo še operator2
                    switch (operator2)
                    {
                        case '+':
                            rezultat = seštevanje(vmesni_rezultat, št3);
                            Console.WriteLine("Rezultat je:" + " " + rezultat);
                            break;

                        case '-':
                            rezultat = odštevanje(vmesni_rezultat, št3);
                            Console.WriteLine("Rezultat je:" + " " + rezultat);
                            break;

                    }


                }
            }


            Console.ReadLine();


        }



    }
}

ragezor ::

duuude, nevem ce se bo komu dalo brati 500 vrstic.

ce ti kaj pomaga imas tu resitev v pythonu. probaj razumeti, nimam zdaj casa za dolgo razlago. verjetno bos moral poguglati infix notation pa postfix notation.
aja pa ne garantiram, da je 100% pravilna ker sem testiral samo na tvojem enem primeru

from operator import add, sub, mul, pow, div

infix = "5 ^ 2 / 3.5 * 4.1".split()
precedence = {"+": 1, "-": 1, "*": 2, "/": 2, "^": 3}
stack = []
postfix = []

for item in infix:
	try:
		number = float(item)
		postfix.append(number)
	except:
		while True:
			if not stack or precedence[stack[-1]] < precedence[item]:
				stack.append(item)
				break
			else:
				postfix.append(stack.pop())

while stack:
	postfix.append(stack.pop())

def compute(postfix):
	item = postfix.pop()
	if item == "*":
		operator = mul
	elif item == "/":
		operator = div
	elif item == "+":
		operator = add
	elif item == "-":
		operator = sub
	elif item == "^":
		operator = pow
	else:
		return item
	a, b = compute(postfix), compute(postfix)
	return operator(b, a)

print postfix
try:
	print compute(postfix)
except:
	print "Invalid expression!"


edit:
http://scriptasylum.com/tutorials/infix...

Zgodovina sprememb…

  • spremenil: ragezor ()


Vredno ogleda ...

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

Kalkulator

Oddelek: Programiranje
111236 (1003) lebdim
»

C# Menjalec Valut (EUR to ...)

Oddelek: Programiranje
71487 (1400) Goran's Blog
»

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

Oddelek: Programiranje
111097 (910) LeQuack
»

[C#] Reševanje domačih nalog

Oddelek: Programiranje
173064 (2568) krastača
»

Pomoč pri programčkih

Oddelek: Programiranje
152746 (2396) Mitja Bonča

Več podobnih tem