Преобразовать типизированный файл - Turbo Pascal
Формулировка задачи:
Здравствуйте. Дан типизированный файл, число компонент которого кратно четырем. Файл состоит из целых чисел не равных нулю, число положительных компонент файла равно числу отрицательных. Необходимо преобразовать файл так, чтобы два положительных числа чередовались с двумя отрицательными.
Без использования массива :-( Прошу помощи
Пытаюсь сделать с помощью доп.файла, но что-то делаю не так
Листинг программы
- PROGRAM
- lab_def;
- USES
- crt;
- CONST
- N = 4;
- TYPE
- t_file = file of integer;
- VAR
- fileName1, fileName2: string;
- f1, f2: t_file;
- procedure new_tfile(const fName: string);
- var
- a: integer;
- i: byte;
- begin
- assign(f1, fName); rewrite(f1);
- for i := 1 to N do begin
- readln(a);
- write(f1, a);
- end;
- close(f1);
- end;
- procedure watch_file(const fName: string);
- var
- a: integer;
- begin
- assign(f1, fName); reset(f1);
- while not eof(f1) do begin
- read(f1, a);
- write(a:4, ' ');
- end; close(f1);
- writeln;
- end;
- procedure preob_tfile(const fName1, fName2: string);
- var
- a, b: integer;
- i, j, kp, ko, pp, po,k1,k2: longint;
- begin
- assign(f1, fName1); reset(f1);
- assign(f2, fName2); rewrite(f2);
- i := 0; j:=0;
- pp := 0; po:=0;
- kp := 0; ko:=0;
- k1 := 0; k2:=0;
- while (not eof(f1))or(k1<>k2) do begin
- if k1<(n/2) then
- seek(f1,i)
- else
- if k2<(n/2) then begin
- seek(f1,po);
- inc(po);
- end
- else begin
- seek(f1,pp);
- inc(pp);
- end;
- read(f1, a);
- if (a>0) and (kp<2) then begin
- pp := i+1;
- write(f2, a);
- inc(kp); inc(k1); inc(i);
- end;
- if (a<0)and(kp=2)and(ko<2)then begin
- po := j+1;
- write(f2, a);
- inc(ko); inc(k2); inc(j);
- end;
- if (kp=2)and(ko=2) then begin
- kp := 0; ko := 0;
- end;
- end; close(f1); close(f2);
- end;
- BEGIN
- clrscr;
- write('Full file"s name 1: '); readln(fileName1);
- write('Full file"s name 2: '); readln(fileName2);
- new_tfile(fileName1);
- watch_file(fileName1);
- preob_tfile(fileName1,fileName2);
- watch_file(fileName2);
- readln;
- END.
****
Решение задачи: «Преобразовать типизированный файл»
textual
Листинг программы
- procedure preob_tfile(const fName: string);
- var
- a, b: integer;
- i, j: longword;
- z: boolean;
- begin
- assign(f1, fName);
- reset(f1);
- for i := 0 to filesize(f1) - 2 do
- begin
- z := i mod 4 < 2;
- seek(f1, i);
- read(f1, a);
- if z <> (a >= 0) //вариант: if z xor (a >= 0)
- then for j := i + 1 to filesize(f1) - 1 do
- begin
- read(f1, b);
- if z = (b >= 0) //вариант: if not(z xor (a >= 0))
- then begin
- seek(f1, j);
- write(f1, a);
- seek(f1, i);
- write(f1, b);
- break
- end
- end
- end;
- close(f1)
- end;
Объяснение кода листинга программы
- В процедуре preob_tfile заданы две переменные: fName (строка) и f1 (файл).
- Выполняется операция присвоения: assign(f1, fName). Это означает, что переменной f1 присваивается значение fName.
- Выполняется операция сброса: reset(f1). Эта операция сбрасывает файл в состояние, которое было в момент его создания.
- Запускается цикл for, который выполняется 4 раза (от 0 до 3).
- Внутри цикла выполняется проверка: z := i mod 4 < 2. Здесь переменная z принимает значение 1, если i является четным числом, и 0 в противном случае.
- Выполняется операция seek(f1, i), которая перемещает файловый указатель на позицию i.
- Выполняется операция read(f1, a), которая читает из файла a.
- Проверяется значение переменной z. Если оно равно 1, то выполняется цикл for, описанный выше. Если значение z равно 0, то переходит к следующему шагу без выполнения дополнительных операций.
- Выполняется операция seek(f1, j), которая перемещает файловый указатель на позицию j.
- Выполняется операция write(f1, a), которая записывает в файл a.
- Если значение переменной z равно 1, то повторяются шаги 9-10 для всех следующих позиций j.
- Закрывается файл f1 с помощью операции close(f1).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д