Pobieranie dwóch wartości w pętli

0

Hej, zaczynam naukę PHP i trafiłem na to forum. Mam problem z rozwiązaniem zadania z użyciem pętli. Oblicza sumę dwóch liczb podanych przez użytkownika. Algorytm ma działać tak długo, aż suma podanych liczb będzie wynosiła 0.

<?php

$number1 = $_POST['number1'];
$number2 = $_POST['number2'];

for($i = 0; $i; $i++){
    if($number1 + $number2 == 0){
		echo "The result is: 0";
		break;
    }else{
include 'form.html';
}
}
<html>
  <form action="script.php" method="post">				
      <label for="number1">Number 1:</label>
      <input type="text" name="number1">
      <label for="number2">Number 2:</label>
      <input type="text" name="number2">
      
      <input type="submit" value="Check">

  </form>
</html>

Co robię nie tak?

0

Czy pętla for jest tu właściwie dobrana?
Taką pętle stosujemy mając określoną z góry ilość iteracji. Tu nie wiesz ile razy trzeba będzie wykonać pętle.
while lub do while. Przepisz to i w razie probelmów pytaj.

0

No właśnie starałem się zrobić to z użyciem pętli a wystarczy chyba tyle:

<?php

$number1 = $_POST['number1'];
$number2 = $_POST['number2'];

if ($number1 + $number2 == 0) {
    echo "The result is: 0";
} else {
  include 'form.html';
}
2

W ogóle to zadanie jest jakoś słabo sprecyzowane i nie wiadomo o co chodzi.

W ogóle masz powiedziane że to ma być aplikacja webowa z formularzem? Czy aplikacja CLI?

0
Riddle napisał(a):

W ogóle to zadanie jest jakoś słabo sprecyzowane i nie wiadomo o co chodzi.

W ogóle masz powiedziane że to ma być aplikacja webowa z formularzem? Czy aplikacja CLI?

Podałem całkowitą treść, polecenie jest w dziale Pętle - zadania. Może jakiś błąd, ogólnie wszystko chyba w celu nauki, utrwalenia składni itd.
Nie mam też rozwiązań, więc ciężko gdybać co autor miał na myśli.

2
RafałRafał napisał(a):
Riddle napisał(a):

W ogóle to zadanie jest jakoś słabo sprecyzowane i nie wiadomo o co chodzi.

W ogóle masz powiedziane że to ma być aplikacja webowa z formularzem? Czy aplikacja CLI?

Podałem całkowitą treść, polecenie jest w dziale Pętle - zadania. Może jakiś błąd, ogólnie wszystko chyba w celu nauki, utrwalenia składni itd.
Nie mam też rozwiązań, więc ciężko gdybać co autor miał na myśli.

No mi to wygląda jak zadanie pod aplikacje w CLI, która pobierałaby w pętli dwie liczby z wejścia standardowego, i dodawała je, sprawdzała czy suma jest równa zero (czyli właściwie tylko wtedy kiedy dodamy do siebie dwa 0, albo przekażemy swoje odwrotności, np 10 i -10), i jeśli tak to kończy program.

Zupełnie to zadanie mi nie pasuje żeby dotyczyło formularzy i aplikacji webowych. Jesteś pewien że dobrze je zrozumiałeś?

2

Muszę przeprosić bo nie doczytałem i wprowadziłem Cię w błąd.
W przypadku działania w przeglądarce komunikacja wygląda tak:

  • użytkownik wpisuje nazwę strony, i do serwera leci zapytanie o jakiś zasób
  • serwer tworzy sobie proces
  • przetwarza żądanie (PHP uruchamia się, wykonuje jakieś czynności zawarte w kodzie)
  • odpowiada serwując HTML, który może wyświetlić przeglądarka
  • proces po stronie serwera jest zamknięty
  • przy następnym żądaniu masz otwarty nowy proces, który o poprzednim nie wie nic.

Tym samym nie da się tak w pętli zrobić tego programu w przeglądarce z użyciem PHP.
Co można zrobić - np. skorzystać z zapisu poprzednich danych w jakimś pliku po stronie serwera, skorzystać z mechanizmu sesji.
Tylko zadanie raczej tego nie dotyczy.
Wygląda na to, że masz uruchomić program w CLI czyli przez linię komend jak wspomniano wcześniej i w ten sposób czytać to co wpisał użytkownik.
Jeśli stworzysz plik np. test.php z taką zawartością:

<?php
echo 'Komeneda zakończenia to "koniec", progam będzie wykonywał się dopóki jej nie wpiszesz' . PHP_EOL;
$x = '';
while ($x !== 'koniec') {
     $x = readline('podaj komendę zakończenia '. PHP_EOL);
     echo 'Wpisałeś '. $x . PHP_EOL;
}

następnie w konsoli (CMD) uruchomisz go poprzez wpisanie

php test.php

To program w konsoli będzie pytał się o wpisanie komendy aż nie wpiszesz kończącej proces lub nie zabijesz działania programu poprzez CTRL+C
Jak widzisz użyłem tu pętli while bo chcę wykonywać program niewiadomą ilość razy, dopóki warunek nie będzie spełniony.
I jak pisałem wcześniej, pętla for mogła by być użyta jeśli znamy ilość iteracji.

0
<?php

$suma = 0;

do {
  $liczba1 = (int) readline("Podaj pierwszą liczbę: ");
  $liczba2 = (int) readline("Podaj drugą liczbę: ");

  $suma = $liczba1 + $liczba2;

  echo "Suma podanych liczb wynosi: $suma\n";
} while ($suma != 0);

echo "Koniec programu.";

?>

dziwne zadanie bo tylko podanie dwoch 0 zakonczy program lub nie podanie niczego co jest rownoznaczne xD

0

Dzięki za pomoc.
@jurek1980: Pisałeś, że pętla for w tym zadaniu mogła by być użyta jeśli znamy ilość iteracji. Rozwiązanie tego zadania w taki sposób jest błędne czy może być?

<?php

/*Oblicza sumę dwóch liczb podanych przez użytkownika.
 * Algorytm ma działać tak 
 * długo, aż suma podanych liczb będzie wynosiła 0.*/

$suma = 0;
$loop = 1;
for($i = 0; $i < $loop; $i++) {
    $loop++;
    $liczba1 = (int) readline("Podaj pierwszą liczbę: ");
    $liczba2 = (int) readline("Podaj drugą liczbę: ");
    
    if($suma == $liczba1 + $liczba2){
        echo "Suma podanych liczb wynosi: $suma\n";
        break;
    }else{
        echo "Próbuj dalej.\n";
        continue;
    }
}

0

Czy program przerywa działanie? Bo chyba loop będzie zawsze większe o jeden od i?
Inkrematacja zmiennej loop powinna być warunkowa.

Dobrze, że sprawdzasz i dociekasz szczegółów. Jedno z zadań w kursach/studiach to np. zamiana pętli for na while. Ogólnie jak się uprzesz to będziesz mógł je stosować zamiennie, tylko teraz pytanie numer dwa: po co w takim razie różne konstrukcje - dla czytelności kodu i dla mniejszej błędogenności.
Jak widzisz coś w stylu:

  • Zlicz sumę trzech elementów.
  • Użytkownik ma pięć prób wpisania hasła.
  • Kolekcja ma trzydzieści elementów.

To od razu jesteś w stanie określić ilość iteracji, od razu na myśl przychodzi for.

Jeśli masz z kolei:

  • program wykonuj dopoki użytkownik nie wpisze koniec.
  • czynność powtarzamy do memntu osiągnięcia wartość 12

To na myśl przychodzą od razu pętle typu while wykonujące się do momentu spełnienia warunku.

0
RafałRafał napisał(a):

Dzięki za pomoc.
@jurek1980: Pisałeś, że pętla for w tym zadaniu mogła by być użyta jeśli znamy ilość iteracji. Rozwiązanie tego zadania w taki sposób jest błędne czy może być?

Nie jest błędne w tym kontekście, że działa, ale jest bardzo mylące pod tym względem że zmieniasz $loop, tym samym ciągle zwiększając ilośc razy kiedy for się wykona, więc tak na prawdę nie znasz ilości iteracji. Większość osób jak zobaczy takiego for, to pomysli że pętla wykona się dwa razy, bardzo się zdziwią jak zobaczą $loop++, i potem bardzo się zdziwią

Poniewż $loop cały czas jest większe niż $i. A więc zapis takiej pętli:

for($i = 0; $i < $loop; $i++) {
    $loop++;

jest tożsamy z tym:

for(; true; ) {

a to z kolei jest tożsame z tym

while (true) {

W Twoim przypadku nie znasz ilości wykonania obrotów, bo to użytkownik decyduje: użytkownik może od razu wpisać liczby które zakończą program, może dwa, może cztery, może więcej - więc for tutaj średnio pasuje.

Myślę, że powinieneś zaprzestać pracy nad tym zadaniem, i zainteresować się jakimś kolejnym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1