Как найти самое короткое слово на паскале

2 / 2 / 1

Регистрация: 15.01.2011

Сообщений: 45

1

задача на строки найти самое короткое слово

26.04.2012, 19:40. Показов 22279. Ответов 7


Студворк — интернет-сервис помощи студентам

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



1



КонецСвета

Почетный модератор

7966 / 3937 / 2464

Регистрация: 30.10.2011

Сообщений: 5,377

26.04.2012, 19:51

2

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses crt;
var s,sl,smin: string;
    i,dmin: integer;
begin
write('Введите строку ');
readln(s);
s:=s+' '; sl:='';dmin:=length(s);
for i:=1 to length(s) do
    if s[i]<>' ' then sl:=sl+s[i]
       else
       begin
       if (length(sl)<dmin) and (length(sl)<>0) then
          begin
          dmin:=length(sl);
          smin:=sl;
          end;
       sl:='';
       end;
writeln ('Самое короткое слово "',smin,'" длиной в ',dmin,' символов');
readkey
end.



2



2 / 2 / 1

Регистрация: 15.01.2011

Сообщений: 45

26.04.2012, 20:11

 [ТС]

3

спасибо а если не сложно можно с объяснениями что за что каждая строка отвечает



0



КонецСвета

Почетный модератор

7966 / 3937 / 2464

Регистрация: 30.10.2011

Сообщений: 5,377

26.04.2012, 21:30

4

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses crt;
var s,sl,smin: string;
    i,dmin: integer;
begin
write('Введите строку ');          //запрашиваю строку
readln(s);
s:=s+' '; sl:='';dmin:=length(s);  //добавляю пробел, чтобы не потерять последнее слово, очищаю переменную для слова, изначально считаю, что самое маленькое слово=длине строки
for i:=1 to length(s) do           //в цикле перебираю все символы строки
    if s[i]<>' ' then sl:=sl+s[i]  //если символ не пробел, добавляю его к слову
       else                         //иначе
       begin                        //перехожу к обработке полученного слова
       if (length(sl)<dmin) and (length(sl)<>0) then   //если длина найденного слова меньше ранее означенной минимальной длины, но больше 0
          begin
          dmin:=length(sl);         //запоминаю новую минимальную длину
          smin:=sl;                 //и запоминаю новое минимальное слово
          end;
       sl:='';                      //очищаю переменную слова для следующего слова
       end;
writeln ('Самое короткое слово "',smin,'" длиной в ',dmin,' символов');   //вывожу результат
readkey
end.



1



Emilg

2 / 2 / 1

Регистрация: 15.01.2011

Сообщений: 45

26.04.2012, 21:49

 [ТС]

5

спасибо большое у меня еще вопрос если несложно сможете посмотреть эту задачу тоже сделал непойму почему не работает
1.Написать программу табулирования сложной функции

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
program z10_4;
uses crt;
var x,z,z1,z2,y:real;
i,n:integer;
begin
clrscr;
x:=-2;n:=1;
while x<=3.5 do
begin
y:=x/(2*n);
z:=x/2;
for n:=2 to 8 do
z1:=z+y*x;
z1:=z1*(x/2);
n:=1;
y:=sqr(x)/(4*n);
z2:=0;
for n:=1 to 6 do
z2:=z2+y*sqr(x);
z2:=z2*(sqr(x)+1)/3;
z:=z1+z2;
writeln('z(',x:2:2,')=',z:2:2);
x:=x+0.5;
end;
end.

Миниатюры

задача на строки найти самое короткое слово
 



0



Почетный модератор

7966 / 3937 / 2464

Регистрация: 30.10.2011

Сообщений: 5,377

26.04.2012, 21:51

6

Emilg, с математикой — туго… и лучше выложи эту программу в основной своей теме с этой задачей — и шансов больше, и правила соблюдены..



1



2 / 2 / 1

Регистрация: 15.01.2011

Сообщений: 45

27.04.2012, 05:16

 [ТС]

7

подскажите пможет что-нибудь получится



1



0 / 0 / 1

Регистрация: 16.12.2015

Сообщений: 10

11.12.2016, 21:04

8

А не подскажите, как сделать так, чтобы программа удваивала самое короткое слово и выводила результат?



0



uses crt;
var s,p,s1,s2:string;
    min,len,i:integer;
begin
  clrscr;
  writeLn('Vvedite stroku: ');//строка может идти и после точки
  readLn(s);
  writeln;
  p:=copy(s,1,pos('.',s)-1)+' ';//выделяем первое предложение до точки, но без нее и добавляем пробел
  s1:=''; min:=255;//за мин берем самое возможно длинное слово
  while pos(' ',p) > 0 do //пока в предложении есть пробелы
   begin
    len:=pos(' ',p)-1; //определяем длину слова от начала до пробела
      s1:=copy(p,1,len);//запоминаем это слово
    if len < min then //если оно короче предыдущего короткого
      begin
        s2:=s1; //запоминаем его еще раз
        min:=len;//запоминаем его длину
      end;
    delete(p,1,pos(' ',p));//удаляем просмотренное слово
   end;
  write(s2);//выводим самое короткое
  readLn;
end.

IPB

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

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

> Самое короткое слово в строке

сообщение 28.10.2005 0:41

Сообщение
#1


Новичок
*

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

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



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

