Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kleinsten Wert ermitteln - leider kommt immer 0 aus der SUB
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Muecke
Gast





BeitragVerfasst am: 07.01.2014, 23:15    Titel: Kleinsten Wert ermitteln - leider kommt immer 0 aus der SUB Antworten mit Zitat

Hallo miteinander,

ich möchte aus einem Arrey den Kleinsten wert ermitteln.

Kann mir jemand sagen warum die Übergabe meines Wertes Single nicht klappt.
ich bekomme immer den Wert 0 zurück traurig und nicht das was die SUB ermittelt hat. traurig

das ist der Code:
Code:
Declare Sub KKleinste (KKleinste_Array() AS String, Wert As single)
Dim As String XWerte(5)
Dim As Single KKWert

XWerte(1) = "Y\X"
XWerte(2) = "-1.001"
XWerte(3) = "-0.750"
XWerte(4) = "1.000"
XWerte(5) = "10.215"

KKleinste XWerte(), KKWert
Locate 2,1: Print "KKWert nicht in der Sub = ";KKWert
Sleep

Sub KKleinste (KKleinste_Array() AS String, Wert As Single)
   Dim As Single  Aktueller_Arrey_Wert
   
   For i As Integer = LBound(KKleinste_Array) To UBound(KKleinste_Array)
      Aktueller_Arrey_Wert = Val(KKleinste_Array(i))
      If  Aktueller_Arrey_Wert < Wert Then Wert = Aktueller_Arrey_Wert
   Next
   
   Locate 1,1: Print "KKWert       in der Sub = "; Wert
End Sub
Nach oben
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.01.2014, 23:20    Titel: Antworten mit Zitat

Du übergibst KKWert By Value statt By Reference, d.h. auch nach dem Aufruf hat die Variable noch denselben Wert wie vorher.

Außerdem wird dein Programm maximal immer 0 zurückgeben, da KKWert mit 0 initialisiert wird und somit ein größeres Minimum als 0 niemals gefunden wird. Sinnvoller wäre es, das Ergebnis nicht als Sub-Parameter zu übergeben, sondern als Funktions-Rückgabewert, und es zudem mit dem ersten Wert im Array zu intialisieren statt mit 0 (alternative mit +Unendlich, aber kA wie das in FreeBASIC geht).
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Muecke
Gast





BeitragVerfasst am: 07.01.2014, 23:33    Titel: Antworten mit Zitat

an so was wie eine Funktion habe ich auch schon gedacht jedoch noch nie gemacht traurig daher erst mal der Weg mit der SUB lächeln

danke für das mit dem "ByRef"

jetzt muss ich mich um die 0 Kümmern da habe ich nicht dran gedacht traurig da meine liste für die ich das gerade mache immer mit - werten begibt lächeln doch das muss nicht so sein lächeln



das ist der Code mit dem es Klappt lächeln


Code:
Declare Sub KKleinste (KKleinste_Array() AS String, ByRef Wert As single)
Dim As String XWerte(5)
Dim As Single KKWert

XWerte(1) = "Y\X"
XWerte(2) = "-1.001"
XWerte(3) = "-0.750"
XWerte(4) = "1.000"
XWerte(5) = "10.215"

KKleinste XWerte(), KKWert
Locate 2,1: Print "KKWert nicht in der Sub = "; KKWert
Sleep

Sub KKleinste (KKleinste_Array() AS String, ByRef Wert As Single)
   Dim As Single  Aktueller_Arrey_Wert
   
   For i As Integer = LBound(KKleinste_Array) To UBound(KKleinste_Array)
      Aktueller_Arrey_Wert = Val(KKleinste_Array(i))
      If  Aktueller_Arrey_Wert < Wert Then Wert = Aktueller_Arrey_Wert
   Next
   
   Locate 1,1: Print "KKWert       in der Sub = "; Wert
End Sub
Nach oben
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 107

BeitragVerfasst am: 08.01.2014, 00:04    Titel: Antworten mit Zitat

Wie Jojo schon schrieb: Verwende anstelle der SUB eine FUNCTION.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muecke
Gast





BeitragVerfasst am: 08.01.2014, 13:48    Titel: Antworten mit Zitat

was haltet Ihr denn von dem Code?
habe mich in der Funktionsweise mal am Excel orientiert lächeln

muss mir noch überlegen wie ich das am besten mache mit den Rang.
Ideen immer willkommen, ich dachte an ein Weiteres Arrey das ich dann immer noch mal mit prüfe und über Switch dann gegebenenfalls Tauschen.
was sagt Ihr dazu?


Code:
' --------------------------------------------------------------------------------------
'         KKleinste
'         
'         Gibt den k-kleinsten Wert einer Datengruppe zurück. Mit dieser
'         Funktion können Sie Werte ermitteln, die innerhalb einer Datenmenge
'         eine bestimmte relative Größe haben.
'         
'         Syntax
'         
'         KKLEINSTE(Matrix;K)
'         
'         Matrix      ist eine Arrey numerischer Daten, deren K-kleinsten
'                     Wert Sie bestimmen möchten.
'         
'         K            ist der Rang des Elementes dessen Wert zurückgegeben
'                     werden soll.
'
'         K !!!         ist noch nicht Programmirt worden somit ohne Fungzion
'                     es wird immer der Kleinste wert ausgegeben
' --------------------------------------------------------------------------------------
Declare FUNCTION KKleinste (Arrey() As Integer, x AS INTEGER) AS Integer

' -------------------------------------------------------------
' Beispiel KKleinste
' -------------------------------------------------------------
Dim As Integer MeineZahlen(1 To ...) = { 13, 4, 37, 42, 5}
Print KKleinste (MeineZahlen(), 1)
Sleep


FUNCTION KKleinste (KKleinste_Array() As Integer,x AS INTEGER) AS INTEGER
Dim As Integer Aktueller_Arrey_Wert , Wert, indexMin, indexMax

    indexMin = LBound(KKleinste_Array)      '' Untere Array-Grenze
    indexMax = UBound(KKleinste_Array)      '' Obere Array-Grenze

Wert = KKleinste_Array(indexMin)            '' Rückgabe mit dem ersten wert Arrey intialisieren


   For i As Integer = indexMin To indexMax   
      Aktueller_Arrey_Wert = KKleinste_Array(i)
      If  Aktueller_Arrey_Wert < Wert Then Wert = Aktueller_Arrey_Wert
   Next

   RETURN Wert

End Function
Nach oben
Muecke
Gast





BeitragVerfasst am: 08.01.2014, 16:15    Titel: Antworten mit Zitat

OK, ich habe nun versucht das mit dem Rang mit einzubauen, doch irgend wie muss ich einen Denkfehler machen traurig

könnt Ihr mir da einen Tipp geben in welche Richtung meine Gedanken gehen sollten.

wenn ich den 5 kleinsten wert aus einen Arrey haben möchte.
dann erstelle ich ein Arrey Rang(1 to 5)

dann vergleiche ich die Werte Aktueller Wert aus dem Arrey aus dem ich herausfinden möchte was der 5 Kleinste wert ist mit dem Aktuellem Rang in einer Schleife ob er denn Kleiner ist wenn ja und der rang darüber Größer ist dann Speichere den Akkuellenwert in den Aktuellen Rang.

doch das klappt nicht traurig warum denn? was mache ich Falsch?


Code:
' --------------------------------------------------------------------------------------
'   KKleinste
'         
'         Gibt den k-kleinsten Wert einer Datengruppe zurück. Mit dieser
'         Funktion können Sie Werte ermitteln, die innerhalb einer Datenmenge
'         eine bestimmte relative Größe haben.
'         
'   Syntax
'         
'         KKLEINSTE(Matrix;K)
'         
'         Matrix      ist eine Arrey numerischer Daten, deren K-kleinsten
'                     Wert Sie bestimmen möchten.
'         
'         K            ist der Rang des Elementes dessen Wert zurückgegeben
'                     werden soll.
' --------------------------------------------------------------------------------------
Declare FUNCTION KKleinste (Arrey() As Single, x AS Single) AS Single

' -------------------------------------------------------------
' Beispiel KKleinste
' -------------------------------------------------------------
Dim As Single MeineZahlen(1 To ...) = {4.1, 13.1 ,37.1, 42.1, 5.1}

 Print "Alles  =  4.1, 5.1, 13.1, 37.1, 42.1"
 Print
 Print "Rang 1 = "; KKleinste (MeineZahlen(), 1)
 Print "Rang 2 = "; KKleinste (MeineZahlen(), 2)
 Print "Rang 3 = "; KKleinste (MeineZahlen(), 3)
 Print "Rang 4 = "; KKleinste (MeineZahlen(), 4)
 Print "Rang 5 = "; KKleinste (MeineZahlen(), 5)
Sleep

FUNCTION KKleinste (KKleinste_Array() As single, x AS Single) AS Single
Dim As Single Aktueller_Arrey_Wert , Wert, indexMin, indexMax, Rang(0 To x), r, i

    indexMin = LBound(KKleinste_Array)      '' Untere Array-Grenze
    indexMax = UBound(KKleinste_Array)      '' Obere Array-Grenze

   For r  = 1 To x
      Rang(r) = KKleinste_Array(indexMin)            
      For i = indexMin To indexMax   
         Aktueller_Arrey_Wert = KKleinste_Array(i)
         If  Aktueller_Arrey_Wert < Rang(r) And Aktueller_Arrey_Wert > Rang(r-1) Then
            Rang(r) = Aktueller_Arrey_Wert
         EndIf
      Next
   Next
 RETURN Rang(x)
End Function
Nach oben
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 08.01.2014, 16:53    Titel: Antworten mit Zitat

Du legst den Startwert immer auf den ersten Arraywert fest; wenn dieser aber schon kleiner ist als alle anderen, dann scheitert das weitere Verfahren. Du müsstest im Gegensatz dazu immer erst auf den größten Wert hin initialisieren, oder zumindest auf einen beliebigen Wert, der mindestens so groß ist wie der größte im Array auftretende Wert.

Allerdings würde ich eher vorschlagen gleich eine Sortierroutine zu schreiben (Bubblesort ist z. B. recht einfach, auch wenn es schnellere Verfahren gibt), weil du dann nur einmal sortieren musst anstatt für jeden Rang extra.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 08.01.2014, 19:28    Titel: Antworten mit Zitat

Noch besser: Generischer Aufbau, also etwas der Art
Code:
Function KKleinste(daten() As T, rangIndex As Integer)As T

und dann in der Anwendung
Code:
Type T as Single
#include "kkleinste.bas"

verwenden. Da T ein Datentyp sein kann, der aufwändig zum Kopieren ist, würde ich die Sortierung nur auf einem Index-Array vornehmen. So wird ausserdem das übergebene Array nicht verändert.

Unter

http://beilagen.dreael.ch/QB/RangFunktionModul.bi

(Modul) und

http://beilagen.dreael.ch/QB/RangFunktion.bas

(aufrufendes Hauptprogramm) kurz so etwas zusammengestrickt.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Muecke
Gast





BeitragVerfasst am: 08.01.2014, 23:05    Titel: Antworten mit Zitat

DANKE DANKE

das ist der Hammer.

ich sitze jetzt den gesamten Tag hier und habe ich weis nicht alles gelesen und probiert und nichts hat gefruchtet bei mir.
und Ihr schreibt da kurz eine Anweisung das ist der Hammer. und zugleich echt Peinlich für mich.

Bbitte last mir ein wenig zeit um den Code weiter auseinander zu nehmen, ich möchte das verstehen.

also das mit dem T gibt es da noch mehr Erklärungen Beispiele ? etc. die ich mir anschauen kann?
Nach oben
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 09.01.2014, 10:55    Titel: Antworten mit Zitat

Muecke hat Folgendes geschrieben:
also das mit dem T gibt es da noch mehr Erklärungen Beispiele ? etc. die ich mir anschauen kann?

Siehe dazu

http://de.wikipedia.org/wiki/Generische_Programmierung

und diese Diskussion

http://forum.qbasic.at/viewtopic.php?t=8322

Motivation: Statt Zahlen, die Du nach Ränge aussuchen willst, sind es vielleicht das nächste Mal Strings (lexikografische Ordnung) oder gar eine eigene Klasse, z.B. Vektor, wo Du den sog. Betrag als Vergleichswert definierst. Ziel: Ein und derselbe Code mit allen Datentypen verwenden können, d.h. der Datentyp wird als T abstrahiert => Die "kKleinste"-Function (Implementierung) muss T nicht kennen, was das ist. T muss lediglich den "<"-Vergleich unterstützen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Muecke
Gast





BeitragVerfasst am: 10.01.2014, 14:27    Titel: Antworten mit Zitat

Wenn ich es jetzt richtig verstanden habe ist T eine Variabler Typ der sich anpassen kann. ?? habe ich das so richtig verstanden?

da ich ja zwei sachen miteinander vergelcieh z.B.,

Birne = Auto
oder
1 = 1

macht keinen Unterschied in der Abfrage.
es ist nur das Problem das ich einen Alge meinen Code nicht für alle Typen Programmiren kann und will , daher gibt es den T Typ mit dem ich also jetzt Variable bin und den Typ nehme der vorher als T Typ Definiert wurde.

Ich hoffe das ich das Richtig verstanden habe.



Den Rest des Codes Verstehe ich auch nicht so richtig.
ich schnalle es nicht was du da wie hin und her Tauschen tust traurig und warum auch nicht.

denn mir ist aufgefallen wenn man das austauscht im Code:
Code:
Dim d(...) As Double => { 1.3, -5.2, 7.1, -5.2, -3.7, -4.2, 10.1 }


dann bekomme ich in der Liste zwei mal -5.2 ausgegeben traurig



du Erstellt ein Neues Array "sortInd" das ist so groß wie das Arrey in dem die Daten sind.
Das "sortInd" Array nummerist du von 1 bis ... durch.

Jetzt wird Verglichen 1 Wert "Daten" mit X Daten das X Läuft von 1 bis Ende "sortInd" wenn Daten 1 kleiner ist dann Tausche Position in SortInd miteinander.

somit müsste jetzt der Inhalt von "sortInd" so sortiert das die Kleinst Zahl aus dem Datenindex an Stelle Index1 vom "sortInd" steht usw.


jetzt stellt sich für mich nur die Frage wie bekomme ich die Doppelten Werte aus der Sortierung?


EDIT 1:
ich habe jetzt Außerhalb von der Funktion versucht das mal hin zu bekommen also die Werte die Raus Müssten Rot zu markieren lächeln

sieht dann so aus:
Code:
Type T As Double


Dim d(...) As Double => { 20, 19, 99, 100, 18, 17, 17, 16, 15, 14, 13, 13, 100 }


For q As Integer = LBound(d)+1 To UBound(d)+1
Color 15
   If q <> UBound(d)+1 Then
      If KKleinste(d(), q) <> KKleinste(d(), q+1) Then
           Color 15
         Else Color 4
      EndIf
   EndIf
   Print "Rang ";q;" = ";KKleinste(d(), q)
Next q


Sleep:End

mal schauen wie ich das jetzt Sinnvoll in die Funktion mit hinein bekomme.

EDIT 2:

ich habe es jetzt in die Funktion eingebaut bekommen, so richtig verstanden habe ich das glaube ich noch immer nicht so an einem Stück das Teil im Kopf durchgehen kann ich immer noch nicht traurig

es macht jedoch das was es soll lächeln *man bin ich Heppy* ich glaube nur das es nicht so gut ist da noch mal ein Array zu erstellen in der Funktion
kann ich das Löschen es wird ja nicht mehr Benötigt lächeln so würde ich den Speicherplatz wider Frei geben.

Jetzt Fehlt mir außerdem das Letzte Element immer traurig warum denn das?

das ist der Code der Funktion jetzt:
Code:
Function KKleinste(daten()As T, rangIndex As Integer)As T

   Dim sortInd(LBound(daten) To UBound(daten))As Integer, i As Integer, j As Integer
   Dim Ausgabe_Arrey(LBound(daten) To UBound(daten)) As T
   
   For i = LBound(daten) To UBound(daten)
      sortInd(i) = i
   Next i
   
   ' Sortierung, aber nur Indexe, nicht Daten selber
   For i = LBound(daten) To UBound(daten)-1
      For j = i + 1 To UBound(daten)
         If daten(sortInd(j)) < daten(sortInd(i)) Then
            ' Nicht Daten selber, sondern nur Indexe tauschen
            Swap sortInd(i), sortInd(j)
         EndIf
      Next j
   Next i

'' Doppelte Einträge Löschen
i = 0
For q As Integer = LBound(sortInd) To UBound(sortInd)
   If q <> UBound(daten) Then
      If daten(sortInd(q)) <> daten(sortInd(q+1)) Then
          i + = 1
          Ausgabe_Arrey(i) = daten(sortInd(q))
      EndIf
   EndIf
Next q
'' Doppelte Einträge Löschen

   KKleinste = Ausgabe_Arrey(rangIndex)
End Function



EDIT:

so jetzt habe ich es lächeln man ist das ein Sch.... jetzt schreibe ich am Schluss den letzten wert wider in das Extra Array am Schluss.
denn sonst ist das letzte Rang nicht vorhanden.

dazu habe ich dann noch eine Abfrage gemacht ob der angeforderte Rang überhaupt noch vorhanden ist oder nicht wenn nicht wird 0 eingeschrieben.

so sieht es jetzt aus:
Code:
Function KKleinste(daten()As T, rangIndex As Integer)As T

   Dim sortInd(LBound(daten) To UBound(daten))As Integer, i As Integer, j As Integer, q As Integer
   Dim Ausgabe_Arrey(LBound(daten)+1 To UBound(daten)+1) As T
   
   For i = LBound(daten) To UBound(daten)
      sortInd(i) = i
   Next i
   
   ' Sortierung, aber nur Indexe, nicht Daten selber
   For i = LBound(daten) To UBound(daten)-1
      For j = i + 1 To UBound(daten)
         If daten(sortInd(j)) < daten(sortInd(i)) Then
            ' Nicht Daten selber, sondern nur Indexe tauschen
            Swap sortInd(i), sortInd(j)
         EndIf
      Next j
   Next i

'' Doppelte Einträge Löschen
i = 0
For q As Integer = LBound(sortInd) To UBound(sortInd)
   If q <> UBound(daten) Then
      If daten(sortInd(q)) <> daten(sortInd(q+1)) Then
          i + = 1
          Ausgabe_Arrey(i) = daten(sortInd(q))
      EndIf
   EndIf
Next q
   i + = 1: q   = UBound(daten)
   Ausgabe_Arrey(i) = daten(sortInd(q))
'' Doppelte Einträge Löschen


If rangIndex > i Then
   KKleinste = 0
Else KKleinste = Ausgabe_Arrey(rangIndex)
EndIf

End Function



Ich hoffe so das ich das nicht in ein Paar tagen noch mal machen muss bzw. noch ein Fehler drin ist denn da bekomme ich das bestimmt nicht noch mal zusammen was ich da gemacht habe.
Nach oben
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 10.01.2014, 19:33    Titel: Antworten mit Zitat

Warum denn so kompliziert? Soweit ich die Aufgabenstellung verstanden habe, soll die Funktion doch nicht das ganze Array sortieren, sondern nur das Element mit dem kleinsten Wert heraussuchen.
Code:
Function KKleinste(daten() As T) As Integer
   Dim As Integer KIndex, i
   
   KIndex = LBound(daten) 'ersten index als startwert
   
   For i = LBound(daten) + 1 To UBound(daten) 'vom zweiten element an vergleichen
      If daten(i) < daten(KIndex) Then
         KIndex = i 'index merken
      EndIf
   Next
   
   Return KIndex
End Function
gibt den Index des kleinsten Elements als Integer zurück (bzw. den Index des ersten Auftretens, falls mehrere Arrayelemente mit dem gleichen Inhalt existieren).

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 10.01.2014, 20:44    Titel: Antworten mit Zitat

@ grindstone: nicht ganz es geht um die Funktion KKleinste - KGrösste bekannt aus dem Excel.

nur das ich keine Doppelten Werte in meiner Sortierung (Rängen) brauchen kann lächeln
Nach oben
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 10.01.2014, 22:08    Titel: Antworten mit Zitat

Muecke hat Folgendes geschrieben:
Wenn ich es jetzt richtig verstanden habe ist T eine Variabler Typ der sich anpassen kann. ?? habe ich das so richtig verstanden?

Ist ein Datentyp, der sich anpassen kann. Bei FreeBasic nur sehr rudimentär mit dem Type-Alias möglich. Wäre das Ganze wie bei Java oder Ada möglich, so müsste eine Formulierung wie
Code:
' Rein illustrativer Code!
' Wäre dort ein in sich komplierbares Modul!
Function KKleinste<T Supports Operator<>(daten() As T, rangIndex As Integer) As T
   ' Implementierung wie gehabt
   ' T ist auf dieser Ebene ein abstrakter Datentyp, den man hier
   ' nicht kennen muss!
   KKleinste = ...
End Function

möglich sein (vielleicht nehmen die FB-Compilerentwickler dies eines Tages sogar einmal offiziell in die Sprache hinein!)

Im Hauptprogram ein
Code:
' Rein illustrativer Code!
Declare Function KKleinste<T Supports "<">(daten() As T, rangIndex As Integer) As T

Type Vektor
  x As Single
  y As Single
  z As Single
End Type

Constructor Vektor(x As Single, y As Single, z As Single)
  This.x = x
  This.y = y
  This.z = z
End Constructor

Operator<(a As Vektor, b As Vektor)
  ' Wie zuvor erwähnt Beträge bzw. dessen Quadrate vergleichen
  Return a.x * a.x + a.y * a.y + a.z * a.z < b.x * b.x + b.y * b.y + b.z * b.z
End Operator

Dim d(...) As Double => { 6.5, 1.7, -2.2, 5.4 }
Dim q(...) As String => { "Andy", "Beat", "Yolanda", "Xaver", "Emil" }
Dim v(...) As Vektor => { Vektor(5.0, 2.0, 7.0), Vektor(1.0, 1.0, 1.0), Vektor(-1.3, -2.3, 4.1), _
Vektor(5.2, -1.3, 1.4), Vektor(5.2, 1.3, 1.8) }

Print KKleinste<Double>(d(), 3)
Print KKleinste<String>(q(), 2)
Print KKleinste<Vektor>(v(), 3)

In dieser Form lässt sich in Java eine generische Klasse verwenden, bei FB ist dies aktuell noch nicht möglich, aber in etwa so würde eine perfekte generische Programmierung in FB aussehen, d.h. ich könnte von meiner FUNCTION beliebige Versionen zur Anwendungszeit ableiten.

Muecke hat Folgendes geschrieben:
'' Doppelte Einträge Löschen
i = 0
For q As Integer = LBound(sortInd) To UBound(sortInd)
If q <> UBound(daten) Then
If daten(sortInd(q)) <> daten(sortInd(q+1)) Then
i + = 1
Ausgabe_Arrey(i) = daten(sortInd(q))
EndIf
EndIf
Next q

Nur zur Information: Das Original in Excel verhält sich wie der von mir zuvor publizierte Code, wie dieses Beispiel zeigt:

http://beilagen.dreael.ch/QB/KKleinste_Test.xls

Zum Thema Handhabung mehrfacher Werte solltest Du vielleicht ein Beispiel der Art
Beispiel hat Folgendes geschrieben:

Gegeben:

Dim foo(...) As Double => { 5.2, 1.7, 1.6, 5.2, 1.7, 5.2, 4.8 }

KKleinste(foo(), 3) sollte 1.7 zurückliefern
KKleinste(foo(), 5) sollte 5.2 zurückliefern

In der professionellen Software-Entwicklerwelt nennt sich so etwas übrigens Test Driven Development, d.h. Du definierst zuerst, was Du als Ergebnis erwartest und machst daraus bereits einen Testfall (entsteht üblicherweise bereits bevor die Function selber implementiert ist), z.B. bei Java ein JUnit-Testprogramm daraus. Siehe auch

http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 11.01.2014, 00:54    Titel: Antworten mit Zitat

Muecke hat Folgendes geschrieben:
es geht um die Funktion KKleinste - KGrösste bekannt aus dem Excel.

Dann macht das Sortieren natürlich Sinn. Hier ein (mangles Datenmaterial ungetesteter) Alternativvorschlag:
Code:
Function KKleinste(daten() As T, rangIndex As Integer) As T   
   Dim As Integer sortInd(LBound(daten) To UBound(daten)), i, j, q
   Dim ret As T
     
   For i = LBound(daten) To UBound(daten)
      sortInd(i) = i
   Next i
   
   ' Sortierung, aber nur Indexe, nicht Daten selber
   For i = LBound(daten) To UBound(daten)-1
      For j = i + 1 To UBound(daten)
         If daten(sortInd(j)) < daten(sortInd(i)) Then
            ' Nicht Daten selber, sondern nur Indexe tauschen
            Swap sortInd(i), sortInd(j)
         EndIf
      Next j
   Next i

   If rangIndex = 1 Then
      Return daten(sortInd(LBound(daten))) 'kleinsten wert zurückgeben
   EndIf
   
   j = LBound(sortInd) 'anfangsindex für vergleichswert
   q = 1 'anfangswert für aktuellen rang
   For i = LBound(sortInd) To UBound(sortInd) 'ganzes array durchgehen
      If daten(sortInd(i)) > daten(sortInd(j)) Then 'größerer wert gefunden
         q += 1 'aktuellen rang erhöhen
         If q = rangIndex Then 'prüfen, ob der gewünschte rang erreicht ist
            Return daten(sortInd(i)) 'entsprechenden wert zurückgeben
         EndIf
         j = i 'aktuellen wert als nächsten vergleichswert setzen
      EndIf
   Next
   
   Return ret 'kein passender rang gefunden

End Function
Damit sparst du dir das Anlegen des Ausgabearrays und das Löschen der doppelten Werte. Und durch das Anlegen der Variable "ret" bekommst du bei einem nicht vorhandenen Rang immer einen "leeren" Wert vom passenden Datentyp zurückgemeldet.
Da ich die Function wie gesagt nicht testen konnte, würde ich mich über eine Rückmeldung freuen, ob sie funktioniert. lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 11.01.2014, 14:17    Titel: Antworten mit Zitat

OK, also der Datentyp T passt sich dem an was drin steht,
wenn Zahlen drin stehen ist es ein "Integer / Single ... "
und wenn Text Drin steht dann ist es ein "String ..."

hmm Ok soweit klar

nur wie mache ich das wenn ich jetzt z.B. das hier habe.

Code:
   ReDim As String X_Achse(1)
   Dim As Integer Kleinster_X

          ''  Datei Öffnen
          ''  Zeile Lesen
          ''  Zeile zerlegen und in Array "X_Achse" Packen

   Kleinster_X = KKleinste(X_Achse(), 1)
Print Kleinster_X
Sleep: End

Function KKleinste(daten()As T, rangIndex As Integer)As T
...
End Function


ich habe jetzt die Daten die übergeben werden aus einer Datei daher liegen diese in einem String Variablen,
wie kann ich die Variable denn in eine T Variable umwandeln? denn ich bekomme immer den Fehler

Zitat:
error 57: Type mismatch, at parameter 1 (daten) of KKLEINSTE() in 'Kleinster_X = KKleinste(X_Achse(), 1)'






Du hast recht das habe ich gestern auch noch im Excel probiert lächeln und da passiert genau das was du in deinem Code hast traurig,
leider wies ich noch nicht so genau was ich alles benötige und wie, ich wies nur was ich am Schluss haben möchte lächeln
da das mit dem Programmiren bei mir wirklich schon lange her ist, und ich da irgend wie ganz andere Erinnerungen dran habe Tue ich mich erschwer das richtig auszudenken, ... traurig und ich merke erst wenn ich dann einen Schritt weiter bin das das was ich gemacht habe zwar schon schön war doch das noch was Fehlt lächeln


@grindstone: ich werde das Später noch Testen versprochen. und ein Feedback geben.
Nach oben
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 11.01.2014, 22:20    Titel: Antworten mit Zitat

Du mußt dem Compiler mitteilen, was er unter "T" verstehen soll.
Code:
...
Type T As Integer
Dim As T Kleinster_X
...


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 11.01.2014, 22:38    Titel: Antworten mit Zitat

Das bedeutet im Übrigen, dass T nicht jederzeit jeden beliebigen Datentyp annehmen kann, sondern nur einen einzigen, der zu Beginn festgelegt werden muss (wenn man mal von mehrmaligem #UNDEF und #DEFINE absieht ...)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.


Zuletzt bearbeitet von nemored am 11.01.2014, 22:42, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muecke
Gast





BeitragVerfasst am: 11.01.2014, 22:41    Titel: Antworten mit Zitat

das bedeutet das ich den jedes mal für einen Neuen Aufruf der Funktion neu definieren kann?
also bevor ich die Funktion Aufruf festlege was für einer es sein soll.

hier mit:
Code:
...
Type T As Integer
Dim As T Kleinster_X
...


habe ich das so richtig verstanden?
Nach oben
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 11.01.2014, 22:45    Titel: Antworten mit Zitat

Eben genau das nicht - wenn du mit "TYPE T AS INTEGER" T festgelegt hast, ist und bleibt T ein INTEGER. Ein folgender Aufruf "TYPE T AS DOUBLE" o. ä. würde dir den Fehler "duplicated definition" ausgeben.

Du kannst T für dein Programm einmalig wählen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz