Вот небольшая тестовая программа, которая поможет вам начать создание вертикальной гистограммы. Обратите внимание, что я объединил последнее решение, которое я предоставил для горизонтальной гистограммы, и сделал код более универсально применимым:
private static readonly char star = '*';
private static readonly uint minValue = 1;
private static readonly int maxValue = 10;
static void Main(string[] args)
{
var list = GetHistorgramData();
CreateHorizontalHistogram(list);
CreateVerticalHistogram(list);
}
private static void CreateHorizontalHistogram(List<int> list)
{
Console.WriteLine("Your Horizontal Histogram looks like this: ");
//foreach(var value in list)
//{
// Console.WriteLine(string.Empty.PadRight(value, star));
//}
//Console.WriteLine("Or like this with LINQ");
list.ForEach(n => Console.WriteLine(string.Empty.PadRight(n, star)));
}
private static void CreateVerticalHistogram(List<int> list)
{
Console.WriteLine("Your Vertical Histogram looks like this: ");
for(int i = 0; i < maxValue + 1; i++)
{
var displayLine = string.Empty;
foreach(int x in list)
{
displayLine += ((x + i) - maxValue) > 0 ? star.ToString() : " ";
}
Console.WriteLine(displayLine);
}
}
private static List<int> GetHistorgramData()
{
var limits = "a number between " + minValue + " and " + maxValue + ": ";
Console.WriteLine("Please enter " + limits);
var list = new List<int>();
do
{
var message = string.Empty;
bool isNumber = false;
bool isRightSize = false;
int output;
do
{
var input = Console.ReadLine();
isNumber = int.TryParse(input, out output);
if(isNumber)
{
isRightSize = minValue <= output && output <= maxValue;
message = isRightSize ? "That will do: " : "Try again - value is not " + limits + output;
}
else
{
message = "Try again - " + input + " is not a Number";
}
Console.WriteLine(message);
}while(!isNumber || !isRightSize);
list.Add(output);
Console.WriteLine("Entered number at position" + list.Count + " : " + output);
}while(list.Count < 8);
return list;
}
Вертикальные результаты:
*
**
**
****
****
******
*******
********
********
для ввода:
Please enter a number between 1 and 10:
2
Entered number at position1 : 2
4
Entered number at position2 : 4
6
Entered number at position3 : 6
8
Entered number at position4 : 8
9
Entered number at position5 : 9
6
Entered number at position6 : 6
4
Entered number at position7 : 4
3
Entered number at position8 : 3
ПРИМЕЧАНИЕ : Я предлагаю вам использовать метод GetHistorgramData()
для вертикальной и горизонтальной. Вы можете решить, будете ли вы sh использовать LINQ
для горизонтальной гистограммы или версию foreach
l oop. Я думаю, что мог бы сделать LINQ
версию для вертикальной гистограммы, но я чувствовал, что это может показаться странным. Возможно, вы захотите немного изменить гистограмму, но имейте в виду, что ширина пробела "" отличается от ширины звезды "*". Пожалуйста, дай мне знать, если возникнут какие-либо вопросы.