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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2013, 18:17   #1
zwenya
 
Регистрация: 14.11.2013
Сообщений: 7
По умолчанию Даны массивы А(N)(отсортирован по возрастанию) и массив В(М)(отсортирован по убыванию).Слить в отсортированный массив С ( с++ )

Даны два массива. Массив А состоит из N элементов и отсортирован по возрастанию. Массив В состоит из М элементов и отсортирован по убыванию. Разработать программу для слияния этих массивов в отсортированный по возрастанию массив С.

Помогите, пожалуйста, найти ошибку. Выводит 20 нулей , а должен - отсортированный по возрастанию массив


Код:
#include<iostream>
#include <conio.h>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
const int N=10, M=10;
vector<int> A, B, C;
 
struct Func
{
    int i;
    bool Flag;
    void operator()(int& x)
    {
        if(Flag)
            x=i++;
        if(!Flag)
            x=i--;
    };
    Func(int _i,bool flag):i(_i),Flag(flag){};
};
 
 
int main()
{
A.resize(10);
B.resize(10);
C.resize(20);
for_each(A.begin(),A.end(),Func(0,true));
for_each(B.begin(),B.end(),Func(50,false));
 
int x=0,i(0), y= M-1;
while (C[N+M-1])
{ 
    if (((A[x]>=B[y])||(x>N-1))&&(y<=M-1))
        {C[i]=B[i];
    i++;
    y--;}
 
else
    if  (((A[x]<=B[y])||(y<0)&&(x>=0)))
        { C[i]=A[x];
            i++;
            x++;
        }
 
}
ostream_iterator<int,char> It(cout," ");
copy(C.begin(),C.end(),It);
_getch();
}

Последний раз редактировалось Stilet; 27.12.2013 в 19:45.
zwenya вне форума Ответить с цитированием
Старый 27.12.2013, 21:22   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Код:
while (C[N+M-1])
Как ты думаешь, чему будет равно C[N+M-1] перед первым проходом цикла?
Son Of Pain вне форума Ответить с цитированием
Старый 27.12.2013, 23:05   #3
zwenya
 
Регистрация: 14.11.2013
Сообщений: 7
По умолчанию

как это можно исправить?
zwenya вне форума Ответить с цитированием
Старый 28.12.2013, 00:49   #4
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
По умолчанию

Для начала проверяем входные данные.
Два первых вектора вроде как сортируются.
А третий вектор заполнен нулями.
Тут я просто добавляю вектора в конец вектора.
Но вектор С заполненн нулями.
Есть предложение просто сделать вектор С нулевого размера(C.resize(0),

то есть незаполненный, и добавить сначала вектор А потом вектор В к вектору С

Так вроде всё получается.
Только есть недостаток я итераторов много насоздавал, можно улучшить.

#include <conio.h> - эту строку я убрал за ненадобность.


Код:
#include <cstdlib>
#include <iostream>

#include <vector>
#include <algorithm>
#include <iterator>
//http://www.programmersforum.ru/showthread.php?t=252202
//

using namespace std;

const int N=10, M=10;
vector<int> A, B, C;

struct Func
{
    int i;
    bool Flag;
    void operator()(int& x)
    {
        if(Flag)
            x=i++;
        if(!Flag)
            x=i--;
    };
    Func(int _i,bool flag):i(_i),Flag(flag){};
};
 
int main(int argc, char *argv[])

{
    
A.resize(10);
B.resize(10);
C.resize(20);// тут поставить 0

ostream_iterator<int,char> It_A(cout," ");

for_each(A.begin(),A.end(),Func(0,true));

//проверяем что массив отсортирован
copy(A.begin(),A.end(),It_A);
cout<<endl;

for_each(B.begin(),B.end(),Func(50,false));

//проверяем что массив отсортирован
ostream_iterator<int,char> It_B(cout," ");
copy(B.begin(),B.end(),It_B);
cout<<endl;

  copy(A.begin(),A.end(),back_inserter(C));
copy(B.begin(),B.end(),back_inserter(C));


//Вывдим вектор С и видим что он не пустой,а  был залнен нулями
ostream_iterator<int,char> It_C(cout," ");
copy(C.begin(),C.end(),It_C);

/*

int x=0,i(0), y= M-1;

while (C[N+M-1])

        { 
            if (((A[x]>=B[y])||(x>N-1))&&(y<=M-1))
            
                {
                C[i]=B[i];
                i++;
                 y--;
                 }
         
        else
            if  (((A[x]<=B[y])||(y<0)&&(x>=0)))
            
                { 
                   C[i]=A[x];
                    i++;
                    x++;
                }
         
        }
*/

//ostream_iterator<int,char> It_С(cout," ");
//copy(C.begin(),C.end(),It_С);



    system("PAUSE");
    return EXIT_SUCCESS;
}

Последний раз редактировалось vvmcpp; 28.12.2013 в 01:02.
vvmcpp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнить массив из 20 элементов случайным образом от -5 до +5. Отсортировать массив по возрастанию. Olechkina Помощь студентам 1 08.12.2013 18:32
В файле f элементы упорядочены по возрастанию.требуется слить эти файлы в один файл,также упорядоченный по возрастанию ayoka Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2012 21:51
Упорядочить массив по возрастанию и убыванию методом выбора. Агварес Помощь студентам 2 17.01.2012 12:12