Autor Beitrag
Skreek
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 06.10.05 16:41 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.bRechnenClick(Sender: TObject);
  var
     x,h,i:integer;
begin
 h:=0;
 val(eEingabe.Text,x,h);
   if h<>0
     then
       begin
         showmessage('Fehlerhafte Eingabe! Komma ist ein Beistrich!')
       end
     else
       begin
       i:=0;
        for i:=1 to x do
          begin


So die sist nun meine sehr laienhafte Version eines PRimzahlrechners. Spätestens jetzt sind sicher 95% von euch entsetzt von den Stühlen gefallen.. ..kann ich euch nicht verübeln. Noch dazu wo er ja nichtmal halbwegs vollendet ist

Warum ich nicht die anderen Threads durchgehe.. ..weil ich das schon getan habe und diese Programmierungen leider nicht verstehe. (Befehle wie z.B. mod etc. sind mir gänzlich unbekannt)

Mein Lehrer hat noch etwas von einer Array- Funktion die man verwenden muss und die er irgendwann einmal erwähnt hätte. Leider kenne ich weder Nutzen noch Syntax dieses Befehls und habe auch in diversen Hilfen keine verständliche Erklärung gefunden.

Bitte um möglichst einfache Lösung oder zumindest einfache ERklärung für die Array funktion

Danke im voraus

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
starsurfer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 334

Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
BeitragVerfasst: Do 06.10.05 17:18 
also erst mal :welcome: im DF!

wenn du hier im DF mal nach "Mod" bzw "array" gesucht hättest wärst du sicher auf etliche threads gestoßen...

trozdem hier maln code beispiel mitn array
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:
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:
86:
87:
88:
89:
90:
91:
92:
93:
94:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  primzahlen:array of cardinal; // ne art eindeminsionale tabelle mit ganzen zahlen
  zeit_filterung:real; // komma zahl
implementation

{$R *.DFM}

//verarbeitung
procedure filter_primzahl(zahlen:cardinal);  //eine selbst erstellte Procedure, die variable in den klammern wird der procedure übergeben
var i,j,primzahl_nr:cardinal; // 3 variable die positive ganze zahlen enthalten können
    f_start,f_ende,ff:int64;  // 3 variable die große ganze zahlen enthalten
begin
QueryPerformanceCounter(f_Start); // hält den startzeitpunkt der berechnung fest
i:=2;  // i wird 2 ^^
primzahl_nr:=1;  // primzahl_nr wird 1 ^^
repeat  //begin einer repeat.. until schleife
inc(i); // i wird immer um 1 erhöht
for j:=0 to primzahl_nr-1 do    //begin einer for..to..do schleife
    begin
    if (i mod primzahlen[j])=0 then break; // mod ermittelt den rest bei der divison 2er ganzer zahlen, sollte dieser 0 sein springt das programm aus der schleife heraus; da es keine Primzahl sein kann
    if j>=sqrt(primzahl_nr-1then  // sollte j größer als die wurzel der primzahl_nr-1 werden, ist es eine primzahl
       begin                       //anweisungsblock für die if abfrage
       inc(primzahl_nr);           //primzahl_nr wird erhöht; juhu wieder eine zahl gefunden ;D
       primzahlen[primzahl_nr-1]:=i;  // die zahl wird in die tabelle eingetragen, das in [] entspricht der position in der tabelle
       break;                       // aus der schleife springen
       end;                        //anweisungsblock für die if abfrage
    end;
until primzahl_nr=zahlen;         // den repeat until block so lange ausführen bis primzahl_nr der geforderten anzahl von primzahlen entspricht
QueryPerformanceCounter(f_ende);  // hält den zeitpunkt fest wo die berechnugn abgeschlossen ist
QueryPerformanceFrequency(ff);   // ermittelt die systemgenauigkeit für die zeit
zeit_filterung:=((f_Ende - f_Start) / ff);  //zeit ermitteln
end;
//verarbeitung ende

procedure TForm1.Button1Click(Sender: TObject);
var anzahl,h:cardinal;
    start,ende,f:int64;
begin
//ausagbe
QueryPerformanceCounter(Start); //hält startzeitpunkt von eingabea+ausgabe+verarbeitung fest
memo1.lines.Clear;       //löscht das memo 1 feld
memo1.Lines.add('Primzahlen filtern');   //schreibt was rein
memo1.lines.add('');              //ne leerzeile
memo1.lines.add('Gestartet am: '+datetostr(now)); //schreibt das aktuelle datum rein
memo1.lines.add('');      //noch ne leerzeile
//ausgabe ende
//eingabe
anzahl:=strtoint(edit1.text);  //liest den wert aus edit1 aus
setlength(primzahlen,anzahl);  //setzt die "tabelle" auf die gewünschte länge
primzahlen[0]:=2;            //erste primzahl wird eingetragen, ist 2
filter_primzahl(anzahl);     // ruft selbst definierte procedure auf und übergibt die anzahl der primzahlen
//eingabe ende
//ausgabe
for h:=0 to anzahl-1 do     //for..to..do
    begin
    memo1.lines.add(inttostr(primzahlen[h])); // gibt alle primzahlen nacheinander aus
    end;
QueryPerformanceCounter(ende);   //speichert endzeitpunkt der berechnugn ab
QueryPerformanceFrequency(f);    //systemgenauigkeit
memo1.lines.Insert(4,inttostr(anzahl) +' Primzahlen; Filter Zeit: '+floattostr(zeit_filterung)+' sek');    //erstezt die 4 zeile des memos durch diesen text, alle anderen zeilen rutschen eins nach unten
memo1.lines.Insert(5,inttostr(anzahl) +' Primzahlen; Anzeigen-Filter Zeit: '+floattostr((Ende - Start) / f)+' sek'); //erstezt die 5 zeile des memos durch diesen text, alle anderen zeilen rutschen eins nach unte
memo1.lines.Insert(6,'');    //fügt ne leerzeile in 6 zeile ein
memo1.lines.add('[Ende]');    //schreibt ende ans ende^^
ShowMessage(inttostr(anzahl) +' Primzahlen; Filter Zeit: '+floattostr(zeit_filterung)+' sek');      //gibt eine meldung heraus
ShowMessage(inttostr(anzahl) +' Primzahlen; Anzeigen-Filter Zeit: '+floattostr((Ende - Start) / f)+' sek'); //gibt eine meldung heraus
memo1.Lines.SaveToFile(extractfilepath(application.exename)+'\prim.text');    //speichert den ganzen spass ins verzeichnis wo die exe is
//ausgabe ende
end;

end.


mod und so was wird zwar auch verwendet, aber wird auch erklärt was es macht...

der code is zwar schon optimiert, aber wer noch paar tipps hat... PM an mich ;D

_________________
GEIZ IST GEIL! - Ihr Sozialamt
Amateur
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: Do 06.10.05 19:29 
also: nen aray is nen variablenfeld. d.h. du deklarierst nen array und hast dann mehrere variablen des selben namens aber mit unterschiedlichen indizes.

bsp: zahl:array[1..4] of integer;

dann sind zahl[1], zahl[2], zahl[3] und zahl[4] integers denen du jedme nen anderen wert geben kannst.

und mod gibt dir nur die zahl nach dem komma nach einer divison aus

bsp: 12 durch 3 ist 4,0 also gibt mod 0 (befehl wäre 12 mod 3 und das ergebnis wäre 0)
9 durch 2 ist 4,5 also gibt mod 5

mod brauchste um zu prüfen ob ne zahl durch ne andere zahl teilabr is also keine primzahl. 12 ist keine primzahl da 12 durch 3 gleich 3,0 ist also 12 mod 3 ist 0.

allein mit diesem befehl kannste nen primzahl algorithmus schreiben.
ansonsten such ma hier im forum nach crashkurs delphi. da bekommste das notwendige knowhow.
der rest ist mathe. allerdings ist das ein sehr einfacher und sehr lange dauernder algorithmus mit mod. gibt sicher bessere hier im forum aber für dich sollte es reichen

_________________
"Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
Skreek Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 09.10.05 12:54 
Herzlichen Dank für die gute Erklärung.
Ich denke ich hab das ganze auch verstanden und kann das meinem Lehrer schlüssig erklären.
So und jetzt mach ich mich daran und versuch das nochmal selbst nachzuschreibn.

Merci nochmal!

Skreek :wave: :!: :!: :!:
Ike
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 14.12.06 23:50 
hm, hab grad was zu primzahln gesucht und das gefunden^^
mir ist dabei aufgefallen, das geschriebn wurde das a mod b die stelle nach komma ausgibt

user profile iconAmatuer hat folgendes geschrieben:

und mod gibt dir nur die zahl nach dem komma nach einer divison aus


das stimmt so nicht^^ a mod b gibt den rest der division von a durch b an... also nicht die kommastellen.

bsp 12 mod 3 ... 12/3 is klar 4... also kein rest
aber 12 mod 5... 12/5 ist ja 2,4. folglich würde 4 ausgegeben, es kommt aber 2, weil 2 der rest dieser division ist, wenn man den integer also ganzzahlige zahlen nimmt... 10/5 = 2 und zur 12 fehlen dann 2... also 12/5 = 2 rest 2

9 mod 2 git auch nicht 5 (9/2 = 4,5) sondern 1 (9/2 = 4 rest 1)

soll net bös kling oder so, nur falls ma einer wie ich die SuFu nutzt und hierrauf kommt und den mod befehl dann falsch einsetztn will und es net geht.