Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Одномерный массив нужно сдвинуть массив циклическ


Автор: an18 4.6.2009, 12:22
1)    Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2)    Распечатать полученный массив.
3)    Удалить первый элемент с заданным значением.
4)    Сдвинуть массив циклически на К элементов вправо.
5)    Распечатать полученный массив.

Код

#include <iostream.h> // оператор (заголовочный файл) для ввода-вывода значений
#include <conio.h>    
#include <stdlib.h>   // подключаемая библиотека для работы с массивами

const int n = 1000;

void main ()
{
  int arr[n];
  int arr_size;
  int i, j, num;

  cout << "Введите размер массива: ";
  cin >> arr_size;
  if (arr_size > n)
  {
    cout << "Слишком много элементов " << endl;
    return;
  }

  for (i = 0; i < arr_size; i++)
    arr[i] = rand()%100;

  cout << " Массив: " << endl;
  for (i = 0; i < arr_size; i++)
        cout << arr[i] << "  ";
  cout << endl;

  cout << "Введите номер элемента, который вы хотите удалить: ";
  cin >> num;
  for (i = 0; i < arr_size; i++)
    if (i == num-1)
    {
      for (j=i; j < arr_size; j++)
        arr[j] = arr[j+1];
      arr_size--;
      break;
    }
  for (i = 0; i < arr_size; i++)
    if ((arr[i] % 2)==0)
    {
      arr_size++;
      for (j=arr_size; j > i; j--)
        arr[j] = arr[j-1];
      arr[j+1] += 2;
      break;
    }
    cout << " Массив: " << endl;
    for (i = 0; i < arr_size; i++)
        cout << arr[i] << "  ";
    cout << endl;
}


Подскажите где тут ошибка в 4-ом действии, программа вместо  сдвига массива циклически прописывает в 4 элементе массива цифру 36.

Автор: mes 4.6.2009, 12:39
Цитата(an18 @  4.6.2009,  11:22 Найти цитируемый пост)
  for (i = 0; i < arr_size; i++)
    if ((arr[i] % 2)==0)
    {
      arr_size++;
      for (j=arr_size; j > i; j--)
        arr[j] = arr[j-1];
      arr[j+1] += 2;
      break;
    }

чего то этот блок сильно подозрительный  smile 

Автор: azesmcar 4.6.2009, 12:42
an18

А почему все так сложно?
Код

--arr_size;
for (i = num; i < arr_size; i++)
{
    arr[i] = arr[i + 1];
}

вот этого достаточно чтобы удалить и сместить элементы.
Код

#include <iostream.h> // оператор (заголовочный файл) для ввода-вывода значений
#include <conio.h>    
#include <stdlib.h>   // подключаемая библиотека для работы с массивами
const int n = 1000;
void main ()
{
    int arr[n];
    int arr_size;
    int i, j, num;
    cout << "Введите размер массива: ";
    cin >> arr_size;
    if (arr_size > n)
    {
        cout << "Слишком много элементов " << endl;
        return;
    }
    for (i = 0; i < arr_size; i++)
        arr[i] = rand()%100;
    cout << " Массив: " << endl;
    for (i = 0; i < arr_size; i++)
        cout << arr[i] << "  ";
    cout << endl;
    cout << "Введите номер элемента, который вы хотите удалить: ";
    cin >> num;
    --arr_size;
    for (i = num; i < arr_size; i++)
    {
        arr[i] = arr[i + 1];
    }
    cout << " Массив: " << endl;
    for (i = 0; i < arr_size; i++)
        cout << arr[i] << "  ";
    cout << endl;
}

Автор: an18 4.6.2009, 13:00
Спасибо за упрощение, но проблема не в этом. После удаления выбранного элемента массива и сдваги части массива на 1 пустую клетку влево нужно провести операцию сдвига всего массива циклически на К элементов вправо. Пробовал написать, но получилось только вот это:

Код

for (i = 0; i < arr_size; i++)
    if ((arr[i] % 2)==0)
    {
      arr_size++;
      for (j=arr_size; j > i; j--)
        arr[j] = arr[j-1];
      arr[j+1] += 2;
      break;
    }

Автор: azesmcar 4.6.2009, 13:03
Цитата(an18 @  4.6.2009,  12:22 Найти цитируемый пост)
4)    Сдвинуть массив циклически на К элементов вправо.

не заметил этого условия...а подробнее можно? что значит сдвинуть вправо? а в первый элемент что записать? 0? Ваша функция не совсем понятно что делает..зачем это
if ((arr[i] % 2)==0) нужно для сдвига вправо всего массива?

Автор: mrbrooks 4.6.2009, 13:07
я конечно дико извиняюсь - но если речь идет о С++ - возможно есть смысл заюзать алгоритм из STL std::rotate для

Цитата(an18 @  4.6.2009,  12:22 Найти цитируемый пост)
Сдвинуть массив циклически на К элементов вправо


Автор: azesmcar 4.6.2009, 13:09
mrbrooks

Цитата

#include <conio.h>

это похоже на ВС3.1, сомневаюсь что там есть алгоритмы. Плюс - это видимо домашнее задание, так что нужно изобретать велосипеды. smile 

Автор: mrbrooks 4.6.2009, 13:13
Цитата(azesmcar @  4.6.2009,  13:09 Найти цитируемый пост)
это похоже на ВС3.1

ужос. этого даже уже в музеях нет.
Цитата(azesmcar @  4.6.2009,  13:09 Найти цитируемый пост)
так что нужно изобретать велосипеды

скорее кривые костыли  smile 

Автор: an18 4.6.2009, 13:13
На сколько я понял условие этой задачи, то нужно сдвинуть массив поэлементно на определённое количество элементов вправо. И если не сказано, что К это рандомное число, то значит его нужно вводить вручную.
 Нехотелось писать функцию, тем более что я в них ещё не очень понимаю.

Автор: mes 4.6.2009, 13:48
Цитата(an18 @  4.6.2009,  12:13 Найти цитируемый пост)
На сколько я понял условие этой задачи, то нужно сдвинуть массив поэлементно на определённое количество элементов вправо.

Цитата(an18 @  4.6.2009,  11:22 Найти цитируемый пост)
Сдвинуть массив циклически на К элементов вправо.

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


Автор: an18 4.6.2009, 13:49
Да это стандартная задачка 1-го курса на массивы.
Подскажите как сделать функцию сдвига на определённое количество элементов вправо.
Нужно ведь создать переменную в которой будет храниться временное значение при поочерёдном переставлении элементов?

Добавлено через 1 минуту и 8 секунд
Цитата(mes @ 4.6.2009,  13:48)
Цитата(an18 @  4.6.2009,  12:13 Найти цитируемый пост)
На сколько я понял условие этой задачи, то нужно сдвинуть массив поэлементно на определённое количество элементов вправо.

Цитата(an18 @  4.6.2009,  11:22 Найти цитируемый пост)
Сдвинуть массив циклически на К элементов вправо.

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

собственно говоря, да

Автор: mes 4.6.2009, 14:12
Цитата(an18 @  4.6.2009,  12:49 Найти цитируемый пост)
Подскажите как сделать функцию сдвига на определённое количество элементов вправо.

а если воспользоваться поиском ?! попробую поискать за Вас  smile 
ну вот к примеру : http://forum.vingrad.ru/forum/topic-246005/unread-1/hl/%25D1%2586%25D0%25B8%25D0%25BA%25D0%25BB%25D0%25B8%25D1%2587%25D0%25B5%25D1%2581%25D0%25BA%25D0%25B8%25D0%25B9+%25D1%2581%25D0%25B4%25D0%25B2%25D0%25B8%25D0%25B3+%25D0%25BC%25D0%25B0%25D1%2581%25D1%2581%25D0%25B8%25D0%25B2%25D0%25B0/index.html
 smile 

Автор: an18 4.6.2009, 14:24
Спасибо за подсказку, эту и похожие темы о сдвиге я уже читал вчера, но ничего не понял.
Мне эту программу нужно доделать иначе могут исключть из ВУЗа 8-(

Автор: mes 4.6.2009, 14:49
Цитата(an18 @  4.6.2009,  11:22 Найти цитируемый пост)
Подскажите где тут ошибка в 4-ом действии, программа вместо  сдвига массива циклически прописывает в 4 элементе массива цифру 36.

напрашивается ответ "везде"; т.е  во всем 4м действии  smile 
а по поводу кода для циклического сдвига массива см. примеры из приведенной ссылки.. там их, имхо, более чем достаточно и достаточно простые.

Цитата(an18 @  4.6.2009,  13:24 Найти цитируемый пост)
Спасибо за подсказку, эту и похожие темы о сдвиге я уже читал вчера, но ничего не понял.

если  что то не понятно, так поставьте конкретный вопрос.


Автор: an18 4.6.2009, 15:57
вот уже кое что получается, вот только элементы перенесённые в начало массива становятся -858993460. Что нужно поправить, что бы значения сохранялись при переносе в начало?
Код

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

const int n = 1000;
void sdvig(int *,int &,int );

void main()
{
  int arr[n];
  int arr_size;
  int i, j, num;

  
  cout << "Введите размер массива: ";
  cin >> arr_size;
  if (arr_size > n)
  {
    cout << "Слишком много элементов" << endl;
    return;
  }

  for (i = 0; i < arr_size; i++)
    arr[i] = rand()%100;  //

  cout << " Ìàññèâ: " << endl;
  for (i = 0; i < arr_size; i++)
        cout << arr[i] << "  ";
  cout << endl;

  cout << "Введите номер элемента, который вы хотите удалить: ";
  cin >> num;
  for (i = 0; i < arr_size; i++)
    if (i == num-1)
    {
      for (j=i; j < arr_size; j++)
        arr[j] = arr[j+1];
      arr_size--;
      break;
    }
  
    cout << " Массив: " << endl;
    for (i = 0; i < arr_size; i++)
        cout << arr[i] << "  ";
    cout << endl;

    cout << "На сколько сдвинуть массив? Введите число: ";
   int how;
    cin >> how;


    //void sdvig(int *arr,int &num,int how)
{
   how%=n;
   while(how)
   {
       int tmp=arr[n-1];
        for(int i=n-1;i>0;i--)
        {arr[i]=arr[i-1];
        }
        arr[0]=tmp;
        how--;
   }
}

    cout << " Массив: " << endl;
    for (i = 0; i < arr_size; i++)
        cout << arr[i] << "  ";
    cout << endl;

}





Автор: mes 4.6.2009, 16:26
Цитата(an18 @  4.6.2009,  14:57 Найти цитируемый пост)
вот уже кое что получается, вот только элементы перенесённые в начало массива становятся -858993460. Что нужно поправить, что бы значения сохранялись при переносе в начало?

Если Вы в реализуете один пункт , зачем выкладывать всю прогу ? Чтоб отнять побольше времени у форумчан, на разглядывание абсолютно левого кода ?!
неужто трудно, выделить задачу, отработать ее и потом добавлять в проект, не отвлекаясь самому и не отвлекая других от сути?

Добавлено @ 16:32
Цитата(an18 @  4.6.2009,  14:57 Найти цитируемый пост)
{
   how%=n;
   while(how)
   {
       int tmp=arr[n-1];
        for(int i=n-1;i>0;i--)
        {arr[i]=arr[i-1];
        }
        arr[0]=tmp;
        how--;
   }

n - это у Вас максимальный размер массива. А размер "реального" массива arr_size. Из за путаницы этих двух переменных и происходит сдвиг всех 1000 элементов , а не тех что требуется.
В остальном эта часть кода вроде правильная.

Автор: an18 4.6.2009, 16:53
Спасибо, действительно после замены программа заработала как нужно.  smile 


Код

{
   how%=arr_size;
   while(how)
   {
       int tmp=arr[arr_size-1];
        for(int i=arr_size-1;i>0;i--)
        arr[i]=arr[i-1];
        arr[0]=tmp;
        how--;
   }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)