Помощь - Поиск - Пользователи - Календарь
Полная версия: Множества
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Ирина
Проверьте кто может правильность задачи.

1. Ввести с клавиатуры текст до символа точки и слово из латинских букв. Определить, сколько в тексте содержится символов, совпадающих с символами в слове.

Пишу такой программный код:
Код
program Symbol;
uses crt;
type alf='a'..'z';
var
str1, str2: string;
ch: char;
i, n: integer;
a: alf;
begin
clrscr;
n:=0;
writeln('Введите любое предложение на английском языке и поставьте в конце точку.'); readln(a);
n:=Pos('.',str1);
if n=0 then
begin
writeln('Ошибка входных данных.');
readln;
exit;
end;
writeln('Введите любое слово и нажмите <ENTER>');
begin
read(ch);
i:=1;
if ch in a then n:=n+1;  
end;
end;
writeln;
writeln('Количество символов слова, совпавших с символами в предл'); readln(n);
repeat until keipressed;
end;
end.
APAL
Во второй половине проги - бред. Требуется "доделка".

Уж если используете символьную переменную Ch, то может тогда имеет смысл использовать и функцию ReadKey.... (это была подсказка)
Altair
Ну и что, вы хотите что бы это работало?
По порядку:
Цитата
writeln('Введите любое предложение на английском языке и поставьте в конце точку.'); readln(a);
n:=Pos('.',str1);

Естественно, если бы программа запустилась, то в результате работы, выполнилось бы условие:
Код
if n=0 then
begin
writeln('Ошибка входных данных.');
readln;
exit;
end;


Т.к. переменная str1 не определенна ранее...

Код
end;
end;

Один END явно лишний...
Код
if ch in a

Несоответствие типов...
Цитата
Во второй половине проги - бред. Требуется "доделка".

Если честно, бред во всей программе!
Ирина
Переменная str1 определена:

Код

var
str1, str2: string;


А как быть с несоответствием типов?

Код

if ch in a
APAL
Цитата
Переменная str1 определена:

Не очень точно было сказано.
Переменная str1 - не имеет начального значения.

Именно, и на момент проверки ее, она (строка) имеет вид:
''
т.е. у нее нет элементов. Oleg_Z
Altair
Я имел ввиду ,что в процессе работы программы она не была изменена.
Вот работающая программа:
Код
Uses CRT;
Var
S:string;
SLOVO:string;
C,i:BYTE;
D:char;
SUMM:word;
Begin
CLRSCR;
writeln('‚ўҐ¤ЁвҐ «оЎ®Ґ ЇаҐ¤«®¦Ґ­ЁҐ ­   ­Ј«Ё©бЄ®¬ п§лЄҐ Ё Ї®бв ўм⥠ў Є®­жҐ в®зЄг.');
Readln(s);
If S[Length(S)]<>'.' then begin writeln('ЋиЁЎЄ  ў®ўе®¤­ле ¤ ­­ле'); halt end;
writeln('‚ўҐ¤ЁвҐ «оЎ®Ґ б«®ў® Ё ­ ¦¬ЁвҐ <ENTER>');
SLOVO:='';
Repeat
 C:=ORD(readkey);
 If c<>13 then begin SLOVO:=SLOVO+CHR(C); write(CHR(c)) end;
Until C=13; Writeln;
For D:='a' to 'z' do
begin
 If (POS(D,SLOVO)<>0) then
 begin
  For i:=1 to Length(s) do If s[i]=D then INC(SUMM);
 End;
end;
writeln(SUMM);
end.

Кодировка ДОС (866).
Если есть вопросы, спрашивайте.
Цитата
А как быть с несоответствием типов?

А зачем вам использовать вообще множество?
volvo
Ирина

1.
Цитата
Переменная str1 определена

Переменная - то определена, но не инициализирована...

2.
Код

type alf='a'..'z';
var a: alf;
...
writeln('Введите любое предложение на английском языке и поставьте в конце точку.'); readln(a);
...

каким образом Вы хотите ввести строку в переменную, которая может принять только один символ?

3.
Цитата
А как быть с несоответствием типов

Не путать типы с переменными ...
Altair
Цитата
Переменная - то определена, но не инициализирована...

Да, именно так.
Цитата
каким образом Вы хотите ввести строку в переменную, которая может принять только один символ?

там много подобных странностей... думаю нет смылса обсуждать это, тем более что код уже есть...

обратите внимание на красивый цикл:
For D:='a' to 'z'
Почему -то очень редко это используют ... вообще мало кто использует возможности Паскаля хотя бы на 50 % ИХМО
Ирина
У меня эта задача на тему "множества".
Altair
Т.е. в программе должно использоваться множество, так?
Сейчас исправим... smile.gif :D ;) rolleyes.gif
volvo
Код

var
 s, str1: string;
 count, lettCount: word;
 sentence, letters: set of char;
 i: byte;
begin
 write( 'enter any sentence ...> ' );
 readln(str1);

 if pos('.', str1) = 0 then
   begin
     writeln('illegal data');
     readln; exit
   end;

 for i := 1 to length(str1) do
   sentence := sentence + [ str1[i] ];

 count := 0;
 write( 'any word >' ); readln(s);
 for i := 1 to length(s) do
   if not (s[i] in letters) then
     begin
       letters := letters + [s[i]];
       if s[i] in sentence then inc( count );
     end;

 writeln( 'total counter = ', count );

end.


:p2:
Altair
Так лучше?
Код
Uses CRT;

Var
SIMV:set of CHAR;
S:string;
SLOVO:string;
C,i:BYTE;
D:char;
SUMM:word;
Begin
CLRSCR;
writeln('‚ўҐ¤ЁвҐ «оЎ®Ґ ЇаҐ¤«®¦Ґ­ЁҐ ­   ­Ј«Ё©бЄ®¬ п§лЄҐ Ё Ї®бв ўм⥠ў Є®­жҐ в®зЄг.');
Readln(s);
If S[Length(S)]<>'.' then begin writeln('ЋиЁЎЄ  ў®ўе®¤­ле ¤ ­­ле'); halt end;
writeln('‚ўҐ¤ЁвҐ «оЎ®Ґ б«®ў® Ё ­ ¦¬ЁвҐ <ENTER>');
SLOVO:='';
Repeat
 C:=ORD(readkey);
 If c<>13 then begin SLOVO:=SLOVO+CHR(C); write(CHR(c)) end;
Until C=13; Writeln;

For i:=1 to length(slovo) do
begin
 D:=s[i];
 Include(SIMV,D);
end;


For i:=1 to length(s) do
begin
 If s[i] in SIMV then INC(SUMM)
end;
writeln(SUMM);
end.


да елки зеленые, volvo опять опередил smile.gif
Ирина
Спасибо, огромное спасибо!
Вы очень выручили!
Я только начинаю.
Altair
Приятно было помочь! Заходите к нам еще! rolleyes.gif
Digitalator
Цитата(Oleg_Z @ 7.11.04 23:55)
обратите внимание на красивый цикл:
For D:='a' to 'z'
Почему -то очень редко это используют ... вообще мало кто использует возможности Паскаля хотя бы на 50 % ИХМО

Вообще-то если вместо in использовать такие циклы очень сильно снижается быстродействие - здесь у нас будет 26 итераций максимум, и 13 в среднем, а in работает оч. быстро (потому и стоит на него 1-байтовое ограничение). итого более чем в 13 раз быстрее с множествами делать...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.