Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Слова

Автор: bigglewood 14.06.2006 18:29

Помогите с задачкой ато не получается самому sad.gif
Дана последовательность слов, слова разделяются пробелом.
Нужно вывести на экран все согласные буквы которые входят только в одно слово.

Автор: Bokul 15.06.2006 2:41

uses crt;
type
main=array[1..40] of string[50];

procedure take_array(s:string; var mas:main; var n:integer);
var i:byte;
begin
n:=1;
for i:=1 to length(s) do
if (s[i]=' ') and (i<>length(s)) then
inc(n)
else
mas[n]:=mas[n]+s[i];
end;

function dif_letters(s:string):string;
var i,j:byte; buf:string;
begin
buf:='';
for i:=1 to length(s) do
if pos(s[i],buf)=0 then
buf:=buf+s[i];
dif_letters:=buf;
end;

procedure consonant(mas:main; n:integer);
const
con='zxcvbnmlkhgfdsqwrtp';
var i,j,temp:integer;
buf:string;
num:array[1..20] of integer;
begin
for i:=1 to 20 do
num[i]:=0;
for i:=1 to n do
begin
buf:=dif_letters(mas[i]);
for j:=1 to length(buf) do
begin
temp:=pos(buf[j],con);
if temp<>0 then
inc(num[temp]);
end;
end;

for i:=1 to 20 do
if num[i]=1 then
write(con[i],' ');
readln;
end;

var s:string;
mas:main;
n:integer;
begin
clrscr;
writeln('Enter string');
readln(s);
take_array(s,mas,n);
consonant(mas,n);
end.

Автор: lapp 15.06.2006 15:32

Вот мое решение, оно несколько короче.

const
c:string='bcdfghklmnpqrstvwxz';
z:set of char=[];

var
s:string;
A,B,T:set of char;
i,j:integer;

begin
Write('Type in a line: '); ReadLn(s);
A:=Z;
for i:=1 to Length© do begin
T:=Z;
for j:=1 to Length(s) do if c[i]=s[j] then
if c[i] in A then Include(B,c[i]) else Include(T,c[i])
else if s[j]=' ' then begin
A:=A+T;
T:=Z;
end;
A:=A+T
end;
A:=A-B;
for i:=1 to Length© do if c[i] in A then Write(c[i],' ')
end.

Любопытно, что сначала я прочел условие неверно, и написал программу, которая выдает все буквы, которые входят в слова по одному разу. Когда я собрался ее постить, я увидел ошибку. Так вот, в результате мне оказалось нужно только в одном месте заменить одну букву, чтобы решение стало соответствовать правильному условию smile.gif.
Кто-нибудь может сказать, какую именно? smile.gif

Автор: bigglewood 15.06.2006 19:42

огромное спасибоsmile.gif
по поводу буквы сказать не могуsmile.gif

Автор: Bokul 16.06.2006 1:26

Цитата
которая выдает все буквы, которые входят в слова по одному разу

Тоесть при такой строке
Цитата
vcx ccx xc

результат должен быть
Цитата
x

?

Автор: klem4 16.06.2006 1:59

Рузельтат должен быть v. Толко эта буква входит в одно слово (первое).
c и x есть во всех словах.

Автор: Bokul 16.06.2006 2:06

Цитата
Рузельтат должен быть v. Толко эта буква входит в одно слово (первое).

Так по условию должно быть... Я же спрашиваю какой результат должен быть по задаче lapp'a (ч. п. 3)

Автор: lapp 16.06.2006 3:40

Цитата(Bokul @ 15.06.2006 22:26) *

Тоесть при такой строке
vcx ccx xc
результат должен быть
x
?

нет, тут результат (по моему измененному условию) такой:
v x

То есть те буквы, которые встречаются в каждом слове 0 или 1 раз (но хотя бы одно вхождение в одном слове должно быть).

Автор: Bokul 16.06.2006 5:49

Цитата
То есть те буквы, которые встречаются в каждом слове 0 или 1 раз (но хотя бы одно вхождение в одном слове должно быть).

Ну тогда все просто
       for j:=1 to Length(s) do if c[i]=s[j] then
if c[i] in A then {надо поменять A на T}
Include(B,c[i]) else Include(T,c[i])
else if s[j]=' ' then begin


Автор: klem4 16.06.2006 15:58

В общем какие-то разнолгасия .. пусть автор уточнит условие, вот мой вариант но первоначальному условию

uses crt;
const
sogl = 'wrtpssdfghjklzxcvbnm';
var
s : string = 'cxx xyfc xcavv';
c : set of char = [];
i, j, start : integer;

begin
i := 1;
while (i <= length(s)) do begin
while (s[i] = ' ') do inc(i);
if i <= length(s) then begin
start := i;
while (s[i] <> ' ') and (i <= length(s)) do inc(i);
for j := start to i do
if (pos(s[j], sogl) <> 0) then begin
if not(s[j] in c) and (pos(s[j], copy(s, 1, pred(start))) = 0)
and (pos(s[j], copy(s, succ(i), 255)) = 0) then
writeln(s[j]);
include(c, s[j]);
end;
end;
end;
end.


cxx xyfc xcavv

Автор: bigglewood 16.06.2006 20:05

из vx vkx vkt ответ должен быть t

Автор: Pola 16.06.2006 22:56

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


const
sogl: set of char = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z'];
var
S:String;
len,p :integer;
res, slo, vto: set of char;
ch: char;
begin
writeln('Введите строку ');
readln(S);

len:=Length(S);
p:=1; {начнем с первого символа}
res:=[]; {один раз}
vto:=[]; {неск слов}

{пропустить пробелы в начале строки}
while (p<=len) and (S[p]=' ') do p:=p+1;

{выделяем слова пока не конец строки}
while (p<=len) do
begin
{смотрим слово до пробела или конца строки}
slo:=[];
while (p<=len) and (S[p]<>' ') do
begin
slo:=sogl*[S[p]] + slo; {складываем согласные}
p:=p+1; {к следующему символу}
end;

vto:=slo*res + vto; {встречалась - запоминаем}
res :=res + slo - vto; {те, что не встречались еще - добавляем} {встречалась - убираем}

{пропускаем пробелы, не выходя за пределы строки}
while (p<=len) and (S[p]=' ') do p:=p+1;
end;

{вывод}
if res=[] then writeln('нет таких')
else
for ch:='b' to 'z' do
if ch in res then write(ch,' ');
readln;
end.

Автор: volvo 16.06.2006 23:05

lapp, как видишь, одна лишь твоя фраза привела к полному запутыванию участников и продолжению решения уже давным-давно решенной задачи... Я бы попросил тебя в следующий раз быть осмотрительнее... Если ты совершил ошибку - зачем ВСЕМ об этом знать? Да еще и гадать, какой же, интересно, символ был изменен ?...

Закрыто...