Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перевод с с++ на js (https://javascript.ru/forum/jquery/75933-perevod-s-s-na-js.html)

Retro_1477 18.11.2018 15:42

Перевод с с++ на js
 
Всем привет! Помогите перевести данный код на js. Если что он решает систему нелинейных и трансцендентных уравнений методом Стеффенсена.

Код:

#include <stdio.h>
#include <math.h>
#include <conio.h>

int Steffensen(int n, float eps, int count, float x[n], float y[n]);

int main(int argc, char **argv)
{
        int n;                // количество неизвестных
        int count;        //        заданное количество итераций
        float eps;        //        заданная погрешность вычислений
int i,j;                // рабочие переменные
        printf("\n kolichestvo neizvestnyh n=");
        scanf("%d", &n);
        float x[n];        //        вектор решения системы уравнений
        float y[n];        //        вектор невязок
        printf("\n vektor nachalnyh priblisheniy:\n");
        for (i=0; i<n; i++)
                scanf("%f", &x[i]);
        printf("\n pogreshn. vychisl. eps=");
        scanf("%g", &eps);
        printf("\n max kolich. iteraciy count=");
        scanf("%d", &count);
       
        Steffensen(n, eps, count, x, y);

        printf("\n Reshenie sistemy uravn.:\n");
        for (i=0; i<n; i++)
                printf("%12.6f", x[i]);               
        printf("\n");
        printf("\n Vektor nevjazok:\n");
        for (i=0; i<n; i++)
                printf("%e    ", y[i]);       
        printf("\n");
return 0;       
}


laimas 18.11.2018 16:18

В JS нет аналогов функций printf и scanf, то есть это нельзя заменить одной строкой кода, нужно писать пользовательские, хотя они уже есть и готовые.

Retro_1477 18.11.2018 16:31

Я решил использовать input для написания
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <title>Лабораторная работа</title>
</head>
<style>
    .container{
        border: 2px solid #127ABD;
        padding: 10px;
    }
    div:nth-child(2){
        display: inline-block;
    }
    div.warning{
        color: red;
        display: inline-block;
    }
</style>

<body>

    <div class="container">
        <div><b>Количество неизвестных:</b><br>
        <input id="n" type="text" size="12" placeholder="n" maxlength="1"></div>

        <div><b>Вектор начальных приближений <div class="warning">(указывать через пробел)</div>:</b><br>
        <input id="vector" type="text" size="12"></div>

        <div><b>Погрешность вычислений.</b><br>
        <input id="eps" type="text" size="12" placeholder="eps" maxlength="12"></div>
        
        <div><b>Максимальное количество итераций </b><br>
        <input id="count" type="text" size="12" placeholder="count" maxlength="3"></div>

        <input id="button" type="submit" value="Решить">

        <div class="result"></div>
    </div>

</body>
<script src="jquery-3.3.1.js"></script>
<script>
var Steffensen = {
    n:undefined,
    vector:undefined,
    eps:undefined,
    count:undefined,
    x:[n],
    y:[n]
}

function solution(){

    Steffensen.n = document.getElementById('n').value;
    Steffensen.vector = document.getElementById('vector').value;
    Steffensen.eps = document.getElementById('eps').value;
    Steffensen.cont = document.getElementById('count').value;


    //$('.result').append(Steffensen.n);
}

$('#button').click(function(){
    solution();
});

</script>
</html>

laimas 18.11.2018 16:38

И как поля ввода будут решать for (i=0; i<n; i++) scanf("%f", &x[i]);?

Retro_1477 18.11.2018 18:19

Плохо знаком с синтаксисом c++, это цикличный ввод? Можно буде взять эту строку и поделить её через .split() на отдельные кусочки и потом работать с ними. И можно добавить условия для ввода вектора, типо n = кол-ву аргументов

laimas 18.11.2018 19:06

Цитата:

Сообщение от Retro_1477
это цикличный ввод?

Это форматируемый ввод (считывание данных из пото­ка stdin) в цикле.
printf, это форматируемый вывод.
Формат ожидаемого при вводе и трактуемого при выводе задается в аргументах функций.

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

Retro_1477 18.11.2018 21:30

я думал получится перевести, ну ладно. Может есть какой-нибудь онлайн калькулятор и там взять js код

laimas 19.11.2018 06:32

Цитата:

Сообщение от Retro_1477
я думал получится перевести

Можно, но если по писанному, то получится не удобно. Вопрос видимо иначе надо было ставить, типа - "есть JS функция решающая систему нелинейных уравнений методом Стеффенсена (#include <stdio.h>, #include <math.h>, #include <conio.h>, int Steffensen(int n, float eps, int count, float x[n], float y[n]); вообще не уминается), как обеспечить ввод данных для функции?".

В общем то прочесть о функции scanf несложно. На JS вы не сможете обеспечить такой же функционал, но вы можете установить обработчик ввода в поля. Он должен проверять вводимые значения в поля согласно формату, а также запрещать ввод в последующие поля при пустых предыдущих. То есть, если поле определяющее количество неизвестных пусто, то ввод значений для &x[i], запрещен, так как определяет длину массива значений, что также нужно проверять в обработчик при вводе.

Как можно видеть форматы %е, %f, %g определяют число с плавающей запятой. Разница в форматах заключается в следующем:
f - формат d.ddd...
e - формат в научной нотации (типа 1.2e2 и т.п.)
g - шестизначная дробная часть

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

Соответственно можно организовать и вывод на экран, где printf("\n"); и подобные, это ненужное и бесполезное, ну а вывод в формате %e и %12.6f, это также не сложно для понимания.


Часовой пояс GMT +3, время: 05:50.