В строке необходимо,чтоб те слова, которые идут после точки трех(и более) пробелов начинались с большой буквы.
Сижу ,мучаюсь, ничего не получается...
Milena
Что значит не получается? Значит, что-то пробовали? Где проблема?
ну жа проьывали...Я не знаю как организовать проверку было перед словом точка с тремя или более пробелами...вот ...
Посимвольно проверяй строку на наличие точки. Если нашла точку, то проверяешь, есть ли там три пробела и, если есть, занимаешься поиском следующего слова, в котором заменяешь первую букву на заглавную
Ну типа я этим же и руководствовалась вот уже целый час в попытках что-нибудь написать
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.
Цитата
Upcase придется заменить на что-то, что корректно переводит кириллицу в верхний регистр...
разве upcase делает это с глюками?
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.
спасибо ...
но я так думаю, что мнеж все же придется работать со стракой посимвольно, т.е. его элементы будут типа char, ведь у меня может на входе быть громадный текст и весь его надо будет обработать. Что-то только я не понимаю как с символами работать....Может кинить какой-нибудь примерчик , ну чтоб я хоть посмотрела...
Milena
Значит так: скорее всего, текст будет в текстовом файле. Тогда нужно просто построчно читать файл и прогонять каждую строку через то, что я написал.
volvo, без цитаты не поверил бы, thanks. Щас сяду писать UpCase :D
Jahnerus
29.11.2004 22:31
Чтобы заменить русские буквы на большие в DOS кодировке проще всего сделать это самому ... ручками ...
Можно задать две строки a='абвгд...' b='АБВГД...' и заменять a[i] на b[i]
Тогда так:
Код
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;
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
Цитата
Можно сделать гораздо удобнее:
ИМХО, идеальный вариант
я это сделала примерно так как VOLVO...спасибо ребята. Вы мне очень помогли.
Плиз проверьте прогу...читаю файл по символьно...если делать без проверки на конец файла (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]
Спасибо volvo, но я даж не знала про теги....теперь буду знать :-)
Добавлено (30.11.04 12: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.
Всеж не получается у меня ...теперь проблема как сделать так , чтоб в верхний регистр переходили буквы начала строки.
Например, вход - "в полученном детерминированном автомате заключительными становятся те со"
выход-В полученном Детерминированном автомате Заключительными становятся те со"
Вот мой текст проги....подскажите что поменять, что добавить...моя фантазия испарилась
Код
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.
Проверь это
Volvo спасибо тебе большое...ты меня так выручаешь. Да я и сама уж заметила эту ошибку...тока теперь у меня еще одна проблема. Смотри выше.
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
Давай сразу полное задание. Хорошие программы не пишутся по частям (сделать одно, добавить второе, исправить третье). С самого начала нужно четко знать все условия и правила. Иначе происходит то, что получилось сейчас... Скорее всего, программу придется переписывать...
Ну дык задание :Перевести заголовки в верхний регистр. Заголовком считается буква перед которой 3 или больше пробелов....вот
Добавлено (1.12.04 16:55):
исходные данные хранятся в текстовом файле и записываются тож в текстовой файл
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.
Одно замечание - при проверке работы не изменяй текстовые файлы в Паскале. Изменяй их в Блокноте (Паскаль не сохраняет пробелы в конце строки)...
Volvo,спасибо большое ...все клево работает :-) Я счастлива :D
Добавлено (2.12.04 16:37):вот мне сегодня препод задал переделать прогу так, что переводились в верхний регистр тока символы у которых отступ ОТ НАЧАЛА СТРОКИ з или более пробела
Как тогда будет <_< ?
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.
Нет Volvo....это называется, что препод задал дополнительный вопрос. Спасибо :-)
Добавлено (11.12.04 9:56):
:-( опять меняю задания... Оказывается раньше я его сама не понимала. Так вот заголовок-это когда от НАЧАЛА строки пять или более символов.
Например , дано :
здравствуйте дети
здравствуйте
выход:
ЗДРАВСТВУЙТЕ ДЕТИ
здравствуйте
Вооот...мозгов как всегда сделать не хватает....хелп....
Добавлено (11.12.04 10:35):
вопрос отменяется...у меня получилось УРААААААА
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.