Помогите решить задачу! :rolleyes:

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Ибрагимова Катя
Сообщения: 3
Зарегистрирован: 24 фев 2008, 18:25

Помогите решить задачу в ТР.
Условие: Даны несколько слов из русских букв; вывести на экран все буквы 'й', 'и', 'ъ', которые входят хотя бы в одно слово.
Заранее благодарна! ;)
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Если я правильно понял условие, то так:
[syntax='Delphi']
program wd;

const
N=10;
b='йиъ';

var
c,i,j,k:integer;
words:array[1..N] of string;
A:array[1..3] of boolean;
s:string;

begin
s:=b;
writeln('Введите количество слов');
readln(c);
writeln('Введите ',c,' слов(а)');
for i:=1 to c do
readln(words);

for i:=1 to c do
for j:=1 to length(words) do
for k:=1 to 3 do
if words[j]=s[k] then A[k]:=true;

for i:=1 to 3 do
if A then write(s,' ');

readln;
end.
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
Ибрагимова Катя
Сообщения: 3
Зарегистрирован: 24 фев 2008, 18:25

MOTOCoder писал(а):Если я правильно понял условие, то так:
[syntax='Delphi']
program wd;

const
N=10;
b='йиъ';

var
c,i,j,k:integer;
words:array[1..N] of string;
A:array[1..3] of boolean;
s:string;

begin
s:=b;
writeln('Введите количество слов');
readln(c);
writeln('Введите ',c,' слов(а)');
for i:=1 to c do
readln(words);

for i:=1 to c do
for j:=1 to length(words) do
for k:=1 to 3 do
if words[j]=s[k] then A[k]:=true;

for i:=1 to 3 do
if A then write(s,' ');

readln;
end.
[/syntax]


Получается так, водим , например:
{ирпниапйт ъпрней рповим}
на экран выходит:
й и ъ
а надо что бы выходило: и и й ъ и
Можно какни будб исправить???
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Я не совсем правильно понял задачу.
Теперь должно быть правильно:
[syntax='Delphi']
program wd;

const
N=10;
b='йиъ';

var
c,i,j,k:integer;
words:array[1..N] of string;
A:array[1..3] of boolean;
s:string;

begin
s:=b;
writeln('Введите количество слов');
readln(c);
writeln('Введите ',c,' слов(а)');
for i:=1 to c do
readln(words);

for i:=1 to c do
for j:=1 to length(words) do
for k:=1 to 3 do
if words[j]=s[k] then write(s[k],' ');
writeln;
readln;
end.
[/syntax]
---
{File=symbs.pas}
Ни что так не ограничивает фантазию программиста, как компилятор...
drummer
Сообщения: 61
Зарегистрирован: 13 янв 2008, 18:43

вместо
for k:=1 to 3 do
лучше написать

Код: Выделить всё

for k:=1 to length(b);
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Это как посмотреть.
Если железно ясно, что в строке 3 символа(это "по условию" и, соответственно, неоспоримо), то зачем вызывать дополнительную функцию(т.е. проводить лишние вычисления), к тому же в цикле?
Оптимизация Forever :) !
Ни что так не ограничивает фантазию программиста, как компилятор...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

MOTOCoder, не переживай, никакого вызова функций не происходит на самом деле. Перед началом цикла компилятор сохранит значение Length(b) в специальной переменной, предназначенной для хранения конечного значения цикла. В случае с константой в эту переменную тоже заносится значение, поэтому никакой разницы и выигрыша нет. По сути Length(b) транслируется в byte(b[0]) - т.е. это не функция, а обычная переменная.
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

MOTOCoder писал(а):Это как посмотреть.
Если железно ясно, что в строке 3 символа(это "по условию" и, соответственно, неоспоримо), то зачем вызывать дополнительную функцию(т.е. проводить лишние вычисления), к тому же в цикле?
Оптимизация Forever :) !
Сколько раз выполнится цикл в следующем фрагменте? :)
[syntax='Delphi']var st : string;
i : integer;
begin
st := '12345678';
for i:=1 to Length (st) do
begin
writeln ('In cycle! : ', i);
Delete (st, 1, 1);
end;
end.[/syntax]
Ибрагимова Катя
Сообщения: 3
Зарегистрирован: 24 фев 2008, 18:25

MOTOCoder писал(а):Я не совсем правильно понял задачу.
Теперь должно быть правильно:
[syntax='Delphi']
program wd;

const
N=10;
b='йиъ';

var
c,i,j,k:integer;
words:array[1..N] of string;
A:array[1..3] of boolean;
s:string;

begin
s:=b;
writeln('Введите количество слов');
readln(c);
writeln('Введите ',c,' слов(а)');
for i:=1 to c do
readln(words);

for i:=1 to c do
for j:=1 to length(words) do
for k:=1 to 3 do
if words[j]=s[k] then write(s[k],' ');
writeln;
readln;
end.
[/syntax]


Большое спасибо! ;)
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

somewhere писал(а):MOTOCoder, не переживай, никакого вызова функций не происходит на самом деле. Перед началом цикла компилятор сохранит значение Length(b) в специальной переменной, предназначенной для хранения конечного значения цикла. В случае с константой в эту переменную тоже заносится значение, поэтому никакой разницы и выигрыша нет. По сути Length(b) транслируется в byte(b[0]) - т.е. это не функция, а обычная переменная.
Что-то меня действительно не туда завернуло...
Ни что так не ограничивает фантазию программиста, как компилятор...
Ответить