2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Как записать число в символ? [C]
Сообщение02.01.2014, 12:13 
Описать функцию CompressStr(S) строкового типа,выполняющую сжатие строки S по следующему правилу: каждая подстрока строки S, состоящая из более чем четырех одинаковых символов C, заменяется текстом вида C{K}, где K - количество символов С(предполагается что S не содержит фигурных скобок { и }). Например, для строки S="bbbccccce" функция вернет строку "bbbc{5}e".

Как быть если k > 10 ?

Код:
char CompressStr(char s[256])
{
   int k=0,j,dls = strlen(s);

   for (int i=0;i<dls;i++)
   if (s[i] != 'c') k=0;
      else
      {
         if (s[i-1] != '}' && s[i] == 'c')
         {
            for (j = i;s[j] == 'c';j++)
               k=k+1;
             if (k>=4)
            {
               s[i+1] = '{';
               s[i+2] = '0' + k;
               s[i+3] = '}';
               i=i+3;
               k=0;
            }
            else k=0;
         }
         else {if (s[i-1] == '}' && s[i] == 'c' )
            for (int l=i;s[l] == 'c';l++)
               s[i] = s[l+1];}
      }
   printf ("%s",s);
   return s[256];
}

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 13:12 
1. У вас длинна строки может поменяться. Проще записывать результат в другую строку.
2. вам может помочь функция sprintf

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 13:54 
Код немножко пофиксился:
Код:
char CompressStr(char s[256])
{
   int k=0,j,dls = strlen(s);

   for (int i=0;i<dls;i++)
      if (s[i] != 'c')  k=0;
      else
      {
         if (s[i-1] != '}' && s[i] == 'c')
         {
            for (j = i;s[j] == 'c';j++)
               k=k+1;
            if (k>=4)
            {
               s[i+1] = '{';
               s[i+2] = '0' + k;
               s[i+3] = '}';
               i=i+3;
               k=0;
            }
            else k=0;
         }
         else {if (s[i-1] == '}' && s[i] == 'c' )
            for (int l=i;s[l] != '\0' ;l++)
               s[l] = s[l+1];}
      }
   printf ("%s",s);
   return s[256];
}

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 14:50 
Ваш код хоть что выдает при вводе bbbccccce?
А то по-моему у вас алгоритм неправильный.

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 15:20 
Да, он выдает bbbc{5}e как и должно быть.
Вот сам код целиком
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>
char CompressStr(char s[256])
{
   int k=0,j,dls = strlen(s);

   for (int i=0;i<dls;i++)
      if (s[i] != 'c')  k=0;
      else
      {
         if (s[i-1] != '}' && s[i] == 'c')
         {
            for (j = i;s[j] == 'c';j++)
               k=k+1;
            if (k>=4)
            {
               s[i+1] = '{';
               s[i+2] = '0' + k;
               s[i+3] = '}';
               i=i+3;
               k=0;
            }
            else k=0;
         }
         else {if (s[i-1] == '}' && s[i] == 'c' )
            for (int l=i;s[l] != '\0' ;l++)
               s[l] = s[l+1];}
      }
   printf ("%s",s);
   return s[256];
}
void DecompressStr(char s[256])
{
/*   int i,dls = strlen(s),kol=0,j;
   printf ("\n");
   for (i=0;i<dls;i++)
      if (s[i] != 'c')
         printf ("%c",s[i]);
      else
         if (s[i+1] != '{')
            printf ("%c",s[i]);
         else
            {kol = s[i+2];
            for (j=0;j<kol;j++)
               printf("c");}*/
}
void main()
{
   setlocale(LC_CTYPE,"Russian");
   char s[256];
   printf ("Введите строку: ");
   gets(s);
   CompressStr(s);
   DecompressStr(s);
   _getch();
   }

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 15:27 
ccccccceсссссссе попробуйте.

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 15:35 
Выдает c{7}ccec{6}ce

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 15:45 
Ну у вас 2 варианта:
1. выполнять сдвиг влево k-4 раза.
2.выводить результат не в ту же позицию откуда читаете символы.

чтоб превратить число в строку можно использовать sprintf(s1,"%d",k), она возвращает количество символов в записи k

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 16:27 
У меня есть другой вариант, но там идет сразу вывод символа без присваивания. Как мне потом считать эту строку?
Код:
char CompressStr(char s[256])
{
   int k=0,j,dls = strlen(s);

   for (int i=0;i<dls;i++)
   if (s[i] != 'c') { printf ("%c",s[i]); k=0; j = i;} 
      else
      {
         if (s[i-1] != 'c' && s[i] == 'c')
         {
            for (j = i;s[j] == 'c';j++)
               k=k+1;
             if (k>=4)
              printf ("c{%d}",k);
             else 
              printf("%c",s[i]);    
         }
         else
            if (k<4) printf ("%c",s[i]);
      }
   return s[256];
}

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 16:41 
Код:
for (j = i;s[j] == 'c';j++)
               k=k+1;

Вы символы считали, а i не выросло

Используйте функцию sprintf, она выводит результат в строку(char S[255]), но правда начиная с ее начала.

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 17:00 
char st[256];

sprintf (st[i],"%c",s[i]);
error C2664: sprintf: невозможно преобразовать параметр 1 из 'char' в 'char *'
Для преобразования из целого типа в указатель требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 17:12 
Здесь не принято писать за других программы, если вы не хотите найти в гугле как работает sprintf, значит вы не хотите решить свою задачу.

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 17:41 
Я не прошу решать ее за меня, я просто прошу помощи и скидываю сюда ошибки которые не знаю как решить.
Я объявил st как указатель (char *st[256]), так как посимвольно, программа собирается, но когда я ввожу 1 любой символ она ломается.

 
 
 
 Re: Как записать число в символ?
Сообщение02.01.2014, 18:25 
Вывод в строку будет выглядеть так:
Код:
sprintf (s1,"c{%d}",k);//s1 -промежуточная строка.
Sres=Sres+s1; //Sres - строка результата.

(Оффтоп)

Но по моему можно что то типа такого(не уверен):
Код:
char Sres[255];
Lres=0;
Sres=''":
///......
Lres+=sprintf(Sres+Lres,"c{%d}",k);

 
 
 
 Re: Как записать число в символ?
Сообщение03.01.2014, 06:28 
dasdas писал(а):
char st[256];

sprintf (st[i],"%c",s[i]);
error C2664: sprintf: невозможно преобразовать параметр 1 из 'char' в 'char *'
st[i] - это i-й символ в строке st, т.е. тип char. 1-й параметр sprintf должен быть char*.

Цитата:
Я объявил st как указатель (char *st[256]), так как посимвольно, программа собирается, но когда я ввожу 1 любой символ она ломается
Естественно: вы определили массив из 256 указателей char*, ни один из которых ни на что не указывает. Поэтому sprintf пишет в unallocated память.

И такой вопрос: почему вы сжимаете только повторяющуюся букву "c"? Как насчет строки "aaaaabbbbbb", например? Полагаю, что ваш алгоритм должен выдать "a{5}b{6}". В условии вашей задачи "C", скорее всего, обозначает любой символ, а не только строчное латинское "c".

 
 
 [ Сообщений: 21 ]  На страницу 1, 2  След.


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