Загрузка данных
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("Ошибка ввода.");
}
}