8 / 7 / 2
Регистрация: 23.06.2009
Сообщений: 41

Разработать программу, которая подсчитывает число слов в текстовом файле и собирает статистику

23.06.2009, 17:25. Показов 6514. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Разработайте программу, которая подсчитывает число слов в текстовом файле и собирает статистику встречаемости для каждого слова.

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

Статистика накапливается в текстовом файле, который отсортирован в алфавитном порядке и содержит строки формата:
<слово><пробел><количество вхождений>

зы: заранее большое спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.06.2009, 17:25
Ответы с готовыми решениями:

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

Разработать программу, которая подсчитывает количество однокоренных слов
Помогите, пожалуйста, разработать программу, которая анализирует файл и подсчитывает количество слов, объединяя статистику для однокоренных...

Создать в программе Блокнот текстовый файл. Написать программу, которая высчитывает количество слов и чисел в созданном текстовом файле.
Через процедуру Assign.... Создать в программе Блокнот текстовый файл. Написать программу, которая высчитывает количество слов и чисел...

10
Посланник моего господина
111 / 106 / 52
Регистрация: 02.05.2009
Сообщений: 181
23.06.2009, 18:19
mx — максимальное количество слов.
Считывание строки с клавиатуры.
Ввод данных с файла организуй самостоятельно. Кроме того, можешь добавить список русских букв в константу letters для того, чтобы русские слова воспринимались программой.
Если возникнут вопросы с реализацией, пиши сюда, ответим.

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
program A1;
 
const mx=10;
var s:string;
var d:array[1..mx] of string[20];
var c:array[1..mx] of byte;
var count:0..mx;
 
function NextWord(var s:string):string;
begin
     while (s<>'') and (s[1]=' ') do delete(s,1,1);
     NextWord:=copy(s,1,pos(' ',s)-1);
     delete(s,1,pos(' ',s));
end;
function Add(w:string):boolean;
         var a:integer;
         begin
              if w='' then Add:=false
              else begin
                   a:=1;
                   while (a<=count) and (d[a]<>w) do inc(a);
                   if a<=count then c[a]:=c[a]+1
                      else begin
                           inc(count);
                           d[count]:=w;
                           c[count]:=1;
                      end;
                   Add:=true;
              end;
         end;
procedure Sort;
          var a,b:integer;
          var ts:string;
          var ti:integer absolute ts;
          begin
               for a:=count downto 1 do
                   for b:=a-1 downto 1 do
                       if d[b]>d[b+1] then
                          begin
                               ts:=d[b];
                               d[b]:=d[b+1];
                               d[b+1]:=ts;
                               ti:=c[b];
                               c[b]:=c[b+1];
                               c[b+1]:=ti;
                          end;
 
          end;
procedure ShowList;
          var a:integer;
          begin
               for a:=1 to count do
                   begin
                        write('>');
                        write(d[a],' ',c[a]);
                        writeln;
                   end;
          end;
procedure ChangeString(var s:string);
          const letters : set of char = ['a'..'z','A'..'Z'];
          var a:integer;
          begin
               for a:=1 to length(s) do
                   if Not(s[a] in letters) then s[a]:=' ';
          end;
begin
write('<<');
readln(s);
s:=s+' '; {Last word must have a space after him}
ChangeString(s);
count:=0;
repeat
until not Add(NextWord(s));
Sort;
ShowList;
end.
1
8 / 7 / 2
Регистрация: 23.06.2009
Сообщений: 41
23.06.2009, 23:14  [ТС]
Спасибо за код.
Подскажи, пожалуйста, что значит delete(s,1,1); NextWord:=copy(s,1,pos(' ',s)-1); delete(s,1,pos(' ',s)); (11-13 строчки) и var ti:integer absolute ts; (34 строчка). А то первый раз встречаюсь с этим.

Так и не смог найти ошибку где то в сортировке, например при вводе строки: d c b a, вывод будет:
>a 1
>c 1
>d 1
>b 1
0
Посланник моего господина
111 / 106 / 52
Регистрация: 02.05.2009
Сообщений: 181
23.06.2009, 23:51
delete(s,1,1) — удаление первого символа.
copy(s,1,pos(' ',s)-1) — часть строки от первого символа до первого пробела, не включая его.
delete(s,1,pos(' ',s)) — удаление с первого символа по первый пробел включительно.
Прочитай статьи по работе со строками, в частности pos(substr,str); copy(str,index,count); delete(str,index,count).

34 строчка: можно записать var ti:integer, тоже будет работать.
ts и ti — строка и число, которые нужны лишь для SWAP-обмена двух переменных. Обновременно они не используются (ts — в строках 40-42, ti — в строках 43-45), поэтому для экономии 4 байт памяти можно эти две переменные размещать на одном участке памяти. Прочитай справку по теме absolute для полной ясности кода.

Сортировка не была отлажена. Замени 36-ю строку на for a:=1 to count-1 do. В общем, это простая сортировка пузырьком.
1
8 / 7 / 2
Регистрация: 23.06.2009
Сообщений: 41
24.06.2009, 00:00  [ТС]
Спасибо, разобрался. В 36 строчке надо for a:=1 to count do
0
8 / 7 / 2
Регистрация: 23.06.2009
Сообщений: 41
03.09.2009, 21:51  [ТС]
Как сделать, чтобы программа анализировала большой текстовый файл? А то анализируется только первые 256 байт текста.
0
Эксперт по компьютерным сетямЭксперт Pascal/Delphi
 Аватар для TAVulator
4191 / 1292 / 237
Регистрация: 27.07.2009
Сообщений: 3,962
03.09.2009, 21:55
Цитата Сообщение от orienteer Посмотреть сообщение
Как сделать, чтобы программа анализировала большой текстовый файл? А то анализируется только первые 256 байт текста.
так получается потому, что ты пихаешь инфу из файла в переменную типа string, а она ограничена размером в 256 быйт. Считывай например в цикле файл по 256 байт пока он не кончится.
1
8 / 7 / 2
Регистрация: 23.06.2009
Сообщений: 41
03.09.2009, 22:53  [ТС]
Ну это я понял, а вот как это сделать...

Добавлено через 45 минут
Я прогу вроде написал, но не корректно чуть выдает результат и пишет Runtime error 002 at 0000:0638.
Скажите, плз, что не так

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
PROGRAM CountWords(In_file, Out_file, Temp);
 
CONST
  MaxWords= 2000;
VAR
  In_file, Out_file, Temp: TEXT;
  Str: STRING;
  ArrWords: ARRAY[1..MaxWords] OF STRING[20];
  WordsCount: ARRAY[1..MaxWords] OF BYTE;
  Count: 0..MaxWords;
  Int: INTEGER;
  Ch: CHAR;
 
FUNCTION NextWord(VAR Str: STRING): STRING;
BEGIN
  WHILE (Str <> '') AND (Str[1]= ' ')
  DO
    DELETE(Str, 1, 1);
  NextWord:= COPY(Str, 1, pos(' ', Str) - 1);
  DELETE(Str, 1, pos(' ', Str));
END;
 
FUNCTION Add(Word: STRING): BOOLEAN;
VAR
  Int: INTEGER;
BEGIN
  IF Word= ''
  THEN
    Add:= FALSE
  ELSE
    BEGIN
      Int:= 1;
      WHILE (Int <= Count) AND (ArrWords[Int] <> Word)
      DO
        INC(Int);
      IF Int <= Count
      THEN
        WordsCount[Int]:= WordsCount[Int] + 1
      ELSE
        BEGIN
          INC(Count);
          ArrWords[Count]:= Word;
          WordsCount[Count]:= 1;
        END;
      Add:= TRUE;
    END;
END;
 
PROCEDURE Sort; 
VAR
  Int1, Int2: INTEGER;
  TempStr: STRING;
  TempInt: INTEGER;
BEGIN
  FOR Int1:= 1 TO Count
  DO
    FOR Int2:= Int1 - 1 DOWNTO 1
    DO
      IF ArrWords[Int2] > ArrWords[Int2 + 1]
      THEN
        BEGIN
          TempStr:= ArrWords[Int2];
          ArrWords[Int2]:= ArrWords[Int2 + 1];
          ArrWords[Int2 + 1]:= TempStr;
          TempInt:= WordsCount[Int2];
          WordsCount[Int2]:= WordsCount[Int2 + 1];
          WordsCount[Int2 + 1]:= TempInt;
        END;
END;
 
PROCEDURE ShowList; 
VAR
  Int: INTEGER;
BEGIN
  FOR Int:= 1 TO Count
  DO
    BEGIN
      WRITE(Out_file, '-');
      WRITE(Out_file, ArrWords[Int], ' ', WordsCount[Int]);
      WRITELN(Out_file);
    END;
END;
 
PROCEDURE ChangeString(VAR Str: STRING);
CONST
  Letters: SET OF CHAR = ['a'..'z','A'..'Z', '*'..'п','Ђ'..'џ'];
VAR
  Int: INTEGER;
BEGIN
  FOR Int:= 1 TO length(Str)
  DO
    IF NOT(Str[Int] IN Letters)
    THEN Str[Int]:= ' ';
END;
 
PROCEDURE CntWrds;
BEGIN
  RESET(Temp);
  READLN(Temp, Str);
  Str:= Str + ' '; 
  ChangeString(Str);
  REPEAT
  UNTIL NOT Add(NextWord(Str))
END;
 
 
BEGIN
  ASSIGN(In_file, 'D:\tp7\bin\infile.txt');
  ASSIGN(Out_file, 'D:\tp7\bin\outfile.txt');
  ASSIGN(Temp, 'D:\tp7\bin\Temp.txt');
  RESET(In_file);
  Str:= Str + ' '; 
  Count:= 0;
  WHILE NOT EOF(In_file)
  DO
    BEGIN
      REWRITE(Temp);
      FOR Int:=1 TO 256
      DO
        BEGIN
          READ(In_file, Ch);
          WRITE(Temp, Ch)
        END;
      CntWrds
     END;
 
  Sort;
  REWRITE(Out_file);
  ShowList;
  CLOSE(In_file);
  CLOSE(Out_file);
END.
0
Почетный модератор
 Аватар для Puporev
64312 / 47609 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
04.09.2009, 08:25
В программу не вникал, букафф много, но здесь Вы чудите.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
WHILE NOT EOF(In_file)
  DO
    BEGIN
      REWRITE(Temp);//Это сколько же раз Вы открываете файл для записи? на каждый символ?
      FOR Int:=1 TO 256//зачем это? Считывайте файл построчно и обрабатывайте строки как Вам нужно
      DO
        BEGIN
          READ(In_file, Ch);
          WRITE(Temp, Ch)
        END;
      CntWrds
     END;
Примерно так
Pascal
1
2
3
4
5
6
7
8
9
10
var s:string;
.............................
REWRITE(Temp);
RESET(In_file);
WHILE NOT EOF(In_file)  DO
    BEGIN
      READLN(In_file,s);
      //обрабатываем строку
     //делаем что надо
   END;
1
0 / 0 / 0
Регистрация: 20.12.2010
Сообщений: 5
17.06.2011, 11:29
а как это на с++ будет выглядеть?
0
8 / 7 / 2
Регистрация: 23.06.2009
Сообщений: 41
18.06.2011, 00:21  [ТС]
Это тема про паскаль так то, а не про си.
А на си будет выглядеть примерно так:
(писал давно. ввод/вывод - стандартный поток, добавить файлы просто)
C++
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
 
using namespace std;
 
char ToLowerChar(char ch)
{
    string str1 = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string str2 = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz";
    for (int i = 0; i < str1.length(); i++)
        if (ch == str1[i])
            return str2[i];
    return ch;
}
 
void ReadWord(FILE * pFile, string & word, bool & end)
{
    bool notEmpty = false;
    int ch;
    while (((ch = fgetc(pFile)) != EOF) && (!isspace(ch)))
    {
        ch = ToLowerChar(static_cast<char>(ch));
        word.push_back(ch);
        notEmpty = true;
    }
    if (ch == EOF)
        end = true;
    if (notEmpty)
        word.push_back('\0');
}
 
void Counting(map <string, int> &words)
{
    string word;
    bool end = false;
    while (!end)
    {
        ReadWord(stdin, word, end);
        if (word != "\0") 
            words[word]++;
        word = "\0";
    }
}
 
 
int main(int argc, char* argv[])
{
    map <string, int> words;
    map <string, int>::iterator itr;
    
    Counting(words);
    
    for (itr = words.begin(); itr != words.end(); itr++)
        cout << (*itr).first << ": " << (*itr).second << endl;
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.06.2011, 00:21
Помогаю со студенческими работами здесь

Написать программу, которая подсчитывает количество слов в предложении.
вот задача . Предложение состоит из слов-строк. Написать программу, которая подсчитывает количество слов в предложении.

Написать программу которая подсчитывает количество пустых строк в файле
Помогите пожалуста решить 2 задачи. 1) Написать программу которая подсчитывает количество пустых строк в файле 2)Ввести целое...

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

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

Написать программу, которая подсчитывает сколько слов во фразе (считать, что все слова разделяются одним пробелом). Нужен кол Паскаль
Написать программу, которая подсчитывает сколько слов во фразе (считать, что все слова разделяются одним пробелом).


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

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

Новые блоги и статьи
Динамические массивы в C++ - создание и использование
NullReferenced 27.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 27.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 27.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru