Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Killogramm, Gramm und milligram (https://www.delphipraxis.net/72654-killogramm-gramm-und-milligram.html)

TheCatcher 4. Jul 2006 17:34


Killogramm, Gramm und milligram
 
Hallo Leser,

ich soll ein Programm (dank Schule) schreiben, welches aus 2 Werten das Gewicht berechnet je nach grösse des Ergbinss soll darüberhinaus der Wert umgerechnete werden in in mg, g, kg oder t.

Also Beispiel.

Der Bauer hat 4 Eier á 15 g = 60g
Dieser wert ist zu klein also in mg ausgeben

oder der Bauer hat 8 Euer á 974 g = 7792 g
zu gross also in kg 7,792 kg

na ja und so weiter ;) leider habe ich keine Ansatzplan udn auch keine Idee.
Im Forum nach kg oder mg zu suchen bringt nicht viel ;)


Vielleicht hat jemand ein Code Beispiel für mich mit welchem ich dann weiterarbeiten kann... ich wäre sehr Dankbar....

Matze 4. Jul 2006 17:38

Re: Killogramm, Gramm und milligram
 
Hi, naja, du musst doch einfach nur umrechnen.

1000 mg = 1 g
1000 g = 1 kg

Mal nur so ein fetzen:

Delphi-Quellcode:
Kilo = Wert div 1000;
Gramm = (Wert - Kilo) div 1000
hm, oder so in der Art :zwinker:

Christian Seehase 4. Jul 2006 17:40

Re: Killogramm, Gramm und milligram
 
Moin TheCatcher,

als erstes könnte mal die gesamte Aufgabe hilfreich sein, denn das was Du uns da genannt hast kann es ja eigentlich nicht gewesen sein.

TheCatcher 4. Jul 2006 17:46

Re: Killogramm, Gramm und milligram
 
Danke Matze aber so weit war ich auch schon aber leider
habe ich z.B. Komma Probleme 0 Fehlt hin und wieder mal gerne!


und an Christian... Du wirst lachen aber das ist meine Aufgabe nicht mehr nicht weniger - soll nur zur eine Anfänger Übung sein. So lautet der Satz der Lehrerin

stoxx 4. Jul 2006 17:48

Re: Killogramm, Gramm und milligram
 
hatten wir doch vor kurzem schonmal solche Umrechnungen:

Delphi-Quellcode:
function xFloatToSym(Value : Extended) : String;
const
  S_UNITS = 'afpnµm kMGTP';

var Wert: Extended;
    Einheit : Integer;
begin
wert := Value;
Einheit := 7;
while ( wert < 1 ) and (Einheit > 1) do begin
  Wert := Wert * 1000;
  dec(Einheit);
end;

while (Wert >= 1000) and (Einheit < 12) do begin
  Wert := Wert / 1000;
  inc(Einheit)
end;
Result := Format('%g%s', [Wert, S_Units[Einheit]]);

end; // xFloatToSym
http://www.delphipraxis.net/internal...729&highlight=

Catbytes 4. Jul 2006 18:04

Re: Killogramm, Gramm und milligram
 
Hi,

wenn Du Vorlagen für ein Konvertierprogramm brauchst und zufällig Delphi7 einsetzt: Im Demo-Verzeichnis von Delphi7 gibt es ein Programm namens "ConvertIt" - das rechnet alles mögliche um ;-)

Nur so als Tipp...

TheCatcher 4. Jul 2006 18:07

Re: Killogramm, Gramm und milligram
 
Nee habe kein D7 Danke ;)


@stoxx danke ich experimentiere schon damit

Christian Seehase 4. Jul 2006 18:13

Re: Killogramm, Gramm und milligram
 
Moin TheCatcher,

und nach welcher Gewichtung soll entschieden werden, ab wann ein Wert umgerechnet werden soll?

Catbytes 4. Jul 2006 18:13

Re: Killogramm, Gramm und milligram
 
Zitat:

Zitat von TheCatcher
Nee habe kein D7 Danke ;)

Gibt es aber wenigstens die Units ConvUtils.pas und/oder StdConvs.pas? Die liegen bei mir in "...\Borland\Delphi7\Source\Rtl\Common" und sind im Source mit 1995 - 2001 gecopyrighted (was fürn Wort). Eventuell waren diese Units dann schon in früheren Delphi-Versionen dabei.

In diesen Units sind viele Konvertiermöglichkeiten vorhanden...

TheCatcher 4. Jul 2006 18:20

Re: Killogramm, Gramm und milligram
 
Ab wann umgerechnete werden soll - immer dann wenn Tausend VOR dem Komma voll sind!

Das heisst 9mg sind 9 mg - 99 mg 99mg 999mg auch 999mg aber dann 1001mg sind dann 1,001g na ja und so weiter - 999g sind 999g aber 1001g sind 1,001 kg

das ist mir einfch zu hoch in Delphi....

ps. ConvUtils.pas und/oder StdConvs.pas habe ich beide NICHT (Delphi 5 Std)

Smeivel 4. Jul 2006 18:32

Re: Killogramm, Gramm und milligram
 
kann man nicht einfach eine Prozedur schreiben dass wenn(while) der Wert mehr als 3 Stellen vor dem Komma hat dann soll er durch 1000 dividieren?!

TheCatcher 4. Jul 2006 18:35

Re: Killogramm, Gramm und milligram
 
Ja versuchte ich schon nur stelle ich mir zwei fragen bzw. ein Problem

a) Wie sage ich delphi das er NICHT auch die nachkomma stellen zählen soll? StrLn geht nicht
b) habe ich bei einigen Werten ein NULL zu wenig bei dem nachkomme also 6565,5 <- statt 6565,50

Smeivel 4. Jul 2006 18:45

Re: Killogramm, Gramm und milligram
 
Also dein erstes Problem kannst du beheben in dem du schreibst dass er alles bis zum Komma zählen soll hab grad kein Delphi da das müsste aber mit Delimiter gehen ansonsten über [er soll sagen wo pos(vom ,)] und wenn die Zahl größer 3 ist dann wie gesagt. Bei deinem 2. Problem würde ich sagen solltest du eine Prozedur schreiben die das überprüft, bzw. einfügt

Klaus01 4. Jul 2006 19:09

Re: Killogramm, Gramm und milligram
 
sollte doch nicht so schwer sein.

ist der errechnete Wert < 1 dann nehme eine Einheit kleiner als die jetzige und multipliziere den Wert mit 1000
ist der errechnete Wert > 1000 dann nehme eine Einheit größer als die jetzige und teile den Wert durch 1000

Beispiel:

4 x 15g = 60g nichts ändert sich
8 x 150g = 1200g Einheit ändert sich auf 1,2 kg
4 x 0,15 = 0,6g Einheit ändert sich auf 600 mg

Grüße
Klaus

xZise 4. Jul 2006 19:50

Re: Killogramm, Gramm und milligram
 
Ich bin ja mal nett ;)

Zitat:

Zitat von TheCatcher
a) Wie sage ich delphi das er NICHT auch die nachkomma stellen zählen soll? StrLn geht nicht

Wenn der Wert größergleich 1000 ist.
Wenn du das als String einliest musst du das dann einfach in eine Fließkommazahl (Extended) umwandeln.


Zitat:

Zitat von TheCatcher
b) habe ich bei einigen Werten ein NULL zu wenig bei dem nachkomme also 6565,5 <- statt 6565,50

Soll es immer 3 Nachkommastellen geben?
Also z.B. 1,000 g?

Dann könntest du das in einer Schleife (ich finde eine for-schleife schön ;) ):
SValue = Wert als String ('123,45')
Value = Wert (123,45)
Nachkomma = Nachkommastellen (0,45)
Laenge = Länge der Nachkommstellen (2)
Delphi-Quellcode:
Value := StrToFloat(SValue);
//Nachkommastellen "errechnen"
Nachkomma := Value - Round(Value);

// Länge bestimmen
{ Entweder du wandelst es in einen String um und überprüfst die Länge }
Laenge := FloatToStr(Nachkomma) - 2; // - 2 wegen dem komma und der führenden null: [0,]45
{ Du könntest es auch ausrechnen (is komplizierter), werde es aber nicht hier erklären, da es über den String auch funktionieren sollte }

// Nullen "ansetzen"
for i := Laenge to 3 do
  SValue := SValue + '0';

// Aus diesem Code kann man dann auch einen einzeiler machen (ACHTUNG: Komplizierter ;) )
for i := FloatToStr(StrToFloat(SValue) - Round(StrToFloat(SValue))) - 2 to 3 do
  SValue := SValue + '0';
Zusammenfassend zu der Aufgabe: Du musst einfach nur ein bisschen rechnen lassen, allerdings nicht mit Strings. Die Strings solltest du nur verwenden, wenn du es ausgeben willst, oder (wie es bei Fall B der fall war ^^) wenn du etwas hinzufügen willst (Nullen vor/nach allen Ziffer (001,200)), was beim Integer/Extended eiskalt (^^) gelöscht werden würde.

Ich hoffe mal ich konnte weiterhelfen.

Eine Frage: Sollte es nur von Tonnen - Milligramm gehen? Oder auch darüber?

Ich möchte ungerne das fertige Programm jetzt posten, aber ich geben einen Anstoß:
(weitere Erklärung siehe oben)
Delphi-Quellcode:
// Zuerst den Wert IMMER in ein Extended umwandeln ;) Damit lässt sich alles besser berechnen
Value := StrToFloat(SValue);
if Value >= 1000 then begin // in Kilogramm
  if Value / 1000 >= 1000 then begin // in Tonnen/Megagramm
    // Umrechnung in Tonnen (aufpassen: Umwandlung Gramm >>> Tonnen ist 1 Gramm * 1.000.000 = 1 Tonne!)
  end else begin
    // Umrechnung in Kilogramm
  end;
end else if Value < 1 begin // in Milligramm
  // Umrechnung in Milligramm
end else begin // so lassen (GRamm)
  //keine Umrechnung
end;
xZise hat folgendes hinzugefügt:
Übrigends musst du es nachher wieder umwandeln und in ein Label/Edit eintragen.

Amateurprofi 5. Jul 2006 23:37

Re: Killogramm, Gramm und milligram
 
Hallo, TheCatcher,

Ich hatte das mal so gelöst
Ursprünglich wurden 3 signifikante Ziffern ausgegeben.
So wie es jetzt ist, bis zu 18 signikanten Ziffern nach dem Dezimalpunkt. Hab ich aber nicht ausgiebig getestet.


Delphi-Quellcode:
FUNCTION Normalize(v:extended; baseunit:string):string;
type
   TNumberUnit=(nuYocto,nuZepto,nuAtta,nuFemto,nuPiko,nuNano,nuMicro,nuMilli,
                nuNone,nuKilo,nuMega,nuGiga,nuTera,nuPeta,nuExa,nuZetta,nuYotta);
const
   numberunits:Array[TNumberUnit] of char='yzafpn'#181'm kMGTPEZY';
var
   i,d:integer; nu:TNumberUnit;
begin
      nu:=nuNone;
      if v<>0 then begin
         while v<1 do begin
            v:=v*1000;
            nu:=Pred(nu);
         end;
         while v>=1000 do begin
            v:=v/1000;
            nu:=Succ(nu);
         end;
         // Einstellung auf 3 signifikante Ziffern
//         if (nu=nuNone) or (v>99.95 {>=100}) then d:=0
//            else if v>9.95 {>=10} then d:=1
//               else d:=2;
      end;
//      str(v:0:d,result);
      d:=18;
      str(v:0:d,result);
      for i:=Length(result) downto 1 do
         if result[i]='0' then dec(d) else break;
      str(v:0:d,result);
      if nu=nuNone then result:=result+' '+baseunit
         else result:=result+' '+numberunits[nu]+baseunit;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 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