Вывести на экран сумму N случайных чисел.

<?php
function Random_num_1 ($N)
{
$sum=0;
	for ($i=1;$i<=$N;$i++) {
		$a=rand();
		$sum= $a+$sum;
		echo $a, "<BR>"; 
	  }
 }
 $b=Random_num_1 (10);
?>

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

Тут есть несколько моментов:

  1. Форматирование кода -- оно отсутствует
  2. Функция в узком смысле слова обычно ничего не печатает. Говорят, что она не оказывает побочного эффекта. Это значит, что ваша функция должна возвращать значение (в данном случае сумму) -- выводить же её на экран (оказывать побочный эффект) следует снаружи.
  3. Ваша функция просто выводит числа, но суммы не считает ;)

_____________
матфак вгу и остальная классика =)

fgh's picture

Большое спасибо за замечания. Но у меня есть трудности с пониманием пунктов №1 и №2 . Можно пояснить - побочный эффект это вывод всех хначений массива? А форматирование кода -это отсутствие правильных отступов?

 <?php
Function Random_num_1 ($N)
{
$sum=0;
for ($i=1;$i<=$N;$i++) 
{
$a=rand();
$sum= $a+$sum;
Echo $a, "<BR>"; 
  }
  Echo "Summa: ", $sum, "<BR>"; 
 }
 $b=Random_num_1 (10);
?>

Да, отступы отсутствуют.

<?php
Function Random_num_1 ($N)
{
    $sum = 0;
    for ($i = 1; $i <= $N; $i++) 
    {
        $a = rand();
        $sum = $a+$sum;
        Echo $a, "<BR>"; 
    }
    Echo "Summa: ", $sum, "<BR>"; 
}
$b = Random_num_1 (10);
?>

Функция Random_num_1 не возвращает сумму случайных чисел, а лишь выводит её
на экран.

После выполнения

$b = Random_num_1 (10);

переменная \$b примет значение NULL.

vedro-compota's picture

побочный эффект это вывод всех хначений массива? А форматирование кода -это отсутствие правильных отступов?

  • Форматирование -- это да, в основном отступы.
  • Побочный эффект -- здесь в том смысле, что функция не должна заниматься выводом на экран. Вам следует возвращать из неё значение, а не просто выводить его на экран. Для возвращения значений достаточно использовать инструкцию типа:
    return $имяпеременной;

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

_____________
матфак вгу и остальная классика =)

<?php
function Random_num_1($N)
{
    $sum = 0;
    for ($i=1;$i<=$N;$i++) 
    {
        $a=rand();
        $sum= $a+$sum;
    }
    echo "Random_num_1's output  ", $sum, "<BR>";
}


function Random_num_2($N)
{
    $sum = 0;
    for ($i=1;$i<=$N;$i++) 
    {
        $a=rand();
        $sum= $a+$sum;
    }
    return $sum; 
}

$b = Random_num_1(10);
$c = Random_num_2(10);

echo "\$b:  ", $b, "<BR>";
echo "\$c:  ", $c, "<BR>";

echo "Type of \$b:  ", gettype($b), "<BR>";
echo "Type of \$c:  ", gettype($c), "<BR>";

echo "\$b / 185  :  ", $b/185, "<BR>";
echo "\$c / 185  :  ", $c/185, "<BR>";

echo "Random_num_1(10) / 185  :  ", Random_num_1(10)/185, "<BR>";
echo "Random_num_2(10) / 185  :  ", Random_num_2(10)/185, "<BR>";
?>

Здесь две функции, которые вычисляют одно и то же. Различие их в том, что
Random_num_1 просто печатает на экране результат своих вычислений:

    echo "Random_num_1's output  ", $sum, "<BR>";

а функция Random_num_2 ничего не печатает, а возвращает результат своих вычислений
[внешнему коду, вызывающему её]:

    return $sum;

Поэтому тип переменной \$b --- NULL, а тип переменной \$c --- integer.

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

Ключевое различие функций Random_num_1 и Random_num_2 в том, что
мы не можем использовать Random_num_1 в арифметических выражениях,
но можем использовать Random_num_2.

Например, если мы хотим разделить нашу сумму случайных чисел на 185,
и вывести результат на экран, то можем применить Random_num_2:

echo "Random_num_2(10) / 185  :  ", Random_num_2(10)/185, "<BR>";

В результате получим что-нибудь похожее на

Random_num_2(10) / 185  :  78993965.454054 

Мы не смогли бы использовать функцию Random_num_1 в
подобном выражении с тем же успехом.

echo "Random_num_1(10) / 185  :  ", Random_num_1(10)/185, "<BR>";

выдаст следующее:

Random_num_1(10)/ 185 : Random_num_1's output 10564288807
0

Функция Random_num_1 выводит на экран нашу сумму, возвращает NULL. Затем NULL
в арифметическом выражении приводится к нулю. Ноль делится на 185, и выводится результат --- 0.

fgh's picture

vedro-compota и math 2 спасибо за подробные комментарии, объяснение понятия "возврат значения" и разбор ошибок.
1) Форматирование кода - исправил. Применил правило табуляции (каждая вложенная функция печатается с отступом на один tab, также открывающие и закрывающие скобки пишутся "по линии" функции или конструкции, к которой принадлежат.
2) Ошибка с возвратом функции исправлена. Теперь сама функция random_num_1 () возвращает значение после ввода аргумента, но не выводит его, т.к. это побочный эффект. Ниже представлен листинг программы:

<?php
function random_num_1 ($N)
{
$sum=0;
	for ($i=1;$i<=$N;$i++) {
		$a=rand();
		$sum= $a+$sum; 
	  }
return $sum;
 }
 $b=random_num_1 (10);
?>

3) Прошу пояснить,

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

<?php
function Random_num_1 ($N)
{
$sum=0;
	for ($i=1;$i<=$N;$i++) {
		$a=rand();
		$sum= $a+$sum; 
	  }
return $sum;
 }
 $b=Random_num_1 (10);
 /* Это и есть вывод в контексте вызова функции 
 после получения из неё значения? */
 echo $b;  
?>

Уважаемые коллеги, все ли ошибки учтены? Заранее спасибо.