Помощь - Поиск - Пользователи - Календарь
Полная версия: Выделить заголовки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Milena
В строке необходимо,чтоб те слова, которые идут после точки трех(и более) пробелов начинались с большой буквы.
Сижу ,мучаюсь, ничего не получается...
volvo
Milena
Что значит не получается? Значит, что-то пробовали? Где проблема?
Milena
ну жа проьывали...Я не знаю как организовать проверку было перед словом точка с тремя или более пробелами...вот ...
FreeMan
Посимвольно проверяй строку на наличие точки. Если нашла точку, то проверяешь, есть ли там три пробела и, если есть, занимаешься поиском следующего слова, в котором заменяешь первую букву на заглавную
Milena
Ну типа я этим же и руководствовалась вот уже целый час в попытках что-нибудь написать
volvo
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
Цитата
Upcase придется заменить на что-то, что корректно переводит кириллицу в верхний регистр...

разве upcase делает это с глюками?
volvo
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
спасибо ...
но я так думаю, что мнеж все же придется работать со стракой посимвольно, т.е. его элементы будут типа char, ведь у меня может на входе быть громадный текст и весь его надо будет обработать. Что-то только я не понимаю как с символами работать....Может кинить какой-нибудь примерчик , ну чтоб я хоть посмотрела...
volvo
Milena
Значит так: скорее всего, текст будет в текстовом файле. Тогда нужно просто построчно читать файл и прогонять каждую строку через то, что я написал.
FreeMan
volvo, без цитаты не поверил бы, thanks. Щас сяду писать UpCase :D
Jahnerus
Чтобы заменить русские буквы на большие в DOS кодировке проще всего сделать это самому ... ручками ...
Можно задать две строки a='абвгд...' b='АБВГД...' и заменять a[i] на b[i]
volvo
Тогда так:
Код

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
Можно попробовать так
Код
function upcase_rus(var Ch:char):char;
const
 a='абвгд';{весь алфавит до конца!!!}
 b='АБВГД';
begin
 upcase_rus:=b[pos(ch,a)];
end;
volvo
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
Цитата
Можно сделать гораздо удобнее:

ИМХО, идеальный вариант
Milena
я это сделала примерно так как VOLVO...спасибо ребята. Вы мне очень помогли.
Milena
Плиз проверьте прогу...читаю файл по символьно...если делать без проверки на конец файла (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
Спасибо volvo, но я даж не знала про теги....теперь буду знать :-)

Добавлено (30.11.04 12:35):
Ну я и балда...такую глупую ошибку совершила :-) ....Я разобралась :-) rolleyes.gif
volvo
Я немножко изменил программу. У меня отработала без проблем. Попробуй...

Код

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
Всеж не получается у меня ...теперь проблема как сделать так , чтоб в верхний регистр переходили буквы начала строки.
Например, вход - "в полученном детерминированном автомате заключительными становятся те со"
выход-В полученном Детерминированном автомате Заключительными становятся те со"
Вот мой текст проги....подскажите что поменять, что добавить...моя фантазия испарилась
Код

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
Volvo спасибо тебе большое...ты меня так выручаешь. Да я и сама уж заметила эту ошибку...тока теперь у меня еще одна проблема. Смотри выше.
volvo
Milena
Есть идея. Дело в том, что в текстовом файле переход на след. строку кодируется 2-мя символами: #13#10. То есть, тебе нужно ввести новую переменную типа Boolean (например, WasEOLn:Boolean), при считывании символа проверять, не был ли считан #10 и если был, то этой переменной присваивать True.

Смотри свой пост выше - я покажу, как это сделать...
ShadowWatcher
Есть такое предложение:
заменить строки
Код

if ch=' ' then  count:=count+1
else ...

на
Код

If (ch= ' ') Then
 Inc(Count)
Else
 If (ch=#13) Then
   Count := 3
Else ...

Тогда проверка на кол-во предшествующих пробелов сразу выдаст необходимость увеличить букву...
Milena
Прикольно...но проблема то не решилась. Теперь просто становятся заглавными буквы начала строки, но не учитывается тот факт было ли перед ними нужное колическто пробелов в предыдущей строке или нет.
volvo
Milena
Давай сразу полное задание. Хорошие программы не пишутся по частям (сделать одно, добавить второе, исправить третье). С самого начала нужно четко знать все условия и правила. Иначе происходит то, что получилось сейчас... Скорее всего, программу придется переписывать...
Milena
Ну дык задание :Перевести заголовки в верхний регистр. Заголовком считается буква перед которой 3 или больше пробелов....вот

Добавлено (1.12.04 16:55):
исходные данные хранятся в текстовом файле и записываются тож в текстовой файл
volvo
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
Volvo,спасибо большое ...все клево работает :-) Я счастлива :D

Добавлено (2.12.04 16:37):
вот мне сегодня препод задал переделать прогу так, что переводились в верхний регистр тока символы у которых отступ ОТ НАЧАЛА СТРОКИ з или более пробела huh.gif Как тогда будет <_< ?
volvo
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
Нет Volvo....это называется, что препод задал дополнительный вопрос. Спасибо :-)

Добавлено (11.12.04 9:56):
:-( опять меняю задания... Оказывается раньше я его сама не понимала. Так вот заголовок-это когда от НАЧАЛА строки пять или более символов.
Например , дано :
здравствуйте дети
здравствуйте

выход:
ЗДРАВСТВУЙТЕ ДЕТИ
здравствуйте

Вооот...мозгов как всегда сделать не хватает....хелп....

Добавлено (11.12.04 10:35):
вопрос отменяется...у меня получилось УРААААААА
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.