Содержание
Задача: дана последовательность чисел создать массив из положительных элементов этой последовательности либо вывести сообщения таких нет с#
Неопределенности задачи
Практически любую задачу в программировании можно решить несколькими способами и эта задача не исключение. Как минимум, в данном случае, мы можем решить задачу, используя два способа — через обобщенные классы (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();