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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2017, 00:41   #1
Naastyaaa
 
Регистрация: 30.11.2017
Сообщений: 3
По умолчанию Написать программу (Множества)

Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все гласные буквы, которые входят в каждое слово.

Вроде работает правильно, но вывод на экран не происходит.

Код:
SetOne:=['а','е','и','о','у','ы','э','ю','я'];{гластные}
    write('Enter string :');readln(InputString);{вводим строку}
    if pos('.',InputString)=0
      then InputString := InputString + '.'{ставим точку если пользователь забыл}
      else while InputString[length(InputString)]<>'.' do
        delete(InputString,length(InputString),1);{удаляем все символы после точки, если ввел лишнее}
    writeln('Result:',InputString);{выводим строку}
    {сброс счетчиков букв и рабочих множеств}
    WordCount:=1;{счетчик слов}
    SetChar:=[];{множество гласных букв в одном слове}
    writeln;
    While length(InputString)>0 do{}
      begin
        if (InputString[1]='.') or (InputString[1]=',')then{если точка или запятая - новое слово}
          begin
            inc(WordCount);{увеличиваем счетчик слов}
            SetOne:=SetOne * SetChar;{пересечение множеств, остаются только те буквы, которые есть в обоих множествах}
            SetChar:=[];{сбрасываем текущее множество}
          end
          else
          begin
            if InputString[1]in SetOne then
              SetChar:=SetChar + [InputString[1]];{если буква принадлежит множеству гласных, записываем текущего слова}
          end;
        delete(InputString,1,1);{удаляем первый символ строки}
      end;
    writeln('Count:',WordCount);
    write('One :');{выводим результат первой задачи}
    for WordCount:=0 to 255 do
      if chr(WordCount)in SetOne then write(chr(WordCount):2);
    writeln;
    readln;
  end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 08.12.2017 в 09:21.
Naastyaaa вне форума Ответить с цитированием
Старый 08.12.2017, 14:19   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Какой Паскаль? Если Паскаль ABC.NET, то там не работает цикл for xxx:=0 to 255 do - русские символы имеют другие коды.
но там цикл и не нужен, чтобы вывести множество достаточно просто WriteLn(SetOne):

Код:
var  SetOne, SetChar : set of char;
 InputString :string;
 WordCount : integer; 
begin 

    SetOne:=['а','е','и','о','у','ы','э','ю','я'];{гластные}

    // write('Enter string :');readln(InputString);{вводим строку}
    InputString :='маму,умыла,румба'; // вместо ввода зададим строку константой, для отладки
    
    if pos('.',InputString)=0
      then InputString := InputString + '.'{ставим точку если пользователь забыл}
      else while InputString[length(InputString)]<>'.' do
        delete(InputString,length(InputString),1);{удаляем все символы после точки, если ввел лишнее}
    writeln('Result:',InputString);{выводим строку}
    {сброс счетчиков букв и рабочих множеств}
    WordCount:=0;{счетчик слов}
    SetChar:=[];{множество гласных букв в одном слове}
    writeln;
    While length(InputString)>0 do{}
      begin
        if (InputString[1]='.') or (InputString[1]=',')then{если точка или запятая - новое слово}
          begin
            inc(WordCount);{увеличиваем счетчик слов}    
            SetOne:=SetOne * SetChar;{пересечение множеств, остаются только те буквы, которые есть в обоих множествах}
            SetChar:=[];{сбрасываем текущее множество}
          end
          else
          begin
            if InputString[1]in SetOne then Include(SetChar, InputString[1]); //{если буква принадлежит множеству гласных, записываем текущего слова}
          end;
        delete(InputString,1,1);{удаляем первый символ строки}
      end;
    writeln('Count:',WordCount);
    write('One :');{выводим результат первой задачи}
    WriteLn(SetOne);
    //readln;
  end.
p.s. команда удаления символа из строки (и особенно первого символа) крайне не эффективна.
Намного лучше в данном случае использовать цикл по i для всех символов строки.

Последний раз редактировалось Serge_Bliznykov; 08.12.2017 в 14:22.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2017, 00:00   #3
Naastyaaa
 
Регистрация: 30.11.2017
Сообщений: 3
По умолчанию

Огромное спасибо!)
Naastyaaa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать программу массивы (C++) - Написать функцию выводящую на экран указанную часть таблицы умножения Саша1990 Помощь студентам 1 02.02.2015 08:01
Написать программу формирования множества maxim1592 Паскаль, Turbo Pascal, PascalABC.NET 4 28.05.2014 19:17
Задача на множества.Написать программу не позволяющую вводить буквы русского алфавита.(написать подпрограммой используя процедуры ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 3 09.02.2013 13:53
нужно создать программу на множества Mishka2039 Помощь студентам 0 05.05.2010 16:19
Помогите, пожалуйста, написать программу в Паскаль по теме "Множества" SArtem Помощь студентам 10 19.12.2009 11:40