0 / 0 / 1
Регистрация: 23.01.2010
Сообщений: 45
1

Определить в строке количество слов, начинающихся с заданной буквы

02.06.2010, 20:27. Показов 5086. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Строка текста содержит слова, пробелы, знаки препинания. Текст размещен в одной или нескольких строках. Перенос слов со строки на строку запрещен. Определить количество слов, начинающихся с заданной буквы, наибольшие и наименьшие количество слов в предложениях текста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2010, 20:27
Ответы с готовыми решениями:

Определить количество слов, начинающихся с заданной буквы
задан текст, заканчивающий точкой. Слова в тексте разделены пробелом или несколькими пробелами....

Определить количество слов во введенном тексте, начинающихся с заданной буквы
определить количество слов во введенном тексте начинающихся с заданной буквы.считать что слова в...

В строке определить количество слов, начинающихся с заданной буквы.
В заданной строке определить количество слов, начинающихся с заданной буквы.

Определить количество слов в введённом тексте, начинающихся с заданной буквы.
Определить количество слов в введённом тексте, начинающихся с заданной буквы. Считать, что слова...

6
13097 / 5878 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
02.06.2010, 20:52 2
Предлагаю две функции:
1. GetWordCount() подсчитывает все слова в заданном тексте.
2. GetWordCountA() выделяет слова, каждое слово можно проанализировать и в зависимости от анализа можно выполнить нужные действия - подсчитать слово или отказаться от подсчёта очередного слова, либо сделать ещё что-то.
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
26
27
28
29
30
31
32
(*Подсчитывает количество слов в тексте aStr.*)
function GetWordCount(const aStr : String) : Integer;
const
  (*Множество разделителей слов.*)
  D = [' ', '.', ',', ':', ';', '!', '?', '-', Char(9), Char(10), Char(13)];
var
  (*i - индекс символов в строке.
  Pos2 = 0 - конец слова не найден, Pos2 > 0 - найден конец слова.
  Cnt - счётчик слов.*)
  i, Pos2, Cnt : Integer;
begin
  (*Перебор всех символов строки.*)
  Pos2 := 0;
  Cnt := 0;
  for i := 1 to Length(aStr) do begin
    (*Пропускаем разделители.*)
    if aStr[i] in D then Continue;
    (*Отслеживаем конец слова.*)
    if i = Length(aStr) then
      Pos2 := i
    else if aStr[i + 1] in D then
      Pos2 := i
    ;
    (*Если конец слова найден, производим подсчёт.*)
    if Pos2 > 0 then begin
      Inc(Cnt);
      Pos2 := 0;
    end;
  end;
 
  GetWordCount := Cnt;
end;
2.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
(*Выделение слов из текста aStr и подсчёт слов по результатам их анализа.*)
function GetWordCountA(const aStr : String) : Integer;
const
  (*Множество разделителей слов.*)
  D = [' ', '.', ',', ':', ';', '!', '?', '-', Char(9), Char(10), Char(13)];
var
  (*i - индекс символов в строке.
  Pos1, Pos2 - координаты отдельного слова.
  Cnt - счётчик слов.*)
  i, Pos1, Pos2, Cnt : Integer;
  (*Отдельное слово, выделенное из текста.*)
  StrWord : String;
begin
  (*Перебор всех символов строки.*)
  Pos1 := 0;
  Pos2 := 0;
  Cnt := 0;
  for i := 1 to Length(aStr) do begin
    (*Пропускаем разделители.*)
    if aStr[i] in D then Continue;
    (*Отслеживаем начало слова.*)
    if i = 1 then
      Pos1 := i
    else if aStr[i - 1] in D then
      Pos1 := i
    ;
    (*Отслеживаем конец слова.*)
    if i = Length(aStr) then
      Pos2 := i
    else if aStr[i + 1] in D then
      Pos2 := i
    ;
    (*Если конец слова найден, производим анализ и подсчёт.*)
    if Pos2 > 0 then begin
      StrWord := Copy(aStr, Pos1, Pos2 - Pos1 + 1);
 
      (*В данный момент в переменной StrWord записано очередное слово, выделенное
      из текста. Теперь это слово можно проанализировать и произвести с ним
      какие-то действия - например, подсчитать его или отказаться от подсчёта.*)
 
      (*Анализ и подсчёт. Начало.*)
 
      (*...*)
 
      (*
      Inc(Cnt);
      *)
 
      (*...*)
 
      (*Анализ и подсчёт. Конец.*)
 
      Pos2 := 0;
    end;
  end;
 
  GetWordCountA := Cnt;
end;
1
0 / 0 / 1
Регистрация: 23.01.2010
Сообщений: 45
03.06.2010, 22:11  [ТС] 3
Эмм ... извиняюсь конечно, но выдает ошибку Error 10: Unexpected end of file.
0
Платежеспособный зверь
8835 / 4269 / 1621
Регистрация: 28.10.2009
Сообщений: 11,407
03.06.2010, 22:14 4
ошибка, видимо, в создании файла или неверном его считывании
файл создавай в блокноте и проверяй, правильно ли считывается
0
0 / 0 / 1
Регистрация: 23.01.2010
Сообщений: 45
03.06.2010, 22:32  [ТС] 5
там при считывание выдает ошибку только на конец, т.е. на слово end ...
0
13097 / 5878 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
03.06.2010, 23:28 6
Цитата Сообщение от Risk Посмотреть сообщение
там при считывание выдает ошибку только на конец, т.е. на слово end
Надо посмотреть код - тогда можно будет определить причину ошибки. Тот код, который в моём предыдущем посте опубликован - это не целостная программа, а отдельные функции.
1
13097 / 5878 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
05.06.2010, 23:30 7
Полное решение. Здесь исходный текст берётся из файла. Текст в файле должен быть в DOS кодировке - т. е. в кодировке, согласно кодовой странице CP866.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
program Project1;
 
(*Функция возвращает заглавный вариант буквы. Если символ не является буквой,
то вернёт этот же символ без изменений.
Эта функция правильно обрабатывает буквы кириллицы и латиницы согласно
кодовой странице CP866.*)
function UpperRu(const aCh : Char) : Char;
begin
  case aCh of
    (*Буквы кириллицы:*)
 
    (*Буквы: "а".."п" -> "А".."П". Кроме буквы "ё".*)
    #$A0..#$AF : UpperRu := Char( Ord(aCh) - $20 );
    (*Буквы: "р".."я" -> "Р".."Я".*)
    #$E0..#$EF : UpperRu := Char( Ord(aCh) - $50 );
    (*Буква: "ё" -> "Ё".*)
    #$F1 : UpperRu := #$F0;
 
    (*Буквы латиницы:*)
 
    (*Буквы: "a".."z" -> "A".."Z".*)
    #$61..#$7A : UpperRu := Char( Ord(aCh) - $20 );
 
    (*Символы, которые не являются буквами не изменяем.*)
    else UpperRu := aCh;
  end;
end;
 
const
  (*Имя входного файла.*)
  Fn = 'file.txt';
  (*Максимальная длина обрабатываемого текста.*)
  N = 10000;
  (*Разделители предложений.*)
  DmOffer = ['.', '!', '?'];
  (*Разделители слов.*)
  DmWord = DmOffer + [' ', ',', ':', ';', #9, #10, #13];
var
  (*Файловая переменная для связи с входным файлом.*)
  F : file;
  (*Массив, содержащий текст.*)
  Arr : array[1..N] of Char;
  (*i - индекс символов в тексте,
  Size - количество символов в тексте,
  CntW - количество слов в отдельном предложении,
  CntWMin - наименьшее количество слов в отдельных предложениях,
  CntWMax - наибольшее количество слов в отдельных предложениях,
  CntWL - количество слов по всему тексту, начинающихся на заданную букву.*)
  i, Size, CntW, CntWMin, CntWMax, CntWL : Integer;
  (*Координаты:
  Po2 - конец предложения;
  Pw1, Pw2 - начало и конец слова*)
  Po2, Pw1, Pw2 : Integer;
  (*Символ, заданный пользователем.*)
  Lett : Char;
  (*Флаг, показывающий является ли данное предложение первым в тексте.*)
  IsFirstOffer : Boolean;
begin
  (*Читаем из входного файла исходный текст. Для удобства чтения, входной
  файл объявлен, как нетипизированный файл.*)
 
  (*Связываем файловую переменную с именем файла.*)
  Assign(F, Fn);
  {$I-}
  (*Открываем файл в режиме чтения блоками кратными одному байту.*)
  Reset(F, 1);
  {$I-}
  (*Если на этапе открытия файла произошли ошибки, прерываем программу.*)
  if IOResult <> 0 then begin
    Writeln('Входной файл с именем "', Fn, '" не удалось открыть.');
    Writeln('Возможно этот файл не существует. Программа прервана.');
    Readln;
    Exit;
  end;
 
  Writeln('Задайте букву:');
  Readln(Lett);
  Lett := UpperRu(Lett);
  Writeln('При проверке первых букв в словах регистр не будет учитываться.');
 
  (*Читаем в массив Arr данные из файла. В переменную Size будет записано
  реальное количество прочитанных байт. Если файл окажется меньшим или равным
  размеру массива, то Size будет равен размеру файла. Если файл больше размера
  массива, тогда Size будет равен N - т. е. равен длине массива Arr.
  Для передачи длины массива применим функцию High(Arr), которая возвращает верхнее
  значение индекса. Т. к. индекс у нас отсчитывается от 1, то High(Arr) будет равен
  длине массива.*)
  BlockRead(F, Arr, High(Arr), Size);
  (*Закрываем входной файл.*)
  Close(F);
 
  (*Обрабатываем текст, прочитанный из файла.*)
 
  CntW := 0;
  CntWMin := 0;
  CntWMax := 0;
  CntWL := 0;
  IsFirstOffer := True;
  Pw1 := 0;
  Pw2 := 0;
  Po2 := 0;
  for i := 1 to Size do begin
    (*Отслеживаем конец предложения.*)
    if i = Length(Arr) then
      Po2 := i
    else if Arr[i] in DmOffer then
      Po2 := i
    ;
    (*Если текущий символ не является разделителем.*)
    if not ( Arr[i] in DmWord ) then begin
      (*Отслеживаем начало слова.*)
      if i = 1 then
        Pw1 := i
      else if Arr[i - 1] in DmWord then
        Pw1 := i
      ;
      (*Отслеживаем конец слова.*)
      if i = Length(Arr) then
        Pw2 := i
      else if Arr[i + 1] in DmWord then
        Pw2 := i
      ;
    end;
 
    (*Если найден конец слова.*)
    if Pw2 > 0 then begin
      (*Подсчёт количества слов, начинающихся с заданной буквы.*)
      if UpperRu( Arr[Pw1] ) = Lett then Inc(CntWL);
      (*Подсчёт количества слов в текущем предложении.*)
      Inc(CntW);
      (*Сброс координаты конца слова.*)
      Pw2 := 0;
    end;
 
    (*Если найден конец предложения.*)
    if Po2 > 0 then begin
      (*Уточняем сведения по мин. и макс. количеству слов в пределах отдельных
      предложений.*)
      if IsFirstOffer then begin
        CntWMin := CntW;
        IsFirstOffer := False;
      end;
      if CntW < CntWMin then CntWMin := CntW;
      if CntW > CntWMax then CntWMax := CntW;
      (*Сброс счётчика слов в пределах предложения.*)
      CntW := 0;
      (*Сброс координаты конца предложения.*)
      Po2 := 0;
    end;
  end;
 
  Writeln('Количество слов в тексте, которые начинаются на заданную букву:');
  Writeln(CntWL);
  Writeln('Наименьшее количество слов в пределах отдельных предложений:');
  Writeln(CntWMin);
  Writeln('Наибольшее количество слов в пределах отдельных предложений:');
  Writeln(CntWMax);
 
  Readln;
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2010, 23:30
Помогаю со студенческими работами здесь

Определить количество слов в строке, начинающихся с заданной пары символов. Строка размещается в динамической памяти
определить количество слов в строке, начинающихся с заданной пары символов. Строка размещается в...

В заданной строке определить количество слов, которые начинаются с гласной буквы
в заданной строке определить количество слов,которые начинаються с гласной буквы.

Определить количество слов, начинающихся с заданной буквы
Здрасьте, помогите, пожалуйста, решить эту задачу. Задача: В заданной строке, состоящей из слов,...

В заданной последовательности определить количество слов, начинающихся с указанной буквы
7.Дана непустая последовательность непустых слов из латынских букв; соседние слова отделены друг от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru