В массиве H(n) хранятся значения высот некоторого профиля местности - C#
Формулировка задачи:
Подскажите как решить?
В массиве H(n) хранятся значения высот неко¬торого профиля местности (ее вертикального сечения) с постоянным шагом по горизонтали. Найти области (номера точек измерения высоты), невидимые для наблюдателя, находящегося в точке h1.
Решение задачи: «В массиве H(n) хранятся значения высот некоторого профиля местности»
textual
Листинг программы
using System;
using System.Collections.Generic;
namespace invisiblePoints
{
class Programm
{
public static void Main( )
{
Console.WriteLine("Введите значения профиля местности");
// Создаем список значений высот
List<double> heightValues = new List<double>();
// Создаем переменную, в которую будем считывать значения
string heightValue;
// Бесконечный цикл
while( true )
{
// Если введена непустая строка
// Пытаемся преобразовать ее в число типа double методом "Parse()" класса "Double"
if ((heightValue = Console.ReadLine()) != "")
{
heightValues.Add(Double.Parse(heightValue));
}
// Если строка пустая выходим из цикла
else
{
break;
}
}
if (heightValues.Count < 2)
{
Console.WriteLine("Вы ввели менее 2 значений, что недопустимо.");
Console.WriteLine("Программа будет закрыта по нажатии ENTER.");
Console.ReadLine();
return;
}
// Ищем номера невидимых точек заносим их значения в список
List<int> invisiblePointsNumbers = findInvisiblePointsNumbers( heightValues );
// Выводим его на экран
Console.WriteLine( "Номера невидимых точек" );
foreach (var element in invisiblePointsNumbers)
{
Console.Write(element);
}
Console.WriteLine();
// Ждем пока кто - нибудь нажмет "Enter"
Console.ReadLine();
}
// Функция для поиска невидимых точек
private static List<int> findInvisiblePointsNumbers(List<double> inputHeightValues)
{
// Вычисляем параметры первоначальной "Прямой видимости" a, b
double a = (inputHeightValues[1] - inputHeightValues[0]) / 1;
double b = inputHeightValues[0];
// Создаем список номеров невидимых точек
List<int> invisiblePointsNumbers = new List<int>();
// На каждой итерации или заносим очередную точку в невидимые или пересчитываем уравнение "ax+b"
for (int pointNum = 2; pointNum < inputHeightValues.Count; pointNum++)
{
if (inputHeightValues[pointNum] < a * pointNum + b)
{
invisiblePointsNumbers.Add( pointNum + 1 ); // +1 для того чтобы счет шел от 1.
}
else
{
a = (inputHeightValues[pointNum] - inputHeightValues[0]) / pointNum;
}
}
return invisiblePointsNumbers;
}
}
}