Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Неправильный подсчет количества вхождений символов в строку  (Прочитано 19478 раз)
0 Пользователей и 1 Гость смотрят эту тему.
tumanovalex
Помогающий

ru
Offline Offline

« : 20-02-2009 18:17 » 

Есть строка, в которой через запятую расположены цифры. Нужно создать массив из уникальных сочетаний цифр и подсчитать, сколько данных сочетаний входит в строку.
Код:
#define N 64
void main(int argc, char* argv[]) {
char *nf, chm[N][3], *t = "12,34,56,78,90,12,34,50,90,13,12,12,12";
char b[3] = "  ";
int nmax = 0, i = 0, j = 0, np[N];
for(i=0; i<N; i++){
  np[i] = 0;
  chm[i][0] = '\0';
}
nmax = strlen(t)/3;
for(i=0; i<nmax; i++) {
  strncpy(b, t, 2);
  if((nf=strstr(chm, b))!=NULL) {
    np[(nf-chm)/3]++; // << вот здесь, видимо, ошибка
  }
  else {
    strncat(chm[j], b, 2);
    np[j]++;
    j++;
  }
  t+=3;
}
for(i=0; i<j; i++) {
  printf("%s\t%i\n", chm[i], np[i]);
}
_getch();
}
Уникальные сочетания цифр определяются правильно, а вот подсчет их общего числа в строке - нет. Видимо, я неправильно ищу в массиве. В моем случае (*t = "12,34,56,78,90,12,34,50,90,13,12,12,12) должно быть 5 сочетаний 12, 2 сочетания 34 и т.д. Строка приведена для примера, могут быть определенные сочетания букв, букв и цифр и др., в зависимости от потребностей пользователя. Мне важно понять, как подсчитать количество встречающихся заданных сочетаний в тексте, хотя бы для моего упрощенного примера. Как искать в массиве? Мне хотелось бы уникальные сочетания помещать в массив. Можно, конечно, помещать в одномерный массив с символом-разделителем, но хотелось бы строку массива
Код:
(chm[i])
связать с элементов массива
Код:
(np[i])
для дальнейшей обработки.

* Learning.zip (0.56 Кб - загружено 1150 раз.)
« Последнее редактирование: 20-02-2009 18:19 от tumanovalex » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 20-02-2009 18:18 » 

а цифры только двузначные десятичные ?
Записан

tumanovalex
Помогающий

ru
Offline Offline

« Ответ #2 : 20-02-2009 18:22 » 

Строка приведена для примера. Хочется понять принцип. Например, пользователь задает, что ему нужно найти, сколько раз в тексте встречаютя сочетания "аб" и "ба". В массив chm помещаются эти сочетания, а в массив np - количество сочетаний в тексте
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 20-02-2009 18:23 » 

о, придумал:

входная строка вида "X1,X2,X3,X4"
список сочетаний - строка вида
"X1,X2\r\n"
"X2,X3\r\n"
....

в итоге - легко найти, было ли уже такое сочетание, а количество сочетаний - количество строк

Но работать будет не быстро (относительно, конечно. Можно для хранения результата не строку использовать, а массив "двойных" чисел)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 20-02-2009 18:29 » 

Например, пользователь задает, что ему нужно найти, сколько раз в тексте встречаютя сочетания "аб" и "ба".
запутал...
Сформулируй задачу. Потому что "сколько раз в тексте встречаютя сочетания "аб" и "ба"." - это найти просто, тупо сканированием строки - один проход всего. А изначально у тебя было "Нужно создать массив из уникальных сочетаний цифр "
Записан

tumanovalex
Помогающий

ru
Offline Offline

« Ответ #5 : 20-02-2009 18:45 » 

Да, я написал неправильно.  Например, пользователь задает, что нужно найти все уникальные сочетания из трех (или одного или двух, в зависимости от потребностей пользователя) любых символов текста. Сканируем текст по 3 символа с шагом в 1 символ, помещаем в массив chm только те, которые в этом массиве еще не представлены, подсчитываем количество в тексте сочетаний, которые есть в массиве, причем количество символов в chm должно быть размещено в np.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 20-02-2009 19:02 » 

1) ищем первый символ из искомой строки в строке , где ищут.
2) сравниваем - оно ли ?
3) в зависимости от результата: двигаенмся на 1 байт вперёд или увеличиваем счётчик и двигаемся на длину искомой строки
4) идём в 1 , пока строка не кончилась

Код:
int f(const char* pchWhere,const char* pchWhat)
{
 int n=0;
 int nWhatLen=strlen(pchWhat);
 const char* pch=pchWhere;
 
 for(;pch=strstr(pch,pchWhat);)
 {
  pch+=nWhatLen;
  n++;
 }

 return n;
}

что то вроде этого

ну у меня тут только счётчик, а тебе надо ещё все pch сохранять куда то
« Последнее редактирование: 21-02-2009 09:16 от Алексей1153++ » Записан

tumanovalex
Помогающий

ru
Offline Offline

« Ответ #7 : 20-02-2009 19:07 » 

Что-то я не понял. Можно пояснить кодом для строки *t = "12345678901234509013121212" для 2-х цифр? Как мне получить массив символов и количество их повторений в строке?

В этом случае должно быть 5 сочетаний 12, 2 сочетания 34 и т.д.
« Последнее редактирование: 20-02-2009 19:11 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 20-02-2009 19:10 » 

я пост подправил - я не сохраняю указатели, тебе нужно в начале каждой итерации for сохранять подстроку, начинающуюся с pch - это будут искомые сочетания. А массив символов - это, думается, из найденных сочетаний выловить уникальные символы потом
Записан

tumanovalex
Помогающий

ru
Offline Offline

« Ответ #9 : 21-02-2009 06:33 » new

Спасибо большое, все понял
Записан
yanart
Гость
« Ответ #10 : 28-08-2009 08:53 » 

Если работать только с числами, то держите рабочий код:

Код:
#include <stdio.h>
#include <string.h>
void main() {
char t[100],t_src[] = "12,34,56,78,90,12,34,50,90,13,12,12,12";
strcpy(t,t_src);
strcat(t,",");
int ti[100],ti_count[100];
int j,count =0,tmp=0;
printf("%s\n",t_src);
ti_count[0]=1;
for(int i=0;t[i];i++)
{
  if(t[i]==',')
  {
    for(j=0;j<count;j++)
     if(ti[j]==tmp)
     {
       ti_count[j]++;
       break;
     }
    if(j==count)
    {
   ti[count++]=tmp;
   ti_count[count]=1;
    }
    tmp=0;
  }else tmp=tmp*10+(int)(t[i]-'0');
}
for(i=0;i<count;i++)printf("%d : %d\n",ti[i],ti_count[i]);
}
« Последнее редактирование: 28-08-2009 12:13 от Вад » Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #11 : 28-08-2009 14:08 » 

лови код:
Код:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <map>
using std::map;
typedef map<string,int> msi;
typedef msi::const_iterator ci;

int main() {
string s;
msi m;
while(cin>>s) m[s]++;
int sum=0;
for ( ci i=m.begin();i!=m.end();++i) if (i->second == 1 ) {
cout<<i->first<<endl;
sum++;
}
cout<<"sum: "<<sum<<endl;
}


тут в решении совсем не нужен массив

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

пример работы:
Код:
// ввод
12 12 14 16 43 16 44
// вывод
14
43
44
sum: 3
« Последнее редактирование: 28-08-2009 14:10 от Mayor » Записан

1n c0de we trust
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 28-08-2009 14:10 » 

некромэйкеры
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 28-08-2009 14:59 » 

лабуду удаляем, наверное?
 а то ведь новички будут пытаться это использовать
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines