Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Слияние двух файлов в третий с условием 
:(
    Опции темы
zeitgeistz
Дата 15.3.2014, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Даны записи R1, ..., RN и r1, ..., rn, ключи которых различны и упорядочены, т.е. K1<...<KM и k1<...<kn. Разработать алгоритм и программу слияния этих записей в один файл, в котором отсутствуют записи Ri первого файла, если во втором файле есть запись с таким же ключом.

Посмотрите пожалуйста, я правильно сделал два файла с ключами? Помогите пожалуйста слить их в один с заменой записей первого файла на записи второго при условии одинакового ключа

Код

int main()
{
    srand ( time(NULL) );
    int N, n;

    cout << "Enter N for first doc: ";
    cin >> N;
    cout << "Enter N for second doc: ";
    cin >> n;

    int Arr1[100][100];
    int Arr2[100][100];
    int Arr3[200][200];

// ------------ Запись первого файла
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            Arr1[i][j] = rand()%99;
        }
    }


    ofstream file1("1.txt", ios::out);

    for (int i = 0; i < N; i++)
    {
        file1 << i+1 << ".\t  ";
        for (int j = 0; j < 2; j++)
        {
            file1 << Arr1 [i][j] << " ";
        }
        file1 << '\n';
    }
// -------------- Запись второго файла

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            Arr2[i][j] = rand()%99;
        }
    }


    ofstream file2("2.txt", ios::out);

    for (int i = 0; i < n; i++)
    {
        file2 << i+1 << ".\t  ";
        for (int j = 0; j < 2; j++)
        {
            file2 << Arr2 [i][j] << " ";
        }
        file2 << '\n';
    }
}

PM   Вверх
zeitgeistz
Дата 16.3.2014, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



up
PM   Вверх
feodorv
Дата 17.3.2014, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(zeitgeistz @  16.3.2014,  22:54 Найти цитируемый пост)
up 

Ну, что же так всё безнадёжно?


Цитата(zeitgeistz @  15.3.2014,  14:36 Найти цитируемый пост)
Посмотрите пожалуйста, я правильно сделал два файла с ключами?

Условие задачи предполагает более рассеянные значения ключа (кстати, не задано, что ключ записи - целочисленное значение, но пусть будет), нежели прямолинейное
Цитата(zeitgeistz @  15.3.2014,  14:36 Найти цитируемый пост)
    for (int i = 0; i < N; i++)
    {
        file1 << i+1 << ".\t  ";

Цитата(zeitgeistz @  15.3.2014,  14:36 Найти цитируемый пост)
    for (int i = 0; i < n; i++)
    {
        file2 << i+1 << ".\t  ";

То есть должны быть записи как пересекающиеся, так и не пересекающиеся в этих двух файлах.


Более того, в записи хотелось бы иметь текстовое поле со значением "Файл 1" для записи в первом файле и значением "Файл 2" для записи во втором файле. Тогда легко можно понять, откуда в выходной файл пропала та или иная запись.


Цитата(zeitgeistz @  15.3.2014,  14:36 Найти цитируемый пост)
Помогите пожалуйста слить их в один с заменой записей первого файла на записи второго при условии одинакового ключа

Поскольку записи изначально отсортированы, то то Вам нужно всего лишь читать параллельно эти два файла по одной записи. Если ключи записей не совпадают, то запись с меньшим ключом записывается в выходной файл, а вместо неё (из соответствующего ей входного файла) считывается следующая запись (а запись с большим ключом остаётся как есть на следующий шаг цикла). Если ключи совпадают, то в выходной файл записывается запись из второго файла, и из обоих входных файлов считываются следующие записи. Если какой-либо входной файл закончился (то есть из него прочли все записи), а другой файл ещё нет, то записи из последнего тупо читаются и сбрасываются в выходной файл. Условно алгоритм слияния выглядит так:
Код

struct entry entry1, entry2;
bool eof1 = false, eof2 = false;
bool empty1 = true, empty2 = true;

for( ;; )
{
  if( !eof1 && empty1 && !read( file1, entry1) ) eof1 = true;
  if( !eof2 && empty2 && !read( file2, entry2) ) eof2 = true;

  if( eof1 && eof2 ) break;

  if( eof1 )
  {  
    write( output, entry2);
    empty2 = true;
  }
  else if( eof2 )
  {
    write( output, entry1);
    empty1 = true;
  }
  else
  {
    if( entry1.key < entry2.key )
    {
      write( output, entry1);
      empty1 = true;
    }
    else
    {
      write( output, entry2);
      empty2 = true;
      if( entry1.key == entry2.key ) empty1 = true;
    }
  }
}


Схему с if-else можно упростить:
Код
  ...

  if( eof1 && eof2 ) break;

  if( eof2 || (!eof1 && entry1.key < entry2.key) )
  {
    write( output, entry1);
    empty1 = true;
  }
  else
  {
    write( output, entry2);
    empty2 = true;
    if( !eof1 && entry1.key == entry2.key ) empty1 = true;
  }

но тогда нужно отдавать себе отчёт в том, что происходит.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
zeitgeistz
Дата 18.3.2014, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Спасибо большое, только с записью в выходной файл тоже проблема, не знаю, как записать их туда, не получается
PM   Вверх
feodorv
Дата 18.3.2014, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(zeitgeistz @  18.3.2014,  21:42 Найти цитируемый пост)
с записью в выходной файл тоже проблема

Записывайте аналогично тому, как Вы это делаете в первом посте.


А с чтением записей проблем нет?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
zeitgeistz
Дата 19.3.2014, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Записать не получается в итоговый файл, алгоритм ещё не вставлял. И с рандомом небольшие проблемы - хочу сделать, чтобы рандомные числа не повторялись, а они всё равно повторяются

Код

int main()
{
    srand ( time(NULL) );
    int N, n;

    cout << "Enter N for first doc: ";
    cin >> N;
    cout << "Enter N for second doc: ";
    cin >> n;

    int Arr1[100][100];
    int Arr2[100][100];
    int Arr3[200][200];

// ------------ Запись первого файла
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            Arr1[i][j] = rand()%99;
        }
    }


    ofstream file1("1.txt", ios::out);

    int keys1[100];
                // рандомно ключи
    for (int i = 0; i < n; i++)
    {
        keys1[i]=rand()%50;

        if ( keys1 [i] == keys1 [i-1] )
            keys1[i] = rand()%50;
    }

// - сортировка ключей
    for (int i=0; i<n; i++)
    {
        for (int j=i+1; j<n; j++)
        {
            if ( keys1[i] > keys1[j] )
            {
                swap (keys1[i],keys1[j]);
            }

        }
    }
            // - запись в файл 1

    for (int i = 0; i < N; i++)
    {
        file1 << keys1[i] << ".\t  ";
        for (int j = 0; j < 2; j++)
        {
            file1 << Arr1 [i][j] << " ";
        }
        file1 << '\n';
    }
// -------------- Запись второго файла

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            Arr2[i][j] = rand()%99;
        }
    }

                        // открываем файл 2 
    ofstream file2("2.txt", ios::out);

    int keys2[100];
    for (int i = 0; i < n; i++)
    {
        keys2[i]=rand()%50;

        if ( keys2 [i] == keys2 [i-1] )
            keys2[i] = rand()%50;
    }

// - сортировка ключей
    for (int i=0; i<n; i++)
    {
        for (int j=i+1; j<n; j++)
        {
            if ( keys2[i] > keys2[j] )
            {
                swap (keys2[i],keys2[j]);
            }

        }
    }

// запись во второй
    for (int i = 0; i < n; i++)
    {

        file2 << keys2[i] << ".\t  ";
        for (int j = 0; j < 2; j++)
        {
            file2 << Arr2 [i][j] << " ";
        }
        file2 << '\n';
    }



//              Запись в итоговый файл


    ofstream file3("3.txt", ios::out);

    for (int i = 0; i < n; i++)
    {

        for (int j = 0; j < 2; j++)
        {
            file3 << file1.rdbuf();
            file3 << file2.rdbuf();
        }
    }

}

PM   Вверх
feodorv
Дата 20.3.2014, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(zeitgeistz @  19.3.2014,  21:45 Найти цитируемый пост)
с рандомом небольшие проблемы - хочу сделать, чтобы рандомные числа не повторялись

Для ключей рандомные значения не очень годятся. Мало того, что повторяемость, так еще и отсутствует упорядоченность.

Сделайте проще: для первого файла значения ключей - 2, 4, 6, .... Для второго файла - 3, 6, 9, ... Так получится и уникальность ключей для каждого файла, и их отсортированность, и относительная рассеянность.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
zeitgeistz
Дата 21.3.2014, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Да, хорошая идея

А что в себе структура entry содержит? 
PM   Вверх
feodorv
Дата 21.3.2014, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(zeitgeistz @  21.3.2014,  17:00 Найти цитируемый пост)
А что в себе структура entry содержит?  

Это условная единица, соответствующая записи в файле. Должна содержать ключ и собственно поля записи. У Вас это keys и Arr для какого-то i.

Условные вызовы read и write должны уметь читать и писать запись в файл/из файла. В программе, которую Вы привели, нет даже попытки чтения записи, делается вид, что записи как бы уже прочитаны из файлов (и ещё ограничили число записей ста штуками))) А ведь в задании ясно сказано, что изначально записи находятся в файлах:
Цитата(zeitgeistz @  15.3.2014,  14:36 Найти цитируемый пост)
Разработать алгоритм и программу слияния этих записей в один файл, в котором отсутствуют записи Ri первого файла, если во втором файле есть запись с таким же ключом.
То есть на входе у Вас - два файла, на выходе - один...

По хорошему было бы неплохо ввести в программу класс, соответствующий записи, с переопределёнными операторами >> и <<, но это на потом smile 




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
zeitgeistz
Дата 21.3.2014, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Уфф, что-то сложно получается всё. Я сколько доселе ни пытался, так и не смог считать и записать данные
PM   Вверх
feodorv
Дата 21.3.2014, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(zeitgeistz @  21.3.2014,  20:31 Найти цитируемый пост)
Я сколько доселе ни пытался, так и не смог считать и записать данные 

Ну, поищите в инете по запросу типа "c++ запись структуры в файл и чтение из файла" и найдите что-нибудь подходящее, например, это (для бинарной записи)... 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
zeitgeistz
Дата 22.3.2014, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Запутался

Код

struct entry{
int keys[100];
int Arr[100][2];
};

int randomly (int arr[][2], int n){
    srand(time(0));

    for (int i = 0; i < n; i++){
        for (int j = 0; j < 2; j++){

                arr[i][j] = rand()%99;
        }
    }
}


double ** read(ifstream &f, entry one, char s[40], int n) // чтение
{//Объявление указателей и перемнных
 int i,j;
 double **a;

 //Выделение ОП под строки и столбцы матрицы
 a=new double *[n];
   if(a==NULL){cout<<"\n Не хватает оперативной памяти под строки";
               exit(1);
              }
   for(i=0;i< n;i++)
    {a[i]=new double[10];
      if(a[i]==NULL){cout<<"\n Не хватает оперативнйо памяти под столбцы";
                     exit(1);
                    }
    }

 //Открытие файла для чтения

 f.open (s);
 //Проверка успешности открытия файла для чтения
   if (f.fail()) {cout<<"\n Ошибка открытия файла";
              exit(1);
                 }
   for(i=0;i< n;i++)
     {for(j=0;j < 2;j++);
     }
 //Закрытие файла
 f.close();
 return a;
}

void write(ofstream &f,double **a, int n, int m, char s[40])    // запись
{//Объявление перменных
 int i,j;
 //Открытие файла
 f.open(s);
 //Проверка успешности открытия файла
   if (f.fail()) {cout<<"\n Ошибка открытия файла";
              exit(1);
                 }
  for(i=0;i< n;i++)
   {f<< endl;
    for(j=0;j< m;j++)
    f<<  a[i][j];
   }
 //Закрытие файла
 f.close();
}

int main()
{
    int N, n;

    cout << "Enter N for first doc: ";
    cin >> N;
    cout << "Enter N for second doc: ";
    cin >> n;


// ------------ Запись первого файла
    entry entry1, entry2;


    randomly (entry1.Arr, N);


    ofstream file1("1.txt", ios::out);
    char str1[40] = "1.txt";

                //  ключи   1

    for (int i = 0; i < n; i++)
    {
        entry1.keys[i] = 2;
        entry1.keys[i] = entry1.keys[i] + i*2;
    }

            // - запись в файл 1

    for (int i = 0; i < N; i++)
    {
        file1 << entry1.keys[i] << ".\t  ";
        for (int j = 0; j < 2; j++)
        {
            file1 << entry1.Arr [i][j] << " ";
        }
        file1 << '\n';
    }
// -------------- Запись второго файла

    randomly (entry2.Arr, N);

    ofstream file2("2.txt", ios::out);  // открываем файл 2

// -        ключи

    for (int i = 0; i < n; i++)
    {
        entry2.keys[i] = 3;
        entry2.keys[i] = entry2.keys[i] + i*3;
    }

//  запись в файл 2
    for (int i = 0; i < n; i++)
    {
        file2 << entry2.keys[i] << ".\t  ";

        for (int j = 0; j < 2; j++)
        {
            file2 << entry2.Arr [i][j] << " ";
        }
        file2 << '\n';
    }


//              Запись в итоговый файл


    ofstream output("3.txt", ios::out);

    for (int i = 0; i < n; i++)
    {

        for (int j = 0; j < 2; j++)
        {

        bool eof1 = false, eof2 = false;
        bool empty1 = true, empty2 = true;
        for( ;; )
        {
          if( !eof1 && empty1 && !read( file1, entry1, str1, N) ) eof1 = true;
          if( !eof2 && empty2 && !read( file2, entry2) ) eof2 = true;
          if( eof1 && eof2 ) break;
          if( eof1 )
          {
            write( output, entry2);
            empty2 = true;
          }
          else if( eof2 )
          {
            write( output, entry1);
            empty1 = true;
          }
          else
          {
            if( entry1.key < entry2.key )
            {
              write( output, entry1);
              empty1 = true;
            }
            else
            {
              write( output, entry2);
              empty2 = true;
              if( entry1.key == entry2.key ) empty1 = true;
            }
          }
        }
                }
            }
}

PM   Вверх
zeitgeistz
Дата 24.3.2014, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



up
PM   Вверх
zeitgeistz
Дата 26.3.2014, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



и ещё up
PM   Вверх
feodorv
Дата 27.3.2014, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Во-первых
Код
struct entry
{
  int keys;
  int Arr[2];
};
то есть запись - это ключ плюс два значения.

Если уж Вам так хочется зарезервировать место под 100 записей, то пишите так:
Код
struct entry arr[100];


Соответственно, чтение записи будет
Код
struct entry entry;
    fin.read( (char *) &entry, sizeof(entry));
а запись записи (прямо масло масленое)))
Код
fout.write( (char *) &entry, sizeof(entry));
для бинарной записи и
Код
fin >> entry.key >> entry.Arr[0] >> entry.Arr[1];
fout << entry.key << " " << entry.Arr[0] << " " << entry.Arr[1] << endl;
для текстовой записи. Проверьте:
Код
#include <iostream>
#include <fstream>

using namespace std;

int main( void )
{
  int key1 = 1, v11 = 2, v12 = 3;
  int key2 = 4, v21 = 5, v22 = 6;

  ofstream fout( "data.txt" );
  fout << key1 << " " << v11 << " " << v12 << endl;
  fout << key2 << " " << v21 << " " << v22 << endl;
  fout.close();

  ifstream fin( "data.txt" );
  fin >> key1 >> v11 >> v12;
  fin >> key2 >> v21 >> v22;
  fin.close();

  cout << key1 << " " << v11 << " " << v12 << endl;
  cout << key2 << " " << v21 << " " << v22 << endl;
  return 0;
}
(проверка на неудачи опущена).


Во-вторых, у Вас отдельно стоит задача создания двух файлов данных, и отдельно задача слияния этих файлов в один файл. Не стоит смешивать эти две задачи в одном исходнике...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.