Auf einen standartisierten Wert aufrunden
Hallo Leute,
ich bin neu hier und schon komme ich mit einem Problem :wink: Ich schreibe grad ein kleines Programm, bei dem ich einen bereits errechneten Wert auf den nächst höheren Wert (die Werte sind festgelegt) runden möchte. Hier mal ein symbolisches Beispiel: festgelegte Werte: 10 11 13 16 17 Aufgabe: x + y = 13,2 Ergebnisausgabe soll aber 16 sein da der nächsthöhere mögliche Wert ist 16 Ich hoffe es ist verständlich was ich will :wink: |
Re: Auf einen standartisierten Wert aufrunden
Herzlich willkommen in der Delphi-PRAXiS.
Da deine Ergebnisse Float-Werte sind, welche auf einen Integer-Wert abgebildet werden sollen, brauchst du zuerst eine Funktion, die dir die kleinste Ganzzahl liefert, welche größer oder gleich deinem Ergebnis ist. Suche in der Delphi-Hilfe nach Ceil. Dann ist es zweckmäßig, wenn die Bildwerte deiner Abbildung aufsteigend sortiert vorgehalten werden - wie du es schon zeigst. Da die Bildwerte nicht lückenlos sind, musst du dir eine eigene Ceil-Funktion schreiben, die den oben beschriebenen Wert durch Suchen in der geordneten Bildmenge ermittelt. Ein naiver Ansatz wäre die schrittweise Suche. Ein etwas professionellerer Ansatz ist die binäre Suche (binary search). Freundliche Grüße vom marabu |
Re: Auf einen standartisierten Wert aufrunden
Das mit der Ceil-Funtion wäre geschaft...
Zitat:
|
Re: Auf einen standartisierten Wert aufrunden
Ich habe dir zwei Wege aufgezeigt - am Bach lang oder über den Berg. Du musst dich nur entscheiden.
marabu |
Re: Auf einen standartisierten Wert aufrunden
Sorry, dafür muss ich aber erstmal laufen lernen...
Ich kenn mich noch nicht so gut mit Delphi aus. Ich stelle mir das so vor:
Delphi-Quellcode:
Weiß echt nicht wie ich das angehen soll...
var
StdWidst: array [0..23] of integer; StdWidst[0] = 10; StdWidst[1] = 11; StdWidst[2] = 12; StdWidst[3] = 13; StdWidst[4] = 15; StdWidst[5] = 16; StdWidst[6] = 18; StdWidst[7] = 20; StdWidst[8] = 22; StdWidst[9] = 24; StdWidst[10] = 27; StdWidst[11] = 30; StdWidst[12] = 33; StdWidst[13] = 36; StdWidst[14] = 39; StdWidst[15] = 43; StdWidst[16] = 47; StdWidst[17] = 51; StdWidst[18] = 56; StdWidst[19] = 62; StdWidst[20] = 68; StdWidst[21] = 75; StdWidst[22] = 82; StdWidst[23] = 91; |
Re: Auf einen standartisierten Wert aufrunden
Ich würde im Array nach der ersten Zahl suchen, die größer als meine ungerundete Zahl ist (dazu sollte das Array als letzte Zahl einen "Stopper" erhalten "StdWidst[24]:=High(integer);"). Anschließend die Differenz zu dieser und zur nächstkleineren Zahl bestimmen. Dann von den beiden die Zahl nehmen, wo die Differenz am kleinsten ist.
|
Re: Auf einen standartisierten Wert aufrunden
Ok, danke!
Aber so wie ich das oben auf geführt habe kann es ja schon nicht richtig sein. [Fehler] Widerstand.pas(51): Bezeichner redefiniert: 'StdWidst' wo liegt hier der Fehler? |
Re: Auf einen standartisierten Wert aufrunden
Delphi-Quellcode:
oder
var
StdWidst: array [0..23] of integer = (10, 11, 12, 13, 15 ... 91);
Delphi-Quellcode:
var
StdWidst: array [0..23] of integer; ... procedure TForm1.FormCreate(Sender: TObject); begin StdWidst[0]:=10; StdWidst[1]:=11; StdWidst[2]:=12; ... StdWidst[23]:=91; end; |
Re: Auf einen standartisierten Wert aufrunden
Versuch es mal hiermit.
In Edit1 gibst Du Deinen Wert ein, wenn dur die Enter-Taste drrückst sollte der (evtl. nächsthöhere) Standardwert in Edit2 stehen. Hab ich nicht vollständig getestet...... Gruß, Klaus
Delphi-Quellcode:
const StdWidst:array [0..23] of integer=(10,11,12,13,15,16,18,
20,22,24,27,30,33,36,39,43,47,51,56,62,68,75,82,91); FUNCTION FindValue(const data:array of integer; value:integer):integer; var first,last,actual:integer; begin first:=Low(data); last:=High(data); repeat actual:=(first+last) shr 1; result:=data[actual]; if result<value then first:=actual+1 else if result>value then last:=actual-1 else exit; until first>last; if first<=High(data) then result:=data[first]; end; procedure TMain.Edit1KeyPress(Sender: TObject; var Key: Char); var v:extended; vc:integer; begin if key=#13 then begin val(edit1.Text,v,vc); edit2.text:=IntToStr(FindValue(StdWidst,ceil(v))); end else begin edit2.text:=''; end; end; |
Re: Auf einen standartisierten Wert aufrunden
Danke Klaus!
Aber könnetest du mir das ganze schrittweise erklären? Das wäre echt super... denn einfach den Q-Text kopieren und drin rum fuschen bringt mich ja nicht wirklich weiter :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz