Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Prüfen, ob Zahl eine Ganzzahl (Integer) ist...


nixblicker - Fr 30.10.09 19:43
Titel: Prüfen, ob Zahl eine Ganzzahl (Integer) ist...
Hallo!

Wie kann ich prüfen, ob eine Zahl eine Ganzzahl, also Integer, ist?

Ich teile eine Zahl durch 1 bis 9 und prüfe dann immer, ob das Ergebnis
eine Ganzzahl ist. Wie krieg ich das hin?

Vielen Dank im Voraus!

Mfg.


Marc. - Fr 30.10.09 19:53

Hey und :welcome: im Forum!
Schau Dir mal den Befehl mod an. Dieser gibt Dir den Rest einer Division zurück. :)
Alternativ bietet sich hier auch die Funktion Frac() an, die Dir die Nachkommastellen einer Zahl zurückgibt. ;)


nixblicker - Fr 30.10.09 20:23

Okay, danke ich versuchs mal damit. Wenn Fragen kommen, meld ich mich nochmal ;)
Aber jetzt noch eine kleine Frage:
Wenn ich in einer If-Konstruktion mehrer Bedingungen haben will, wie geht das?
z.B.


Delphi-Quelltext
1:
2:
3:
4:
If Rest = 0 and Rest1 = 0 then
  begin
    ...
  end;


Ich will etwas nur ausführen, wenn Rest = 0 und eben Rest1 = 0 sind. Wie oben geschrieben
funktioniert das nicht. Aber wie sonst?

Danke schonmal.

Mfg.


platzwart - Fr 30.10.09 20:28


Delphi-Quelltext
1:
2:
3:
4:
If Rest = 0 or Rest1 = 0 then
  begin
    ...
  end;



Du sagst ja: wenn das eine ODER das andere eintritt. Dein Quelltext aber sagte, ausführen nur dann, wenn Bedingung 1 UND Bedingung 2 wahr (gleichzeitig) zutreffen...


thepaine91 - Fr 30.10.09 20:31

Hi, folgendes zu beachte denn in z.B. Delphi 6 wird es ohne Klammern probleme geben. Da keine Delphi Version bekannt gegeben worden ist.


Delphi-Quelltext
1:
If (Rest = 0or (Rest1 = 0then                    


nixblicker - Fr 30.10.09 20:34

Okay danke. Ich habs jetzt so gelöst, dass ich kein AND oder OR brauch...
Aber ne andre Frage...
Ich glaub ich post mal den ganzen Code.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
...
var
Teiler: integer;
Rest: integer;

begin

zahler := StrToInt(Edit1.Text);
nenner := StrToInt(Edit2.Text);

for Teiler := 1 to 10 do
  begin
     Rest := (Zahler mod Teiler) + (Nenner mod Teiler) ;

     If Rest = 0 then
      begin
           zahlerneu := zahler / teiler;
           nennerneu := nenner / teiler ;
      end
     else;

end;
...


Es kommt bei der Zeile zahlerneu := ... die Fehlermeldung "Incompatible types: 'Integer' and 'Extended'".
(zahlerneu und nennerneu sind weiter oben schon als integer deklariert.)

Warum das denn?

EDIT: Ich hab zahlerneu und nennerneu als double deklariert, jetzt scheints zu funktionieren!

Danke schonmal.

Mfg.


thepaine91 - Fr 30.10.09 20:39

Integer = ganzzahl
double = gleitkommazahl
Integer kann nur Ganze zahlen darstellen wie es schon sagt.
Daher kann man nicht sagen Integer := 1,1;
hoffe das hilft wenn nicht einfach mal F1 drücken in der Delphi-Hilfe wird das sehr gut erklärt.

Edit: Das ist das selbe wie string := integer nicht geht.
Man muss es auf jeden fall vorher Konvertieren mit z.b.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure xy;
var i: integer;
    d: double;
begin
  I := 1;
  d := 1;
  I := d; // falsch
  I := Floattoint(d); // richtig
//aber
  d := 1,5;
  i := d; // falsch
  i := Floattoint(d); // auch falsch da Integer nur Ganzzahlen beinhalten kann.
end;


mfg nic


nixblicker - Fr 30.10.09 20:50

Danke, hab jetzt aber ein anderes Problem:
Wie breche ich eine for-Schleife ab?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
for Teiler := 20 downto 2 do
  begin
     Rest := (Zahler mod Teiler) + (Nenner mod Teiler) ;

     If Rest = 0 then
      begin
           zahlerneu := zahler/teiler;
           nennerneu := nenner/teiler;
           showmessage(FloatToStr(zahlerneu) + ' / ' + FloatToStr(nennerneu));
               //hier will ich abbrechen
      end
     else;

end;


Wie geht das? Sorry für die vielen Fragen^^

Mfg.


thepaine91 - Fr 30.10.09 20:55

Break oder Exit für Unterschied F1 ;)


nixblicker - Fr 30.10.09 21:06

Danke, Frage ist erstmal beantwortet.
Ihr werdet aber sicher nochmal von mir hören...;)

Mfg.


FinnO - Fr 30.10.09 23:09

so. Warum jetzt nicht tryStrToInt?!

edit: gemeint war natürlich tryIntToStr


Marc. - Sa 31.10.09 14:29

user profile iconnixblicker hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 for Teiler := 20 downto 2 do
 {...}
     Rest := (Zahler mod Teiler) + (Nenner mod Teiler) ;
 {...}
           zahlerneu := zahler/teiler;
           nennerneu := nenner/teiler;
 {...}

Es geht wohl eindeutig ums Kürzen. Aber warum verwendest Du nicht einfach den Algorithmus von Euklid [http://de.wikipedia.org/wiki/Euklidischer_Algorithmus#Iterative_Variante] zur Bestimmung des ggTs? :idea:


nixblicker - Sa 31.10.09 18:35

Hallo...
Zitat:

Es geht wohl eindeutig ums Kürzen. Aber warum verwendest Du nicht einfach den Algorithmus von Euklid zur Bestimmung des ggTs? :idea:

weiiil ähm...ich wollt schauen ob ichs selber hinkrieg. und es hat sogar geklappt...wird ein programm für die schule, deshalb will ich so wenig wie möglich "fremden" (mit fremd mein ich vorgefertigt) Code einbauen...und für EUKLID fehlt
mir grad die Zeit und die Lust ;)