IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Работа с файлами, Задача. Замена буквы звёздочкой
BoB@N
сообщение 8.12.2005 19:28
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


Задача:
/В каждом из слов текстового файла замените последнюю букву звёздочкой/

1)Как сделать так,чтобы прога подсчитывала кол-во символов в слове? blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 13)
klem4
сообщение 8.12.2005 19:29
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Разбиение на слова, все способы

Будут конкретные вопросы, задавай.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BoB@N
сообщение 8.12.2005 19:32
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


Ого как быстро!! blink.gif

М
А чего медлить-то ... я просто знаю все ссылки наизусть ...
ну это шутка конечно blum.gif
klem4

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BoB@N
сообщение 8.12.2005 20:40
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


klem4, смотри:
Вот пусть такой простенький первоначальный исходник с надписью в текстовом файле:
“Turbo Pascal Forever”

Код

uses crt;
var
  f: text;
  l: string;

begin
clrscr;
  assign(f, 'd:\text.txt');
  reset(f);
  Read(f,l);
  Writeln(l);
readkey;
end.



Вот пример твоего метода:
Код

const

  limits = [#0..#32,'.',',',':',';','!','?','"'];
type

  TWords = array[1..40] of string;

var
  text : string;
  words : TWords;

function GetWords(s : string; var w : TWords) : byte;
var
  i,back,n : byte;
begin
  i := 1;
  n := 0;
  while(i<=length(s)) do begin
     while(i<=length(s)) and (s[i] in limits) do
      inc(i);
     if i<=length(s) then begin
        back := i;
        while(i<=length(s)) and not(s[i] in limits) do
         inc(i);
        inc(n);
        w[n] := copy(s, back, i-back);
     end;
  end;

  GetWords := n;
end;


Как его применить к данной проге?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 8.12.2005 21:09
Сообщение #5


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


например вот так :
uses crt;

const

limits = [#0..#32,'.',',',':',';','!','?','"'];
type

TWords = array[1..40] of string;

var
txt : string;
words : TWords;
f : text;

function GetWords(s : string; var w : TWords; n : byte) : byte;
var
i,back : byte;
begin
i := 1;
while(i<=length(s)) do begin
while(i<=length(s)) and (s[i] in limits) do
inc(i);
if i<=length(s) then begin
back := i;
while(i<=length(s)) and not(s[i] in limits) do
inc(i);
inc(n);
w[n] := copy(s, back, i-back);
end;
end;

GetWords := n;
end;

var
size : byte;
i : byte;

begin

clrscr;

assign(f, 'c:\test.txt');
reset(f);

size := 0;

while not(eof(f)) do begin
readln(f, txt);
size := GetWords(txt, words, size);
end;

for i := 1 to size do writeln(words[i]);

close(f);

readln

end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 8.12.2005 23:01
Сообщение #6


Гость






BoB@N
Цитата
Как сделать так,чтобы прога подсчитывала кол-во символов в слове?

Ты как раз выбрал не совсем подходящий вариант... По той же ссылке, которую тебе дал klem4, прямо перед его способом есть мой способ, при котором
Цитата
(информация о найденных словах хранится в массиве, но НЕ в виде самих слов, а в виде <начало слова в строке, длина слова>)
Я так понимаю, длина слова это то, что тебе надо?
 К началу страницы 
+ Ответить 
BoB@N
сообщение 9.12.2005 18:49
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


volvo, совершенно верно!
yes2.gif
Только вопрос тот же:
Как применить к исходнику выше... smile.gif

Сообщение отредактировано: BoB@N - 9.12.2005 18:50
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.12.2005 19:07
Сообщение #8


Гость






Цитата
Как применить к исходнику выше

blum.gif
const
delimiter = [#32, ',', '.', '!', ':'];
type
wrd_info = record
start, len: byte;
end;

function get_words(s: string;
var words: array of wrd_info): integer;
var
count: integer;

i, curr_len: byte;

begin
count := -1; i := 1;
while i <= length(s) do begin

while (s[i] in delimiter) and (i <= length(s)) do inc(i);

curr_len := 0;
while not (s[i] in delimiter) and (i <= length(s)) do begin
inc(i); inc(curr_len);
end;

if curr_len > 0 then begin
inc(count);
with words[count] do begin
start := i - curr_len;
len := curr_len
end;
end;

end;
get_words := count + 1;
end;

const
max_word = 255;
var
words: array[1 .. max_word] of wrd_info;
s: string;
i, n: integer;

f: text;

begin
assign(f, 'text.txt');
reset(f);

while not seekeof(f) do begin
readln(f, s);
n := get_words(s, words);
for i := 1 to n do
s[ words[i].start + words[i].len - 1 ] := '*';
writeln(s); { Можно записать в другой файл ... }
end;

close(f)
end.


Проще, не правда ли?
 К началу страницы 
+ Ответить 
BoB@N
сообщение 9.12.2005 22:17
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


Ой, сдесь что-то не так!!! unsure.gif
(Constant out of range.)

Код

begin
 count := -1; i := 1;
 while i <= length(s) do begin
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.12.2005 22:28
Сообщение #10


Гость






Цитата
Ой, сдесь что-то не так!!!

blink.gif У меня работает... Компилятор какой?

Ага... Измени на
var
count: integer;


Странно, FPC пропускает...
 К началу страницы 
+ Ответить 
GoodWind
сообщение 9.12.2005 22:30
Сообщение #11


Автооответчик
*****

Группа: Модераторы
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

Репутация: -  16  +


Цитата
(Constant out of range.)

wacko.gif у тебя переменная count какого типа ? byte... бегом в конспекты и смотреть миниум и максимум для byte lol.gif

добавил позже:
unsure.gif я только что отправил volvo перечитывать конспекты lol.gif lol.gif lol.gif
прости volovo, я думал это его исходник blush.gif

Сообщение отредактировано: GoodWind - 9.12.2005 22:33


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BoB@N
сообщение 9.12.2005 22:48
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


smile.gif Как я понимаю результат проги должен выводится на экран вроде, например: "Turb* Pasca* Foreve*"...
А у меня просто черный экран unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.12.2005 22:51
Сообщение #13


Гость






У тебя в файле последняя строка - пустая? Это глюк Паскаля, если последняя строка файла - НЕ пустая, то она не прочитается через ReadLn(f, ...), так что добавь в файл TXT пустую строку.

P.S. Программа исправлена... Попробуй новую версию...

Сообщение отредактировано: volvo - 9.12.2005 22:58
 К началу страницы 
+ Ответить 
BoB@N
сообщение 10.12.2005 0:14
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


good.gif Да-а-а мне до вас далеко!!! nea.gif
Огромное СПАСИБО!!! smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 10:11
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"