Тема: Символи та рядкові типи

Завдання: дано символьний рядок S, визначити у послідовності кількість слів довжиною не більше чотирьох символів.

procedure TForm1.Button1Click(Sender: TObject);
 var i,k,j,n:integer;
 s:string;
begin
 s:=Edit1.Text;
 k:=0; j:=0;
for i := 1 to Length(s) do
  if copy(s,i,1)=' ' then j:=0
  else
  if copy(s,i,1)<>' ' then
  begin
     if j<5 then j:=j+1
     else
     if (j>=5) then j:=0
     else
     if j=4 then k:=k+1;

  end;  

end;

Я вже як тільки не грався з цим кодом, все одно нічого не виходить. У мене уже скільки версій цієї програми, а от яка дійсно виконує цю задачу немає.

2

Re: Символи та рядкові типи

Ну давайте просто за логікою:
- перебираємо всі символи:
  - якщо це не пробіл, то поточне слово довше на 1 літеру
  - інакше (тобто якщо це пробіл), то:
      - якщо поточне слово в 4 літери, зараховуємо це;
      - поточне слово стає довжиною 0 літер (бо почалося нове)
Ніби все. Переписати в Паскалі зможете?

3

Re: Символи та рядкові типи

Перевіряти довжину попереднього слова, та збільшувати лічильник слів треба як раз тоді, коли ви зустріли черговий пробіл.

4 Востаннє редагувалося ravgrey (01.03.2015 22:18:42)

Re: Символи та рядкові типи

Подивись на функцію pos
Я би зробив так: тією функцією розбити вхідну строку на підстроки, і потім або паралельно підраховувати кількість підстрок з довжиною більше 4-х символів
З кодом зараз не дпоможу, тому що пишу з планшета

5

Re: Символи та рядкові типи

koala написав:

Ну давайте просто за логікою:
- перебираємо всі символи:
  - якщо це не пробіл, то поточне слово довше на 1 літеру
  - інакше (тобто якщо це пробіл), то:
      - якщо поточне слово в 4 літери, зараховуємо це;
      - поточне слово стає довжиною 0 літер (бо почалося нове)
Ніби все. Переписати в Паскалі зможете?

Ви маєте це на увазі?

for i := 1 to Length(s) do
  if copy(s,i,1)<>' ' then j:=j+1
  else
  if copy(s,i,1)=' ' then
  begin
     if j=4 then k:=k+1;
     j:=0;
  end;  

6 Востаннє редагувалося koala (03.03.2015 16:59:33)

Re: Символи та рядкові типи

Так. Пара зауважень:
- copy( s, i, 1 ) значно красивіше записується як s[ i ];
- в else немає сенсу перевіряти знову зворотню умову, вона там і так не виконується;
- краще завжди після then ставити begin-end, щоб уникнути ситуації

if a>0 then x:=1;y:=1;

- y дописаний окремо, але він не за умови a>0, а завжди буде 1.
Разом:

if s[ i ]<>' ' then begin
  j:=j+1
end 
else begin
  if j=4 then begin
    k:=k+1;
    j:=0;
  end;
end;  

7

Re: Символи та рядкові типи

koala написав:

Разом:

if s[ i ]<>' ' then begin
  j:=j+1
end 
else begin
  if j=4 then begin
    k:=k+1;
    j:=0;
  end;
end;  

дякую за виправлення і код, але є певні нюанси:
- програма вираховує тільки слова з 4 літерами, а в разі введення 3-ох, двох, або більше лічильник не працює. За моєю логікою то так би виправилась помилка, але не працює..

procedure TForm1.Button1Click(Sender: TObject);
 var i,k,j:integer;
 s:string;
begin
 s:=Edit1.Text;
 k:=0; j:=0;
 for i := 1 to Length(s) do
 begin
  if s[ i ]<>' ' then
  begin
  j:=j+1
  end
else
begin
  if j=4 then
  begin
    k:=k+1;
    j:=0;
  end
  else
  begin
  if (j<4) and (s[i+1]=' ' ) then j:=0;
  end;
end;
 end;
   edit3.Text:=inttostr(k);
end;

   

На мою думку, ця проблема зумовлена тим, що на далі 

 j

не має змоги обнулятися, але якщо я винесу за межі дужок, то потім усе обчислюється, але елементи, які більше 4 - також додаються. Ця проблема і переслідує протягом виконання цього завдання.

Post's attachments

1_1.JPG 56.91 kb, 265 downloads since 2015-03-03 

8

Re: Символи та рядкові типи

Неуважно читав. Ну так j<=4, нє?

9

Re: Символи та рядкові типи

Дякую всім за допомогу, ось нарешті виконав!

procedure TForm1.Button1Click(Sender: TObject);
 var i,k,j:integer;
 s:string;
begin
 s:=Edit1.Text;
 k:=0; j:=0;
 for i := 1 to Length(s) do
 if s[ i ]<>' ' then begin
  j:=j+1
end
else
if (s[i]=' ') and (j<>4) then j:=0
else begin
  if (j=4) then begin
    k:=k+1;
    j:=0;
  end;
end;

   edit3.Text:=inttostr(k);
end;

end.
Подякували: 0xDADA11C71

10

Re: Символи та рядкові типи

 if s[ i ]<>' ' then ...
else
if (s[i]=' ') and (j<>4)

Надмірна умова. В гілку else код потрапить тільки якщо s[ i ] <> ' ' не виконається, тобто якщо s[ i ] = ' '.