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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2009, 18:28   #1
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию Удаление лишних пробелов. Ввод/вывод в файл.

Здравствуйте, помогите с решением следующей задачи:Убрать из текста лишние пробелы, т.е. там, где они встречаются больше одного раза, оставить один пробел. Вот некоторые нароботки
Код:
program lab15;
uses crt;

procedure InputData;
var FileIn:text;
    S,NameFile:string;
begin
  write('Введите имя файла ');
  read(NameFile);
  assign(FileIn,NameFile);
  reset(FileIn);
end;

function Pos(Substr:string; var S:string):byte;
begin
  while Pos(' ',S)>0 do S[Pos(' ',S)]:='0';
  writeln(S);
end;

procedure Delete(S:string; Index:integer; Count:integer);
begin
  Delete(S,Pos(' ',S),1);
end;

procedure OutputData;
var S:string;
    FileOut:text;
    NameFile:string;
begin
  write('Введите имя файла ');
  read(NameFile);
  {$I-}
  assign(FileOut,NameFile);
  {$I+}
  rewrite(FileOut);
end;

var FileIn,FileOut:text;
    S,Substr:string;
    Index,Count:integer;
begin
  clrscr;
  InputData;
  Pos(Substr,S);
  Delete(S,Index,Count);
  Close(FileIn);
  OutputData;
  Close(FileOut);
end.
Ошибка выходит на функции Pos-переполнение стека. Помогите плз. Заранее большое спасибо!!!
Иван 883 вне форума Ответить с цитированием
Старый 29.03.2009, 18:33   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Оо удивили))
Сами же переопределили функцию pos?)
Теперже она вызывает сама себя) Вот вам и причина трабла.
Код:
function Pos(Substr:string; var S:string):byte;
begin
  while Pos(' ',S)>0 do S[Pos(' ',S)]:='0';
  writeln(S);
end;
Преименуйта, скежем в MyPos:
Код:
program lab15;
uses crt;

procedure InputData;
var FileIn:text;
    S,NameFile:string;
begin
  write('Введите имя файла ');
  read(NameFile);
  assign(FileIn,NameFile);
  reset(FileIn);
end;

function MyPos(Substr:string; var S:string):byte;
begin
  while Pos(' ',S)>0 do S[Pos(' ',S)]:='0';
  writeln(S);
end;

procedure MyDelete(S:string; Index:integer; Count:integer);
begin
  Delete(S,Pos(' ',S),1);
end;

procedure OutputData;
var S:string;
    FileOut:text;
    NameFile:string;
begin
  write('Введите имя файла ');
  read(NameFile);
  {$I-}
  assign(FileOut,NameFile);
  {$I+}
  rewrite(FileOut);
end;

var FileIn,FileOut:text;
    S,Substr:string;
    Index,Count:integer;
begin
  clrscr;
  InputData;
  MyPos(Substr,S); // я так понял вы используете переопределённую функцию?
  MyDelete(S,Index,Count); // и тут?
  Close(FileIn);
  OutputData;
  Close(FileOut);
end.
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 29.03.2009, 18:43   #3
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию

Спасибо, но теперь ругается на строки Close(FIleIn) и Close(FileOut) Пишет что файлы не были открыты
Иван 883 вне форума Ответить с цитированием
Старый 29.03.2009, 18:48   #4
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Потому что вы используете файловые переменные внутри процедур
Код:
program lab15;
uses crt;
var FileIn,FileOut:text;

procedure InputData;
var S,NameFile:string;
begin
  write('Введите имя файла ');
  read(NameFile);
  assign(FileIn,NameFile);
  reset(FileIn);
end;

function MyPos(Substr:string; var S:string):byte;
begin
  while Pos(' ',S)>0 do S[Pos(' ',S)]:='0';
  writeln(S);
end;

procedure MyDelete(S:string; Index:integer; Count:integer);
begin
  Delete(S,Pos(' ',S),1);
end;

procedure OutputData;
var S:string;
    NameFile:string;
begin
  write('Введите имя файла ');
  read(NameFile);
  {$I-}
  assign(FileOut,NameFile);
  {$I+}
  rewrite(FileOut);
end;

var FileIn,FileOut:text;
    S,Substr:string;
    Index,Count:integer;
begin
  clrscr;
  InputData;
  MyPos(Substr,S); // я так понял вы используете переопределённую функцию?
  MyDelete(S,Index,Count); // и тут?
  Close(FileIn);
  OutputData;
  Close(FileOut);
end.
Цитата:
Т.е. нужно так:
Да, нужно так
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг

Последний раз редактировалось Dj_smart; 29.03.2009 в 19:07.
Dj_smart вне форума Ответить с цитированием
Старый 29.03.2009, 19:03   #5
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию

Цитата:
вы используете файловые переменные внутри процедур
Т.е. нужно так:
Код:
function MyPos(Substr:string; var S:string):byte;
begin
  while Pos(' ',S)>0 do S[Pos(' ',S)]:='0';
  writeln(S);
end;

procedure MyDelete(S:string; Index:integer; Count:integer);
begin
  Delete(S,Pos(' ',S),1);
end;

var FileIn,FileOut:text;
    S,Substr,NameFile,NameFile1:string;
    Index,Count:integer;
begin
  write('Введите имя файла ');
  read(NameFile);
  assign(FileIn,NameFile);
  reset(FileIn);
  MyPos(Substr,S);
  MyDelete(S,Index,Count);
  Close(FileIn);
  write('Введите имя файла ');
  read(NameFile1);
  {$I-}
  assign(FileOut,NameFile1);
  {$I+}
  rewrite(FileOut);
  Close(FileOut);
end.
Если так то программа запрашивает имя входного файла, а затем завершает работу
Иван 883 вне форума Ответить с цитированием
Старый 29.03.2009, 19:31   #6
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Иван 883, ты все напутал. Вот объясни мне, чем занимается твоя функция MyPos? Проще написать заново:
Код:
uses crt;

procedure del(var s:string);
var
  n:integer;
begin
  repeat
    n:=pos('  ',s);
    if n>0 then
      delete(s,n,1);
  until n=0;
end;
var
  fin:text;
  fout:text;
  s:string;
begin
  write('Input filename:');
  readln(s);
  assign(fin,s);
  {$I-}
  reset(fin);
  {$I+}
  if IOResult<>0 then
  begin
    writeln('ERROR! File ',s,' not found!');
    readkey;
    exit;
  end;
  write('Output filename:');
  readln(s);
  assign(fout,s);
  rewrite(fout);
  while not eof(fin) do
  begin
    readln(fin,s);
    del(s);
    writeln(fout,s);
  end;
  close(fin);
  close(fout);
end.
А так устроит?
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)

Последний раз редактировалось bag; 29.03.2009 в 19:45.
bag вне форума Ответить с цитированием
Старый 29.03.2009, 19:37   #7
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию

Цитата:
Иван 883, ты все напутал
Где я напутал?
По идее функция myPos преобразовывает пробелы в нули. ЗЫ ее я брал из Help'а в Pascal'еСпасибо за программу, но мне нужно именно через процедуры и функции иначе препод не принимает

Последний раз редактировалось Иван 883; 29.03.2009 в 19:40.
Иван 883 вне форума Ответить с цитированием
Старый 29.03.2009, 19:48   #8
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Иван 883 Посмотреть сообщение
Где я напутал?
По идее функция myPos преобразовывает пробелы в нули.
А тебе че, лишние пробелы нулями заменять надо?
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 29.03.2009, 19:52   #9
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию

Цитата:
А так устроит?
Устроит Ток у меня возникла пара вопросов. Для чего в программе переменная n, и IOresult?
Цитата:
А тебе че, лишние пробелы нулями заменять надо?
Нет не надо, просто по моему так легче их отследить

Последний раз редактировалось Иван 883; 29.03.2009 в 19:55.
Иван 883 вне форума Ответить с цитированием
Старый 29.03.2009, 19:58   #10
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

В n хранится позиция текущей пары пробелов (чтобы кучу раз pos() не вызывать), а в IOResult хранится код ошибки при выполнении операции reset(fin). Если IOResult=0, то ошибок не было.
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление лишних данных в ячейке mistx Microsoft Office Excel 2 24.02.2009 18:32
Ввод и вывод Mihael-Vlz Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 18:00
Строки(удаление пробелов). C language SuccEssoR Помощь студентам 4 15.01.2009 17:13
Консольная программа на Си: ввод, вывод, сортировка, сохранение в текстовый файл. zerg Помощь студентам 8 16.11.2007 12:57