Лабораторная работа №4 «Создание массива»

Задача: дана последовательность чисел создать массив из положительных элементов этой последовательности либо вывести сообщения таких нет с#

Неопределенности задачи

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

 

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии