myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   PHP-Neuling (https://mygully.com/showthread.php?t=2058535)

Driller1407 08.06.10 19:43

PHP-Neuling
 
Also ich habe heute mit PHP angefangen und wollte dann auch meine ersten einfachen Skripts schreiben. Unter anderem wollte ich eine Skript schreiben, welches testet, ob es sich bei einer bestimmten Zahl um eine Primzahl handelt.
Also hab ich mir überlegt, dass das Skript erst einmal kontrollieren muss durch wie viele Zahlen die zu testende Zahl teilbar ist. (Das habe ich noch hinbekommen)
Jetzt wollte ich noch, dass das Skript bei einer Primzahl "Primzahl schreibt und bei einer Nicht Primzahl "Keine Primzahl" schreibt. Da ist mein Problem. Ich wollte das ganze mit if machen aber mir wird immer Primzahl angezeigt.

PHP-Code:

<?php

$prime
=12;
$start=1;
$count=0;
for (;
$start<=$prime;){
      if(
$prime%$start) {
       
$start++;}
      else {
$count++;
            
$start++;}       
}

if (
$count=2) {
    echo 
'Primzahl';}
else {echo 
'Keine Primzahl';
      echo 
$prime'hat'$count'Teiler';}
?>


urga 08.06.10 20:03

hehe,
a) gidf: [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
b) funktionen sind auch dein freund.
dann kannst du
Code:

function /*bool */ isPrime (/* int */$i) {
 // compute ...
 return $someBoolean;
}

if (isPrime (12)) {
 echo "ja";
}
else {
  echo "nein";
}

machen.

Driller1407 08.06.10 20:12

Okay Danke schon mal. Mich würde aber trotzdem interessieren, warum bei mir immer der obere Teil des If Bedingung angezeigt wird.

urga 08.06.10 20:22

naja, debuggen, debuggen und nochmals debuggen :P

deine funktion sieht ja fast so aus:
Code:

function isPrime ($i) {
        $prime = $i;
        $start = 1;
        $count = 0;
        for (; $start <= $prime ;){
                if($prime % $start) {
                        $start++;
                }
                else {
                        $count++;
                        $start++;
                }     
        }
        return $count == 2;
}

und da ist irgendetwas falsch.

edit :)

insbesondere ist:
Code:

if ($count=2) {
falsch :)

kramido 08.06.10 21:08

Zitat:

Zitat von urga (Beitrag 20854026)
insbesondere ist:
Code:

if ($count=2) {
falsch :)

Vielleicht klärst du ihn auch auf, wieso!

Bei PHP (ähnlich auch bei C/C++/Java) ist der Zuweisungsoperator = nicht das gleiche wie der Vergleichsoperator == (in PHP sogar noch === für typengerechte Vergleiche).

PHP interpretiert alle Zahlen außer 0 und alle Zeichenfolgen außer einem leeren String "" als TRUE, die restlichen Fälle als FALSE.

Code:

if ($count=2);
ist identisch mit
Code:

$count = 2;
if ($count);

Was du erreichen wolltest, ist zu prüfen, ob count gleich 2 ist. Das funktioniert so:
Code:

if ($count == 2);
Schöner ist noch nachfolgende Variante, die den Fehler der Verwechslung von Zuweisung und Vergleich verhindert:
Code:

if (2 == $count);
Ich empfehle nachfolgend immer letztes Beispiel einzusetzen!

urga 08.06.10 21:22

Zitat:

Vielleicht klärst du ihn auch auf, wieso!
nein. diese schmerzen muss man selbst erfahren. außerdem hab' ich bei seiner funktion per
Code:

return $count == 2;
einen hinweis geliefert. (und dadurch auch erst den fehler gefunden ;) )

kramido 08.06.10 21:43

Noch ein kleiner Hinweis zum Algorithmus:

Wenn du eine Zahl N testen willst, ob sie eine Primzahl ist, reicht es aus bis M*M >= N zu testen.

Zur Erklärung:
Sofern die Zahl N bis M keinen Teiler hat, so wird sie darüber auch keinen mehr finden.
Es reicht weitehrin aus, nur 2 und alle ungeraden Zahlen zu testen. Sollte N nicht durch 2 teilbar sein, ist sie durch keine gerade Zahl teilbar! Das halbiert schonmal die Zahlen, die untersucht werden müssen..

Beispiel:
Zahl ist 301. 19*19 ist > 301 => folglich nur bis 17 prüfen.
Zu Prüfen wären als Teiler:
2, 3, 5, 7, 9, 11, 13, 15, 17, Abbruch.

Vielleicht realisierst du das mal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.