Autor Beitrag
Platinum
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 01.05.09 14:43 
Heute morgen konnte mir ja bei der "normalen" Binären Suche geholfen werden, ich hoffe das klappt auch jetzt :X

Ich bin die Binäre Suche jetzt rekursiv am Programmieren, der Code dürfte an sich stimmen, nur glaube ich ein Fehler im Funktionsaufruf zu haben :X Ich habe mich schon dumm und dämmlich gegoogelt ( de.wikibooks.org/wik...duren_und_Funktionen hat ein wenig geholfen), nur bekomme ich folgende Fehler nicht weg:
-[Hinweis] Project1.dpr(18 ): H2077 Auf 'r' zugewiesener Wert wird niemals benutzt
-[Hinweis] Project1.dpr(19): H2077 Auf 'l' zugewiesener Wert wird niemals benutzt
-[Warnung] Project1.dpr(20): W1035 Rückgabewert der Funktion 'Suche' könnte undefiniert sein
-[Warnung] Project1.dpr(47): W1035 Rückgabewert der Funktion 'Suche' könnte undefiniert sein

Es liegt bestimmt nur an einer kleinigkeit, aber ich sehe sie nicht :X Hoffe jemand ist nicht ganz so blind wie meiner einer :)

ausblenden volle Höhe 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

  function Suche(l,r:extended):extended;
Var
  a:array[1..10of integer;
  x,m:integer;
  gefunden:boolean;

  function Suche(l,r:extended):extended;
     Begin
           m:=(TRUNC((l+r)/2));
           if x = a[m] then Gefunden := True
           else if x<a[m] then r := m - 1
           else l := m + 1;
      end;

begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }

  x:=7;
  l:=1;
  r:=10;
  gefunden:=false;

  for m:= 1 to TRUNC(r) do
    begin
       a[m]:=m;
       writeln(m,'.) ', a[m]);
    end;

     if gefunden then
         begin
           writeln('Die gesucht Zahl ist vorhanden und befindet sich an der ',m,' ten Stelle.');
           writeln('Die gesuchte Zahl lautet: ',x);
           gefunden:=true;
         end
     else if not gefunden then Suche(l,r);

   readln;
   end;

end.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Fr 01.05.09 15:14 
Hi :)

Dass du die inline deklarierte Funktion in "Suche" ebenfalls "Suche" genannt hast, muss praktisch zu Fehlern führen. Kann ja niemand wissen, welche jetzt bei einem Aufruf innerhalb von Suche gemeint ist ;)

Die Fehlermeldung mit "Rückgabewert könnte undefiniert sein" stimmt so: Du weist nirgends einen Wert zu. Bei Funktionen existiert jedoch immer eine Variable "result", deren Inhalt am Ende zurückgegeben wird. Deshalb könntest du auch schreiben: x := Suche(513) * pi / 4;.

Solange du den Wert wirklich nicht benötigst, könntest du aus Suche eine Prozedur machen, das sollte das Problem lösen. Wenn du noch nicht weißt, was eine Prozedur ist, wäre das hier eventuell etwas für dich: Crashkurs von Christian S..

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Platinum Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 01.05.09 15:53 
Danke für die Antwort, aber irgendwie stehe ich auf dem Schlauch.

Kannst du mir ein ganz simples Beispiel schreiben, das eine "for-Schleife" rekursiv nachstellt ?
Also in der function würde i:= i+1 stehen und das "Hauptprogramm" ruft die funktion solange auf bis i=5.

Sry, aber irgendwie bin ich gerade verwirrt :D
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 01.05.09 16:17 
user profile iconPlatinum hat folgendes geschrieben Zum zitierten Posting springen:
Kannst du mir ein ganz simples Beispiel schreiben, das eine "for-Schleife" rekursiv nachstellt ?
Also in der function würde i:= i+1 stehen und das "Hauptprogramm" ruft die funktion solange auf bis i=5.
Ich vermute, du meinst sowas:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function recursive_for1(i : Integer): Integer;
begin
  if i < 5 then
    result := recursive_for1(i+1)
  else
    result := 5;
end;

procedure recursive_for2(var i: Integer);
begin
  i := i + 1;
  if i < 5 then
    recursive_for2(i);
end;

Das sollte so funktionieren. Aufruf immer z.B. mit 0. In der prozedur ist i ein var-Parameter, das heißt, wenn ich eine Zuweisung auf i mache, wird die Zuweisung auf die Variable gemacht, die ich der Prozedur gegeben hab. Klar, dass du die Prozedur dann nur mit einer Variable aufrufen kannst und nicht so: recursive_for2(1);

Edit: Fehler korrigiert :oops:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Platinum Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 01.05.09 16:35 
Danke für die Antwort.

Ich hab deinen Code jetzt stupide copy&paste in meine "Konsolenanwendung" kopiert, es kommen auch keine Fehler. Um den Wert von i zu überprüfen habe ich ein "writeln(i);" in die Prozedur eingefügt, und in das "Hauptprogramm" ein "readln", damit mir das Fenster nicht vor der Nase zuklappt.

Das Problem: es passiert rein gar nichts in meinem Konsolenfenster :( Nach dem ich den Code ausführe gehts auf und bleibt aufgrund des "readln" auch offen bis ich enter drücke :(

Genau das gleiche passiert bei meinem Code auch... was mach ich nu falsch ? -.-#
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 01.05.09 16:39 
user profile iconPlatinum hat folgendes geschrieben Zum zitierten Posting springen:
Genau das gleiche passiert bei meinem Code auch... was mach ich nu falsch ? -.-#
Zeig mal deine Änderungen an meinem Code, bzw deine ganze Testanwendung in der du meinen Code benutzt :nixweiss:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Platinum Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 01.05.09 16:44 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
procedure recursive_for2(var i: Integer);
begin
  i := i + 1;
  writeln(i);
  if i < 5 then
    recursive_for2(i);
end;

begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  readln;
end.


das wärs
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 01.05.09 16:47 
Musst die Prozedur schon auch aufrufen :roll:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
procedure recursive_for2(var i: Integer);
begin
  i := i + 1;
  writeln(i);
  if i < 5 then
    recursive_for2(i);
end;

var
  x : Integer;
begin
  x := 0;
  recursive_for2(x);
  readln;
end.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Platinum Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 01.05.09 16:51 
ok,das war eindeutig... genug für heute ;)

danke, ich mach erstmal ne pause^^
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 01.05.09 16:56 
Wobei es auch ohne Var-Parameter klappt. Der nutzt dir IMHO sowieso nichts, außer dass am Ende in deiner Variablen X fünf steht!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure recursive_for2(i: Integer);
begin
  writeln(i);
  if i < 5 then
    recursive_for2(i+1);
end;
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 01.05.09 16:57 
user profile iconMarc. hat folgendes geschrieben Zum zitierten Posting springen:
Wobei es auch ohne Var-Parameter klappt. Der nutzt dir IMHO sowieso nichts, außer dass am Ende in deiner Variablen X fünf steht!
Schon richtig, aber wenn ich ein Beispiel je mit Funktion und Prozedur mache, dann sollten beide das gleiche können, oder? ;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 01.05.09 17:00 
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Schon richtig, aber wenn ich ein Beispiel je mit Funktion und Prozedur mache, dann sollten beide das gleiche können, oder? ;)

Kommt davon, wenn man sich nur den letzten Beitrag durchließt. :oops: