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

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

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

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

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

pashasnuff

Новые
Регистрация
16 Апр 2014
Сообщения
51
Реакции
0
Баллы
0
Задачка на множества, Паскаль

Вводится непустая строка из строчных букв не более 79 символов(чтобы было удобно читать). Отдельные слова в ней разделены запятыми слева. Справа от запятой могут быть пробелы. Вывести на печать в алфавитном порядке: все звонкие согласные, которые входят больше чем в одно слово.


Буду благодарен за помощь.
 

Вложения

  • vJ3SKTKIdQY.webp
    vJ3SKTKIdQY.webp
    15.8 KB · Просмотры: 64
А без множеств нельзя? Задача решается существенно проще через массивы.
 
Изучаем тему про множества, поэтому с помощью их и надо делать.
 
с множествами не работал, но как понимаю в множестве может содержаться буква только один раз?
то есть слово ОТВЕТ будет множество "О Т В Е"?
значит я беру слово, заношу его в множество и сверяю с множеством звонких согласных? и если более 2 совпадений то запоминаю? я верно понял?
 
Например ввели строку
Привет, красный, жук , жало, гадость, горшок
Должен вывести Г,Ж,Р
потому что они в словах повторяются
 
ПолучИте.
Несколько замечаний.
1. Прописные буквы недопустимы: строка должна состоять из русских слов, написанных строчными буквами и разделенных запятыми.
2. Буква "й" в качестве звонкой согласной не включена в список. Если надо - добавьте и увеличьте длину массива Codes на 1.
3. Сам по себе массив Codes возник исключительного из-за идиотского требования расположить буквы в результирующем списке по алфавиту. Если бы не этот преподский дебилизм, то программа была бы куда компактнее, и никакой надобности в массиве не возникло бы. А так... Дело в том, что элементы множества всегда располагаются "навалом", и упорядочить их внутри множества никакой возможности нет, вот и пришлось извращаться с массивом.
Код:
Const
 Sonants:Set of Char=['б','в','г','д','ж','з','л','м','н','р'];

Var
 S:String;
 C:Char;
 i,j,k,N:Byte;
 Found:Set of Char;
 Codes:Array[1..10] of Byte;

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);
        Codes[N]:=Ord(C);
       end;
     end;
   end;
 Until i=Length(S)-1;

 for i:=1 to N-1 do
  for j:=1 to N-i do
   if Codes[j]>Codes[j+1] then
    begin
     k:=Codes[j];
     Codes[j]:=Codes[j+1];
     Codes[j+1]:=k;
    end;
 writeln('Result:');
 for i:=1 to N do write(Chr(Codes[i]),' ');
 Readln
End.
 

Вложения

  • AA01.webp
    AA01.webp
    3.3 KB · Просмотры: 76
Это сделано каким методом? Методом множеств?
 
Почему то не работает..(
Нельзя преобразовать тип set of string к set of char
 
Почему то не работает..(
Нельзя преобразовать тип set of string к set of char
Как видите, у меня работает. И где Вы узрели "set of string"? А главное - какой у Вас Паскаль? Если глючный АВС - то, пардоньте, с этой дрянью не работаю. И еще - где именно спотыкается?
 
Исправил на стринг, да АБЦ, врое работает, но вот ошибку выдает

Когда ввожу: рррр, аааа
Вот эту ошибку выдает.
Ошибка времени выполнения: Индекс находился вне границ массива.
 
Когда вводишь аааа, рррр
Выдает такую ошибку
Ошибка времени выполнения: Индекс находился вне границ массива.
 
Когда ввожу: рррр, аааа Вот эту ошибку выдает. Ошибка времени выполнения: Индекс находился вне границ массива.
А, понятно. Исправьте диапазон массива Codes так, чтобы он начинался не с 1, а с 0 (просто замените 1 на 0).
P.S. Ну зачем же тестировать на таких примерах, где совпадений нет вовсе? Я как-то считал, что хоть одно, да найдется. :)
Да, и еще N задайте типом Integer.
 
Все равно, ошибка вылазит_(
 
Всё, разобрался.
Строку
i,j,k,N:Byte;
меняем на
i,j,k,N:Integer;
 
Владимир, спасибо огромное а нельзя ли упростить текст программы?
конструкции repeat - until нельзя ли чем нибудь заменить? просто буквально только что начали Паскаль изучать, еще такого не проходили
 
Владимир, спасибо огромное а нельзя ли упростить текст программы?
конструкции repeat - until нельзя ли чем нибудь заменить? просто буквально только что начали Паскаль изучать, еще такого не проходили
Ну нет, вот это уж пожалуйста без меня. Скажите преподавателю, что настолько увлеклись, что цикл с постусловием освоили самостоятельно. :D. Правда, боюсь, не поверит...
 
А ну окей)
Кстати вопрос, я хочу сделать чтоб если ничего не ввел то он говорит что строка пустая и обратно идет на ввод строки, пишу я
if length(s)=0 then
writeln('пусто');
ставлю end в конце а он говорит что вместо end ожидалось ;
не разберусь в чем проблема?
 
repeat
clrscr;
Writeln('Enter the string:');
readln(s);
if length(s) = 0 then writeln('Empty string!');
until length(s) <> 0;
 
Только уж если используется эта команда, то не забыть в начале программы поставить "uses CRT;" (без кавычек, естественно). Во всяком случае, в нормальном Паскале так, а как в этом... ладно, не буду.
 
Назад
Сверху