Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

одномерные массивы (C++)

4.7K
26 ноября 2007 года
bobik02
140 / / 11.09.2007
вот задали такую задачку:

Сгенерировать и вывести на экран одномерный массив: X{Xi} (i = 1,n где n =10 ) у диапазоне целых чисел [20;90] . Сформировать массив Z, который складывается с єлементов массива X , которые устравивают условию Xi > 40 . Упорядочить єлементы массива Z по возрастанию .


я полагаю что алгоритм должен работать так:
1.) Генерим массив X (в диапазоне от 20 до 90...)
2.) Записываем только те элементы с массива X в массив Z если выполняется условие ( X > 40 )
3.) Сортируем элемнты массива Z по возрастанию .

так вот с 1-м пунктом ясно, и 3м ясно, а со 2-м проблемы.

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

using namespace std;

const n = 10;

int main(int argc, char* argv[])
{
   clrscr();

   int arrayX[n];

  cout << "X : ";
  for ( int i = 0; i < n; i++ )
  {
    arrayX = random(70) + 20; // генерим массив у диапазоне от 20 до 90
    cout << arrayX << " " ;
  }

  getch();
  return 0;
}

как отсортировать массив я знаю, например пузырьком:
Код:
int tmp;
   for(int i = 0; i <= n-1; i++)
   {
      for( int j = 0; j <= n-2-i; j++)
      {
          if( array[j] > array[j+1] )
          {
              tmp = array[j];
              array[j] = array[j+1];
              array[j+1] = tmp;
          }
      }
  }


столкнулся с такой проблемой:
в задаче сказано что второй массив (Z): складывается с элементов массива X , которые устравивают условию Xi > 40

например сгенерило такой первый(X) массив:
{59, 54, 76 , 54, 72, 53, 46, 34 , 56, 71}
соовтествено с 10 элементов (n),
если брать єтот пример то по условию второй массив (Z) будет с 9-ти єлементов так как: мы выяснили что Xi > 40 , то берем все элементы, кроме 34.

значит и второй массив должен содержать 9ть элементов... (соответсвенно n-1 в данном случаи)
я думал решить это так:
Код:
...

   int count = 0;
   
   ....  в цыкле где мы генерим массив задаем такое условие
    if ( arrayX < 40 )
    {
      count++;
    }
   ..... оно подсчитает сколько нужно будет отминусовать от n

   а дальше хотел инициализировать массив Z:
   int arrayZ[n - count];

но компилятор не хочет меня слушатся и говорит такую ошибку:
[COLOR="Red"]E2313 Constant expression required in function main(int,char * *) [/COLOR]

в подскажите как побороть ?
1.9K
27 ноября 2007 года
max_dark
256 / / 11.11.2005
Для статического объявления массива требуется константная размерность, а n-count таковой не является

Против ошибки поможет только динамическое создание массива
 
Код:
int* arrayZ=new int[n-count]; // Не плохо было бы сделать проверку на (n - count > 0)

Не забываем очищать память после окончания работы с массивом
 
Код:
delete []arrayZ;

Но в данной задаче массив arrayZ можно сделать с размерностью равной размерности arrayX
 
Код:
const int n = 10;
int arrayX[n];
int arrayZ[n];
4.7K
27 ноября 2007 года
bobik02
140 / / 11.09.2007
Цитата: max_dark
Д
Но в данной задаче массив arrayZ можно сделать с размерностью равной размерности arrayX


а почему Вы так считаете ?

1.6K
27 ноября 2007 года
Shtirlitz
145 / / 31.07.2006
Потому что Z формируется из X так, что выбераются максимум все элементы мн-ва X. Не больше.
1.9K
27 ноября 2007 года
max_dark
256 / / 11.11.2005
!. В задаче явно не указано, что массив должен создавтся динамически.
2. Количество элементов arrayX превышающих 40 никогда не будет больше размерности массива. Здесь достаточно его(кол-во) запомнить : int num = n - count;
245
27 ноября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
создавать таким образом массив, имхо, крайне плохой стиль программирования.

лучше использовать динамическое выделение памяти под массив, как сказал max_dark, или, если планируется в процессе программы изменять размер массива, то, чтобы не мудрствовать лукаво, предлагаю использовать векторы из STL.
320
27 ноября 2007 года
m_Valery
1.0K / / 08.01.2007
~ArchimeD~, прав - используй vector,ты ж на С++ пишешь.Все рещение этой задачи умещается в десяток строк.
Код:
#include <iostream>
#include <ctime>
#include <vector>
#include <algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(0));
    unsigned int n = 10;
    vector<int> coll1,coll2;
    for(size_t i = 0;i < n;++i)
        coll1.push_back(rand() % 70 + 20);
    copy(coll1.begin(),coll1.end(),
        ostream_iterator<int>(cout," "));
    for(size_t i = 0;i < n;++i)
        if(coll1 > 40)
            coll2.push_back(coll1);
    cout<<endl;
    sort(coll2.begin(),coll2.end());
    copy(coll2.begin(),coll2.end(),
        ostream_iterator<int>(cout," "));
    cout<<endl;
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог