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


Автор: vik5252 11.5.2008, 23:30
Нужно развернуть строку задом наперед.
Причем это необходимо сделать в отдельной функции и в форме рекурсии.
Пользоваться другими символьными массивами (кроме данной строки) нельзя.    smile 

Вот мой вариант кода :
Код

#include "stdafx.h"

void resiv( char *str, int i, int j ); // прототип функции

int main() 
{ 
 
    char *str = "This is test";                           
    
    cout << "\n " << str;              
    resiv( str, 0, strlen(str)-1 );          
                                               
    cout << "\n\n " << str;            
    cout << "\n\n ";
    
    return 0;
}


void resiv( char *str, int i, int j )
{
    char buf;

    buf = *(str+i);
    *(str+i) = *(str+j);
    *(str+j) = buf;

    if ( i+1 < j ) resiv( str, i++, j-- );
}

Программа компилируется без ошибок и замечаний, но выполняется лишь до момента вызова рекурсивной функции resiv из функции main.
Дальше выскакивает всплывающее окно от операционной системы с сообщением об ошибке приложения (у меня Windows XP) и работа программы завершается.
Кто поопытней, подскажите, где ошибка ?

Автор: creatorcode 12.5.2008, 00:37
Код

char str[] = "This is test";

Автор: vik5252 12.5.2008, 01:03
Исправил, системная ошибка больше не выскакивает, но прога всеравно не работает

А..., все, нашел.
В качестве аргументов функции нельзя передавать инкрименты :
Код

if ( i+1 < j ) resiv( str, i++, j-- );

Если написать так, то все работает :
Код

if ( i+1 < j ) resiv( str, i+1, j-1 );

Спасибо  smile 

Автор: warmonger_ 12.5.2008, 01:20
Код

void resiv( char *str, int i, int j ); // прототип функции
int main() 
{ 
 
    char str[] = "This is test";                           
    
    std::cout << "\n " << str;              
    resiv( str, 0, strlen(str)-1 );          
                                               
    std::cout << "\n\n" << str;            
    std::cout << "\n\n ";
    std::cout<<std::endl;
    return 0;
}
void resiv( char *str, int i, int j )
{
    char buf;
    buf = str[i];
    str[i]=str[j];
    str[j]=buf;
    if (i<j)
        resiv(str, ++i, --j);
}

Автор: vik5252 12.5.2008, 01:48
А почему программа работает, если оператор инкремента/декремента стоит перед переменной, и неработает, если его поставить после переменной ?

Автор: creatorcode 12.5.2008, 02:00
Цитата(vik5252 @  12.5.2008,  01:48 Найти цитируемый пост)
А почему программа работает, если оператор инкремента/декремента стоит перед переменной, и неработает, если его поставить после переменной ? 

Потому что, при использовании постфиксной формы оператора инкремента/декремента переменная i/j изменится только после вызова функции, т.е. это эквивалентно:
Код

resiv( str, i, j);
i++
j--;

А при использовании префиксной формы:
Код

++i;
--j;
resiv( str, i, j);

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