@nikitasalnikov
Новичок

Как правильно разбирать задачи и примеры?

Здравствуйте. Подскажите пожалуйста как правильно разбираться в условиях задачи и ее решения путем написания кода. Вот приведу пару примеров.
1.Условие задачи. Определить n-й член числовой последовательности (n>2):

xn=xn–1 + xn–2; x0 = x1 = 1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            // вычисление n-го члена последовательности
            int n; // n>2
            int x0, x1, x2;
            int i;

            // ввести значение n
            Console.Write("n = ");
            n = Convert.ToInt32(Console.ReadLine());

            // начальные присваивания
            x0 = x1 = 1;
            x2 = x0 + x1;
            i = 1;

            while (i <= n - 3) // вычисление
            {
                x0 = x1;
                x1 = x2;
                x2 = x0 + x1;
                i++;
            }
            Console.WriteLine("{0} ", x2);
        }
    }
}

Какое значение имеет тут переменная i ? Почему ей присваивается значение 1? И почему далее в цикле while, i <= n-3? Откуда вообще это n-3? В условиях же этого нету.
Почему x1 = x2, если х2 = х0 + х1? Типа x0 = 0?
Может есть какие то тут математические корни которые мы проходили в школе, и они просто переведены в программу?

2.Условие задачи. Вычислить значения числа π, используя формулу:

Определить, какое количество слагаемых нужно для определения числа π с точностью 7 знаков после запятой.

Pi/4 = 1 - 1/3+1/5 - 1/7+1/9-...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            // вычислить значение числа Пи
            double pi; // результат
            int denom; // знаменатель
            int sign; // переменная, изменяющая знак числа + на -, и наоборот
            double t; // дополнительная переменная - текущая точность
            const double eps = 0.0000001; // точность 7 знаков после запятой
            int k; // количество слагаемых для получения заданной точности

            // начальные приготовления
            k = 0;
            pi = 0;          
            denom = 1;
            sign = 1;
            t = 1.0 / denom * sign;

            // цикл while - вычисление
            while (t > eps)
            {
                pi = pi + 4 * t * sign;
                sign = -sign; // изменить знак
                denom += 2; // изменить знаменатель
                t = 1.0 / denom;
                k++; // увеличить на 1 количество слагаемых
            }

            // вывод результата
            Console.WriteLine("Pi = {0}", pi);
            Console.WriteLine("k = {0}", k);
        }
    }
}

Здесь вообще ничего не пойму. Зачем столько переменных, почему такие значения переменным присваивается? Почему такое решение?
Где взять ответы на все эти вопросы, чтобы все на пальцах разъяснили?. Или это все как то можно найти в учебниках по математике?
  • Вопрос задан
  • 329 просмотров
Пригласить эксперта
Ответы на вопрос 1
Вообще, ваш вопрос не вопрос, а задание, но.
1. Из-за паскале-подобного кода было сложно понять, но после рефакторинга я понял, что это вычисление n-го члена последовательности фибоначи. n-3 сделано, тк автор когда м***к и не знает ничего про чистоту и читабельность кода.
Console.Write("n = ");
var n = Convert.ToInt32(Console.ReadLine());

var s = new [] { 1, 1, 2};
for(var i = 0; i < n - 3; i++)
{
    s[0] = s[1];
    s[1] = s[2];
    s[2] = s[0] + s[1];
}
Console.WriteLine(x2);

Тут "- 3" из-за того, что первые три члена уже вычислены - 1, 1, 2, ...
И так далее.
Аналогично со второй задачей - сначала даёшь нормальные имена переменным, и переносишь их туда, где они реально нужны, потом убираешь лишние комментарии, while вот это странный заменяешь на for, и так далее.
Вообще, понять, почему код именно такой, не зная изначальную задачу, сложно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы