using System;
using System.Collections.Generic;
namespace FunctionPlot
{
class Program
{
static void Main(string[] args)
{
// Параметры из задания (можно менять)
double a = 0;
double b = 4;
double h = 0.02;
// Функция
Func<double, double> F = x => x * x + 1;
Console.WriteLine($"Таблица значений F(x)=x^2+1 на [{a}, {b}] с шагом h={h}\n");
Console.WriteLine(" x | F(x) ");
Console.WriteLine("----------|----------");
double x = a;
while (x <= b + 1e-10)
{
Console.WriteLine($"{x,8:F3} | {F(x),8:F3}");
x += h;
}
// Вызов простого ASCII-графика
DrawAsciiGraph(F, a, b, 50); // 50 - ширина графика в символах
Console.ReadKey();
}
static void DrawAsciiGraph(Func<double, double> func, double a, double b, int width)
{
int height = 20;
List<double> values = new List<double>();
double minY = double.MaxValue;
double maxY = double.MinValue;
for (double x = a; x <= b; x += (b - a) / width)
{
double y = func(x);
values.Add(y);
if (y < minY) minY = y;
if (y > maxY) maxY = y;
}
if (Math.Abs(maxY - minY) < 1e-9)
{
minY -= 0.5;
maxY += 0.5;
}
char[,] grid = new char[height, width];
for (int i = 0; i < height; i++)
for (int j = 0; j < width; j++)
grid[i, j] = ' ';
// Рисуем оси
int zeroRow = (int)((0 - minY) / (maxY - minY) * (height - 1));
zeroRow = Math.Max(0, Math.Min(height - 1, zeroRow));
for (int j = 0; j < width; j++)
grid[zeroRow, j] = '-';
for (int i = 0; i < height; i++)
grid[i, 0] = '|';
grid[zeroRow, 0] = '+';
// Рисуем график
for (int j = 0; j < width; j++)
{
double y = values[j];
int row = (int)((y - minY) / (maxY - minY) * (height - 1));
row = Math.Max(0, Math.Min(height - 1, row));
if (grid[row, j] == ' ')
grid[row, j] = '*';
}
// Вывод
Console.WriteLine("\nASCII-график (ось X горизонтальна, ось Y вертикальна):\n");
for (int i = height - 1; i >= 0; i--)
{
for (int j = 0; j < width; j++)
Console.Write(grid[i, j]);
Console.WriteLine();
}
Console.WriteLine($"\nДиапазон Y: [{minY:F3}, {maxY:F3}]");
}
}
}