Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Строка символов и указатели....


Автор: Neo 15.5.2004, 03:19
Сразу прошу простить, если подобный вопрос уже задавался, и я не заметил этого по темам.
В общем есть стока символов, которую надо упорядочить используя указаетли. Не знаю, но помоему метод изложенный ниже как-то называется, но я честно говоря никогда его не встречал. Просто получился вот такой код, но там есть какая-то оплошность. И в упор найти не могу. Опыта совсем мало. Может у кого глаз уже наточился smile.gif Помогите пожалуйста. Или есть более интересные алгоритмы того же самого действия. Если не трудно, Товарищи...
В общем вот сам код....
--------------------------------------------------------------------
......

char string[100];

void main()
...
...
...

void Sort()
{
char *ch, *sh, t,*ip;
ip=string;
*sh='z';
for(int i=0; i<strlen(string)-1; i++)
{
ip=(ip+i);
for(int j=0; j<strlen(string)-i; j++)
{
ch=ip;
ch=(ch+j);
if(*sh>*ch)sh=ch;
if(j==strlen(string)-2)
{
t=*ip;
*ip=*sh;
*sh=t;
}
}
}
printf("Sorted: ");
for(i=0; i<strlen(string); i++)
{
printf("%c ", string[i]);
}
printf("\n%d %d %d\n", t, *ch, *sh);
printf("%p %p %p\n", t, ch, sh);
}

--------------------------------------------------------------------

Собственно последние вызовы printf только для просмотра значений указателей.
Смысл алгоритма в кратце: есть два указателя. На стартовый элемент строки и на минимальный. При последнем выполнении внутреннего цикла значения стартового и минимального указателя меняются местами. А потом стартовый указатель смещается по строке далее. И все повторяется опять. Но только с каждым разом уменьшается количество интераций во внутреннем цикле. Много раз проверял и не могу понять, где напортачил. Товарищи, пожалуйста, если кто знает, есть ли вообще такой алгоритм или что-нибудь по данному вопросу - помогите пожалуйста. Заранее большое спасибо!
Оффтоп: наконец попал по всей видимости в очень хорошую компанию. Очень надеюсь здесь найти общий язык со здешними обитателями и набраться так необходимого опыта и навыков профессионального программирования smile.gif

Автор: dargaard 15.5.2004, 07:30
Драсте

Код

char _string[100];

void Sort()
{
       int len;
       int i, k;
       char min;
       char* min_ptr;
       char tmp;

       len = strlen(_string);

       for (k=0; k<len; k++) {
               min = 'z';
               for (i=k; i<len; i++) {
                       if (min > _string[i]) {
                               min = _string[i];
                               min_ptr=_string+i;
                       }
               }
               tmp = min;
               *min_ptr = _string[k];
               _string[k] = tmp;
       }


}

int main() {
       strcpy(_string,"fgeffaasbdrewprrtopqsrtuvw\0");
       printf("%s\n",_string);
       Sort();
       printf("%s\n",_string);
}


Легче было заново написатьsmile.gif
А вообще веши из серии
ip = string;
for(int i=0; i<strlen(string)-1; i++)
{
ip=(ip+i);
....

явно не пральные - и тя ip в конце неизвестно на что будет указивать
(пример :
string = "abcdef\0";
strlen(string) - 1 = 5

i=0
ip указывает на "a"
i =1
*ip = 'b'
i=2
*ip = 'd'
i=3
*ip = '\0'
i=4
*ip = ???


Автор: Neo 20.5.2004, 00:17
Большое спасибо! Именно что получалось, после нескольких интераций значения указателей становились непредсказуемыми. Но никак не мог найте, в чем оплошность. На глаз все было нормально. Спасибо! smile.gif

Автор: Baa 20.5.2004, 01:16
Делать было нечего, решил написать smile.gif
Код

void SortString (char* pString)
{
char *p, *pe, *pt;
pt = pString;
pe = &pString [strlen(pString)-1];
while (pt != pe)
{
  p = pString;
  do {
   if (*p > *(p+1))
   {
    *p     = *p ^ *(p+1);
    *(p+1) = *p ^ *(p+1);
    *p     = *p ^ *(p+1);
   }
   p++;
  }while (p != pe);
  pt++;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
char szString [0xFF] = "String for sorting";
printf ("%s\n", szString);
SortString (szString);
printf ("%s\n", szString);
return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)