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

Копирование массивов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 71, средняя оценка - 4.89
J_Max
Заблокирован
17.03.2010, 12:30     Копирование массивов #1
Уважаемые форумчане помогите решить задачку про массивы.
У меня не получается...
Суть задачи:
Есть два массива:
a(10) b(10);
копировать в массив b массив a, повторяющиеся не копировать, по два раза:
Свободное место массива b заполнить нулями.
То есть
a[10] = {1,2,2,3,3,4,5,6,7,8};
b должен быть таким после копирования:
b[10] = {1,2,3,4,5,6,7,8,0,0};

Добавлено через 29 минут
повторяющиеся не копировать, по два раза:
Точнее Только по одну разу, даже если повторов больше чем 2.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 12:49     Копирование массивов #2
полный перебор

Добавлено через 14 минут
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
#include <cstdlib>
#include <iostream>
 
void print(int * a, int size)
{
    while(size--)
        std::cout << *a++ << ' ';
    std::cout << std::endl;
}
void random(int * a, int size)
{
    while(size--)
        *a++ = rand() % 9 + 0;
}
 
bool find(int val, int * a, int size)
{
    while(size--)
        if(val == *a++)
            return true;
            
    return false;
}
 
int main()
{
    int const n = 10;   // array size
    int a[n] = { 0 }, b[n] = { 0 };
    
    srand(NULL);
    random(a, n);       // randomize
    print(a, n);        // print in array
    
    for(int i = 0, j = 0; i < n; ++i)
        if(!find(a[i], b, j))
            b[j++] = a[i];
    
    print(b,n);         // print out array
}
Добавлено через 1 минуту
В итоге получается следующее:
Код
Входной массив:  2 6 7 7 8 7 4 2 1 3
Выходной массив: 2 6 7 8 4 1 3 0 0 0
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 14:37     Копирование массивов #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
/* копирование массива C версия */
 
#define ARR_SIZE 10
int main(void){
    int a[ARR_SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, b[ARR_SIZE] = { 0 }, i;
    
    memcpy(b, a, sizeof(int) * ARR_SIZE);
    for ( i = 0; i < ARR_SIZE; ++i )
        printf("%d  ", b[i]);
    printf("\n");
    
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
#include <iterator>
    
/* копирование массива С++ версия */
int main(){
    const int arr_size = 10;
    int a[arr_size] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, b[arr_size] = { 0 };
    std::copy(a, a + arr_size, b);
    std::copy(b, b + arr_size, std::ostream_iterator<int>(std::cout, "  "));
    std::cout << std::endl;
    
    return 0;
}
Погорячился немного... Ну да пусть останется, может ещё кому пригодится...
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 14:46     Копирование массивов #4
easybudda, тут копирование с условием имеется в виду
easybudda
17.03.2010, 14:53
  #5

Не по теме:

fasked, да я уж понял. Говорю же - погорячился - заголовок прочитал, и понеслось...

fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 14:57     Копирование массивов #6
Цитата Сообщение от easybudda Посмотреть сообщение
Ну да пусть останется, может ещё кому пригодится...
Ох мне пригодилось, не знал, что так массивы выводить можно ))..
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 15:08     Копирование массивов #7
Нашы не сдаюца!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
    
int main(){
    const int arr_size = 10;
    int a[arr_size] = { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7 }, b[arr_size] = { 0 };
    std::list<int> l;
    std::copy(a, a + arr_size, std::back_inserter(l));
    l.unique();
    std::copy(l.begin(), l.end(), b);
    
    std::copy(a, a + arr_size, std::ostream_iterator<int>(std::cout, "  "));
    std::cout << std::endl;
    std::copy(b, b + arr_size, std::ostream_iterator<int>(std::cout, "  "));
    std::cout << std::endl;
    
    return 0;
}
Правда, если повторяющиеся элементы в разнобой идут, а не подряд, то так работать не будет. Прийдётся отсортировать сначала...
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 15:10     Копирование массивов #8
Цитата Сообщение от easybudda Посмотреть сообщение
Правда, если повторяющиеся элементы в разнобой идут, а не подряд, то так работать не будет. Прийдётся отсортировать сначала...
Не слишком ли много действий? О_о
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 15:14     Копирование массивов #9
Цитата Сообщение от fasked Посмотреть сообщение
Не слишком ли много действий?
не-а! Одну строчку добавить...
C++
1
2
3
4
...
l.sort();
l.unique();
...
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 15:15     Копирование массивов #10
Цитата Сообщение от easybudda Посмотреть сообщение
не-а! Одну строчку добавить...
Не-не, я про сложность алгоритма =)
И если исходный массив рассматривать как константный???
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 15:25     Копирование массивов #11
"Я думал, думал, я всё понял!"(с)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
    
int main(){
    const int arr_size = 10;
    int a[arr_size] = { 1, 2, 2, 3, 4, 4, 3, 6, 6, 1 }, b[arr_size] = { 0 };
    std::set<int> s;
    int *i;
    for ( i = a; i < a + arr_size; ++i )
        s.insert(*i);
    std::copy(s.begin(), s.end(), b);
    
    std::copy(a, a + arr_size, std::ostream_iterator<int>(std::cout, "  "));
    std::cout << std::endl;
    std::copy(b, b + arr_size, std::ostream_iterator<int>(std::cout, "  "));
    std::cout << std::endl;
    
    return 0;
}
вот так всё работает, и ничего сортировать не нужно!

Чёрт, опять не задалось!
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.03.2010, 15:27     Копирование массивов #12

Не по теме:

easybudda, ты опять про std::set забыл?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <set>
#include <algorithm>
 
int main()
{
  const int size    = 10;
        int a[size] = {1, 2, 2, 3, 3, 4, 5, 6, 7, 8};
        int b[size];
 
  std::set<int> tmp;
  
  std::copy(a, a + size, std::inserter(tmp, tmp.begin()));
  std::fill(std::copy(tmp.begin(), tmp.end(), b), b + size, 0);
 
  std::copy(b, b + size, std::ostream_iterator<int>(std::cout, "  "));
 
  return 0;
}

Не по теме:

Опоздал.

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 15:30     Копирование массивов #13
Цитата Сообщение от fasked Посмотреть сообщение
И если исходный массив рассматривать как константный?
ага, вот с этим и проблема...

Добавлено через 33 секунды

Не по теме:

CyBOSSeR, вспомнил уже



Добавлено через 1 минуту
CyBOSSeR, Всё равно криво выходит... Вот при таком массиве ерунда получится
C++
1
int a[] = { 1, 9, 2, 2, 8, 1, 6, 5 };
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.03.2010, 15:34     Копирование массивов #14
Цитата Сообщение от fasked Посмотреть сообщение
И если исходный массив рассматривать как константный???
Не проблема:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <set>
#include <algorithm>
 
int main()
{
  const int size    = 10;
  const int a[size] = {1, 2, 2, 3, 3, 4, 5, 6, 7, 8};
        int b[size];
 
  std::set<int> tmp;
  
  std::copy(a, a + size, std::inserter(tmp, tmp.begin()));
  std::fill(std::copy(tmp.begin(), tmp.end(), b), b + size, 0);
 
  std::copy(b, b + size, std::ostream_iterator<int>(std::cout, "  "));
 
  return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
CyBOSSeR, Всё равно криво выходит... Вот при таком массиве ерунда получится
Да нет все OK: http://codepad.org/SG7sU8eF
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 15:53     Копирование массивов #15
CyBOSSeR, криво в том плане, что в выходном массиве значения упорядоченные получаются, а это не правильно - они должны в том же порядке, что и во входном быть. Вот, до чего додумался:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
    
int main(){
    const int size = 10;
    int a[size] = { 2, 4, 9, 9, 1, 3, 3, 3, 2, 1 }, b[size] = { 0 }, i;
    std::vector<int> vec;
    
    for ( i = 0; i < size; ++i )
        if ( std::find(vec.begin(), vec.end(), a[i]) == vec.end() )
            vec.push_back(a[i]);
    std::copy(vec.begin(), vec.end(), b);
    
    std::copy(a, a + size, std::ostream_iterator<int>(std::cout, "  "));
    std::cout << std::endl;
    std::copy(b, b + size, std::ostream_iterator<int>(std::cout, "  "));
    std::cout << std::endl;
    
    return 0;
}
типа комильфо
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 15:58     Копирование массивов #16
C++
1
2
3
        for(int i = 0, j = 0; i < n; ++i)
                if(!find(a[i], b, j))
                        b[j++] = a[i];
собственно я это же писал, только без STL xD
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 16:02     Копирование массивов #17
Цитата Сообщение от fasked Посмотреть сообщение
собственно я это же писал, только без STL
Ну в принципе да, я-то озадачился тем, как фирменный велосипед приделать, чтобы свой не мастерить
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 16:05     Копирование массивов #18
Я вот только не понял, зачем ты вектор создаешь?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.03.2010, 16:12     Копирование массивов #19
Цитата Сообщение от fasked Посмотреть сообщение
Я вот только не понял, зачем ты вектор создаешь?
а чтобы не заморачиваться с указателем на то место в массиве b, куда очередное значение вставлять, да и конструкция какая-то чуднАя получилась бы:
C++
1
2
3
...
if ( std::find(b, b + size; a[i]) == b + size )
...
а так все уникальные значения из a туда навставлял и одним действием в выходной массив отправил...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2010, 16:16     Копирование массивов
Еще ссылки по теме:

Копирование массивов C++
В каждом из массивов найти наибольшее значение и умножить на него все элементы массивов C++
В каждом из заданных массивов найти наибольшее значение, и разделить на него все элементы массивов C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.03.2010, 16:16     Копирование массивов #20
Цитата Сообщение от easybudda Посмотреть сообщение
а чтобы не заморачиваться с указателем на то место в массиве b, куда очередное значение вставлять, да и конструкция какая-то чуднАя получилась бы:
Все =) теперь понял. С вектором и правда симпатичнее )))
Yandex
Объявления
17.03.2010, 16:16     Копирование массивов
Ответ Создать тему
Опции темы

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