Форум программистов, компьютерный форум CyberForum.ru

if или while? - C++

Восстановить пароль Регистрация
 
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 21
Завершенные тесты: 1
04.11.2012, 09:39     if или while? #1
разбирая очередной урок по книге Шилдта решил попробовать заменить if на while, но почему-то во втором случае программа зацикливается!
Кто может объяснить в чём причина?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
 
 
void reverse (char *s);
 
void main() 
{
    setlocale( LC_ALL,"Russian" );
    char str[] = "Это просто тест";
 
    reverse (str);
    std::cout << " " << std::endl;
    system("pause");
}
 
void reverse (char *s){
    if (*s) 
        reverse(s+1);
    std::cout << *s;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 09:39     if или while?
Посмотрите здесь:

C++ Книги или справочники для опытных(или проффесиональных) программистов!
Вложенные CMap или CArray-объекты. Ошибка компилятора или неправильная работа. C++
Контроль точности Рунге-Кутта (3 или 4 порядка) или Эйлера. C++
Имеет ли смысл продолжать учить с++ или попробовать перейти в с# или java? C++
C++ Создать программу при нажатии на кнопку м или ж выводились муржской или женский пол.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.11.2012, 10:00     if или while? #2
и где здесь while?
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
04.11.2012, 10:21     if или while? #3
Viktor_Repin, Вы разобрались в программе? Как же здесь можно заменить for на while? Это же рекурсия, каждый раз функция reverse вызывает копию самой себя, до тех пор, пока в одной из копий (самой последней) условие конца строки не даст истину. После этого рекурсия будет "раскручиваться" и копии функции будут печатать символы строки в обратном порядке. Если заменить if на while то функция просто будет выполняться бесконечно.
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 21
Завершенные тесты: 1
04.11.2012, 10:26  [ТС]     if или while? #4
Это я всё понял, но объясните, если не трудно, почему в случае с рекурсией while не работает?
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
04.11.2012, 10:33     if или while? #5
Как он может работать то?)) Цикл while будет выполняться пока не обнаружен конец строки, то есть бесконечно, ибо указатель s не изменяется, и никогда не станет ложью условие продолжения
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.11.2012, 10:38     if или while? #6
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
Это я всё понял, но объясните, если не трудно, почему в случае с рекурсией while не работает?
так работает:
C++
1
2
3
4
5
6
7
void reverse (char *s){
    static char *s1=s;
    while(*s1){
        reverse(++s1);
        std::cout << *s;
     }
}
У Вас в самом цикле значение s не изменяется, поэтому цикл будет бесконечным, если в строке есть хоть один символ, отличный от '\0'
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
04.11.2012, 10:38     if или while? #7
C++
1
2
3
4
5
6
void reverse (char *s){
    while (*s) {
        reverse(s+1);
        std::cout << *s; 
        s++;
}
Вот если так, то цикл закончиться, потому что, когда дойдем до конца строки цикл while прекратиться, но при этом результаты все равно будут некорректными, потому что прежде чем закончиться он вызовет ненужных 15 (по числу символов в строке) "копий" функций, те в свою очередь вызовут еще, и т.д.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.11.2012, 10:53     if или while? #8
Можно так сделать
C++
1
2
3
4
5
6
void reverse (char *s){
    char *s1=s+strlen(s);
    while(s1--!=s){
        std::cout << *s1;
     }
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.11.2012, 11:43     if или while? #9

Не по теме:

Я нассал в бензобак, а машина почему-то не завелась. Кто может объяснить в чём причина?



Как бы for и while взаимозаменяемые, но никак не if и while.
Если уж прям невмоготу, то вот эквивалент:
C++
1
2
3
4
5
6
while( условие )
{
   // говнокод
 
   break;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 13:07     if или while?
Еще ссылки по теме:

При вводе элементов массива выводить их тип (или int или float) C++
C++ Количество нулевых, или положительных, или отрицательных элементов в двумерном массиве
C++ Написать программу вычисления площади треугольники или квадрата или трапеции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 21
Завершенные тесты: 1
04.11.2012, 13:07  [ТС]     if или while? #10
Спасибо за помощь! Совсем меня рекурсия в заблуждение ввела :-)
Yandex
Объявления
04.11.2012, 13:07     if или while?
Ответ Создать тему
Опции темы

Текущее время: 07:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru