Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2015, 00:14   #1
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Радость Замениьть ФИО на Ф и инициалы (TurboPascal)

Всем привет!
Я решил одну задачку, и есть сомнения, что она не пройдёт все тесты (протестировать смогу в пятницу). Вот условие и код:


Письмо

Дан текст-письмо, состоящий из одного или нескольких предложений на русском языке с возможными лидирующими и концевыми пробелами.
Каждое предложение содержит слова, разделённые пробелами, начинается с большой буквы и заканчивается точкой.
Других знаков препинания в предложениях нет. В письме могут встречаться имена собственные вида Фамилия Имя Отчество.

Замените все включения Фамилия Имя Отчество на Фамилия Инициалы.

Формат ввода: одна строка с исходным письмом.
Формат вывода: одна строка с откорректированным письмом.

input.txt
Прошу передать пламенный привет Иванову Ивану Ивановичу.

output.txt
Прошу передать пламенный привет Иванову И.И.

//Также ФИО может стаять где у годно в предложении.


Вот мой код:

Код:
 var
 s: string;
 c,k: array [1..3] of longint;
 t: array [1..3] of string;
 i,j,x,l: longint;
begin
 assign(input,'input.txt');
 reset(input);
 assign(output,'output.txt');
 rewrite(output);

 readln(s);
 s:=' '+s+' ';
 for i:=length(s)-1 downto 2 do                      //делаю цикл от конца предложения
 if (s[i] <> ' ') and (s[i] <> '.') then
 begin
  if (s[i+1] = ' ') or (s[i+1] = '.') then l:=i;     //если нашёл конец слова( так как цикл от конца предложения) слова заношу в l значение i
  if (s[i-1] = ' ') then                                   //если нашёл начало слова( так как цикл от конца предложения) то:
  begin
   if (s[i] >= #128) and (s[i] <= #159) then  // Смотрю или первая буква слова не большая (ФИО пишется с большой буквы)
   begin                  
    inc(x);                                
    c[x]:=l;                                              // В массив c заношу число на котором заканчивается слово
    k[x]:=i;                                               //В массив k заношу на число на котором начинается слово
    t[x]:=copy(s,i,c[x]-i+1);                          //В массив t заношу слово
   end
   else
   begin                                                     // если не большая буква, то всё обнуляю
    x:=0;
    for j:=1 to 3 do c[j]:=0;
    for j:=1 to 3 do t[j]:='';
    continue;
   end;
   if x = 3 then                                           //если у нас будет 3 слова подряд с большой буквы,то значит это ФИО
   for i:=1 to x-1 do                                    // (Слова расположенны задам на перёд, тоесть Отчество, Имя, Фамилия)
 //От отчества до имени  (Фамилию трогать не надо) делаю
   begin
    delete(s,k[i]+1,length(t[i])-1);                 //Удоляю Всё кроме инициала
    insert('.',s,k[i]+1);                                //ставлю перед ним точку
   end;
  end;
 end;
 for i:=length(s)-1 downto 2 do
 if (s[i] = '.') and (s[i-1] = '.') then             //Заглушка если ФИО в конце (а в конце должна быть точка)
 begin
  delete(s,i,1);
  break;
 end;
 delete(s,1,1);                                       //Удоляю пробелы в начале и конце
 delete(s,length(s),1);
 writeln(s);
end.                                                    //Всё :)
Моя прозьба заключается в том, что бы мне ответели правильно ли я решли задачу или где-то что-то не учёл.

Всем зарание спасибо!

Последний раз редактировалось Stilet; 19.03.2015 в 07:38.
VladKB1 вне форума Ответить с цитированием
Старый 19.03.2015, 07:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

"Да здравствует Победа Великая !!!" - орала пьяная Победа Сталинова на лавочке ночью.
Внимание вопрос: Как твой код отработает сие предложение?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2015, 10:08   #3
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от VladKB1 Посмотреть сообщение

. В письме могут встречаться имена собственные вида Фамилия Имя Отчество.

Замените все включения Фамилия Имя Отчество на Фамилия Инициалы.


Цитата:
Сообщение от Stilet Посмотреть сообщение
"Да здравствует Победа Великая !!!" - орала пьяная Победа Сталинова на лавочке ночью.
Внимание вопрос: Как твой код отработает сие предложение?
заданием разве предусмотрены другие имена собственные? и
Цитата:
Сообщение от Stilet Посмотреть сообщение
Победа Сталинова
явно противоречит формату задания.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 19.03.2015, 14:56   #4
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Радость

Цитата:
Сообщение от Stilet Посмотреть сообщение
"Да здравствует Победа Великая !!!" - орала пьяная Победа Сталинова на лавочке ночью.
Внимание вопрос: Как твой код отработает сие предложение?
Предложение должно начинаться с большой буквы и заканчиваться на точку больше знаков нет. Вот это предложение "Да здравствует Победа Великая. Орала пьяная Победа Сталинова на лавочке ночью. " выводит не правильно . Выводит так "Да здравствует Победа В. О. пьяная Победа Сталинова на лавочке ночью.

И как мне это исправить? у меня заносит в массив три слова с большой буквы (Орала, Великая, Победа) и делает из двух инициалы.

Мне типо если точка встретилась, то обнулить х ? да?
VladKB1 вне форума Ответить с цитированием
Старый 19.03.2015, 15:07   #5
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

Цитата:
Сообщение от VladKB1 Посмотреть сообщение
Предложение должно начинаться с большой буквы и заканчиваться на точку больше знаков нет. Вот это предложение "Да здравствует Победа Великая. Орала пьяная Победа Сталинова на лавочке ночью. " выводит не правильно . Выводит так "Да здравствует Победа В. О. пьяная Победа Сталинова на лавочке ночью.

И как мне это исправить? у меня заносит в массив три слова с большой буквы (Орала, Великая, Победа) и делает из двух инициалы.

Мне типо если точка встретилась, то обнулить х ? да?
обнулять после любого разделителя, и наверное брать в массив только если 3 слова ПОДРЯД идут с заглавной буквы (Не думаю что уместо делать сокращение И.О. когда они поразнь встречаются).
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 19.03.2015, 15:39   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
явно противоречит формату задания.
Да чего так?
Цитата:
И как мне это исправить?
А вот это хороший вопрос. Я врядли на него отвечу другими словами кроме ИИ.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2015, 15:51   #7
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Всё исправил эту проблему теперь оно из этого Да здравствует Победа Великая. Орала пьяная Победа Сталинова на лавочке ночью.
Выводит это Да здравствует Победа Великая. Орала пьяная Победа Сталинова на лавочке ночью. Также должно быть? Или я запутался?
Теперь правильно решена?


Код:
var
 s: string;
 c,k: array [1..3] of longint;
 t: array [1..3] of string;
 i,j,x,l: longint;
begin
 assign(input,'input.txt');
 reset(input);
 assign(output,'output.txt');
 rewrite(output);

 readln(s);
 s:=' '+s+' ';
 for i:=length(s)-1 downto 2 do
 if (s[i] <> ' ') and (s[i] <> '.') then
 begin
  if (s[i+1] = ' ') or (s[i+1] = '.') then l:=i;
  if s[i+1] = '.' then
  begin                                 //Добавил условие если нам встретится точка, то мы всё обнулим
   x:=0;
   for j:=1 to 3 do c[j]:=0;
   for j:=1 to 3 do t[j]:='';
   continue;
  end;
  if (s[i-1] = ' ') then
  begin
   if (s[i] >= #128) and (s[i] <= #159) then
   begin
    inc(x);
    c[x]:=l;
    k[x]:=i;
    t[x]:=copy(s,i,c[x]-i+1);
   end
   else
   begin
    x:=0;
    for j:=1 to 3 do c[j]:=0;
    for j:=1 to 3 do t[j]:='';
    continue;
   end;
   if x = 3 then
   for i:=1 to x-1 do
   begin
    delete(s,k[i]+1,length(t[i])-1);
    insert('.',s,k[i]+1);
   end;
  end;
 end;
 for i:=length(s)-1 downto 2 do
 if (s[i] = '.') and (s[i-1] = '.') then
 begin
  delete(s,i,1);
  break;
 end;
 delete(s,1,1);
 delete(s,length(s),1);
 writeln(s);
end.
VladKB1 вне форума Ответить с цитированием
Старый 19.03.2015, 16:11   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Также должно быть?
Цитата:
Замените все включения Фамилия Имя Отчество на Фамилия Инициалы.
ИМХО эта задача при такой постановке не решаемая вообще...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2015, 17:30   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
В письме могут встречаться имена собственные вида Фамилия Имя Отчество.

Замените все включения Фамилия Имя Отчество на Фамилия Инициалы.
Встречаются подряд три слова с большой буквы. Вот это и есть условие. Текст от Виталия условию не соответствует
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.03.2015, 17:55   #10
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Дак мой код вероятнее всего пройдёт все тесты или нет?
VladKB1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
из ФИО - инициалы. функция Roi Microsoft Office Excel 1 15.06.2012 00:20
Выделить из текстового файла ФИО и записать инициалы и фамилию в другой текстовый файл [Паскаль] Chupa-pups Помощь студентам 1 14.12.2010 08:22
Вывести инициалы Aleksandr Общие вопросы Delphi 4 31.05.2010 11:27
Вывести инициалы на ассемблере Marsel737 Помощь студентам 0 27.11.2009 19:03
Фамилия и инициалы BBagi Паскаль, Turbo Pascal, PascalABC.NET 5 18.06.2008 20:42