Помогите оптимизировать код на с#
Техническое задание к программе:
• Программа сообщает пользователю, что ему необходимо вводить числа по одному, завершая ввод клавишей Enter.
• После каждого введённого числа программа должна напечатать через пробел все введённые к настоящему моменту числа, а также сообщить минимальное, максимальное из них, среднее значение и среднеквадратичное отклонение (СКО).
В программе должны быть созданы несколько методов, например:
• Для печати на экран сообщения о необходимости ввода очередного числа и для считывания этого числа.
• Для добавления очередного числа в массив.
• Для расчёта статистических величин.
код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IvanovLabRab
{
class Program
{
static void Main(string[] args)
{
Console.Write("Введите количество элементов вашего массива: ");
int count = int.Parse(Console.ReadLine());
double[] massive = new double[count];
Console.WriteLine("Вы должны ввести числа по одному через Enter");
for (int i = 0; i < massive.Length; i++)
{
Console.WriteLine(" Введите " + (i + 1) + "-е число");
double.TryParse(Console.ReadLine(), out massive[i]);
Console.WriteLine(" Ваши числа массива: ");
for (int n = 0; n < massive.Length; n++)
{
if (n <= i)
{
Console.Write(massive[n] + " ");
}
}
Console.WriteLine();
Console.WriteLine("Минимум: " + Minimum(i, massive));
Console.WriteLine();
Console.WriteLine("Максимум: " + Maximum(i, massive));
Console.WriteLine();
Console.WriteLine("Среднее значение: " + SredneeZnachenie(i, massive));
Console.WriteLine();
Console.WriteLine("СКО : " + SredneKvadratichZnach(i, massive));
}
Console.ReadLine();
}
static double Minimum(int i, double[] massive)
{
double min = massive[0];
for (int k = 0; k <= i; k++)
if (min > massive[k])
{
min = massive[k];
}
{
return min;
}
}
static double Maximum(int i, double[] massive)
{
double max = massive[0];
for (int k = 0; k <= i; k++)
if (max < massive[k])
{
max = massive[k];
}
{
return max;
}
}
static double SredneeZnachenie(int i, double[] massive)
{
double sz = 0;
double sum = 0;
{
for (int k = 0; k <= i; k++)
sum = sum + massive[k];
}
sz = sum / (i + 1);
return sz;
}
static double SredneKvadratichZnach(int i, double[] massive)
{
double sko = 0;
double kvadr = 0;
double podkor = 0;
for (int k = 0; k <= i; k++)
{
kvadr += (massive[k] - SredneeZnachenie(i, massive)) * (massive[k] - SredneeZnachenie(i, massive));
}
podkor = kvadr / i;
sko = Math.Sqrt(podkor);
return sko;
}
}
}
Ответы
Объяснение:
Наверное, для глобальной оптимизации лучше вообще отказаться от массива как такового. В шарпе есть прекрасная альтернатива - List с уже встроенными функциями поиска минимального, максимального и среднего. Для нахождения СКО правда нужно применить дополнительные телодвижения.
И в условии задачи не сказано, что количество элементов заренее известно или задаётся вначале, поэтому заменил цикл на бесконечный с условием выхода, если будет введено нечто, что не распознается как число.
using System;
using System.Collections.Generic;
using System.Linq;
namespace IvanovLabRab
{
class Program
{
static void Main(string[] args)
{
List<double> massive = new List<double>();
Console.WriteLine("Вы должны ввести числа по одному через Enter\nДля выхода введите любое не числовое значение");
int i = 0;
do
{
i++;
Console.WriteLine(" Введите " + i.ToString() + "-е число");
try
{
massive.Add(double.Parse(Console.ReadLine()));
}
catch
{
break;
}
PrintMassiv(massive);
Console.WriteLine();
Console.WriteLine("Минимум: " + Minimum(massive));
Console.WriteLine();
Console.WriteLine("Максимум: " + Maximum(massive));
Console.WriteLine();
Console.WriteLine("Среднее значение: " + SredneeZnachenie(massive));
Console.WriteLine();
Console.WriteLine("СКО : " + SredneKvadratichZnach(massive));
} while (true);
Console.WriteLine("Цикл ввода окончен");
Console.ReadLine();
}
static void PrintMassiv(List<double> InArray)
{
Console.WriteLine(" Ваши числа массива: ");
foreach(double Number in InArray) Console.Write(Number.ToString() + " " );
Console.WriteLine();
}
static double Minimum(List<double> InArray)
{
return InArray.Min();
}
static double Maximum(List<double> InArray)
{
return InArray.Max();
}
static double SredneeZnachenie(List<double> InArray)
{
return InArray.Average();
}
static double SredneKvadratichZnach(List<double> InArray)
{
double average = SredneeZnachenie(InArray);
double sumOfSquaresOfDifferences = InArray.Select(val => (val - average) * (val - average)).Sum();
return Math.Sqrt(sumOfSquaresOfDifferences / InArray.Count);
}
}
}