Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Błędny wynik skryptu php
Dym71
post 24.01.2010, 13:21:27
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Witam Was wszystkich smile.gif
Jestem tu nowy, przed chwilą się zarejestrowałem ponieważ mam problem z PHP.

Mam za zadanie zsumować kolejne wyrażenia postaci 1/n (gdzie n=1,2,3,…). Sumowanie należy zakończyć gdy różnica dwóch ostatnio dodanych składników będzie mniejsza od podanej z formularza liczby (np. 0,0001).

Napisałem kod ale gdzieś jest błąd (możliwe że wszędzie dopiero zaczynam pisać w php wstydnis.gif ) ponieważ jakiej liczby (różnicy) bym nie podał suma wychodzi mi zero.

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  4. </head>
  5. <body alink="#000099" bgcolor="#000000" dir="ltr" link="#000099" text="#ffffff" vlink="#990099">
  6. <?php
  7. $z=$_GET['z'];
  8. $p=-1;
  9. $suma=0;
  10. for($i=1;$i==$p;++$i)
  11. {
  12. $pam=1/i;
  13. $suma=$suma+$pam;
  14. $pom=1/(i+1);
  15. $roz=$pam-$pom;
  16. if ($roz<$z)
  17. {
  18. $i=-1;
  19. };
  20. };
  21. echo "Suma wynosi $suma";
  22. ?>
  23. </body>
  24. </html>


Z góry dzięki za pomoc smile.gif
Go to the top of the page
+Quote Post
qrzysztof
post 24.01.2010, 13:27:07
Post #2





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Dzieje się tak bo nie wygląda na to żebyś do tej pętli w ogóle wchodził.
  1. for($i=1;$i==$p;++$i)

$p jest równe -1 a $i nigdy nie będzie - więc pętla ani razu się nie wykona.

A w ogóle to brakuje $ w paru miejscach, np jest i zamiast $i. Nie wiem czy przepisywałeś to czy kopiowałeś?

Ten post edytował qrzysztof 24.01.2010, 13:29:43


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Volume
post 24.01.2010, 13:29:05
Post #3





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 11.10.2004
Skąd: 3c

Ostrzeżenie: (10%)
X----


Poza tym co napisal qrzysztof to w petli przy "i" brakuje Ci znaku $ czyli ma byc nie "i" tylko zmienna $i

Ten post edytował Volume 24.01.2010, 13:30:11
Go to the top of the page
+Quote Post
Dym71
post 24.01.2010, 13:30:10
Post #4





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Cytat(qrzysztof @ 24.01.2010, 13:25:24 ) *
Dzieje się tak bo nie wygląda na to żebyś do tej pętli w ogóle wchodził.
  1. for($i=1;$i==$p;++$i)


Hmm, właśnie próbowałem jeszcze takie coś, testowe do 1000 i też mi nie działa sad.gif
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  4. </head>
  5. <body alink="#000099" bgcolor="#000000" dir="ltr" link="#000099" text="#ffffff" vlink="#990099">
  6. <?php
  7. $z=$_GET['z'];
  8. $p=1000;
  9. $suma=0;
  10. for($i=1;$i==$p;++$i)
  11. {
  12. $pam=1/i;
  13. $suma=$suma+$pam;
  14. $pom=1/(i+1);
  15. $roz=$pam-$pom;
  16. if ($roz<$z)
  17. {
  18. $i=1000;
  19. };
  20. };
  21. echo "Suma wynosi $suma";
  22. ?>
  23. </body>
  24. </html>


Teraz powinno działać ale niestety nie chodzi.



Aha to może przez to nie działa biggrin.gif Dzięki zaraz sprawdzę :*

Ten post edytował Dym71 24.01.2010, 13:31:25
Go to the top of the page
+Quote Post
qrzysztof
post 24.01.2010, 13:32:28
Post #5





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


To przypisanie $i=-1 musiałbyś gdzieś poza pętlą na przykład umieścić.

Przy $i=1000 też nie zadziała - bo to wszystko jest w pętli for - a pętla for ani razu się nie wykonuje.

I zanim sprawdzisz - popraw jeszcze błąd, o którym napisał Volume.

Ten post edytował qrzysztof 24.01.2010, 13:35:51


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Dym71
post 24.01.2010, 13:45:29
Post #6





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Cytat(qrzysztof @ 24.01.2010, 13:32:28 ) *
To przypisanie $i=-1 musiałbyś gdzieś poza pętlą na przykład umieścić.

Przy $i=1000 też nie zadziała - bo to wszystko jest w pętli for - a pętla for ani razu się nie wykonuje.

I zanim sprawdzisz - popraw jeszcze błąd, o którym napisał Volume.


Poprawiłem błąd który wskazał mi Volume - dzięki.

No niestety, chyba źle rozumiem składnię pętli.
Skoro $i=1 a $p=1000 to bez modyfikacji $i w środku pętli pętla powinna wykonać się 999 razy (albo 1000 już nie pamiętam tongue.gif) czy tak?
Jeżeli tak to skoro mam umieścić $i=-1 lub $i=1000 zależnie od wersji poza pętlą to jak mam ją kontrolować/przerwać (tzn. chodzi mi o przerwanie jej działania w odpowiednim momencie)?
Go to the top of the page
+Quote Post
qrzysztof
post 24.01.2010, 13:49:13
Post #7





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Jeśli chciałbyś żeby wykonała się 999 razy to musiałbyś mieć warunek $i<$p (czyli wykonuj pętle dopóki i$<$p). A masz tam równość (czyli wykonuj pętlę dopóki $i jest równe $p). A więc jeśli nie jest równe to nic się nie wykona ani razu.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Volume
post 24.01.2010, 13:57:36
Post #8





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 11.10.2004
Skąd: 3c

Ostrzeżenie: (10%)
X----


Cytat
No niestety, chyba źle rozumiem składnię pętli.
Skoro $i=1 a $p=1000 to bez modyfikacji $i w środku pętli pętla powinna wykonać się 999 razy (albo 1000 już nie pamiętam ) czy tak?
Jeżeli tak to skoro mam umieścić $i=-1 lub $i=1000 zależnie od wersji poza pętlą to jak mam ją kontrolować/przerwać (tzn. chodzi mi o przerwanie jej działania w odpowiednim momencie)?

Nie bradzo o to chodzi
  1. $p=1000;
  2. $suma=0;
  3. for($i=1;$i==$p;++$i)
  4. {...

pierwsze wyrazenie w petli for mowi od jakiej wartosci ma zaczac pozniejsze pokazwyanie wyniku w petli, drugie wyrazenie ile ma byc wykonanych powtorzen ale w tej postaci co Ty napisales to jest w ogole tu bez sensu gdyz ten opertor == jest to operator porownania (np. $a==$b znaczy ze prawda jeśli $a jest równe $b). W przypadku gdy np bys to zapisal w psotaci $i=$p byloby juz bardziej sensownie - ale wtedy petla by sie wykonala nieskonczona ilosc razy - dlatego trzeba jej dac do zrozumienia zeby w koncu sie zatrzymala dlatego nalezy dac zapis np. $i<$p czyli dla Twojego przykladu petla wykona sie 1000 razy jesli $p bedzi erowne 10 to 10 razy (oczywiscie wzgledem pierwszego wyrazenia jesli byloby rowne 0 ($i=0)) itd. Natomiast 3 wyrazenie mowi o ile ma sie zwiekszac wynik w petli. Takze kombinuj.

Obadaj podstawy: http://phpkurs.pl/operatory/ i http://phpkurs.pl/struktury/#struktury.for

Ten post edytował Volume 24.01.2010, 14:05:12
Go to the top of the page
+Quote Post
Dym71
post 24.01.2010, 14:46:19
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Kurcze, próbowałem z tą pętlą for i wydaje mi się że rozumiem piszę i niestety albo zero(nie przechodzi ani raz) albo jeden(przechodzi tylko raz).

Poczytałem tamte kursy i stwierdziłem że spróbuję z pętlą while.
Jest ona wykorzystywana w sytuacjach, kiedy niezbędne jest wykonywanie jakiejś operacji dopóki nie zostanie spełniony warunek.
Czyli:
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  4. </head>
  5. <body alink="#000099" bgcolor="#000000" dir="ltr" link="#000099" text="#ffffff" vlink="#990099">
  6. <?php
  7. $z=$_GET['z']; //wczytuję sobie $z z formularza
  8. $q=0; //ustawiam $q oraz $i i zeruję sumę-profilaktycznie
  9. $i=1;
  10. $suma=0;
  11. while($q<1) //pętla wykonuje się dopóki $q jest mniejsze od 1
  12. {
  13. $pam=1/$i; //zapamiętuje 1/1
  14. $suma=$suma+$pam; //sumuję wynik
  15. $pom=1/($i+1); //przewiduje następną wartość wyrażenia 1/n czyli 1/2=0,5
  16. $roz=$pam-$pom; //liczę różnicę między 1/n1 a 1/n2 czyli 1/1 i 1/2 dla pierwszego przejścia przez pętlę
  17. if ($roz<$z) //różnica wynosi 0,5 więc porównuję ją z różnicą wpisaną przez użytkownika, powiedzmy wpisałem 0,6 czyli różnica jest mniejsza więc $q=2 co powinno przerwać pętle
  18. {
  19. $q=2;
  20. };
  21. ++$i; //zwiększam $i
  22. };
  23. echo "Suma wynosi $suma"; //Tu powinna wyświetlić się suma lecz po kliknięciu ok wszystko się wiesza tak jakbym zapętlił pętlę
  24. ?>
  25. </body>
  26. </html>


Napisałem jak ja to rozumiem. Jeżeli źle bo np. w pętli trzeba zastosować inkrementację dla $q to ja nie wiem jak to zrobić. Jakbyście mogli przerobić ten kawałek kodu żeby mi działało to bym był bardzo wdzięczny i może bym zakumał. Nie wiem jakbym miał się zrewanżować winksmiley.jpg Jak ktoś mieszka we Wrocławiu to mogę piwo postawić tongue.gif

Ten post edytował Dym71 24.01.2010, 14:48:01
Go to the top of the page
+Quote Post
emtiej
post 24.01.2010, 14:51:56
Post #10





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 12.04.2009
Skąd: Rypin

Ostrzeżenie: (0%)
-----


Próbowałem to zrobić w taki sposób:

  1.  
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  5. </head>
  6. <body alink="#000099" bgcolor="#000000" dir="ltr" link="#000099" text="#ffffff" vlink="#990099">
  7. <?php
  8.  
  9. $liczba_podana = $_GET['liczba'];
  10. $suma = 0;
  11. $koniec = 0;
  12.  
  13. for($i=1;$i>=$koniec;$i++)
  14. {
  15. echo "Wykonanie";
  16. $skl1 = 1/$i; //ostatni "skladnik"
  17. if($i!=1) // zabezpieczenie przed dzieleniem przez 0
  18. {
  19. $skl2 = 1/$i-1; //przedostatni "skladnik"
  20. }
  21. if($i==1)
  22. {
  23. $skl2 = 1;
  24. }
  25. $suma=$suma+$skl1;
  26. if(($skl2-$skl1)<$liczba_podana)
  27. {
  28. break;
  29. }
  30. }
  31.  
  32. echo "Suma wynosi $suma";
  33. ?>
  34. </body>
  35. </html>
  36.  


Coś tam zaczyna liczyć, ale przerywa na 1,5 nie wiem dlaczego, wykonuje się tylko 3 razy, dopracuj, przypatrz się może to ci pomoże, ja muszę lecieć i nie mam czasu go dokończyć smile.gif Zrobiłem to na pętli nieskończonej a w środku jest instrukcja break która przerywa jej wykonanie, kiedy warunek się spełni.
Go to the top of the page
+Quote Post
Szeszek1992
post 24.01.2010, 15:03:39
Post #11





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

Ostrzeżenie: (0%)
-----


  1. <?php
  2. $dokladnosc=0.2;
  3. $s2=1;
  4. $suma=0;
  5. $i=1;
  6. $roznica=1.00000000001;//Tak na wszelki wypadek, jakby ktoś dał dokładność >1;)
  7. while($roznica>$dokladnosc)
  8. {
  9. $suma=$suma+$s2;
  10. $s1=$s2;
  11. $i++;
  12. $s2=1/$i;
  13.  
  14. $roznica=$s1-$s2;
  15. }
  16. echo $suma;
  17. ?>

Formatowanie html'owskie zrób wg własnego uznania.

Ten post edytował Szeszek1992 24.01.2010, 15:20:00


--------------------
Go to the top of the page
+Quote Post
Dym71
post 24.01.2010, 15:28:23
Post #12





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Cytat(Szeszek1992 @ 24.01.2010, 15:03:39 ) *
  1. <?php
  2. $dokladnosc=0.2;
  3. $s2=1;
  4. $suma=0;
  5. $i=1;
  6. $roznica=1.00000000001;//Tak na wszelki wypadek, jakby ktoś dał dokładność >1;)
  7. while($roznica>$dokladnosc)
  8. {
  9. $suma=$suma+$s2;
  10. $s1=$s2;
  11. $i++;
  12. $s2=1/$i;
  13.  
  14. $roznica=$s1-$s2;
  15. }
  16. echo $suma;
  17. ?>

Formatowanie html'owskie zrób wg własnego uznania.


No dzięki wielkie smile.gif
Po przeczytaniu i zrozumieniu powinno śmigać, ale u mnie nie działa i może coś nie tak mam z serwerem chociaż inne skrypty działają sadsmiley02.gif
Mam identycznie tylko że dokładność wczytuję z formularza jako $z i niestety po kliknięciu ładuje się, myśli i myśli i nic.
Testowałeś to u siebie??


Kod:

  1. <?php
  2. $z=$_GET['z'];
  3. $s2=1;
  4. $i=1;
  5. $suma=0;
  6. $roznica=100;
  7. while($roznica>$z)
  8. {
  9. $suma=$suma+$s2;
  10. $s1=$s2;
  11. $i++;
  12. $s2=1/$i;
  13. $roznica=$s1-$s2;
  14. }
  15. echo "Suma wynosi $suma";
  16. ?>


Ten post edytował Dym71 24.01.2010, 15:29:31
Go to the top of the page
+Quote Post
Szeszek1992
post 24.01.2010, 15:38:31
Post #13





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

Ostrzeżenie: (0%)
-----


  1. <?php
  2. echo '<form action="index.php" method="post"><input type="text" name="z"><input type="submit" value="Wyślij"></form><br>';
  3. if(isset($_POST['z']))
  4. {
  5. if($_POST['z']>0)
  6. {
  7. $dokladnosc=$_POST['z'];
  8. $s2=1;
  9. $suma=0;
  10. $i=1;
  11. $roznica=1.00000000001;//Tak na wszelki wypadek, jakby ktoś dał dokładność >1;)
  12. while($roznica>$dokladnosc)
  13. {
  14. $suma=$suma+$s2;
  15. $s1=$s2;
  16. $i++;
  17. $s2=1/$i;
  18.  
  19. $roznica=$s1-$s2;
  20. }
  21. echo $suma;
  22. }else echo 'Nieprawidłowe dane';//Zapętliłoby się, jeśli ktoś dałby 0
  23. }
  24. ?>

Dorobiłem formularz do swego kodu;) Działa na pewno, testowałem. Nie zapomnij, że w PHP część ułamkową oddzielamy kropką, a nie przecinkiem.

PS $dokladnosc możesz zamienić na $z

Ten post edytował Szeszek1992 24.01.2010, 15:41:03


--------------------
Go to the top of the page
+Quote Post
Dym71
post 24.01.2010, 16:10:11
Post #14





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Cytat(Szeszek1992 @ 24.01.2010, 15:38:31 ) *
  1. <?php
  2. echo '<form action="index.php" method="post"><input type="text" name="z"><input type="submit" value="Wyślij"></form><br>';
  3. if(isset($_POST['z']))
  4. {
  5. if($_POST['z']>0)
  6. {
  7. $dokladnosc=$_POST['z'];
  8. $s2=1;
  9. $suma=0;
  10. $i=1;
  11. $roznica=1.00000000001;//Tak na wszelki wypadek, jakby ktoś dał dokładność >1;)
  12. while($roznica>$dokladnosc)
  13. {
  14. $suma=$suma+$s2;
  15. $s1=$s2;
  16. $i++;
  17. $s2=1/$i;
  18.  
  19. $roznica=$s1-$s2;
  20. }
  21. echo $suma;
  22. }else echo 'Nieprawidłowe dane';//Zapętliłoby się, jeśli ktoś dałby 0
  23. }
  24. ?>

Dorobiłem formularz do swego kodu;) Działa na pewno, testowałem. Nie zapomnij, że w PHP część ułamkową oddzielamy kropką, a nie przecinkiem.

PS $dokladnosc możesz zamienić na $z



Dzięki za wszystko, niestety u mnie nie działa a próbowałem na krasnalu, webserw i easyphp. W identycznej formie po wpisaniu liczby i kliknięciu ok pojawia mi się nowy formularz i nic więcej a gdy do niego wpiszę i kliknę wyślij to jest pusto - nie ma nic.

po usunięciu 2 linijki kodu:
  1. echo '<form action="index.php" method="post"><input type="text" name="z"><input type="submit" value="Wyślij"></form><br>';

i wpisaniu liczby w mój formularz i kliknięciu ok wszystko znika (to samo tylko że nie ma 2 formularzu).

Nie wiem w czym rzecz. Może jakieś złe ustawienie PHP, opcja register_globals ma być aktywna?
Go to the top of the page
+Quote Post
emtiej
post 24.01.2010, 16:59:47
Post #15





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 12.04.2009
Skąd: Rypin

Ostrzeżenie: (0%)
-----


Skrypt śmiga, register_globals dla bezpieczeństwa wszędzie powinna być na OFF ustawiona z powodów bezpieczeństwa, możliwe że twoje ustawienie PHP nie daje możliwości używania skróconych nazw $_POST[''], spróbuj $HTTP_POST_VARS[''];

Dla testu cały kod prócz formularza weź sobie w komentarz, mianowicie:

  1. <?php
  2. echo '<form action="index.php" method="post"><input type="text" name="z"><input type="submit" value="Wyślij"></form><br>';
  3. /*
  4.   if(isset($_POST['z']))
  5.   {
  6.   if($_POST['z']>0)
  7.   {
  8.   $dokladnosc=$_POST['z'];
  9.   $s2=1;
  10.   $suma=0;
  11.   $i=1;
  12.   $roznica=1.00000000001;//Tak na wszelki wypadek, jakby ktoś dał dokładność >1;)
  13.   while($roznica>$dokladnosc)
  14.   {
  15.   $suma=$suma+$s2;
  16.   $s1=$s2;
  17.   $i++;
  18.   $s2=1/$i;
  19.  
  20.   $roznica=$s1-$s2;
  21.   }
  22.   echo $suma;
  23.   }else echo 'Nieprawidłowe dane';//Zapętliłoby się, jeśli ktoś dałby 0
  24.   }
  25.   */
  26. ?>

a za wyświetlaniem formularza daj

  1. echo $_POST['z']." - skrócona nazwa tablicy <br />";
  2.  
  3. echo $HTTP_POST_VARS['z']." - długa nazwa tablicy";


Jak przetestujesz to daj znać co się dzieje
Go to the top of the page
+Quote Post
Szeszek1992
post 24.01.2010, 17:05:40
Post #16





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

Ostrzeżenie: (0%)
-----


Tak dla pewności: Nazwa pliku skryptu musi być taka sama jak nazwa podana w <form>, czyli np. index.php


--------------------
Go to the top of the page
+Quote Post
Dym71
post 24.01.2010, 17:54:26
Post #17





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Niestety nawet dając tylko
echo $_POST['z']." - skrócona nazwa tablicy <br />";

echo $HTTP_POST_VARS['z']." - długa nazwa tablicy";

Nie wyświetla mi tego co wpisałem w formularzu. Wyświetla tylko:
- skrócona nazwa tablicy
- długa nazwa tablicy

bez żadnej wartości zmiennej $z



Wrzuciłem tutaj trzy pliki:
zad7.htm z formularzem
zad7.php plik z kodem
screen.jpg screen po wpisaniu wartości i kliknięciu ok

Jak ktoś może je sprawdzić to bym był bardzo wdzięczny.
Go to the top of the page
+Quote Post
Szeszek1992
post 24.01.2010, 18:06:44
Post #18





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

Ostrzeżenie: (0%)
-----


W zad7.php popraw to, co masz w <form>(zmień z index.php na zad7.php).
Poza tym wszystko działa


--------------------
Go to the top of the page
+Quote Post
Dym71
post 24.01.2010, 19:27:40
Post #19





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 24.01.2010

Ostrzeżenie: (0%)
-----


Dziękuję Wam wszystkim za pomoc, wszystko śmiga. Naprawdę bardzo dobre forum, miła atmosfera bo mili ludzie - nie to co na innych "forach" sami prowokatorzy. Pozdrawiam i jeszcze raz dzięki smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 13:21