Max wert aus mehreren Double Werten ermitteln?

Babelfish  14.01.2024, 14:41

Die Sprache mit angeben, kann durchaus hilfreich sein.

Cuubi09571 
Fragesteller
 14.01.2024, 14:41

c#

4 Antworten

Max an sich nimmt nur 2 Argumente an:

C:\Users\...\Desktop\test.csx(5,19): error CS1501: Keine Überladung für die Max-Methode nimmt 3 Argumente an.
using static System.Console;

double a = 1.5, b = 2.2, c = 5.5, d = 8.22, e = 1.2, f = 5.2, g = 3.12;

double max = Math.Max(a, b, c <- FALSCH, EINER ZU VIEL);

WriteLine(max);

Alternativ dazu kannst du dir aber den Code so aufbauen:

using static System.Console;

double a = 1.5, b = 2.2, c = 5.5, d = 8.22, e = 1.2, f = 5.2, g = 3.12;

double max = Math.Max(Math.Max(a, Math.Max(b, Math.Max(c, Math.Max(d, Math.Max(e, f))))), g);

WriteLine(max);

Diese Schreibweise finde ich eher unsauber. Es ist aber an dir, zu entscheiden, wie du es willst. Was ich bevorzuge und deshalb empfehlen würde, ist Folgendes:

using static System.Console;
using System.Numerics;


double a = 1.5, b = 2.2, c = 5.5, d = 8.22, e = 1.2, f = 5.2, g = 3.12;


double max = MathMax(a, b, c, d, e, f, g);


WriteLine(max);


private T MathMax<T>(params T[] numbers) where T : INumber<T>
{
	if (!numbers.Any())
	{
		throw new Exception("Array hat keine Inhalte");
	}
	
	T lastMaxNumber = numbers[0]; // <- Irgendein Start Wert, habe mich für den ersten entschieden
	foreach (T number in numbers)
	{
		lastMaxNumber = lastMaxNumber > number ? lastMaxNumber : number;
	}
	
	return lastMaxNumber;
}
// Ergebnis = 8,22
// PS C:\Users\...> dotnet script C:\Users\...\Desktop\test.csx
// 8,22

Hier passiert Folgendes:

T[] ist ein Array. Allerdings erlaubt das params Keyword die Parameter einzeln zu setzen. Dann durchläuft die Schleife den Array. Math.Max kann weder Überladung, noch ist es generisch. Das bedeutet, man muss mit einer eigenen Lösung her. Diese besteht aus der if Abfrage lastMaxNumber > number ? lastMaxNumber : number;. Wenn lastMaxNumber größer ist, als number, gebe es wieder zurück, ansonsten nehme number. Das geht so lange, bis man bei dem Max Wert ankommt. Dieser bleibt dann in lastMaxNumber und wird zurückgegeben. Es ist sinnvoll T lastMaxNumber mit dem index 0 des Arrays zu starten, da wenn man den Wert 0 angibt, auch Minus Zahlen dabei sein könnten, wobei man das Ergebnis verfälscht.

Wahrscheinlich ist die Funktion in C++ nicht templated, und es existieren keine entsprechenden Überladungen.

Das kannst du aber in einer extra Funktion mit einer ganz einfachen Rekursion lösen, indem du die Elemente einzeln miteinander in 2er paaren Vergleichst und dir immer das geößere merkst.

Cuubi09571 
Fragesteller
 14.01.2024, 14:40

ist c# aber danke, werde es ausprobieren

0
Valentin1720653  14.01.2024, 14:42
@Cuubi09571

Funktioniert auch dort.

Einfach alle Elemente in einem Array speichern, eine For-Schleife über alle Elemente gehen und das i-te mit dem i+1 Element Vergleichen, und das grösere Element merken in einer extra variable.

Alternativ kannst du auch einfach die Sortierfunktion benutzen und das letzte element ausgeben. Ist zwar etwas langsamer weil die in 9(n*Logn) läuft und nicht in O(n), ist bei so wenigen Werten aber total egal

0

Eine Idee wäre ein Schleife wie hier mal an Python3 als Beispiel gezeigt.

l = [2.5, 10.5, 7.3, 4.0] 
maximum = l[0]
for i in l:
  if i > maximum:
    maximum = i
print(f'Das maximum ist: {maximum}')
Woher ich das weiß:Studium / Ausbildung – Informatikstudent

C# ist nicht meine Baustelle aber Enumerable.Max sollte das bieten.

double max = new [] { 1, 2, 3 }.Max();

https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.max?view=net-8.0

https://code-maze.com/csharp-array-maximum-value/

Woher ich das weiß:Berufserfahrung – Entwickle Anwendungen für iOS, iPadOS und macOS beruflich.
Cuubi09571 
Fragesteller
 14.01.2024, 15:07

hat geklappt, danke

1