Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 950

/ вопрос решён /

Приветствую, уважаемые эксперты!
Посмотрите пожалуйста правильно ли составил на паскале "Задан список из 10 буквенных имен девочек. Получить на месте этого списка новый список, состоящий из тех же ласкательных имен"

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

bayker85 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: bayker85 (статус: Посетитель)
Вопрос отправлен: 23 января 2011, 16:30
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 18; последнее сообщение — 25 января 2011, 13:40; участников в обсуждении: 6.
bayker85

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™

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

bayker85 (статус: Посетитель), 23 января 2011, 19:30 [#5]:

min@y™: А ты же на дельфи делал. И програмный код не скинул.
DeadMoon

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

DeadMoon (статус: Посетитель), 23 января 2011, 20:30 [#8]:

Егор: на си только начинаем, сам еще студент =) в случае с филологами есть один консультант =)) (девушка у меня филолог). компилятор на паскале какой-то глючный, он временами ругается без причины, со скобкой - возможно погрешность на то, что я сперва слил код байкеру (эму и нужна эта хрень для курсовой), а потом код только попал сюда... ну это все не важно. меня больше интересует вопрос изьянов в алгоритме. Возможно нужно принимать во внимание не только предпоследнюю букву, но и третью с конца. возможно нужно ввести определенное правило по выбору окончаний (нька и чка).
проверку на женское имя или мужское я уже не беру во внимание =)
Егор

Егор (статус: 10-ый класс), 23 января 2011, 20:35 [#9]:

можно найти список женских имён и на его основании уже составить правила преобразования
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

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™

min@y™ (статус: Доктор наук), 24 января 2011, 11:26 [#12]:

Цитата (Вадим К):

Посмотрел я на ваши алгоритмы. Плохие они.

Ой, да ладно! Эта программа пишется вовсе не на века, а совсем даже для "сдал, удалил, забыл".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bayker85

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

bayker85 (статус: Посетитель), 24 января 2011, 23:42 [#14]:

Помогите блак схему сделать!!! ПЖЛСТ!!!!!!!!
bayker85

bayker85 (статус: Посетитель), 24 января 2011, 23:47 [#15]:

Егор: А кто поможет с этим???
Напишите процедуру рисования графика функции. y=arctan x/2 Предусмотреть вывод оцифрованных координатных осей соответственно области построения, подписей к графику. Рационально расположить элементы рисунка (график, оси, цифры и штрихи масштабирования, подписи) на экране.
bayker85

bayker85 (статус: Посетитель), 24 января 2011, 23:49 [#16]:

С меня пиво!!!!!!!!!!!!!!!!!!
min@y™

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)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.04 сек.