Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.

1575/14246

20120327-Tue-komplexni-k.py
   1 #!/usr/bin/python
   2 # -*- coding: utf8 -*-
   3 # Soubor:  20120327-Tue-komplexhi-k.py
   4 # Datum:   20.03.2012 08:22
   5 # Autor:   Marek Nožka, nozka <@t> spseol <d.t> cz
   6 # Licence: GNU/GPL 
   7 # Úloha:   kalkulátor s poslkou reverzní notací
   8 #########################################
   9 
  10 import math, cmath, numpy, readline, sys
  11 
  12 zasobnik = []  # globální proměnná
  13 
  14 def Push(cislo):
  15     zasobnik.append(cislo)
  16 
  17 def Pop():
  18     if len(zasobnik)>0:
  19         return zasobnik.pop()
  20     else:
  21         return None
  22 
  23 
  24 tvarCisla = 'alg'
  25 def vypisZasobnik():
  26     global uhelFnc2deg
  27     if tvarCisla == 'alg':
  28         print zasobnik
  29     elif tvarCisla == 'exp':
  30         sys.stdout.write('[ ')
  31         for cislo in zasobnik:
  32             sys.stdout.write(' ')
  33             if type(cislo) == complex:
  34                 sys.stdout.write('({0}L{1})'.\
  35                         format(numpy.abs(cislo),uhelFnc2deg(numpy.angle(cislo))))
  36             else:
  37                 sys.stdout.write(cislo)
  38             sys.stdout.write(' ')
  39         sys.stdout.write(' ]\n')
  40 
  41 #################################################################
  42 def rad2rad(rad):
  43     return rad
  44 
  45 uhelFnc2rad = numpy.deg2rad
  46 uhelFnc2deg = numpy.rad2deg
  47 
  48 #################################################################
  49 funkce2operandy = None
  50 funkce1operand = None
  51 
  52 def plusObal(a,b):
  53     return a+b
  54 def minusObal(a,b):
  55     return b-a
  56 
  57 def druhaMocninaObal(a):
  58     return a*a
  59 
  60 def vypocet1operand():
  61     operandA = Pop()
  62     if operandA != None:
  63         vysledek = funkce1operand(operandA)
  64         Push(vysledek)
  65         print vysledek
  66     else:
  67         print 'CHYNA: nelze provést',polozka,'-- zásoník je prázdný'
  68 
  69 def vypocet2operandy():
  70     operandA = Pop()
  71     operandB = Pop()
  72     if operandA != None and operandB != None:
  73         vysledek = funkce2operandy(operandA,operandB)
  74         Push(vysledek)
  75         print vysledek
  76     else:
  77         print 'CHYNA: nelze provést','-- zásoník je prázdný'
  78         if operandA != None: # poslední číslo v zásobníku tam vrátím
  79             Push(operandA)
  80 
  81 def zpracujRadek(radek):
  82     global funkce2operandy
  83     global funkce1operand
  84     global uhelFnc2deg
  85     global uhelFnc2rad
  86     global tvarCisla
  87     vstupy = radek.split()  # získám pole vstupů
  88     for polozka in vstupy:  # procházím vstupy
  89         if polozka == '+':
  90             funkce2operandy = plusObal
  91             vypocet2operandy()
  92         elif polozka == '-':
  93             funkce2operandy = minusObal
  94             vypocet2operandy()
  95         elif polozka == '^2':
  96             funkce1operand = druhaMocninaObal
  97             vypocet1operand()
  98         elif polozka == 'p' or polozka == 'print':
  99             vypisZasobnik()
 100         elif polozka == 'd' or polozka == 'deg':
 101             uhelFnc2rad = numpy.deg2rad
 102             uhelFnc2deg = numpy.rad2deg
 103         elif polozka == 'r' or polozka == 'rad':
 104             uhelFnc2rad = rad2rad
 105             uhelFnc2deg = rad2rad
 106         elif polozka == 'a' or polozka == 'alg':
 107             tvarCisla = 'alg'
 108         elif polozka == 'e' or polozka == 'exp':
 109             tvarCisla = 'exp'
 110         elif polozka.count(',') == 1:
 111             try:
 112                 slozky = polozka.split(',')
 113                 cislo = float(slozky[0]) + float(slozky[1])*1j
 114                 Push(cislo)
 115             except:
 116                 print 'CHYBA: neznámý operand:', polozka
 117         elif polozka.count('L') == 1:
 118             try:
 119                 slozky = polozka.split('L')
 120                 uhel =  uhelFnc2rad( float(slozky[1]) )
 121                 cislo = float(slozky[0]) * cmath.exp(uhel*1j)
 122                 Push(cislo)
 123             except:
 124                 print 'CHYBA: neznámý operand:', polozka
 125         else:
 126             try:
 127                 cislo = float(polozka)  # převedu řetězec na číslo
 128                 Push(cislo)
 129             except:
 130                 print 'CHYBA: neznámý operand:', polozka
 131 
 132 
 133 ########################################################
 134 # hlavní programová smyčka
 135 while True:
 136     try:
 137         radek = raw_input('kalkulacka ->> ')
 138         zpracujRadek(radek)
 139     except EOFError:
 140         exit(0)
 141 
`--> stáhnout

Licence Creative Commons Valid XHTML 1.0 Strict Valid CSS! Antispam.er.cz Blog: Tlapicka.net