Загрузка данных


using System;

using System.IO;

using System.Text;

namespace LR4

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.OutputEncoding = Encoding.UTF8;

            while (true)

            {

                Console.WriteLine("ЛР 4. Применение указателей в C#");

                Console.WriteLine("1 - Задание 1");

                Console.WriteLine("2 - Задание 2");

                Console.WriteLine("3 - Подготовить файлы для графиков N=638 и N=1600");

                Console.WriteLine("0 - Выход");

                Console.Write("Выберите пункт: ");

                string choice = Console.ReadLine();

                Console.WriteLine();

                switch (choice)

                {

                    case "1":

                        RunTask1();

                        break;

                    case "2":

                        RunTask2();

                        break;

                    case "3":

                        GenerateGraphFiles();

                        break;

                    case "0":

                        return;

                    default:

                        Console.WriteLine("Неверный выбор.");

                        break;

                }

                Console.WriteLine();

                Console.WriteLine("Нажмите любую клавишу...");

                Console.ReadKey();

                Console.Clear();

            }

        }

        static void RunTask1()

        {

            int N = ReadInt("Введите натуральное число N: ", 1);

            Console.WriteLine();

            Console.WriteLine("Таблица 1");

            Console.WriteLine("N = " + N);

            Console.WriteLine();

            Console.Write("n\t");

            for (int n = 1; n <= N; n++)

            {

                Console.Write(n + "\t");

            }

            Console.WriteLine();

            Console.Write("N/n\t");

            for (int n = 1; n <= N; n++)

            {

                double value = (double)N / n;

                Console.Write(value.ToString("0.###") + "\t");

            }

            Console.WriteLine();

        }

        static void RunTask2()

        {

            int N = ReadInt("Введите целое число N (N >= 0): ", 0);

            int[] a = BuildSequence(N);

            Console.WriteLine();

            Console.WriteLine("Таблица 2");

            if (N <= 30)

                PrintFullSequence(a, N);

            else

                PrintShortSequence(a, N);

            string fileName = "task2_N" + N + ".csv";

            SaveSequenceToCsv(a, fileName);

            Console.WriteLine();

            Console.WriteLine("Полная последовательность сохранена в файл: " + Path.GetFullPath(fileName));

        }

        static void GenerateGraphFiles()

        {

            int[] values = new int[] { 638, 1600 };

            for (int i = 0; i < values.Length; i++)

            {

                int N = values[i];

                int[] a = BuildSequence(N);

                string fileName = "graph_data_N" + N + ".csv";

                SaveSequenceToCsv(a, fileName);

                Console.WriteLine("Файл для графика N=" + N + ": " + Path.GetFullPath(fileName));

            }

        }

        static int[] BuildSequence(int N)

        {

            int[] a = new int[N + 1];

            a[0] = 1;

            if (N >= 1)

                a[1] = 1;

            for (int n = 2; n <= N; n++)

            {

                int prev = a[n - 1];

                int d = Gcd(prev, n);

                if (d == 1)

                    a[n] = prev + n + 1;

                else

                    a[n] = prev / d;

            }

            return a;

        }

        static int Gcd(int a, int b)

        {

            a = Math.Abs(a);

            b = Math.Abs(b);

            while (b != 0)

            {

                int t = a % b;

                a = b;

                b = t;

            }

            return a;

        }

        static void PrintFullSequence(int[] a, int N)

        {

            Console.Write("n\t");

            for (int i = 0; i <= N; i++)

            {

                Console.Write(i + "\t");

            }

            Console.WriteLine();

            Console.Write("a(n)\t");

            for (int i = 0; i <= N; i++)

            {

                Console.Write(a[i] + "\t");

            }

            Console.WriteLine();

        }

        static void PrintShortSequence(int[] a, int N)

        {

            Console.Write("n\t");

            for (int i = 0; i <= 14; i++)

            {

                Console.Write(i + "\t");

            }

            Console.Write("...\t");

            for (int i = N - 4; i <= N; i++)

            {

                Console.Write(i + "\t");

            }

            Console.WriteLine();

            Console.Write("a(n)\t");

            for (int i = 0; i <= 14; i++)

            {

                Console.Write(a[i] + "\t");

            }

            Console.Write("...\t");

            for (int i = N - 4; i <= N; i++)

            {

                Console.Write(a[i] + "\t");

            }

            Console.WriteLine();

        }

        static void SaveSequenceToCsv(int[] a, string fileName)

        {

            using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.UTF8))

            {

                sw.WriteLine("n;a(n)");

                for (int i = 0; i < a.Length; i++)

                {

                    sw.WriteLine(i + ";" + a[i]);

                }

            }

        }

        static int ReadInt(string message, int minValue)

        {

            int value;

            while (true)

            {

                Console.Write(message);

                string s = Console.ReadLine();

                if (int.TryParse(s, out value) && value >= minValue)

                    return value;

                Console.WriteLine("Ошибка ввода.");

            }

        }