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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2011, 22:21   #1
lezvion
 
Регистрация: 07.11.2010
Сообщений: 7
Смущение Паскаль, доработка

Доброго времени суток. Имеется следующая задача:
Дана непустая последовательность из строчных букв, между соседними словами
запятая, за последним словом - точка. Напечатать в алфавитном порядке все
гласные буквы, которые входят не более чем в одно слово.
Решение на языке Паскаль:
Цитата:
Uses CRT;
Type MyType = Set Of Char; {тип множество}
Var
S,W : String; {строка символов}
I,K,L : Integer; {вспомогательные переменные}
J : Char; {вспомогательные переменные}
M,N : MyType; {множество букв}
B,C,P : Array [1..32] of MyType; {массивы для хранения символов}
Begin
ClrScr;
M :=['а','е','ё','и','о','у','ы','э','ю' ,'я']; {множество гласных букв}
S := 'хлеб,молоко,арбуз,рыба,селедка.'; {исходная строка}
Writeln(' Исходная последовательность слов:');
Writeln(' ',S);
K := 1;
While pos(',',S) > 0 Do {ищем позицию запятой}
Begin
W := copy(S,1,pos(',',S)); {разделяем слова}
B[K] := []; {пустое множество}
For I := 1 To Length(W) Do begin
if W[i] in M then B[K] := B[K] + [W[I]]; {мн-во гласных букв каждого слова}
end;
Inc(K);
delete(S,1,pos(',',S)); {удаляем обработанное слово}
End;

W := S;
B[K] := [];
For I := 1 To Length(W) Do
if W[i] in M then B[K] := B[K] + [W[I]]; {обрабатывам последнее слово до точки}
For I := 1 To 3 Do
Begin
p[i]:=[];
C[I] := B[I];
For L := 1 To K Do
If I <> L Then begin
P[i] := C[I] * B[L]; {пересечение множеств для выявления букв
которые входят более чем в одно слово}
end;
End;
Writeln;
Write(' Гласные буквы, которые входят более чем в одно слово: ');
N := [];
For I := 1 To K Do
N := N + p[I];
For J := 'а' To 'я' Do
If J in N Then Write(J,' '); {вывод букв}
WriteLn;
ReadKey; {задержка экрана}
End.
Проблема: При данных "'хлеб,молоко,арбуз,рыба,селедка.'; " программа работает, однако если ввести любые другие, то выдает или одну гласную букву, или не пишет её вообще. Не могли бы Вы сказать, что здесь нужно изменить, чтобы программа работала при любом тестовом наборе слов? Спасибо.
lezvion вне форума Ответить с цитированием
Старый 30.05.2011, 06:58   #2
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Проверь этот участок кода в построчной отладке, и посмотри значения которые ты получаешь.

Цитата:
Код:
For I := 1 To 3 Do
 Begin
  p[i]:=[];
  //здесь ты присваиваешь C, только первые 3 значения множества B.
  //как я понял, в твоём примере их получается 5.
  C[I] := B[I]; 
  For L := 1 To K Do
   If I <> L Then
    //здесь begin end можно убрать.
    //здесь ты 4 раза заново присваиваешь P[i] значения C[I] * B[L].
    begin
     P[i] := C[I] * B[L]; {пересечение множеств для выявления букв
                               которые входят более чем в одно слово}
    end;
 End;
Writeln;
Write(' Гласные буквы, которые входят более чем в одно слово: ');
N := [];
For I := 1 To K Do
 N := N + p[I];
For J := 'а' To 'я' Do
 If J in N Then Write(J,' '); {вывод букв}
WriteLn;
ReadKey; {задержка экрана}
End.
Хакинг - не преступление, а способ выживания.

Последний раз редактировалось Ghost of Night; 30.05.2011 в 07:04.
Ghost of Night вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доработка макроса Jonny B Microsoft Office Excel 5 07.01.2011 08:16
Доработка WHILE RUSSTUDENT Помощь студентам 3 31.08.2010 17:11
Доработка RUSSTUDENT Помощь студентам 2 28.08.2010 19:55
Доработка программы akialex Помощь студентам 3 24.12.2009 21:09
Доработка A93 Общие вопросы C/C++ 4 28.11.2009 13:29