2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Как записать число в символ?
Сообщение03.01.2014, 11:24 


24/05/09

2054
Как то запутал всё г-н начинающий программист.

1. Читаем первый символ строки N, счётчик Сх ставим в 1
2. Читаем следующий символ. Если он равен предыдущему, прибавляем значение счётчика, возвр. к пункту 2
3. Если не равен предыдущему: сбрасываем в строку-приёмник Сх символов N, если Сх < 4, либо формируем строку типа N{Сх}, если Сх >= 4, и добавляем в конец строки-приёмника.
4. Сх = 1. Goto 2.

Я бы так сделал. Ну только ещё, если Сх в строке результата должен быть в текстовой форме для наглядности, его к такой форме нужно преобразовать.

 Профиль  
                  
 
 Re: Как записать число в символ?
Сообщение04.01.2014, 12:21 


28/09/13
11
Все вроде бы сделал, кроме 1 НО. Когда я ввожу например: asdcccccccngdddddddddddddnh он выдает asdc{7}ngd{13} nh, т.е. он не сдвигает до '}'.

Подскажите как сдвинуть оставшиеся элементы.

Код:
char CompressStr(char s[256])
{
   int k=0,dls = strlen(s),i,j,dls1=0,t,ch;
   char s1[20],sres[256]="",fix[1]="";
   for (i=0;i<dls;i++)
      if (s[i] == s[i+1])
         {   fix[0] = s[i];
            k=0;
            for (j=i;s[j]==fix[0];j++)
            k=k+1;
         if (k>=4)
            {
            sprintf (s1,"%c{%d}",s[i],k);
            strcat(sres,s1);
            i = i + k-1;
            dls1 = strlen(s1);
            fix[0]=' ';
            }
         else 
         {sres[i]=s[i];
         fix[0]=' ';
         k=0;}}

      else
      { sres[i-k+dls1] = s[i];
         for (t=i;sres[t-1]==0 && sres[t] != 0;t++)
            {
            sres[t-k+dls1]=s[t];
            sres[t] = 0;
            }
      }

   printf ("%d",k);
   printf ("\n");
   for (int lpa=0;lpa<dls;lpa++)
      printf ("%c",sres[lpa]);
   return sres[256];
      
}

 Профиль  
                  
 
 Re: Как записать число в символ?
Сообщение04.01.2014, 23:01 


05/09/12
2587
Проще написать другой простой код в несколько строчек, без использования библиотечных строковых функций.

 Профиль  
                  
 
 Re: Как записать число в символ?
Сообщение05.01.2014, 09:42 


28/09/13
11
Готовый вариант, может кому пригодится:

Код:
char CompressStr(char s[256])
{
   int k=0, //Кол-во одинаковых символов
      dls = strlen(s),//Длина строки s
      i, //Номер символа в строке
      j, //Номера повторяющихся символов
      dls1=0, //Длина строки s1
      ch;//Для избежания многократного одинакового вычисления
   char s1[20], //Строка хранящая сжатый символ вида C{k}
      sres[256]="",//Строка результат
      fix[1]=""; //Фиксация одинакового символа
   for (i=0;i<dls;i++)
      if (s[i] == s[i+1])//Схожи ли 2 стоящия рядом символа?
         {   fix[0] = s[i];//Да, фиксируем его
            k=0; //Очищаем счетчик
            for (j=i;s[j]==fix[0];j++) //Считаем сколько одинак. символов
            k=k+1;
         if (k>=4)
            {
            sprintf (s1,"%c{%d}",s[i],k);//Записываем в s1 сжатый символ
            strcat(sres,s1);//Добавляем в конец строки sres
            i = i + k-1; //Пропускаем повторяющиеся символы
            dls1 = strlen(s1); //Вычисляем длину dls1
            fix[0]=' ';//Очищаем повторяющийся символ
            }
         else 
         {sres[i]=s[i]; //Результир. строке присваем символ из данной
         fix[0]=' ';//Очищаем повторяющийся символ
         k=0;}} //Очищаем счетчик

      else
      {   ch = i-k+dls1;//Чтобы не вычислять многократно одно и тоже
         sres[ch] = s[i];
         for (j=ch;sres[j-1]==0;j--)//Сдвиг влево до }
            {sres[j-1] = sres[j];
            sres[j] = 0;}
      }
   printf ("\nВаша сжатая строка: %s",sres);
   return sres[256];
      
}

 Профиль  
                  
 
 Re: Как записать число в символ?
Сообщение05.01.2014, 13:23 
Заслуженный участник


22/05/11
3350
Australia
dasdas писал(а):
...
Зачем вы возвращаете sres[256]? При том, что максимальный индех для этого массива 255.

 Профиль  
                  
 
 Re: Как записать число в символ?
Сообщение05.01.2014, 16:42 


05/09/12
2587
dasdas в сообщении #809679 писал(а):
Готовый вариант, может кому пригодится:

Только надо исправить одну ошибку, найдя ее :-)
код: [ скачать ] [ спрятать ]
Используется синтаксис C
void CompressString(char* s, char* r)
{
        char *ps = s, *pr = r, i2s[5], *pi = i2s;
        int i = 0;

        *pr++ = *ps++;
        do {
                if (*ps == *(ps-1)) i++;
                else {
                        if (i) {
                                i++;
                                *pr++ = '{';
                                while (i) {*pi++ = '0'+i%10; i/=10;}
                                while (pi > i2s) *pr++ = *--pi;
                                *pr++ = '}';
                        }
                        *pr++ = *ps;
                }
        } while (*ps++);
}

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group