Autor Beitrag
DeltaEx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Mo 07.10.02 18:06 
Also ich muss ein Programm für Politik programmieren und ich habe ein Problem:
user defined image

Also auf den Bild sieht man eine tabelle mir Edit feldern.Das Programm soll wenn man auf den Button drückt folgendes machen:
Ganz oben steht eine zahl im diesem falle A-Partei 11050 B 6090 und C 2670 die müssen :2 :3 :4: 5.....:13 geteilt werden und in die Edit felder eingetragen werden und dann das schwerste das Programm soll dann gucken welche zahl die grösste ist und in Sitzfolge eine 1 eintragen und die kleinste zahl bekommt dann 39. Klar?? auf dem Bild habe ich ein kleines Beispiel gemacht bitte helft mir sonst bin ich dran:-)

Danke in voraus[/img]

_________________
Delphi forever
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 07.10.02 18:25 
Hi!

das mit dem Teilen sollte nciht allzu schwer werden:

je nachdem, wie Du die edit-Felder erstellt hast, wird die Nummer um einen festen Wert größer, wenn Du innerhalb einer Spalte von der einen in nächste Zeile wechselst. Die kannst Du ja dann mit FindComponent durchgehen. Ein Beispiel:

Wenn Du die Edit-Felder Zeilenweise erstellt hast, dann wird das erste Feld (Stimmenanzahl A) edit1 heißen, das Zweite (Sitzfolge neben Spalte A) usw. Dann wird das erste Feld in der zweiten Zeile eine um 7 höhere Nummer also 8 haben. Damit erhälst Du für die Berechnung der Felder folgendes:

ausblenden Quelltext
1:
2:
3:
4:
while i <= 13 do
begin
  TEdit(Form1.FindComponent('edit'+IntToStr(1+i*7))).text:=Round(StrToInt(edit1.text)/(i+1));
end;


Ich habe das jetzt nicht getestet, aber das Prinzip sollte klar sein.

Das mit dem sortieren ist eigentlich auch nicht so schwer. Auf anhieb fällt mir ein, die berechneten Zahlen in ein Array zu schreiben und das zu sortieren. Das Verfahren ist bei der kleinen Menge an Zahlen ziemlich egal. Sollte mir noch was Besseres einfallen, werde ich natürlich posten.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
SMI
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106

Win95-2003 / Debian / Suse
D1/D3/D6/D7
BeitragVerfasst: Mo 07.10.02 20:12 
Hallo

interessantes Problem! Nach einer knappen Stunde arbeit habe ich folgendes Programm fertigestellt. Es ist ein Konsolenprogramm, das ist für solche arbeiten meistens vollkommend ausreichen und nicht so Zeitaufwändig wie Forms und kommt daher meiner Bequemlichkeit entgegen.
Kurz Umschrieben berechne ich zuerst alle Einträge, dann mach ich eine Sortierliste in der nur auf die Adresse jedes Eintrags verwiesen wird. Dann Sortier ich diese Liste indem ich überprüfe ob de eine Wert größer ist als der andere, wenn das so ist, vertausche ich einfach die Adressen. So bekomme ich eine absteigend Sortierte Liste. Dann Derefernziere ich alle Elemente in meine Sortierten Sortierliste und Weise jedem Element eine aufsteigende Nummer zu.

Bei Rückfragen stehe ich gerne zur Verfügung

SMI


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:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
program Project1;
uses
  SysUtils;

{$APPTYPE CONSOLE}


Type
 pTStructure = ^TStructure;
 TStructure = Record
  Sitze : integer;
  rang : integer;
 end;

VAR
 A      : Array [0..12,0..2] of TStructure;
 P      : Array [0..38] of Pointer;
 pStruc : pTStructure;
 i      : Integer;
 ii     : Integer;
 tmpPtr : Pointer;

BEGIN

 Readln(a[0,0].sitze);
 //a[0,0].sitze := 11050;
 Readln(a[0,1].sitze);
 //a[0,1].sitze := 6090;
 Readln(a[0,2].sitze);
 //a[0,2].sitze := 2670;

 // Array Berechnen
 FOR i:=1 TO 12 DO
  FOR ii:=0 TO 2 DO
   BEGIN
    a[i,ii].sitze := a[0,ii].sitze DIV (i+1);
    a[i,ii].rang := 0;
   END;

 // Pointer für jeden Eintrag des Arrays A in das
 // Pointer Array P legen
 pStruc:= @a[0,0];
 FOR i:=0 TO 38 DO
 BEGIN
  p[i]:=pStruc;
  INC(pStruc);
 END;

 // Pointer Array Sortieren, da Pointer nur Zeiger sind wird
 // das Array A nicht angetastet
 FOR i:=0 TO 38 DO
  FOR ii:=0 TO 38 DO
  BEGIN
    // Mehr Sitze als Vergleichswert -> Pointer Adressen austauschen
    IF pTStructure(p[i])^.Sitze > pTStructure(P[ii])^.Sitze THEN
    BEGIN
     //Swap Position
     TmpPtr:=p[i];
     p[i]:=p[ii];
     p[ii]:=TmpPtr
   END;
  END;

 // Das nun sortierte Pointerarray durchlaufen und Ränge verteilen
 FOR i:=0 TO 38 DO
 BEGIN
  pTStructure(p[i])^.rang :=i+1;
 END;

 // Ausgabe des Arrays A it Rängen
 pStruc:= @a[0,0];
 FOR i:=0 TO 12 DO
 BEGIN
  FOR ii:=0 TO 2 DO
  BEGIN
   Write('|',pstruc^.sitze,'/',pstruc^.rang,' | ');
   Inc(pStruc);
  END;
  WriteLN;
 END;
 Writeln;
 Writeln('Press Enter to Exit');
  Readln;

end.

_________________
Wenn es im Jahre 1879 schon Computer gegeben hätte, würden diese vorausgesagt haben, daß man infolge der Zunahme von Pferdewagen im Jahre 1979 im Pferdemist ersticken würde.
(John C. Edwards, brit. Zukunftsforscher)
SMI
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106

Win95-2003 / Debian / Suse
D1/D3/D6/D7
BeitragVerfasst: Di 08.10.02 16:47 
Was ist daran kompliziert? Mit dem Komplizierten hast du ja nichts zu tun. Du must das Array ja nur mit deinen Feldern füllen und nach der Berechnung den Inhalt wieder zurückschreiben!

Einlesen in das Array, da du nur 3 Zahlen aus drei Feldern hast musste folgender Code passen:


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
//Einlesen Der Startwerte
//Stimmenzahl Zeile1 Partei A
a[0,0].sitze := edit1.text;
//Stimmenzahl Zeile1 Partei B
a[0,1].sitze := edit2.text;
//Stimmenzahl Zeile1 Partei C
a[0,2].sitze := edit3.text;



Dann für die Ausgabe benützt du eine leicht modifizierte Version der Schleife, die "Peter Lustig" beschrieben hast. Ich nehme hier an, dass deine Edit Felder, die sich auf die Stimmenzahl beziehen Edit1 bis Edit39 und die für den Rang Edit39-Edit78 heißen.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Asugabe der Array in Editfelder.
pStruc:= @a[0,0]; 
For i:=1 To 39 DO
BEGIN
 // Errechnete Sitze einfügen
 TEdit(Form1.FindComponent('edit'+IntToStr(i))).text := IntToStr(pstruc^.sitze);
 // Errechneten Rang Einfügen
 TEdit(Form1.FindComponent('edit'+IntToStr(i+39))).text := IntToStr(pstruc^.rang);
 // imArray um einen eintrag weiter Wandern:
 Inc(pStruc);
END;


Der Rest ist dann wie im ersten posting

Die obigen Zeilen sind nicht kompiliert, könnten also Flüchtigkeitsfehler enthalten, denn ich bin schlichtweg zu Faul 39 Buttons zu machen. Da ich nur Delphi 3 benutze kann ich dein Projekt nicht öffnen, den ab Delphi 4 hat Borland ein anderes Format zum abspeichern der Dialoge verwendet.

SMI

P.S.: Hausaufgaben sollte man schon selber machen zumindest, selber abgeschrieben haben. :-)

_________________
Wenn es im Jahre 1879 schon Computer gegeben hätte, würden diese vorausgesagt haben, daß man infolge der Zunahme von Pferdewagen im Jahre 1979 im Pferdemist ersticken würde.
(John C. Edwards, brit. Zukunftsforscher)
DeltaEx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110



BeitragVerfasst: Di 08.10.02 19:18 
:D OK leute das hat sich erledigt!!

Und hier noch mal ein DICKES dankeschön an Peter Lustig der hat mir das fertige Project zugeschickt. Jetzt kann ich weiter arbeiten:-)

TOLL TOLL nur weiter so
Das Board ist das beste in Sachen Delphi!!!!!!

_________________
Delphi forever