Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2009, 15:29   #1
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию работа с фалами на pascal

Добрый день..... Не могли бы вы мне помочь.... Я написал программу, которая преобразовывает строчку по такому принципу: если строка начинается с цифры, то перед ней поставить левую круглую скобку, а в конец строки - правую круглую скобку. Работа программы должна включать ввод пользователем с клавиатуры имен входного и выходного файлов. Результат работы программы сохраняется в выходном файле, а также выводится на экран.
Вот мой исходный код.... но тока он не компилируется... помогите его испправить:


Код:
const
  n=120;
var
  fin:text;
  fout:text;
  read_in,out:char;
  buf,outBuf:array [1..n] of char;
  i:integer;
begin
   repeat
     writeln('input file');
     readln (read_in);
     assign (fin,read_in);
     {$I-}
     reset(fin);
     {$i+}
   until (IOResult <>0);

   writeln ('output file');
   readln(out);
   assign (fout,out);
   rewrite(fout);
   while (not EOF(fin)) do
   begin
     readln (fin,buf[n]);
     if (buf[0]>='0' and buf[0]<='9') then
     begin
       outBuf[0]:='(';
       outBuf:=outBuf[0]+buf[n];
       outBuf:=outBuf+')';
       writeln(fout,outBuf);
     end;
     else
       writeln(fout,buf);
   end;
   writeln('save text in ',out);
   close(fin);
   close(fout);
   readln;
end.
Зарание спасибо....

From Stilet: Тег кода -
Код:
...
Для него кнопка на панели инструментов #

Последний раз редактировалось Stilet; 16.03.2009 в 09:25.
world12_tk вне форума Ответить с цитированием
Старый 15.03.2009, 16:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сначал хотел исправить одно.. но потом нашёл вторую, третью и т.д. ошибки...
вкратце.
1) если вы описали тип char - то там может поместиться ОДНА буква (смотрите имена файлов!)
2) если определили тип buf:array [1..n] of char;
то как можно писать buf[0] ?! там от единицы!
я уже не говорю, что зачем это?!
Когда тут просто просится использование типа string
3) if ... then else перед else НЕ ставится точка с запятой
4) repeat until УСЛОВИЕ - выход из цикла происходит когда условие ВЫПОЛНЯЕТСЯ!!

короче. вот решение. изучайте:
Код:
var
  fin: text;
  fout: text;
  read_in, out_name: string;
  buf: string;
begin

  repeat
    writeln('input file');
    readln(read_in);
    assign(fin, read_in);
    {$I-}
    reset(fin);
    {$I+}
  until (IOResult = 0);

  writeln('output file');
  readln(out_name);
  assign(fout, out_name);
  rewrite(fout);
  while (not EOF(fin)) do
  begin
    readln(fin, buf);
    if ((buf[1] >= '0') and (buf[1] <= '9')) then
      Buf := '(' + Buf + ')';
    writeln(fout, buf);
  end;
  writeln('save text in ', out_name);
  close(fin);
  close(fout);
  readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2009, 02:26   #3
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

огромное спасибо..... но у меня тут возникла огоромная проблема, с которой я не как не могу справиться....глядите:


Код:
program p15;
const N=15;
type
as=array [1..N] of string;
procedure InputNamesOfFiles(var read_in,out_name:string);
begin
  writeln('input file*:');
  readln(read_in);
  writeln('output file*:');
  readln(out_name);
end;

procedure OpenFiles(var read_in,out_name:string; var fin,fout:text);
begin
  assign(fin, read_in);
  {$I-}
  reset(fin);
  {$I+}
  if IOResult <> 0 then
  begin
     writeln ('stop');
     readln;
     halt;
  end;
  assign(fout, out_name);
  rewrite(fout);
end;

procedure ConverterOfLines(const N:integer;var fin,fout:text;var a:as;var k:integer);
var
  buf:string;
  i:integer;
begin
  i:=1;
  while (not EOF(fin)) do
  begin
    readln(fin, buf);
    if ((buf[1] >= '0') and (buf[1] <= '9')) then
      Buf := '(' + Buf + ')';
    a[i]:=buf;
    inc(i);
    k:=i;
  end;
end;

procedure output(const N:integer;a:as; var fout:text; var k:integer);
var
buf:string;
i:integer;
begin
 i:=1;

 while(i<>k) do
 begin
   buf:=a[i];
   writeln(fout, buf);
   inc(i);
 end;
end;
procedure ClosedFiles(read_in,out_name:string;var fin,fout:text);
begin
  close(fin);
  close(fout);
  writeln('save file',read_in,'in file',out_name);
end;

var
  fin: text;
  fout: text;
  read_in, out_name: string;
  a:as;
  k:integer;
begin
  InputNamesOfFiles(read_in,out_name);
  OpenFiles(read_in,out_name,fin,fout);
  ConverterOfLines(N,fin,fout,a,k);
  output(N,a,fout,k);
  ClosedFiles(read_in,out_name,fin,fout);
 end.
Дело в том, что мне нужно запихнуть в отдельную процедуру вывод строк в файл. Сейчас прога работает по такому принципу, только для 15 строк. Но уже при 50 идет переполнение буфера..... Как я понимаю, массив даных здесь не подходит....
Помогите довести до ума....
Заранее спасибо....

Последний раз редактировалось Stilet; 16.03.2009 в 09:26.
world12_tk вне форума Ответить с цитированием
Старый 16.03.2009, 09:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
огромное спасибо.....
пожалуйста. на будущее - если хотите здесь на форуме кому-то сказать спасибо - добавляйте отзыв (это такие "весы" внизу слева под ником/автаром)

Цитата:
Дело в том, что мне нужно запихнуть в отдельную процедуру вывод строк в файл. Сейчас прога работает по такому принципу, только для 15 строк...
1) А где постановка (условия) задачи?!
2) буфер можно и увеличить немного. например, так (вместит 300 строк не длинее 120 символов каждая):
Код:
const N=300;
type
  as=array [1..N] of string[120];
но в принципе, записать в буфер больше, чем его размер, действительно не получится - тут либо менять алогоритм обработки, или, если реально нужно считывать файл целиком в память, то использовать, например, динамическое выделение памяти.
конкретные условия задачи нужны, короче...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2009, 10:16   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Воообще тут массив не нужен. Прочитал строку, обработал и записал. Зачем все-то строки хранить?
puporev вне форума Ответить с цитированием
Старый 16.03.2009, 10:38   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

puporev, коллега, я с Вами полностью согласен!
Но это решение было выше...
Поэтому я спросил точное условие задачи - Вы же знаете, преподаватели часто бывают неадекватны - вводят какие-то идиотские ограничения, доп.условия и прочая, прочая...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2009, 19:35   #7
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
пожалуйста. на будущее - если хотите здесь на форуме кому-то сказать спасибо - добавляйте отзыв (это такие "весы" внизу слева под ником/автаром)
я все понял, я иправлюсь....
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) А где постановка (условия) задачи?!

но в принципе, записать в буфер больше, чем его размер, действительно не получится - тут либо менять алогоритм обработки, или, если реально нужно считывать файл целиком в память, то использовать, например, динамическое выделение памяти.
конкретные условия задачи нужны, короче...
Условие задачи...
написать программу, которая преобразовывает строчку по такому принципу: если строка начинается с цифры, то перед ней поставить левую круглую скобку, а в конец строки - правую круглую скобку. Работа программы должна включать ввод пользователем с клавиатуры имен входного и выходного файлов. Результат работы программы сохраняется в выходном файле, а также выводится на экран.

Сегоня я проконсультировался со своим преподом.... он сказал что это задание надо полностью сделать с помощью динамических переменных.....
world12_tk вне форума Ответить с цитированием
Старый 16.03.2009, 21:13   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сегоня я проконсультировался со своим преподом.... он сказал что это задание надо полностью сделать с помощью динамических переменных.....
ну что я говорил?!!!! Вот каким боком здесь нужны динамические переменные?! ЗАЧЕМ файл считывать в память, если условия задачи этого НЕ ТРЕБУЮТ?!!!!!!!

моя программа в мессадже #2 полностью решает поставленную задачу (пусть и без динамических переменных, которые здесь и не нужны).

в общем, я не могу ничем Вам помочь - потому что какой бы Вы алгоритм "с помощью динамических переменных" не замутили, он всё равно будет сложным, непонятным и, главное, в нём либо прийдётся вводить ограничения на объём обрабатываемых данных, либо, по заполнению буфера сбрасывать его в выходной файл... :-(
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PASCAL - работа с мышью Newnata Паскаль, Turbo Pascal, PascalABC.NET 2 21.02.2011 07:28
Работа с массивами (pascal) dashenka Помощь студентам 21 14.03.2009 13:19
Работа с массивами на pascal Mihael-Vlz Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2008 16:30
работа с сетью, pascal Artificial Паскаль, Turbo Pascal, PascalABC.NET 2 28.05.2008 17:07