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


using System;
using System.IO;
using System.Text;

namespace LR4_Pointers_CSharp
{
    class Program
    {
        unsafe 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();
            }
        }

        unsafe static void RunTask1()
        {
            int N = ReadInt("Введите натуральное число N: ", 1);
            int n = 0;

            int* pN = &N;
            int* pn = &n;

            Console.WriteLine();
            Console.WriteLine("Таблица 1");
            Console.WriteLine("N = " + *pN);
            Console.WriteLine();

            Console.Write("n\t");
            for (*pn = 1; *pn <= *pN; (*pn)++)
            {
                Console.Write(*pn + "\t");
            }
            Console.WriteLine();

            Console.Write("N/n\t");
            for (*pn = 1; *pn <= *pN; (*pn)++)
            {
                double value = (double)(*pN) / (*pn);
                Console.Write(value.ToString("0.###") + "\t");
            }
            Console.WriteLine();
        }

        unsafe 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));
        }

        unsafe 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));
            }
        }

        unsafe static int[] BuildSequence(int N)
        {
            int[] a = new int[N + 1];

            fixed (int* p = a)
            {
                *(p + 0) = 1;

                if (N >= 1)
                {
                    *(p + 1) = 1;
                }

                for (int n = 2; n <= N; n++)
                {
                    int prev = *(p + n - 1);
                    int d = Gcd(prev, n);

                    if (d == 1)
                    {
                        *(p + n) = prev + n + 1;
                    }
                    else
                    {
                        *(p + 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("Ошибка ввода.");
            }
        }
    }
}