Помощь - Поиск - Пользователи - Календарь
Полная версия: Перестановка строк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Rocket
Всем привет! В данный момент пытаюсь реализовать следующую задачу: нужно в текстовом файле (кол-во) В строк с позиции(строка) А поменять местами с В строками позиции(строки) С, то есть какбы переставить их местами. А,В,С вводятся с клавиатуры.
Вот мои наработки:

programm perstr;
var a,b,c,j :integer;
f,newf: text;
st:string;

procedure jmp(x: integer);
var i: integer;
s: string;
begin
for i:=1 to x-1 do
readln(f1,s);
end;


begin

assign(f,'xx.txt');
reset(f);

assign(newf,'yy.txt');
reset(newf);

readln(a);
readln(b);
readln©;

for j:=1 to a-1 do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
reset(f);
jmp©;

for j:=1 to b-1 do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
reset(f);
jmp(a+b);

for j:=1 to c-a-b do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
reset(f);
jmp(a);

for j:=1 to b do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
close(newf);

end.


Есть сообщение об ошибке: отсутствует begin. Скажу честно, pascal подзабыл.
Какие будут замечание, предложения по реализации? Как довести это до ума?
volvo
Цитата
Есть сообщение об ошибке: отсутствует begin.
Нет слова Programm в Паскале, поэтому компилятор тебя и не понимает... Убери лишнюю букву и исправляй ошибки дальше (у тебя там еще неописанные переменные есть).
Rocket
Цитата(volvo @ 23.09.2009 13:03) *

Нет слова Programm в Паскале, поэтому компилятор тебя и не понимает... Убери лишнюю букву и исправляй ошибки дальше (у тебя там еще неописанные переменные есть).

Угу, все исправил и дописал, - работает:

program perstr;
var a,b,c,j :integer;
f,newf: text;
st:string;

procedure jmp(x: integer);
var i: integer;
s: string;
begin
for i:=1 to x-1 do
readln(f,s);
end;


begin

assign(f,'xx.txt');
reset(f);

assign(newf,'yy.txt');
rewrite(newf);

readln(a);
readln(b);
readln©;

for j:=1 to a-1 do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
reset(f);
jmp©;

for j:=1 to b do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
reset(f);
jmp(a+b);

for j:=1 to c-a-b do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
reset(f);
jmp(a);

for j:=1 to b do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
reset(f);
jmp(c+b);

while not eof(f) do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
close(newf);

end.


Но, когда я написал отдельную процедуру для записи в новый файл, программа стала работать некорректно.
Исходный файл:
aaa
bbb
ccc
ddd
fff
hhh
jjj
kkk
lll
xxx
yyy
zzz

Новый файл:
aaa
hhh
ddd
ccc
jjj
kkk
lll
xxx
yyy
zzz

А=2, В=2, С=5.
То есть видно, что не записывается по одной строки в каждом обмениваемом блоке.
Вот код:


program code;

var a,b,c,j :integer;
f,newf: text;
st:string;

procedure jmp(x: integer);
var i: integer;
s: string;
begin
for i:=1 to x-1 do
readln(f,s);
end;

procedure work(y: integer);
var i: integer;
s: string;
begin
for i:=1 to y do
readln(f,s);
writeln(newf,s);
end;

begin

assign(f,'xx.txt');
reset(f);

assign(newf,'yy.txt');
rewrite(newf);

readln(a);
readln(b);
readln©;

work(a-1);
close(f);
reset(f);
jmp©;

work(b);
close(f);
reset(f);
jmp(a+b);

work(c-a-b);
close(f);
reset(f);
jmp(a);


work(b);
close(f);
reset(f);
jmp(c+b);

while not eof(f) do
begin
readln(f,st);
writeln(newf,st);
end;

close(f);
close(newf);
end.


Как исправить?
volvo
Цитата
Как исправить?
Не понял... У меня после прогона программы (с твоим файлом) файл YY.TXT принял вот такой вид:
aaa
fff
hhh
ddd
bbb
ccc
jjj
kkk
lll
xxx
yyy
zzz
, то есть, как и запрашивалось...
Rocket
Цитата(volvo @ 23.09.2009 15:12) *

Не понял... У меня после прогона программы (с твоим файлом) файл YY.TXT принял вот такой вид:
aaa
fff
hhh
ddd
bbb
ccc
jjj
kkk
lll
xxx
yyy
zzz
, то есть, как и запрашивалось...

Вы запускали program code , верно?
volvo
Да, именно его.
Rocket
Цитата(volvo @ 23.09.2009 17:18) *

Да, именно его.

Хм... а у меня упорно YY.txt принимает вид:
Цитата

aaa
hhh
ddd
ccc
jjj
kkk
lll
xxx
yyy
zzz

Чертовщина?!
volvo
Скорее, влияет то, что я компилирую FPC 2.2.0... Турбо Паскаль мне пока недоступен.
Lapp
Цитата(volvo @ 23.09.2009 17:38) *
Скорее, влияет то, ...
Явно повлияло то, что в процедуре Work оператор WriteLn выпал из цикла.. smile.gif
Rocket, учись делать правильные отступы, иначе намучишься с такими проблемами. И других намучишь, потому что крыша едет, когда такое смотришь - воистину:
Цитата(Rocket @ 23.09.2009 17:34) *
Чертовщина?!
Но стоит отформатировать - и сразу все становится ясно)).
Lapp
Еще пара замечаний:
1. Не нужно делать Close перед Reset.
2. Для пропуска строки не нужен параметр: ReadLn(f). Соответственно, пропадает надобность в переменной s в процедуре Jmp (которую лучше назвать Jump все же)).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.