Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
1

Вычислить выражение с факториалом

04.06.2016, 00:46. Показов 1374. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
взяла живой пример конечно же.. и решила поучиться, поразбирать-попрактиковаться на нем...
нужно сделать скрипт, расчитывающий сумму значений выражения:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{\left(-1 \right)}^{N}*{2}^{\left( 2*N-1\right)}}{\left(2*N-1 \right)!}

https://www.cyberforum.ru/cgi-bin/latex.cgi?\left(2*N-1 \right) у меня =$st
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left(2*N-1 \right)! - факториал $r..

в итоге - N у меня вводится а решение не выводится..
что я как обычно недоглядела, недопоняла?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
    $resultText = '';
    $errText = '';
    function c(&$resh,&$errText) {
        if ( isset($_REQUEST['textfield']) ) {
            $N = trim($_REQUEST['textfield']);
            if ( (string)(int)$N !== $N) {
                $errText = 'Введите целое число.';
                return;
            }
            if ( $N < 1 ) {
                $errText = 'Число должно быть больше 0.';
                return;
            }
            if ( $N > 10 ) {
                $errText = 'Число должно быть меньше 11.';
                return;
            }
           // $r = 2*f($N)-1;
        }
    }
    function f($N) {
        $r=1;
        $resh=0;
    for($i=2;$i<=$N;$i++)
    { $st=(2*$N)-1;
        $r *= $i; //факториал
        $resh+=(pow(-1,$N)*pow(2,$st))/$r;//сумма выражений
    } 
    return $r;
    return $st;
    //echo"<br> (pow(-1,$N)*pow(2,$st))/$r = $resh <br>";   //<?php echo ((pow(-1,$N)*pow(2,$st))/$r =);  
    
    }
    c($resultText,$errText);
?>
<html>
<head>
<meta charset="utf-8">
<title>СКРИПТ 2</title>
</head>
 
<body>
 
 
<form action="" method="post" name="form1">
    <label for="textfield">Введите число N</label>
    <input type="text" name="textfield" id="textfield"> <br>
    <input type="submit" name="button" id="button" value="Выполнить">
    <br>
    <label for="textfield2">Решение :</label>
    <input type="text" name="textfield2" id="textfield2" value="<?php echo $resultText; ?>">
    </form>
    <?php echo $errText; ?>
</body>
</html>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2016, 00:46
Ответы с готовыми решениями:

Вычислить выражение с факториалом
Помогите пожалуйста написать программу вычисления значения выражения (a!+b!)/c! в Qbasic. Очень...

вычислить выражение с факториалом
дано натуральное число n вычисл: sqrt(1!+sqrt(2!+...+sqrt(n-1)!+sqrt(n!)))) как тут корень в...

выражение с факториалом
an=2^n/(n-1)!

Выражение с факториалом и суммой
x вводишь сам.Спасибо большое заранее \varphi =\frac{\cos (x+5)}{3!+\sum_{3}^{8}{e}^{0.2i}}

15
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.06.2016, 00:53 2
Во-первых сообщения об ошибках включить
Во-вторых такие задачи так не решают. В данном случае каждый член ряда легко вычисляется через предыдущий
1
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
05.06.2016, 21:39  [ТС] 3
спасибо за подсказку.. сделала вот так

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
    $resultText = '';
    $errText = '';
    function c(&$resh,&$errText) {
        if ( isset($_REQUEST['textfield']) ) {
            $N = trim($_REQUEST['textfield']);
            if ( (string)(int)$N !== $N) {
                $errText = 'Введите целое число.';
                return;
            }
            if ( $N < 1 ) {
                $errText = 'Число должно быть больше 0.';
                return;
            }
            if ( $N > 10 ) {
                $errText = 'Число должно быть меньше 11.';
                return;
            }
          
        }
    }
    function f($n) {
        $eps=0.0001;
        $S=0;
    for($i=2;$i<=$N;$i++)
       {$st=(2*$N)-1;
        $r *= $i; //факториал
        $resh=(pow(-1,$N)*pow(2,$st))/$r;//мое выражение
        $S+=$resh;//сумма заданного ряда
        $sum=1+$S;
     if (abs($resh) < $eps) break;
      
 // if (sin(2)< $sum)
        // echo "sin меньше суммы заданного ряда";
       // else if (sin(2)> $sum)
        // echo "sin больше суммы заданного ряда";
         // else if (sin(2)== $sum)
        // echo "sin равен сумме заданного ряда";      }
   echo $sum;       
    }
   
    c($resultText,$errText);
?>
<html>
<head>
<meta charset="utf-8">
<title>СКРИПТ 2</title>
</head>
 
<body>
 
 
<form action="" method="post" name="form1">
    <label for="textfield">Введите число N</label>
    <input type="text" name="textfield" id="textfield"> <br>
    <input type="submit" name="button" id="button" value="Выполнить">
    <br>
    <label for="textfield2">Решение :</label>
    <input type="text" name="textfield2" id="textfield2" value="<?php echo $resultText; ?>">
    </form>
    <?php echo $errText; ?>
</body>
</html>
но теперь выбивает ошибку Parse error: syntax error, unexpected $end in Z:\home\factorial.loc\www\ryad.php on line 63
и вроде все закрыты скобки, и ендов лишних нигде нет.. где теперь мой косяк?
0
2169 / 1652 / 840
Регистрация: 10.01.2015
Сообщений: 5,190
05.06.2016, 22:18 4
Похоже, так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$resultText = '';
    $errText = '';
    function c(&$resh,&$errText) {
        if ( isset($_REQUEST['textfield']) ) {
            $N = trim($_REQUEST['textfield']);
            if ( (string)(int)$N !== $N) {
                $errText = 'Введите целое число.';
                return;
            }
            if ( $N < 1 ) {
                $errText = 'Число должно быть больше 0.';
                return;
            }
            if ( $N > 10 ) {
                $errText = 'Число должно быть меньше 11.';
                return;
            }
          
        }
    }
    function f($n) {
        $eps=0.0001;
        $S=0;
            for($i=2;$i<=$N;$i++){
            $st=(2*$N)-1;
                    $r *= $i; //факториал
                    $resh=(pow(-1,$N)*pow(2,$st))/$r;//мое выражение
                    $S+=$resh;//сумма заданного ряда
                    $sum=1+$S;
             if (abs($resh) < $eps) break;
                
     // if (sin(2)< $sum)
                    // echo "sin меньше суммы заданного ряда";
                 // else if (sin(2)> $sum)
                    // echo "sin больше суммы заданного ряда";
                     // else if (sin(2)== $sum)
                    // echo "sin равен сумме заданного ряда";     }
         echo $sum;       
            }
        }
Добавлено через 53 секунды
Было не закрыто тело f
0
8 / 8 / 0
Регистрация: 29.06.2013
Сообщений: 154
05.06.2016, 22:21 5
Вы комментировали участки кода и нечаянно потеряли скобочку.
Вот код с восстановленной скобочкой:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
$resultText = '';
$errText = '';
function c(&$resh,&$errText){
    if (isset($_REQUEST['textfield'])){
        $N = trim($_REQUEST['textfield']);
        if ((string)(int)$N !== $N){
            $errText = 'Введите целое число.';
            return;
        }
        if ($N<1){
            $errText = 'Число должно быть больше 0.';
            return;
        }
        if ($N>10){
            $errText = 'Число должно быть меньше 11.';
            return;
        }
    }
}
    
function f($n){
    $eps=0.0001;
    $S=0;
    for($i=2;$i<=$N;$i++){
        $st=(2*$N)-1;
        $r *= $i; //факториал
        $resh=(pow(-1,$N)*pow(2,$st))/$r;//мое выражение
        $S+=$resh;//сумма заданного ряда
        $sum=1+$S;
        if (abs($resh) < $eps) break;
        // if (sin(2)< $sum)
        // echo "sin меньше суммы заданного ряда";
        // else if (sin(2)> $sum)
        // echo "sin больше суммы заданного ряда";
        // else if (sin(2)== $sum)
        // echo "sin равен сумме заданного ряда";     }
        echo $sum;       
    }
    c($resultText,$errText);
}
?>
<html>
<head>
<meta charset="utf-8">
<title>СКРИПТ 2</title>
</head>
<body>
<form action="" method="post" name="form1">
    <label for="textfield">Введите число N</label>
    <input type="text" name="textfield" id="textfield"> <br>
    <input type="submit" name="button" id="button" value="Выполнить">
    <br>
    <label for="textfield2">Решение :</label>
    <input type="text" name="textfield2" id="textfield2" value="<?php echo $resultText; ?>">
    </form>
    <?php echo $errText; ?>
</body>
</html>
Но после беглого чтения возникает сразу несколько вопросов.
Их вам и надо решить.
Вопросы:
1. Где у вас вызываются функции? Функции описаны, да, это всё хорошо. Но ниже там нарисована форма, где есть 2 кусочка для вывода результата: echo $resultText; и echo $errText; Они полностью пустые были и останутся.
2. Где у вас функция f вообще используется? Я, конечно, понимаю, что она делает определённые вычисления, но вызов функции "c" я нашёл внутри функции "f", а самой функции "f" - нет.
0
pav1uxa
05.06.2016, 22:24
  #6

Не по теме:

слоупок...

0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.06.2016, 22:25 7
Цитата Сообщение от Милашечка Посмотреть сообщение
и вроде все закрыты скобки
не все. Нужно отступы расставлять однообразно и тогда сразу видно будет где что закрывать
Цитата Сообщение от Милашечка Посмотреть сообщение
pow(-1,$N)
Ладно степень двойки через pow считать, но -1... это оставлю без комментариев. К тому же как говорил раньше в таких задачах НЕ надо вычислять каждый член заново, а вычислять через предыдущий.
0
8 / 8 / 0
Регистрация: 29.06.2013
Сообщений: 154
05.06.2016, 22:53 8
Я не особо продвинут в программировании, но вот что получилось за минут 30.
P.S.: товарищи форумчане, просьба палками не кидать, сделал как мог.
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
function main($n){
    if(isset($_REQUEST['N'])){
        $N = trim($_REQUEST['N']);
        $first = 0;
        if(($n%2)!=0){ //это для того, чтобы не считать -1 в какой-то там степени. Если степень нечётная, то будет -1, иначе просто единица
            $first = -1;
        }else{
            $first = 1;
        }
        $second = pow(2, 2*$n-1); //тут вторая часть вычисляется. Разбил по переменным, чтоб понятней было
        return ($first*$second)/factorial(2*$n-1); //считаем и возвращаем результат
    }
}
function factorial ($n){
    if($n <= 1) 
    {
        return 1;
    }
    else 
    {
        return $n * factorial($n - 1);
    }
}
?>
<html>
<head>
<meta charset="utf-8">
<title>СКРИПТ 2</title>
</head>
<body>
<form action="" method="get">
    Введите число N  <input type="text" name="N"> <br>
    <input type="submit" name="button" id="button" value="Выполнить">
</form>
    <?php 
        echo "Тут результат ". main($_REQUEST['N']);
    ?>
</body>
</html>
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.06.2016, 23:03 9
Цитата Сообщение от Kirill_KZ Посмотреть сообщение
просьба палками не кидать, сделал как мог.
И все же кину, да не палку а камень.
1) в задаче требовалось найти сумму. В коде этого нет
2) что за безобразие на 3-4 строчках?
3) не надо вычислять факториал через рекурсию
4) тут вообще не надо вычислять факториал
0
8 / 8 / 0
Регистрация: 29.06.2013
Сообщений: 154
05.06.2016, 23:16 10
Добавлено через 40 секунд
Цитата Сообщение от Jewbacabra Посмотреть сообщение
И все же кину, да не палку а камень.
1) в задаче требовалось найти сумму. В коде этого нет
2) что за безобразие на 3-4 строчках?
3) не надо вычислять факториал через рекурсию
4) тут вообще не надо вычислять факториал
1. Да, косяк. Не дочитал. Просто сделал выполнение этого выражения, заменяя исключительно N.
2. Безобразие на 3-4 строчках сохранилось ещё со старого скрипта ТС, просто другие переменные вставил и всё. Их можно удалить естественно.
На 3 и 4 вопрос ответ у меня один: а как тогда вычислять факториал?
Раз не рекурсия и не каждый раз заново, тогда как? Через while?
Вот один нашёл кусок кода вычисления факториала:
PHP
1
2
3
4
5
While ($i <= $x) /* это условие задаёт цикл от 1 до введённого пользователем числа */
        {
            $fucktorial *= $i; /* вычисление факториала */
            $i++; /* инкремент счётчика */
        }
Ещё можно воспользоваться встроенной функцией вычисления факториала, которая есть в пхп (gmp_fact()), но я подумал, что её лучше не использовать. Пример же и всё надо своим кодом вычислить... У меня такая логика была.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.06.2016, 23:38 11
Цитата Сообщение от Kirill_KZ Посмотреть сообщение
Раз не рекурсия и не каждый раз заново, тогда как?
Факториал элементарно вычисляется циклом. Чтобы каждый раз не пересчитывать достаточно использовать значение факториала на предыдущей итерации. Тоже самое касается члена данного ряда: зачем его считать заново, если каждое следующее значение элементарно получается через предыдущее?
Если нигде не затупил, то получается так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function sumEps($eps) {
    $a1 = -2;
    $an = $a1;
    $sum = 0;
    for ($n = 2; abs($an) > $eps; ++$n) {
        $sum += $an;
        $an *= -4 /  ((2*$n) * (2*$n+1));
    }
    return $sum;
}
 
function sumN($k) {
    $a1 = -2;
    $an = $a1;
    $sum = $an;
    for ($n = 2; $n <= $k; ++$n) {
        $an *= -4 /  ((2*$n) * (2*$n+1));
        $sum += $an;
    }
    return $sum;
}
 
echo sumEps(1.0e-6), PHP_EOL, sumN(100);
Добавлено через 10 минут
Естественно затупил, в знаменателе должно быть (2n-2)*(2n-1)
1
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
06.06.2016, 11:58 12
Цитата Сообщение от Kirill_KZ Посмотреть сообщение
На 3 и 4 вопрос ответ у меня один: а как тогда вычислять факториал?
Цитата Сообщение от Jewbacabra Посмотреть сообщение
4) тут вообще не надо вычислять факториал
Kirill_KZ,
0
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
07.06.2016, 20:56  [ТС] 13
Jewbacabra, а я нашла еще вот такое:
Поскольку каждый член ряда может быть получен из предыдущего домножением на определенный множитель, а вычисление «в лоб» каждого члена ряда приведет к появлению вложенных циклов, эффективнее будет использовать рекуррентное соотношение https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{i}}{{a}_{i-1}}.
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{i}=\frac{{\left(-1 \right)}^{N}*{X}^{2N-1}}{\left(2N-1 \right)!}
https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{i-1}=\frac{{\left(-1 \right)}^{N-1}*{X}^{2N-2}}{\left(2N-2 \right)!}
Если не углубляться в расчеты получается что https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{i}}{{a}_{i-1}}=https://www.cyberforum.ru/cgi-bin/latex.cgi?-\frac{X}{2N-1}
можно ли провести расчет так тогда?будет ли так же верно?:
PHP
1
2
3
4
5
6
$resultText=0;//сумма данного ряда
   for ($i=1; $i<=$N; $i++)
   {$a=-$X/(2*$N -1);
    $resultText+=$a;
       
   }
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.06.2016, 22:16 14
Лучший ответ Сообщение было отмечено Милашечка как решение

Решение

Цитата Сообщение от Милашечка Посмотреть сообщение
Если не углубляться в расчеты получается что
Идея правильная, а результат нет.
1
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
07.06.2016, 23:46  [ТС] 15
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Идея правильная, а результат нет.
- про результат заметила(((развитие данная мысля может иметь - или результат все время таким неверным будет?
и откуда 4 в
Цитата Сообщение от Jewbacabra Посмотреть сообщение
$an *= -4 / *((2*$n) * (2*$n+1))
- это моя 2 в квадрате, которая со степенью стояла??
Просто хочу попробовать, чтоб X со степенью той же стояло а не 2, понять откуда такой числитель.. задавать его в скрипте чтоб..
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.06.2016, 23:58 16
Лучший ответ Сообщение было отмечено Милашечка как решение

Решение

Цитата Сообщение от Милашечка Посмотреть сообщение
это моя 2 в квадрате, которая со степенью стояла??
да.
1
07.06.2016, 23:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2016, 23:58
Помогаю со студенческими работами здесь

Процедура, результатом которой будет выражение, являющееся факториалом числа
Написать процедуру, результатом которой будет выражение, являющееся факториалом числа, и в котором...

Создать процедуру, результатом которой будет выражение, являющееся факториалом числа
Здравствуйте. Необходимо написать процедуру, результатом которой будет выражение, являющееся...

Определить функцию, результатом которой будет выражение, являющееся факториалом числа
Определить функцию, результатом которой будет выражение, являющееся факториалом числа, и в котором...

Вычислить задачку с факториалом
(-1)n / n! Помогите решить,пожалуйста!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru