Как найти последний нулевой элемент массива

Как найти последний нулевой элемент в массиве?

Доброго времени суток! сижу пытаюсь решить задачку с массивами ( найти сред. ариф-кое всех положительных элементов массива после последнего нулевого массива.)
Возникла проблема с нахождением последнего нулевого элемента в массиве

for (i=30;i!=0;i--)
		{
			if (A[i]==0)
			{
				n1=i;
				n2=i;
				break;
		         }
		}

переменную n2 ввел для проверки, но она всегда равна 30
Подскажите что не так? хотелось бы намеками а не готовым решением.


  • Вопрос задан

    более трёх лет назад

  • 3206 просмотров

Надо искать с конца. (После последнего нулевого может вообще не быть элементов.)

for (i=30;i!=0;i--)

Если в массиве 30 элементов, то
for (i = 29; i >= 0; i--)

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

Пригласить эксперта

Используйте отладчик, если религия не запрещает…

сред. ариф-кое всех положительных элементов массива после последнего нулевого массива

У Вас двумерный массив что ли?

Вам нужно просто среднее арифметическое? Размер массива знаете? Если да – делаете 2 переменных: аккумулятор и счётчик, пробегаете по массиву и все элементы больше нуля добавляете в аккумулятор, а счётчик увеличиваете на 1, потом делите получившееся значение в аккумуляторе на значение в счётчике. Не забудьте про деление на 0.


  • Показать ещё
    Загружается…

17 мая 2023, в 05:16

1500 руб./в час

17 мая 2023, в 03:50

2000 руб./за проект

17 мая 2023, в 03:50

150000 руб./за проект

Минуточку внимания

0 / 0 / 0

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

Сообщений: 60

1

12.01.2012, 01:44. Показов 1919. Ответов 5


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

2. В массиве из N чисел найти последний нулевой элемент



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

12.01.2012, 01:44

5

ПавелКалашников

16 / 16 / 9

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

Сообщений: 77

Записей в блоге: 1

12.01.2012, 10:40

2

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
uses crt;
const n = 20;
var i, last : integer;
     a : array [1..n] of integer;
begin
  for i := 1 to n do  {ввод массива}
     read(a[i]);
  for i := 1 to n do      {пробегаемся по всему массиву}
    if (a[i] = 0) then     {если элемент равен 0, то } 
      last := i;             {считаем его последним}
  writeln(last); {вывод индекса последнего нуля}
  readkey;      {задержка экрана}
end.



0



0 / 0 / 0

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

Сообщений: 60

12.01.2012, 11:19

 [ТС]

3

а как найти номер первого нулевого элемента массива??



0



unick12345

1852 / 1174 / 190

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

Сообщений: 4,514

12.01.2012, 11:28

4

annuchka, первого или последнего?
если первого то

Pascal
1
2
3
4
j:=0;
for i:=1 to n do
if a[i]=0 then begin j:=i; break;end;
if j>0 then writeln(j) else writeln('нет такого');

и последнего

Pascal
1
2
3
4
j:=0;
for i:=1 to n do
if a[i]=0 then j:=i;
if j>0 then writeln(j) else writeln('нет такого');



0



0 / 0 / 0

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

Сообщений: 60

12.01.2012, 11:51

 [ТС]

5

для чего принудительно завершать цикл??



0



1852 / 1174 / 190

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

Сообщений: 4,514

12.01.2012, 12:00

6

annuchka, чтобы не использовать дополнительную переменную для определения что число уже было найдено и зря не проходить по всему массиву



0



При
поиске элементов, обладающих заданным
свойством, необязательно просматривать
все элементы массива. Например, требуется
определить, есть ли в массиве хотя бы
один нулевой элемент. Для ответа на этот
вопрос, достаточно в цикле просматривать
элементы массива до тех пор, пока не
закончится массив или не встретится
равный нулю элемент. Если, например, уже
третий элемент равен нулю, то остальные
элементы просматривать нет необходимости.
В таких случаях для просмотра массива
обычно используется оператор цикла
while со сложным условием. Графическая
схема для рассматриваемого примера
изображена на рисунке 10.15. После цикла
достаточно проверить, чему равно i. Если
окажется, что i=n, т.е. были просмотрены
все элементы, то в массиве нет нулевых
элементов.

i=0;

while(i<n
&& a[i]!=0) i=i+1;

If(i
== n)

puts(“В
массиве нет нулевых элементов”);

else

puts(“В
массиве есть нулевой элемент”);

Рис.
10.15. Графическая схема и фрагмент
программы поиска

нулевого
элемента в массиве

Встречаются
задачи, в которых требуется не только
определить, есть ли элемент, обладающим
заданным свойством в массиве, но и номер
(индекс) такого элемента. Например, найти
максимальный элемент в части массива,
находящейся после последнего нуля.
Решение задачи следует начать с вычисления
индекса последнего нулевого элемента.
Для определения индекса самого правого
элемента, обладающего заданным свойством,
массив следует просматривать с конца
до тех пор, пока не закончатся элементы
и текущий элемент не равен нулю (рисунок
10.16).

i=n–1;

while(i>=0
&& a[i]!=0) i=i–1;

If(i<0)

puts(“В
массиве нет нулевых элементов”);

else

printf(“Индекс
последнего нуля – %d n”, i);

Рис.
10.16. Графическая схема и фрагмент
программы поиска

номера
последнего нулевого элемента в массиве

Номер
(индекс) первого встретившегося нулевого
элемента можно узнать по значению
параметра цикла i. Этот номер можно
использовать в дальнейших вычислениях
например как номер начального элемента
для поиска максимума.

1.4.15. Поиск в упорядоченном массиве

Упорядоченность
элементов массива позволяет значительно
увеличить скорость его обработки, за
счет снижения числа проверяемых элементов
массива. В таких алгоритмах массив
проверяется пока выполняется (или не
выполняется) дополнительное условие,
определяющее досрочный выход из цикла.
Также при составлении алгоритма
необходимо учитывать возрастающим или
убывающим является проверяемый массив,
что оказывает влияние на то, как удобнее
обрабатывать массив с начала или с
конца. В общем случае алгоритм обработки
упорядоченного массива имеет следующий
вид – рис. 10.17.

Рис.
10.17. Графический алгоритм обработки

упорядоченного
массива с перебором с начала (а), с
конца (б)

Как
видно из блок–схемы, дополнительное
условие управляет досрочным выходом
из цикла. Пока дополнительное условие
истина и не конец массива i<ik цикл
выполняется, как только одно из условий
будет не выполнено происходит выход из
цикла.

Пример
10.17

В
возрастающем одномерном массиве X с
количеством элементов n, определить
есть ли число, равное A, и на какой позиции
оно находится, если числа A нет, определить
место, на котором оно должно находиться,
чтобы не нарушить упорядоченность
массива.

Решение

В
данной задаче обработку массива будем
проводить с начала. Выход из цикла по
дополнительному условию будет выполнен,
если в массиве найден элемент больший
либо равный A (k=1). Для индикации наличия
в массиве элемента равного A, введем
вспомогательную переменную f с начальным
значением f=0. При обнаружении элемента
A, переменная f=1. Для определения номера
позиции числа A в массиве введем
дополнительную переменную poz с начальным
значением n, т.е. предполагая, что все
элементы массива меньше A. При обнаружении
в массиве числа большего или равного A
в переменной poz сохраняется его индекс
– i. После выхода из цикла, по значению
переменной f определяется наличие и
место переменной A в массиве. Описанный
алгоритм поиска и программа представлены
на рис. 10.18.

#include
<stdio.h>

main()

{

int
f, k, n, poz, i, x[100], a;

puts(“Введите
число элементов массива:”);

scanf(“%d”,&n);

for(i=0;i<n;i++)

{

printf(“x[%2d]=”,i);

scanf(“%d”,&x[i]);

}

puts(“Введите
число
a:”);

scanf(“%d”,&a);

f=0;
poz=n; k=0;

for(i=0;i<n&&k==0;i++)

{

if(x[i]>a)
{ poz=i;k=1;}

else

{

if(x[i]==a)

{poz=i;
f=1; k=1;}

}

}

if(f==1)

printf(“В
массиве есть число =%d, на позиции-%dn”,
a, poz);

else

printf(“Число
%d должно находиться на позиции-%dn”
,a, poz);

for(i=0;i<n;i++)

printf(“x[%d]=%dn”,i,x[i]);

return
0;

}

Рис.
10.18. Графический алгоритм и программа
для примера 10.17

Используемые
переменные:

n
– число элементов массива;

a[]
– статический массив;

k
– переменная для досрочного выхода из
цикла при нахождении элемента большего
или равного a;

f
– вспомогательная переменная для
индикации наличия в массиве числа
равного a;

poz
– номер элемента массива на котором
должно находится число a;

i
– параметр цикла;

Описанный
алгоритм можно дополнить предварительным
сравнением последнего элемента массива
X[n-1] с числом A, если X[n-1]=A – то заданное
число находится на последнем месте, а
в случаe выполнения X[n-1]>A – то, число
A должно находится в массиве на позиции
n. Если ни одно из этих условий не
выполнено, то это означает, что необходимо
выполнить поиск числа A в массиве.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
 

eugene.v

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

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

См. файл. Поиск первого элемента есть (4 разных способа). Подскажите, как найти последнее ненулевое значение (для тех способов, для которых это возможно).

 

MCH

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

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

Формулы массива  
=ПРОСМОТР(9E+307;ЕСЛИ(B3:B15<>0;B3:B15))  
=ИНДЕКС(C3:C15;МАКС(ЕСЛИ(C3:C15<>0;СТРОКА(C3:C15)-2)))

 

kim

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

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

Игорь

Или:  
=ПРОСМОТР(9E+307;1/E3:E15;E3:E15)

 

kim

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

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

Игорь

Вернее огромное число там искать и не нужно 🙂  
=ПРОСМОТР(2;1/E3:E15;E3:E15)

 

Владимир

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

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

А ЧТО ЗНАЧИТ 2 В =ПРОСМОТРЕ()?

“..Сладку ягоду рвали вместе, горьку ягоду я одна.”

 

kim

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

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

Игорь

2 – это гарантированно большее число наибольшего числа в просматриваемом массиве  
Вот такой каламбурчик 🙂

 

MCH

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

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

{quote}{login=kim}{date=14.11.2010 04:54}{thema=}{post}Вернее огромное число там искать и не нужно 🙂  
=ПРОСМОТР(2;1/E3:E15;E3:E15){/post}{/quote}  
красивая формула, но лучше все таки 9E+307, вдруг есть числа меньше 0,5, тогда формула их не найдет

 

kim

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

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

Игорь

{quote}{login=MCH}{date=14.11.2010 05:00}{thema=Re: }{post}{quote}{login=kim}{date=14.11.2010 04:54}{thema=}{post}Вернее огромное число там искать и не нужно 🙂  
=ПРОСМОТР(2;1/E3:E15;E3:E15){/post}{/quote}  
красивая формула, но лучше все таки 9E+307, вдруг есть числа меньше 0,5, тогда формула их не найдет{/post}{/quote}  
Ну значит на этом и порешили 🙂

 

{quote}{login=kim}{date=14.11.2010 04:50}{thema=}{post}Или:  
=ПРОСМОТР(9E+307;1/E3:E15;E3:E15){/post}{/quote}  
Вариант:  
=1/ПРОСМОТР(9E+307;1/E3:E15)

 

Владимир

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

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

{quote}{login=kim}{date=14.11.2010 04:59}{thema=}{post}2 – это гарантированно большее число наибольшего числа в просматриваемом массиве  
Вот такой каламбурчик :){/post}{/quote}  

  А что тогда будет обозначать 3? ..или 1?

“..Сладку ягоду рвали вместе, горьку ягоду я одна.”

 

kim

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

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

Игорь

Владимир, я чуть неправильно написал:  
это меньшее из чисел, гарантированно больших, наибольшего числа в просматриваемом массиве. Скорее всего это будет 1E+16

 

kim

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

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

Игорь

Для 1 можно:  
=ПРОСМОТР(1;0/E3:E15;E3:E15)  
Дима, симпатичный вариант 🙂

 

eugene.v

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

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

{quote}{login=kim}{date=14.11.2010 06:04}{thema=}{post}Для 1 можно:  
=ПРОСМОТР(1;0/E3:E15;E3:E15)  
Дима, симпатичный вариант :){/post}{/quote}  

  И все равно не пойму, как “ПРОСМОТР” в данной формуле ищет последнее ненулевое значение в просматриваемом векторе E3:E15, а не наиболее близкое к 1 в результате деления ноля на вектор E3:E15?

 

{quote}{login=eugene.v}{date=14.11.2010 06:16}{thema=Re: }{post}  
И все равно не пойму, как “ПРОСМОТР” в данной формуле ищет последнее ненулевое значение в просматриваемом векторе E3:E15, а не наиболее близкое к 1 в результате деления ноля на вектор E3:E15?{/post}{/quote}  
в результате деления ноля на вектор E3:E15 получается массив:  
{#ДЕЛ/0!:#ДЕЛ/0!:#ДЕЛ/0!:#ДЕЛ/0!:#ДЕЛ/0!:0:#ДЕЛ/0!:0:#ДЕЛ/0!:#ДЕЛ/0!:0:#ДЕЛ/0!:#ДЕЛ/0!}  
соответственно ПРОСМОТР ищет последний ноль, в данном случае – 11 позиция, и подставляет значение из вектора E3:E15.  
вместо 1 может быть любое число больше нуля

 

kim

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

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

Игорь

#16

14.11.2010 18:37:41

Ну наверное главное не чей вариант, а возможность его запомнить и правильно применять. В профессионализме ZVI нет никаких сомнений 🙂  
Ну все ребята, дальше без меня, поеду на недельку поближе к KL съезжу.  
Всем удачи и терпения, счастливо!

Добавить комментарий