Forum » Programiranje » 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:
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
edit:
http://scriptasylum.com/tutorials/infix...
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | KalkulatorOddelek: Programiranje | 1331 (1098) | lebdim |
» | C# Menjalec Valut (EUR to ...)Oddelek: Programiranje | 1652 (1565) | Goran's Blog |
» | [C#] Operacija IN in ALI med dvema int številomaOddelek: Programiranje | 1186 (999) | LeQuack |
» | [C#] Reševanje domačih nalogOddelek: Programiranje | 3313 (2817) | krastača |
» | Pomoč pri programčkihOddelek: Programiranje | 2957 (2607) | Mitja Bonča |