6 / 6 / 1
Регистрация: 10.10.2010
Сообщений: 71
1

Осуществить слияние файлов в один

10.10.2010, 18:44. Показов 4803. Ответов 10
Метки нет (Все метки)

Имеются два файла сортировочных целых чисел All1 и All2 осуществить слияние файлов в один с элементами C1 C2 Cn+m
m - количество компонентов файла All1
n - количество компонентов файла All2

Таким образом что бы для всех компонентов выполнялись следующие условия
Ci <= Cj
1 <= i <= j <= n+m

All1 - 12345
All2 - 23456789
All - 1223344556789
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2010, 18:44
Ответы с готовыми решениями:

Работа с файлами. Слияние 2-х файлов в один.
Здравствуйте. Помогите сделать такую задачу - пусть файлы c и d с компонентами, являющимися...

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

Слияние всех файлов каталога и его подкаталогах в один
Необходимо создать форму WinForms при нажатии открывается OpenFileDialog где выбирается ...

Осуществить передачу файлов сразу нескольким клиентам, используя один номер порта
Здравствуйте. Нужно реализовать приложение, для приема-передачи файла. приложение приема файла...

10
13091 / 5872 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
10.10.2010, 19:08 2
Pascal
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
program Project1;
 
const
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  Fn3 = 'file3.txt';
  N = 100;
var
  F1, F2, F3 : Text;
  i, j, k, Num : Integer;
  Arr : array[1..N] of Integer;
begin
  (*Связываем файловые переменные с файлами.*)
  Assign(F1, Fn1);
  Assign(F2, Fn2);
  Assign(F3, Fn3);
 
  (*Записываем в первые 2 файла числа по возрастанию.*)
 
  (*В первый файл записываем чётные числа: 0..10.*)
  Rewrite(F1);
  i := 0;
  while i <= 10 do begin
    (*Перед записью очередного числа выполняем переход на следующую строку.
    Это действие не выполняем только для самого первого числа.*)
    if i > 0 then Writeln(F1);
    Write(F1, i);
    i := i + 2;
  end;
  (*Записываем в файл содержимое файлового буфера. Это действие
  выполняется только для текстовых файлов.*)
  Flush(F1);
 
  (*Во второй файл записываем нечётные числа: 1..9.*)
  Rewrite(F2);
  i := 1;
  while i <= 10 do begin
    if i > 1 then Writeln(F2);
    Write(F2, i);
    i := i + 2;
  end;
  Flush(F2);
 
  (*Открываем первый файл, читаем из него числа и записываем их в массив Arr.*)
  Reset(F1);
  i := 0;
  while not Eof(F1) do begin
    i := i + 1;
    Read(F1, Arr[i]);
  end;
 
  (*Теперь выполняем слияние на массиве. Для этого откроем второй файл.
  Будем последовательно читать из него числа и искать позицию в массиве,
  куда можно вставить очередное прочитанное число. Далее, вставляем
  число в массив. При этом, если требуется, будем сдвигать остальные числа
  массива на одну позицию вправо - чтобы освободить место для вставки.*)
 
  Reset(F2);
  while not Eof(F2) do begin
    (*Читаем очередное число из второго файла.*)
    Readln(F2, Num);
    (*Ищем позицию в массиве, на которой расположено число большее или равное
    тому, которое прочитано из файла. Если такое число найдётся в массиве, тогда
    j будет содержать индекс этого числа. Если такое число
    не найдётся, тогда j окажется на 1 больше, чем i. - Т. е. j будет указывать
    на место, расположенное после последнего значимого элемента массива.*)
    j := 1;
    while (j <= i) and (Arr[j] < Num) do begin
      j := j + 1;
    end;
    if j > i then begin
      (*Вставляем прочитанное из файла число справа от последнего значимого
      элемента массива.*)
      Arr[j] := Num;
    end else begin
      (*Сдвигаем элементы массива, расположенные в позициях i..j
      на 1 позицию вправо.*)
      for k := i downto j do begin
        Arr[k + 1] := Arr[k];
      end;
      (*Вставляем на освободившуюся позицию прочитанное из файла число.*)
      Arr[j] := Num;
    end;
    (*Т. к. мы добавили в массив новое число, то количество значимых элементов
    массива увеличилось на единицу.*)
    i := i + 1;
  end;
 
  (*Теперь записываем элементы массива в третий файл.*)
  Rewrite(F3);
  for j := 1 to i do begin
    if j > 1 then Writeln(F3);
    Write(F3, Arr[j]);
  end;
  (*Так как далее следует закрытие файлов, то Flush() в данном случае
  выполнять не обязательно.*)
  Flush(F3);
 
  Close(F1);
  Close(F2);
  Close(F3);
 
  Writeln('Задача выполнена. Результаты записаны в файлы:');
  Writeln(Fn1, ', ', Fn2, ', ', Fn3);
 
  Readln;
end.
1
6 / 6 / 1
Регистрация: 10.10.2010
Сообщений: 71
10.10.2010, 19:42  [ТС] 3
Mawrat, Спасибо большое. Вот еще не скажет файлы (исходные) предварительно что ли нужно создать где они задаются то???
0
13091 / 5872 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
10.10.2010, 19:47 4
Исходные файлы тоже в этой же программе создаются. Так что ничего дополнительно создавать здесь не надо.
0
6 / 6 / 1
Регистрация: 10.10.2010
Сообщений: 71
10.10.2010, 19:55  [ТС] 5
Mawrat,
Цитата Сообщение от Настенушка Посмотреть сообщение

All1 - 12345
All2 - 23456789
All - 1223344556789
А мне то нужно конкретные именно эти...
Я поняла что вы сделали четные и не четные и получился ряд.

Как норм сделать...
Не злитесь пожалуйста
0
13091 / 5872 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
10.10.2010, 20:26 6
Можно сделать слияние и других файлов. Что касается такого содержимого:
All1 - 12345
All2 - 23456789
All - 1223344556789
Здесь надо уточнить - т. е. сортировать по отдельным цифрам надо? Т. к. здесь нет пробелов, то эти последовательности цифр будут восприняты как одно число.
Цитата Сообщение от Настенушка Посмотреть сообщение
Не злитесь пожалуйста
злиться тут никто не собирается.
---
Настенушка, предлагаю такое решение:
Pascal
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
program Project1;
 
const
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  Fn3 = 'file3.txt';
  N = 100;
var
  F1, F2, F3 : file of Char;
  i, j, k : Integer;
  Ch : Char;
  Arr : array[1..N] of Char;
begin
  (*Связываем файловые переменные с файлами.*)
  Assign(F1, Fn1);
  Assign(F2, Fn2);
  Assign(F3, Fn3);
 
  (*Открываем первый файл, читаем из него символы (цифры - это символы)
  и записываем их в массив Arr.*)
  Reset(F1);
  i := 0;
  while not Eof(F1) do begin
    i := i + 1;
    Read(F1, Arr[i]);
  end;
 
  (*Теперь выполняем слияние на массиве. Для этого откроем второй файл.
  Будем последовательно читать из него символы (цифры) и искать позицию в массиве,
  куда можно вставить очередной прочитанный символ. Далее, вставляем
  символ в массив. При этом, если требуется, будем сдвигать остальные символы
  массива на одну позицию вправо - чтобы освободить место для вставки.*)
 
  Reset(F2);
  while not Eof(F2) do begin
    (*Читаем очередной символ из второго файла.*)
    Read(F2, Ch);
    (*Ищем позицию в массиве, на которой расположен символ больший или равный
    тому, который прочитан из файла. Если такой символ найдётся в массиве, тогда
    j будет содержать индекс этого символа. Если такой символ
    не найдётся, тогда j окажется на 1 больше, чем i. - Т. е. j будет указывать
    на место, расположенное после последнего значимого элемента массива.*)
    j := 1;
    while (j <= i) and (Arr[j] < Ch) do begin
      j := j + 1;
    end;
    if j > i then begin
      (*Вставляем прочитанный из файла символ справа от последнего значимого
      элемента массива.*)
      Arr[j] := Ch;
    end else begin
      (*Сдвигаем элементы массива, расположенные в позициях i..j
      на 1 позицию вправо.*)
      for k := i downto j do begin
        Arr[k + 1] := Arr[k];
      end;
      (*Вставляем на освободившуюся позицию прочитанное из файла число.*)
      Arr[j] := Ch;
    end;
    (*Т. к. мы добавили в массив новое число, то количество значимых элементов
    массива увеличилось на единицу.*)
    i := i + 1;
  end;
 
  (*Теперь записываем элементы массива в третий файл.*)
  Rewrite(F3);
  for j := 1 to i do begin
    Write(F3, Arr[j]);
  end;
 
  Close(F1);
  Close(F2);
  Close(F3);
 
  Writeln('Задача выполнена. Результаты записаны в файлы:');
  Writeln(Fn1, ', ', Fn2, ', ', Fn3);
 
  Readln;
end.
Программа работает так:
Исходные файлы:
file1.txt:
0123456789
file2.txt:
0123456789
Результат выполнения программы:
file3.txt:
00112233445566778899
---
Здесь может возникнуть вопрос - почему используем тип Char. Потому что цифры - это символы - т. е. тип Char. Судя по примеру содержимого файлов - именно это имеется в виду.
1
6 / 6 / 1
Регистрация: 10.10.2010
Сообщений: 71
10.10.2010, 20:39  [ТС] 7
Mawrat, спасибо за терпение и мой характер. Хочу просто понять. и делать все правильно.
Программа должна быть универсальной... а если файловые числа будут другие.


Пробелы это я не написала...
Мне нужно как у вас только цифры я так поняла кудато нужно или ввести или что.
Еще раз не злитесь =))
0
13091 / 5872 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
10.10.2010, 21:07 8
Если всё-таки числа, а не отдельные цифры, тогда предлагаю такой вариант:
Pascal
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
program Project1;
 
const
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  Fn3 = 'file3.txt';
  N = 100;
var
  F1, F2, F3 : Text;
  i, j, k, Num : Integer;
  Arr : array[1..N] of Integer;
begin
  (*Связываем файловые переменные с файлами.*)
  Assign(F1, Fn1);
  Assign(F2, Fn2);
  Assign(F3, Fn3);
 
  (*Открываем первый файл, читаем из него числа и записываем их в массив Arr.*)
  Reset(F1);
  i := 0;
  while not Eof(F1) do begin
    i := i + 1;
    Read(F1, Arr[i]);
  end;
 
  (*Теперь выполняем слияние на массиве. Для этого откроем второй файл.
  Будем последовательно читать из него числа и искать позицию в массиве,
  куда можно вставить очередное прочитанное число. Далее, вставляем
  число в массив. При этом, если требуется, будем сдвигать остальные числа
  массива на одну позицию вправо - чтобы освободить место для вставки.*)
 
  Reset(F2);
  while not Eof(F2) do begin
    (*Читаем очередное число из второго файла.*)
    Read(F2, Num);
    (*Ищем позицию в массиве, на которой расположено число большее или равное
    тому, которое прочитано из файла. Если такое число найдётся в массиве, тогда
    j будет содержать индекс этого числа. Если такое число
    не найдётся, тогда j окажется на 1 больше, чем i. - Т. е. j будет указывать
    на место, расположенное после последнего значимого элемента массива.*)
    j := 1;
    while (j <= i) and (Arr[j] < Num) do begin
      j := j + 1;
    end;
    if j > i then begin
      (*Вставляем прочитанное из файла число справа от последнего значимого
      элемента массива.*)
      Arr[j] := Num;
    end else begin
      (*Сдвигаем элементы массива, расположенные в позициях i..j
      на 1 позицию вправо.*)
      for k := i downto j do begin
        Arr[k + 1] := Arr[k];
      end;
      (*Вставляем на освободившуюся позицию прочитанное из файла число.*)
      Arr[j] := Num;
    end;
    (*Т. к. мы добавили в массив новое число, то количество значимых элементов
    массива увеличилось на единицу.*)
    i := i + 1;
  end;
 
  (*Теперь записываем элементы массива в третий файл.*)
  Rewrite(F3);
  for j := 1 to i do begin
    if j > 1 then Write(F3, ' ');
    Write(F3, Arr[j]);
  end;
  (*Так как далее следует закрытие файлов, то Flush() в данном случае
  выполнять не обязательно.*)
  Flush(F3);
 
  Close(F1);
  Close(F2);
  Close(F3);
 
  Writeln('Задача выполнена. Обработаны файлы:');
  Writeln(Fn1, ', ', Fn2, ', ', Fn3);
 
  Readln;
end.
Эта программа отрабатывает так:
file1.txt:
0 2 4 6 8 10 12 14 16 18 20
file2.txt:
1 3 5 7 9 11 13 15 17 19
file3.txt:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
---
Здесь перед запуском программы, входные файлы должны быть уже подготовлены - т. е. в них уже должны быть записаны числа. Эти числа можно ввести через какой-нибудь текстовый редактор, например - блокнот Windows (notepad.exe) или через FAR по Shift+F4 и пр.
---
Подходит такой вариант?
3
0 / 0 / 1
Регистрация: 11.06.2010
Сообщений: 64
10.10.2010, 21:46 9
Mawrat,
Спасибо огромное!!!!!!!!!!!!!!!!!!!!!!!!
ТО что нужно!!!!!!!!!!!!!!!!!!
Юхухухух!!!
Здорово то что вы еще коментите действия!!!
0
6 / 6 / 1
Регистрация: 10.10.2010
Сообщений: 71
10.10.2010, 21:50  [ТС] 10
Спасибо что вы есть!
0
34 / 34 / 11
Регистрация: 25.11.2009
Сообщений: 50
13.12.2010, 14:19 11
А у мя вопрос:
1: Можно ли обойтись без массива, записывая из 2х временных файлов в основной напрямую?
2: Чё делать, если у мя вв временных файлах не отсортированный числа, а несколько последовательностей?

Зарание спасибо!)

Добавлено через 2 часа 5 минут
Кароч, не дождался вашего ответа, пришлось написать самому)
Сортировка файла int-значений методом слияния 2х файлов:

Delphi
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
const Nam1='1.temp';
      Nam2='2.temp';
var f,tf1,tf2:file of integer;
    key:integer;
    str:string;
    
//-----------------------------------------------------------------------
procedure Statick();
begin
assign(f,str);
rewrite(f);
write(f,79,76,32,19,8,95,77,87,63,28); 
close(f);
end;
//-------------------------------------------------------------------------
procedure CreateFile(var CFName:string; CFNum:integer);
var CFfil:file;
    CFTemp,CFi:integer;
begin
CFName:=CFNAME+'.mine';
assign(cffil,cfname);
rewrite(cffil);
for cfi:=1 to cfnum do
  begin
  CFTemp:=random(100);
  write(cffil,cftemp);
  end;
close(cffil);  
end;
//-----------------------------------------------------------------------
procedure ReadFile(RFName:string);
var RFfil:file;
    RFTemp:integer;
begin
assign(rffil,rfname);
reset(rffil);
writeln;
while not EOF(rffil) do
  begin
  read(rffil,rftemp);
  write(rftemp,' ');
  end;
close(rffil);    
end;
//-----------------------------------------------------------------------
procedure minim(var m1:integer; var m2:integer);
var mvx:integer;
begin
If m1>m2 then 
  begin
  mvx:=m1;
  m1:=m2;
  m2:=mvx;
  end;
end;
//-----------------------------------------------------------------------
function Devide(Df,df1,df2:file of integer):boolean;
var dtp1, dtp2,
    dkol:integer;
    dfl1,dfl2:boolean;
begin
rewrite(df2);
rewrite(df1);
reset(df);
if EOf(df) then 
  begin
  writeln('Error!!!');
  exit;
  end;
read(df,dtp1);
write(df1,dtp1);
dkol:=1;
while not Eof(df) do
  begin
  read(df,dtp2);
  If dtp2<dtp1 then dkol:=dkol+1;
  If (dkol mod 2)=0 then
    begin
    write(df2,dtp2);
    dfl1:=True;    
    end
  else
    begin
    write(df1,dtp2);
    dfl2:=True;
    end;
  dtp1:=dtp2;
  end;
close(df1);
close(df2);
close(df);
result:= (dfl1 and dfl2);  
end;
//----------------------------------------------------------------------
procedure Concatenate(Cf,cf1,cf2:file of integer);
var ct11, ct12,
    ct21, ct22:integer;
    cfl1,cfl2:boolean;
begin
rewrite(cf);
reset(cf1);
reset(cf2);
read(cf1,ct11);
ct12:=ct11;
read(cf2,ct21);
ct22:=ct21;
//_________________________
while (not EOF(cf1)) and (not Eof(cf2)) do
  begin
  read(cf1,ct12);
  seek(cf1,filepos(cf1)-1);
  read(cf2,ct22);
  seek(cf2,filepos(cf2)-1);
  if ct12<ct11 then cfl1:=True;
  if ct22<ct21 then cfl2:=True;
  if cfl1 and cfl2 then
    begin
    if ct11>ct21 then write(cf,ct21,ct11)
      else write(cf,ct11,ct21);
    read(cf1,ct11);
    read(cf2,ct21);
    cfl1:=False;
    cfl2:=False;    
    continue;
    end;
  if ct11<ct21 then
    begin
    write(cf,ct11);
    if not cfl1 then read(cf1,ct11)
                else
                begin
                write(cf,ct21);
                read(cf2,ct21);
                read(cf1,ct11);
                end;   
    continue;            
    end; 
  if ct11>=ct21 then
    begin
    write(cf,ct21);
    if not cfl2 then read(cf2,ct21)
                else
                begin
                write(cf,ct11);
                read(cf1,ct11);
                read(cf2,ct21);
                end;   
    continue;            
    end;  
  end;
if ct11>ct21 then write(cf,ct21,ct11)
   else write(cf,ct11,ct21); 
if not EOF(cf1) then
  begin
  while not EOF(cf1) do
    begin
    read(cf1,ct12);
    write(cf,ct12);    
    end;
  end;  
if not Eof(cf2) then
  begin
  while not Eof(cf2) do
    begin
    read(cf2,ct22);
    write(cf,ct22);
    end;
   end;   
//_________________________
close(cf1);
close(cf2);
close(cf);  
end;
//-----------------------------------------------------------------------
procedure Sort(sf,sf1,sf2:file of integer);
begin
while Devide(sf,sf1,sf2) do
  begin
  Concatenate(sf,sf1,sf2);
  end;
ReadFile(Nam1);
ReadFile(Nam2);
ReadFile(str);  
end;
//-----------------------------------------------------------------------
begin
//readln(str);
str:='123.mine';
key:=10;
CreateFile(str,key);
ReadFile(str);
assign(f,str);
assign(tf1,Nam1);
assign(tf2,Nam2);
sort(f,tf1,tf2);
end.
PS пагубная привычка не писать коментарии... Так что если чё - задавайте вопросы))))
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2010, 14:19
Помогаю со студенческими работами здесь

Скажите как образом правильно осуществить слияние документов Word?
Всем привет! Скажите как образом правильно осуществить слияние документов ворд? Существуют ли...

Слияние двух циклов в один
Как из двух цыклов сделать 1 втаком коде? var a = 3, b = 5, c = 1, sum1 = 0, ...

Слияние 2х массивов в один с сортировкой
Дали задание слить 2 массива в 3й, таким образом, что б конец первого был началом второго и...

Слияние трёх скриптов в один
Есть три таблицы: READERS(информация о читателях) c полями RDR_ID(номер читателя),Code(отделение,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru