Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Выделить заголовки

Автор: 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):
Ну я и балда...такую глупую ошибку совершила :-) ....Я разобралась :-) rolleyes.gif

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

Автор: 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):
вопрос отменяется...у меня получилось УРААААААА