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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка многопутевым слиянием, сортировка многопутевым слиянием 
:(
    Опции темы
Domain
Дата 24.12.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 11.3.2010

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



Всем привет. Есть задача. В  ООН  имеется  полный  перечень  всех  стран,  который  включает  в  себя:  название, 
континент,  столицу,  площадь,  численность  населения,  государственный  строй.  Вывести  названия  и 
столицы  государств  в  порядке  убывания  плотности  населения.  Применить  многопутевое  двухфазное 
естественное сбалансированное слиянеие. Написал следующий код.


#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
using namespace std;
/* двухфазная сортировка, параметр - имя файла*/
typedef struct item
{
    int key;
};
int vnsort1(char *ff); // фаза разделения серий
int vnsort2(char *a); // фаза слияния

int vnsort1( char *ff )
{
    FILE *A,*B,*C; /* файловые переменные */
    /* файлы "B", "C" в функциях - временные */
    item *a1,*a2; /* для чтения из исходного файла */
    item *pb,*pc; /* признаки записи в файлы разделения */
    a1 = new item;
    a2 = new item;
    pb = new item;
    pc = new item;
    a1->key = 0;
    a2->key = 0;
    pb->key = 0;
    pc->key = 0;

    int p; /* p=1 - признак достижения конца исходного файла */
    while(1)  /* цикл 1, цикл повторения фаз разделения и слияния */
        /* Подготовительные операции */
    {
        if ((A=fopen(ff,"r")) == NULL)
        {
            printf("\n Файл %s не открывается",ff);
            getch();
            return -1;
        }
        if ((B=fopen("B","w")) == NULL)
        {
            printf("\n Файл B не открывается");
            getch();
            return -1;
        }
        if ((C=fopen("C","w")) == NULL)
        {
            printf("\n Файл C не открывается");
            getch();
            return -1;
        }
        p = 0;
        pb->key = 0;
        pc->key = 0;


        if(fread(a1, sizeof (item),1, A) == NULL)
        {
            printf("\n Сортируемый файл - пустой");
            getch();
            return -1;
        }
        else
        {
            fwrite(&a1,sizeof(item),  1, B);
            //fprintf(B, " %d", a1);
            pb->key=1;
        }
        while(1) /* цикл 2, цикл формирования серий в файлах В и С */
        {
            while (1) /* цикл 3, цикл формирования серии в файле В */
            {


                if(fread(a2, sizeof (item),1, A) == NULL)
                {
                    p=1;
                    break; /* выход из цикла 3 */
                }
                else
                {
                    if (a2->key >= a1->key)  /* запишем в серию в файле В */
                    {

                        fwrite(&a2,sizeof(item),  1, B);
                        a1->key=a2->key;
                        pb->key=1;
                        continue;
                    }
                    else /* запишем первую запись новой серии в файле С */
                    {
                        fwrite(&a2,sizeof(item),  1, C);
                        a1->key=a2->key;
                        pc->key=1;
                        break; /* выход из цикла 3 */
                    }
                }
            }
            if (p)
                break;  /* выход из цикла 2 */
            while (1) /* цикл 4, формирование серии в файле С */
            {

                if(fread(a2, sizeof (item),1, A) == NULL)
                {
                    p=1;
                    break; /* выход из цикла 4 */
                }
                else
                {
                    if (a2->key >= a1->key)  /* запишем в серию в файле С */
                    {
                        fwrite(&a2,sizeof(item),  1, C);
                        a1->key=a2->key;
                        pc->key=1;
                        continue;
                    }
                    else
                    {
                        fwrite(&a2,sizeof(item),  1, B);

                        a1->key=a2->key;
                        pb->key=1;
                        break; /* выход из цикла 4 */
                    }
                }
            }
            if (p)
                break; /* выход из цикла 2 */
        }
        fclose(A);
        fclose(B);
        fclose©;
        if (pb->key && pc->key)  /* исходный файл записан в оба файла разделения */
            vnsort2(ff);  /* вызов функции слияния */
        else
        {
            /* Удаление вспомогательных файлов */
            remove("B");
            remove("C");
            return 0;  /* конец сортировки */
        }
    }
}

int vnsort2(char *a)
{
    bool flag;
    FILE *A,*B,*C; /* файловые переменные */
    item *b1,*b2,*c1,*c2; /* для считывания данных из файлов В и С */
    b1 = new item;
    b2 = new item;
    c1 = new item;
    c2 = new item;
    b1->key = 0;
    b2->key = 0;
    c1->key = 0;
    c2->key = 0;
    int rb,rc; /* коды завершения операции считывания из файлов В и С*/
    /* Подготовительные операции */
    if ((A=fopen(a,"w")) == NULL)
    {
        printf("\n Файл %s не открывается",a);
        getch();
        return -1;
    }
    if ((B=fopen("B","r")) == NULL)
    {
        printf("\n Файл B не открывается");
        getch();
        return -1;
    }
    if ((C=fopen("C","r")) == NULL)
    {
        printf("\n Файл C не открывается");
        getch();
        return -1;
    }
    rb = fread(b2, sizeof (item),1, B);
    rc = fread(c2, sizeof (item),1, C);
    b1->key=b2->key;
    c1->key=c2->key;
    while (1)
    {
        if ( (rb > 0) && (rc <= 0) )    // файл С закончился
        {
            fwrite(&b2,sizeof(item),  1, A);

            while (fread(b2, sizeof (item),1, B))
                fwrite(&b2,sizeof(item),  1, A);
            fclose(A);
            fclose(B);
            fclose©;
            return 0;
        }
        else if ( (rb <= 0) && (rc > 0) ) // файл B закончился
        {
            fwrite(&c2,sizeof(item),  1, A);
            while (fread(c2, sizeof (item),1, C))
                fwrite(&c2,sizeof(item),  1, A);
            fclose(A);
            fclose(B);
            fclose©;
            return 0;
        }
        else if ( (rb <= 0) && (rc <= 0) ) // оба файла закончились
        {
            fclose(A);
            fclose(B);
            fclose©;
            return 0;
        }

        if ( (b2->key >= b1->key) && (c2->key >= c1->key) ) /* обе сливаемые серии не исчерпаны */
        {
            if (b2->key <= c2->key)
            {
                fwrite(&b2,sizeof(item),  1, A);
                b1->key=b2->key;
                rb = fread(b2, sizeof (item),1, B);

                continue;
            }
            else
            {
                fwrite(&c2,sizeof(item),  1, A);
                c1->key=c2->key;
                rc=fread(c2, sizeof (item),1, C);
                continue;
            }
        }

        if ( (b2->key >= b1->key) && (c2->key < c1->key) ) // серия файла C кончилась
        {
            c1->key = c2->key;
            flag = false;
            do
            {
                fwrite(&b2,sizeof(item),  1, A);

                b1->key = b2->key;
                rb=fread(b2, sizeof (item),1, B);
                if( rb <= 0 )
                {
                    flag = true;
                    break;
                }
                if( b2->key < b1->key )
                {
                    b1->key = b2->key;
                    flag = true;
                    break;
                }
                if ( flag == true )
                    break;
            }
            while(1);
            if( flag == true )
                continue;
        }
        if ( (b2->key < b1->key) && (c2->key >= c1->key) ) // серия файла B кончилась
        {
            b1->key = b2->key;
            flag = false;
            do
            {
                fwrite(&c2,sizeof(item),  1, A);

                c1->key = c2->key;
                rc=fread(c2, sizeof (item),1, C);
                if( rc <= 0 )
                {
                    flag = true;
                    break;
                }
                if( c2->key < c1->key )
                {
                    c1->key = c2->key;
                    flag = true;
                    break;
                }
                if ( flag == true )
                    break;
            }
            while (1);
            if( flag == true )
                continue;
        }

    }
}
void in()
{
    FILE * file;
    file = fopen("test.dat", "wb");
    item *items = new item[10];

    items[0].key = 10;
    items[1].key = 4;
    items[2].key = 2;

    fwrite(&items[0],sizeof(item),  1, file);
    fwrite(&items[1],sizeof(item),  1, file);
    fwrite(&items[2],sizeof(item),  1, file);

    fclose(file);
}
void out ()
{
    FILE * file;
    file = fopen("test.dat", "rb");
    item *it = new item;
    int i;
    while (i=fread(it, sizeof (item),1, file))
    {
        cout<<"\nkey: "<<it->key;
    }
    cout<<"\n";
    fclose(file);
}
int main()
{

    in();
    out();
    vnsort1("test.dat");
    out();
    cin.get();
    return 0;
}



Выполнение программы дает следующий  результат(прикрепил фото). Никак не могу понять в чем же дело. Почему выводит такие значение. 
 


Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  fileMerge.JPG 15,66 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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