2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Как записать число в символ? [C]
Сообщение02.01.2014, 12:13 


28/09/13
11
Описать функцию 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 
Заслуженный участник


12/08/10
1677
1. У вас длинна строки может поменяться. Проще записывать результат в другую строку.
2. вам может помочь функция sprintf

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


28/09/13
11
Код немножко пофиксился:
Код:
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 
Заслуженный участник


12/08/10
1677
Ваш код хоть что выдает при вводе bbbccccce?
А то по-моему у вас алгоритм неправильный.

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


28/09/13
11
Да, он выдает 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 
Заслуженный участник


12/08/10
1677
ccccccceсссссссе попробуйте.

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


28/09/13
11
Выдает c{7}ccec{6}ce

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


12/08/10
1677
Ну у вас 2 варианта:
1. выполнять сдвиг влево k-4 раза.
2.выводить результат не в ту же позицию откуда читаете символы.

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

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


28/09/13
11
У меня есть другой вариант, но там идет сразу вывод символа без присваивания. Как мне потом считать эту строку?
Код:
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 
Заслуженный участник


12/08/10
1677
Код:
for (j = i;s[j] == 'c';j++)
               k=k+1;

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

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

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


28/09/13
11
char st[256];

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

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


12/08/10
1677
Здесь не принято писать за других программы, если вы не хотите найти в гугле как работает sprintf, значит вы не хотите решить свою задачу.

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


28/09/13
11
Я не прошу решать ее за меня, я просто прошу помощи и скидываю сюда ошибки которые не знаю как решить.
Я объявил st как указатель (char *st[256]), так как посимвольно, программа собирается, но когда я ввожу 1 любой символ она ломается.

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


12/08/10
1677
Вывод в строку будет выглядеть так:
Код:
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 
Заслуженный участник


22/05/11
3350
Australia
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  След.

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



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

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


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

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