Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка текстовых данных
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Earl_Ananiy
Разработать блок-схему алгоритма и составить программу обработки текстовых данных, хранящихся в произвольном файле на магнитном диске. Вид обработки данных ‴Включение в каждую строку заданной последовательности символов после символа с заданным номером‴. Текстовые данные, подлежащие обработке, заносятся в файл с помощью редактора текста. В программе предусмотреть ввод с терминала имен входного и выходного (в случае необходимости) файлов, вывод на печать входного и выходного файлов. Предусмотреть запись выходного файла на диск. Длина строки файла не должна превышать 80 символов.

Помогите доработать мою программу.

program kurs2;
Uses CRT;
Var
f:text;
n,m:string[80];
pos,i:integer;
Begin
clrscr;
writeln('pos');
readln(pos);
writeln('m');
readln(m);
Assign(f,'c:\kurs\input.txt');
reset(f);
read(f,n);
writeln('n=',n);
insert(m,n,pos);
Assign(f,'c:\kurs\output.txt');
rewrite(f);
write(f,n);
writeln('new=',n);
close(f);
readln;
end.

М
Граф Ананий, потрудись прочесть правила, пожалуйста, а также выполнять их (речь о п.5)

Lapp
Вот, как-то так.. Комменты по тексту.
program kurs2;
{никогда не вставляй CRT, если не жизненно важно}
Var
f,g: text; {тебе нужно два файла для параллельного ввода/вывода}
n,m:string[80];
pos,i:integer; {а зачем тебе i?}

Begin
{никогда не очищай экран, если не жизненно важно}
write('pos '); {лучше без Ln, но с пробелом или = в конце}
readln(pos);
write('Insertion '); {лучше не имя переменной, а что-то более говорящее}
readln(m);
{не пиши тут директорию явно, работай в текущей. Кому надо - введут полное имя}
Assign(f,'input.txt'); {вообще-то, имена файлов, кажется, надо было тоже ввести..}
reset(f);;
Assign(g,'output.txt');
rewrite(g);
while not EoF(f) do begin {нужен цикл по строкам до окончания файла}
readLn(f,n); {тут надо ReadLn, а не Read, иначе не прочтет вторую и дальше}
writeln('old=',n);
if Length(n)>=pos then {я бы проверил, есть ли вообще нужный символ..}
insert(m,n,pos+1); {нужно прибавить 1, иначе вставишь перед символом с номером pos}
WriteLn(g,n); {запись в выходной файл, тоже с Ln}
writeln('new=',n); {пересено из конца}
end;
Close(g);
close(f);
readln;
end.

Разбирайся, задавай вопросы. Пожалуйста, обрати внимание на форматирование кода - оно тебе очень поможет в будущем.

Еще одно: у тебя незакрытая файловая переменная f используется для нового файла - это грубая ошибка!
Earl_Ananiy
Цитата
Разбирайся, задавай вопросы. Пожалуйста, обрати внимание на форматирование кода - оно тебе очень поможет в будущем.


Что сделать для обработки, при введении текста с экрана.


тут я применил тэги цитаты и цвета. Нажми "Изменить - полное редактирование" - и увидишь, как. Lapp
Lapp
Цитата(Earl_Ananiy @ 28.01.2010 19:33) *
Что сделать для обработки, при введении текста с экрана.
Неясно, что ты имеешь в виду. Можешь сказать поподробнее? Вместо входного файла - ввод с клавы? да? Немного побольше слов, пожалуйста..


И, пожалуйста, используй тэги. Для кода - code, для цитаты - quote, и т.п. Видишь разные кнопочки над формой ввода? Они обрамляют выделенный текст тэгами. Выдели текст мышкой и нажми, например, B. А потом нажми кнопку предпросмотра (она внизу). Поэкспериментируй.
Earl_Ananiy
Цитата(Lapp @ 28.01.2010 19:41) *

Неясно, что ты имеешь в виду. Можешь сказать поподробнее? Вместо входного файла - ввод с клавы? да? Немного побольше слов, пожалуйста..
И, пожалуйста, используй тэги. Для кода - code, для цитаты - quote, и т.п. Видишь разные кнопочки над формой ввода? Они обрамляют выделенный текст тэгами. Выдели текст мышкой и нажми, например, B. А потом нажми кнопку предпросмотра (она внизу). Поэкспериментируй.


Код
Для ввода с клавиатуры.
Lapp
Цитата(Earl_Ananiy @ 28.01.2010 19:52) *

Код
Для ввода с клавиатуры.


Граф, сделай еще попытку. Эта много понимания не добавила.. smile.gif

P.S.
Тэги кода - для САМОГО кода: Паскаль, Си.. Выбери в меню нужный пункт.
Earl_Ananiy
Цитата(Lapp @ 28.01.2010 20:18) *

Граф, сделай еще попытку. Эта много понимания не добавила.. smile.gif

P.S.
Тэги кода - для САМОГО кода: Паскаль, Си.. Выбери в меню нужный пункт.


Что то я сам запутался.
Lapp
Цитата(Earl_Ananiy @ 28.01.2010 20:25) *
Что то я сам запутался.
Не страшно. smile.gif
Разбирайся, распутывайся.
Побольше экспериментируй.
Earl_Ananiy
Цитата(Lapp @ 28.01.2010 20:37) *

Не страшно. smile.gif
Разбирайся, распутывайся.
Побольше экспериментируй.

Нажмите для просмотра прикрепленного файла

У меня получилось такого вида:
program kurs2;

var
f,g:text;
n,m:string[80];
v,pos:integer;

begin
write('Vvedite vid vvoda dannyh 1 ili 2 ');
readln(v);
if v=1 then
begin
assign(f,'c:\kurs\input.txt');
reset(f);
assign(g,'c:\kurs\output.txt');
rewrite(g);
write('Vvedite nomer pozicii ');
readln(pos);
write('Vvedite vvodimye ');
readln(m);
while not Eof(f) do
begin
readln(f,n);
writeln('old=',n);
if length(n)>=pos then
insert(m,n,pos+1);
writeln(g,n);
writeln('new=',n);
end;
close(g);
close(f);
end
else if v=2 then
begin
write('Vvedite 1-iy text');
readln(f);
write('Vvedite 2-oy text');
readln(g);
write('Vvedite nomer pozicii ');
readln(pos);
write('Vvedite vvodimye ');
readln(m);
while not Eof(f) do
begin
readln(f,n);
writeln('old=',n);
if length(n)>=pos then
insert(m,n,pos+1);
writeln(g,n);
writeln('new=',n);
end;
close(g);
close(f);
end
else
writeln('Oshibka poprobuyte zanovo');

readln;
end.



Но нужно еще доработать.Нажмите для просмотра прикрепленного файла
Lapp
По поводу тэгов - загляни, пожалуйста, вот сюда: Помогите с программкой . И если ты и после этого не будешь обрамлять код тегами - закрою тему за нарушение правил.

И еще, я тебя очень прошу: пожалуйста, пойди в меню Options -> Environment -> Editor и там сними галку с пункта "Use Tab characters". Она мне сегодня попортила несколько литров крови..
Цитата(Earl_Ananiy @ 29.01.2010 9:13) *
Но нужно еще доработать.
Нет, боюсь, что надо переделать, и сильно..

1. Так нельзя писать программы: ты сдублировал практически весь код из-за ввода имен файлов! А теперь представь, что твоя программа производила бы сложные расчеты и ее код занимал бы много страниц - и ты бы его тоже удвоил? blink.gif Или так: тебе понадобилось внести изменения в алгоритм - что, тоже оба менять? Использование одного кода для разных случаев - это одна из главных черт программирования. Постарайся это иметь в виду в дальнейшем.

2. дальше, ты неверно делаешь ввод названий файлов. Ты пытаешься их считывать прямо в файорвую переменную, что совершенно неверно. Их надо читать в строковую переменную, а потом делать Assign, как ты сделал в другом случае. Интересно, что компилятор не смог эту твою ошибку отловить, поскольку в результате получилась допустимая по синтаксису конструкция.. smile.gif

3. Я тебе писал в прошлый раз: не надо писать директорию в имени файла. Запускай программу в той директории, где находится файл, и все будет в порядке. Если ты почему-то не можешь этого делать - так и СКАЖИ по крайней мере.. Тебе понравится, когда твои слова будут игнорировать БЕЗ ЗВУКА?
А вообще, я подозреваю, что ты запускаешь Турбо прямо в директории, где он установлен, отсюда и проблема. Это В КОРНЕ неправильно, постарайся это изжить. Давай обсудим, как именно, если хочешь. Но если я увижу, что опять та же фигня продолжается - я больше не зайду в эту тему..

4. Я подправил некоторые слова.. органически не переношу латиницу, но если уж употребляешь - ну пощади и не пиши "введите вводимые"! Страх и ужас.. (TarasBer, ау! smile.gif ты меня заразил..)

Вот тебе код, разберись и приходи:
program kurs2;
var
f,g:text;
n,m,fName,gName:string[80];
v,pos:integer;

begin
write('Vvedite vhodnoi text (input.txt, esli pusto): ');
readln(fName);
if fName='' then fName:='input.txt';
assign(f,fName);
reset(f);
write('Vvedite vyhodnoi text (output.txt, esli pusto): ');
readln(gName);
if gName='' then gName:='output.txt';
assign(g,gName);
rewrite(g);
write('Vvedite nomer pozicii: ');
readln(pos);
write('Vvedite vstavku: ');
readln(m);
while not Eof(f) do begin
readln(f,n);
writeln('old=',n);
if length(n)>=pos then insert(m,n,pos+1);
writeln(g,n);
writeln('new=',n);
end;
close(g);
close(f);
readln
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.