Прикрепленные файлы
Прикрепленный файл
 WORDLENG.PAS ( 626 байт )
Кол-во скачиваний: 323

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Altair

сообщение 28.10.2005 0:51

Сообщение
#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 

 К началу страницы 

+ Ответить 

volvo

сообщение 28.10.2005 1:11

Сообщение
#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.

 К началу страницы 

+ Ответить 

art88

сообщение 29.10.2005 21:40

Сообщение
#4


Новичок
*

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

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



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

Прикрепленные файлы
Прикрепленный файл
 WL_FUNCT.PAS ( 939 байт )
Кол-во скачиваний: 258

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Altair

сообщение 29.10.2005 21:53

Сообщение
#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 

 К началу страницы 

+ Ответить 

volvo

сообщение 29.10.2005 22:06

Сообщение
#6

Гость



Цитата

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

Легко… В моей программе достаточно добавить счетчик слов, и если он будет равен 0 или 1 то выдавать сообшение об ошибке…

 К началу страницы 

+ Ответить 

volvo

сообщение 29.10.2005 23:16

Сообщение
#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.

 К началу страницы 

+ Ответить 

art88

сообщение 30.10.2005 0:42

Сообщение
#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 

 К началу страницы 

+ Ответить 

volvo

сообщение 30.10.2005 0:45

Сообщение
#9

Гость



Я не понял, тебя твоя же чуть-чуть подправленная программа (из поста №7) уже НЕ устраивает? Тогда объясни, чем…

 К началу страницы 

+ Ответить 

art88

сообщение 30.10.2005 2:29

Сообщение
#10


Новичок
*

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

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



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

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

volvo

сообщение 30.10.2005 2:39

Сообщение
#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.

 К началу страницы 

+ Ответить 

PORTUGAL

сообщение 7.02.2006 1:28

Сообщение
#12

Новичок
*

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

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



А как сделать что бы вместо длины самого короткого слова, выводилось само слово?

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

klem4

сообщение 7.02.2006 1:38

Сообщение
#13


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

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

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



———————

perl -e ‘print for (map{chr(hex)}(«4861707079204E6577205965617221″=~/(.{2})/g)), «n»;’

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

PORTUGAL

сообщение 7.02.2006 2:05

Сообщение
#14

Новичок
*

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

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



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

Выдает — invalid variabe referense

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

volvo

сообщение 7.02.2006 2:07

Сообщение
#15

Гость



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

такое выдает? blink.gif

 К началу страницы 

+ Ответить 

greenday

сообщение 9.04.2006 3:07

Сообщение
#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 я знаю, но не могу понять куда и как приписать счетчик чтобы он позицию считал. вообщем, помогите плиз, доделать мою прогу. надо чтобы выводил именно слово.
заранее спс)

 К началу страницы 

+ Ответить 

volvo

сообщение 9.04.2006 3:30

Сообщение
#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.

 К началу страницы 

+ Ответить 

klem4

сообщение 9.04.2006 9:15

Сообщение
#18


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

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

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



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

———————

perl -e ‘print for (map{chr(hex)}(«4861707079204E6577205965617221″=~/(.{2})/g)), «n»;’

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Гость

сообщение 9.04.2006 13:28

Сообщение
#19

Гость



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

 К началу страницы 

+ Ответить 

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

Пользователей: 0

500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают

Связь с администрацией: bu_gen в домене octagram.name

uses crt;
const rz=['.',',',';',':','?','!'];
var s,s1,sk:string;
    len,k,i,ik,f:byte;
begin
clrscr;
writeln('Введите строку из слов, отделеннvх пробелами:');
readln(s);
for i:=1 to length(s) do{заменим разделители на пробелы}
if s[i] in rz then s[i]:=' ';
s:=s+' ';{добавим к ней пробел}
while pos('  ',s)>0 do{удалим лишние пробелы, в кавычках 2 пробела}
delete(s,pos('  ',s),1);{в кавычках 2 пробела}
if s[1]=' 'then delete(s,1,1);{1 удаляем}
sk:='';{короткое слово, пока его нет}
k:=255;{длина короткого слова}
while pos(' ',s)>0 do{пока есть пробелы}
 begin
  len:=pos(' ',s)-1;{длина очередного слова}
  s1:=copy(s,1,len);{само слово}
  if len<k then{если меньше предыдущих}
   begin
    sk:=s1; {запомним}
    k:=len; {его длина}
   end;
  delete(s,1,pos(' ',s));{удаляем проверенное слово, следующее первое}
 end;
writeln('Самое короткое слово:  ',sk);
readln
end.

Var
  s:string;
  max,min,i,k:integer;
begin
write(‘Введите строку: ‘);
readln(s);
s:=s+’ ‘;
for i:=1 to length(s) do
  begin
  if s[i]=’ ‘ then
     begin
     if k>max then max:=k;
     if (k<min) or (min=0) then min:=k;
     k:=-1;
     end;
  k:=k+1;
  end;
writeln(‘Самое короткое: ‘,min,’; самое длиное: ‘,max);
end.

Понравилась статья? Поделить с друзьями:
  • Как можно найти мошенников по номеру телефона
  • Как составить тренировочную программу для женщин
  • Как найти дневник мохана гейла в аэропорту
  • Как исправить осанку подручными
  • Как вы нашли работу в израиле