1

Тема: Визначити кількість слів.

Var numA : Longint;
Function GetFirstWord (SS : String) : String;
Var S : String;
Begin
  S:=SS;
  While S[1]=' ' do Delete(S,1,1);
  If Length(S)>0 then
    If Pos(' ',S)=0 then GetFirstWord:=S
    else GetFirstWord:=Copy(S,1,Pos(' ',S)-1)
  else GetFirstWord:='';
End;
 
Procedure CalcWords(CC : String);
Var C : String;
Begin
  C:=CC;
  If Length(C)>0 then
  Begin
    Case GetFirstWord(C)[1] of
      'a','A','а','А' : Inc(numA);
    End;
    Delete(C,1,Pos(GetFirstWord(C),C)+Length(GetFirstWord(C)));
    CalcWords(C);
  End;
End;
 
Begin
   numA:=0;
   CalcWords('    it"s testing a string for acheck work apascode ');
   Writeln(numA);
End.

Умова до задачі: 
Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містять усередині себе пробілів, називатимемо словами. Вважатимемо, що текст завжди починається зі слова. Визначити кількість слів, які починаються з літер «а» або «А».
Чи правильна програма? І як її можна покращити?Тема: "Робота з рядками"

2

Re: Визначити кількість слів.

vanekulykov написав:

Чи правильна програма?

Це питайте в замовника (чи викладача). Якщо його влаштовує - нас влаштує тим більше.

vanekulykov написав:

І як її можна покращити?

Будь-яку програму завжди можна покращити. Додайте GUI, наприклад.
А якщо серйозно - то:
- в умові сказано "текст завжди починається зі слова". У вас текст починається з пробіла;
- Delete - відносно повільна операція, тому бажано лічити символи, а потім видаляти їх гамузом;
- в case два рази одні й ті самі значення;
- GetFirstWord - повільна операція, тому бажано її викликати один раз для одного значення, а потім порівнювати збережений результат. Тобто не

  Delete(C,1,Pos(GetFirstWord(C),C)+Length(GetFirstWord(C)));

а

FirstWord := GetFirstWord(C);
  Delete(C,1,Pos(FirstWord, C)+Length(FirstWord));

Ну і з урахуванням того, що рядок має починатися зі слова - може, не варто шукати позицію першого слова в рядку?

3

Re: Визначити кількість слів.

vanekulykov, А ви самі як вважаєте?

4

Re: Визначити кількість слів.

вона просто не працює, і викладача не влаштовує *NO*

5

Re: Визначити кількість слів.

Bartash написав:

vanekulykov, А ви самі як вважаєте?

ніяк, адже вона не працює

6

Re: Визначити кількість слів.

Розкрийте деталі - що значить "не працює"? Комп'ютер вмикали?

7

Re: Визначити кількість слів.

vanekulykov
У всіх отих Copy та Delete дуже легко заплутатися. Мені здається, що тут було б набагато простіше пробігтися одним циклом по всьому рядку. Треба буде лише перевірити значення поточного та попереднього символів. Щось на зразок такого:

if (s[i] = 'A') and (s[i-1] = ' ') then
//...

8

Re: Визначити кількість слів.

koala написав:

Розкрийте деталі - що значить "не працює"? Комп'ютер вмикали?

Я натискаю Run, а вона просто не реагує

9

Re: Визначити кількість слів.

Torbins написав:

vanekulykov
У всіх отих Copy та Delete дуже легко заплутатися. Мені здається, що тут було б набагато простіше пробігтися одним циклом по всьому рядку. Треба буде лише перевірити значення поточного та попереднього символів. Щось на зразок такого:

if (s[i] = 'A') and (s[i-1] = ' ') then
//...

Я не розумію, що ви маєте на увазі. Я тільки почав вивчати Паскаль

10

Re: Визначити кількість слів.

vanekulykov написав:

Я натискаю Run, а вона просто не реагує

Ну а пише щось у відповідь? Може на Longint свариться?

vanekulykov написав:

Я не розумію, що ви маєте на увазі. Я тільки почав вивчати Паскаль

http://pascal.org.ua/structure-types#string
http://pascal.org.ua/expressions#logic

11

Re: Визначити кількість слів.

vanekulykov написав:
Torbins написав:

vanekulykov
У всіх отих Copy та Delete дуже легко заплутатися. Мені здається, що тут було б набагато простіше пробігтися одним циклом по всьому рядку. Треба буде лише перевірити значення поточного та попереднього символів. Щось на зразок такого:

if (s[i] = 'A') and (s[i-1] = ' ') then
//...

Я не розумію, що ви маєте на увазі. Я тільки почав вивчати Паскаль

Думаю пан Torbins мав на увазі щось таке:

Прихований текст
readln(str);

NumOfWords:=0;
for i:=2 to length(str)-1 do
    if (upcase(str[i])='A') and (str[i-1]=' ')then inc(NumOfWords);
if upcase(str[1])='A' then inc(NumOfWords);

де str - наш текст, кожне слово розподілене пробілом, і має починатись на 'a' чи на 'A', отже перед нашим словом має стояти пробіл (за винятком початку).

Щодо роз'яснення всіх невідомих змінних і функцій у коді можна звернутись до надійного помічника

12

Re: Визначити кількість слів.

vanekulykov написав:
koala написав:

Розкрийте деталі - що значить "не працює"? Комп'ютер вмикали?

Я натискаю Run, а вона просто не реагує

Не реагує - чи реагує дуже швидко? Додайте наприкінці, перед останнім end з крапкою, readln і спробуйте запустити (щоб закрити вашу програму, натисніть enter).

Подякували: vanekulykov1

13

Re: Визначити кількість слів.

В тому й річ. Що затримку екрану зробив. А кнопку Ран наче заїло. в Меню Ран заходить, але  при запуску безпосередньо програми не реагує

14

Re: Визначити кількість слів.

koala написав:

Розкрийте деталі - що значить "не працює"? Комп'ютер вмикали?

Дуже смішно. Тут запара і ще ви зі своїм "компютер вмикали?" . Ні, блін, я на вимкненому набирав. Безглузді жарти у вас, і це погано, багато користувачів буде відвертатися. А це як я знаю, репутація...

15

Re: Визначити кількість слів.

Ну тоді я вам відкрию секрет: існує більше одного компілятора для Паскаля, а ваша проблема, виглядає, специфічна для компілятора.

16

Re: Визначити кількість слів.

vanekulykov
Тут би дуже допомогли скріншоти.

17

Re: Визначити кількість слів.

fastergus2dog написав:

Написав би шо я не знаю як написати таку програму ми б тобі з радістю допомогли. І взагалі там діло кількох хвилин, а ви тут базар розвели.

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