Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2011, 23:55   #1
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию Массив. Удаление элементов.

В общем задание:
Дан массив допустим: 1,2,3,4,5,6,7,8,9
Сначала удаляются все элемента которые имеют четный индекс, потом те которые имеют нечетный индекс, и так пока не останется один элемент.
То есть, в результате преобразования нашей строки получим.
Строка:
1 2 3 4 5 6 7 8 9
Удаляем элементы с четными индексами
1 2 3 4 5 6 7 8 9
Получаем
1 3 5 7 9
Теперь удаляем те у которых индекс нечетный
1 3 5 7 9
Получаем
3 7
Теперь с четным индексом
3 7
Остается 3
Ответ 3

Пока разобрался только с удалением конкретного эл-та и сдвигом массива
Вот набросал:

Код:
program pr1;
uses crt;
const MaxN = 1000;
Var
A : Array [1..MaxN] Of Integer;
N : integer;
I : Integer;
begin
  repeat
    Write('N=');
    Readln(N);
    if (N<1) or (N>MaxN)  then
        WriteLn('ERROR !!!');
  until (N>=1) and (N<=MaxN);

  for i:=1 to N do
  read (a[i]);
  for i:=1 to N do
  write (a[i]);
  writeln;
  // sortirovka//
  for i:=1 to N-1 do
  A[i] := A[i+1];
  N:=N-1;
  
  writeln ('posle sortirovki');
  for i:=1 to n do
  write (a[i]);
  
  end.
Но не знаю ка циклом задать удаление эл-тов с четным/нечетным индексом. Ведь их может быть и 100+
iCaesy вне форума Ответить с цитированием
Старый 23.10.2011, 03:26   #2
Lasur
Форумчанин
 
Аватар для Lasur
 
Регистрация: 13.10.2011
Сообщений: 143
По умолчанию

Обязательно нужна программа, выполняющая алгоритм, или нужен ответ?

Тут, явно прослеживается определенная периодичность в ответе:
1 1 3 3 11 11 43 43, то есть если считать элементы массива с единицы, через каждые два, следующий равен 4 * предыдущий - 1. Это можно доказать, если нужно, а с формулой работать уже проще для получения ответа.

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

Последний раз редактировалось Lasur; 23.10.2011 в 03:38.
Lasur вне форума Ответить с цитированием
Старый 23.10.2011, 09:09   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а попробуйте так:
Код:
program pr1;
uses crt;
const MaxN = 1000;

Var
A      : Array [1..MaxN] Of Integer;
N      : integer;
i,j,K  : Integer;
Pass   : integer;
begin
  repeat
    Write('N=');
    Readln(N);
    if (N<1) or (N>MaxN)  then
        WriteLn('ERROR !!!');
  until (N>=1) and (N<=MaxN);

  for i:=1 to N do
    {read (a[i]);} a[i] := i;
  for i:=1 to N do
    write (a[i],' ');
  writeln;

  Pass := 0;
  while N > 1 do begin
    inc(Pass);
    Write('Проход ',Pass,' удаляем ');
    if odd(Pass) then Writeln('чётные') else Writeln('нечётные');

    K := 0; {количество удалённых записей}
    for i:=N downto 1 do begin
       if odd(Pass) then begin {нечётный проход - первый/третий и т.д.}
         if not odd(i)
           then begin
             for j:= i to N-K do a[i] := a[i+1];
             inc(K);
           end;
       end
       else  {чётный проход}
         if odd(i)
           then begin
             for j:= i to N-K do a[i] := a[i+1];
             inc(K);
           end;

       end;
       Dec(N, K);

       {выведем на экран очередной массив
           после удаления элементов}
       for i:=1 to N do write (a[i],' ');
       writeln;
  end;


  WriteLn;
  writeln ('posle sortirovki');
  for i:=1 to n do
    write (a[i]);
  WriteLn;
  readln

end.
p.s. отладочные сообщения в цикле можно, разумеется, убрать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.10.2011, 11:06   #4
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Вроде работает но во 1м проходе какая то ошибка. Вот скрин
http://savepic.su/447013.jpg

То есть ввели N=5 строка 1 2 3 4 5
удаляем четные то есть 2 4
должны получить строку 1 3 5 а получаем 1 3 3
Но ответ как то верный получается =))

При вводе n=10 уже не правильно считает... Ищу ошибочку.

Последний раз редактировалось Stilet; 23.10.2011 в 12:55.
iCaesy вне форума Ответить с цитированием
Старый 23.10.2011, 13:45   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

А! Позор на мою голову!
в моём коде выше ОШИБКА!
Просто случайно она не сильно проявлялась.
цикл сдвига то J - а я там случайно i написал...
Код:
if odd(Pass) then begin {нечётный проход - первый/третий и т.д.}
         if not odd(i)
           then begin
             for j:= i to N-K do a[j] := a[j+1];
             inc(K);
           end;
       end
       else  {чётный проход}
         if odd(i)
           then begin
             for j:= i to N-K do a[j] := a[j+1];
             inc(K);
           end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.10.2011, 13:48   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Хе. забавненькая задачка... решение на C++ имеет некоторые особенности, связанные с тем, что функтуры в stl-алгоритмы передаются по значению. в итоге пришлось немного извратиться(:

Код:
#include <iostream>
#include <locale>

#include <algorithm>

struct Z
{
	Z(size_t* index, unsigned flag) : flag_(flag), index_(index){}

	template <typename T>
	bool operator()(T) const
	{
		return ((*index_)++ & 1) == flag_;
	}

	unsigned flag_;
	size_t* index_;
};

template <typename Iter>
Iter remove(Iter begin, Iter end, int flag)
{
	for(size_t index = 0; std::distance(begin, end = std::remove_if(begin, end, Z(&index, flag))) != 1; flag ^= 1, index = 0);
	return begin;
}

int main()
{
	setlocale(LC_ALL, "");
	
	int arr[] = {1,2,3,4,5,6,7,8,9};
	std::cout << *remove(arr, arr + sizeof(arr) / sizeof(arr[0]), 1) << std::endl;

	return 0;
}
Вывод прораммы: http://codepad.org/MlQhuqtx

Последний раз редактировалось Rififi; 23.10.2011 в 13:50.
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление элементов ensoleille Помощь студентам 4 16.01.2011 23:27
Записать в массив Z подряд семь нулевых элементов массива R,состоящего из N элементов.(Язык QBasic) Лиза) Помощь студентам 0 11.01.2011 16:02
Одномерный массив. Q basic - Построить новый массив из элементов исходного ,которые больше P. Marishkaa Помощь студентам 2 12.01.2010 16:54
массивы. удаление элементов Ananim-Pbl6ak Паскаль, Turbo Pascal, PascalABC.NET 25 09.06.2009 11:07
Дан массив из N элементов (чисел),определить количество элементов кратных 3. Woha Общие вопросы C/C++ 2 08.12.2008 13:12