Как найти первое отрицательное число в массиве

0 / 0 / 0

Регистрация: 18.12.2013

Сообщений: 2

1

В массиве чисел найти первое отрицательное число

18.12.2013, 21:29. Показов 6971. Ответов 1


Студворк — интернет-сервис помощи студентам

Думаю что он легкий, а решить не могу( не умею решать их) (
В массиве чисел А1 А2……Аn найти первое отрицательное число и напечатать его номер

Заранее спасибо!



0



vasy02

12 / 12 / 8

Регистрация: 19.10.2010

Сообщений: 237

19.12.2013, 06:35

2

Лучший ответ Сообщение было отмечено korobulk как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  a:array [1..100] of integer;
  i,x:integer;
  n:integer;
begin
  readln(n);
  for i:=1 to n do
    read(a[i]);
  for i:=1 to n do
    if a[i]<0 then begin
      x:=i;
      break;
    end;
  writeln(x);
  readln;
  readln
end.

не вижу ничего сложного=)



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

19.12.2013, 06:35

Помогаю со студенческими работами здесь

Найти в массиве первое число равное заданному
Найти в массиве первое число равное заданному целому числу а и вывести error если таких чисел нет.

В файле найти первое положительное и последнее отрицательное числа
Есть программа, которая в файле находит первое положительное и последнее отрицательное числа и…

Найти в последовательности чисел 1, 1+, 1++,… первое число, большее заданного А
Найти в последовательности чисел 1, 1+1/2, 1+1/2+1/3,… первое число, большее заданного А.

Дано действительно число А. Найти среди чисел 1,1+1/2, 1+1/2+1/3,….. первое, большее А.
Дано действительно число А. Найти среди чисел 1,1+1/2, 1+1/2+1/3,….. первое, большее А.

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

2

Формулировка задачи:

Думаю что он легкий, а решить не могу( не умею решать их) (
В массиве чисел А1 А2……Аn найти первое отрицательное число и напечатать его номер

Заранее спасибо!

Код к задаче: «В массиве чисел найти первое отрицательное число»

textual

var
  a:array [1..100] of integer;
  i,x:integer;
  n:integer;
begin
  readln(n);
  for i:=1 to n do
    read(a[i]);
  for i:=1 to n do
    if a[i]<0 then begin
      x:=i;
      break;
    end;
  writeln(x);
  readln;
  readln
end.

Полезно ли:

6   голосов , оценка 4.000 из 5

надо

if (a[i]<0&&plus2==0) {plus=a[i];plus1=i;/*вот тут ошибка*/ plus2++;}

а вообще у вас алгоритм содержит одну принципиальную ошибку (правда возникающую с вероятностью 0.5^n)

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

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

  int plus_value = 0, 
      minus_value = 0, 
      plus_pos = -1, 
      minus_pos = -1;

  for (i = 0; i < n; i++)
  {
      a[i] = rand() % 100 - 50;
      printf("%dt", a[i]);

      // рассматриваем все отрицательные значения и записываем позицию последнего
      if (a[i] < 0) {
          minus_value = a[i]; 
          minus_pos = i;
      }

      // рассматриваем положительные значения только тогда, когда не было найдено ни одного положительного значения ранее (позиция остается неопределённой - -1)
      if (a[i] > 0 && plus_pos == -1) {
          plus_value = a[i]; 
          plus_pos = i;
      }
  }

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

  1. для отрицательного числа (которое надо найти последнее) проверяется каждый элемент

    if (a[i] < 0) {
    
  2. для положительного числа (которое надо найти первое) проверяется элемент до тех пор пока не будет найден первый положительный элемент

    if (a[i] > 0 && plus_pos == -1) {
    

P.S.

Ну и соответственно когда вы выводите результаты — проверяйте minus_pos и plus_pos на -1 и выводите соответствующий текст — типа положительных чисел найдено не было

Запомните — чем меньше n, тем выше шанс, что это случится, а при n = 1 шанс равен 100%, что или отрицательных или положительных или и тех и других найдено не будет (например в массиве только 0 будет)

а за что автора вопроса минусуют?

 

torrero80

Пользователь

Сообщений: 6
Регистрация: 24.07.2018

Привет, Коллеги )

Помогите, пожалуйста, решить такую НЕТРИВИАЛЬНУЮ, НО РЕАЛЬНУЮ задачу.
1. Компания продает Товар А (товаров много), которую она заказывает на производстве.
2. Известны средние продажи в день и цикл исполнения заказа в днях.
3. На основании средних продаж прогнозируется средний расход товара в день.
4. Товар на складе уменьшается ежедневно на величину среднего расхода товара в день.
5. Соответственно, необходимо автоматически, с помощью формулы:
   -1- НАЙТИ ПЕРВОЕ ОТРИЦАТЕЛЬНОЕ ЗНАЧЕНИЕ В МАССИВЕ
   -2- ОПРЕДЕЛИТЬ АДРЕС ДАННОЙ ЯЧЕЙКИ (дату, когда запасы на складе уходят в минус)
   -3- ОПРЕДЕЛИТЬ ДАТУ РАЗМЕЩЕНИЯ ЗАКАЗА НА ПРОИЗВОДСТВЕ, ЗНАЯ ЦИКЛ ИСПОЛНЕНИЯ ЗАКАЗА (точка заказа)
   -4- ВЫДЕЛИТЬ ЯЧЕЙКУ СО ЗНАЧЕНИЕМ в ТОЧКЕ ЗАКАЗА КАКИМ-ЛИБО ФОРМАТИРОВАНИЕМ.
   -5- В ТОЧКЕ ЗАКАЗА в ПОЛЕ «Ожидаемый приход, шт.» ВПИСАТЬ МИНИМАЛЬНЫЙ РАЗМЕР ЗАКАЗА
6. Решить пункт 5 периодично, для бесконечного массива.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Комплексные задачи решают в разделе платных закзов. Или Вы считаете, что п.5 (5.1-5.5)- один вопрос?
Под название темы попадает только 5.1

 

БМВ

Модератор

Сообщений: 21632
Регистрация: 28.12.2016

Excel 2013, 2016

vikttur,  g.6 не выполним вааще :-) . Масcивы то и дело заканчиваются и бесконечного нет :-)

По вопросам из тем форума, личку не читаю.

 

torrero80

Пользователь

Сообщений: 6
Регистрация: 24.07.2018

Достаточно будет Только 5.1.
Найти первое отрицательно и вернуть его адрес.

 

БМВ

Модератор

Сообщений: 21632
Регистрация: 28.12.2016

Excel 2013, 2016

=MATCH(1=1;INDEX(B3:B75<0;);0)+2
или массивно
=MATCH(1=1;B3:B75<0;0)+2

Изменено: БМВ24.07.2018 12:36:15

По вопросам из тем форума, личку не читаю.

 

torrero80

Пользователь

Сообщений: 6
Регистрация: 24.07.2018

Спасибо. Работает. Но… только для первого отрицательного числа.
А нужно периодически. Идет массив положительных чисел, начались отрицательные — ХОП —
поймал первое отрицательное — вернул адрес. Дальше отрицательные закончились,
пошли положительные, снова отрицательные — ХОП — снова поймал первое отрицательное — вернул адрес.

 

БМВ

Модератор

Сообщений: 21632
Регистрация: 28.12.2016

Excel 2013, 2016

вот этот ваш ХОП не соотвтевует теме

Как найти первое отрицательное число в массиве…
vs  Работает. Но… только для первого отрицательного числа.

Если вам надо определить дату, которая на 14 (ну или X дней) ранее ухода остатка в минус исходя из плана , то это не совсем первое отрицательное.

Изменено: БМВ24.07.2018 13:02:34

По вопросам из тем форума, личку не читаю.

 

torrero80

Пользователь

Сообщений: 6
Регистрация: 24.07.2018

#8

24.07.2018 13:00:26

Цитата
БМВ написал:
вот этот ваш ХОП не соотвтевует теме

Хорошо.
Тогда хотя бы как ячейке вернуть собственный текущий адрес?

 

БМВ

Модератор

Сообщений: 21632
Регистрация: 28.12.2016

Excel 2013, 2016

Коррида прям.
torrero80, Как последний вопрос к теме относится?

Вы сформулировали название темы не корректно, написали придуманный алгоритм , который возможно не верен, а надо было то что было помечено руками, как точка заказа, пометить но автоматом, так?

Изменено: БМВ24.07.2018 13:17:26

По вопросам из тем форума, личку не читаю.

 

torrero80

Пользователь

Сообщений: 6
Регистрация: 24.07.2018

#10

24.07.2018 13:18:40

Кнопка цитирования не для ответа [МОДЕРАТОР]

1. Ну не создавать же отдельную тему для маленькой подзадачи. В начале была идея, с помощью которого можно решить эту задачу, но нужно было решить этот пунктик, а я не знал как.
2. Алгоритм я не придумывал. Я работаю — это рабочий алгоритм. Просто пока вручную остатки отслеживаю, а хотелось бы в автоматическом режиме
3. Всем спасибо, я решил задачу. Привожу решение, вдруг у кого-то появится такой же вопрос:

УСЛОВНОЕ ФОРМАТИРОВАНИЕ С ПОМОЩЬЮ ФОРМУЛ:

Код
=И(СМЕЩ(B2;$F$2;)<0;СМЕЩ(B2;$F$2-1;)>0)

Файл найдете здесь.
Все остальные пункты можно решить по аналогичной схеме.

 

torrero80

Пользователь

Сообщений: 6
Регистрация: 24.07.2018

БМВ

Спасибо. Ваш первый ответ взял на вооружение ))

 

БМВ

Модератор

Сообщений: 21632
Регистрация: 28.12.2016

Excel 2013, 2016

torrero80,  ну раз уж сами сделали, то примите совет
=AND(INDEX(B2:B999;$F$2)>0;INDEX(B3:B999;$F$2)<=0)

Изменено: БМВ24.07.2018 13:42:01

По вопросам из тем форума, личку не читаю.

 

Мартын

Пользователь

Сообщений: 282
Регистрация: 22.12.2016

Если то, что написано это всё, то вот формула
ОКРУГЛ((B3/$F$1);0)<$F$2
Поставить её в D протянуть до бесконечности вниз. Где Истина, там и заказывай товар.

Изменено: Мартын24.07.2018 14:35:40

 

Jack Famous

Пользователь

Сообщений: 11035
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#14

24.07.2018 15:24:00

OFF

Цитата
БМВ написал:
Масcивы то и дело заканчиваются
Цитата
БМВ написал:
ваш ХОП не соответствует теме

:D  :D  :D лол

Изменено: Jack Famous24.07.2018 15:24:17

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

«Лучшее» решение — использовать linq:

int[] numbers = new int[] { 13, 22, -5, 94, 66, -38, 41, -79, -1, 53 };
int[] firstminus = new int[1];
firstminus[0] = numbers.FirstOrDefault(n => n < 0);

Обновление — в ответ на комментарий Гилада Грина о производительности — отличный момент! Когда я запускаю следующее, я обнаруживаю, что цикл на моем боксе работает примерно на 1/2 секунды быстрее:

    static void Main(string[] args)
    {
        var stopWatch = new Stopwatch(); 
        Console.WriteLine("Linq method");
        stopWatch.Start();
        for (var i = 0; i < 10000000; i++)
        {
            LinqMethod(); 
        }
        stopWatch.Stop();
        Console.WriteLine($"Elapsed time: {stopWatch.Elapsed}");
        stopWatch.Reset();

        Console.WriteLine("Loop method");
        stopWatch.Start();
        for (var i = 0; i < 10000000; i++)
        {
            LoopMethod();
        }
        stopWatch.Stop();
        Console.WriteLine($"Elapsed time: {stopWatch.Elapsed}");

        Console.ReadLine();
    }

    private static void LinqMethod()
    {
        int[] numbers = new int[] { 13, 22, -5, 94, 66, -38, 41, -79, -1, 53 };
        int[] firstminus = new int[1];
        firstminus[0] = numbers.FirstOrDefault(n => n < 0);
    }

    private static void LoopMethod()
    {
        int[] numbers = new int[] { 13, 22, -5, 94, 66, -38, 41, -79, -1, 53 };
        int[] firstminus = new int[1];
        for (int i = 0; i < 10; i++)
        {
            if (numbers[i] < 0)
            {
                firstminus[0] = numbers[i];
                break; 
            }
        }
    }

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти реквизиты банка по номеру карты
  • Как найти человеко часы формула
  • Телегония как исправить
  • Как быстро найти клопов
  • Как найти площадь квадрата если известна окружность

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

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