Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ревьюирование программного кода

Елена Дюрягина Ученик (90), на голосовании 4 месяца назад
Задание:

Провести ревьюирование программного кода:

выяснить, какие части программы выполнены с ошибками
указать, какие ошибки были допущены
указать, как исправить программу

static void Example()
{
Console.Write("Введите размер массива: ");
int x = Convert.ToInt32(Console.ReadLine());
int[] arr = new int[x];
Random random = new Random();
for (int i = 0; i < arr.Length; i--)
{ arr[i] = random.Next (21); }
foreach (int i in arr)
{ Console.Write(i + " "); }
Console.WriteLine();
string sum = 0;
for (int i = 0; i < arr.Length; i++)
{
if ((arr[i] < 11) && !(arr[i] % 2 == 0))
{ sum += arr[i];
Console.Write(arr[i] + " "); }
}
Console.WriteLine();
Console.WriteLine($"Сумма нечетных чисел массива, не превышающих 11 равна {sum}");
}
Голосование за лучший ответ
Амура . Профи (601) 5 месяцев назад
В предоставленном коде есть следующие ошибки:

1. Неверное использование оператора  %  для проверки условия в операторе  if . Оператор  %  возвращает остаток от деления, поэтому условие  (arr[i] % 2 == 0)  всегда будет истинным, так как все числа в массиве являются чётными.

2. Некорректное вычисление суммы. Переменная  sum  инициализируется значением 0, но затем в цикле  foreach  происходит суммирование элементов массива, которые могут быть отрицательными числами. В результате сумма может оказаться некорректной.

Для исправления кода необходимо внести следующие изменения:

1. Заменить оператор  %  на  == 0  в условии оператора  if :
 
if ((arr[i] < 11) && arr[i] == 0)
{
sum += arr[i];
Console.Write(arr[i] + " ");
}
 
2. Изменить инициализацию переменной  sum  на  int sum = 0; :
 
int sum = 0;
 
После внесения этих изменений код будет корректно вычислять сумму только тех элементов массива, которые меньше 11 и не кратны 2.
Елена ДюрягинаУченик (90) 5 месяцев назад
Спасибо огромное
Jurijus Zaksas Искусственный Интеллект (445781) 5 месяцев назад
Ну держи:

 static void Example()  
{
Console.Write("Введите размер массива: ");
int x = Convert.ToInt32(Console.ReadLine()); //Нейминг! Что за х? Не обработано возможное исключение конверсии.
int[] arr = new int[x]; //Нейминг! Что за arr, что это имя говорит о его бизнес-роли?
Random random = new Random(); // Нейминг! Это объект, генерирующий случайные числа, вот и назови его RandomGenerator. Значение генератора не инициализировано, что может давать много совпадающих результатов в старых версиях .net
for (int i = 0; i < arr.Length; i--) // Цикл закончится только после переполнения
{ arr[i] = random.Next (21); } //Вылет на второй итерации цикла, лишние логические скобки
foreach (int i in arr)
{ Console.Write(i + " "); } //лишние логические скобки
Console.WriteLine();
string sum = 0; //Нейминг! Понятно, что сумма, а чего именно?
for (int i = 0; i < arr.Length; i++)
{ //лишние логические скобки
if ((arr[i] < 11) && !(arr[i] % 2 == 0)) // вместо !(==) нагляднее использовать !=, лишние скобки в условии - это не паскаль
{ sum += arr[i]; //расположение логических скобок затрудняет чтение кода
Console.Write(arr[i] + " "); }
}
Console.WriteLine();
Console.WriteLine($"Сумма нечетных чисел массива, не превышающих 11 равна {sum}");
}
Этот код можно было бы переписать так:

 Console.Write("Number of elements:"); 
int NumberOfElements = int.Parse(Console.ReadLine());
Random RandomGenerator = new Random(DateTime.Now.Microsecond);
var RandomElementCollection = Enumerable.Range(1, NumberOfElements).Select(x => RandomGenerator.Next(21)).ToList();
Console.WriteLine(RandomElementCollection.Aggregate(string.Empty, (x, y) => x + y + " " ));
var MatchingElements = RandomElementCollection.Where(x => x < 11 && (x & 1) == 1);
Console.WriteLine(MatchingElements.Aggregate(string.Empty, (x, y) => x + y + " "));
int SumOfMatchingElements = MatchingElements.Sum();
Console.WriteLine($"The matching element sum is {SumOfMatchingElements}");
Похожие вопросы