Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Πριν από καιρό έκανα και εγώ μια προσπάθεια για ένα πρόγραμμα με τις βασικές πράξεις και επειδή

είναι python ακολούθησα άλλη λογική και κατέληξα στον παρακάτω κώδικα

Προτάσεις για βελτίωση ή κράξιμο δεκτά :-)

import re
import math
from collections import deque
import sys
  
def main(a):
  result1=eval(a)
  a=parse_parentheseis(a) 
  result2=upologise(a)
  print(f'Ο κώδικάς σου υπολόγισε {result2} και τo σωστό αποτέλεσμα είναι {result1}')
  return 0

def f(a,s,:
  if s == '*-':
    return str(-(round(float(a) * float(,6)))
  elif s == '/-':
    return str(-(round(float(a) / float(,6)))
  elif s == '+' or s == '--':
    return str(round(float(a) + float(,6))
  elif s=='-' or s == '+-':
    return str(round(float(a) - float(,6))
  elif s=='*':
    return str(round(float(a) * float(,6))
  elif s=='/':
    return str(round(float(a) / float(,6))
  elif s=='**':
    return str(round(float(a) ** float(,6))
  else:
    return 'Αυτό δεν γίνεται'  
    
def parse_parentheseis(a):
  par=re.compile(r'\([^\(\)]+\)')
  find=par.search(a)
  while find:
    find=find.group()
    replacement=find
    replacement = replacement.strip('(')
    replacement = replacement.strip(')')
    replacement = upologise(replacement)
    a=a.replace(find,replacement)
    find=par.search(a)
  return a

def upologise (a):
  #pattern για τις πράξεις +-*/ 
  # Ψάχνω και διπλά για την περίπτωση που μετά τη αφαίρεση παρενθέσεων προκύψει *- ή /-
  symbol=re.compile(r'[\+\-\*/]{1,2}')
  args=symbol.split(a)
  # Εφόσον έχω πρόσημο ή προκύψει αυτό με την αφαίρεση παρενθέσεων
  # για τον 1ο αριθμό στην παράσταση, το split μου δίνει ένα '' ή ' ' και το μετατρέπω σε 0
  if args[0] == '' or args[0]== ' ': 
    args[0]='0'
  args=deque(args)
  symbols=symbol.findall(a) 
  symbols=deque(symbols)
  # Κάνω πρώρα τις πράξεις που έχουν προτεραιότητα */ με τη σειρά που τις συναντάω
  # από αριστερά προς τα δεξιά
  stack=[]
  stack.append(args.popleft())
  for i in range(len(symbols)):
    s=symbols.popleft()
    if s in '*/' or s=='*-' or s=='/-':
      result=f(stack.pop(),s,args.popleft())
      stack.append(result)
    else:
      stack.append(s)
      stack.append(args.popleft())
  # Κάνω τις προσθέσεις και αφαιρέσεις από αριστερά προς τα δεξιά
  stack=deque(stack)
  while len(stack)>1:
    first=stack.popleft()
    s=stack.popleft()
    second=stack.popleft()
    result=f(first,s,second)
    stack.appendleft(result)
  return stack.pop() 
main(sys.argv[1])

Η λογική που ακολουθώ είναι η εξής

εφόσον υπάρχουν παρενθέσεις κάνω πρώτα τις πράξεις μέσα στις παρενθέσεις  από μέσα προς τα έξω

και αφαιρώ τις παρενθέσεις

επειδή με την αφαίρεση των παρενθέσεων μπορεί να μείνει μέσα αρνητικός αριθμός ορίζω κάποιες πρόσθετες πράξεις το *- το /- το +- και το --

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...