Вычисление корня n степени из положительного числа последовательными приближениями - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите написать программу на Си для вычисления корня n-степени из положительного числа а, пользуясь последовательными приближениями xk+1 =(n-1)*xk/n+a/(n*xn-1k) k = 0, 1, 2, ... до совпадения соседних приближений с точностью eps, если задано начальное приближение x0. Примечание: масиивы использовать нельзя, по условию.

Решение задачи: «Вычисление корня n степени из положительного числа последовательными приближениями»

textual
Листинг программы
#include <stdio.h>
#include <locale.h>
#include <math.h>
 
int main(void)
{
    double x, eps;
    double n;
    double y1, y2;
    short k;
    char line[100];
    
    if (setlocale(LC_ALL, "C") == NULL)
        fprintf(stderr, "Failed to set locale!\n");
    printf("Программа извлекает корень n-ой степени из заданного\n"
           "положительного числа, используя рекурентное соотношение:\n"
           "Yi+1 = Yi + 1 / n * (x / (Yi ^ (n - 1)) - Yi)\n");
    fflush(stdout);
    do {
        do {
            printf("Задайте x > 0 ");
            fflush(stdout);
        } while (fgets(line, sizeof line, stdin) == NULL
              || sscanf(line, "%lf", &x) != 1
              || x <= 0);
        do {
            printf("Задайте n > 1 ");
            fflush(stdout);
        } while (fgets(line, sizeof line, stdin) == NULL
              || sscanf(line, "%lf", &n) != 1
              || n <= 1 || (unsigned long) n != n);
        do {
            printf("Введите точность >0 и <1 ");
            fflush(stdout);
        } while (fgets(line, sizeof line, stdin) == NULL
              || sscanf(line, "%lf", &eps) != 1
              || eps <= 0 || eps >= 1);
        y2 = 1;
        if (y2) {
            do {
                y1 = y2;
                y2 = y1 + (x / pow(y1, n - 1) - y1) / n;
            } while (fabs(y2 - y1) >= eps);
        }
        for (k = 0; eps < 1; eps *= 10, k++)
           ;
        printf("Вычисленное значение корня %.*f\n", k, y2);
        printf("Контрольное значение %f\n", pow(x, 1.0 / n));
    } while (getchar() != EOF);
    return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Устанавливается локальная настройка для русского языка
  3. Выводится инструкция для ввода данных
  4. Проверка ввода: число x (условия: x > 0)
  5. Проверка ввода: число n (условия: n > 1)
  6. Проверка ввода: точность eps (условия: 0 < eps < 1)
  7. Инициализация начального приближения y2 со значением 1
  8. Цикл: пока разница между текущим и предыдущим приближением больше заданной точности eps
  9. Внутри цикла: вычисление нового приближения y2 по формуле рекурентного соотношения
  10. Цикл: пока разница между вычисленным значением корня и контрольным значением больше заданной точности eps
  11. Внутри цикла: уменьшение точности eps в 10 раз и увеличение числа k на единицу
  12. Вывод результатов: вычисленное значение корня и контрольное значение
  13. Проверка на конец ввода/вывода: если нажата клавиша EOF, то программа завершается
  14. Возврат 0, что означает успешное выполнение программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы