Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строка символов и указатели.... 
:(
    Опции темы
Neo
Дата 15.5.2004, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.5.2004

Репутация: нет
Всего: нет



Сразу прошу простить, если подобный вопрос уже задавался, и я не заметил этого по темам.
В общем есть стока символов, которую надо упорядочить используя указаетли. Не знаю, но помоему метод изложенный ниже как-то называется, но я честно говоря никогда его не встречал. Просто получился вот такой код, но там есть какая-то оплошность. И в упор найти не могу. Опыта совсем мало. Может у кого глаз уже наточился 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

PM MAIL   Вверх
dargaard
Дата 15.5.2004, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 450
Регистрация: 7.5.2004

Репутация: 4
Всего: 25



Драсте

Код

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 = ???




--------------------
Ты должна сделать добро из зла 
потому что его больше не из чего
сделать. Р.П.Уоррен
PM MAIL WWW ICQ   Вверх
Neo
Дата 20.5.2004, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.5.2004

Репутация: нет
Всего: нет



Большое спасибо! Именно что получалось, после нескольких интераций значения указателей становились непредсказуемыми. Но никак не мог найте, в чем оплошность. На глаз все было нормально. Спасибо! smile.gif
PM MAIL   Вверх
Baa
Дата 20.5.2004, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Делать было нечего, решил написать 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;
}



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.