Помощь в создании таблички
Нужно создать табличку вида, когда пользователь вводит размерность N и M, программа рисует табличку NxM, заполняем случайными числами(в разном диапазоне, поэтому нужно учитывать также ширину столбца, которая может быть произвольной).
Я попытался начать, но, конечно это совсем не то, что нужно и идей как это реализовать ну совсем нет, в интернете таких табличек даже близко не нашел, помогите как, с чего начать, хоть какую-то мысль чтобы я отталкивался, всё писать не прошу.
Все символы в коде закомментированы.
Вот какого она должна быть вида:
╔════╦════╗
║ x ║ y ║
╠════╬════╣
║ 1 ║ 1 ║
║ 2 ║ 2 ║
╚════╩════╝
Вот мой какой никакой код:
//╔ ╦ ═ ║ ╠ ╬ ╣ ╩ ╝ ╚
using System;
namespace Table
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите желаемое количество столбцов таблицы в ширину");
uint width = uint.Parse(Console.ReadLine());
Console.WriteLine("Введите желаемое количество столбцов таблицы в высоту");
uint height = uint.Parse(Console.ReadLine());
Console.Write("╔");
for (int i = 0; i < width; i++)
{
Console.Write("═");
}
Console.Write("╦");
for (int j = 0; j <height; j++)
{
Console.WriteLine("║");
for (int i = 0; i <= width; i++)
{
Console.Write(" ");
}
Console.WriteLine("║");
}
Console.Write("╚");
for (int i = 0; i < width; i++)
{
Console.Write("═");
}
Console.WriteLine("╩");
}
}
}
Ответы (2 шт):
Не до конца понял, что вам нужно, при чем тут x и y и случайные числа, но подумал, что раз произвольный размер, значит речь просто про случайные числа.
static class Program
{
const int maxWidth = 10;
const int maxHeight = 10;
const int maxNumber = 99;
static int maxNumberLength = maxNumber.ToString().Length;
static void Main(string[] args)
{
int width = ReadNumber("Введите ширину таблицы: ", x => x > 0 && x <= maxWidth, $"Введите число от 1 до {maxWidth}.");
int height = ReadNumber("Введите высоту таблицы: ", x => x > 0 && x <= maxHeight, $"Введите число от 1 до {maxHeight}.");
Random rnd = new Random();
DrawSeparator(width, '╔', '╦', '╗' );
for (int i = 0; i < height; i++)
{
if (i > 0)
DrawSeparator(width, '╠', '╬', '╣');
for (int j = 0; j < width; j++)
{
Console.Write('║');
Console.Write(rnd.Next(maxNumber + 1).ToString().PadLeft(maxNumberLength));
}
Console.WriteLine('║');
}
DrawSeparator(width, '╚', '╩', '╝');
Console.ReadKey();
}
static void DrawSeparator(int length, char left, char middle, char right)
{
Console.Write(left);
Console.Write(string.Join(middle, Enumerable.Repeat(new string('═', maxNumberLength), length)));
Console.WriteLine(right);
}
static int ReadNumber(string prompt, Predicate<int> condition, string errorMessage)
{
int result;
while (true)
{
Console.Write(prompt);
if (int.TryParse(Console.ReadLine(), out result) && condition(result))
break;
Console.WriteLine(errorMessage);
}
return result;
}
}
Пример вывода в консоль
Введите ширину таблицы: 10
Введите высоту таблицы: 5
╔══╦══╦══╦══╦══╦══╦══╦══╦══╦══╗
║89║99║48║82║83║83║26║ 9║69║15║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║15║45║99║91║ 7║ 3║ 2║48║97║11║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║76║41║54║ 4║51║42║45║65║ 2║28║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║63║53║29║35║98║77║47║44║68║83║
╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
║51║21║53║72║26║53║20║86║63║27║
╚══╩══╩══╩══╩══╩══╩══╩══╩══╩══╝
Чтобы расчитать ширину каждого столбца, нужно иметь все исходные данные в массиве чисел, далее преобразовать весь этот массив в массив строк. Далее создать массив длин ячеек, посчитанный как поиск максимальной длины ячейки для каждого столбца массива со строками. И просто затем использовать этот массив для паддингов.
.PadLeft(maxNumberLength) => .PadLeft(sizes[j])
new string('═', maxNumberLength) => new string('═', sizes[j])
Я довел таблицу, до вида, который мне был нужен, поэтому прикрепляю немного измененный вариант таблицы @aepot, но именно этого я хотел добиться.
using System;
using System.Linq;
static class Program
{
const int maxWidth = 10;
const int maxHeight = 10;
const int maxNumber = 99;
static int maxLenghtOfWidth = maxNumber.ToString().Length;
static void Main(string[] args)
{
int width = ReadNumber("Введите ширину таблицы: ", x => x > 0 && x <= maxWidth, $"Введите число в диапазон от 1 до {maxWidth}");
int height = ReadNumber("Введите высоту таблицы: ", x => x > 0 && x <= maxHeight, $"Введите число в диапазон от 1 до {maxHeight}");
Console.Clear();
Random rnd = new Random();
DrawSeparator(width, '╔', '╦', '╗');
for (int i = 0; i < height; i++)
{
if (i == 1)
{
DrawSeparator(width, '╠', '╬', '╣');
}
for (int j = 0; j < width; j++)
{
Console.Write('║');
if (i >= 0 && i < 1)
{
Console.Write($"{j}".PadLeft(maxLenghtOfWidth));
}
else
{
Console.Write(rnd.Next(maxNumber + 1).ToString().PadLeft(maxLenghtOfWidth));
}
}
Console.WriteLine('║');
}
DrawSeparator(width, '╚', '╩', '╝');
Console.ReadKey();
}
static void DrawSeparator (int lenght, char left, char middle,char right)
{
Console.Write(left);
Console.Write(string.Join(middle, Enumerable.Repeat(new string('═', maxLenghtOfWidth), lenght)));
Console.WriteLine(right);
}
static int ReadNumber(string text, Predicate<int> condition, string errorMessage)
{
int result;
while (true)
{
Console.Write(text);
if (int.TryParse(Console.ReadLine(), out result) && condition(result))
break;
Console.Clear();
Console.WriteLine(errorMessage);
}
return result;
}
}