Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ Выделить заголовки
Автор: Milena 29.11.2004 21:32
В строке необходимо,чтоб те слова, которые идут после точки трех(и более) пробелов начинались с большой буквы.
Сижу ,мучаюсь, ничего не получается...
Автор: volvo 29.11.2004 21:35
Milena
Что значит не получается? Значит, что-то пробовали? Где проблема?
Автор: Milena 29.11.2004 21:39
ну жа проьывали...Я не знаю как организовать проверку было перед словом точка с тремя или более пробелами...вот ...
Автор: FreeMan 29.11.2004 21:45
Посимвольно проверяй строку на наличие точки. Если нашла точку, то проверяешь, есть ли там три пробела и, если есть, занимаешься поиском следующего слова, в котором заменяешь первую букву на заглавную
Автор: Milena 29.11.2004 21:50
Ну типа я этим же и руководствовалась вот уже целый час в попытках что-нибудь написать
Автор: volvo 29.11.2004 22:02
Milena
Вот функция. Попробуй разобраться в алгоритме... (Upcase придется заменить на что-то, что корректно переводит кириллицу в верхний регистр...)
Код
const
s: string = 'this is a . test and. this is not';
var
i, p: byte;
count: integer;
curr_p: integer;
begin
curr_p := 1;
repeat
p := pos('.', copy(s, curr_p, length(s)));
if p > 0 then
begin
count := 0; i := curr_p + p;
while s[i] = ' ' do
begin
inc(count); inc(i)
end;
if count > 2 then s[i] := upcase(s[i])
end;
curr_p := i;
until p = 0;
writeln(s);
end.
Автор: FreeMan 29.11.2004 22:09
Цитата
Upcase придется заменить на что-то, что корректно переводит кириллицу в верхний регистр...
разве upcase делает это с глюками?
Автор: volvo 29.11.2004 22:11
FreeMan
Upcase насколько мне известно (об этом написано в документации на TP) вообще оставляет кириллицу без изменений.
Цитата
Converts a character to uppercase.
Declaration:
function UpCase(Ch: Char): Char;
Remarks:
Ch is an expression of type Char. The result of type Char is Ch converted to uppercase.
Character values not in the range a..z are unaffected.
Автор: Milena 29.11.2004 22:18
спасибо ...
но я так думаю, что мнеж все же придется работать со стракой посимвольно, т.е. его элементы будут типа char, ведь у меня может на входе быть громадный текст и весь его надо будет обработать. Что-то только я не понимаю как с символами работать....Может кинить какой-нибудь примерчик , ну чтоб я хоть посмотрела...
Автор: volvo 29.11.2004 22:22
Milena
Значит так: скорее всего, текст будет в текстовом файле. Тогда нужно просто построчно читать файл и прогонять каждую строку через то, что я написал.
Автор: FreeMan 29.11.2004 22:30
volvo, без цитаты не поверил бы, thanks. Щас сяду писать UpCase :D
Автор: Jahnerus 29.11.2004 22:31
Чтобы заменить русские буквы на большие в DOS кодировке проще всего сделать это самому ... ручками ...
Можно задать две строки a='абвгд...' b='АБВГД...' и заменять a[i] на b[i]
Автор: volvo 29.11.2004 22:31
Тогда так:
Код
Function CheckStr(s: String): String;
var
i, p: byte;
count: integer;
curr_p: integer;
begin
curr_p := 1;
repeat
p := pos('.', copy(s, curr_p, length(s)));
if p > 0 then
begin
count := 0; i := curr_p + p;
while s[i] = ' ' do
begin
inc(count); inc(i)
end;
if count > 2 then s[i] := upcase(s[i])
end;
curr_p := i;
until p = 0;
CheckStr := s;
end;
Var f, fOut: text;
s: string;
Begin
assign(f, 'mytext.txt');
reset(f);
assign(fOut, 'newtext.txt');
rewrite(fOut);
while not seekeof(f) do
begin
readln(f, s);
s := CheckStr(s);
{ Полученную строчку можно вывести на экран, а можно записывать в другой файл...}
WriteLn(fOut, s);
end;
Close(fOut);
Close(f);
End.
Автор: Jahnerus 29.11.2004 22:36
Можно попробовать так
Код
function upcase_rus(var Ch:char):char;
const
a='абвгд';{весь алфавит до конца!!!}
b='АБВГД';
begin
upcase_rus:=b[pos(ch,a)];
end;
Автор: volvo 29.11.2004 22:37
Jahnerus
Можно сделать гораздо удобнее:
Код
Function UpCase(Ch:Char):Char;
Begin
Case Ch Of
'a'..'z':UpCase:=Chr(Ord(Ch)-$20);
'а'..'п':UpCase:=Chr(Ord(Ch)-$20);
'р'..'я':UpCase:=Chr(Ord(Ch)-$50);
Else
UpCase := Ch
End
End;
©
Oleg_Z
Автор: GoodWind 29.11.2004 22:42
Цитата
Можно сделать гораздо удобнее:
ИМХО, идеальный вариант
Автор: Milena 29.11.2004 22:49
я это сделала примерно так как VOLVO...спасибо ребята. Вы мне очень помогли.
Автор: Milena 30.11.2004 17:14
Плиз проверьте прогу...читаю файл по символьно...если делать без проверки на конец файла (not eof),обрабатывается тока одна строка....а с проверкой на конец файла прога зацикливается....
Вот код:
Код
program Verhnii_registr;
uses crt;
var
ch: char;
i : byte;
count:integer;
fin,fout:text;
Function UpStr(S:char):char; {перевод строки в верхний регистр}
Var I:Byte;
Begin
if S in ['a'..'z']
then S := UpCase(S)
else
begin
if S in ['а'..'п']
then
S:=Chr(Ord(S)-$20)
else if S in ['р'..'я']
then S:=Chr(Ord(S)-$50);
end;
UpStr:=S;
end;
begin
clrscr;
assign(fin,'in.txt');
reset(fin);
assign(fout,'out.txt');
rewrite(fout);
count:=0;
while not eof(fin) do
while not eoln(fin) do begin
read (fin,ch);
if ch=' ' then count:=count+1
else if count>2 then begin
ch:= UpStr(ch);
count:=0;
end;
write(fout,ch);
end;
close(fin);
close(fout);
end.
Не забывай теги [ code] [ /code]
Автор: Milena 30.11.2004 17:26
Спасибо volvo, но я даж не знала про теги....теперь буду знать :-)
Добавлено (30.11.04 12:35):
Ну я и балда...такую глупую ошибку совершила :-) ....Я разобралась :-)
Автор: volvo 30.11.2004 17:35
Я немножко изменил программу. У меня отработала без проблем. Попробуй...
Код
program Verhnii_registr;
uses crt;
var
ch: char;
i : byte;
count:integer;
fin,fout:text;
Function UpStr(S:char):char; {перевод строки в верхний регистр}
Var I:Byte;
Begin
if S in ['a'..'z']
then S := UpCase(S)
else
begin
if S in ['а'..'п']
then
S:=Chr(Ord(S)-$20)
else if S in ['р'..'я']
then S:=Chr(Ord(S)-$50);
end;
UpStr:=S;
end;
begin
clrscr;
assign(fin,'in.txt');
reset(fin);
assign(fout,'out.txt');
rewrite(fout);
count:=0;
while not eof(fin) do
begin
read (fin,ch);
if ch=' ' then count:=count+1
else begin
if count>2 then ch:= UpStr(ch);
count:=0;
end;
write(fout,ch);
end;
close(fin);
close(fout);
end.
Автор: Milena 30.11.2004 22:44
Всеж не получается у меня ...теперь проблема как сделать так , чтоб в верхний регистр переходили буквы начала строки.
Например, вход - "в полученном детерминированном автомате заключительными становятся те со"
выход-В полученном Детерминированном автомате Заключительными становятся те со"
Вот мой текст проги....подскажите что поменять, что добавить...моя фантазия испарилась
Код
program Verhnii_registr;
uses crt;
var
ch: char;
i : byte;
count:integer;
fin,fout:text;
Function UpStr(S:char):char; {перевод строки в верхний регистр}
Var I:Byte;
Begin
if S in ['a'..'z']
then S := UpCase(S)
else
begin
if S in ['а'..'п']
then
S:=Chr(Ord(S)-$20)
else if S in ['р'..'я']
then S:=Chr(Ord(S)-$50);
end;
UpStr:=S;
end;
Var
wasEOLn: boolean;
begin
clrscr;
assign(fin,'in.txt');
reset(fin);
assign(fout,'out.txt');
rewrite(fout);
count:=0; wasEOLn := False;
while not eof(fin) do
begin
read (fin,ch);
If wasEOLn then ch := UpStr(ch);
if ch=' ' then count:=count+1
else begin if count>2 then begin
ch:= UpStr(ch);
count:=0;
end
else count:=0;
end;
write(fout,ch);
wasEOLn := (ch = #10)
end;
close(fin);
close(fout);
end.
Проверь это
Автор: Milena 30.11.2004 22:47
Volvo спасибо тебе большое...ты меня так выручаешь. Да я и сама уж заметила эту ошибку...тока теперь у меня еще одна проблема. Смотри выше.
Автор: volvo 30.11.2004 22:57
Milena
Есть идея. Дело в том, что в текстовом файле переход на след. строку кодируется 2-мя символами: #13#10. То есть, тебе нужно ввести новую переменную типа Boolean (например, WasEOLn:Boolean), при считывании символа проверять, не был ли считан #10 и если был, то этой переменной присваивать True.
Смотри свой пост выше - я покажу, как это сделать...
Автор: ShadowWatcher 30.11.2004 22:57
Есть такое предложение:
заменить строки
Код
if ch=' ' then count:=count+1
else ...
на
Код
If (ch= ' ') Then
Inc(Count)
Else
If (ch=#13) Then
Count := 3
Else ...
Тогда проверка на кол-во предшествующих пробелов сразу выдаст необходимость увеличить букву...
Автор: Milena 1.12.2004 21:03
Прикольно...но проблема то не решилась. Теперь просто становятся заглавными буквы начала строки, но не учитывается тот факт было ли перед ними нужное колическто пробелов в предыдущей строке или нет.
Автор: volvo 1.12.2004 21:19
Milena
Давай сразу полное задание. Хорошие программы не пишутся по частям (сделать одно, добавить второе, исправить третье). С самого начала нужно четко знать все условия и правила. Иначе происходит то, что получилось сейчас... Скорее всего, программу придется переписывать...
Автор: Milena 1.12.2004 21:49
Ну дык задание :Перевести заголовки в верхний регистр. Заголовком считается буква перед которой 3 или больше пробелов....вот
Добавлено (1.12.04 16:55):
исходные данные хранятся в текстовом файле и записываются тож в текстовой файл
Автор: volvo 1.12.2004 22:03
Milena
Прогонял эту программу по десятку файлов, на всех она отработала...
Код
program Verhnii_registr;
uses crt;
var
ch: char;
i : byte;
count:integer;
fin,fout:text;
Function UpStr(S:char):char;
Var I:Byte;
Begin
if S in ['a'..'z']
then S := UpCase(S)
else
begin
if S in ['а'..'п']
then
S:=Chr(Ord(S)-$20)
else if S in ['р'..'я']
then S:=Chr(Ord(S)-$50);
end;
UpStr:=S;
end;
begin
clrscr;
assign(fin,'in.txt');
reset(fin);
assign(fout,'out.txt');
rewrite(fout);
count:=0;
while not eof(fin) do
begin
read (fin,ch);
if ch=' ' then count:=count+1
else
if not (ch in [#10, #13]) then
begin
if count>2 then ch:= UpStr(ch);
count:=0;
end;
write(fout,ch);
end;
close(fin);
close(fout);
end.
Одно замечание - при проверке работы не изменяй текстовые файлы в Паскале. Изменяй их в Блокноте (Паскаль не сохраняет пробелы в конце строки)...
Автор: Milena 1.12.2004 22:53
Volvo,спасибо большое ...все клево работает :-) Я счастлива :D
Добавлено (2.12.04 16:37):
вот мне сегодня препод задал переделать прогу так, что переводились в верхний регистр тока символы у которых отступ ОТ НАЧАЛА СТРОКИ з или более пробела Как тогда будет <_< ?
Автор: volvo 2.12.2004 21:51
Milena
Ну и как это называется? Опять меняем задание?
Код
program Verhnii_registr;
uses crt;
var
ch: char;
i : byte;
count:integer;
fin,fout:text;
Function UpStr(S:char):char;
Var I:Byte;
Begin
if S in ['a'..'z']
then S := UpCase(S)
else
begin
if S in ['а'..'п']
then
S:=Chr(Ord(S)-$20)
else if S in ['р'..'я']
then S:=Chr(Ord(S)-$50);
end;
UpStr:=S;
end;
begin
clrscr;
assign(fin,'in.txt');
reset(fin);
assign(fout,'out.txt');
rewrite(fout);
count:=0;
while not eof(fin) do
begin
read (fin,ch);
if ch = #10 then count := 0
else
if ch = ' ' then inc(count, byte(count <> -1))
else
begin
if count > 2 then ch := upstr(ch);
count := -1;
end;
write(fout,ch);
end;
close(fin);
close(fout);
end.
Автор: Milena 2.12.2004 22:44
Нет Volvo....это называется, что препод задал дополнительный вопрос. Спасибо :-)
Добавлено (11.12.04 9:56):
:-( опять меняю задания... Оказывается раньше я его сама не понимала. Так вот заголовок-это когда от НАЧАЛА строки пять или более символов.
Например , дано :
здравствуйте дети
здравствуйте
выход:
ЗДРАВСТВУЙТЕ ДЕТИ
здравствуйте
Вооот...мозгов как всегда сделать не хватает....хелп....
Добавлено (11.12.04 10:35):
вопрос отменяется...у меня получилось УРААААААА