![]() |
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?
|
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...
|
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; |
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] |
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:
grüße, paresy
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. |
Re: 10 Zahl und Erg. -> + u. - Berechnen
Na prima, jetzt hat er es doch geschafft euch seine Hausaufgaben machen zu lassen. :roll:
|
Re: 10 Zahl und Erg. -> + u. - Berechnen
Zitat:
grüße, paresy |
Re: 10 Zahl und Erg. -> + u. - Berechnen
Zitat:
Mit freundlichen Grüßen Christian18 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 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