Maximum aus einer Liste von Zahlen auswählen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Roland70
User
Beiträge: 1
Registriert: Donnerstag 26. März 2020, 18:41

Hallo,

ich bin Anfänger in der Programmierung, erst seit einer Woche dabei.

Folgende Aufgabe ist zu bearbeiten (und Nein, ich möchte nicht, dass jemand meine Hausaufgaben macht, sondern ich brauche eine Hilfestellung, um einen Ansatz zu finden).

Gegeben ist die Liste list = [5,9,3,1,7].

Geschrieben werden soll nun eine Funktion, die den Wert des größten Eintrags ausgibt.

max(list) leistet natürlich das Gewünschte, ist aber nicht das, was gefragt ist.

Ich möchte also, dass die Funktion nacheinander die Einträge prüft und das könnte so aussehen:

Die erste Zahl in der Liste ist die 5. Dann nehmen wir also 5 als Startwert. Die Funktion speichert sich also die 5 ab als vorläufig höchsten Wert (hier brauche ich einen Tipp, wie ich das programmieren kann).
Dann geht die Funktion zum nächsten Eintrag der Liste, der 9 und prüft, ob 9 > 5 ist. Ist dies der Fall, so wird die 9 als höchsten Wert abgespeichert. (Auch dieses Durchlaufen der Liste und nacheinander abprüfen kann ich leider nicht programmieren)
Dann wird der dritte Eintrag überprüft: ist 9>3? Da dies der Fall ist, speichert die Funktion weiterhin 9 als höchten Wert und verfährt so mit allen Einträgen.

Nachdem der letzte Eintrag geprüft wurde, möchte ich, dass die Funktion den Wert des größten Eintrags ausgibt, hier also 9.

Ich würde mich sehr über Hilfe freuen.

Liebe Grüße
Roland
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du brauchst dafuer for-schleifen, und Zugriff auf eine Liste mittels Index, sowie eine if-Abfrage. Ich bin mir sicher, das habt ihr schon gemacht.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wobei man den Indexzugriff nicht benötigt. Denn der aktuelle Wert ist im jeweiligen Schleifendurchlauf bekannt. Der höchste Wert auch, da er sich "gemerkt" wird. Der Vergleich ist "aktuell > Maximum" und geht daher problemlos ohne Indexzugriff. Und bei der späteren Ausgabe braucht man den auch nicht, da man ja den Wert gespeichert hat und nicht etwa den Index. Oder übersehe ich etwas...?

@Roland70
Schreib doch erstmal eine Schleife, die nacheinander stumpf die einzelnen Werte einer Liste ausgibt. Dadurch beschäftigst du dich bereits mit for-Schleifen und der Funktion für die Bildschirmausgabe. Ich verrate sie hier nicht, aber sie ist in den meisten Programmiersprachen genau so oder relativ ähnlich benannt. Wenn du das geschafft hast, dann kannst du wahlweise den bisherigen Code hier zeigen oder schon von selbst die Sache mit dem Maximum mit in die vorhandene Schleife einbauen. Dann zeigt sie immer das aktuelle Maximum als Ausgabe an. Und am Ende überlegst du dir, wie man die Ausgabe nur einmal, wenn das Maximum aus allen Zahlen bekannt ist, anzeigen lassen könnte...
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Index? ``for``-Schleife? Unsinn! 😜

Code: Alles auswählen

#!/usr/bin/env python3
from functools import reduce


def max(items):
    return reduce(lambda a, b: a if a > b else b, items)


def main():
    print(max([5, 9, 3, 1, 7]))


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Roland70 hat geschrieben: Freitag 27. März 2020, 15:01 Gegeben ist die Liste list = [5,9,3,1,7].

Code: Alles auswählen

# NIEMALS in Python eine Liste den Variablennamen list zuweisen! Damit überschreibst du die gleichnamige Funktion!
daten = [5,9,3,1,7]
Die erste Zahl in der Liste ist die 5. Dann nehmen wir also 5 als Startwert. Die Funktion speichert sich also die 5 ab als vorläufig höchsten Wert (hier brauche ich einen Tipp, wie ich das programmieren kann).

Code: Alles auswählen

# Zugriff auf das erste Element einer Liste durch index 0
wert = daten[0]
Dann geht die Funktion zum nächsten Eintrag der Liste, der 9 und prüft, ob 9 > 5 ist. Ist dies der Fall, so wird die 9 als höchsten Wert abgespeichert. (Auch dieses Durchlaufen der Liste und nacheinander abprüfen kann ich leider nicht programmieren)

Code: Alles auswählen

# in Python iteriert man über alle Elemente einer Liste pythonisch so:
for element in liste:
    # zum prüfen benötigt man eine if-abfrage
    if element > wert:
        # hier dann die Zuweisung des größten Wertes
Nachdem der letzte Eintrag geprüft wurde, möchte ich, dass die Funktion den Wert des größten Eintrags ausgibt, hier also 9.

Code: Alles auswählen

# dazu gibt es in Python die print() Funktion.
print(grösster_wert)
Ich würde mich sehr über Hilfe freuen.

Liebe Grüße
Roland
VG Thomas
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Okay, jetzt schnall ich auch das mit dem Indexzugriff. War wohl noch etwas früh für mich...

@BlackJack
In einem Paralleluniversum, wo Python keine max()-Funktion eingebaut hat, würde ich das wahrscheinlich sogar mit reduce() lösen. Und zwar genau so wie du es gezeigt hast.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@ThomasL: was hast du an "und Nein, ich möchte nicht, dass jemand meine Hausaufgaben macht" nicht verstanden?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich möchte lösen — in Tcl:

Code: Alles auswählen

#!/bin/sh
# \
exec tclsh "$0" "$@"

proc max {items} {
    set result [lindex $items 0]
    foreach item $items {
        if {$item > $result} {set result $item}
    }
    return $result
}

proc main {} {
    puts [max {5 9 3 1 7}]
}

if {$argv0 eq [info script]} {
    main
}
😎
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

$ echo 5 9 3 1 7 | awk '{for (i=1; i<=$NF; ++i) if ($i>max) max=$i}; END {print max}'
Alternativ:

Code: Alles auswählen

$ echo 5 9 3 1 7 | awk '{for (i = 1; i <= $NF; ++i) max = $i > max ? $i : max}; END {print max}'
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Das dürfte nur funktionieren wenn das Maximum >0 ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Ich würde es ja so lösen: :)

Code: Alles auswählen

#!/usr/bin/env dc
5 9 3 1 7
[q] sx

[lu lb x] sc 

[
    z 1 =x
    su sv
    lv lu
    >c
    lv
    lb x
] sb lb x

p
(Geht vielleicht auch etwas einfacher, aber Stack-basierte Programmierung fällt mir gar nicht so leicht...)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man braucht keine if-Abfragen, for-Schleifen und auch keinen Index, wenn man die Liste sortieren lässt. Ich denke aber nicht, dass die Aufgabe so gemeint war. Könntet man höchstens für mögliche Bonuspunkte anmerken. ;)

Code: Alles auswählen

sorted(values).pop()
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

__blackjack__ hat geschrieben: Samstag 28. März 2020, 14:17 @snafu: Das dürfte nur funktionieren wenn das Maximum >0 ist.
Stimmt. Nicht definierte Werte werden in diesem Kontext von awk wie eine Null behandelt. Es muss also mindestens eine positive Zahl mit drin sein (oder zumindest eine Null), damit es ein korrektes Ergebnis liefert.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sirius3 hat geschrieben: Samstag 28. März 2020, 11:38 @ThomasL: was hast du an "und Nein, ich möchte nicht, dass jemand meine Hausaufgaben macht" nicht verstanden?
@Sirius ein völlig unnötiger Kommentar, hätte ich von dir nicht erwartet. Ich unterstelle dir auch nicht blöd zu sein, im Moment denke ich eher anderes. Zur Lösung seiner Aufgabe muss er es erstmal schaffen die Teile zu einem funktionierendem Ganzen zusammen zu setzen. Es sind genug Hürden eingebaut. Aber gerne überlasse ich es dem Threadstarter Roland die Beurteilung, ob er meine Hinweise als Lösung seiner Aufgabe ansieht.

@Roland Ich bitte dich um ein Feedback welche der zahlreichen Antworten dir am meisten geholfen hat.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
bitmastah
User
Beiträge: 6
Registriert: Donnerstag 19. März 2020, 15:19

aaalso, wenn wir schon am rumblödeln sind: :D

Code: Alles auswählen

static void Main(string[] args)
{
    List<int> range  = new List<int>() { 5, 9, 3, 1, 7 };
    int max = 0;
    range.ForEach(x => { max = x >= max ? x : max;  });
    Console.WriteLine(max);
}
Days of coding saves you hours of planing
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

@snafu: Hier mal ein Alternativvorschlag für AWK

Code: Alles auswählen

echo 5 9 3 1 7 | awk 'BEGIN{RS=" "} {if ($1>max) max=$1} END{print max}' 
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

nezzcarth hat geschrieben: Sonntag 29. März 2020, 08:23 @snafu: Hier mal ein Alternativvorschlag für AWK
Wobei auch dieser Ansatz nicht für negative Werte funktioniert. Das lässt sich aber ausbessern:

Code: Alles auswählen

$ echo -5 -9 -3 -1 -7 | awk -v max=-inf 'BEGIN{RS=" "} {if ($1>max) max=$1} END{print max}'
-1
Leider klappt (zumindest bei meiner awk-Version) das direkte Setzen von "inf"/"-inf" bzw inf/-inf im Skript nicht. Außer der Option auf der Kommandozeile kann ich mir als Workaround das -inf nur als Rückgabe eines Funktionsaufrufs holen. Zum Beispiel so:

Code: Alles auswählen

awk 'BEGIN{RS=" "; max=log(0)} {if ($1>max) max=$1} END{print max}'
Und wie das manchmal so ist, hat sich kurz nach Abschicken des Problems auch schon die elegantere Lösung gefunden:

Code: Alles auswählen

$ echo -5 -9 -3 -1 -7 | awk 'BEGIN{RS=" "; max=int("-inf")} {if ($1>max) max=$1} END{print max}'
-1
Antworten