Содержание
Задача: дана последовательность чисел создать массив из положительных элементов этой последовательности либо вывести сообщения таких нет с#
Неопределенности задачи
Практически любую задачу в программировании можно решить несколькими способами и эта задача не исключение. Как минимум, в данном случае, мы можем решить задачу, используя два способа — через обобщенные классы (List) и через использование LINQ. Так как конкретный способ не указан, то решим задачу двумя способами.
Второй момент, который вносит некоторую неопределенность, это способ задания последовательности: числа будут заданы непосредственно в исходном коде, или же мы дадим пользователю возможность вводить числа с клавиатуры? Воспользуемся более сложным вариантом и дадим пользователю вводить числа с клавиатуры.
Что стоит помнить
Самое главное и важное, что стоит помнить перед тем, как начать решать задачу — это, то, что длина массива НЕ может изменяться. То есть, задав один раз длину массива, например, на 10 элементов, мы не сможем её изменить во время работы программы. Отсюда и вытекает потребность использование помимо самого массива дополнительных возможностей C# — или класса List или возможностей LINQ, так как мы не можем предусмотреть ни то, какое количество чисел введет пользователь, ни то, сколько из этих чисел окажутся положительными. Задать в этом случае итоговый массив, например, на 1000 000 элементов — очевидная глупость и лишний расход ресурсов компьютера.
Решение задачи
Создание последовательности чисел пользователем
Пусть пользователь заранее задаст какое количество чисел он хочет записать и последовательно их вводит:
static void Main(string[] args)
{
int count = 0;
Console.WriteLine("Какое количество чисел Вы хотите задать?");
Console.WriteLine("count =");
count = Convert.ToInt32(Console.ReadLine());
double[] array = new double[count];
int i = 0;
while (i < count)
{
Console.WriteLine($"Введите число #{i+1}: ");
try
{
array[i] = Convert.ToDouble(Console.ReadLine());
i++;
}
catch
{
Console.WriteLine($"Что-то пошло не так. Введите число #{i+1} ещё раз");
}
}
Console.WriteLine("Исходный массив заполнен");
}
}
Так как по условиям задачи неизвестно какие числа могут вводиться (целые или с плавающей запятой), то будем считать, что можно вводить как целые, так и дробные числа и зададим наш массив как double[].
Как только пользователь определяется с количеством чисел, то создается массив заданной длины:
count = Convert.ToInt32(Console.ReadLine());//считываем значение длины массива double[] array = new double[count];//создаем массив
Затем запускается цикл while, в котором пользователь вводит числа до тех пор, пока массив не заполнится значениями. Если пользователь допускает ошибку, например, вводит не число, а символ, то программа просит его ввести число повторно. Именно поэтому мы использовали цикл while, а не for.
После того, как массив заполнен, в консоль выводится соответствующее сообщение.
Выбор положительных элементов последовательности
Перебор элементов массива мы можем проводить в любом цикле, но, при этом, следует не забывать сохранять необходимые нам числа (положительные) где-либо.
Использование List
using System;
using System.Collections.Generic;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
<--Здесь код заполнения массива числами-->
List<double> list = new List<double>();
foreach (double value in array)
{
if (value > 0)
list.Add(value);
}
Console.WriteLine($"Количество положительных чисел: {list.Count}");
}
}
}
Так как класс List находится в пространстве имен System.Collections.Generic, то необходимо его подключить. Массив мы перебираем в цикле foreach и, если находим число больше нуля, то добавляем его в список list. После прохождения цикла выводим количество положительных чисел пользователю.
Использование LINQ
using System;
using System.Linq;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
<--Здесь код заполнения массива числами-->
var result = array.Where(x=>x>0);
Console.WriteLine($"Количество положительных чисел:{result.Count()}");
}
}
}
Опять же, чтобы воспользоваться возможностями LINQ, мы подключаем пространство имен System.Linq. После этого, используя метод расширения Where (о нем можно прочитать здесь) мы выбираем все положительные числа из массива и сохраняем их в переменной result.
Вывод итогового массива пользователю
Чтобы вывести итоговый массив (содержащий положительные числа), достаточно одной строки кода и знания методов работы со строками в C#:
Console.WriteLine(string.Join(" ", result));
Исходный код программы
Ниже представлен полный исходный код программы, включающий в себя оба решения задачи — как со списком List, так и с LINQ:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
int count = 0;
Console.WriteLine("Какое количество чисел Вы хотите задать?");
Console.WriteLine("count =");
count = Convert.ToInt32(Console.ReadLine());//считываем значение длины массива
double[] array = new double[count];//создаем массив
int i = 0;
while (i < count)
{
Console.WriteLine($"Введите число #{i + 1}: ");
try
{
array[i] = Convert.ToDouble(Console.ReadLine());
i++;
}
catch
{
Console.WriteLine($"Что-то пошло не так. Введите число #{i + 1} ещё раз");
}
}
Console.WriteLine("Исходный массив заполнен");
//Закомментировать все строки до строки "IEnumerable....", если будет использоваться LINQ
List<double> list = new List<double>();
foreach (double value in array)
{
if (value > 0)
list.Add(value);
}
Console.WriteLine($"Количество положительных чисел: {list.Count}");
//конец кода, использующего List
IEnumerable<double> result = array.Where(x=>x>0);
Console.WriteLine($"Количество положительных чисел:{result.Count()}");
Console.WriteLine(string.Join(" ", result));
}
}
}
Итого
Для выполнения этой лабораторной работы нам понадобилось: знание того, что из себя представляет массив, умение использовать классы (в частности List) и, в качестве альтернативы, умение пользоваться методами расширения LINQ. Кстати, если уж совсем досконально подходить к решению задачи, то создать массив из списка или из переменной result можно очень просто:
double[] itog = result.ToArray(); double[] array2 = list.ToArray();