Autor Beitrag
Philipp_Frank
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 22.09.03 16:05 
Hallo, ich habe folgendes bei google gefunden. Ich glaube es ist eine php-klasse ... ;-) Sie macht folgendes: Denkt sich eine Zahl aus zw. 1 und hundert und versucht selbst die zahl zu erraten. Ich würde sowas gern in Delphi haben, also ich denke mir ne zahl aus, und das programm soll raten und dabei die zahl systematisch eingrenzen, ich klicke nur auf zu groß oder zu klein. Kennst jemand sowas, oder kann mir helfen?
ausblenden volle Höhe 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:
/* Übungsaufgaben Informatik / ALGDS  WS99-00
 * Autor: -- auf Wunsch des Autors entfernt -- */

/* Dieses Programm denkt sich eine Zufallszahl zwischen 1 und 100 aus
 * und versucht sie dann selbst zu raten. Das Programm tastet sich
 * langsam an die Zahl heran, indem das Gesamtintervall immer
 * halbiert und anschließend überprüft wird, ob die gesuchte Zahl in der
 * einen oder der anderen Hälfte liegt.
 * Am besten malt man sich das ganze mal auf, dann sieht man leichter,
 * woraus sich die neuen Grenzen im nächsten Durchlauf errechnen:
 * Ist die Zahl im linken Intervall, dann bleibt die linke Grenze fest
 * und die rechte ergibt sich aus li + intervall. Ist die Zahl im
 * rechten Intervall, dann bleibt die rechte Grenze fest, und die
 * linke ergibt sich aus re - intervall. Das Intervall wird sodann
 * halbiert und die Überprüfung im nun kleineren Intervall wiederholt.
 * Zur Veranschaulichung gibt das Programm in jedem Schritt die 
 * neugefundene rechte und linke Grenze aus. */ 
 
public class Aufg28 {

   public static void main(String args[]) {
    
  int zufallszahl = (int) (Math.random () * 99.0) + 1;
  int re_grenze = 128;
  int intervall = re_grenze;
  int li_grenze = 1;
  
  System.out.println();
  System.out.println("Zufallszahl: " + zufallszahl);
  
  do {
      intervall = intervall / 2;
      if (li_grenze <= zufallszahl && zufallszahl < li_grenze+intervall) 
    re_grenze = li_grenze + intervall;
      else  
    li_grenze = re_grenze - intervall;
            
      System.out.println("li: " + li_grenze + ", re: "+ re_grenze);
  } while (intervall>1);
  
  System.out.println("geratene Zahl: " + li_grenze);
    
    }
}


Moderiert von user profile iconTino: Code-Tags hinzugefügt.
Moderiert von user profile iconChristian S.: Auf Wunsch des Autors Name und E-Mail entfernt
lambruco
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100

Win 2000/2000 Server/XP
D6 Prof.
BeitragVerfasst: Mo 22.09.03 16:23 
Wieso schreibst du es nicht selber ? Ist doch eine nette Übung.
Wenn du nicht weiterkommst, wird dir bestimmt jemand helfen, aber
einfach nach einer "Tippse" zu rufen, ist nicht Sinn dieses Forums.

Nichts für ungut, aber aber ich musste es auch lernen.

_________________
Wer Rechtschreibfehler findet, kann Sie behalten
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 22.09.03 17:03 
Im Prinzip beweist der Ruf nach einer "Tippse" (:wink:) nur, dass die Kenntnisse von Philipp nicht ausreichen, das Problem selbst zu lösen. Denn so kompliziert ist der abgedruckte Quelltext ja nun auch nicht. Dazu ist nicht mal Superwissen erforderlich. Es genügt schon, sich die Zeilen anzusehen und anhand der Meldungen (die ausgegeben werden) nachzudenken, was dabei passiert - dann kann man das bereits sehr gut nach Delphi umsetzen.
lambruco
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100

Win 2000/2000 Server/XP
D6 Prof.
BeitragVerfasst: Di 23.09.03 09:12 
Ich bin ja nicht so, und hab das obige Programm (meiner Meinung nach C)
in Delphi umgewandelt.
Entweder hab ich irgendetwas falsch gemacht, oder der Algorhythmus ist einfach nur schlecht.
Das Prog benötigt immer 7 Durchläufe, um auf die gesuchte Zahl zu kommen. Entweder ist es gewollt, oder ich habe tatsächlich etwas übersehen.


ausblenden 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:
procedure TForm1.Button1Click(Sender: TObject);
var
  iZufall       : Integer;
  iRechteGrenze : Integer;
  iLinkeGrenze  : Integer;
  iIntervall    : Integer;
begin
  randomize();
  iAnzahl        := 0;
  iZufall        := Random(100)+1;
  iRechteGrenze  := 128;
  iLinkeGrenze   := 1;
  iIntervall     := iRechteGrenze;
  Label2.Caption := IntToStr(iZufall);

  repeat
    iIntervall := iIntervall div 2;
    if (iLinkeGrenze <= iZufall) And (iZufall < (iLinkeGrenze + iIntervall)) then
       iRechteGrenze := iLinkeGrenze + iIntervall
    else
       iLinkeGrenze := iRechteGrenze - iIntervall;
    label4.Caption  := IntToStr(iLinkeGrenze);
    label6.Caption  := IntToStr(iRechteGrenze);
  until iIntervall <= 1; 
  label8.Caption    := IntToStr(iLinkeGrenze);
end;


Edit : Hab mal die Vorschläge von Peter Lustig umgesetzt, sehe aber keine
Veränderung. Es bleiben 7 Durchläufe.
Mit Java hingegen hat er recht, was eigentlich peinlich ist, da ich gerade ein Buch mit Java-Beispielen lese. :oops: (Naja, manchmal sieht man den Wald vor lauter Bäumen nicht).

_________________
Wer Rechtschreibfehler findet, kann Sie behalten


Zuletzt bearbeitet von lambruco am Di 23.09.03 10:29, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 23.09.03 09:54 
Hallo!


@lambruco:
(1) Das Programm sieht für mich zwar eher wie Java aus, ist ja aber auch egal.
(2) Wenn ich das richtig sehe, kann Deine Zufallszahl auch NUll werden, die im Original aber nicht
(3) Und wenn mich meine Java-Kenntnisse nicht völlig im Stich lassen, musst Du eine repeat-until-Schleife benutzen, weil die Äquivalent zur do-while-Schleife ist. Das Äquivalent der Delphi-While-Schleife in Java ist ebenfalls eine While-Schleife (also mit While oben)

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".