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

Нужно вывести последний отрицательный элемент массива и после заменить его на его же индекс.

Если последний отрицательный элемент -2 по индексу 5, то вывести сначала -2 и после заменить значение на 5.

#include <stdio.h> 
#include <iostream>
#include <math.h>
#include "stdafx.h"

int Y[5];
int X[5];
int i;

int main(void)
{
    printf("zapolnite massiv n");
    for (i = 0; i <= 5; i++)
    {
        scanf_s("%d", &X[i]);
    }
    printf("____________________");
    for (i = 0; i <= 5; i++)
    {
        if (X[i] < 0)
        {
            (Y[i] = X[i]);
            printf("n%d ", Y[i]);
        }
    }
    getchar();
    getchar();
    return 0;
}

задан 8 ноя 2018 в 19:10

fcukyuo's user avatar

1

Вот так вот:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
#include <ranges>
#include <algorithm>

int main() {
    std::string line;
    std::getline(std::cin, line);

    std::istringstream is{line};
    std::vector<int> arr{std::istream_iterator<int>{is}, std::istream_iterator<int>{}};

    const auto negative = [&arr](auto i) { return arr[i] < 0; };

    for (auto i : std::views::iota(decltype(arr)::size_type{}, arr.size())
                | std::views::filter(negative)
                | std::views::reverse
                | std::views::take(1)) {
        std::cout << "element: " << arr[i] << "; index: " << i << 'n';
        arr[i] = static_cast<int>(i);
    }

    std::copy(std::cbegin(arr), std::cend(arr), std::ostream_iterator<int>(std::cout, " "));
}

ответ дан 20 авг 2020 в 13:00

dIm0n's user avatar

dIm0ndIm0n

3772 золотых знака10 серебряных знаков39 бронзовых знаков

#include <stdio.h> 
#include <iostream>
#include <math.h>

int main()
{
    int X[5];
    int i;

    printf("zapolnite massiv n");
    for (i = 0; i < 5; i++)
    {
        scanf_s("%d", &X[i]);
    }

    printf("____________________");

    for (i = 5; i > 0; i--)
    {
        if (X[i] < 0)
        {
            printf("n%d ", X[i]);
            X[i] = i;
            break;
        }
    }

    printf("n____________________");

    for (i = 0; i < 5; i++)
    {
        printf("n%d ", X[i]);
    }

    getchar();
    return 0;
}

ответ дан 9 ноя 2018 в 1:51

Юрий's user avatar

ЮрийЮрий

2871 серебряный знак11 бронзовых знаков

Цитата
Сообщение от EzCoding
Посмотреть сообщение

Ну если убрать N- будет норм.

да и при N будет нормально, ошибки не будет, просто на экран выведется мусор, переменная то не инициализирована

Цитата
Сообщение от EzCoding
Посмотреть сообщение

Не понимаю зачем вы делаете проверку i>-1 если можно проверять i>=0;

этот код выполнит одно и тоже но при записи i>=0 возможен вариант что будут две проверки на больше и на равно
неизвестно как компилятор откомпилирует, оптимизирует или нет, на каком камне это будет исполнятся
а так я просто показал еще один путь решения
не люблю мыслить шаблонно

Цитата
Сообщение от EzCoding
Посмотреть сообщение

А если выводить вне цикла — лучше иметь счетчик отдельно и отдельно переменную вывода, счетчик может понадобится еще для каких то подзадач.

так если он не нужен снаружи объявляй его в цикле
да и счетчик это не приговор
можешь в одном цикле объявить i а в другом ii
почитай Криса Касперски «Техника отладки программ без исходных кодов» «Основы хакерства» и другие книги
и поймешь что получается в исполняемом коде, хороший оптимизатор может так перелопатить твою программу, что её никто не узнает

Цитата
Сообщение от Andrey027
Посмотреть сообщение

Помогите найти ошибку.

одну

Цитата
Сообщение от Andrey027
Посмотреть сообщение

Microsoft visual C++ 6.0

Цитата
Сообщение от Andrey027
Посмотреть сообщение

double a[5],

Цитата
Сообщение от Andrey027
Посмотреть сообщение

cout<<«Vvedite razmer massiva»;

зачем? он итак известен 5
а что будет, если я введу100

Цитата
Сообщение от Andrey027
Посмотреть сообщение

cout<<«nVvedite massiv:n»;
cin>>a[n];

выход за пределы массива

и где ввод всех элементов массива?

Цитата
Сообщение от Andrey027
Посмотреть сообщение

for(i=0;i<n;i++)
{
cout<<«nMassiva:n»<<a[i];
p*=a[i];
k++;
}

и где проверка на отрицательный элемент?
k будет равно n

Урок 23. Поиск элемента в массиве

Просмотров 3.1к. Обновлено 23 ноября 2020

Урок из серии: «Язык программирования Паскаль»

На этом уроке рассмотрим алгоритмы поиска элемента в одномерном массиве. Эти алгоритмы очень похожи на обработку последовательностей (поиск, выборка и т.д.).

Отличие заключается в том, что в массиве одновременно доступны все его компоненты. Такой доступ называется параллельным.

Рассмотрим несколько примеров.

Пример 1. Найти номера четных элементов.

Решение.

Для нахождения четных элементов необходимо просмотреть весь массив, и если будут попадаться четные элементы, то нужно выводить их на экран. Напишем процедуру, которая принимает в качестве входного параметра массив и выводит на экран нужные элементы.

Procedure Solve(m : myarray);
Var i: Integer;
Begin
   For i:=1 To n Do 
      If m[i] Mod 2 = 0 Then Write(i:5);{если элемент четный, то вывести на экран}
End;

Пример 2. Есть ли отрицательный элемент в массиве?

Решение.

Для решения таких задач удобнее использовать циклы с условиями и составлять функции, результат которых имеет логический тип.

Начинаем с первого элемента (i = 1).

Пока не просмотрен последний (i<=n) и не найден отрицательный (m [i]>=0), будем переходить к следующему (inc (i)).

Таким образом, мы закончим просмотр в одном из двух случаев:

  • первый — просмотрели все элементы и не нашли отрицательный, тогда i>n;
  • второй — нашли нужный, при этом i<=n.

Напишем функцию, значение которой истина (True), если такой элемент есть, и ложь (False), если его нет.

Function Controll (m: myarray): Boolean;
Var i : Integer;
Begin
   i := 1;
   While (i<=n) And (m[i]>0) Do Inc(i);
   Control1:=(i<=n)
End;

Пример 3. Найти номер последнего отрицательного элемента массива.

Решение.

Последний отрицательный — это первый отрицательный элемент, если начать просмотр с конца.

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

Таким образом, можно модифицировать предыдущую функцию. Но поскольку надо найти номер элемента, тип результата будем целым.

Договоримся, что если такого элемента нет, то значение функции будет равно 0.

Function Control2 (m: myarray): Integer;
Var i : Integer;
Begin
   i:=n;
   While (i>=1) And (m[i]>0) Do Des(i);
   If i<1 Then Control2:=0
          Else Control2:=i;
End;

Вы рассмотрели алгоритмы на поиск и выборку элементов в массиве.

На следующем уроке продолжим знакомиться с алгоритмами  обработки одномерных массивов.

const
    N = 13;
var
    c: Array[1..N] Of Integer;
    i, id: 0..N;
begin
    id := 0;
    for i := 1 to N do
    begin
        Write('c[', i, ']=');
        ReadLn(c[i]);
        if (c[i] < 0)
        then
            id := i;
    end;
    if (id > 0)
    then
        WriteLn('Hомер последнего отрицательного элемента ', id)
    else
        WriteLn('Не найдено отрицательных чисел!');
end.

I have a one-dimensional array in the C language. I enter the number of elements (n) and then I enter the elements themselves. I want to find the position and the value of the first positive element and of the last negative element. How can I do it? I was thinking about something like this, but there’s a semantic error and I’m stuck. I am just a beginner and I would really appreciate your help. Thank you in advance!

#include <stdio.h>

int main()
{
    int Array[100], i, n;

    printf("Enter n: ");
    scanf("%d", &n);

    printf("Enter %d elementsn", n);

    for (i = 0; i < n; i++)
    {
        printf("Enter number%d: ", i + 1);
        scanf("%d", &Array[i]);
    }

    for (i = 0; i < n; i++)
    {
        if (Array[i] > 0)
        {
            printf("The first positive element is %dn", Array[i]);
        }
    }

    for (i = 100; i < n; i--)
    {
        if (Array[i] < 0)
        {
            printf("The last negative element is %dn", Array[i]);
        }
    }
}

asked Oct 30, 2017 at 11:51

Joseph's user avatar

9

Test for first positive does not exit so you’ll get all of them.

Test for negative needs to start at n-1 not 100 and terminate after it has tested element 0. It, too, needs to break when it’s found one.

answered Oct 30, 2017 at 11:56

LoztInSpace's user avatar

LoztInSpaceLoztInSpace

5,5641 gold badge15 silver badges27 bronze badges

1

In the line:

 for (i=100; i<n; i--)

you should write

for (i=(n-1); i>=0; i--)

that way you start from the last inserted element until you reach 0, the beggining of your array.
Furthermore in your if’s you could use a break; command after your printf’s. That way when you meet an element with the required characteristics you exit your loop. If you don’t use break, you print every positive and negative element, not just the first you meet

answered Oct 30, 2017 at 11:58

Chatz's user avatar

ChatzChatz

564 bronze badges

2

Few problems:

  1. in your 2nd loop — you don’t break, meaning it will continue running (and printing!!) even after 1st positive was found
  2. in your 3rd loop — i = 100; i < n. Wrong! it should have been i = n-1; i >= 0 since the array is only 100 elements long. And also the same problem with no break as before
  3. INDENTATION!!!! (makes your code readable)
  4. What happens if n > 100 ? (hint: you will insert elements to memory you don’t own —> UB)

Here is a fixed version:

#include <stdio.h>

int main()
{
    int Array[100], i, n;
    printf("Enter n: ");
    scanf("%d", &n);
    if( n > 100)
    {
         printf("errorn");
         return 1;
    }
    printf("Enter %d elementsn", n);

    for(i=0; i<n; i++)
    {
        printf("Enter number%d: ",i+1);
        scanf("%d", &Array[i]);
    }
    for(i=0; i<n; i++)
    {
        if (Array[i]>0)
        {   
            printf("The first positive element is %dn", Array[i]);
            break;
        }
    }

    for (i=n-1; i>=0; i--)
    {
        if (Array[i]<0)
        {  
            printf("The first negative element is %dn", Array[i]); 
            break;
        }
    }
    return 0;
}

answered Oct 30, 2017 at 11:58

CIsForCookies's user avatar

CIsForCookiesCIsForCookies

11.9k10 gold badges58 silver badges121 bronze badges

1

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

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

  • Как найти детектор мини наборов
  • Как найти разбойников во время рейда
  • Найти как функцию расстояния от проводника
  • Как найти зажигание на скутере
  • Как найти конкретного человека в инстаграм

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

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