Поиск элементов массива

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Sneg@
Сообщения: 4
Зарегистрирован: 29 май 2014, 03:01

Ребята,помогите,пожалуйста,бедному студенту,нужно написать программу поиска первого и последнего подходящих элементов массива.Я только учусь программированию и не понимаю как это написать(((((((((((((
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Что значит подходящих? Можно более точную формулировку задания?

По поводу самостоятельной реализации задачи. Что именно не получается? Циклы изучал? Условия изучал? Массивы изучал? "Только учусь программированию и не понимаю, как это писать" - это вовсе не отмазки и не повод для того, чтобы не открыть методичку и не прочитать две страницы элементарного текста. Сделай это и затем приходи с уточнённым заданием, и будем выяснять, как это написать.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Sneg@
Сообщения: 4
Зарегистрирован: 29 май 2014, 03:01

Мне нужно найти первый или последний подходящий(например,положительный)элементы массива.Все изучал,и циклы и условия,и методичка сейчас передо мной лежит,а как написать ее(Эту программу) именно в Си я не понимаю
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ага, то есть проблема в том, как алгоритмически определить первый и последний элемент, верно? Хорошо, давай подумаем над твоей проблемой. Примеры кода буду приводить на выдуманном алгоритмическом языке, чтобы не давать готового решения. Всё ради тебя, чтобы ты учился, а не бездумного копировал код и предъявлял преподавателю.

Смотри, если мы пойдём в лобовую и напишем первое, что нам придёт в голову:

Код: Выделить всё

   ТипЭлементаМассива Значение;
   Цикл (по массиву)
   {
      Если (какое-то условие) To
      {
         Значение = ТекущийЭлементМассива;
      }
   }
   Напечатать "Значение =", Значение;
То в этом случае условие, котороые проверяется в условном операторе, будет отрабатывать для каждого элемента массива и, если у нас есть несколько элементов массива, которые удовлетворяют этому условию, присвоение будет вызываться для каждого из них, и каждый раз переменная Значение будет перетираться. Поэтому после окончания цикла в переменной Значение у нас будет сохранёно значение последнего элемента массива, удовлетворяющего условию. И так, половина дела сделана - последний элемент определён.

Теперь вопрос в том, как определить первый. Очевидно, что нам нужно разрешить первое присваивание в цикле, но запретить все последующие. То есть нам нужна отдельная переменная, которая будет помнить о том, происходило ли уже присваивание или нет. Для этих целей идеально подходит тип bool из C++, который может принимать лишь два значения true (истина) или false (ложь). Положим true - присваивание уже выполнялось, false - ещё не выполнялось. Модифицируем наш код.

Код: Выделить всё

   bool УсловиеВыполнено = false;
   ТипЭлементаМассива ПерыйЭлемент, ПоследнийЭлемент;
   Цикл (по массиву)
   {
      Если (какое-то условие)
      {
         Если (не УсловиеВыполнено)
         {
            ПервыйЭлемент = ТекущийЭлементМассива;
            УсловиеВыполнено = true;
         }
         ПоследнийЭлемент = ТекущийЭлементМассива;
      }
   }

   Если (УсловиеВыполнено)
   {
      Напечатать "Первый элемент = ", ПервыйЭлемент;
      Напечатать "Последний элемент = ", ПоследнийЭлемент;
   }
   Иначе
   {
      Напечатать "Условие не выполнено ни для одного элемента массива";
   }
Давай проанализируем, что получилось. Когда условие выполнится первый раз, то переменная УсловиеВыполнено у нас ещё false, поэтому выражение (не УсловиеВыполнено) у нас будет true, поэтому мы зайдём внутрь уловия и поместим значение в ПервыйЭлемент. Затем переменная-флажок УсловиеВыполнено будет высталвена в true, так что все последующие разы мы перетирать значение переменной ПервыйЭлемент не будем. Переменная же ПоследнийЭлемент будет, как и в первом примере, присваиваться бузусловно, так что после окончания работы цикла действительно будет хранить последний элемент массива, удовлетворяющий нашему условию. В общем, всё очень похоже на правду.

Пробуй реализовать предоставленный алгоритм и задавай вопросы, если что-то не будет получаться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Вместо того, чтобы постоянно присваивать значение переменной, которое там и так есть - можно выполнить оптимизацию и не тратить лишнее процессорное время:

Код: Выделить всё

        Если (какое-то условие)
         {
              Если (не УсловиеВыполнено)
              {
                  ПервыйЭлемент = ТекущийЭлементМассива;
                  УсловиеВыполнено = true;
              }
              Последний = ТекущийЭлементМассива;
         }
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да, это я уже поправил. Ещё до того, как увидел твоё сообщение :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Sneg@
Сообщения: 4
Зарегистрирован: 29 май 2014, 03:01

Спасибо вам большое,я разобралась,построила алгоритм,проверила,вроде все работает)))
Ответить