Обработка одномерных массивов, как доработать код?

Привет, помогите, не могу разобраться с массивами.

Что есть: Вводим 10 случайных чисел, после программа находит и показывает последнее положительное число в набранном списке. Если чисел нет, показывается сообщение, что их нет.

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace massiv
{
    class Program
    {
        static void Main(string[] args)
        {
            uint i = 0;
            double[] m = new double[10];
            bool q = false;

            Console.WriteLine("Введите 10 элементов массива:");

            do
            {
                Console.Write(" № "+(i+1)+": = ");
                m[i] = Convert.ToDouble(Console.ReadLine());
                i++;
            }
            while (i < 10);

            for (i = 0; i < 10; i++)
            {
                if (m[i] > 0)
                {
                    Console.Write("Последнее положительное число в массиве - " + m[i] + " имеет номер - "+(i+1));
                    q = true;
                    break;
                }
            }

            if (q == false) { Console.Write("Нет положительных чисел"); }

            Console.ReadLine();
        }
    }
}


Вопрос: как определить и вывести значение последнего по порядку положительного элемента?
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 7
@onepavel
Консультация и разработка мобильных приложений
почти правильно же
только ты начинаешь искать с нулевого элемента и при первом найденом обрываешь цикл,
а задача наоборот последнее, значит надо массив надо обходить с конца
что то вроде такого for (i = 9; i < 0; i--)
Ответ написан
Комментировать
spark108
@spark108
Способ Daria Motorina вполне себе рабочий, а способ one pavel более близок к вашей реализации, но я все же предложу свой код.

uint i = 0; 
 double[] m = new double[10]; 
 Console.WriteLine("Введите {0} значений:", m.Length); 

 do 
 { 
 Console.Write("{0}: ", i + 1); 
 m[i] = Convert.ToDouble(Console.ReadLine()); 
 i++; 
 } 
 while (i < m.Length); 

 int j = Array.FindLastIndex(m, (double d) => d > 0); 
 Console.WriteLine("Последнее положительное число в массиве - {0} имеет номер - {1}.", m[j], j+1);


Создаем массив способом как у вас, а далее можно использовать метод Array.FindLastIndex передав ему в качестве первого элемента сам массив, а в качестве второго условие поиска. Метод найдет последний элемент больше нуля и вернет его позицию в массиве. По этому номеру позиции можно запросить уже само число из массива и его же использовать в вашем выводе.
Ответ написан
Комментировать
@cicatrix
было бы большой ошибкой думать
А зачем пилить 2 прохода? Можно сразу на этапе ввода определять, положительное или нет.
Ну и Convert.ToDouble - плохая практика. Лучше Double.TryParse
Console.WriteLine("Введите 10 элементов массива:");
double[] m = new double[10];
int lastPositive = -1;
for (int i = 0; i < 10; ++i)
{
    
   bool validate = false; // Флаг правильного ввода пользователя
   while (!validate)
   {
      Console.Write($"№ {i}:");
      validate = double.TryParse(Console.ReadLine(), out m[i]); // Вернёт false если пользователь ввёл фигню
   }
   if (m[i]  > 0) lastPositive = i;
}
if (-1 == lastPositive) Console.WriteLine("Положительных чисел не вводилось");
else 
Console.WriteLine($"Последнее положительное число имеет индекс {lastPotitive}");
Ответ написан
Комментировать
glaphire
@glaphire
PHP developer
Сейчас у Вас по логике выходит так - в цикле for Вы перебираете массив, как только встречаете положительное число - выводите текст и выходите из for, т.е. на самом деле это первое положительное число, а не последнее.
Чтобы найт последнее, нужно создать промежуточный пустой массив, пройтись по массиву m через for, на каждой итерации проверять, что элемент положительный, если да - записать в промежуточный массив и переходить к след. итерации.
Потом уже вне for достать последний элемент из промежуточного массива и вывести сообщение в консоль.
Ответ написан
exorka
@exorka
Программист, админ, радиолюбитель
А не проще отсортировать массив и вывести Max?
Ответ написан
int count=0;
double number,value;
value=-3;
number=value;
while(count<m.Lenght){//выполнять пока не дошли до конца массива
if(m[count]>0){
value=m[count];//его значение
number=count;//номер элемента
}
count++;
}
if(number==-3){
Console.Write("Нет положительных чисел"); 
}
else{
Console.Write("Последнее положительное число в массиве - " + value+ " имеет номер - "+number);
                    
}
Ответ написан
Комментировать
@Senarest
Разработчик C#
using System;

namespace LastPositiveNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            int result = 0;
            int[] array = new int[10] { 1, 2, -5, 7, 9, -3, 4, 5, -7, -5 };

            foreach (var item in array)
                result = item > 0 ? item : result;

            if (result > 0)
                Console.WriteLine(result);
            else
                Console.WriteLine("Положительных чисел нет");
            Console.ReadLine();
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы