Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2018, 21:47   #1
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье Посчитать количество повторяющихся чисел

Здравствуйте! Подскажите пожалуйста, как подсчитать сколько раз повторяются то или или иное число в тексте?

5, 11, 7, 8, 9, 5, 12, 4, 7, 3, 15, 8 и т.д.
Женя32 вне форума Ответить с цитированием
Старый 30.07.2018, 23:18   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

если числа в небольшом диапазоне (ну, например, от 0 до 1000), то можно завести массив нужного размера, обнулить его и затем наращивать элементы массива, используя числа, как индекс массива.

иначе нужно числа помещать в коллекцию и там же хранить счётчик.

или вопрос в том, как выделить числа из текста?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.07.2018, 19:50   #3
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
если числа в небольшом диапазоне (ну, например, от 0 до 1000), то можно завести массив нужного размера, обнулить его и затем наращивать элементы массива, используя числа, как индекс массива.

иначе нужно числа помещать в коллекцию и там же хранить счётчик.

или вопрос в том, как выделить числа из текста?
Подскажите пожалуйста, как правильно нужно сравнивать переменную, содержащею X число, с индексом массива? Чтобы найти нужный индекс элемента массива.

Код:
     while not Eof(myFile) do
          begin
             ReadLn(myFile, s);
             for i:=length(s) downto 1 do
              if not(s[i] in ['0'..'9']) then delete(s,i,1);
              begin
              for j:=1 to Length(mas) do
                begin
                     if(strtoint(s) = mas[j]) then inc(mas[j]);
                end;
             end;
          end;

Последний раз редактировалось Женя32; 31.07.2018 в 20:22.
Женя32 вне форума Ответить с цитированием
Старый 01.08.2018, 00:11   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

1. У Вас в коде ошибка: вы ограничиваете подсчёт только числами первого десятка (0..9). А в исходном примере пишете

Цитата:
5, 11, 7, 8, 9, 5, 12, 4, 7, 3, 15, 8 и т.д.
то есть предполагается, что в строке будут присутствовать и полноценные двух- и более значные числа, а не только цифры.

То есть если задать строку 1абв23-гдеж-456 - Ваша программа посчитает количество цифр (1, 2, 3, 4, 5, 6) а не чисел (1, 23, 456)

2. mas - как она у Вас объявлена? Функция Length(mas) применима только в том случае, когда массив динамический, но тогда он должен считаться от 0 до length - 1
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 01.08.2018, 08:51   #5
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
если числа в небольшом диапазоне (ну, например, от 0 до 1000), то можно завести массив нужного размера, обнулить его и затем наращивать элементы массива, используя числа, как индекс массива.

иначе нужно числа помещать в коллекцию и там же хранить счётчик.

или вопрос в том, как выделить числа из текста?
Да, как выделить числа из текста........
Код:
var myfile: TextFile;
 typeFile,i,j: integer;
 s: string;
 mas: array[1..90] of integer;
begin

   if FileExists('data.txt')then
     begin
          AssignFile(myfile, 'data.txt');
          Reset(myfile); // открыть для чтения
            // Отображение содержимого файла


         while not Eof(myFile) do
          begin
             ReadLn(myFile, s);
             for i:=length(s) downto 1 do
              if not(s[i] in ['0'..'9']) then delete(s,i,1); //очистка от всего лишнего, букв, точек и т.д.
              begin
              for j:=1 to Length(mas) do
                begin
                     if(strtoint(s) = mas[j]) then inc(mas[j]);
                end;
             end;
          end;

         for j:=1 to Length(mas) do
            begin
                  Memo1.Lines.Add(inttostr(j)+'. Кол.раз '+inttostr(mas[j]));
            end;

     end
  else ShowMessage(' Файл с данными для работы не найден');



end;
Результат работы программы. Откуда столько цифр?:

1. Кол.раз 1241700
2. Кол.раз 16
3. Кол.раз 257
4. Кол.раз 1967472
5. Кол.раз 0
6. Кол.раз 0
7. Кол.раз 0
8. Кол.раз 0
9. Кол.раз 0
10. Кол.раз 0
11. Кол.раз 2007658560
12. Кол.раз 2004139862
13. Кол.раз 2004139841
14. Кол.раз -2029971205
15. Кол.раз 37358464
16. Кол.раз 7
17. Кол.раз 0
18. Кол.раз 0
19. Кол.раз 37358620
20. Кол.раз 1241816
21. Кол.раз 0
22. Кол.раз 1241828
23. Кол.раз 2001243127
24. Кол.раз -2029971205
25. Кол.раз 37358464
26. Кол.раз 1638896061
27. Кол.раз 1241848
28. Кол.раз 2001164544
29. Кол.раз 0
30. Кол.раз 0
31. Кол.раз 0
32. Кол.раз 0
33. Кол.раз 0
34. Кол.раз 0
35. Кол.раз 37357536
36. Кол.раз 1241856
37. Кол.раз 2001168744
38. Кол.раз 37357536
39. Кол.раз 0
40. Кол.раз 1242228
41. Кол.раз 2001112075
42. Кол.раз 3
43. Кол.раз 0
44. Кол.раз 2001109993
45. Кол.раз -2029971205
46. Кол.раз 37
47. Кол.раз 1024
48. Кол.раз 7
49. Кол.раз 0
50. Кол.раз 2135328
51. Кол.раз 2006818441
52. Кол.раз 2135344
53. Кол.раз 16
54. Кол.раз -17891602
55. Кол.раз 10
56. Кол.раз 2135248
57. Кол.раз 2031616
58. Кол.раз 2135360
59. Кол.раз 37358248
60. Кол.раз 37358240
61. Кол.раз 37358304
62. Кол.раз 0
63. Кол.раз 4
64. Кол.раз 1242184
65. Кол.раз 2006605034
66. Кол.раз 10
67. Кол.раз 2006820414
68. Кол.раз 1242184
69. Кол.раз 2006444874
70. Кол.раз 2006605155
71. Кол.раз 2120553968
72. Кол.раз 54
73. Кол.раз 0
74. Кол.раз 2031616
75. Кол.раз 2031952
76. Кол.раз 2001169085
77. Кол.раз 3
78. Кол.раз 2031952
79. Кол.раз 96
80. Кол.раз 2031988
81. Кол.раз 37357536
82. Кол.раз 4
83. Кол.раз 4
84. Кол.раз 2031952
85. Кол.раз 14
86. Кол.раз 2129688
87. Кол.раз -2029971205
88. Кол.раз 14
89. Кол.раз 37357820
90. Кол.раз 10
91. Кол.раз 0
92. Кол.раз 37357536
93. Кол.раз 1
94. Кол.раз 2135320
95. Кол.раз 0
96. Кол.раз 100925442
97. Кол.раз 2129464
98. Кол.раз 738459688
99. Кол.раз 37357536
100. Кол.раз 1242128

Содержимое data.txt:

1 3 4 5 6
3,,, 22 4 4 8
2 8 6 б 6 4
Женя32 вне форума Ответить с цитированием
Старый 01.08.2018, 09:17   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Выведите ваш массив ДО начала счета и поймете.
Код:
// сделать тоже и в начале программы
        for j:=1 to Length(mas) do
            begin
                  Memo1.Lines.Add(inttostr(j)+'. Кол.раз '+inttostr(mas[j]));
            end;
или же внимательно прочитать следующее (вы пропустили один из пунктов)
Цитата:
то можно завести массив нужного размера, обнулить его и затем наращивать элементы массива,
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 01.08.2018, 12:43   #7
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Выведите ваш массив ДО начала счета и поймете.
Код:
// сделать тоже и в начале программы
        for j:=1 to Length(mas) do
            begin
                  Memo1.Lines.Add(inttostr(j)+'. Кол.раз '+inttostr(mas[j]));
            end;
или же внимательно прочитать следующее (вы пропустили один из пунктов)
Спасибо!
Подскажите еще, пожалуйста, как пропустить "пробел"? А то когда "пробел" встречается, это вызывает ошибку.

Код:
        
           for j:=1 to Length(mas) do
                begin
                     if(strtoint(s) = mas[j]) then inc(mas[j]);
                end;
Женя32 вне форума Ответить с цитированием
Старый 01.08.2018, 13:25   #8
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
По умолчанию

Все, спасибо всем. Я последний решил.
Женя32 вне форума Ответить с цитированием
Старый 01.08.2018, 13:33   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
const masCount = 100;
var
 myfile: TextFile;
 typeFile, i, curNumber : integer;
 s,w: string;
 mas: array[1..masCount] of integer;
begin

   if FileExists('data.txt')then
     begin
       AssignFile(myfile, 'data.txt');
       Reset(myfile); // открыть для чтения

       for i := 1 to masCount do mas[i] := 0;

       Memo1.Lines.Clear; // очистим Мемо

       while not Eof(myFile) do
          begin
             ReadLn(myFile, s);
             w:='';
             s:=s+' ';
             for i := 1 to length(s) do
               if s[i] in ['0'..'9'] then w := w + s[i]
               else
                 if (w<>'') then begin
                   curNumber := StrToInt(w);
                   if (curNumber>0) and (curNumber<=masCount)  then Inc(mas[curNumber])
                   else Memo1.Lines.Append('# Ошибка выхода числа за диапазон: обнаружено число '+w);
                   w := '';
                 end;
          end;
          CloseFile(myFile); // закрыть файл

          // вывод результатов
         for i:=1 to masCount do
               if mas[i]>0 then
                  Memo1.Lines.Add(inttostr(i)+'. Кол.раз '+inttostr(mas[i]));
     end
    else ShowMessage(' Файл с данными для работы не найден');
end;

Последний раз редактировалось Serge_Bliznykov; 01.08.2018 в 13:40.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать количество повторяющихся типов номера ANGeL_TbMbI Общие вопросы C/C++ 0 22.11.2017 21:28
Посчитать количество повторяющихся слов ANGeL_TbMbI Помощь студентам 0 09.11.2017 20:14
Посчитать количество чисел, которые читаются одинаково слева на право и справа на лево. pengvin Помощь студентам 0 23.02.2017 19:06