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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2011, 21:22   #1
soul2
Новичок
Джуниор
 
Регистрация: 07.11.2011
Сообщений: 1
Вопрос файл целых чисел

задание: Дан файл целых чисел. Преобразовать этот файл так, чтобы сначала были числа, кратные трем, затем такие, которые при делении на три дают в остатке единицу, а все остальные удалить из файла.
программа у меня работает, проблема только в том, что я её ввожу с помощью RANDOMIZE, а нужно, чтобы файл целых чисел был изначально. Подскажите, как переделать программку.
Код:
program lab1_b;
var f:file of integer;
    n,i,j,p:integer;
    c,d,x:integer;
    k:byte;
begin
randomize;
assign(f,'file1');
rewrite(f);
write('Введите количество чисел в файле n=');
readln(n);
for i:=1 to n do
 begin
  c:=random(20)-9;
  write(f,c);
 end;
reset(f);
writeln('Содержание исходного файла:');
while not eof(f) do
 begin
  read(f,c);
  write(c,' ');
 end;
writeln;
p:=0;{перестановки}
{переставим кратные 3}
for i:=0 to filesize(f)-1 do
 begin
  seek(f,i);
  read(f,c);
  if c mod 3=0 then{если в остатке 0}
   begin
    p:=p+1;{считаем}
    x:=c;{запоминаем}
    for j:=i downto p do{идем назад}
     begin
      seek(f,j-1);{читаем предыдущее число }
      read(f,d);
      seek(f,j);{вставляем вперед}
      write(f,d);
     end;
    seek(f,p-1);{вставляем на место которое нашли}
    write(f,x);
   end
 end;
{переставим числа, дающие в остатке1}
for i:=0 to filesize(f)-1 do{в начало файла}
 begin
  seek(f,i);
  read(f,c);
  if c mod 3=1 then{если в остатке 1}
   begin
    p:=p+1;{считаем}
    x:=c;{запоминаем}
    for j:=i downto p do{идем назад}
     begin
      seek(f,j-1);{читаем предыдущее число }
      read(f,d);
      seek(f,j);{вставляем вперед}
      write(f,d);
     end;
    seek(f,p-1);{вставляем на место которое нашли}
    write(f,x);
   end
 end;
if (p=0)or(p=filesize(f)) then
   write('Перестановок не было!')
else
 begin
  seek(f,p); {встаем в позицию последнего нужного числа}
  truncate(f); {обрезаем файл}
  writeln('Содержание нового файла:');
  seek(f,0);  
  while not eof(f) do
   begin
    read(f,c);
    write(c,' ');
   end;
  close(f);
 end;
readln
end.
soul2 вне форума Ответить с цитированием
Старый 08.11.2011, 01:18   #2
Костя КС
Пользователь
 
Аватар для Костя КС
 
Регистрация: 22.01.2008
Сообщений: 78
По умолчанию

Я бы сделал иначе. Сначала все числа записываются в массив, он сортируется и только потом перезаписывается в файл.

Код:
program fl;
var
f : text;
mas: array[1..255] of integer;
i,j : byte;
k,k1,k2:byte;
x,p : integer;

begin
assign(f,'1.txt');
reset(f);
k := 0;

while not eof(f) do
 begin
 k := k+1;
  read(f,mas[k]);
 end;
close(f);

//все числа, кратные 3 выносятся в самое начало
p :=0;
k1:=0;
for i:=1 to k do
 if (mas[i] mod 3 =0) then
  begin
    k1 := k1 + 1;
  if i<>k1 then
   begin
    x := mas[k1];
    mas[k1] := mas[i];
    mas[i] := x;
    p := p+1;
   end;
  end;

//первые k1 элементов будут кратными 3ем, поэтому дальше сортируем начиная с k1  
k2:=k1;
for i:=k1 to k do
 if  (mas[i]>3)and(mas[i] mod 3 =1)then
  begin
    k2 := k2 + 1;
  if i<>k2 then begin
    x := mas[k2];
    mas[k2] := mas[i];
    mas[i] := x;
    p := p+1;
    end;
  end;
 k2 := k2 - k1;

rewrite(f);
 for i := 1 to k do
 begin
 write(f,mas[i]);
 if i<k then write(f,' ');
   end;
 close(f);
 
   writeln;
    writeln('кратных 3   :',k1);
     writeln('остаток = 1 :',k2);
      writeln('всего замен :', p);
end.

Последний раз редактировалось Костя КС; 08.11.2011 в 01:27.
Костя КС вне форума Ответить с цитированием
Старый 08.11.2011, 08:52   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
проблема только в том, что я её ввожу с помощью RANDOMIZE, а нужно, чтобы файл целых чисел был изначально. Подскажите, как переделать программку.
Так ломать не строить!

выделите из своей программы тот кусочек вначале, где Вы спрашиваете размер файла и заполняете его случайными числами,
в отдельную программу. Этой программой будете создавать файл целых чисел (его иначе, как программно, не создашь.)
А в своей программе оставьте только открытие и чтение файла:
Код:
begin
  assign(f,'file1');
  reset(f);
  writeln('Содержание исходного файла:');
  while not eof(f) do
  .....
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов в порядке возрастания zzz6 Помощь студентам 1 04.07.2011 12:59
создать файл целых чисел Aimet Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2011 21:00
Создать файл целых чисел с данным именем и записать в него N первых положительных четных чисел prelest' Паскаль, Turbo Pascal, PascalABC.NET 4 01.06.2011 10:27
файл целых чисел. bunny Помощь студентам 2 23.11.2010 21:22
Задан файл f1 целых чисел Andreu123 Паскаль, Turbo Pascal, PascalABC.NET 0 16.05.2010 15:18