2014 dxdy logo

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

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




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

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

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

 
 
 
 Re: Как записать число в символ?
Сообщение04.01.2014, 12:21 
Все вроде бы сделал, кроме 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 
Проще написать другой простой код в несколько строчек, без использования библиотечных строковых функций.

 
 
 
 Re: Как записать число в символ?
Сообщение05.01.2014, 09:42 
Готовый вариант, может кому пригодится:

Код:
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 
dasdas писал(а):
...
Зачем вы возвращаете sres[256]? При том, что максимальный индех для этого массива 255.

 
 
 
 Re: Как записать число в символ?
Сообщение05.01.2014, 16:42 
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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group