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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
AZIZBEK
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 37
#1

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

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

Преобразуйте массив переставив все элементы все нулевые элементы в в конец массива
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразовать массив (C++):

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

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

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

Дан целочисленный массив размером N. Преобразовать массив, увеличив длину каждой серии на один элемент - C++
#include "stdafx.h" #include <iostream> using namespace std; int main() { int n; int k=0; int p=0; int l=0; int...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
salam
163 / 144 / 12
Регистрация: 10.07.2012
Сообщений: 728
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/ebacd9...acf1dc64f2a278
Отработка на скрине
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
salam
163 / 144 / 12
Регистрация: 10.07.2012
Сообщений: 728
30.07.2012, 17:30 #5
крайне неверно полагать, что кто-то этого не понял и не намекнул об этом фразой
Цитата Сообщение от salam Посмотреть сообщение
очень тупая (с точки зрения возможности для оптимизации) задача...
0
-=ЮрА=-
Заблокирован
Автор FAQ
30.07.2012, 17:37 #6
Цитата Сообщение от salam Посмотреть сообщение
крайне неверно полагать, что кто-то этого не понял и не намекнул об этом фразой
- вот посмотри что ты посоветовал
http://liveworkspace.org/code/5865e1...a121486a6198d2
Ничего ты не понял, потому как хотя бы при обмене надо уменьшать число доступных элементов сзади, вобщем не хочу спорить просто указал на твой недочёт и просто это надо принять а не ершиться...
0
nameless
Эксперт C++
334 / 298 / 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
0
Thinker
Эксперт C++
4226 / 2200 / 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;
}
1
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);
0
Thinker
30.07.2012, 18:40
  #10

Не по теме:

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

0
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;
}
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 21:07
Привет! Вот еще темы с ответами:

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

Преобразовать массив LPWSTR в массив BYTE - C++
Найти не могу нигде... На С# только нашел, и то не то... Получаю из EDIT текст: LPWSTR keyT = (LPWSTR)malloc(32 + 1 *...

Преобразовать массив Int в массив строк - C++
Помогите пожалуйста с решением. Нужно в каждый элемент массива string положитm элемент массива int. Т.е из int i={1,12,100} получить...

Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел - C++
Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел больших исходных на два порядка. Напечатать массивы в два...


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

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

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