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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2010, 15:25   #1
Morzik8
Пользователь
 
Регистрация: 06.03.2010
Сообщений: 12
По умолчанию Строки.(Паскаль)

Задание:"Проверить является ли заданный текст перестановкой начального отрезка латинского алфавита."

В общем меня подловили что при вводе "отрезка алфавита" если я ввожу например abcf - (т.е я пропустил 1 букву выводит "Да") как поправить я не пойму.Кроме данной недоработки все отлично.
Мне предложили ввести константу всего алфавита. но все ровно понять не могу. очень прошу помочь

Код:
uses crt;
var s:string;
    m:set of char;
    i,k:byte;
begin
clrscr;
writeln('Текст:');
readln(s);
if not(length(s) in [1..26])or (pos('a',s)=0)then
 begin
  write('Нет!');
  readln;
  exit;
 end;
k:=0;
m:=[];
for i:=1 to length(s) do
if (s[i] in ['a'..'z'])and not (s[i] in m) then
 begin
  k:=k+1;
  m:=m+[s[i]];
 end;
if k=length(s) then write('Да!')
else write('Нет!');
readln
end.

Последний раз редактировалось Morzik8; 29.03.2010 в 17:12.
Morzik8 вне форума Ответить с цитированием
Старый 29.03.2010, 16:19   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Код:
uses crt;
var s:string;
    i:byte;
    yes:boolean;
begin
clrscr;
yes:=true;
writeln('Vvedite stroky');
readln(s);
if not(length(s) in [1..26])or (pos('a',s)=0)then
 begin
  write('NET');
  readln;
  exit;
 end;
for i:=1 to length(s) do
 begin
  if i<>length(s) then
   if ord(s[i])-ord(s[i+1])<>-1 then yes:=false;
 end;
if yes then writeln('DA')
else write('NET');
readln
end.
SERG1980 вне форума Ответить с цитированием
Старый 29.03.2010, 17:07   #3
Morzik8
Пользователь
 
Регистрация: 06.03.2010
Сообщений: 12
По умолчанию

SERG1980, да теперь у нас получается именно, но теперь дапустим перестановка от abcd =da ; acbd=net а должно быть да.... это тоже является перестановкой отрезка алфавита!

Последний раз редактировалось Morzik8; 29.03.2010 в 17:10.
Morzik8 вне форума Ответить с цитированием
Старый 29.03.2010, 17:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я не очень понял, что значит "начальный отрезок алфавита",

но я бы предложил Вам взять границы вашего отрезка (ну, например, минимальную и максимальную букву из введённого текста), потом заполнил множество.
а потом брал из введённой строчки буковки и по одной удалял из из множества, если они там есть.
Если дошли до конца строчки - значит введённую строчку МОЖНО получить перестановкой,
если же встретили букву, которой НЕТ в множестве - прерываем цикл - нельзя сформировать...
примерно, так:
Код:
var Otrezok : set of char;
  ch : char;
  s : string;
  i : integer;
begin
  WriteLn('Введите отрезок (ДВЕ буквы - начальную и конечную!): '); 
  Readln(s);
  if length(s)<>2 then begin
     WriteLn('Неверный ввод границ отрезка!');
     WriteLn('Ну я же просил - ДВЕ буквы.. :(');
     halt(100); 
  end;

  for ch:=s[1] to s[2] do 
    include(Otrezok, ch);

  WriteLn('Введите проверяемый набор букв: ');
  Readln(s);

  i:=1;
  while (i<=Length(s)) and (s[i] in Otrezok) do begin
    exclude(Otrezok, s[i]);
    inc(i);
  end;

  if (i<=Length(s)) then WriteLn('Нет, нельзя получить!')
  else WriteLn('Можно!');

  Readln; 
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2010, 11:51   #5
Morzik8
Пользователь
 
Регистрация: 06.03.2010
Сообщений: 12
По умолчанию

Спасибо конечно за старание. но опять находится недочет берем например отрезок c 2 буквами (ae) вводим abc ответ положительный, но буквы то нахватает!
В общем программа должна кричать НЕТ на такие вещи как вводим (abcdef) дапустим, ложным будет утверждение если
1) Пропущена одна или более букв из отрезка алфавита (a-f)
2)Буква повторяется
3)Пустая строка
4) 1 буква.

А удовлетворять тогда, когда например производные из отрезка
(abcdef) такие как (abcefd) , (fedcba).
Morzik8 вне форума Ответить с цитированием
Старый 30.03.2010, 12:20   #6
Google2010
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 316
По умолчанию

вроде работает)
Код:
var a:array['a'..'z'] of integer;
 c,c1:char;
 s:string;
 i:integer;
 f:boolean;
begin
  readln(s);
  for c := 'a' to 'z'  do
    a[c]:=1;
  for I := 1 to Length(s)  do
    a[s[i]]:=a[s[i]]-1;
  f:=true;c1:='z';
  for c := 'a' to 'z'  do
    if a[c]<>0 then begin c1:=c; break; end;
  for c := c1 to 'z'  do
     if a[c]<=0 then begin f:=false; break;end;
 if length(s)=1 then f:=false;  
 if f then writeln('yes')
   else writeln('no');
  
   readln;
end.
ну а вот вариант с константой всего алфавита
Код:
  const al = 'abcdefghijklmnopqrstuvwxyz' ;
 var
 s,s1:string;
 i:integer;
 f:boolean;
 begin
   readln(s); f:=true;
   if length(s)=1 then f:=false;
   s1:=al;
   if f then
      for I := 1 to Length(s) do
        if pos(s[i],s1)<>0 then delete(s1,pos(s[i],s1),1)
        else
          begin f:=false;break;end;

   if f and (pos(s1,al)<>0) then writeln('yes')
     else writeln('no');
   readln;
end.

Последний раз редактировалось Google2010; 30.03.2010 в 12:37.
Google2010 вне форума Ответить с цитированием
Старый 30.03.2010, 13:58   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Morzik8
берем например отрезок c 2 буквами (ae)
Morzik8, это Вы про мою программу?
1) Вы не ответили, что значит "начальный отрезок алфавита"
2) я думал (в моей программе смотрите, как изначально заполняется множесто) ,что если Вы вводите отрезок "АЕ" - это означает, что в отрезок входят ВСЕ буквы от А до Е (ABCDE) — поэтому для запроса "ABC" программа справедливо сообщает, что МОЖНО из исходного отрезка получить "ABC"

3) Видимо, задача слишком сложна для меня...
Поэтому, надеюсь, что Google2010 решил Вашу задачу и тема исчерпана...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2010, 19:33   #8
Morzik8
Пользователь
 
Регистрация: 06.03.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Morzik8, это Вы про мою программу?
1) Вы не ответили, что значит "начальный отрезок алфавита"
2) я думал (в моей программе смотрите, как изначально заполняется множесто) ,что если Вы вводите отрезок "АЕ" - это означает, что в отрезок входят ВСЕ буквы от А до Е (ABCDE) — поэтому для запроса "ABC" программа справедливо сообщает, что МОЖНО из исходного отрезка получить "ABC"

3) Видимо, задача слишком сложна для меня...
Поэтому, надеюсь, что Google2010 решил Вашу задачу и тема исчерпана...
Спасибо зада исчерпана! А то что я не сказал условия мой касяк! Спасибо за помощь!
Morzik8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элементов строки s2 из строки s1 Ueshua Общие вопросы C/C++ 4 20.12.2009 13:06
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
Строки. Как вывести часть строки? Anfall Общие вопросы Delphi 7 26.02.2009 09:10
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45