Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 16.12.2014
Сообщений: 30

Переставить в обратном порядке все четные элементы массива

21.03.2015, 19:19. Показов 2302. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Дана задача: Заполнить одномерный массив из 15 элементов целыми числами. Переставить в обратном порядке все четные элементы массива. Надо сделать через ввод чисел массива через клавиатуру. При этом используя функции, printf и scanf.

Добавлено через 1 минуту
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
#include <stdio.h>
const int n = 15;
main()
{
int i,j;
int a[n];
int m[n];
printf ("Vvedite massiv a\n");
for (i = 0; i < n; i++)
{
printf("Vvedite A[%d]> ", i);
scanf ("%d", &a[i]);
}
for (i = 0;i < n; i ++)
a[i] = a[i];
printf ("\nRezultat:\n");
for (i = 0; i < n; i++)
printf ("%d ", a[i]);
{
int n=j;
for(i=0;i<n/2;i++);
}
int t=m[i];
{
m[i]=m[n-i-1];
m[n-i-1]=t;
}
printf ("revers:");
for (i=0;i<n;i++)
{
scanf("%d", &m[i]);
}
j=0;
for(i=0;i<n;i++)
{
if(a[i]%2==0)
a[i]=m[j++];
}
printf ("Rezult:");
for(i=0;i<15;i++)
scanf("%d", &m[i]);
return 0;
}
Вот что у меня получилась, свою функцию задача не выполняет хоть и работает, может я что-то упустил?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2015, 19:19
Ответы с готовыми решениями:

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

Переставить элементы массива в обратном порядке
Создать массив А из 20 вещественных чисел с помощью генератора псевдослучайных чисел с элементами в диапазоне от -100 до 100 и вывести...

Переставить в обратном порядке элементы массива
Привет всем. У меня возникла проблема с этим заданием: Дан массив A размера N и целые числа K и L (1 ≤ K &lt; L ≤ N)....

13
 Аватар для MicM
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
21.03.2015, 19:49
Лень было разбираться в Вашем коде...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
 
int main()
{
    vector<int> v = {1,2,3,4,5,6,7,8,9,10};
    vector<int> indexes;
    for (int i = 0; i < v.size(); i++)
        if (!(v[i] & 1))
            indexes.push_back(i);
    int size = indexes.size();
    for (int i = 0; i < size / 2; i++)
        swap (v[indexes[i]], v[indexes[size - i - 1]]);
    copy (v.begin(), v.end(), ostream_iterator<int> (cout, " "));
    cout <<endl;
}
0
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
21.03.2015, 21:11
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
47
#include <stdio.h>
 
void swap(int &a, int &b);
void foo(int *arr, const int N);
 
int main()
{
    const int N = 5;
    int i, a[N];
 
    printf ("Vvedite massiv a\n");
    for (i = 0; i < N; i++) {
        printf("Vvedite A[%d]> ", i);
        scanf ("%d", &a[i]);
    }
 
    printf ("\nDo:\n");
    for (i = 0;i < N; ++i)
        printf("%d ", a[i]);
 
    foo(a, N);
 
    printf ("\nPosle:\n");
    for (i = 0;i < N; ++i)
        printf("%d ", a[i]);
 
    return 0;
}
 
void swap(int &a, int &b) {
    int c = a; a = b; b = c;
}
 
void foo(int *arr, const int N) {
    int even_arr[N], i, j = -1, size = N;
    for(i=0;i < N; ++i) {
        even_arr[i] = -1;
        if(!(arr[i]%2))
            even_arr[++j] = i;
    }
 
    for(i=0; even_arr[i] != -1 && i<N;++i)
        size = i+1;
 
    for(i=0; i<size/2;++i)
        swap(arr[even_arr[i]], arr[even_arr[size-i-1]]);
}
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
21.03.2015, 21:24
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
#include <iostream>
#include <algorithm>
 
 
void foo ( int * arr , size_t size )
{
    if ( size < 2 )
        return ;
    for ( size_t l = 0 , r = size-1 ; l<r ; ++l, --r )
    {
        for ( ; l<r && (arr[l]&1) ; ++l )
            ;
        for ( ; l<r && (arr[r]&1) ; --r )
            ;
        if ( l<r )
            std::swap ( arr[l] , arr[r] ) ;
    }
}
 
 
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10} ;
    size_t size = sizeof(arr)/sizeof(*arr) ;
    foo ( arr , size ) ;
    for ( size_t i = 0 ; i < size ; ++i )
        std::cout << arr[i] << ' ';
}
1
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
21.03.2015, 21:54
Croessmah, а зачем так писать?
C++
1
arr[r]&1
Только что замерил скорость. Даже на 100000000 скорость одинаковая.

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
#include <ctime>
#include <iostream>
 
using std::cout;
using std::endl;
 
int main()
{
    const size_t N = 1000000000;
    size_t *arr = new size_t[N];
    for(size_t i=0; i < N; ++i)
        arr[i] = (i+2)*2;
 
    size_t start1 = clock();
    for(size_t i=0; i < N; ++i)
        if(!(arr[i]%2)) {}
    size_t end1 = clock();
 
    cout << "% = " <<  end1-start1 << endl;
 
    size_t start2 = clock();
    for(size_t i=0; i < N; ++i)
        if(arr[i]&1) {}
    size_t end2 = clock();
 
    cout << "& = " <<  end2-start2 << endl;
 
    delete[] arr;
 
    return 0;
}
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
21.03.2015, 22:55
Цитата Сообщение от Kant Посмотреть сообщение
Даже на 100000000 скорость одинаковая.
Выхлоп GCC для:
C++
1
2
    bool b1 = !(x%2) ;
    bool b2 = x&1 ;
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
    movl    -4(%rbp), %eax
    andl    $1, %eax
    testl   %eax, %eax
    sete    %al
    movb    %al, -6(%rbp)
    movl    -4(%rbp), %eax
 
    andl    $1, %eax
    testl   %eax, %eax
    setne   %al
    movb    %al, -5(%rbp)
    movl    $0, %eax
И да, бесполезные циклы из Вашего кода, скорее всего будут выпилины вообще.

Добавлено через 6 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
скорее всего будут выпилины вообще.
С опцией -O2 Ваши циклы превратились в
Assembler
1
2
3
    call    clock
    movq    %rax, %r12
    call    clock
Добавлено через 6 минут
С -O1 :
Assembler
1
2
3
4
5
6
7
    call    clock
    movq    %rax, %r12
    movl    $1000000000, %edx
.L7:
    subq    $1, %rdx
    jne .L7
    call    clock
С -O0 :
C++
1
2
3
4
5
6
7
8
9
10
    call    clock
    movq    %rax, -32(%rbp)
    movq    $0, -72(%rbp)
    jmp .L6
.L7:
    addq    $1, -72(%rbp)
.L6:
    cmpq    $999999999, -72(%rbp)
    jbe .L7
    call    clock
Теперь видно откуда берется скорость?

Добавлено через 11 минут
Немного переделал код, чтобы компилятор совсем условия не выпиливал:
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
#include <ctime>
#include <iostream>
 
using std::cout;
using std::endl;
 
int main()
{
    const size_t N = 1000000;
    size_t *arr = new size_t[N];
    bool *arr2 = new bool[N];
    bool *arr3 = new bool[N];
    for(size_t i=0; i < N; ++i)
        arr[i] = (i+2)*2;
 
    
    size_t start1 = clock();
    for(size_t i=0; i < N; ++i)
        if(!(arr[i]%2)) {arr2[i]=true;}
    size_t end1 = clock();
    
     size_t start2 = clock();
    for(size_t i=0; i < N; ++i)
        if(arr[i]&1) {arr3[i]=false;}
    size_t end2 = clock();
    
    cout << "% = " <<  end1-start1 << endl;
 
 
    cout << "& = " <<  end2-start2 << endl;
 
    delete[] arr;
 
    return 0;
}
Цикл с %2 получился:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    call    clock
    movq    %rax, -48(%rbp)
    movq    $0, -96(%rbp)
    jmp .L4
.L6:
    movq    -96(%rbp), %rax
    leaq    0(,%rax,8), %rdx
    movq    -72(%rbp), %rax
    addq    %rdx, %rax
    movq    (%rax), %rax
    andl    $1, %eax
    testq   %rax, %rax
    jne .L5
    movq    -96(%rbp), %rax
    movq    -64(%rbp), %rdx
    addq    %rdx, %rax
    movb    $1, (%rax)
.L5:
    addq    $1, -96(%rbp)
.L4:
    cmpq    $999999, -96(%rbp)
    jbe .L6
    call    clock
1
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
21.03.2015, 22:56
Croessmah, большое спасибо за разъяснение.
0
21.03.2015, 22:57

Не по теме:

Кстати, кто-нибудь знает, как менять синтаксис asm кода в GCC с AT&T на Intel?

0
0 / 0 / 0
Регистрация: 16.12.2014
Сообщений: 30
21.03.2015, 23:06  [ТС]
Большое всем спасибо за ответы, но все таки хотелось бы увидеть программу через printf и scanf, что-то на подобие моей или варианта Канта через scanf и printf. Так как программа с cout и endl есть своя.

Добавлено через 3 минуты
Kant, Запустил вашу программу, но что-то в ней не так) она не меняет четные элементы массива, то есть до 1 2 3 4 5, тоже самое и после. Возможно проблема в этом?

C++
1
2
3
4
5
6
7
8
9
  printf ("\nDo:\n");
    for (i = 0;i < N; ++i)
        printf("%d ", a[i]);
 
    foo(a, N);
 
    printf ("\nPosle:\n");
    for (i = 0;i < N; ++i)
        printf("%d ", a[i]);
0
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
21.03.2015, 23:09
vikpod, вы уверены? Только что ещё раз перепроверил. У меня нормально работает.

1 2 3 4 5
1 4 3 2 5
0
0 / 0 / 0
Регистрация: 16.12.2014
Сообщений: 30
21.03.2015, 23:18  [ТС]
Kant, А да все работает, благодарю. А вот еще один такой вопрос, в
C++
1
  const int N = 5;
поставил
C++
1
  const int N = 15;
но 5 элементов так и осталось.
0
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
21.03.2015, 23:21
vikpod, у меня подозрения, что вы запилили кусок моего кода себе и теперь не шарите, что происходит. Блин, вопросы по алгоритму ещё да, но в простом. Учебник в зубы
0
0 / 0 / 0
Регистрация: 16.12.2014
Сообщений: 30
22.03.2015, 00:09  [ТС]
Kant, Алгоритм мне не нужен, в коде разбираюсь для себя, а проблемка была в компиляторе, больше вопросов не имею...
0
 Аватар для Kant
37 / 37 / 18
Регистрация: 15.05.2013
Сообщений: 236
22.03.2015, 19:54
vikpod, такое крайне редко бывает. Скорей всего ты начудил и не заметил. Со мной такое не раз бывало. Винить компилятор надо в самую последнею очередь.

Добавлено через 15 часов 39 минут
Croessmah, решил сравнить твой алгоритм и свой. Твой в два! раза быстрее. Ух! Ещё и память не жрет. Сейчас изучаю алгоритмы по Седжвику. Надеюсь тоже смогу так писать.
Цитата Сообщение от Croessmah Посмотреть сообщение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo ( int * arr , size_t size )
{
    if ( size < 2 )
        return ;
    for ( size_t l = 0 , r = size-1 ; l<r ; ++l, --r )
    {
        for ( ; l<r && (arr[l]&1) ; ++l )
            ;
        for ( ; l<r && (arr[r]&1) ; --r )
            ;
        if ( l<r )
            std::swap ( arr[l] , arr[r] ) ;
    }
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2015, 19:54
Помогаю со студенческими работами здесь

Переставить в обратном порядке элементы массива
Задан одномерный массив из 15 элементов. Переставить в обратном порядке: элементы расположены между максимальным и минимальным элементами,...

Переставить элементы массива в обратном порядке
int *ans = new int; for (int i = counter - 1; i &gt;= 0; i--) for (int j = 0; j &lt; counter; j++) { kek = ans; } так...

Переставить в обратном порядке элементы массива
Array72. Дан массив A размера N и целые числа K и L (1 ≤ K &lt; L ≤ N). Переставить в обратном порядке элементы массива, расположенные между...

Переставить элементы массива в обратном порядке
Напишите программу, которая переставляет элементы массива в обратном порядке без использования дополнительного массива. Программа должна...

Переставить в обратном порядке элементы массива
Здравствуйте! Помогите, пожалуйста, найти и исправить ошибки в решении задачи: Дан массив размера 10. Переставить в обратном...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru