OzWaz Ответов: 3

Переход с базовой версии PHP


Я написал программу на Бейсике, и теперь мне нужно воспроизвести ее на php.

В рамках (базового) цикла while я использую средство “goto” для обхода кода в цикле, который не требуется, если выполняется определенное условие.

Я нашел код goto в руководстве php, но он не будет работать в реальной жизни.

Вот основной код, который работает

основной код
num = TextWindow.Read()
flip = 1
Start:
While (flip < num)
  flip = flip + 1 
   rn = Math.GetRandomNumber(2)  
 	 If rn = 1 Then
 	 goto start
 	EndIf
A = A +1

Вот PHP-код, который я не могу заставить работать
PHP-код
<?php 
$num =  100;
start: 
while($flip <= $num) {
	$flip++;
    $rn = rand(0,1);
       if ($rn=0){
       	goto start;
  		}
       $A++;
      } 
      echo " The number of FLIPS Are: $flip <br>";
      echo " The number of Number ONES Are: $A <br>";  
?>


Любая помощь будет оценена по достоинству

Что я уже пробовал:

Всех основных сайтов PHP кода в России

3 Ответов

Рейтинг:
0

OriginalGriff

Для начала, даже в Basic, вы не должны использовать Goto - и, конечно же, не при переписывании кода на более современный язык, чем SmallBasic!

Вместо того, обратное, если тест:

Start:
while (condition)
   if (other condition)
      Goto start
   do something
Может легко стать проще, более очевидным, просто изменив условие и потеряв Goto:
while (condition)
   if (Not (other condition))
      do something
Это процесс, называемый "despaghettification", и он приводит к гораздо более удобному для обслуживания коду.

Попробуйте: возьмите свой код SmallBasic, очистите его, а затем попробуйте написать ту же функциональность - которая не совпадает с переведенным кодом - в PHP: и обратите внимание на детали! Например, каково начальное значение flip в обоих случаях?


OzWaz

Спасибо Ричарду за ответ, однако в конкретном приложении, для которого я использую эту программу, я не уверен, что ваше решение будет работать, плюс я не знаю достаточно php, чтобы заставить новую систему работать на php.

Эта программа берет монету переворачивает ее 1,000,000,000 раз вычисляет количество повторяющихся последовательностей для каждой категории до 35 итераций для одной последовательности а затем вычисляет количество последовательностей для каждой категории а затем % дифференциации между каждой категорией а затем % от общего числа событий
Я могу это сделать, потому что понимаю Basic и использую его с 1982 года, а теперь к старому сейчас, чтобы узнать новый способ ощипывания цыплят, я надеялся легко перейти на php, чтобы украсить программу HTML
Вот программа, если вы можете сказать мне, как достичь этого в php, я был бы благодарен

программа:
Текстовое окно.Цвет Переднего Плана = "Желтый"
Текстовое окно.Writeline("какая сумма?")
num = TextWindow.Прочитай()
сальто = 1
Начать:
В то время как флип < num
флип = флип + 1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
А = А +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
B = B +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
C = C +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
D = D +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
Е = Е +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
F = F +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
G = G +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
H = H +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
I = I +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
J = J +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
K = K +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
L = L +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
M = M +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
N = N +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
O = O +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
P = P +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
Q = Q +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
R = R +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
S = S +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
T = T +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
U = U +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
V = V +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
W = W +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
X = X +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
Y = Y +1

rn = Math.GetRandomNumber(2)
Если rn = 1, то
Гото старт
За endif
Z = Z +1




EndWhile

Текстовое окно.Writeline("количество сделанных сальто было:" + флип)
Текстовое окно.Writeline("количество 1 последовательных голов было:" + A + " @ "+ A*100 /flip + " % от сальто")
Текстовое окно.Метода WriteLine("кол-во 2 последовательных глав было:" + б + " @ "+ б*100 /флип + "% сальто " + "плюс" и " @ " + математика.Раунд(B*100/A) + " % от 1")
Текстовое окно.Writeline("количество 3 последовательных головок было:" + C + " @ "+ C*100 /flip + "% от Flips " + "PLUS @" + Math.Раунд(C*100/B) + " % от 1")
Текстовое окно.Метода WriteLine("кол-во 4 последовательных глав было:" + Д + " @ "+ Д*100 /флип + "% сальто " + "плюс" и " @ " + математика.Раунд(D*100/C) + " % от 1")
Текстовое окно.Writeline("число 5 последовательных

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Richard MacCutchan

"Я понимаю Бейсик и использую его с 1982 года, а теперь и по старому, чтобы научиться новому способу ощипывания цыплят"
Я начал программировать в 1966 году, но выучил PHP только за последние 6-12 месяцев. Ты никогда не бываешь слишком стар, чтобы учиться.

Со всеми этими повторяющимися битами кода и операторами goto очень трудно превратить его во что-то логичное, не тратя довольно много времени.

Рейтинг:
0

Richard MacCutchan

Вы не объявляли ни $flip, ни $A, прежде чем пытаться использовать их в выражении. Кроме того, использование goto-это действительно плохая практика, есть лучшие способы сбросить ваши ценности.

Я изменил ваш код следующим образом, хотя и не уверен, что он должен делать. Как показано, он работает (почти) вечно.

$num =  100;
$flip = 0;
$A = 0;
while($flip <= $num) {
    $flip++;
    $rn = rand(0,1);
    if ($rn == 0){
       $flip = 0;
       $A = 0;
    }
    $A++;
} 
    echo " The number of FLIPS Are: $flip <br>";
    echo " The number of Number ONES Are: $A <br>";  


[редактировать]
Вот полная веб-страница с реализацией вашего алгоритма, без каких-либо операторов goto:

<!DOCTYPE HTML>  
<html>
<head>
</head>
<body>  

<?php
    function flipper($count) {
        $num = $count;
        $sets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        for ($flip = 0; $flip < $num; $flip++) {
            for ($i = 0; $i < 26; $i++) {
                $r = rand(0,1);
                if ($r == 1) {
                    break;
                }
                $sets[$i]++;
            }
        }
        for ($i = 0; $i < 26; $i++) {
            echo '$sets[' . $i . "]: $sets[$i]" . '<br>';
        }
    }

    flipper(1000);
?> 


</body>
</html>


[/редактировать]


OriginalGriff

Он опубликовал ответ, начинающийся словами "Спасибо, Ричард", на мой ответ, но он довольно длинный, поэтому я оставлю его там, а не буду перепечатывать.

Richard MacCutchan

- Спасибо, - добавил два моих пенн'Орта.

OzWaz

Спасибо, Ричард, за попытку помочь мне с php - кодом

Я не понимаю, как он может работать так же, как базовый код.

Как вы можете видеть из приведенного выше кода (Basic), программа действует подобно каскадным бокалам вина, оценивающим последовательное событие и прерывающим прогресс, когда представлен неподдерживаемый вариант.

Это вместе со счетчиком позволяет регистрировать большое количество последовательных событий по 26 обстоятельствам.

Вот пример сгенерированных данных

События 10 000
Некоторые 5008
Последовательный
2 2474
3 1236
4 672
5 332
6 153
7 77
8 31
9 16
10 6
11 8
12 1
13 0
И так далее …

Цикл должен быть прерван/перенаправлен каждый раз, когда происходит неподдерживаемый параметр в результате события (генерируется случайное число)

Только ок. 3 раза в 1 000 000 000 событий происходит весь цикл.

Причина, по которой “он работает (почти) вечно”, заключается в том, что, как вы можете видеть из базового программного кода выше, “While flip < num” php-эквивалент отсутствует.

Кодирование-это не большая часть моей жизни, и я с большой любовью нахожу более эффективным время, чтобы скопировать и вставить его, чтобы потратить время на поиск более эффективной альтернативы.

На самом деле он выполняет ту же самую работу, и компьютер, похоже, не возражает против того, как долго вы кодируете.

Я действительно читал некоторые критические замечания по поводу использования объекта “goto”, но в некоторых ситуациях, таких как моя, где мои программы не являются сложными и ни для кого другого, кроме меня, они все еще имеют законное (и лучший вариант) приложение - если только они (php) будут работать.

С уважением

Richard MacCutchan

Ну, это значительно отличается от кода в вашем первоначальном вопросе, который был менее чем ясен. И, как я уже говорил в своем предыдущем комментарии, потребуется довольно много времени, чтобы проанализировать вашу оригинальную программу и переписать ее на любой другой язык. Что касается вашего последнего предложения, PHP будет работать, но только если вы напишете правильный код.

Richard MacCutchan

Смотрите мое обновленное решение, на самом деле потребовалось меньше времени, чем я думал.

OzWaz

Во - первых, Ричард, я хотел бы, чтобы вы знали, что я ценю ваши усилия, плюс: люди, которые добровольно отдают свое время и способности, чтобы помочь другим людям-без вознаграждения, я нахожу удивительными.

Однако когда я опубликовал часть кода, обратившись за помощью к форуму для решения головоломки, результат, который я искал, состоял в том, чтобы выяснить, почему PHP “goto” объект в моем коде (как описано в руководстве PHP https://www.php.net/manual/en/control-structures.goto.php) не выступал как таковой в моем коде.

В своих поисках решения этой проблемы до того, как я обратился за помощью к этому форуму, я уже был знаком с тем фактом, что в практике кодирования на этом языке использование средства "goto" в вашем коде было, в худшем случае, неодобрительно и в лучшем случае должно использоваться с осторожностью.

Поэтому я уже знал об этой конкретной ситуации, но отметил комментарий на приведенной выше веб-странице: “в основном борьба с "Гото" - это всего лишь побочный эффект вводящей в заблуждение статьи много десятилетий назад. Эти монстры уже ушли. Не стесняйтесь использовать его, когда вы знаете, что делаете.”

Многие люди с удовольствием едят пищу, не зная, как ее выращивать, к сожалению для меня, моя личность не из этого рода.

Моя цель состоит в том, чтобы иметь возможность узнать достаточно и понять его функцию в PHP, чтобы иметь возможность для меня воспроизвести базовую программу, которая работает - в PHP.

Выяснение того, как что-то работает, чтобы я мог использовать его с уверенностью и исправить его, если он сломается, - это то, как мне нравится делать вещи.

Я из любопытства также запустил ваш код в моей системе XAMPP, но пришел с этой ошибкой:-"ошибка синтаксического анализа: синтаксическая ошибка, неожиданный '<', ожидающий конца файла в C:\xampp\htdocs\coin\fliper.php на линии 28"

Если вы знаете причину, по которой функция goto в исходном коде, который я опубликовал, не работает, было бы здорово, если бы вы поделились этим, в противном случае спасибо вам за все ваши усилия, но я должен искать в другом месте.

Что Касается Уоррена

Richard MacCutchan

"эта ошибка:-"ошибка синтаксического анализа: синтаксическая ошибка, неожиданный в '<', ожидая конца файла в C:\xampp\htdocs\coin\fliper.php по строке 28""
Ну, если вы не покажете нам настоящий код и не опознаете строку 28, мы ничем не сможем вам помочь. Кстати, код, который я предложил выше, содержит всего 17 строк.

"почему функция goto в исходном коде, который я опубликовал, не работает"
Не думаю, что я это утверждал. Я просто показал вам, как легко написать код, который не использует goto. Если вы хотите использовать его, то это полностью ваш выбор, мы не можем остановить вас больше, чем мы можем остановить вас есть vegemite.

OzWaz

Извините, что я на самом деле не смотрел на код подробно, я просто скопировал и вставил его в файл с каким-то HTML-заголовком и прогнал его через свою систему XAMPP.

Не будучи настолько знаком с PHP и теперь, взглянув на код, я вижу, что код не был закрыт “?>” - Поэтому, как только я закрыл его, сообщение об ошибке исчезло.

Теперь, когда я запускаю код, на экране ничего не печатается.

Если бы код воспроизводил функцию небольшой базовой программы он бы выдал такую распечатку:

Количество переворотов : 1000
Головы - 1 :488
Голов - 2 :242
Головы - 3 :117
Орел - 4 :59
Орел - 5 :27
Головы - 6 :20
Головы - 7 :7
Головы - 8 :4
Головы - 9 :3
Головы - 10 :1
Голов - 11 :
Голов - 12 :
Голов - 13 :
Голов - 14 :
Голов - 15 :
Голов - 16 :
Голов - 17 :
Голов - 18 :
Голов - 19 :
Голов - 20 :
Голов - 21 :
Голов - 22 :
Голов - 23 :
Голов - 24 :
Голов - 25 :
Голов - 26 :

Моя программа Dreamweaver говорит мне, что есть проблема с этой строкой кода
“$наборы = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];”

Однако, https://phpcodechecker.com/is говорит мне, что код в порядке.

Но все это на самом деле не имеет значения, потому что все, что я пытаюсь сделать, это выяснить, почему мое использование "goto" в моем PHP scrip не сработало. На самом деле я не искал кого-то, кто написал бы программу для меня.

В заключение я не понимаю что вы имели в виду под этим

["почему функция goto в исходном коде, который я опубликовал, не работает"- я не думаю, что сделал это заявление.]
и $Vegemite="Фу";

С уважением

Richard MacCutchan

Смотрите мое последнее обновление, которое представляет собой полную веб-страницу, которая делает то, что вы хотите. Я понятия не имею, как и если вам нужно изменить его для dreamweaver, но он работает в Chrome. При загрузке страницы на экране появляется следующее сообщение:

$sets[0]: 476
$sets[1]: 224
$sets[2]: 106
$sets[3]: 53
$sets[4]: 29
$sets[5]: 17
$sets[6]: 7
$sets[7]: 6
$sets[8]: 3
$sets[9]: 2
$sets[10]: 2
$sets[11]: 2
$sets[12]: 1
$sets[13]: 1
$sets[14]: 0
$sets[15]: 0
$sets[16]: 0
$sets[17]: 0
$sets[18]: 0
$sets[19]: 0
$sets[20]: 0
$sets[21]: 0
$sets[22]: 0
$sets[23]: 0
$sets[24]: 0
$sets[25]: 0

что настолько близко, насколько не имеет никакого значения для ваших результатов.

Так что пока ваш код с goto утверждения могут сработать, мои гораздо проще. И самое главное, когда что-то идет не так, это гораздо легче отладить.

OzWaz

Да, это правильно, теперь это PHP - программа, которая делает точно то же самое, что и small basic, но с некоторыми ограничениями.

Во - первых, small basic также имеет средство ввода, так что вы можете ввести количество переворотов с переднего конца, как это было бы с php и тегом HTML-формы в базу данных, но я могу работать и с этим.

Во-вторых, неверно говорить: “и самое главное, когда что-то идет не так, это гораздо легче отлаживать.”

Это только легче отлаживать для тех, кто хорошо разбирается в PHP, но для меня, только начинающего изучать PHP и не строящего программу самостоятельно и не понимающего, как все это работает - это был бы ужас, тогда как small basic очень легко отлаживается для меня.

Но это прочная основа, и, анализируя ее и играя с ней, я уверен, что смогу вывести, каковы все функции, и в конечном итоге я смогу использовать ее в нужном мне формате.

Я не мог оставаться в small basic, потому что не знаю, как встроить это в HTML-страницу.

Я очень ценю то что вы остались со мной в этом проекте это было интересное путешествие и еще раз благодарю вас за все ваши усилия

Richard MacCutchan

Добавление функции ввода-это простое дело некоторого HTML: тип ввода и кнопка, и вокруг есть много примеров. Я настоятельно рекомендую вам пойти в W3Schools Online Web Tutorials[^] где вы можете изучать как HTML, так и PHP в простом интерактивном наборе учебных пособий.

OzWaz

Программа работает нормально, но я с сожалением сообщаю Ричарду, что, по-моему, есть пара вещей, которые php не может сделать так, как могла бы моя базовая программа.
Например, вот распечатка моего базового
Количество сделанных сальто составило: 5000000
Количество последовательных голов 1 было:2498815 @ 49.9763 % переворотов
Количество 2 последовательных голов было:1249607 @ 24.99214 % сальто и @ 50.22 % 1
Количество 3 последовательных голов было:624458 @ 12.48916 % сальто и @ 49.85 % 2
Количество 4 последовательных голов составило:311990 @ 6.2398 % сальто и @ 51.26 % 3

Как вы можете видеть - помимо записи последовательных данных (а) он также вычисляет и печатает процент каждого конкретного последовательного отношения к общей сумме (Б) плюс затем вычисляет и печатает процент каждого конкретного последовательного отношения к непосредственно предшествующему (в).
Я смог узнать, как модифицировать программу для достижения достижения в, но для того чтобы достигнуть C, возможно, мост слишком далеко я думаю
Именно:
Последовательные головки количество раз % от общего числа испытанных
1 500173 50.0173
2 249894 24.9894
3 124893 12.4893
4 62705 6.2705
5 31249 3.1249

Другой недостаток заключается в том, что он не может анализировать 1 000 000 000 циклов, он возвращает это
“Фатальная ошибка: максимальное время выполнения 30 секунд превышено в C:\xampp\htdocs\coin\fliper3.php на линии 42”
Около 75 000 000 циклов-это все, что он будет делать, я понятия не имею, почему
Я предоставил программу на случай, если вы захотите взять ее для запуска

С уважением

Richard MacCutchan

Вы можете вычислить что угодно в PHP, это богатый функциональный язык. То, что вы не можете сделать, это узнать все за пару дней. Что касается ошибки о максимальном времени, см. максимальное время выполнения php - Google Search[^].

OzWaz

Вероятности




введенный номер :






';
эхо ", из которого вытекало следующее:-";
?>







";

}
}

Флиппер($tell);


?>

Последовательные головки количество раз % от общего количества тестируемых наборов $i $[$i] $per

OzWaz

Ричард

Может быть лучше посмотреть здесь http://warrenbolton.com/site/fliper3.php

Richard MacCutchan

К сожалению, я ничего не вижу, кроме того, что ваши вычисления не дают действительных чисел. NAN в плавающей точке означает, что она слишком велика или слишком мала, чтобы быть представленной как фактическое значение. И не видя кода, который создает эти значения ...

Рейтинг:
0

OzWaz

<html><head></head><body><!DOCTYPE HTML>  


<link href="basic.css" rel="stylesheet" type="text/css">


<h1>Probabilities</h1>
<br>
<form method="POST">
<label>Enter Number : </label>
<input type="number" name="numb">
<input type="submit" value="Submit">
</form>
<br>


<!--?php
$tell=$_POST["numb"];
echo " The Number of flips were: " ;
echo $tell . '<br--><br>';
echo  "Of which the following resulted:-";
?>

<br><br>




      
                
        		
                
  


			         
			         
			 	  
			      ";
			
        }
    }

    flipper($tell);
	
	
?> 

<table width="50%" margin-left:auto;="" margin-right:auto;="" border="1" cellspacing="10" cellpadding="10"><tbody><tr><th width="50%" align="center">Consecutive Heads </th><th width="25%" align="center">No. of times </th><th width="25%" align="center"> % of Total  Tested</th></tr><!--?php
$tell=$_POST["numb"];

    function flipper($count) {
        $num = $count;
        $sets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        for ($flip = 0; $flip < $num; $flip++) {
            for ($i = 1; $i < 26; $i++) {
                $r = rand(1,2);
			
                if ($r == 2) { 
                    break;
                }
                $sets[$i]++;
            }
        }
        for ($i = 1; $i < 26; $i++) 
		{
			$per =  $sets[$i]*100/$num;
			echo "<tr--><tr><td style="text-align: center">$i</td><td style="text-align: center">$sets[$i] </td><td style="text-align: center">$per</td></tr><tr></tr></tbody></table>


</body></html>


Richard MacCutchan

$per =  $sets[$i]*100/$num;

Это целочисленная арифметика, поэтому ответ всегда будет NAN. Вам нужно преобразовать значение в плавающую точку, умножив его на значение с плавающей запятой таким образом:
$per =  $sets[$i] * 100.0 / $num;

OzWaz

Спасибо
Интересный опыт для меня.

Я внес изменения, как было рекомендовано, и загрузил их на свой веб-сервер.

Как ни странно, ввод одного значения (скажем, 10000) вернет "процентный" результат до двух знаков после запятой, но ввод последующего значения (скажем, 11000) вернет результат до 12 знаков после запятой.

Он также дает тот же результат без изменений.

Возможно, вы захотите проверить это сами, но это выше моего понимания-есть ли еще какие-нибудь предложения?

С уважением

Richard MacCutchan

Это правильно, по умолчанию при печати числа с плавающей запятой необходимо печатать все цифры, если это возможно. Если вам нужны только первые два варианта, вам нужно использовать функцию форматирования: см. РНР: е - инструкция[^]. Это также идея понять, как числа с плавающей запятой могут давать то, что вы можете считать странными результатами: см. Что Каждый Компьютерщик Должен Знать Об Арифметике С Плавающей Запятой[^].