0
votes

Mes redevances pour mes boucles ont l'air étrange, est-ce normal? (Python 2)

J'essaie de créer des boucles lorsque certaines conditions sont remplies et jusqu'à présent, cela fonctionne, mais lorsque j'essaie de créer plus de conditions, je dois les indenter encore plus pour que mon programme puisse travailler.

def terrain(surface):
    surface = raw_input("What surface will you be driving on? ")
    while surface != "ice" and surface != "concrete" and surface != "soil" and surface != "asphalt" :
        surface = raw_input("Surface not valid. Please enter a valid surface: ")
    if surface == "ice":
                u = raw_input("what is the velocity of the car in meters per second? ")
                u = int(u)
                while int(u) < 0:
                    u = raw_input("Velocity must be a positive integer: ")
                                while int(u) == 0:
                                    u = raw_input("Velocty must be a number greater than zero: ")
                        while int(u) > 72:
                                                                u = raw_input("This vehicle cannot reach this speed: ")
                a = raw_input("How quickly is the vehicle decelerating? ")
                a = int(a)
                while int(a) > 0:
                    a = raw_input("Deceleration cannot be a positive integer: ")
                else: 
                        s1 = u**2
                        s2 = 2*.08*9.8
                    s = s1/s2
                    print "This is how far the vehicle will travel on ice: "
                    print ("The vehicle will travel %i meters before coming to a complete stop" % (s))
terrain("ice")


12 commentaires

Qu'est-ce que vous voulez dire exactement par sans les tirs sauvages ? Si vous devez utiliser une boucle ou un si instruction, vous devez utiliser avec obligation d'indenter. C'est une condition de langue.


Python s'appuie sur des tirets pour comprendre quel code appartient à quelle déclaration / boucle / fonction / classe. En ce qui concerne les lignes 12 et 13, ils peuvent être déplacés d'un indent et de la ligne 15 peuvent être déplacés 9 en retrait.


en surface! = "glace" et surface! = .... est déroutant. Pensez à utiliser valide_surface = ['glace', "béton" ... ] , puis tandis que la surface n'est pas dans valide_surface: . Je crois que le bloc d'entier devrait être indenté une seule fois


@Suvenpandee ce que je veux dire, c'est que lorsque je veux créer une autre boucle pour mon programme, je dois créer une ligne encore plus indente sous la boucle déjà en retrait, comme vous pouvez le constater ci-dessus pour la boucle tandis que. Je voulais créer une troisième boucle pour la variable "U" juste en dessous de la précédente et ça continue à me donner une erreur d'indentation, peu importe la distance que je déplace la ligne.


@ PythonStudent23 est-ce le code exact que vous essayez avec tous les tirets exactement comme ci-dessus?


@Suvenpandey oui


Pouvez-vous s'il vous plaît inclure pseudocode dans votre question de ce que vous essayez? comme si (surface est de la glace) {Obtenir la valeur pour U, si (u <0) affichez le message d'erreur} else {faire ceci}


@Suvenpandey Je n'ai jamais écrit dans pseudocode avant, mais je veux juste ajouter une ligne qui fonctionne comme ce que vous mettez. Une boucle qui fonctionne comme: si (surface est de la glace) {entrez la valeur pour U}, puis {entrez la valeur pour A}. Alors que (un <-55) invite l'utilisateur à essayer à nouveau


@ PythonStudent23 J'ai demandé pseudocode parce que votre code m'a sérieusement confus. Vous avez else Bloquer ci-dessous pendant un> 0 par ce sinon voulez-vous dire si la surface n'est pas de la glace ou < code> si A n'est pas> 0


Je vous suggère d'utiliser une IDE appropriée (telle que la version gratuite de Pycham) au lieu d'utiliser un éditeur de texte, surtout si vous êtes nouveau à Python. Il vous dérangera correctement pour vous.


@SuvenPandey L'autre est pour quand les entrées utilisateur passent les conditions. "Si les entrées de l'utilisateur sont d'accord avec ces conditions, faites cela, sinon faites ceci"


Vérifiez la réponse que j'ai postée ci-dessous et voyez si cela a du sens pour vous.


3 Réponses :


0
votes

Voici ce que je comprends bien si je me trompe:
1. Obtenez de la valeur pour la surface de
2. Si (la surface est invalide) Demandez une autre valeur de
3. Si (la surface est de la glace):
une. Obtenir de la valeur pour vous
b. Obtenir de la valeur pour un
c. Calculez S Utilisation de la formule
s1 = u ** 2
S2 = 2 * 0,08 * 9.8
s = s1 / s2
ré. Afficher s 4. Si la surface n'est pas de la glace, ne rien faire (selon le code que vous avez posté, mais il peut être édité d'avoir des blocs similaires tels que si surface == "sol" ) Si oui, alors xxx

je définis généralement une fonction comme: xxx

et utilisez-le comme: xxx < / Pré>

Vous devrez peut-être modifier certaines choses telles que Changer variable = int (variable) à variable = float (variable) si vous devez accepter flottant ( telle que 1,25) valeur.


6 commentaires

Lorsque j'exécute ce code, la déclaration d'impression "Ce véhicule ne peut pas avoir cette décélération" fonctionne comme une boucle infinie. Je l'ai changé à un Raw_Input et je l'ai réparé. Ce code a l'air bien mais quand je vais arriver à la "décélération ne peut pas être une partie entière positive", il continue d'aller quoi que ce soit.


@ pythonstudent23 Vous devrez avoir un autre Raw_Input à l'intérieur de chaque instruction


Notez également que donner une entrée non INT (comme Apple) provoque la relever Exception de ValueError pour que vous puissiez vouloir gérer cela.


Ouais c'est la partie que j'ai corrigée. Mais maintenant, la seule question que j'ai est le fait qu'il continue à répéter cette partie, peu importe ce que je tape. Même si la valeur de décélération est acceptable.


Je l'ai réellement corrigé. Je viens de passer le "A" avec Int (A) dans la déclaration tandis que.


Comment puis-je éviter que ValueError? Une autre condition, peut-être?



0
votes

Il y a beaucoup de problèmes avec votre code, je vais souligner certains d'entre eux. Aussi, vous devriez commencer à utiliser Python3.x au lieu de Python2 Vous pouvez également analyser l'entrée que vous prenez de l'utilisateur comme int (brut_input ("xyz")) code>
Garder tout ce qui précède à l'esprit, le code ci-dessous devrait fonctionner

import sys

def terrain():
    surface = raw_input("What surface will you be driving on? ")
    vel = -1
    while surface != "ice" and surface != "concrete" and surface != "soil" and surface != "asphalt" :
        surface = raw_input("Surface not valid. Please enter a valid surface: ")
    if surface == "ice":
        vel = int(raw_input("what is the velocity of the car in meters per second? "))
    while vel < 0:
        vel = int(raw_input("Velocity must be a positive integer: "))
    while vel == 0:
        vel = int(raw_input("Velocty must be a number greater than zero: "))
    while vel > 72:
        vel = int(raw_input("This vehicle cannot reach this speed: "))
    acc = int(raw_input("How quickly is the vehicle decelerating? "))
    while acc > 0:
        acc = int(raw_input("Deceleration cannot be a positive integer: "))

    s1 = vel**2
    s2 = 2*.08*9.8
    s = s1/s2
    print ("This is how far the vehicle will travel on ice: ")
    print ("The vehicle will travel %i meters before coming to a complete stop" % (s))

terrain()


2 commentaires

Je prévois de combiner mon programme avec le module Tkinter de quelqu'un d'autre pour que je ne veuille pas que le système () puisse mettre fin à l'ensemble du programme simplement parce qu'une condition est remplie. Je voulais aussi que les messages d'erreur soient en boucle, d'où les déclarations de temps.


Mise à jour. Vérifiez s'il vous plaît!



0
votes
  1. Chaque fois que vous tiriez en retrait, vous devez toujours ajouter la même quantité d'indentation. Il n'est pas nécessaire d'utiliser 4 espaces d'indentation au même endroit et d'utiliser 12 espaces quelque part d'autres. La convention la plus courante est d'utiliser 4 espaces. Li>
  2. Ajoutez un niveau d'indent lors du démarrage d'un nouveau bloc, c'est-à-dire la ligne qui suit une ligne qui se termine par un côlon. Li>
  3. Lors de la fin d'un bloc, la ligne suivante doit aligner avec le mot-clé qui a commencé ce bloc. Bien sûr, cela peut signifier qu'il repose plus d'un niveau si plus d'un bloc se termine en même temps. Li>

    C'est ce que votre code pourrait ressembler sans les erreurs de syntaxe liées à l'indentation: P>

    def terrain(surface):
        surface = raw_input("What surface will you be driving on? ")
        while surface != "ice" and surface != "concrete" and surface != "soil" and surface != "asphalt" :
            surface = raw_input("Surface not valid. Please enter a valid surface: ")
        if surface == "ice":
            u = raw_input("what is the velocity of the car in meters per second? ")
            u = int(u)
            while int(u) < 0:
                u = raw_input("Velocity must be a positive integer: ")
                while int(u) == 0:
                    u = raw_input("Velocty must be a number greater than zero: ")
                while int(u) > 72:
                    u = raw_input("This vehicle cannot reach this speed: ")
            a = raw_input("How quickly is the vehicle decelerating? ")
            a = int(a)
            while int(a) > 0:
                a = raw_input("Deceleration cannot be a positive integer: ")
            else: 
                s1 = u**2
                s2 = 2*.08*9.8
                s = s1/s2
                print "This is how far the vehicle will travel on ice: "
                print ("The vehicle will travel %i meters before coming to a complete stop" % (s))
    terrain("ice")
    

0 commentaires