IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Самое короткое слово в строке
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Задача такова:
Дана строка, найти в ней самое короткое слово (словами называются последовательности символов разделённые пробелами).
------------------------------------------------------------------------
Пожалуйста проверте моё решение этой задачи: она постоянно выводит ноль.
------------------------------------------------------------------------
Заранее спасибо


Прикрепленные файлы
Прикрепленный файл  WORDLENG.PAS ( 626 байт ) Кол-во скачиваний: 339
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


To: art88 что-то ты намудрил
...
var
s:string;
k,i,m:integer;
sl,sn:string;
begin
m:=sizeof(s);
readln(s); k:=0; sl:='';
while s[1]=' ' do delete(s,1,1);
for i:=1 to length(s) do begin
if s[i]=' ' then begin
if k<m then begin m:=k;sn:=sl; end;
sl:=''; k:=0
end;
if s[i]<> ' ' then begin inc(k); sl:=sl+s[i] end;
end;
writeln(sn, ' ',m); readln;
end.


хотя и я не старался smile.gif :P


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






To: Altair
Ты чего? :smoke: :D
var
s: string;
i, min:integer;
curr_len, start: byte;
begin

min := 255;
s := 'one two xx three four';
while i <= length(s) do begin

while (s[i] = ' ') and (i <= length(s)) do inc(i);

curr_len := 0;
while (s[i] <> ' ') and (i <= length(s)) do begin
inc(i); inc(curr_len);
end;

if curr_len < min then begin
min := curr_len; start := i - curr_len;
end;

end;
writeln( copy(s, start, min) );
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


Уважаемые Altair и volvo, извините, но ваши программы не совсем корректно решают посавленную задачу!
------------------------------------------
В ситуациях, когда
1. Вводится пустая строк, строка пробелов, одно слово или в строке имеются слова одинаковой длинны ничего нельзя сказать о слове с наименьшей длинной, та как его(слова) в данной строке не будет.
-------------------------------------------
В связи с этим прошу всё - таки, не решая задачу заново, найти пробел в моём решении(WL_Funct.pas):
программа выводит длинну, когда это не нужно:
1.пустая строка или строка пробелов
2.в строке одно слово с началом несовпадающим с началом строки.
-------------------------------------------
Надеюсь на понимание smile.gif


Прикрепленные файлы
Прикрепленный файл  WL_FUNCT.PAS ( 939 байт ) Кол-во скачиваний: 275
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Проверь так те пойдет?
program WordLen;
var
i : integer;{counter "for"}
n : integer;{length of word}
min : integer;{min of array}
s : string;
ok : Boolean;
function WordLength(i : integer) : integer;
begin
n := 0;
while (s[i] <> ' ') and (i <= length(s)) do begin
inc(i);
inc(n);
end;
wordlength := n;
end;
begin
{Entering of string}
writeln('Please, enter string');
readln(s);
i := 1;
n := 0;
while s[1]=' ' do delete(s,1,1);
if s='' then begin
writeln('string is empty');
readln;
halt;
end;
if pos(' ',s)=0 then
begin
writeln('1 word');
readln;
halt;
end;

min := length(s);
{Checking of words}
ok := true;
while (i <= length(s)) do begin
if s[i] <> ' ' then begin
if WordLength(i) < min then
min := WordLength(i)
else if WordLength(i) = min then
ok := false;
i := i + WordLength(i);
end
else i := i + 1;

end;
{Outputing of length}
if ok then
writeln(min)
else writeln('There is no word with minimal length');
readln;
end.

но кстати неправ ты. Это твоя прога не по заданию. Она не дает понятие какое слово короткое она длинну мин. выводит а это разные вещи - длинна и слово.
Может одну из наших прог доделать?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Может одну из наших прог доделать?

Легко... В моей программе достаточно добавить счетчик слов, и если он будет равен 0 или 1 то выдавать сообшение об ошибке...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






art88,
вот так проверь:
program WordLen;
var
i : integer;{counter "for"}
n : integer;{length of word}
min : integer;{min of array}

s : string;
ok : Boolean;

function WordLength(i : integer) : integer;
var n: integer; { <-- Добавим локальное описание }
begin

n := 0;
while (s[i] <> ' ') and (i <= length(s)) do begin
inc(i); inc(n);
end;
wordlength := n;

end;

begin
{Entering of string}
writeln('Please, enter string');
readln(s);

i := 1;
n := 0;
min := length(s);

{ Checking of words }
ok := true;
while (i <= length(s)) do begin

if s[i] <> ' ' then begin
inc(n); { <-- Если встретилось новое слово - увеличим счетчик }
if WordLength(i) < min then
min := WordLength(i)
else
if WordLength(i) = min then
ok := false;
i := i + WordLength(i);
end
else i := i + 1;

end;

{Outputing of length}
if ok and (n > 1) then writeln(min) { <-- Изменим условие }
else writeln('There is no word with minimal length');
readln;
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


:D Я наверное вас уже достал, но всё-таки.
volvo, я немного доделал твою первую программу и всё бы хорошо, но длина первого слова всё время на 1 больше истинной, где ошибка?
var
s: string;
i, min:integer;
curr_len, start: byte;
c : integer;
ok : Boolean;
begin
ok := true;
readln(s);
min := length(s);
while (s[1] = ' ') and (i <= length(s)) do delete(s, 1, 1);
while i <= length(s) do begin
while (s[i] = ' ') and (i <= length(s)) do inc(i);
curr_len := 0;
while (s[i] <> ' ') and (i <= length(s)) do begin
inc(i);
inc(curr_len);
end;
inc©;
if curr_len < min then begin
min := curr_len;
ok := true;
end
else if min = curr_len then
ok := false;
end;
writeln;
if (min = 0) or (c <= 1) then
ok := false;
if ok then
writeln(min)
else
writeln('There is no word with minimal length');
readln;
end.

Спасибо! smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Я не понял, тебя твоя же чуть-чуть подправленная программа (из поста №7) уже НЕ устраивает? Тогда объясни, чем...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской
Реальное имя: Артём

Репутация: -  0  +


volvo, извини, просто эту задачу мне надо сдавать(я учусь в университете), а как оказалось при решении этой задачи нельзя использвать процедуры.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
при решении этой задачи нельзя использвать процедуры.

Я же говорил, что легче в мою программку добавить несколько строк smile.gif
var
s: string;
min_count, count, i, min:integer;
curr_len, start: byte;
begin

min := 255;
readln(s);
// s := 'one two xx three four';
// s := ' ';

while (length(s) > 0) and
(s[length(s)] = ' ') do delete(s, length(s), 1);

i := 1; count := 0; min_count := 0;
while i <= length(s) do begin

while (s[i] = ' ') and (i <= length(s)) do inc(i);

curr_len := 0;
while (s[i] <> ' ') and (i <= length(s)) do begin
inc(i); inc(curr_len);
end;

inc(count);
if curr_len < min then begin
min := curr_len; start := i - curr_len; min_count := 1;
end
else
if curr_len = min then inc(min_count);

end;

if (count > 1) and (min > 0) and (min_count = 1) then
writeln( 'length = ', min )
else writeln('no result');
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 20
Пол: Мужской

Репутация: -  0  +


А как сделать что бы вместо длины самого короткого слова, выводилось само слово?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Код
copy(s,start,min)


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 20
Пол: Мужской

Репутация: -  0  +


Цитата(klem4 @ 6.02.2006 22:38) *

Код
copy(s,start,min)



Выдает - invalid variabe referense
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






WriteLn( copy(s,start,min) );

такое выдает? blink.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Сорри, что поднял такую старую тему, просто меня интерисует тоже самое, т.е. поиск самого короткого слова в строке. я решал не много по другому, у мен получилось вот что:
Код

program MINWORD;
uses crt;
var
  s: string;
  min,i: integer;
begin
clrscr;
write('VVEDITE PREDLOZHENIE ');
read(s);min:=256;
repeat
i:=pos(' ',s);
delete(s,1,i);
if (i-1 < min) and (i > 1) then min:=i-1;
until i=0;
write('Samoe korotkoe slovo = ',min);
readkey;
end.

но это выводит только длину мин. слова. про copy я знаю, но не могу понять куда и как приписать счетчик чтобы он позицию считал. вообщем, помогите плиз, доделать мою прогу. надо чтобы выводил именно слово.
заранее спс)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Цитата(greenday @ 8.04.2006 23:07)
про copy я знаю, но не могу понять куда и как приписать счетчик чтобы он позицию считал.

Плохой способ избрал вообще-то. Удаляешь символы из строки - строку придется дублировать. Ну, как знаешь:
program MINWORD;
uses crt;
var
s, st: string;
min,i: integer;

k, p:integer;
begin
clrscr;
write('VVEDITE PREDLOZHENIE ');
read(st);

s := st;
min := 256; k := 0;
repeat
i := pos(' ', s);
delete(s, 1, i);
inc(k, i);
if (i-1 < min) and (i > 1) then begin
min := i-1;
p := k-i+1;
end;
until i=0;

write('Samoe korotkoe slovo = ',min, ' : ', copy(st, p, min) );
readkey;
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


В принципе это можно исправить, запихнуть в процедуру и передавать строку не черерез var параметр ... Еу и строку соответственно глобально не описывать smile.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






to klem4 к сожалению, нас процедурам не учили и по-этому ими пользоваться нельзя.
огромное вам спасибо!
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 2:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name