Преобразовать типизированный файл - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Дан типизированный файл, число компонент которого кратно четырем. Файл состоит из целых чисел не равных нулю, число положительных компонент файла равно числу отрицательных. Необходимо преобразовать файл так, чтобы два положительных числа чередовались с двумя отрицательными. Без использования массива :-( Прошу помощи
Пытаюсь сделать с помощью доп.файла, но что-то делаю не так
Листинг программы
  1. PROGRAM
  2. lab_def;
  3. USES
  4. crt;
  5. CONST
  6. N = 4;
  7. TYPE
  8. t_file = file of integer;
  9. VAR
  10. fileName1, fileName2: string;
  11. f1, f2: t_file;
  12. procedure new_tfile(const fName: string);
  13. var
  14. a: integer;
  15. i: byte;
  16. begin
  17. assign(f1, fName); rewrite(f1);
  18. for i := 1 to N do begin
  19. readln(a);
  20. write(f1, a);
  21. end;
  22. close(f1);
  23. end;
  24. procedure watch_file(const fName: string);
  25. var
  26. a: integer;
  27. begin
  28. assign(f1, fName); reset(f1);
  29. while not eof(f1) do begin
  30. read(f1, a);
  31. write(a:4, ' ');
  32. end; close(f1);
  33. writeln;
  34. end;
  35. procedure preob_tfile(const fName1, fName2: string);
  36. var
  37. a, b: integer;
  38. i, j, kp, ko, pp, po,k1,k2: longint;
  39. begin
  40. assign(f1, fName1); reset(f1);
  41. assign(f2, fName2); rewrite(f2);
  42. i := 0; j:=0;
  43. pp := 0; po:=0;
  44. kp := 0; ko:=0;
  45. k1 := 0; k2:=0;
  46. while (not eof(f1))or(k1<>k2) do begin
  47. if k1<(n/2) then
  48. seek(f1,i)
  49. else
  50. if k2<(n/2) then begin
  51. seek(f1,po);
  52. inc(po);
  53. end
  54. else begin
  55. seek(f1,pp);
  56. inc(pp);
  57. end;
  58. read(f1, a);
  59. if (a>0) and (kp<2) then begin
  60. pp := i+1;
  61. write(f2, a);
  62. inc(kp); inc(k1); inc(i);
  63. end;
  64. if (a<0)and(kp=2)and(ko<2)then begin
  65. po := j+1;
  66. write(f2, a);
  67. inc(ko); inc(k2); inc(j);
  68. end;
  69. if (kp=2)and(ko=2) then begin
  70. kp := 0; ko := 0;
  71. end;
  72. end; close(f1); close(f2);
  73. end;
  74. BEGIN
  75. clrscr;
  76. write('Full file"s name 1: '); readln(fileName1);
  77. write('Full file"s name 2: '); readln(fileName2);
  78. new_tfile(fileName1);
  79. watch_file(fileName1);
  80. preob_tfile(fileName1,fileName2);
  81. watch_file(fileName2);
  82. readln;
  83. END.
****

Решение задачи: «Преобразовать типизированный файл»

textual
Листинг программы
  1. procedure preob_tfile(const fName: string);
  2. var
  3.   a, b: integer;
  4.   i, j: longword;
  5.   z: boolean;
  6. begin
  7.   assign(f1, fName);
  8.   reset(f1);
  9.   for i := 0 to filesize(f1) - 2 do
  10.     begin
  11.       z := i mod 4 < 2;
  12.       seek(f1, i);
  13.       read(f1, a);
  14.       if z <> (a >= 0) //вариант: if z xor (a >= 0)
  15.         then for j := i + 1 to filesize(f1) - 1 do
  16.           begin
  17.             read(f1, b);
  18.             if z = (b >= 0) //вариант: if not(z xor (a >= 0))
  19.               then begin
  20.                 seek(f1, j);
  21.                 write(f1, a);
  22.                 seek(f1, i);
  23.                 write(f1, b);
  24.                 break
  25.               end
  26.           end
  27.     end;
  28.   close(f1)
  29. end;

Объяснение кода листинга программы

  1. В процедуре preob_tfile заданы две переменные: fName (строка) и f1 (файл).
  2. Выполняется операция присвоения: assign(f1, fName). Это означает, что переменной f1 присваивается значение fName.
  3. Выполняется операция сброса: reset(f1). Эта операция сбрасывает файл в состояние, которое было в момент его создания.
  4. Запускается цикл for, который выполняется 4 раза (от 0 до 3).
  5. Внутри цикла выполняется проверка: z := i mod 4 < 2. Здесь переменная z принимает значение 1, если i является четным числом, и 0 в противном случае.
  6. Выполняется операция seek(f1, i), которая перемещает файловый указатель на позицию i.
  7. Выполняется операция read(f1, a), которая читает из файла a.
  8. Проверяется значение переменной z. Если оно равно 1, то выполняется цикл for, описанный выше. Если значение z равно 0, то переходит к следующему шагу без выполнения дополнительных операций.
  9. Выполняется операция seek(f1, j), которая перемещает файловый указатель на позицию j.
  10. Выполняется операция write(f1, a), которая записывает в файл a.
  11. Если значение переменной z равно 1, то повторяются шаги 9-10 для всех следующих позиций j.
  12. Закрывается файл f1 с помощью операции close(f1).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы