Autor Beitrag
ACeS
Hält's aus hier
Beiträge: 6

WIN XP
Delphi 7
BeitragVerfasst: Di 17.11.09 21:04 
Also ich habe eine aufgabe in info bekommen und schreibe morgen eine kursarbeit. es könnte sein, das auch eine solche aufgabe kommt. ich habe das programm soweit geschrieben (bzw. eine andere aufgabe umgeschrieben), weiß aber nicht warum es nicht geht.
also die aufgabe heißt:
schreibe ein programm, das die ersten n primzahlen ausgibt (n=eingabe).
und die aufgabe die ich umschrieb lautete: schreibe ein programm, das alle primzahlen, bis zur grenze n ausgibt (n eingabe).

also das habe ich geschrieben:


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:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,d,g:integer;
    f:string;
begin

  a:=strtoint(edit1.text);
  d:=0;
  For c:=2 to a do 
  begin
    For b:=2 to (c-1do  
    begin
      if (c mod b)=0 THEN
        d:=1
    end;
    if d = 0 THEN
      f:=f+ inttostr(c)+ chr(13);
    g:= g+1;
  end;
  d:=0;
  if (g=a) THEN
    Label1.caption:=f;
end;

end.



Warum funktioniert es nicht?
wenn man das programm starten will, gibt er nun gar nichts aus.

Bitte bitte brauche hilfe!
thx im vorraus

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Titel geändert.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 17.11.09 21:19 
Hallo und :welcome: in der Entwickler-Ecke,

Lass mal die Variable g komplett weg. Die scheint mir keinen weiteren Sinn zu haben, außer dass die Überprüfung if g=a am Ende immer fehlschlagen muss.

Edit: Ah, ne. Du sollst die ersten a Primzahlen ausgeben, nicht alle im Bereich 1..n. Dann wäre eine While-do oder repeat-until schleife besser, denn du weißt ja nicht, wie groß die größte Primzahl ist, die du suchst. Größer als a ist sie auf jeden Fall, daher reicht deine For-Schleife bis a nicht aus.

_________________
We are, we were and will not be.
ACeS Threadstarter
Hält's aus hier
Beiträge: 6

WIN XP
Delphi 7
BeitragVerfasst: Di 17.11.09 22:34 
ja das hatte ich mir auch schon gedacht aber da
weiß ich nicht wie ich das schreiben soll. kann mir das vllt mal jemand so schreiben, das es funktioniert. evtl mit erklärung, was warum wo steht und was was macht^^
bütte :-)
Namenlosnameless
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Di 17.11.09 23:30 
Ich kenn Delphi nicht, trotzdem habe ich mir schonmal sowas geschrieben aber in VBA-Excel:

Prinzipiel ist eine Primzahl so definiert, das wenn man sie durch alle vorangegangenen Primzahlen dividiert keine ganze Zahl herauskommt.

d.h.

Du hast eine Schleife die von 3 bis a geht (allerdings in 2er Schritten da gerade Zahlen sowieso keine Primzahlen sein können.)
In dieser Schleife ist noch eine Schleife die a durch alle vorherigen Primzahlen dividiert. die 2te Schleife läuft solange bis die erste division eine ganze Zahl ergibt oder bis alle zahlen durchgelaufen wurden.
Mit einer if-abfage entscheiden lassen ob es eine Primzahl ist oder nicht.

Das ist mein Beitrag probiere es mal so nachzuschreiben! Näheres müssen dir Leute erklären die Delphi kennen!

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>


Zuletzt bearbeitet von Namenlosnameless am Fr 20.11.09 23:23, insgesamt 1-mal bearbeitet
ACeS Threadstarter
Hält's aus hier
Beiträge: 6

WIN XP
Delphi 7
BeitragVerfasst: Di 17.11.09 23:39 
thx für die antwort. so hab ich mir das auch iwie gedacht, aber wie schreibe ich das nun genau.
also ich kenn mich auch nicht so aus (eig gar nicht). hab erst seit 5-6 wochen informatik in der schule und bin noch relativ unsicher.
Namenlosnameless
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Fr 20.11.09 19:23 
ausblenden volle Höhe C#-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:
static void Main(string[] args)
        {
            Console.WriteLine("Geben sie eine Zahl ein die die höchste Primzahl sein kann");

            int a;
            int b;
            int c;
            double d;
            int Zähler;

            Zähler=0;
            d = 0;
            
            List<int> arr1 = new List<int>();
            arr1.Add(2);
            // in dieser Liste stehen alle Primzahlen ausßer 1


            //In diesem Stückchen wird einfach nur die höchstmögliche Zahl festgelegt und verhindert das das Programm durch eine falsche eingabe abstürzt
            try
            {
                 a = int.Parse(Console.ReadLine());
            }
            catch (FormatException)
            {
                Console.WriteLine("Bitte geben sie eine positive Zahl ein");
                a = int.Parse(Console.ReadLine());
            }

            //Ende der bestimmung von a


            // hier beginnt der Spannende Teil!
            
            for ( b=3;b<=a; b=b+2)
                //also die For-Schleife: b beginnt bei drei und soll bei a enden (b steht für alle potenziellen Primzahlen)
            {
                
                while ((arr1.Count!=Zähler))
                    //Die Schleife soll solange durchgeführt werden bis die Anzahl der Primzahlen in der Liste gleich der Anzahl an schon, für das durchdividiern, verwendeten Primzahlen
                {
                    c = arr1[Zähler];
                    // c wird die Zahl, die auf Position "Zähler" in der Liste arr1 steht!
                    //am Anfang ist Zähler noch null und c hat dadurch den Wert 2 weil an Position 0 von arr1 "2" steht.
                    d= (double)(b) / (c);
                    //Jezt wird dividiert.
                    Zähler = Zähler + 1;
                    //Zähler wächst damit beim nächsten mal Schleife durchlaufen die nächste Zahl aus der Liste ausgewählt wird!

                    if (d-Convert.ToInt32(d)==0)
                        // das ist eine Abfrage ob d eine integere Zahl ist, in dem man d weniger dem Integer-Anteil von d rechnet. kommt 0 heraus=>INTEGER!! kommt etwas anderes heraus=>kein Integer
                    {
                        Zähler = arr1.Count;
                        //wenn d eine integere Zahl ist steht fest das b keine Primzahl sein kann. Darum stellt man das Ergebnis der Bedingung der Schleife auf "False" damit her hinausspringt
                    }

                    else if(Zähler==arr1.Count)
                        //für den Fall das alle vorhergegangenen Primzahlen durchgelaufen sind ohne das eine integere Zahl erhalten wurde... d.h. Das Zähler gleich der Anzahl an Primzahlen in Liste arr1 ist springt das Programm hier herein
                    {
                        Console.WriteLine(b);
                        // b wird ausgegeben!
                        arr1.Add(b);
                        //b wird zur Liste arr1 hinzugefügt!
                    }


                }

                Zähler=0;
                //Zähler wird wieder auf Anfang gestellt um beim nächsten mal wieder alle Primzahlen aus arr1 auswählen zu können!
                
            }
            Console.ReadLine();
        }


hier ist der Code für C#!! Ich hab dir bei fast jeder Zeile dazugeschrieben was sie bringt!
Das was du noch machen musst ist das ganze in den Delphi-Code zu übersetzen!
Dabei kann ich dir nicht helfen

hoffe ich konnte helfen

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
ACeS Threadstarter
Hält's aus hier
Beiträge: 6

WIN XP
Delphi 7
BeitragVerfasst: Fr 20.11.09 20:56 
ja danke
jetzt weiß ich zumindest schonmal wie das programm rechnerisch funktioniert.
leider kann ich das selbst auch nicht übersetzen und kenne auch einige befehle nicht.
trotzdem danke. glaube mittlerweile, das die aufgabe ne scherzfrage des lehrers war und wir die gar nicht lösen können.
lg
Namenlosnameless
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 259
Erhaltene Danke: 6

Windows XP Home Edition, Windos Vista
C#
BeitragVerfasst: Fr 20.11.09 23:17 
naja so schwer ist das auch wieder nicht! also mit 6-7 Wochen programmieren vlt. schon, aber es gehört eher zu den basics der basics vom proggn!

Kleiner Tipp: Proggen wirst du nimals in der Schule oder so lernen! Sondern du musst dich zuhause hinsetzen und kleine Programme schreiben die dann immer komplexer werden. wenn dir was nicht klar ist dann benutze googel oder dieses Forum hier.
Das einzige was dir ein Lehrer wirkllich bringt ist dass er dich in deinem Lernprozess unterstützen kann und dir vlt ein paar bisics zeigen kann aber er wird dir nie alle 20-30k befehle von Delphi und C# oder anderen Sprachen beibringen können.

_________________
1:<<Life sucks!!>> 2:<< Well okay>> 1: <<Just Yours>> 2:<<Ohmph>>
Pepp3r
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Mo 27.09.10 16:53 
Der VOllständigkeit halber hier meine Lösung (Sieb des Eratosthenes)

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 Eratosthenes(bis: Integer);
  var
  keinePrim: Array of Boolean;
  i, step, ende: Integer;
begin
  setlength(keinePrim, bis);
  ende := round(sqrt(high(keinePrim)));
  //"0" und "1" Streichen
  keinePrim[0] := True;
  keinePrim[1] := True;
  //Sämmtliche Vielfache streichen
  for i:=2 to ende do
  begin
    if (keinePrim[i]) then
      continue;
    step := i;
    while step+i <= high(keinePrim) do
    begin
      step := step+i;
      if (keinePrim[i]) then
        continue;
      keinePrim[step] := True;
    end;
  end;
end;
{wenn keinePrim[i] = False ist, dann ist i eine Primzahl}
Einloggen, um Attachments anzusehen!