|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muecke Gast
|
Verfasst am: 08.01.2014, 00:15 Titel: Kleinsten Wert ermitteln - leider kommt immer 0 aus der SUB |
|
|
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 und nicht das was die SUB ermittelt hat.
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
|
Verfasst am: 08.01.2014, 00:20 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 08.01.2014, 00:33 Titel: |
|
|
an so was wie eine Funktion habe ich auch schon gedacht jedoch noch nie gemacht daher erst mal der Weg mit der SUB
danke für das mit dem "ByRef"
jetzt muss ich mich um die 0 Kümmern da habe ich nicht dran gedacht da meine liste für die ich das gerade mache immer mit - werten begibt doch das muss nicht so sein
das ist der Code mit dem es Klappt
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
|
Verfasst am: 08.01.2014, 01:04 Titel: |
|
|
Wie Jojo schon schrieb: Verwende anstelle der SUB eine FUNCTION. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 08.01.2014, 14:48 Titel: |
|
|
was haltet Ihr denn von dem Code?
habe mich in der Funktionsweise mal am Excel orientiert
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
|
Verfasst am: 08.01.2014, 17:15 Titel: |
|
|
OK, ich habe nun versucht das mit dem Rang mit einzubauen, doch irgend wie muss ich einen Denkfehler machen
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 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: 4597 Wohnort: ~/
|
Verfasst am: 08.01.2014, 17:53 Titel: |
|
|
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 |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 08.01.2014, 20:28 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 09.01.2014, 00:05 Titel: |
|
|
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)
|
Verfasst am: 09.01.2014, 11:55 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 10.01.2014, 15:27 Titel: |
|
|
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 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
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
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
es macht jedoch das was es soll *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 so würde ich den Speicherplatz wider Frei geben.
Jetzt Fehlt mir außerdem das Letzte Element immer 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 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: 1211 Wohnort: Ruhrpott
|
Verfasst am: 10.01.2014, 20:33 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 10.01.2014, 21:44 Titel: |
|
|
@ 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 |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.01.2014, 23:08 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 11.01.2014, 01:54 Titel: |
|
|
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.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 11.01.2014, 15:17 Titel: |
|
|
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 und da passiert genau das was du in deinem Code hast ,
leider wies ich noch nicht so genau was ich alles benötige und wie, ich wies nur was ich am Schluss haben möchte
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, ... 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
@grindstone: ich werde das Später noch Testen versprochen. und ein Feedback geben. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 11.01.2014, 23:20 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 11.01.2014, 23:38 Titel: |
|
|
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, 23:42, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 11.01.2014, 23:41 Titel: |
|
|
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: 4597 Wohnort: ~/
|
Verfasst am: 11.01.2014, 23:45 Titel: |
|
|
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 |
|
|
|
|
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.
|
|