Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: php psikus  (Przeczytany 4461 razy)

goscccccccccccc

  • Gość
php psikus
« dnia: 2009-01-10, 03:39:01 »
Nie miewam problemów z phpem radzę sobie z jego rożnymi kaprysami, ale tym razem mnie zażył (być może ze względu na późną porę). Chciałem sobie obliczyć przewodność dla pewnych warunków dla u= [2, 12]. Chciałem, żeby mi wyświetlał każdy krok obliczeń.


for ($u = 2; $u <= 12; $u++)
Gst($u);

function Gst($u) {

$idd = 0.3;
$iw=2;
$uw = 4.5;
$ud = 9;
$i0 = (1/2)*($iw+$idd);
$u0 = (1/2)*($uw +$ud);
$a = -($iw-$idd)/($uw-$ud);
$b = (4*$a)/(3*($ud-$uw)^2);

echo $u.'
';
echo '1 Gst = ('.$i0.'-'.$a.'*('.$u.'-'.$u0.')+('.$b.'*('.$u.'-'.$u0.')^3))/ '.$u;
echo '
2 Gst = ('.$i0.'-'.$a.'*('.$u-$u0.')+('.$b.'*('.$u-$u0.')^3))/ '.$u;
echo '
3 Gst = ('.$i0.'-'.$a*($u-$u0).'+'.$b*($u-$u0)*($u-$u0)*($u-$u0) .')/ '.$u;
echo '
4 Gst = ('.$i0-$a*($u-$u0)+$b*($u-$u0)*($u-$u0)*($u-$u0) .')/ '.$u;
echo '
5 Gst = '.($i0-$a*($u-$u0)+$b*($u-$u0)*($u-$u0)*($u-$u0))/$u.'


';
}
?>
A ten złośliwiec :/ wypluwa mi tylko:
2
1 Gst = (1.15-0.37777777777778*(2-6.75)+(0.10074074074074*(2-6.75)^3))/ 2-13.5)^3))/ 2
3 Gst = (1.15--1.7944444444444+-10.796574074074)/ 2-9.0021296296296)/ 2
5 Gst = -3.9260648148148


3
1 Gst = (1.15-0.37777777777778*(3-6.75)+(0.10074074074074*(3-6.75)^3))/ 3-13.5)^3))/ 3
3 Gst = (1.15--1.4166666666667+-5.3125)/ 3-3.8958333333333)/ 3
5 Gst = -0.91527777777778


4
1 Gst = (1.15-0.37777777777778*(4-6.75)+(0.10074074074074*(4-6.75)^3))/ 4-13.5)^3))/ 4
3 Gst = (1.15--1.0388888888889+-2.0950925925926)/ 4-1.0562037037037)/ 4
5 Gst = 0.023449074074074


5
1 Gst = (1.15-0.37777777777778*(5-6.75)+(0.10074074074074*(5-6.75)^3))/ 5-13.5)^3))/ 5
3 Gst = (1.15--0.66111111111111+-0.53990740740741)/ 50.1212037037037)/ 5
5 Gst = 0.25424074074074


6
1 Gst = (1.15-0.37777777777778*(6-6.75)+(0.10074074074074*(6-6.75)^3))/ 6-13.5)^3))/ 6
3 Gst = (1.15--0.28333333333333+-0.0425)/ 60.24083333333333)/ 6
5 Gst = 0.23180555555556


7
1 Gst = (1.15-0.37777777777778*(7-6.75)+(0.10074074074074*(7-6.75)^3))/ 7-13.5)^3))/ 7
3 Gst = (1.15-0.094444444444444+0.0015740740740741)/ 7-0.09287037037037)/ 7
5 Gst = 0.15101851851852


8
1 Gst = (1.15-0.37777777777778*(8-6.75)+(0.10074074074074*(8-6.75)^3))/ 8-13.5)^3))/ 8
3 Gst = (1.15-0.47222222222222+0.19675925925926)/ 8-0.27546296296296)/ 8
5 Gst = 0.10931712962963


9
1 Gst = (1.15-0.37777777777778*(9-6.75)+(0.10074074074074*(9-6.75)^3))/ 9-13.5)^3))/ 9
3 Gst = (1.15-0.85+1.1475)/ 90.2975)/ 9
5 Gst = 0.16083333333333


10
1 Gst = (1.15-0.37777777777778*(10-6.75)+(0.10074074074074*(10-6.75)^3))/ 10-13.5)^3))/ 10
3 Gst = (1.15-1.2277777777778+3.4582407407407)/ 102.230462962963)/ 10
5 Gst = 0.3380462962963


11
1 Gst = (1.15-0.37777777777778*(11-6.75)+(0.10074074074074*(11-6.75)^3))/ 11-13.5)^3))/ 11
3 Gst = (1.15-1.6055555555556+7.7334259259259)/ 116.1278703703704)/ 11
5 Gst = 0.66162457912458


12
1 Gst = (1.15-0.37777777777778*(12-6.75)+(0.10074074074074*(12-6.75)^3))/ 12-13.5)^3))/ 12
3 Gst = (1.15-1.9833333333333+14.5775)/ 1212.594166666667)/ 12
5 Gst = 1.1453472222222
Jeśli chodzi o sekwencję znaków typu '--' albo '+-' to ok, bo to oznacza, żę jest dodawanie lub odejmowanie liczby ujemnej. Nie mogę dojść dlaczego nie wypluwa mi kroku drugiego i czwartego. Poza tym wyniki na papierze mam inne :/ Dziwnie mi to wyświetla ukośniki - w każdym liczeniu powinno być tylko jedno dzielenie.

Jak ktoś wiedział o co chodzi PHPowi to by było fajnie.

P.S. - nie wypluwa żadnych błędów, notisów ani łorningów.

ZipoKing

  • Gość
php psikus
« Odpowiedź #1 dnia: 2009-01-10, 11:02:29 »
Mimo że cię to początkowo zaskoczy, wszystko działa prawidłowo, tylko ty popełniłeś parę błędów w kodzie. Poniżej kod prawidłowy i wytłumaczenie "czemu nie działa":
Kod: php [Zaznacz]


function Gst($j) {
 $u = $j; // (1)

 $idd = 0.3;
 $iw= 2.0;
 $uw = 4.5;
 $ud = 9.0;
 $i0 = (1/2)*($iw+$idd);
 $u0 = (1/2)*($uw +$ud);
 $a = -($iw-$idd)/($uw-$ud);
 $b = (4*$a)/(3*pow($ud-$uw, 2)); // (2)

 // (3)
 echo $u.'
'; echo '1 Gst = ('.$i0.'-'.$a.'*('.$u.'-'.$u0.')+('.$b.'*('.$u.'-'.$u0.')^3))/ '.$u;
 echo '
 2 Gst = ('.$i0.'-'.$a.'*('.($u-$u0).')+('.$b.'*('.($u-$u0).')^3))/ '.$u;
 echo '
3 Gst = ('.$i0.'-'.($a*($u-$u0)).'+'.($b*($u-$u0)*($u-$u0)*($u-$u0)).')/ '.$u;
 echo '
 4 Gst = ('.($i0-$a*($u-$u0)+$b*($u-$u0)*($u-$u0)*($u-$u0)).')/ '.$u;
 echo '
5 Gst = '.(($i0-$a*($u-$u0)+$b*($u-$u0)*($u-$u0)*($u-$u0))/$u).'


';
}

// (4)
for ($i = 2; $i <= 12; $i++)
 Gst($i);

// (5)


1. Tutaj to nie występuje, ale jest to rzecz, która może cię zaskoczyć - w PHP od wersji 5 parametry domyślnie przekazywane są przez referencje, a nie przez wartość (czyli nie piszemy już &$foo, tylko po prostu $foo) - gdybyś zmodyfikował taką zmienną wewnątrz funkcji, zmiana ta odzwierciedliłaby się także poza jej ciałem.
2. Operacja ^ w PHP to nie potęgowanie ;) - do tego służy funkcja pow(podstawa, wykładnik)
3. Tu jest twój główny problem - używanie operatorów matematycznych. Spójrz na poniższy przykład:
Kod: php [Zaznacz]

$foo = 1;
$bar = 2;

echo 'FOO'.$foo-$bar.'BAR';
echo '
';
echo 'FOO'.($foo-$bar).'BAR';

Oczywiście chcemy, aby w rezultacie otrzymać tekst "FOO-1BAR" (1-2 = -1) - otrzymamy to przy drugim "echo", a pierwszy robi rzecz następującą: od stringu "FOO1" odejmij string "2BAR" (kolejność wykonywania operatorów - operator konkatacji (kropka) jest ważniejszy od operatora odejmowania), w rezultacie wartość "FOO1" zostanie obliczona jako 0 i właśnie od zera odejmuje się "2BAR" (wartość 2), w rezultacie otrzymamy "-2BAR" (0-2 = -2) - szalone to ale prawdziwe ;). Tak więc używaj jak wykonujesz jakiekolwiek operacje, używaj nawiasów (jak to ktoś kiedyś mądry powiedział, dodatkowa para nawiasów jeszcze nikomu nie zaszkodziła ;).
4. Dla lepszej czytelności zawsze lepiej jest zdefiniować funkcję, a dopiero potem ją wywoływać.
5. Jest taka reguła, która mówi, iż jeżeli plik zawiera tylko i wyłącznie kod PHP (np. definicję klasy, lub jak to ma miejsce w twoim przypadku) nie wstawia się wtedy tagu zamykającego ?>

Mam nadzieję iż pomogłem :)

goscccccccccccc

  • Gość
php psikus
« Odpowiedź #2 dnia: 2009-01-10, 14:00:54 »
Dzięki. Pomogłeś i wyjaśniłeś, i oświeciłeś.

Ad. 1 Rzeczywiście mnie zaskoczyłeś, ba nawet nie chce mi się wierzyć. Szczególnie że
Podawanie argumentów jako referencji

[u]Domyślnie, argumenty funkcji podawane są jako wartości[/u] (kiedy wartość argumentu wewnątrz funkcji się zmienia, nie wpływa to na wartość zmiennej poza funkcją). Aby pozwolić funkcji na modyfikację jej jej argumentów, muszą one być podane przez referencję.

Aby argument zawsze był podawany przez referencję, poprzedź nazwę argumentu znakiem (&) w definicji funkcji:

Example #2 Podawanie parametrów funkcji przez referencję
function add_some_extra(&$string)
{
    $string .= 'i coś ekstra.';
}
$str = 'To jest ciąg znaków, ';
add_some_extra($str);
echo $str;    // wypisuje 'To jest ciąg znaków, i coś ekstra.'
?>
z http://pl.php.net/manual/pl/functions.arguments.php
(podkreślenie moje)

Ale generalnie dzięki - muszę się bardziej starać by nie mieć jakiejś roboty o 3 nad ranem :-)