• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Задачка на множества, Паскаль

не ну можно и без нее. просто хотел, чтобы было красиво, а не куча буковок...
uses crt; это естественно.
 
Я конечно понял что он должен выводить Empty string но у меня не выводит? Я делал в турбо, а когда просто вводишь пробел то вылетает.
 
Ошибка диапазона говорит.
 
а без CRT работает нормально) вообщем я уберу CRT
Огромное спасибо.
 
Кстати, не подскажете куда ставить счетчик, чтобы подсчитать кол-во букв подходящих по условию. Это нужно для того чтобы в случае когда, я ввел слова, но в них не оказалось нужных букв выдавать сообщение что таких букв нет. Поставил после if S[k]=C then p=p+1, в разделе констант указал p=0
 
это потому что писалось без clrscr, а потом подумалось, что с ним будет красивее и не проверялось в реале =)

так будет норм
Код:
begin
clrscr;
repeat
 Writeln('Enter the string:');
 readln(s);
 if length(s) = 0 then
  begin
   clrscr;
   writeln('Empty string!');
   writeln;
  end;
 until length(s) <> 0;
end.
 
когда просто вводишь пробел
Сударь, ну хватит уже извращаться! Ведь сказано в условии: "непустая строка... отдельные слова... разделены запятыми". Вот такую и вводите. А отрабатывать все возможные ситуации неверного ввода конечно можно, но, на мой взгляд, не нужно.
 
Спасибо, а что с счетчиком делать?
 
в разделе констант указал p=0
Всё, что указано в разделе констант, является константой и в процессе работы программы изменено быть не может. Нужно в разделе VAR ввести переменную р типа byte и в начале программы присвоить ей нулевое значение.
А вообще-то ничего и вводить не надо: счетчик там и так есть. Это переменная N.
 
Можете, меня уточнить ?
i,j,k,N это переменные циклов, так сказать параметры цикла, во время цикла увеличиваются на 1 до достижения какого либо условия
Found:Set of char это группа каких то символов типа char(как я понимаю, те символы по которым идет перебор, тоесть если ввести ПРОЛД, при первом прохождении это будет П, при втором Р и далее
Codes:Array[1..10] of Byte; а вот этот массив не совсем понятно для чего? это 1...10 потому что Sonants:Set of Char=['б','в','г','д','ж','з','л','м','н','р']; тут 10? и именно этот массив помогает нам упорядочить их по алфавиту?
 
Found:Set of char это группа каких то символов типа char(как я понимаю, те символы по которым идет перебор
Нет. Это искомое множество символов, для которых выполнено условие задачи, т.е. повторяющиеся в разных словах звонкие согласные.
Codes:Array[1..10] of Byte; а вот этот массив не совсем понятно для чего? это 1...10 потому что Sonants:Set of Char=['б','в','г','д','ж','з','л','м','н','р']; тут 10? и именно этот массив помогает нам упорядочить их по алфавиту?
Именно так - этот массив кодов найденных символов позволяет провести упорядочение методом "пузырька". Только затем и нужен. Хотя с моей точки зрения условие выстраивания по алфавиту в данной задаче - абсолютно чужеродное и лишнее. Но раз требуют - приходится на уши вставать.
 
C:Char; а вот это, это тот символ который перебирется в данных момент цикла?
 
C:Char; а вот это, это тот символ который перебирется в данных момент цикла?
Знаете, я вот тут сообразил, как сильно упростить программу и сделать упорядоченный вывод без использования этого дурацкого массива. Но сразу предупреждаю: это писалось в НОРМАЛЬНОМ Паскале (Free, Turbo) а про задвиги ABC ничего не знаю и знать не хочу:
Код:
Const
 Sonants:Set of Char=['б','в','г','д','ж','з','л','м','*н','р'];

Var
 S:String;
 C:Char;
 i,k,N:Integer;
 Found:Set of Char;

Begin
 Writeln('Enter the string:');
 Readln(S);
 Writeln;
 Found:=[];
 N:=0;
 i:=0;
 Repeat
  Inc(i);
  If (S[i] in Sonants) and not (S[i] in Found) then
   begin
    C:=S[i];
    k:=i;
    repeat
     Inc(k);
    until (S[k]=',') or (k=Length(S));
    if S[k]=',' then
     begin
      repeat
       Inc(k);
      until (S[k]=C) or (k=Length(S));
      if S[k]=C then
       begin
        Found:=Found+[C];
        Inc(N);
       end;
     end;
   end;
 Until i=Length(S)-1;

 If N=0 then
  Writeln('No such symbols')
 else
  begin
   Writeln('Result:');
   for C:='б' to 'р' do
    if C in Found then write(C+' ');
  end;
 Readln
End.
Теперь о том, как работает программа.
1. Вводим строку. Строка - это массив символов.
2. Объявляем пустое символьное множество Found и нулевое значение количества искомых символов N.
3. Организуем цикл последовательного перебора символов строки (с увеличением индекса i). Если текущий символ имеется в множестве-константе Sonants и не содержится в множестве Found, то запоминаем его в виде символа С, дальше двигаемся по строке до первой запятой (или до конца строки), и, начиная с символа, следующего за этой запятой, последовательно сравниваем с С все символы строки. Если найдется такой же символ, как и С, то:
а) вносим его во множество Found (теперь, если он встретится где-то дальше, он уже не "сыграет")
б) Увеличиваем N на единицу.
Цикл по i продолжаем, пока строка не кончится.
4. Выводим результат путем организации символьного цикла (не знаю, умеет ли такое этот кретинский АВС) от 'б' до 'р', и если текущий символ имеется в множестве Found, выводим его на экран. Ну а если соответствующих условию задачи символов нет вовсе, то выводим сообщение "Таких символов нет!".
 
А что такое С? так и не допер.
 
С используется для хранения текущего символа, того который проверяем на вхождение в исходное множество?
 
Вводится непустая...
[mod2]Ну вот зачем Вы, сударь, лезете со своей задачей в чужую тему? Видите же, что тема активна, идёт обсуждение.
Ладно, на первый раз - прощается, а вот второго, надеюсь, не будет. Вам создана новая тема: http://www.tehnari.ru/f41/t96190/.

Модератор[/mod2]
 
А что такое С? так и не допер.
С используется для хранения текущего символа, того который проверяем на вхождение в исходное множество?
Хорошо, давайте на примере.
Допустим, ввели строку
'одуревший, дворник, удрал'
Понеслась:
S[1]='о' - не содержится в множестве Sonants, потому пропускается.
S[2]='д' - ага! Есть в множестве Sonants и нету в множестве Found, благо последнее пока вовсе пустое. Значит, присваиваем символьной переменной С значение 'д', а потом, с помощью индекса k (значение индекса i фиксируется, чтобы можно было потом к нему вернуться), во-первых, доходим до первой запятой, во-вторых, после этой запятой перебираем символы строки, пока не выполнится условие S[k]=C или пока строка не кончится. Условию соответствует первый символ второго слова. Значит, вносим символ С='д' в множество Found и возвращаемся к глобальному циклу по i. S[3]='у' пропускаем, а вот S[4]='р' - годится. Значит, присваиваем C:=S[4] и повторяем процедуру для него. Ну и т.д. - до конца строки.
Это касается символа С в первой части программы, где формируется множество Found. Во второй части (вывод результата) символьная переменная С используется просто как индекс цикла (чтобы не вводить другую переменную, используется С).

P.S. Да, в этом варианте программы переменная j не используется, можно ее выкинуть (исправил).
 
Кажется я понял, спасибо большое.
 
Vladimir S, сегодня-завтра я переделаю ваш код, вместо цикла с постусловием я попробую поставить цикл с предусловием, вы сможете проверить?
 
Vladimir S, сегодня-завтра я переделаю ваш код, вместо цикла с постусловием я попробую поставить цикл с предусловием, вы сможете проверить?
Да могу, конечно, но лучше, если Вы сами отладите программу. Полезнее. Для Вас.
 
Назад
Сверху