Nie rozumiem, dlaczego to nie działa. Chcę wydrukować najwyższą wartość ujemną z szeregu dostarczonego przez użytkownika ujemnego INTS. E.G., wejścia użytkownika: -1, -5, -3, zwraca program -1. Ale mój program (poniżej) powraca -5. Dlaczego to? Czy mój kod jest całkowicie zawalony? Wiem, że mogę użyć listy i max wokół niego, ale nie chcę nadmiernie komplikować programu.

x = 0
done = False
while not done:
    y = int(input("Enter another number (0 to end): "))
    num = y
    if num != 0:
        if num < x:
            x = num
    else:
        done = True
print(str(x))
1
CoderBaby 27 czerwiec 2017, 15:36

4 odpowiedzi

Najlepsza odpowiedź

Twój operator powinien być większy niż >, nie mniejszy niż <, aby uzyskać maksymalną wartość. Inicjalizacja do -float('inf') zapewnia, że pierwsza wartość ujemna przekazuje stan:

x = -float('inf')
while True:
    num = int(input("Enter another number (0 to end): "))
    if num != 0:
        if num > x:
            x = num
    else:
        break
print(x)

Możesz wysunąć zmienną done, używając while True...break.


Wiem, że mogę użyć listy i max wokół niego, ale nie chcę nadmiernie komplikować programu.

Możesz to zrobić w jednej linii za pomocą iter za pomocą Sentinel 0, aby połączyć input wielokrotnie, zbieranie numerów negatywnych iterable. max zwraca maksimum:

max(map(int, iter(input, '0')))

demo :

>>> m = max(map(int, iter(input, '0')))
-3
-1
-4
-2
0
>>> m
-1
3
Moses Koledoye 27 czerwiec 2017, 15:57

Wystarczy użyć wbudowanego max, aby znaleźć maksymalną liczbę

numbers = []
done = False
while not done:
    number = int(input("Enter another number (0 to end): "))
    if number < 0:
        numbers.append(number)
    else:
        done = True

print(max(numbers)) 
1
hspandher 27 czerwiec 2017, 12:55

Nigdy nie porównujesz wprowadzonej wartości z największą wartością negatywną do tej pory. Ustawiasz również wartość początkowa do zera, która nie jest odpowiednią wartością wyników. Jednym ze sposobów obsługi to jest zastąpienie linii

if num < x
    x = num

Z

if num < 0 and (x == 0 or x < num < 0):
  x = num

Istnieją inne sposoby, w tym ustawienie x do najmniejszej możliwej liczby ujemnej. To uprościłoby swoje porównania, ponieważ w moim kodzie powyższy jest czek tylko dla x nigdy wcześniej nie ustawiony.

Należy pamiętać, że jeśli w ogóle nie ma negatywnego numeru, wynik wynosi zero. To może nie być tym, czego chcesz.

1
Rory Daulton 27 czerwiec 2017, 12:40

Cóż, wartość ujemna najwyższa jest taka sama jak wartość maksymalna maksymalna .

Teraz zapraszana pętla powinna być taka, że x jest tak daleko za obserwowaną maksymalną wartość . Ale faktycznie przechowujesz w ten sposób zaobserwowany wartość minimalną wartość : rzeczywiście, jeśli nowa wartość wynosi mniej niż, przypisujesz go do x.

Szybka poprawka jest zmiana do porównania do >. Ale teraz początkowe maksymalne będzie 0. Możemy to zmienić, ustawiając wartość początkową na instancję na przykład None, a jeśli x jest None, ustaw x do wprowadzonej wartości.

x = None
done = False
while not done:
    y = int(input("Enter another number (0 to end): "))
    num = y
    if num != 0:
        if x is None or num > x:
            x = num
    else:
        done = True
3
Willem Van Onsem 27 czerwiec 2017, 12:41