Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 37
1

Преобразовать массив

30.07.2012, 15:16. Просмотров 1310. Ответов 13
Метки нет (Все метки)

Преобразуйте массив переставив все элементы все нулевые элементы в в конец массива
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 15:16
Ответы с готовыми решениями:

Массив: Преобразовать массив, прибавив к четным числам, входящим в массив, значение первого элемента.
Есть задача С клавиатуры вводятся элементы целочисленного массива размера N. Преобразовать его,...

Задан массив из k символов. Преобразовать массив следующим образом: расположить символы в обратном порядке
Задан массив из k символов. Преобразовать массив следующим образом: расположить символы в обратном...

Массив: Преобразовать массив таким образом, чтобы сначала располагались все элементы > 0, а потом < 0...
Преобразовать одномерный целочисленный массив таким образом, чтобы сначала располагались все...

Как преобразовать массив в динамический? Массив вычисляет сумму элементов каждой диагонали матрицы
Ошибка : Вызвано исключение по адресу 0x00BB2F4F в Проект6.exe: 0xC0000005: нарушение прав доступа...

13
193 / 173 / 30
Регистрация: 10.07.2012
Сообщений: 799
30.07.2012, 17:11 2
очень тупая (с точки зрения возможности для оптимизации) задача...
C++
1
2
3
4
5
int a[размерчик];
for(int i=0; i < размерчик; i++)
if(a[i] == 0)
for(int j=i; j < размерчик; j++)
swap(a[i], a[j]);
1
Заблокирован
Автор FAQ
30.07.2012, 17:27 3
Цитата Сообщение от AZIZBEK Посмотреть сообщение
Преобразуйте массив переставив все элементы все нулевые элементы в в конец массива
- вот на плюсах
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
using namespace std;
 
//Простая функция для печати элементов
//одномерного массива
void Show(int * arr, int m)
{
    for(int i = 0; i < m; i++)
        cout<<arr[i]<<" ";
    cout<<endl;
}
 
int main()
{
    int i, j;//Счётчики
    //Задаём наш массив(я не стал вводить ввод)
    int arr[] = {-5,6,0,15,-3,0,12,145,0,0};
    //Получаем число элементов массива
    int m = sizeof(arr)/sizeof(arr[0]);
    //Печатаем исходный массив
    Show(arr, m);
    cout<<"Step of transforming\n";
    for(j = (i = 0); i < m - j; i++)
    {
        if(arr[i] == 0)
        {
            //Может произойти ситуация
            //когда i-ый от конца элемент также будет
            //нулевым поэтому должны выйти на первый
            //ненулевой элмент для обмена
            while(arr[m - 1 - j] == 0 && j < i)
                j = j + 1;
            //Простой обмен без буфферной переменной
            arr[i] = arr[i] + arr[m - 1 - j];
            arr[m - 1 - j] = arr[i] - arr[m - 1 - j];
            arr[i] = arr[i] - arr[m - 1 - j];
            //Печать промежуточного массива
            Show(arr, m);
            j = j + 1;
        }
    }
    //Печатаем преобразованный массив
    cout<<"Transformed array\n";
    Show(arr, m);
    return 0;
}
Проверка алгоритма http://liveworkspace.org/code/... dc64f2a278
Отработка на скрине
1
Миниатюры
Преобразовать массив  
Заблокирован
Автор FAQ
30.07.2012, 17:28 4
Цитата Сообщение от salam Посмотреть сообщение
очень тупая (с точки зрения возможности для оптимизации) задача...
C++
1
2
3
4
5
int a[размерчик];
for(int i=0; i < размерчик; i++)
if(a[i] == 0)
for(int j=i; j < размерчик; j++)
swap(a[i], a[j]);
- Крайне неверное по своей сути решение (т.к. вконце массива также могут быть нули и обенивая i и j поменяем между собой два нуля)
0
193 / 173 / 30
Регистрация: 10.07.2012
Сообщений: 799
30.07.2012, 17:30 5
крайне неверно полагать, что кто-то этого не понял и не намекнул об этом фразой
Цитата Сообщение от salam Посмотреть сообщение
очень тупая (с точки зрения возможности для оптимизации) задача...
0
Заблокирован
Автор FAQ
30.07.2012, 17:37 6
Цитата Сообщение от salam Посмотреть сообщение
крайне неверно полагать, что кто-то этого не понял и не намекнул об этом фразой
- вот посмотри что ты посоветовал
http://liveworkspace.org/code/... 486a6198d2
Ничего ты не понял, потому как хотя бы при обмене надо уменьшать число доступных элементов сзади, вобщем не хочу спорить просто указал на твой недочёт и просто это надо принять а не ершиться...
0
Эксперт С++
340 / 304 / 36
Регистрация: 16.06.2009
Сообщений: 486
30.07.2012, 17:41 7
AZIZBEK,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
 
int main() {
   std::vector <int> v_numbers = { -5, 6, 0, 15, -3, 0, 12, 145, 0, 0 };
 
   std::partition(
      v_numbers.begin(),
      v_numbers.end(),
      std::bind(
         std::not_equal_to <int>(),
         std::placeholders::_1,
         0
      )
   );
   
   std::copy(
      v_numbers.begin(),
      v_numbers.end(),
      std::ostream_iterator <int>(std::cout, " ")
   );
}
http://liveworkspace.org/code/... 1914c015e4
0
Эксперт С++
4251 / 2225 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.07.2012, 18:32 8
Данную задачу легко решить с помощью алгоритма сложностью <= n. Но для любителей рекурсии вот такой вариант (тоже сложность <= n):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
 
int *First(int *beg, int *end)
{
   return (beg < end && *beg) ? First(beg + 1, end) : beg;
}
int *Last(int *beg, int *end)
{
   return (beg < end && !(*end)) ? Last(beg, end - 1) : end;
}
 
void Transform(int *beg, int *end)
{
   beg = First(beg, end);
   end = Last(beg, end);
   if (beg < end)
   {
       *beg ^= *end; *end ^= *beg; *beg ^= *end;
       Transform(beg + 1, end - 1);
   }
}
 
void Print(int *a, int *end)
{
   if (a < end)
   {
       printf("%d ", *a);
       Print(a + 1, end);
   }
}
int main()
{
   int n, a[] = {1, 0, 2, 0, 3};
   n = sizeof(a)/sizeof(*a);
   Print(a, a + n);
   puts("\n");
   Transform(a, a + n - 1);
   Print(a, a + n);
   return 0;
}
1
8 / 8 / 1
Регистрация: 01.07.2012
Сообщений: 138
30.07.2012, 18:37 9
Если a - это исходный массив, то задача решается и так:
C++
1
fill(remove_if(a, a + sizeof(a) / sizeof(a[0]), [=] (int x) {return x == 0;}), a + sizeof(a) / sizeof(a[0]), 0);
0
Thinker
30.07.2012, 18:40
  #10

Не по теме:

ramybozy, а можно целиком программу

0
8 / 8 / 1
Регистрация: 01.07.2012
Сообщений: 138
30.07.2012, 20:19 11
А что там целиком. Вот вся простенькая программа из для консольного проекта VS2010

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include <iostream>
#include <iterator>
#include <algorithm>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1, 2, 0, 3, 0, 7, 8, 0, 1};
    copy(a, a + sizeof(a) / sizeof(a[0]), ostream_iterator<int>(cout, " "));
    cout << endl;
    fill(remove_if(a, a + sizeof(a) / sizeof(a[0]), [=] (int x) {return x == 0;}), a + sizeof(a) / sizeof(a[0]), 0);
    copy(a, a + sizeof(a) / sizeof(a[0]), ostream_iterator<int>(cout, " "));
    cout << endl;
    return 0;
}
0
Thinker
30.07.2012, 20:35
  #12

Не по теме:

а, вы так. я просто думал вы что-то свое (новое) придумали

0
ramybozy
30.07.2012, 20:57
  #13

Не по теме:

Цитата Сообщение от Thinker Посмотреть сообщение
Не по теме:
а, вы так. я просто думал вы что-то свое (новое) придумали
А это вообще возможно?

0
Thinker
30.07.2012, 21:07     Преобразовать массив
  #14

Не по теме:

в смысле свои функции

0
30.07.2012, 21:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 21:07
Привет! Вот еще темы с ответами:

Дан целочисленный массив размера N. Преобразовать массив, увеличив каждую его серию на один элемент
1. Дан целочисленный массив размера N. Преобразовать массив, увеличив каждую его серию на один...

Дан целочисленный массив размера N. Преобразовать массив, увеличив каждую его серию на один элемент
Помогите преобразовать код из языка С# в С++. Занимался разбором задачи на языке С++. Вот...

Дан целочисленный массив размером N. Преобразовать массив, увеличив длину каждой серии на один элемент
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() { int n; int k=0;...

Дан целочисленный массив размера N. Преобразовать массив, уменьшив каждую его серию на один элемент
Помогите с задачей! Серия - это одинаковые элементы, идущие подряд. Пример: Ввод массива: 1 1 2...

Преобразовать массив следующим образом: сначала должны стоять цифры, входящие в массив, а затем все остальные символы
помогите пожайлуста с задачей. Задан массив из k символов. Преобразовать массив следующим...

Дан двумерный массив. Преобразовать его так, чтобы новый массив содержал элементы старого, циклически сдвинутые на 2 элемента влево.
Уважаемые форумчане, такая проблема, не знаю как решить задачу, в моём городе мне не к кому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.