Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка текстовых данных
Форум «Всё о Паскале» > 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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.