Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
AZIZBEK
 Аватар для AZIZBEK
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 37
30.07.2012, 15:16     Преобразовать массив #1
Преобразуйте массив переставив все элементы все нулевые элементы в в конец массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
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]);
-=ЮрА=-
Заблокирован
Автор 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/ebacd9...acf1dc64f2a278
Отработка на скрине
Миниатюры
Преобразовать массив  
-=ЮрА=-
Заблокирован
Автор 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 поменяем между собой два нуля)
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
30.07.2012, 17:30     Преобразовать массив #5
крайне неверно полагать, что кто-то этого не понял и не намекнул об этом фразой
Цитата Сообщение от salam Посмотреть сообщение
очень тупая (с точки зрения возможности для оптимизации) задача...
-=ЮрА=-
Заблокирован
Автор FAQ
30.07.2012, 17:37     Преобразовать массив #6
Цитата Сообщение от salam Посмотреть сообщение
крайне неверно полагать, что кто-то этого не понял и не намекнул об этом фразой
- вот посмотри что ты посоветовал
http://liveworkspace.org/code/5865e1...a121486a6198d2
Ничего ты не понял, потому как хотя бы при обмене надо уменьшать число доступных элементов сзади, вобщем не хочу спорить просто указал на твой недочёт и просто это надо принять а не ершиться...
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 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/d05449...a01c1914c015e4
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 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;
}
ramybozy
8 / 8 / 0
Регистрация: 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);
Thinker
30.07.2012, 18:40
  #10

Не по теме:

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

ramybozy
8 / 8 / 0
Регистрация: 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;
}
Thinker
30.07.2012, 20:35
  #12

Не по теме:

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

ramybozy
30.07.2012, 20:57
  #13

Не по теме:

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

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

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

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

Или воспользуйтесь поиском по форуму:
Thinker
30.07.2012, 21:07     Преобразовать массив
  #14

Не по теме:

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

Yandex
Объявления
30.07.2012, 21:07     Преобразовать массив
Ответ Создать тему
Опции темы

Текущее время: 22:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru