Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2013, 14:47   #1
SOWAA
Пользователь
 
Регистрация: 13.08.2013
Сообщений: 11
По умолчанию паскаль. удаление чисел из типизированного файла.

Созданы два типизированных файла. Удалить из второго файла все те числа, которые содержатся в первом.
у меня не получается удалить из второго файла числа которые содержатся в первом файле)
здесь я только создала эти два типизированных файла)

Код:
program D;
var
  f, f1: file of integer;
  i, n1, m1, n, m: integer;

begin
  Assign(f, 'in.dat');
  Rewrite(f);
  write('Введите  количество элементов: ');
  readln(n);
  for i := 1 to n do
  begin
    write('Введите ', i, ' элемент: ');
    readln(m); 
    write(f, m); 
  end;
  writeln('Файл создан');
  
  Assign(f1, 'in1.dat');
  Rewrite(f1);
  write('Введите  количество элементов: ');
  readln(n1);
  for i := 1 to n1 do
  begin
    write('Введите ', i, ' элемент: ');
    readln(m1);
    write(f1, m1); 
  end;
  writeln('Файл создан');
 
  writeln('Исходный файл 1 :');
  Reset(f);
  while not Eof(f) do
  begin
    read(f, m);
    write(m, ' ');
  end;
  close(f);
  writeln;
  writeln('Исходный файл 2 :');
  Reset(f1);
  while not Eof(f1) do
  begin
    read(f1, m1);
    write(m1, ' ');
  end;
  close(f1);
  writeln;
  
  
 { writeln('Полученный файл:');
  while not Eof(f1) do
  begin
    read(f1, m1);
    write(m1, ' ');
  end;
  writeln;
  Close(f1);
  readln;}
end.

Последний раз редактировалось SOWAA; 19.08.2013 в 15:48.
SOWAA вне форума Ответить с цитированием
Старый 19.08.2013, 15:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от SOWAA Посмотреть сообщение
Созданы два типизированных файла. Удалить из второго файла все те числа, которые содержатся в первом.

Код:
program D;
var
  f, f1: file of integer;
  i, n1, m1, n, m: integer;
...
  close(f1);
  writeln;
end.

Это Вы просто решили с нами поделиться готовым решением или какие-то вопросы есть?...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.08.2013, 15:47   #3
SOWAA
Пользователь
 
Регистрация: 13.08.2013
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Это Вы просто решили с нами поделиться готовым решением или какие-то вопросы есть?...
ой,да..забыла написать))у меня не получается удалить из второго файла числа которые содержатся в первом файле)
здесь я только создала эти два типизированных файла)
SOWAA вне форума Ответить с цитированием
Старый 19.08.2013, 16:03   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

Обобщённо алгоритм может выглядеть так: берём каждое число из второго файла. Проверяем (перебором) его наличие в первом файле, если найдено - то данное число исключаем из второго файла.

Теперь о реализации. Самая быстрая и эффективная реализация будет, если оба файла прочитать в память (например, для небольших файлов можно использовать простые статические массивы), обработать (исключая из массива совпадающие значения). Результат сохранить в выходной файл.

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

Вам какой из алгоритмов ближе/понятнее?
Если Вы хотите разобраться, то я смогу Вам помочь... (написать готовый код за Вас могу, но не хочу, ибо, это, имхо, не очень Вам поможет разобраться в решении!)



разумеется, возможны и другие варианты решения задачи...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.08.2013, 16:22   #5
SOWAA
Пользователь
 
Регистрация: 13.08.2013
Сообщений: 11
По умолчанию

а можно будет сделать например так?:элементы из первого файла,как нибудь записать в какое нибудь множество,а потом из второго файла удалить те элементы которые входят в это множество.?
только вот как можно записать элементы из файла в множество?
SOWAA вне форума Ответить с цитированием
Старый 19.08.2013, 16:43   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
только вот как можно записать элементы из файла в множество?
если их заведомо меньше, чем какое-то небольшое "разумное" число (например, Вы знаете, что размер первого файла меньше, ну например, 10 тысяч чисел), тогда можно написать так:
Код:
const 
  MaxSize = 10000;
var 
  f1: file of integer;
  Mas1 : array[1..MaxSize] of integer;
  i, One, Count1  : integer;
begin
  Assign(f1, 'in1.dat');
  Reset(f1);
  Count1 := FileSize(f1);
  if Count1>MaxSize then begin
       Close(f1); {закрываем исходный файл}
       WriteLn('Количество записей в файле превышает максимально допустимое число (', MaxSize,
                  ')! Останавливаем работу программы! Нажмите Enter для завершения.');
       Readln; (ждём нажатия Enter) 
       Halt(1);  {завершаем выполнение программы с кодом выхода = 1}
  end
  else 
      for i:=1 to Count1 do Read(f1, Mas1[i]);
  Close(f1);
...
и всё. после этого все числа из файла in1.dat уже находятся в массиве Mas1 (причём в переменной Count1 мы храним реальное количество этих чисел!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.08.2013, 17:06   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
элементы из первого файла,как нибудь записать в какое нибудь множество,а потом из второго файла удалить те элементы которые входят в это множество
Если говорить о старом добром паскале, где тип integer 2 байта (-32768..32767), то можно соорудить свой тип-множество (встроенный тип годится только для 256 элементов). "Самодельное" множество требует 8192 байт (всего лишь 8 кб).

Проверьте (тестировал в дельфи):
Код:
type
  m = array [0 .. 8191] of byte;

var
  c: m;
  f1, f2: file of integer;
  n, a, i, k, ByteNumber, BitNumber: integer;
  b: word;

begin
  Assign(f1, 'f1.dat');
  Rewrite(f1);
  write('Введите  количество элементов в 1 файле: ');
  readln(n);
  for i := 1 to n do
  begin
    write('Введите ', i, ' элемент: ');
    readln(a);
    write(f1, a);
  end;
  writeln('Файл 1 создан');
  Assign(f2, 'f2.dat');
  Rewrite(f2);
  write('Введите  количество элементов во 2 файле: ');
  readln(n);
  for i := 1 to n do
  begin
    write('Введите ', i, ' элемент: ');
    readln(a);
    write(f2, a);
  end;
  writeln('Файл 2 создан');
  reset(f1);
  while not eof(f1) do
  begin
    read(f1, a);
    b := a;
    ByteNumber := b div 8;
    BitNumber := b mod 8;
    c[ByteNumber] := c[ByteNumber] or (1 shl BitNumber);
  end;
  close(f1);
  reset(f2);
  i := 0;
  k := 0;
  while not eof(f2) do
  begin
    read(f2, a);
    b := a;
    ByteNumber := b div 8;
    BitNumber := b mod 8;
    if (c[ByteNumber] shr BitNumber) and 1 = 0 then
    begin
      if (i <> k) then
      begin
        Seek(f2, k);
        inc(k);
        write(f2, a);
        Seek(f2, i + 1);
      end
      else
        inc(k);
    end;
    inc(i);
  end;
  Seek(f2, k);
  truncate(f2);
  reset(f2);
  writeln('Полученный файл:');
  while not eof(f2) do
  begin
    read(f2, a);
    write(a, ' ');
  end;
  close(f2);
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.08.2013 в 18:51.
BDA вне форума Ответить с цитированием
Старый 19.08.2013, 18:26   #8
SOWAA
Пользователь
 
Регистрация: 13.08.2013
Сообщений: 11
По умолчанию

спасибо большое! все работает)
но не могли бы вы пожалуйста объяснить что вы делаете,я просто немного не понимаю
Код:
c[ByteNumber] := c[ByteNumber] or (1 shl BitNumber)
Код:
 if c[ByteNumber] shr BitNumber = 0 then
SOWAA вне форума Ответить с цитированием
Старый 19.08.2013, 18:51   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Во-первых, http://comp-science.narod.ru/Progr/mn.htm.
Во-вторых, множество представляет собой битовую маску, в которой каждый бит обозначает какое-либо число.
В-третьих,
Код:
c[ByteNumber] := c[ByteNumber] or (1 shl BitNumber)
Выбирается нужный байт (ByteNumber), и в нем поднимается нужный бит (BitNumber)
В-четвертых, про or, shl и shr - http://pas1.ru/bitarithmetic
В-пятых, нужно исправить строку
Код:
if c[ByteNumber] shr BitNumber = 0 then
на
Код:
if (c[ByteNumber] shr BitNumber) and 1 = 0 then
(я упустил эту ошибку)
Сдвигаем нужный байт на нужное количество бит и "смотрим", чтобы требуемый бит был нулевым (числа нет в первом файле)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.08.2013, 19:56   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, и до кучи решение, о котором говорил я (с массивом)
Код:
Const
  MaxSize = 10000;
var
  f1, f2: file of integer;
  Mas1 : array[1..MaxSize] of integer;
  i, n, k, a, Count1  : integer;

  function NumberAExistInMas1 : boolean;
  var j : integer;
  begin
    NumberAExistInMas1 := true;
    for j:=1 to Count1 do
      if Mas1[j]=a then Exit;
    NumberAExistInMas1 := false;
  end;

begin
  Assign(f1, 'f1.dat');
  Rewrite(f1);
  write('Введите  количество элементов в 1 файле: ');
  readln(n);
  for i := 1 to n do
  begin
    write('Введите ', i, ' элемент: ');
    readln(a);
    write(f1, a);
  end;
  writeln('Файл 1 создан');

  Assign(f2, 'f2.dat');
  Rewrite(f2);
  write('Введите  количество элементов во 2 файле: ');
  readln(n);
  for i := 1 to n do
  begin
    write('Введите ', i, ' элемент: ');
    readln(a);
    write(f2, a);
  end;
  writeln('Файл 2 создан');

  {прочитаем 1-й файл в массив}
  Reset(f1);
  Count1 := FileSize(f1);
  if Count1>MaxSize then begin
       Close(f1); {закрываем исходный файл}
       WriteLn('Количество записей в файле превышает максимально допустимое число (', MaxSize,
                  ')! Останавливаем работу программы! Нажмите Enter для завершения.');
       Readln; {ждём нажатия Enter}
       Halt(1);  {завершаем выполнение программы с кодом выхода = 1}
  end
  else
      for i:=1 to Count1 do Read(f1, Mas1[i]);
  Close(f1);

  reset(f2);
  i := 0;
  k := 0;
  while not eof(f2) do
  begin
    read(f2, a);
    if Not NumberAExistInMas1 then
    begin
      if (i <> k) then
      begin
        Seek(f2, k);
        inc(k);
        write(f2, a);
        Seek(f2, i + 1);
      end
      else
        inc(k);
    end;
    inc(i);
  end;
  Seek(f2, k);
  truncate(f2);

  reset(f2);
  writeln('Полученный файл:');
  while not eof(f2) do
  begin
    read(f2, a);
    write(a, ' ');
  end;
  close(f2);
  readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
паскаль. удаление чисел из типизированного файла. SOWAA Помощь студентам 2 18.08.2013 23:17
Удаление записей из типизированного файла whiskey Общие вопросы Delphi 6 30.10.2010 15:05
Типизированные файлы.Создание, удаление, редактирование, сортировка записей типизированного файла.Паскаль Студент Шиза Помощь студентам 6 08.12.2007 13:41