-3
votes

plus grand et deuxième plus grand nombre par python

J'ai récemment commencé à apprendre à coder avec python. Dans ce code, je veux trouver le plus grand et le deuxième plus grand nombre d'entrée (l'âge des membres du corps professoral d'une université). Cependant ça ne marche pas! Je ne sais pas où est le problème! Merci d'avance.

oldest = 0
oldest2 = 0
for i in range (100):
    age = int(input())
    if age > oldest :
        oldest = age
    age = int(input())
    if age > oldest2 and age < oldest: 
        oldest2 = age
  
    if age == -1:
        break
print (oldest, oldest2)


4 commentaires

"Ça ne marche pas!" Comment ça ne marche pas? Quelle est votre sortie actuelle (étant donné une certaine entrée), et qu'attendez-vous comme sortie? Veuillez compléter votre question.


@ 00 Je soutiens votre tentative de faire de cette question une meilleure question, mais cela ne nécessite pas la sortie attendue pour comprendre pourquoi ce code échouerait. C'est assez évident, vraiment.


@MarkRansom Oui, c'est peut-être un détail mineur, mais une bonne pratique dans l'ensemble. Cela correspond parfaitement aux autres exigences.


@ 00 étant donné le nombre de fois que vous avez essayé de faire les choses correctement, ce n'était peut-être pas aussi évident que je le pensais!


5 Réponses :


1
votes

Vous obtenez des âges deux fois par boucle et ne considérez qu'une des deux options pour chacune. Au mieux, vous pourriez avoir à moitié raison. Au lieu de cela, laissez python faire le travail pour vous. Vous pouvez rassembler les âges dans une liste, trier puis extraire les nombres.

ages = []
while True:
    next_val = int(input())
    if nex_val == -1:
        break
    ages.append(next_val)
ages.sort()
print(ages[-2:])


5 commentaires

Je me trompe peut-être ici, mais je suppose que comme il s'agit d'un débutant, ils pourraient l'avoir comme exercice pour implémenter réellement cela


Cela change la fonctionnalité. Comment pourraient-ils court-circuiter et sortir avant que 100 âges ne soient entrés? Cela n'explique pas non plus pourquoi vous avez utilisé le code que vous avez utilisé, ni ce que signifient des choses comme [-2:] . C'est une question assez débutante donc je me concentrerais sur expliquer pourquoi plutôt que de simplement dire "fais ceci et ça marchera".


@RandomDavis - Correction de la sortie anticipée. les listes, le tri et le découpage sont tous des python extrêmement basiques qui devraient être une première partie de l'apprentissage. J'ai dit à l'utilisateur ce qui n'allait pas, mais je ne pensais pas que jouer simplement avec le code existant était la meilleure façon de procéder. Vous pouvez publier un correctif sur le code existant comme autre exemple de ce qu'il faut faire.


@Tomerikoo - Mais comme exercice, ne devrions-nous pas appliquer les ensembles d'outils de base disponibles?


Je serai le dernier à discuter de cela. C'est juste que souvent ici les gens viennent avec des restrictions par les enseignants / exercices. Je suis tout à fait d'accord avec vous pour dire que ces restrictions n'ont aucun sens car un bon programmeur doit savoir comment utiliser les outils déjà à sa disposition. Vous pourriez soutenir que c'est une bonne pratique de mettre en œuvre à partir de zéro ...;)



0
votes

Ce qui suit devrait fonctionner. Ce n'est qu'une légère variation de ce que vous avez déjà. Êtes-vous à la recherche de la manière optimale d'atteindre votre résultat ou avez-vous un ensemble d'exigences spécifiques?

[40, 20]
[90, 40]
[100, 90]
[30, 30]

Avec ce qui suit comme données de test

[10, 20, 40, 20, 5]
[10, 90, 40, 20, 5]
[100, 100, 90]
[30, 30]

les résultats sont

oldest = 0
oldest2 = 0
for i in range (100):
    age = int(input())
    if age > oldest:
        oldest2 = oldest
        oldest = age
    elif age > oldest2 and age != oldest:
        oldest2 = age

    # This is in case you have faculty members that are all the same age
    # We assume none of them are age 0
    if oldest2 == 0:
        oldest2 = oldest

    if age == -1:
        break
print (oldest, oldest2)


11 commentaires

Votre dernier test pour le plus oldest2 == 0 suppose qu'il y a plus d'une entrée.


Merci beaucoup qui a été vraiment utile.


Je ne peux pas comprendre les différences entre les 2 codes suivants


@MarkRansom S'il n'y a qu'une seule entrée, disons 29, la sortie sera 29, 29. Comme le plus oldest2 sera 0, il sera alors réglé sur la même valeur que le oldest . Bien sûr, je ne sais pas si c'est le comportement souhaité car il n'est pas indiqué ci-dessus.


@elhamzohrehvand qui suit deux codes, le mien et le vôtre?


@Stu désolé je voulais dire (votre code) et (votre code sans commande elif)


Mon hypothèse sans instructions contraires serait qu'avec une seule entrée, il n'y aurait qu'une seule sortie.


@elhamzohrehvand Lorsque l' elif est atteint, nous savons que l' age n'est pas supérieur au oldest . Nous vérifions donc d'abord si l'âge est supérieur au plus oldest2 , car si c'est le cas, il doit s'agir du deuxième âge le plus âgé, sauf cependant si l' age est le même que le oldest . Cela fait [100, 90, 100] devenir [100, 90] , sans ce serait [100, 100] . Quel est votre résultat souhaité lorsqu'il n'y a qu'une seule entrée?


@Stu Merci beaucoup! Je le comprends totalement maintenant. Il y a plus d'une faculté!


Comme vous pouvez le voir dans vos exemples de test, votre code ne parvient pas à faire le travail. L'avant-dernier exemple doit renvoyer [100, 100], car ce sont les deux plus grandes instances d'âge.


Peut-être que @PixelRayn, j'ai interprété "le plus grand et le deuxième plus grand nombre entré" comme signifiant deux nombres différents. Si la question avait dit "deux plus grands" alors j'aurais opté pour [100, 100] . Comme vous pouvez le voir, je mentionne dans un commentaire ci-dessus au PO les résultats [100, 100] et [100, 90] .



0
votes
first_oldest = 0
second_oldest = 0

while True:

    age = int(input())
    if age != -1:

        if age > first_oldest:
            second_oldest = first_oldest
            first_oldest = age

        elif second_oldest < age < first_oldest:
            second_oldest = age

        if second_oldest == 0:
            second_oldest = first_oldest
    else:
        break

print(first_oldest, second_oldest)

0 commentaires

0
votes

J'ai essayé de ne pas trop changer votre code, même si je peux littéralement coder ce que vous voulez avec 6 ou 8 lignes de code. c'est pourquoi je ne vais pas vous donner la ligne de code 6 ou 8, je vais vous laisser le soin de défier vos compétences en python et de l'améliorer et cela pourrait être un peu trop complexe si c'est vraiment ce que vous allez car mais c'est ce qui a fait sens pour moi en lisant votre code.

oldest = 0
oldest2 = 0
for i in range(2):
    age = int(input("enter age"))
    if age > oldest:
        oldest = age

    second_age = int(input("enter age"))
    if second_age > oldest2 :
        oldest2 = second_age

    if age <= 0:
        print("there is no such age for a human")
        break
        

if oldest != 0 and oldest2 != 0:
    print(f"oldest age is:{oldest} \n second oldest age is: {oldest2}")```


0 commentaires

0
votes

Il existe plusieurs approches ici, certaines sont plus rapides, d'autres plus expressives. J'utiliserai deux approches ici.

Définissons une fonction qui prendra une liste d'entiers, trouver les deux plus grands nombres et les renvoyer sous forme de tupil.

Dans la première approche, nous trions la liste de bas en haut et renvoyons les deux derniers nombres:

def get_input():

    input_list = list() # Creates am empty list

    input_str = ""

    while input_str != "-1": # This only works in python
        input_str = input("In: ")
        input_list.append(int(input_str))

    return input_list

La deuxième approche consiste à parcourir tous les nombres et à vérifier s'ils sont plus grands que le dernier plus grand nombre que vous avez trouvé.

Puisque vous n'attendez que des nombres positifs, nous pouvons définir notre base de référence sur 0

def get_largest(input):

    oldest = 0
    second_oldest = 0
    
    for age in input:
        
        if age >= oldest:
            second_oldest = oldest
            oldest = age
        elif age > second_oldest:
            second_oldest = age

    return oldest, second_oldest

Vous pouvez maintenant écrire une fonction qui obtient une liste d'entrée. Je suppose que l'utilisateur n'entre que des nombres valides:

def get_largest(input):
    input.sort()
    return input[-1], input[-2]


0 commentaires