Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одномерный массив нужно сдвинуть массив циклическ, помогите найти ошибку 
V
    Опции темы
an18
Дата 4.6.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.6.2009

Репутация: нет
Всего: нет



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.

Это сообщение отредактировал(а) an18 - 4.6.2009, 12:25
PM MAIL   Вверх
mes
Дата 4.6.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(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 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 4.6.2009, 12:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



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;
}


Это сообщение отредактировал(а) azesmcar - 4.6.2009, 12:43
PM   Вверх
an18
Дата 4.6.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.6.2009

Репутация: нет
Всего: нет



Спасибо за упрощение, но проблема не в этом. После удаления выбранного элемента массива и сдваги части массива на 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;
    }


Это сообщение отредактировал(а) an18 - 4.6.2009, 13:01
PM MAIL   Вверх
azesmcar
Дата 4.6.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



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

не заметил этого условия...а подробнее можно? что значит сдвинуть вправо? а в первый элемент что записать? 0? Ваша функция не совсем понятно что делает..зачем это
if ((arr[i] % 2)==0) нужно для сдвига вправо всего массива?
PM   Вверх
mrbrooks
Дата 4.6.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



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

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


PM MAIL   Вверх
azesmcar
Дата 4.6.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



mrbrooks

Цитата

#include <conio.h>

это похоже на ВС3.1, сомневаюсь что там есть алгоритмы. Плюс - это видимо домашнее задание, так что нужно изобретать велосипеды. smile 
PM   Вверх
mrbrooks
Дата 4.6.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



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

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

скорее кривые костыли  smile 
PM MAIL   Вверх
an18
Дата 4.6.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.6.2009

Репутация: нет
Всего: нет



На сколько я понял условие этой задачи, то нужно сдвинуть массив поэлементно на определённое количество элементов вправо. И если не сказано, что К это рандомное число, то значит его нужно вводить вручную.
 Нехотелось писать функцию, тем более что я в них ещё не очень понимаю.
PM MAIL   Вверх
mes
Дата 4.6.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

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

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




--------------------
PM MAIL WWW   Вверх
an18
Дата 4.6.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.6.2009

Репутация: нет
Всего: нет



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

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

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

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

собственно говоря, да
PM MAIL   Вверх
mes
Дата 4.6.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

а если воспользоваться поиском ?! попробую поискать за Вас  smile 
ну вот к примеру : http://forum.vingrad.ru/forum/topic-246005...25B0/index.html
 smile 

Это сообщение отредактировал(а) mes - 4.6.2009, 14:13


--------------------
PM MAIL WWW   Вверх
an18
  Дата 4.6.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.6.2009

Репутация: нет
Всего: нет



Спасибо за подсказку, эту и похожие темы о сдвиге я уже читал вчера, но ничего не понял.
Мне эту программу нужно доделать иначе могут исключть из ВУЗа 8-(
PM MAIL   Вверх
mes
Дата 4.6.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

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

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

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



Это сообщение отредактировал(а) mes - 4.6.2009, 15:18


--------------------
PM MAIL WWW   Вверх
an18
Дата 4.6.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.6.2009

Репутация: нет
Всего: нет



вот уже кое что получается, вот только элементы перенесённые в начало массива становятся -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;

}






Это сообщение отредактировал(а) an18 - 4.6.2009, 16:00
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1232 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.