Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Rozbudowane dzielenie
mlody69
post 2.12.2010, 20:08:09
Post #1





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


Witam,
chcę napisać skrypt, który dzieli jedną liczbę na wiele. Najlepiej pokażę to na przykładzie bo opisać tego nie potrafię.
A więc
Mam przykładowo liczbę
26 i chcę ją podzielić aby wyszły trzy liczby, które po przemnożeniu przez dane wartości wyniesie 26.

jedna liczba=3
druga=1
trzecia=0

I pierwszą mnożę przez 6 , drugą przez 8 a trzecią 10
Wychodzi: 3*6+1*8+0*10=26.

Myślę, że jasno to przedstawiłem smile.gif
Go to the top of the page
+Quote Post
mmica
post 2.12.2010, 20:38:30
Post #2





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


Hey ;]

Właśnie napisałem Ci coś takiego, ale na chwilę obecną musisz obyć się bez komentarza (i komentarzy ;]), bo muszę właśnie wychodzić - dodałem komentarze do kodu. Wydaje mi się, że kod powinien być w miarę jasny, a oto on:
  1. <?php
  2. $liczba = 26; // liczba do podzielenia
  3. $faktory = $liczba/3; // 3 - ilosc skladnikow wyniku
  4. $dzielniki = array(); // nasze przyszle iloczyny...
  5. $wyniki_czesciowe = array(); // podzielone przez dzielniki faktory
  6.  
  7. for($i=0; $i<3;)
  8. {
  9. $wylosowana=rand(1,10); // losuje liczbe z zakresu 1-10
  10.  
  11. // jezeli wylosowana liczba nie zostala jeszcze wylosowana
  12. // dodaj ja do dzielnikow i inkrementuj $i
  13. // w przeciwnym wypadku wykonaj przebieg petli jeszcze raz
  14. if(!in_array($wylosowana, $dzielniki))
  15. {
  16. $dzielniki[$i] = $wylosowana;
  17. ++$i;
  18. }
  19. }
  20.  
  21. for($i=0; $i<3; $i++)
  22. {
  23. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  24. }
  25.  
  26. // Wyswietlanie rownania
  27. for($i=0; $i<3; $i++)
  28. {
  29. echo '('.$wyniki_czesciowe[$i].'*'.$dzielniki[$i].')';
  30. if($i==2)
  31. {
  32. echo '='.$liczba;
  33. } else
  34. {
  35. echo '+';
  36. }
  37. }
  38. ?>


Pozdrawiam,
mmica

Ten post edytował mmica 2.12.2010, 21:28:32


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
Go to the top of the page
+Quote Post
mlody69
post 2.12.2010, 21:58:52
Post #3





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


Bardzo dziękuję, troche mi to rozjaśniło jednak ja potrzebuję tylko liczb całkowitych, bez liczb po przecinku i nie bardzo wiem jak to zmienić
Go to the top of the page
+Quote Post
mmica
post 2.12.2010, 22:10:56
Post #4





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


To akurat nie jest problemem winksmiley.jpg, ale musisz pamiętać, że tracisz wtedy na dokładności. Rozwiązanie:
w linii 29. masz:
  1. echo '('.$wyniki_czesciowe[$i].'*'.$dzielniki[$i].')';

zamień na:
  1. echo '('.(int)$wyniki_czesciowe[$i].'*'.(int)$dzielniki[$i].')';

Zostało tu wykorzystane rzutowanie na liczbę całkowitą (int), przez co przy okazji została odrzucona część ułamkowa.

//edit: doszedłem do wniosku, że lepiej będzie jak użyjesz funkcji round(). Zaokrągli ona wyniki i utnie ułamki, a więc w linii 29.:
  1. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';


Pozdrawiam,
mmica

Ten post edytował mmica 2.12.2010, 22:17:45


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
Go to the top of the page
+Quote Post
mlody69
post 2.12.2010, 22:30:05
Post #5





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


No tak, w sumie to było proste. Jednak dalej mój skrypt wymaga, że liczby przez które są mnożone losowe liczby musza być stałe, tak jak napisałem:6,8,10 i ósemka nie może być mnożona więcej niż 12 razy a dziesiątka więcej niż 4. PRzepraszam, że wcześniej tego nie napisałem ale tak wyszło w trakcie.
Go to the top of the page
+Quote Post
mmica
post 2.12.2010, 22:42:29
Post #6





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


Czyli inaczej mówiąc, skrypt musi znaleźć odpowiednie czynniki do czynników 6, 8, 10, tak, aby suma tych trzech składników będących iloczynami tychże czynników była równa 26? Pomieszałem chyba trochę, ale tak to zrozumiałem winksmiley.jpg

Pozdrawiam,
mmica

Ten post edytował mmica 2.12.2010, 22:42:47


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
Go to the top of the page
+Quote Post
mlody69
post 2.12.2010, 22:49:24
Post #7





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


Tak, oczywiście nie bedzie to ciągle używana liczba 26 tylko jakaś zmienna. Ale o to chodzi.
Go to the top of the page
+Quote Post
mmica
post 3.12.2010, 06:14:53
Post #8





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


Taka modyfikacja kodu i mamy to co chcemy:
  1. <?php
  2. $liczba =123; // liczba do podzielenia
  3. $faktory = $liczba/3; // 3 - ilosc skladnikow wyniku
  4. $dzielniki = array(6, 8, 10); // stale czynniki
  5. $wyniki_czesciowe = array(); // podzielone przez dzielniki faktory
  6.  
  7. for($i=0; $i<3; $i++)
  8. {
  9. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  10. }
  11.  
  12. // Wyswietlanie rownania
  13. for($i=0; $i<3; $i++)
  14. {
  15. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';
  16. if($i==2)
  17. {
  18. echo '='.$liczba;
  19. } else
  20. {
  21. echo '+';
  22. }
  23. }
  24. ?>


Pozdrawiam,
mmica


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
Go to the top of the page
+Quote Post
mlody69
post 3.12.2010, 13:01:13
Post #9





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


A możliwe jest zrobienie takiego czegoś,że czynniki 8 i 10 nie mogą być mnożone przez liczbę większą przez 12 i 10?
Go to the top of the page
+Quote Post
mmica
post 3.12.2010, 14:55:55
Post #10





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


Hey ;]

Coś Ci zdanie nie wyszło. Rozumiem, że chcesz uniemożliwić mnożenie czynników 8 i 10 przez, odpowiednio, 12 i 10. Jeżeli tak, to skrypt wygląda następująco (zwróć uwagę na linie 13. - 19.):
  1. <?php
  2. $liczba = 1231276;
  3. $faktory = $liczba/3;
  4. $dzielniki = array(6, 8, 10);
  5. $wyniki_czesciowe = array();
  6.  
  7. for($i=0; $i<3; $i++)
  8. {
  9. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  10. }
  11.  
  12. /* ----------------------------------------------------- */
  13. if($wyniki_czesciowe[2] > 12) // czynnik oddzialujacy na dzielnik 2 (8)
  14. {
  15. die('Czynnik 8 chce byc pomnozony przez liczbe wieksza niz 12! Operacja przerwana.');
  16. } elseif($wyniki_czesciowe[3] > 10) // czynnik oddzialujacy na dzielnik 3 (10)
  17. {
  18. die('Czynnik 10 chce byc pomnozony przez liczbe wieksza niz 10! Operacja przerwana.');
  19. }
  20. /* ----------------------------------------------------- */
  21.  
  22. // Wyswietlanie rownania
  23. for($i=0; $i<3; $i++)
  24. {
  25. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';
  26. if($i==2)
  27. {
  28. echo '='.$liczba;
  29. } else
  30. {
  31. echo '+';
  32. }
  33. }
  34. ?>


Cytat
A możliwe jest [..]

Możliwe jest wszystko winksmiley.jpg. Wystarczy tylko ruszyć głową i użyć wyobraźni, bo po coś ją mamy (spójrz na moją sygnaturę [cytat Einstein'a]).

Pozdrawiam,
mmica

Ten post edytował mmica 3.12.2010, 14:57:24


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
Go to the top of the page
+Quote Post
mlody69
post 3.12.2010, 15:06:42
Post #11





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


No tak, nie wyszło. Chodziło mi o to aby czynniki 8 i 10 nie były mnożone przez liczbę większą niż 12 i 10.
Czyli może to wyglądać tak
6*14
8*12
10*10

a nie:
6*14
8*26
10*17
Go to the top of the page
+Quote Post
mmica
post 3.12.2010, 15:14:05
Post #12





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


Czyli nie mają być mnożone, ale równie ma zostać wykonane tak, aby zrzucić ciężar na czynnik '6' (zdjąć nadmiar z pozostałych czynników)? Pytam bo nie chcę pisać kolejnych linii kodu, który i tak się nie przyda tongue.gif.

Pozdrawiam,
mmica


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
Go to the top of the page
+Quote Post
mlody69
post 3.12.2010, 15:25:04
Post #13





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


Dokładnie.

P.S Bardzo Ci dziękuję za pomoc i zainteresowanie winksmiley.jpg
Go to the top of the page
+Quote Post
mmica
post 3.12.2010, 17:39:43
Post #14





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


Hey ;]

Ze zmarzniętymi paluchami ciężko nawet echo() napisać, ale po bardziej krótkich niż długich zmaganiach (przedłużyły się, bo głupi zacząłem liczyć indeksy tablicy od 1..) wymyśliłem coś takiego (interesują Cię linie 13. - 25.):
  1. <?php
  2. $liczba = 1000;
  3. $faktory = $liczba/3;
  4. $dzielniki = array(6, 8, 10);
  5. $wyniki_czesciowe = array();
  6.  
  7. for($i=0; $i<3; $i++)
  8. {
  9. $wyniki_czesciowe[$i]=$faktory/$dzielniki[$i];
  10. }
  11.  
  12. // --------------------------------------------------
  13. if($wyniki_czesciowe[2] > 10)
  14. {
  15. $do_dodania = ($wyniki_czesciowe[2]*10)-(10*10);
  16. $wyniki_czesciowe[2] = 10;
  17. $wyniki_czesciowe[0] += $do_dodania/6;
  18. }
  19.  
  20. if($wyniki_czesciowe[1] > 12)
  21. {
  22. $do_dodania = ($wyniki_czesciowe[1]*8)-(8*12);
  23. $wyniki_czesciowe[1] = 12;
  24. $wyniki_czesciowe[0] += $do_dodania/6;
  25. }
  26. // --------------------------------------------------
  27.  
  28.  
  29. // Wyswietlanie rownania
  30. for($i=0; $i<3; $i++)
  31. {
  32. echo '('.round($wyniki_czesciowe[$i]).'*'.round($dzielniki[$i]).')';
  33. if($i==2)
  34. {
  35. echo '='.$liczba;
  36. } else
  37. {
  38. echo '+';
  39. }
  40. }
  41. ?>


Nie ma za co dziękować, ja chcę więcej takich tongue.gif. Przynajmniej ciekawsze niż klepanie kolejnego skryptu komentarzy..

Pozdrawiam,
mmica


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
Go to the top of the page
+Quote Post
mlody69
post 3.12.2010, 18:26:51
Post #15





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 18.05.2009

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


Czyli teraz jak dzielniki 6,8,10 będę chciał zamienić na inne to zmienam zmienną dzielniki oraz
  1. $do_dodania = ($wyniki_czesciowe[2]*14)-(10*14);
  2. $do_dodania = ($wyniki_czesciowe[1]*9)-(9*12);
Go to the top of the page
+Quote Post
mmica
post 3.12.2010, 18:38:54
Post #16





Grupa: Zarejestrowani
Postów: 60
Pomógł: 20
Dołączył: 30.11.2010
Skąd: 127.0.0.1

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


Tak. Możesz się jeszcze pobawić z define() i niektóre rzeczy pozamieniać na zmienne etc., aby kod był bardziej elastyczny i zrozumiały, bo ja sobie tu użyłem skrótu myślowego i nie wiem czy ktokolwiek od razu zajarzyłby o co chodzi w np. tej linijce:
  1. $do_dodania = ($wyniki_czesciowe[2]*14)-(10*14);

Skrypt można nazwać względnie pożytecznym przykładem matematyki praktycznej happy.gif

Pozdrawiam,
mmica


--------------------
"Imagination is more important than knowledge, because knowledge is limited." ~Albert Einstein
<?php $var = array('foo', 'bar'); ?>
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: 31.07.2025 - 00:03