Помогите решить. Работа с файлами

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Benera
Сообщения: 2
Зарегистрирован: 28 сен 2007, 21:17

Колядин Максим, ПОМОГИТЕ РЕШИТЬ ЗАДАЧУ :)
ДАН ФАЙЛ ВЕЩЕСТВЕННЫХ ЧИСЕЛ. пЕРЕПИСАТЬ В НОВЫЙ ВСЕ КОМПОНЕНТЫ, РАСПОЛОЖЕННЫЕ ПОСЛЕ ПЕРВОЙ ОТРИЦАТЕЛЬНОЙ.
Венера
Benera
Сообщения: 2
Зарегистрирован: 28 сен 2007, 21:17

ДАН ФАЙЛ ВЕЩЕСТВЕННЫХ ЧИСЕЛ. ПЕРЕПИСАТЬ В НОВЫЙ ВСЕ КОМПОНЕНТЫ, РАСПОЛОЖЕННЫЕ ПОСЛЕ ПЕРВОЙ ОТРИЦАТЕЛЬНОЙ.
Венера
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Ржунемагу студентики зажигают в не том разделе, скоро паровозиком сюда ходить станут
Аватара пользователя
Новенький
Сообщения: 73
Зарегистрирован: 01 июн 2007, 17:35
Откуда: Чусовой (Пермский край)
Контактная информация:

Вот код программы:

Код: Выделить всё

uses crt; {подключение модулей}
var f,f2:text; {текстовые файлы}
    i,j,chislo,chislo2:integer; {счетчики, переменные для чисел}
begin
  clrscr; {очистка экрана}
  randomize; {включение режима случайных чисел}
  assign(f,'file1.txt'); {размещение первого файла}
  assign(f2,'file2.txt'); {размещение второго файла}
  {открытие файлов для записи}
  rewrite(f);
  rewrite(f2);

  {заполняем первый файл случайными числами}
  for i:=1 to 30 do
    begin
      chislo:=random(50)-10;
      writeln(f,chislo);
    end;

  close(f); {закрываем первый файл}
  reset(f); {открываем первый файл для чтения}
  while not eof(f) do {пока не достигнут конец файла}
    begin
      readln(f,chislo); {считываем число из файла в переменную}
      if chislo<0 {если число меньше 0}
      then begin
        writeln(f2,chislo); {то записываем это число во второй файл}
        {а так же все остальные числа}
        while not eof(f) do
          begin
            readln(f,chislo2);
            writeln(f2,chislo2);
          end;
      end;
    end;
  close(f2); {закрываем второй файл}
  close(f); {закрываем первый файл}
end.
Программирование - хорошая штука
Denton
Сообщения: 9
Зарегистрирован: 25 окт 2007, 19:51

Вот еще задачка:
Даны два файла - А и В: целых чисел. Файл А - отсортирован по возрастанию; файл В - отсортирован по убыванию. Произвести слияние двух файлов в файле С таким образом, чтобы файл С был упорядочен по возрастанию. Слияние производить в соответствии с упорядоченностью А и В.(т.е сравнивать первое число первого файла с последним второго, и навстречу друг другу).

Помогите плз :)
Denton
Сообщения: 9
Зарегистрирован: 25 окт 2007, 19:51

Вот та же задачка но с массивами:

uses crt;
const n=10; m=15;
var A:array[1..n] of integer; k,c,i,j,z,d:integer;
B:array[1..m] of integer; p:boolean;
X:array[1..n+m] of integer;
begin clrscr;
writeln('Welcome! This program connects two ranked arrays and disposes them on growth');
writeln('Press any key to continue'); readkey; writeln;
randomize;
for i:=1 to n do
A:=-100+random(200);
k:=n;
repeat
p:=true; dec(k);
for i:=1 to k do
if a>a[i+1] then
begin
c:=a;
a:=a[i+1];
a[i+1]:=c;
p:=false;
end
until p; writeln('This is a first array sorted on growth:');
for i:=1 to n do
write(A,' '); readln;
for i:=1 to m do
B:=-50+random(100);
k:=m;
repeat
p:=true; dec(k);
for i:=1 to k do
if B<B[i+1] then
begin
c:=B;
B:=B[i+1];
B[i+1]:=c;
p:=false;
end;
until p; writeln; writeln('This is a second array sorted on decrease:');
For i:=1 to m do
write(B,' '); readkey; writeln;

i:=1; d:=m;

For j:=1 to n+m do
begin
If (i<=n) and (d>=1) then
If A[i]<B[d] then
begin
X[j]:=A[i];
inc(i);
end
else
begin
X[j]:=B[d];
dec(d);
end
else
if d < 1
then begin
X[j]:= A[i];
inc(i);
end
else if i > N
then begin
X[j]:= B[d];
dec(d);
end;
end;



writeln; writeln('Finaly, is an united array sorted on growth manually:');

For j:=1 to n+m do
write(X[j],' ');
readkey;
writeln; writeln; writeln('Press any key to exit'); readkey;

end.


А нужно с файлами. Как теперь её адаптировать?
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

A, B : file of Integer;

тогда размер файла даст Вам количество записей.
файл A просто читать, файл B - перед каждым чтением делать seek на нужную запись (сначала на последнюю, потом на предпоследнюю и т.д. - аналог того, что в программе про массивы достаётся через B[d] ... )
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

A, B : file of Integer;

тогда размер файла даст Вам количество записей.
файл A просто читать, файл B - перед каждым чтением делать seek на нужную запись (сначала на последнюю, потом на предпоследнюю и т.д. - аналог того, что в программе про массивы достаётся через B[d] ... )
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

В начале кода добавляй:

Код: Выделить всё

var f,f2: file of integer;
И замени это
...
randomize;
for i:=1 to n do
A:=-100+random(200);
....

На это

Код: Выделить всё

i:=1;
assign(f, 'input1.txt'); reset(f);
while not eof(f) do begin
readln(f,A[i]);
inc(i);
end;
close(f);
[hr]
Это
for i:=1 to m do
B:=-50+random(100);

На это:

Код: Выделить всё

i:=1;
assign(f, 'input2.txt'); reset(f);
while not eof(f) do begin
readln(f,B[i]);
inc(i);
end;
close(f);
И наконец, записываем в файл. Меняй
writeln; writeln('Finaly, is an united array sorted on growth manually:');

For j:=1 to n+m do
write(X[j],' ');
readkey;
writeln; writeln; writeln('Press any key to exit'); readkey;
На

Код: Выделить всё

assign(f2,'output.txt'); rewrite(f2);
for i:= 1 to n+m do writeln(f2, X[i]);
close(f2);
Фсе! Я код не смотрел, просто заменил рандомное заполнение массива на считывание элементов из файлов input1.txt и input2.txt. А вместо вывода ответа на экран - запись в output.txt.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

1) ошибка - Readln применимо ТОЛЬКО к файлам типа text
надо использовать Read
2) способ вполне рабочий. Использовать массивы. Но есть один нюанс - конструкции типа
while not eof(f) do begin
теряют всякий смысл -- ибо массивы обявлены строго A - 10 чисел, B - 15 чисел.
Если в файле будет больше чисел - вылетит ошибка записи в массив Range out
Кроме того, при достаточно больших файлах (ну скажем по 60 тысяч чисел) этот метод вообще не применим...
Ответить