Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2024, 22:44   #21
сфинкс
Участник клуба
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 1,024
По умолчанию

Неделю обсуждали и внезапно тема решена мной за 5 минут
на 95% см. №16

https://www.programmersforum.ru/show...51#post1868551

и со стыда онлайн на qbjs.org не проверяем

https://qbjs.org/?code=TiA9IDEzOiBSY...AAregA5WHqAOU=

Программы завсегдатаев проверяемые ли онлайн?

Ищем в интернете: неприятие чужого мнения
и / или / либо
ru.wikipedia.org/wiki/Склонность_к_подтверждению_своей_то чки_зрения
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 28.12.2024, 11:55   #22
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Тогда возвращайтесь к предыдущей реализации, когда в новый массив переписывались сначала нечетные, а потом четные из исходного массива.
Или вот такая "наивная" реализация без дополнительного массива:
Код:
void segregateEvenOdd(int* array, const size_t size) 
{
    for (size_t i = 0; i < size - 1; ++i) 
    {
        if (array[i] % 2 != 0) 
            continue;
        
        size_t j = i + 1;
        while (j < size && array[j] % 2 == 0)
            ++j;
        if (j == size)
            break;
        
        int v = array[j];
        for (size_t k = j; k > i; --k)
            array[k] = array[k - 1];
        array[i] = v;
    }
}
Четные сдвигаются "блоками" вправо, а нечетные по одному переносятся влево.
А можна как то сделать не черезь while а через for?
Я попробовал переделать через for но увы ничего не получилось(

Код:
void segregateEvenOdd(int8_t array[], const size_t size)
{
    for (size_t i = 0; i < size - 1; ++i)
    {
        if (array[i] % 2 != 0)
            continue;
        
        int v = 0;
        for (size_t j = i + 1; j < size; ++j) 
        {
            if (array[j] % 2 == 0) 
            {
                v = array[j];
                for (size_t k = j; k > i; --k)
                    array[k] = array[k - 1];
            }
            array[i] = v;
        }
    }
}
vovamakarovych вне форума Ответить с цитированием
Старый 28.12.2024, 12:12   #23
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Цитата:
Сообщение от vovamakarovych Посмотреть сообщение
А можна как то сделать не черезь while а через for?
Можно.
Код:
// вместо
        size_t j = i + 1;
        while (j < size && array[j] % 2 == 0)
            ++j;
        if (j == size)
            break;
// сделать
        size_t j;
        for (j = i + 1; j < size && array[j] % 2 == 0; ++j);
        if (j == size)
            break;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.12.2024, 12:28   #24
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно.
Код:
// вместо
        size_t j = i + 1;
        while (j < size && array[j] % 2 == 0)
            ++j;
        if (j == size)
            break;
// сделать
        size_t j;
        for (j = i + 1; j < size && array[j] % 2 == 0; ++j);
        if (j == size)
            break;
Но мы в самому for ничего не делаем? Тогда да while лутче
vovamakarovych вне форума Ответить с цитированием
Старый 28.12.2024, 12:33   #25
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Да, тело цикла пустое, но так тоже можно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 23.01.2025, 14:55   #26
сфинкс
Участник клуба
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 1,024
По умолчанию

Данная тема решена?

Или мои решения в сообщениях на этой странице
включая пример онлайн

и мой ответ
https://www.programmersforum.ru/show...51#post1868551

слишком трудные?

Код:
N = 8: Randomize Timer ' prlev.bas
Dim d(N), a(N)
For i = 1 To N: d(i) = Int(Rnd * 88)+10: Print d(i);: Next: Print

k = 1: m = N: For i = 1 To N
    If Int(d(i) / 2) <> d(i) / 2 Then a(k) = d(i): k = k+1
    If Int(d(N-i+1) / 2) = d(N-i+1) / 2 Then a(m) = d(N-i+1): m = m-1
Next

Print: For i = 1 To N: Print a(i);: Next
59 53 18 54 36 81 82 64
59 53 81 18 54 36 82 64

Убрать 2-й массив проще
добавив в конец единственного массива ещё столько же ячеек
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 24.01.2025 в 00:38.
сфинкс вне форума Ответить с цитированием
Старый 23.01.2025, 19:21   #27
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 186
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
Данная тема решена?

Или мои решения в сообщениях на этой странице

слишком трудные?
Ваше решение не соответствует постановке задачи "Функция принимает массив целочисленных чисел, диапазон значений которых составляет от 0 до 100. В функции нужно переставить элементы массива, так что в левой стороне были все нечетные числа а справа все четные. Например, массив 1, 4, 5, 8, 9 должен быть переписан на 1, 5, 9, 4, 8."

В вашем решении нет функции и в нём значения массива не переставляются, а создаётся новый массив. Это совсем не то.

Вот правильное (одно из многих возможных решений):
Код:

program separate_odd_even;

procedure PrintArray( x: array of longint );
var     el: longint;
begin
    for el in x
    do begin
        system.Write( el, '  ' );
    end;
    system.WriteLn();
end;


procedure SeparateOddEven( var x: array of longint );

    procedure ShiftRight( var y: array of longint; from_index: longint; num: longint );
        // num - длина отрезка массива (количество элементов)
        //      которые надо сдвинуть
    var i: longint;
    begin
        for i:=from_index+num downto from_index+1
        do begin
            y[i] := y[i-1];
        end;
    end;

var     i: longint;
var     last_odd_index: longint;
var     tmp_value: longint;
begin
    last_odd_index := -1;
    for i:=0 to system.Length( x )-1
    do begin
        if system.Odd( x[i] )
        then begin
            //system.WriteLn( 'x[i]=',x[i],' i=',i,' last oddind=',last_odd_index );
            if i<>(last_odd_index+1)
            then begin
                tmp_value := x[i];
                //PrintArray( x );
                ShiftRight( x, last_odd_index+1, i-last_odd_index-1 );
                //PrintArray( x );
                x[ last_odd_index+1 ] := tmp_value;
                //PrintArray( x );
            end;
            system.Inc( last_odd_index );
        end;
    end;
end;

// startuo
const   ALen = 5;
var     arr: array of longint;
begin
    system.SetLength( arr, ALen );
//    arr[0]:= 1; arr[1]:= 5; arr[2]:= 4; arr[3]:= 9; arr[4]:= 8;
//    arr[0]:= 10; arr[1]:= 5; arr[2]:= 4; arr[3]:= 9; arr[4]:= 8;
//    arr[0]:= 10; arr[1]:= 5; arr[2]:= 4; arr[3]:= 9; arr[4]:= 87;
//    arr[0]:= 11; arr[1]:= 5; arr[2]:= 45; arr[3]:= 91; arr[4]:= 87;
//    arr[0]:= 10; arr[1]:= 50; arr[2]:= 4; arr[3]:= 56; arr[4]:= 8;
    arr[0]:= 10; arr[1]:= 5; arr[2]:= 4; arr[3]:= 53; arr[4]:= 8;
    PrintArray( arr );
    SeparateOddEven( arr );
    PrintArray( arr );
    
end.
DeepFlake вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает функция которая должна с json формата возвращать в стандартный dimaSlon Qt и кроссплатформенное программирование С/С++ 76 08.06.2018 17:35
На С++ написать программу с реализацией в виде вызова функции по ссылке: Функция должна вернуть не одно, а ДВА(или более) значения Raitek Помощь студентам 2 23.01.2015 07:41
Функция, сортирующая сначала нечетные числа в массиве по возрастанию, а потом четные по убыванию. yurets17 Помощь студентам 1 12.11.2013 19:01
Вывести сначала все его четные (нечетные) елементы, а потом- нечетные(четные). tondo Помощь студентам 4 25.04.2012 00:17
Паскаль, вывести строки массива, поочередно, с лево на право, справа на лево Amid1990 Помощь студентам 2 15.11.2010 13:00