Subscribe:
    Subscribe Twitter Facebook

    суббота, 18 декабря 2010 г.

    [TPascal] Вычисление степени


    Программка для вычисления значения любой степени из любого числа. (дробь, корень, отрицательный..)












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

    Прилагался пример который надо решить с помощью программы. Что-то вроде 2^2, 3^-7. Это все можно было бы сделать через цикл for, но
    мне же захотелось программку, которой не страшно возвести любое число в любую степень.

    Для начала нужно было вспомнить математику. Долго вспоминать не пришлось, сразу же на первый запрос в google была найдена необходимая формула:
    x^n = exp(n*ln(x)).

    Сразу же задумался, а вдруг уже есть программа в свободном виде. Зачем придумывать велосипед, хоть мне честно интереснее придумать, чем "слизнуть".

    Итак, потыкав в поисковик (пальцем) он ничего толкового не выдал: все ссылки на форумы программистов не считая пары ссылок на проекты Ответ/Вопрос (или наоборот..), но ответа кроме:
    "Пользуйся формулой, сынок! exp(n*ln(x)), как папа программист сказал."

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

    Кстати, отцы просто отвечали, что без вариков что-то по другому, как работает, так и работает. Что в принципе странно..

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

    Идея проста берем принцип : x^n = exp(n*ln(x)). Корни, дроби, отрицательность работают.
    Код с комментариями:
    uses crt;

    var
    e:real;

    // описание функции ext();степени
    function ext(x,n:real):real;
    var

    // переменная для хранения результата
    m:real;
    begin

    // если степень = 0
    if n=0 then begin

    // результат = 1
    ext:=1;

    // выход из функции
    exit;
    end;

    // если число отрицательно
    if x<0 then m:=-1*exp(n*ln(abs(x))) else

    // если число положительно
    if x>0 then m:=exp(n*ln(x)) else

    // если число = 0
    m:=0;

    // проверка дробности, если целое, ->
    if n/round(n)=1 then begin

    // то если степень четная и полож, ->
    if (round(n) mod 2 = 0) and (n>0) then

    // то результат будет полож иначе отриц
    ext:=abs(m) else ext:=m;
    end;
    // если дроб, ->
    // если число отриц, а степень дроб, то результат "0"
    else if x<0 then ext:=0 else

    // если число полож, а степень дроб, то результат тот же
    ext:=m;

    // конец функции
    end;

    begin
    clrscr;

    // вычисление для проверки работы -2.2^-1.3
    e:=ext(-2.2,-1.3);

    // вывод значения
    writeln ('=',e:2:1);

    // ожидание ввода
    readln;
    end.

    1 комментарий:

    Анонимный комментирует...

    А где ее набивать

    Отправить комментарий