Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pierwszy kod, Zapytanie o poprawność i optymalizacje
-lukasamd-
post 11.06.2007, 16:23:39
Post #1





Goście







Witam,
niedawno nie miałem dostępu do internetu i postanowiłem zajrzeć do jakiejś książeczki o PHP którą u siebie znalazłem. Skorzystałem z PSPada i serwera Apache który postawiłem u mnie aby sprawdzić czy kod który napisałem działa.

Na początku miało to być liczenie potęg liczby 2 (od 2^1 do 2^10), w tracie robienia pojąłem nieco o co chodzi i nieco rozbudowałem skrypt i teraz wygląda on tak:

  1. <?php
  2. // Sprawdzanie danych z GET
  3. if (isset($_GET['liczba'])) $liczba=trim($_GET['liczba']);
  4. if (isset($_GET['potegi'])) $potegi=trim($_GET['potegi']);
  5. ?>
  6.  
  7.  
  8.  
  9. <form action="index.php" method="GET">
  10. Liczba podnoszona do potęgi: <input type="text" name="liczba" value="<?php echo $liczba; ?>" />
  11. <br><br>
  12. Do której potęgi: <input type="text" name="potegi" value="<?php echo $potegi; ?>" />
  13. <input type="submit" value="OK" />
  14.  
  15. <?php
  16.  
  17. // Zapamiętanie liczby podanej na starcie
  18.  
  19. $x = $liczba;
  20. if($liczba<>0)
  21. {
  22. echo('<br><br><b>Kolejne potęgi liczby '.$liczba.'</b><br><br>');
  23. for($potega=0;$potega<=$potegi;$potega++)
  24. {
  25.  
  26. // Liczenie wartoci potęgi
  27.  
  28. for($y=1;$y<$potega;$y++)
  29. {
  30. $liczba = $liczba * $x;
  31. }
  32. echo($x.'^'.$potega.' = '.$liczba);
  33. echo('<br>');
  34.  
  35. // Wczytanie podstawowej liczby
  36.  
  37. $liczba = $x;
  38. }
  39. }
  40. else
  41. {
  42. echo('Niewłaciwa liczba!');
  43. }
  44. ?>


Chciałbym się zapytać czy jest on poprawny i czy działa w sposób optymalny - to mój pierwszy skrypt i chciałbym aby był jak najbardziej dopracowany a IMO działa on dobrze, z związku z tym mam pytanka.

1. Liczby po pobraniu z formularza są zapisywane jako dane typu STRING - przez warunek if($liczba<>0) nie da się wyliczać dla 0 ale także dla znaków typu: "A", "B", "C", "D" itp. co jest mi na rękę. Czy to można uznać to za rozwiązanie poprawne czy lepeij dokonać konwersji na typ integer poprzez intval($liczba)?

2. Czy w skrypcie dobrze użyłem apostrofy i cudzysłowy? Wiem że różnica jest kolosalna i ważna dla optymalizacji skryptu.
Go to the top of the page
+Quote Post
thornag
post 11.06.2007, 16:37:03
Post #2





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


Hej,

Skrypt wydaje sie ok, apostrofy tez, aczkolwiek moze warto zapoznac sie z manualem juz teraz smile.gif

pow() zrobi to co chciales napewno szybciej, pozostaje jedynie dopisac otoczke smile.gif

Co do filtrowania parametrow, to zalezy od specyfikacji i zalozen projektu nad ktorym pracujesz. Jesli zalozenie jest takie (woje, klienta etc) ze ma to byc konwertowane i wyliczane to konwertowac, ja ma byc zgloszony blad to zglaszac biggrin.gif

I pomysl sobie co bedzi ejesli wprowadze wykladnik mniejszy od zera ? jak wiadomo podstawa powinna byc spotegowana a wynik przedstawiony jako jej odwrotnosc (<- to chyba dobry keyword prawda ?) ogolnie 1/n gdzie n to podstawa do potegi.


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
-lukasamd-
post 12.06.2007, 15:12:07
Post #3





Goście







Cytat(thornag @ 11.06.2007, 17:37:03 ) *
pow() zrobi to co chciales napewno szybciej, pozostaje jedynie dopisac otoczke smile.gif


Hehehe a ja jak głupi ciągle zastanawiałem się dlaczego nie działa kombinacja $liczba^$potega winksmiley.jpg

No cóż... na błędach człowiek się uczy winksmiley.jpg

EDIT:
Zmodyfikowałem kod i teraz wygląda to tak, liczy i dla potęg dodatnich i dla ujemnych choć w tym drugim wypadku w formie np. 4^-1 = 0.25

  1. <?php
  2. // Sprawdzanie danych z GET
  3. if (isset($_GET['liczba'])) $liczba=trim($_GET['liczba']);
  4. if (isset($_GET['potegi'])) $potegi=trim($_GET['potegi']);
  5. ?>
  6.  
  7. <form action="potegi2.php" method="GET">
  8. Liczba podnoszona do potęgi: <input type="text" name="liczba" value="<?php echo $liczba; ?>" />
  9. <br><br>
  10. Do której potęgi: <input type="text" name="potegi" value="<?php echo $potegi; ?>" />
  11. <input type="submit" value="OK" />
  12.  
  13. <?php
  14.  
  15. // Zapamiętanie liczby podanej na starcie
  16.  
  17. if($liczba<>0)
  18. {
  19. echo('<br><br><b>Kolejne potęgi liczby '.$liczba.'</b><br><br>');
  20.  
  21. // Dla potęg mniejszych niż 0
  22.  
  23. if($potegi<0)
  24. {
  25. for($potega=0;$potega<=-$potegi;$potega++)
  26. {
  27. for($y=0;$y<=$potega;$y++) $wynik=pow($liczba,-$potega);
  28. echo($liczba.'^'.-$potega.' = '.$wynik);
  29. echo('<br>');
  30. }
  31. }
  32.  
  33. // Dla potęg większych niż 0
  34.  
  35. else
  36. {
  37. for($potega=0;$potega<=$potegi;$potega++)
  38. {
  39. for($y=0;$y<=$potega;$y++) $wynik=pow($liczba,$potega);
  40. echo($liczba.'^'.$potega.' = '.$wynik);
  41. echo('<br>');
  42. }
  43. }
  44. }
  45. else
  46. {
  47. echo('Niewłaciwa liczba!');
  48. }
  49. ?>


Jeszcze zmienię bo chyba jednak lepeij będzie gdy będzie pokazywał 1/n albo zrobię aby pokazywał obie formy (jeszcze nie jestem pewien). Co do komunikatu - nad tym też jeszcze popracuję.

Zmodyfikowałem dzisiaj kod aby usunąć niepotrzebne 2 pętle które były w poprzedniej wersji i dołożyłem pokazywanie minusowych potęg jako 1/n. Zmieniłem także zapis na nieco krótszy ponieważ sądzę że przy istniejących pętlach nie musiałem używać kilka razy funkcji echo(), postanowiłem połączyć napisy.

  1. <?php
  2. // Sprawdzanie danych z GET
  3. if (isset($_GET['liczba'])) $liczba=trim($_GET['liczba']);
  4. if (isset($_GET['potegi'])) $potegi=trim($_GET['potegi']);
  5. ?>
  6.  
  7. <form action="potegi2.php" method="GET">
  8. Liczba podnoszona do potęgi: <input type="text" name="liczba" value="<?php echo $liczba; ?>" />
  9. <br><br>
  10. Do której potęgi: <input type="text" name="potegi" value="<?php echo $potegi; ?>" />
  11. <input type="submit" value="OK" />
  12.  
  13. <?php
  14.  
  15. // Zapamiętanie liczby podanej na starcie
  16.  
  17. if($liczba<>0)
  18. {
  19. echo('<br><br><b>Kolejne potęgi liczby '.$liczba.'</b><br><br>');
  20.  
  21. // Dla potęg mniejszych niż 0
  22.  
  23. if($potegi<0)
  24. {
  25. for($potega=0;$potega<=-$potegi;$potega++) echo($liczba.'^'.-$potega.' = '.pow($liczba,-$potega).' = 1/'.pow($liczba,$potega).'<br>');
  26. }
  27. // Dla potęg większych niż 0 
  28. else
  29. {
  30. for($potega=0;$potega<=$potegi;$potega++) echo($liczba.'^'.$potega.' = '.pow($liczba,$potega).'<br>');
  31. }
  32. }
  33. else
  34. {
  35. echo('Niewłaciwa liczba!');
  36. }
  37. ?>


Zadowolenie z tego że to napisałem i że działa jest niesamowite smile.gif

Ten post edytował lukasamd 11.06.2007, 17:13:12
Go to the top of the page
+Quote Post
thornag
post 12.06.2007, 15:51:37
Post #4





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


No to teraz zrob sobie z tego funckje. DLa treningu. I jeszcze tylko przyczepilbym sie do nazw zmiennych. Sprobuj tak ponazywac zmienne zeby od razu bylo wiadomo co one przechowuja, czyli jak np zamiast $poteki mozna by zmienic na $iWykladnik, a $liczba na $iPodstawa mysle ze to bardziej rpzejrzyste. I jak widac jestem zwolennikiem notacji wegierskiej, co za tym idzie nazwy zmiennych zaczynaja sie jedna literka okreslajaca jej tym u mnie:
i - integer,
s- string,
o - object,
m - mixed
a - array,
r - resource

A pozniej to juz NormalnieCamelCaseZebyLadnieByloWidacCoIJak.

Pozdrawiam.


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
-lukasamd-
post 12.06.2007, 20:12:06
Post #5





Goście







Nie wiem czy o to dokładnie chodziło ale w funkcjach i działając wygląda u mnie teraz tak:

  1. <?php
  2. // Sprawdzanie danych z GET
  3. if (isset($_GET['iPodstawa'])) $iPodstawa=trim($_GET['iPodstawa']);
  4. if (isset($_GET['iWykladnik'])) $iWykladnik=trim($_GET['iWykladnik']);
  5. ?>
  6.  
  7. <form action="<?php echo($_SERVER["PHP_SELF"]); ?>" method="GET">
  8. Podstawa potęgi: <input type="text" name="iPodstawa" value="<?php echo $iPodstawa; ?>" />
  9. <br><br>
  10. Do jakiego wykładnika: <input type="text" name="iWykladnik" value="<?php echo $iWykladnik; ?>" />
  11. <input type="submit" value="OK" />
  12.  
  13. <?php
  14. function potengi_dodatnie()
  15. {
  16. global $iPodstawa;
  17. global $iPrzebieg;
  18. echo($iPodstawa.'^'.$iPrzebieg.' = '.pow($iPodstawa,$iPrzebieg).'<br>');
  19. } 
  20.  
  21. function potengi_ujemne()
  22. {
  23. global $iPodstawa;
  24. global $iPrzebieg;
  25. echo($iPodstawa.'^'.-$iPrzebieg.' = '.pow($iPodstawa,-$iPrzebieg).' = 1/'.pow($iPodstawa,$iPrzebieg).'<br>');
  26. }
  27.  
  28. if($iPodstawa<>0)
  29. {
  30. echo('<br><br><b>Kolejne potęgi liczby '.$iPodstawa.'</b><br><br>');
  31. if($iWykladnik<0) for($iPrzebieg=0;$iPrzebieg<=-$iWykladnik;$iPrzebieg++) potengi_ujemne();
  32. else for($iPrzebieg=0;$iPrzebieg<=$iWykladnik;$iPrzebieg++) potengi_dodatnie();
  33. }
  34. else echo('Niewłaciwa podstawa!');
  35. ?>


Ten post edytował lukasamd 12.06.2007, 20:13:47
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: 29.03.2024 - 16:42