Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BUMER
157 / 12 / 0
Регистрация: 01.04.2009
Сообщений: 103
#1

Естественное слияние из n файлов - C++

24.05.2011, 14:40. Просмотров 1058. Ответов 0
Метки нет (Все метки)

Программа должна отсортировать текстовый файл, используя при этом дополнительные 2n файлов, путем естественного слияния.

Всегда сам все задачи делал, но сейчас уже в полном ступоре. Буду рад любой помощи. Если у кого есть уже готовый код - вообще расцелую В общих чертах я в алгоритме вроде разобрался, сейчас уперся в одну проблему. Создал 2 массива указателей f1 и f2, в которых должны храниться указатели на файлы. При пошаговом просмотре видно, что эти указатели присваиваются как-то не так. И дальше, при передаче их в функцию sliv записывать в эти файлы что бы то ни было программа вообще не хочет. Кто знает, в чем тут дело?

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <conio.h>
#include <stdio.h>
#include <string>
 
int min(int *m, int n)
{
    int i=0, a;
    while(m[i]==-1) i++;
    a=i;
    while(i<n-1)
    {
        i++;
        while(m[i]==-1)
        {
            if(i=n-1) return a;;
            i++;
        }
        if(m[i]<m[a]) a=i;
    }
    return a;
}
 
void sliv(FILE **from, FILE **to, int n)
{
    int m1[5], m2[5], i=0, q=0, j=0, minim;
    for(j=0;j<n;j++)
    {
        fscanf(from[j],"%d", &m1[j]);
        if(feof(from[j])) {m1[j]=-1; m2[j]=-1; q++;}
        else 
        {
            fscanf(from[j],"%d", &m2[j]);
            if(feof(from[j])) m2[j]=-1;
        }
    }
    while(q<n)
    {
        while(q<n)
        {
            minim=min(m1,n);
            if(m1[minim]<=m2[minim])
            {
                fprintf(to[i],"%d ",m1[minim]);
                m1[minim]=m2[minim];
                fscanf(from[minim],"%d",&m2[minim]);
                if(feof(from[minim])) m2[minim]=-1;
            }
            else
            {
                fprintf(to[i],"%d ",m1[minim]);
                m1[minim]=-1;
                q++;
            }
        }
        for(j=0;j<n;j++) m1[j]=m2[j];
        for(j=0;j<n;j++)
        {
            fscanf(from[j],"%d", &m2[j]);
            if(feof(from[j])) m2[j]=-1;
            else q--;
        }
        i++;
    }
    fcloseall();
}
 
void main()
{
    char name[10][3], fk[2]; 
    FILE *f1[5], *f2[5], *mf; bool k=false;
    int n, i, x, y, j=0, m1[5], m2[5], q=2; 
    printf("Vvedite n: "); scanf("%d", &n);
    //m1=new int[n];
    //m2=new int[n];
    for(i=0;i<2*n;i++)
    {
        name[i][0]='f';
        name[i][1]='0'+i;
        name[i][2]='\0';
    }
    mf=fopen("f.txt", "r");
    for(i=0;i<n;i++) f1[i]=fopen(name[i],"w");
    fscanf(mf,"%d",&x);
    i=0;
    while(!feof(mf))
    {
        fscanf(mf,"%d",&y);
        fprintf(f1[i],"%d ",x);
        if(x>y)i++; i%=n;
        x=y;
    }
    fprintf(f1[i],"%d ",y);
    fcloseall();
    
    while(q>1)
    {
        for(i=0;i<n;i++)
        {
            if(k)
            {
                f1[i]=fopen(name[i],"r");
                f2[i]=fopen(name[i+n],"w");
            }
            else
            {
                f2[i]=fopen(name[i],"r");
                f1[i]=fopen(name[i+n],"w");
            }
        }
        if(k) sliv(f1,f2,n);
        else sliv(f2,f1,n);
        k=!k;
        for(i=0,q=0;i<n;i++) 
            if(k) {if(!feof(f1[i])) q++;}
            else if(!feof(f2[i])) q++;
    }
    getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 14:40     Естественное слияние из n файлов
Посмотрите здесь:

Естественное двухпутевое слияние - C++
Реализация связи элементов линейного списка - указатели. Способ организации линейного связанного списка - дек. Алгоритм сортировки -...

Внешние сортировки. Сортировка слиянием. Естественное слияние - C++
Пом-гите решить, заранее благодарен.)) Билет 9 1 .Внешние сортировки. Сортировка слиянием. Естественное слияние. 2 Решить...

Чересстрочное слияние файлов - C++
в проге через консоль Производный класс обеспечивает черезстрочное слияние двух текстовых файлов, количество строк которых может...

Файл: Слияние файлов - C++
Есть два текста, в которых записано последовательности положительных целых чисел по возрастанию. записать в Третий текст последовательность...

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

Перестановки, поиск, сортировка, слияние файлов - C++
1. При запуске программы пользователь вводит целое число - размер перестановки. Вывести на экран все перестановки заданного размера,...

слияние списков - C++
помогите с написание программы!!! нужно написать программу которая объединяет два упорядоченных списка в один. Функция merge должна...

Черезстрочное слияние - C++
Появилось вот такое задание по C++: Написать программу на языке C++ чересстрочного слияния (т.е. первая строка в выходном файле - это...

Слияние массивов на с++ - C++
Добродень всем.задача такая:массив структур размера N(в моем случае 100).разбить на ленты.т.о получается 10 лент по 10 элементов в каждой...

Бинарное слияние - C++
Не получается реализовать алгоритм. Хелп плз. http://img246.imageshack.us/img246/6600/binslimf5.jpg Вот что у меня получается. ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru