Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 10 Zahl und Erg. -> + u. - Berechnen (https://www.delphipraxis.net/36966-10-zahl-und-erg-u-berechnen.html)

Christian18 28. Dez 2004 19:44


10 Zahl und Erg. -> + u. - Berechnen
 
Hallo,

ich soll für die Schule ein Programm schreiben. Man soll in den Programm 10 Zahlen eingeben und das ergebnis. Das Programm soll dann solange rechnen bis das ergbnis mit plus uns minus gefunden ist.

kleines Bsp.:

- Eingabe:

1 2 3 5 9 7 3 6 9 1

Ergebnis: -10

und das programm soll das berechnen:

1+2+3+5-9-7-3+6-9+1=-10

ich hoffe ich konnte mein großes problem ein bisschen verständlich machen.

vorgegeben ist auch noch maximale länge das quellcodes. (100 Zeilen)

Leidert weiß ich überhaupt nicht wie ich anfangen kann. Deshalb kann ich noch keinen Code geben.

Mit freundlichen Grüßen

Christian18

Luckie 28. Dez 2004 19:46

Re: kleine Herausforderung :-)
 
Und was erwartest du jetzt von uns?

Christian18 28. Dez 2004 19:47

Re: kleine Herausforderung :-)
 
Zitat:

Zitat von Luckie
Und was erwartest du jetzt von uns?

ich erwarte erst einmal nicht, ich hoffe aber das ihr einen tip für mich habt. ich habe nämlich gar keine ahnung wie ich beginnen soll.

mfg

Luckie 28. Dez 2004 19:48

Re: kleine Herausforderung :-)
 
Einen Tipp? Hm: Delphi-Referenz durchsuchenArray. Eine Schleife: Delphi-Referenz durchsuchenfor. Eine Delphi-Referenz durchsuchenif-Abfrage. Das wäre jetzt so an Tipps, was mir einfallen würde.

titus 28. Dez 2004 19:51

Re: kleine Herausforderung :-)
 
Musst halt alle Möglichkeiten durchgehen und das sind ne verdammte Menge...

Anfang:
1+2-3-4-5-6-7-8-9
1+2+3-4-5-6-7-8-9
usw. bis
1-2-3-4-5-6-7-8+9

oder so :)

Mach halt ein Algorithmus draus :D.

mfG

Luckie 28. Dez 2004 19:55

Re: kleine Herausforderung :-)
 
Stichwort: Bei Google suchenPermutation.

Christian18 28. Dez 2004 19:55

Re: kleine Herausforderung :-)
 
Zitat:

Zitat von titus
Musst halt alle Möglichkeiten durchgehen und das sind ne verdammte Menge...

Anfang:
1+2-3-4-5-6-7-8-9
1+2+3-4-5-6-7-8-9
usw. bis
1-2-3-4-5-6-7-8+9

oder so :)

Mach halt ein Algorithmus draus :D.

mfG

so sollen wir es ja gerade nicht machen, deshalb ist ja die begrenzung auf 100 zeilen quellcode. hast du sonst noch eine andere idee???

mfg

Luckie 28. Dez 2004 19:57

Re: kleine Herausforderung :-)
 
Warum sollte der Algorithmus länger als 100 Zeilen werden?

Matze 28. Dez 2004 19:58

Re: kleine Herausforderung :-)
 
Könntest du bitte erstmal deinen Titel ändern?
kleine Herausforderung :-) sagt absolut nichts über dein Problem aus. Danke.


Edit: Smileys deaktiviert

MrFish 28. Dez 2004 20:02

Re: kleine Herausforderung :-)
 
Eine Idee: :idea:

eine Zahl von 0 hochzählen
in eine Binärzahl übersetzen
dann Stelle für Stelle maskieren
wenn 0 dann minus wenn 1 dann plus

das Ganze solang bis das Ergebnis vorliegt.

Ich hoffe ich konnte dir helfen

Gruß MrFish :stupid:

paresy 28. Dez 2004 21:12

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
es kann doch aber auch vorkommen dass es mehrere möglichkeiten gibt? sollt ihr das auch berücksichtigen?

hibbert 28. Dez 2004 21:19

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
Also ich würde das erstmal nicht mit 10 zahlen machen, sonder vielleicht erstmal mit 3 Zahlen beginnen...

Ka1 28. Dez 2004 21:31

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
(Hab es nicht ausgiebig getestet :| )

Es gibt insgesamt 512 Möglichkeiten (also 9 Bits)

Im "Edit1" stehen die 10 Ziffern (direkt hintereinander)
Im "Edit2" steht das zu suchende Ergebnis
"Button1" startet den Vorgang und die
"ListBox1" gibt das ganze aus

Delphi-Quellcode:
function GetBitStatus(W:Integer):String;
var BS : String;
begin
  BS:='';
  If W-256 >= 0 then begin BS:=BS+'1'; W:=W-256; end else BS:=BS+'0';
  If W-128 >= 0 then begin BS:=BS+'1'; W:=W-128; end else BS:=BS+'0';
  If W-64  >= 0 then begin BS:=BS+'1'; W:=W-64; end else BS:=BS+'0';
  If W-32  >= 0 then begin BS:=BS+'1'; W:=W-32; end else BS:=BS+'0';
  If W-16  >= 0 then begin BS:=BS+'1'; W:=W-16; end else BS:=BS+'0';
  If W-8   >= 0 then begin BS:=BS+'1'; W:=W-8;  end else BS:=BS+'0';
  If W-4   >= 0 then begin BS:=BS+'1'; W:=W-4;  end else BS:=BS+'0';
  If W-2   >= 0 then begin BS:=BS+'1'; W:=W-2;  end else BS:=BS+'0';
  If W-1   >= 0 then begin BS:=BS+'1'; W:=W-1;  end else BS:=BS+'0';
  Result:=BS;
end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,i1  : Integer;
  A    : Array[1..10] of Integer;
  W    : Integer;
  S, S1 : String;
begin
  ListBox1.Clear;
  For i:=1 to 10 do A[i]:=StrToInt(Edit1.Text[i]);
  For i:=0 to 511 do
  begin
    W:=A[1];
    For i1:=2 to 10 do
    begin
      S:=GetBitStatus(i); If S[i1-1]='0' then W:=W-A[i1]
                                         else W:=W+A[i1];
    end;
    If StrToInt(Edit2.Text)=W then
    begin
      S1:=Edit1.Text[1];
      For i1:=1 to 9 do If S[i1]='0' then S1:=S1+'-'+Edit1.Text[i1+1]
      else S1:=S1+'+'+Edit1.Text[i1+1];
      ListBox1.Items.Add(S1+'='+Edit2.Text);
    end;
  end;
end;

fiasko 28. Dez 2004 22:06

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
Hallo,

ich denke mal der didaktische Sinn ist ne Rekursion, also etwas der Art:

Delphi-Quellcode:
var
  zahlen: array[1..10] of Integer; // die vorgegebenen Zahlen
  ergebnis: Integer;              // das vorgegebene Ergebnis
  formelerg: String;              // Var. für's Ergebnis

function myfunc(pos: Integer; mysum: Integer; formel:string): boolean;
begin
  if pos>10 then
  begin
    if mysum<>ergebnis then
      result:=false
    else
    begin
      formelerg:=formel;
      result:=true
    end;
  end
  else
    result:=myfunc(pos+1, mysum-zahlen[pos], formel+'-'+IntToStr(zahlen[pos])) or
            myfunc(pos+1, mysum+zahlen[pos], formel+'+'+IntToStr(zahlen[pos]));
end;

if myfunc(2, zahlen[1], IntToStr(zahlen[1])) then
  ShowMessage('Formel lautet: '+formelerg)
else
  ShowMessage('Nicht lösbar!');

(Ja, ziemlicher Spagetti-Code... ist auch nicht getestet aber die Idee ist hoffentlich klar.)

Dieser Ansatz erfaßt alle möglichen Lösungen, es wird aber nur die letzte Ausgegeben...
[edit]es werden natürlich nur alle Möglichkeiten erfaßt, wenn booleasche Ausdrücke vollständig ausgewertet werden...[/edit]

paresy 28. Dez 2004 22:16

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab den code von Ka1 genommen und nen wenig optimiert... damit die string vergleiche raus sind und nen proof einbaut der nen error ausgibt wenn was nicht stimmen sollte :)

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils;

type
  TNumbers = record
   myResult : Integer;
   myNumbers : Array[0..9] of Integer;
  end;

  TForm1 = class(TForm)
    lblIS: TLabel;
    edResult: TEdit;
    btnCalc: TButton;
    lstResults: TListBox;
    procedure btnCalcClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    EditsNumbers : Array[0..9] of TEdit;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const DefaultNumbers: TNumbers = (myResult: -10;
                                  myNumbers: (1,2,3,5,9,7,3,6,9,1);
                                  );

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin

 for i:=0 to 9 do
  begin
   EditsNumbers[i] := TEdit.Create(Self);
   EditsNumbers[i].Parent := Self;
   EditsNumbers[i].Top := 8;
   EditsNumbers[i].Left := 8+i*36;
   EditsNumbers[i].Width := 25;
   EditsNumbers[i].TabOrder := i;
  end;

 //Load default Numbers
 for i:=0 to 9 do
  EditsNumbers[i].Text := IntToStr(DefaultNumbers.myNumbers[i]);
 edResult.Text := IntToStr(DefaultNumbers.myResult);

end;

procedure TForm1.btnCalcClick(Sender: TObject);
var
  i,i1  : Integer;
  W    : Integer;
  S1 : String;
  Proof : Integer;
  Numbers: TNumbers;
begin

  //copy numbers
  for i:=0 to 9 do
   Numbers.myNumbers[i] := StrToInt(EditsNumbers[i].Text);
  Numbers.myResult := StrToInt(edResult.Text);

  lstResults.Clear;
  For i:=0 to 511 do
  begin
    W:=Numbers.myNumbers[0];
    For i1:=1 to 9 do
    begin
     If (i and (1 shl i1)) = 0 then
      W:=W-Numbers.myNumbers[i1]
     else
      W:=W+Numbers.myNumbers[i1];
    end;
    If Numbers.myResult=W then
    begin
      S1:=IntToStr(Numbers.myNumbers[0]);
      Proof := Numbers.myNumbers[0];
      For i1:=1 to 9 do
       If (i and (1 shl i1)) = 0 then
        begin
         S1:=S1+'-'+IntToStr(Numbers.myNumbers[i1]);
         Proof := Proof - Numbers.myNumbers[i1];
        end
       else
        begin
         S1:=S1+'+'+IntToStr(Numbers.myNumbers[i1]);
         Proof := Proof + Numbers.myNumbers[i1];
        end;
       if Proof <> Numbers.myResult then
        S1 := 'ERROR: '+S1;
       lstResults.Items.Add(S1+'='+IntToStr(Numbers.myResult));
    end;
  end;
end;

end.
grüße, paresy

Luckie 28. Dez 2004 22:21

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
Na prima, jetzt hat er es doch geschafft euch seine Hausaufgaben machen zu lassen. :roll:

paresy 28. Dez 2004 22:28

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
Zitat:

Zitat von Luckie
Na prima, jetzt hat er es doch geschafft euch seine Hausaufgaben machen zu lassen. :roll:

naja wenn er nicht weiß wie es funktioniert... nützt ihm der beste code nix... das war schon meinen zeiten so wo die im info unterricht meinen code abgeschrieben haben... und als der lehrer nachhakte.... kam nur nen öhm.... hab ich grad vergessen :roll:

grüße, paresy

Christian18 29. Dez 2004 11:20

Re: 10 Zahl und Erg. -> + u. - Berechnen
 
Zitat:

Zitat von Luckie
Na prima, jetzt hat er es doch geschafft euch seine Hausaufgaben machen zu lassen. :roll:

nein das würde ich nicht so sehen. Ich muß ja auch erklären können was da gemacht wird. und deshalb programmiere ich es nochmal selbst. Das mit den Code hat mir aber sehr geholfen.

Mit freundlichen Grüßen

Christian18


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz