Informations de base Écrire le problème d'algorithme de l'automne 2018 en Python

Objectif

Problème d'origine

Le programme que j'ai écrit

--Un programme qui reçoit une expression entière, la calcule et renvoie une valeur

practice.py


Expression = []

formula = input("Veuillez saisir la formule:")

for j in range(len(formula)):
    Expression.append(formula[j])

Value = []
Operator = []
Priority = []

def calculation():
    OpCnt = 0
    Value.append(0)
    nest = 0

    #Partie analyse
    for i in range(len(Expression)):
        chr = Expression[i]
        if chr >= '0' and chr <= '9':
            Value[OpCnt] = 10 * Value[OpCnt] + int(chr)

        if chr == '+' or chr == '-' or chr == '*' or chr == '/':
            Operator.append(chr)
            if chr == '+' or chr == '-':
                Priority.append(nest + 1)
            else:
                Priority.append(nest + 2)

            OpCnt = OpCnt + 1
            Value.append(0)

        if chr == '(':
            nest = nest + 10

        if chr == ')':
            nest = nest - 10

    #Partie calcul
    while OpCnt > 0:
        ip = 0
        i = 1
        while i < OpCnt:
            if Priority[ip] < Priority[i]:
                ip = i
            i = i + 1
        chr = Operator[ip]
        if chr == '+':
            Value[ip] = Value[ip] + Value[ip + 1]
        if chr == '-':
            Value[ip] = Value[ip] - Value[ip + 1]
        if chr == '*':
            Value[ip] = Value[ip] * Value[ip + 1]
        if chr == '/':
            Value[ip] = Value[ip] / Value[ip + 1]
        i = ip + 1
        while i < OpCnt:
            Value[i] = Value[i + 1]
            Operator[i - 1] = Operator[i]
            Priority[i - 1] = Priority[i]
            i = i + 1
        OpCnt = OpCnt - 1
    return Value[0]

Démontons-le.

① Préparation

1-1. Faites entrer l'expression et enregistrez-la sous forme de caractères dans la liste d'expressions

practice.py



Expression = []

formula = input("Veuillez saisir la formule:")

for j in range(len(formula)):
    Expression.append(formula[j])

print(Expression)

--Lorsque vous entrez la formule 2 * (34- (5 + 67) / 8) donnée dans la question ...

console


['2', '*', '(', '3', '4', '-', '(', '5', '+', '6', '7', ')', '/', '8', ')']
1-2. Préparez trois listes vides

--Liste de valeurs: stocke la partie numérique de l'expression --Operator list: stocke la partie opérateur de l'expression

practice.py



Value = []
Operator = []
Priority = []

Ensuite, regardons la partie fonction.

② Traitement d'analyse et traitement arithmétique

practice.py


def calculation():
    OpCnt = 0
    Value.append(0)
    nest = 0

    #Partie de traitement d'analyse
    for i in range(len(Expression)):
        chr = Expression[i]
        if chr >= '0' and chr <= '9':
            Value[OpCnt] = 10 * Value[OpCnt] + int(chr)

        if chr == '+' or chr == '-' or chr == '*' or chr == '/':
            Operator.append(chr)
            if chr == '+' or chr == '-':
                Priority.append(nest + 1)
            else:
                Priority.append(nest + 2)

            OpCnt = OpCnt + 1
            Value.append(0)

        if chr == '(':
            nest = nest + 10

        if chr == ')':
            nest = nest - 10

    #Partie de traitement des calculs
    while OpCnt > 0:
        ip = 0
        i = 1
        while i < OpCnt:
            if Priority[ip] < Priority[i]:
                ip = i
            i = i + 1
        chr = Operator[ip]
        if chr == '+':
            Value[ip] = Value[ip] + Value[ip + 1]
        if chr == '-':
            Value[ip] = Value[ip] - Value[ip + 1]
        if chr == '*':
            Value[ip] = Value[ip] * Value[ip + 1]
        if chr == '/':
            Value[ip] = Value[ip] / Value[ip + 1]
        i = ip + 1
        while i < OpCnt:
            Value[i] = Value[i + 1]
            Operator[i - 1] = Operator[i]
            Priority[i - 1] = Priority[i]
            i = i + 1
        OpCnt = OpCnt - 1
    return Value[0]
2-1. Partie traitement de l'analyse

--Déterminez si la valeur stockée dans la liste d'expressions est un nombre, un opérateur ou une parenthèse --Déterminer l'ordre du traitement arithmétique --Le contenu de chaque liste à la fin de la partie de traitement d'analyse est le suivant


Value = [2, 34, 5, 67, 8]
Operator = ['*', '-', '+', '/']
Priority =[2, 11, 21, 12]

2-2. Partie traitement arithmétique

--Calculer dans l'ordre en fonction des valeurs de la liste Priorité --Set Value [0], qui contient le résultat final du calcul, comme valeur de retour. ――Dans cette formule, vous pouvez recevoir la valeur de 50,0.

Impressions

――C'était amusant ^^

Recommended Posts

Informations de base Écrire le problème d'algorithme de l'automne 2018 en Python
Essayez d'exécuter l'exemple de problème Python d'informations de base uniquement avec un navigateur
Ecrire des algorithmes A * (A-star) en Python
Ecrire le test dans la docstring python
Le 15e comment écrire un problème de référence en temps réel hors ligne en Python
Ecrire une méthode de cupidité simple en Python
Résolvez le problème maximum de sous-tableau en Python
Le 14ème problème de référence d'écriture en temps réel hors ligne en python
Le 18ème comment écrire un problème de référence en temps réel hors ligne en Python
17ème problème de référence d'écriture en temps réel hors ligne implémenté en Python
La première étape du problème de réalisation des contraintes en Python
Le 18ème problème d'écriture en temps réel hors ligne en Python
Conseils pour rédiger un aplatissement concis en python
Le 19ème problème d'écriture en temps réel hors ligne en Python
Résolvez le problème du sac à dos Python avec l'algorithme glouton
Tri de base en Python
Algorithme génétique en python
Ecrire Python dans MySQL
Algorithme en Python (méthode Bellman-Ford, Bellman-Ford)
Algorithme en Python (Dijkstra)
[Examen d'ingénieur d'information de base] J'ai écrit l'algorithme de la méthode de division mutuelle euclidienne en Python.
Résumé de l'algorithme de tri de base python (examen d'ingénieur d'information de base)
Ecrire des caractères dans l'illustration de la carte avec OpenCV python
Je veux écrire en Python! (3) Utiliser des simulacres
Ecrire un histogramme à l'échelle logarithmique sur l'axe des x en python
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
Ecrire des filtres Pandec en Python
Refactoring appris avec Python (Basic)
Trouver des erreurs en Python
Écrire une distribution bêta en Python
Algorithme en Python (jugement premier)
Ecrire python dans Rstudio (réticulé)
Reproduire la méthode de division mutuelle euclidienne en Python
Algorithme en Python (dichotomie)
Implémenter l'algorithme de Dijkstra en python
Tracer des informations géographiques en Python
Implémentation de l'algorithme de "Algorithm Picture Book" en Python3 (Bubble Sort)
Résolvez le problème japonais lors de l'utilisation du module CSV en Python.
Implémentation de l'algorithme «Algorithm Picture Book» en Python3 (tri sélectif)
Algorithme en Python (recherche de priorité de largeur, bfs)
Ecrire une dichotomie en Python
Obtenir l'API arXiv en Python
[Note] Projet Euler en Python (problème 1-22)
[Python] Résolution du problème d'importation dû à la différence des points d'entrée
Ecrire un schéma JSON avec Python DSL
Algorithme de tri et implémentation en Python
Python dans le navigateur: la recommandation de Brython
Enregistrez le fichier binaire en Python
Scraping avec Selenium en Python (Basic)
Frappez l'API Sesami en Python
Obtenez le chemin du bureau en Python
Ecrire un serveur HTTP / 2 en Python
Ecrire une fonction AWS Lambda en Python
ABC166 en Python A ~ C problème
Obtenez le chemin du script en Python
[Python] Connaissances de base utilisées dans AtCoder
Dans la commande python, python pointe vers python3.8
Développons un algorithme d'investissement avec Python 2