| 
| 
 | Вопрос # 4 950/ вопрос решён / | 
 |  Приветствую, уважаемые эксперты!Посмотрите пожалуйста правильно ли составил на паскале "Задан список из 10 буквенных имен девочек. Получить на месте этого списка новый список, состоящий из тех же ласкательных имен"
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: bayker85 (статус: Посетитель)Вопрос отправлен: 23 января 2011, 16:30
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 18; последнее сообщение — 25 января 2011, 13:40; участников в обсуждении: 6. 
|   | bayker85 (статус: Посетитель), 23 января 2011, 16:33 [#1]:program imena; 
 uses crt;
 
 var
 i: integer;
 s: string;
 c1, c2, c3: char;
 
 begin
 clrscr;
 write('Введите имя: ');
 readln(s);
 i := length(s);
 c1 := 'а'; c2 := 'ш'; c3 := 'я';
 
 if (s[i]) = c1) then
 if (s[i-1] = c2) then
 begin
 s[i] := 'е';
 s := s + 'нька';
 end
 else
 begin
 s[i] := 'о';
 s := s + 'чка';
 end
 else
 if (s[i] = c3) then
 begin
 s[i] := 'е';
 s := s + 'чка';
 end;
 
 writeln('Преобразованное имя = ', s);
 readln;
 end.
 |  
|   | Егор (статус: 10-ый класс), 23 января 2011, 17:53 [#2]:неправильно имя Лиля преобразует не в "Лилечка", а в "Лилочка"
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | min@y™ (статус: Доктор наук), 23 января 2011, 18:03 [#3]:А чо, моя программа не подошла? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Егор (статус: 10-ый класс), 23 января 2011, 18:06 [#4]:упс.  я ошибся.
 
 program imena;
 
uses crt;
 
var
  i: integer;
  s: string;
  c1, c2, c3: char;
 
begin
  clrscr;
  write('Введите имя: ');
  readln(s);
  i := length(s);
  c1 := 'а'; c2 := 'ш'; c3 := 'я';
 
  if (s[i]) = c1) then
    if (s[i-1] = c2) then
      begin
        s[i] := 'е';
        s := s + 'нька';
      end
    else
      begin
        s[i] := 'о';
        s := s + 'чка';
      end
  else
    if (s[i] = c3) then
      begin
        s[i] := 'е';
        s := s + 'чка';
      end;
 
  writeln('Преобразованное имя = ', s);
  readln;
end.код хорошо бы форматировать
 
 правильно. только я бы обошёлся без переменных с1, с2 и с3, а писал бы прямо в тексте программы:
 
   if (s[i]) = 'a') then Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | bayker85 (статус: Посетитель), 23 января 2011, 19:30 [#5]:min@y™: А ты же на дельфи делал. И програмный код не скинул. |  
|   | DeadMoon (статус: Посетитель), 23 января 2011, 19:43 [#6]:Приветствую... собственно я автор этого скромного кода. c1, c2 и  с3 ввел потому что компилятор ругался когда сразу с 'а' сравнивал (хз почему давно в паскале не писал) а сам алгоритм чем можно дополнить??? например к имени "Алсу" или "Любовь" |  
|   | Егор (статус: 10-ый класс), 23 января 2011, 19:58 [#7]: Цитата (DeadMoon): например к имени "Алсу" или "Любовь"ну, думаю, с филологами в этом случае консультироваться надо 
 
 if (s[i]) = c1) thenошибка  одна лишняя закрывающая скобка. 
 
 Цитата (DeadMoon): c1, c2 и с3 ввел потому что компилятор ругался когда сразу с 'а' сравнивал странно. я попробовал напрямую сравнивать - компилятор проглотил спокойно. borland pascal 7.0
 
 ...
  if s[i] = 'а' then
    if (s[i-1] = 'ш') then
...
    else
      if (s[i] = 'я') then
...DeadMoon: на с++ пишем?
   Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | DeadMoon (статус: Посетитель), 23 января 2011, 20:30 [#8]:Егор: на си только начинаем, сам еще студент =) в случае с филологами есть один консультант =)) (девушка у меня филолог). компилятор на паскале какой-то глючный, он временами ругается без причины, со скобкой - возможно погрешность на то, что я сперва слил код байкеру (эму и нужна эта хрень для курсовой), а потом код только попал сюда... ну это все не важно. меня больше интересует вопрос изьянов в алгоритме. Возможно нужно принимать во внимание не только предпоследнюю букву, но и третью с конца. возможно нужно ввести определенное правило по выбору окончаний (нька и чка). проверку на женское имя или мужское я уже не беру во внимание =)
 |  
|   | Егор (статус: 10-ый класс), 23 января 2011, 20:35 [#9]:можно найти список женских имён и на его основании уже составить правила преобразования Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | min@y™ (статус: Доктор наук), 24 января 2011, 08:24 [#10]: Цитата (bayker85): А ты же на дельфи делал. И програмный код не скинул.  Ладно, внесу свои 5 копеек. Вот кусок моей программы:
 
 procedure TMainForm.ForwardConversion;
var
  Index, Len: Integer;
  Suffix: string;
begin
  // Прямое преобразование
  Memo.Lines.BeginUpdate();
  SourceLines.Assign(Memo.Lines);
  try
    for Index:= 0 to Memo.Lines.Count - 1 do
      begin
        Len:= Length(Memo.Lines[Index]);
 
        if (Len > 1) and (Memo.Lines[Index][Len] in ['а', 'я'])
          then begin
                 case Memo.Lines[Index][Len] of
                   'а': if Memo.Lines[Index][Len - 1] <> 'ш'
                          then Suffix:= 'очка'
                          else Suffix:= 'енька';
                   'я': Suffix:= 'ечка';
                 else   Suffix:= '';
                 end; // case
 
                 if Suffix <> ''
                   then Memo.Lines[Index]:= Copy(Memo.Lines[Index], 1, Len - 1) + Suffix;
               end;
      end;
  finally
    Memo.Lines.EndUpdate();
  end;
end;Естественно, он преобразует правильно не все имена, но большинство часто встречающихся. Предлагаю добавить сюда список исключений.Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 24 января 2011, 10:51 [#11]:Посмотрел я на ваши алгоритмы. Плохие они. Ну вот к примеру преобразования имени Маша. Это на самом деле уже уменьшительное. Есть ещё много имен, которые не попадут под правила. Вот к примеру классическое оригинальное имя Ия (для тех кто сомневается - http://ru.wikipedia.org/wiki/Саввина_Ия_Сергеевна)
 Поэтому, если уж такая задача и возникла, нужно решать где то так.
 Составить как можно полнее список имен. их на самом деле не так много, около полутысячи (http://www.andein.ru/ - тут есть списки в текстовой форме).
 Итак, шаг первый - просто составляем массив имен и соответствующие уменьшительные.  Лучше сразу выписывать по несколько вариантов. Программа будет простой
  Дальнейшее улучшение - делим результаты на группы, которые имеют общее поведение. и напротив имен подписываем номер правила.
 Плюс этого метода - мы гарантировано не исковеркаем имя. Мы выведем "имя не в базе, может ошибочка?" А сами можем применить специальный метод сравнения имен и попробовать определить похожее и предложить его.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 24 января 2011, 11:26 [#12]: Цитата (Вадим К): Посмотрел я на ваши алгоритмы. Плохие они. Ой, да ладно! Эта программа пишется вовсе не на века, а совсем даже для "сдал, удалил, забыл".
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | bayker85 (статус: Посетитель), 24 января 2011, 23:40 [#13]:min@y™: Ты прав! Какого хрена мне надо перед всеми именами отчитоваться дла препода!!!!!!! Сделал то что есть и все! А блок схему я не знаю как делать. Вот мой новый програмный код. Посмотрите пожалуйста уважаемые эксперты!!! 
 
 
 program imena;
 
 uses crt;
 
 const
 n = 10;
 
 var
 k, x: integer;
 c1, c2, c3: char;
 a: array [1..n] of string;
 i: array [1..n] of integer;
 
 begin
 
 clrscr;
 
 for k := 1 to n do
 begin
 write('Введите имя', k,': ');
 readln(a[k]);
 
 {writeln('Последняя буква имени = ', s[length(s)]);
 writeln('Предпоследняя буква имени = ', s[length(s)-1]);}
 
 
 i[k] := length(a[k]);
 c1 := 'а'; c2 := 'ш'; c3 := 'я';
 
 if (a[k][i[k]] = c1) then
 if (a[k][i[k]-1] = c2) then
 begin
 a[k][i[k]] := 'е';
 a[k] := a[k] + 'нька';
 end
 else
 begin
 a[k][i[k]] := 'о';
 a[k] := a[k] + 'чка';
 end
 else
 if (a[k][i[k]] = c3) then
 begin
 a[k][i[k]] := 'е';
 a[k] := a[k] + 'чка';
 end;
 
 end;
 writeln;
 for k := 1 to n do
 writeln('Преобразованное имя = ', a[k]);
 writeln;
 readln;
 
 end.
 |  
|   | bayker85 (статус: Посетитель), 24 января 2011, 23:42 [#14]:Помогите блак схему сделать!!! ПЖЛСТ!!!!!!!! |  
|   | bayker85 (статус: Посетитель), 24 января 2011, 23:47 [#15]:Егор: А кто поможет с этим??? Напишите процедуру рисования графика функции. y=arctan x/2 Предусмотреть вывод оцифрованных координатных осей соответственно области построения, подписей к графику. Рационально расположить элементы рисунка (график, оси, цифры и штрихи масштабирования, подписи) на экране.
 |  
|   | bayker85 (статус: Посетитель), 24 января 2011, 23:49 [#16]:С меня пиво!!!!!!!!!!!!!!!!!! |  
|   | min@y™ (статус: Доктор наук), 25 января 2011, 08:30 [#17]: Цитата (bayker85): Напишите процедуру рисования графика функции. y=arctan x/2 Предусмотреть вывод оцифрованных координатных осей соответственно области построения, подписей к графику. Рационально расположить элементы рисунка (график, оси, цифры и штрихи масштабирования, подписи) на экране.  За это пиво предлагаешь?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ерёмин А.А. (статус: *Администратор), 25 января 2011, 13:40 [#18]:bayker85: новые вопросы задавайте отдельно. Если этот вопрос решён, измените его состояние. |  26 января 2011, 13:14: Статус вопроса изменён на решённый (изменил автор вопроса — bayker85) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |