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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия, Выдает системную ошибку 
:(
    Опции темы
vik5252
Дата 11.5.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно развернуть строку задом наперед.
Причем это необходимо сделать в отдельной функции и в форме рекурсии.
Пользоваться другими символьными массивами (кроме данной строки) нельзя.    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) и работа программы завершается.
Кто поопытней, подскажите, где ошибка ?

Это сообщение отредактировал(а) vik5252 - 12.5.2008, 00:59
PM MAIL   Вверх
creatorcode
Дата 12.5.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

char str[] = "This is test";


Это сообщение отредактировал(а) creatorcode - 12.5.2008, 00:38
PM MAIL   Вверх
vik5252
Дата 12.5.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Исправил, системная ошибка больше не выскакивает, но прога всеравно не работает

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

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

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

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

Спасибо  smile 

Это сообщение отредактировал(а) vik5252 - 12.5.2008, 01:10
PM MAIL   Вверх
warmonger_
Дата 12.5.2008, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

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



Код

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);
}

--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
vik5252
Дата 12.5.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А почему программа работает, если оператор инкремента/декремента стоит перед переменной, и неработает, если его поставить после переменной ?
PM MAIL   Вверх
creatorcode
Дата 12.5.2008, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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

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

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


Это сообщение отредактировал(а) creatorcode - 12.5.2008, 02:01
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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