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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
#1

if или while? - C++

04.11.2012, 09:39. Просмотров 480. Ответов 9
Метки нет (Все метки)

разбирая очередной урок по книге Шилдта решил попробовать заменить 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++):

Intel или AMD? R9-290 GAMING 4G или N780 или SLI? Комп за овер 50к - Игровой компьютер
Комп нужен для ИГР на 5лет примерно! 1) Смысл поста в том чтобы собрать системник чтоб каждая запчасть работала на все 100%, то есть...

Можно ли по названию платы,или по чипу,или по соккету,определить,поддерживает плата ХР или нет? - Материнские платы
Добрый день всем.Уважаемые знатоки,я заранее прошу у Вас прощенья,если заданный мной вопрос,тупой или глупый. Но поверьте,я уже замучился...

Получить из строки всё до пробела или запятой или точки или восклицательного знака - C#
Match m_ = Regex.Match(вопрос, @&quot;Кто такой.(.{5})&quot;, RegexOptions.IgnoreCase | RegexOptions.Multiline); ...

По введённой букве определить её характеристики: большая или маленькая, гласная или согласная, звонкая или глухая и т.д - VBA
По введённой букве определить её характеристики: боль-шая или маленькая, гласная или согласная, звонкая или глухая и т.д.

По введённой букве определить её характеристики: боль-шая или маленькая, гласная или согласная, звонкая или глухая и т.д - VBA
По введённой букве определить её характеристики: большая или маленькая, гласная или согласная, звонкая или глухая и т.д

Игры зависают вместе с компьютером, или закрываются с сообщением об ошибке или без него, или вызывают BSOD - BSOD
Столкнулся тут с такой проблемой. Изначально проблемы были только с Dark Souls 3, а именно: 1) Игра просто закрывается. Без ошибок. 2)...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13147 / 7410 / 830
Регистрация: 27.09.2012
Сообщений: 18,244
Записей в блоге: 3
Завершенные тесты: 1
04.11.2012, 10:00 #2
и где здесь while?
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
04.11.2012, 10:21 #3
Viktor_Repin, Вы разобрались в программе? Как же здесь можно заменить for на while? Это же рекурсия, каждый раз функция reverse вызывает копию самой себя, до тех пор, пока в одной из копий (самой последней) условие конца строки не даст истину. После этого рекурсия будет "раскручиваться" и копии функции будут печатать символы строки в обратном порядке. Если заменить if на while то функция просто будет выполняться бесконечно.
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
04.11.2012, 10:26  [ТС] #4
Это я всё понял, но объясните, если не трудно, почему в случае с рекурсией while не работает?
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
04.11.2012, 10:33 #5
Как он может работать то?)) Цикл while будет выполняться пока не обнаружен конец строки, то есть бесконечно, ибо указатель s не изменяется, и никогда не станет ложью условие продолжения
Croessmah
Модератор
Эксперт CЭксперт С++
13147 / 7410 / 830
Регистрация: 27.09.2012
Сообщений: 18,244
Записей в блоге: 3
Завершенные тесты: 1
04.11.2012, 10:38 #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 #7
C++
1
2
3
4
5
6
void reverse (char *s){
    while (*s) {
        reverse(s+1);
        std::cout << *s; 
        s++;
}
Вот если так, то цикл закончиться, потому что, когда дойдем до конца строки цикл while прекратиться, но при этом результаты все равно будут некорректными, потому что прежде чем закончиться он вызовет ненужных 15 (по числу символов в строке) "копий" функций, те в свою очередь вызовут еще, и т.д.
Croessmah
Модератор
Эксперт CЭксперт С++
13147 / 7410 / 830
Регистрация: 27.09.2012
Сообщений: 18,244
Записей в блоге: 3
Завершенные тесты: 1
04.11.2012, 10:53 #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++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.11.2012, 11:43 #9

Не по теме:

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



Как бы for и while взаимозаменяемые, но никак не if и while.
Если уж прям невмоготу, то вот эквивалент:
C++
1
2
3
4
5
6
while( условие )
{
   // говнокод
 
   break;
}
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
04.11.2012, 13:07  [ТС] #10
Спасибо за помощь! Совсем меня рекурсия в заблуждение ввела :-)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 13:07
Привет! Вот еще темы с ответами:

Огонь на Pascale (или ABC, или Free, или Turbo) - Pascal
Пожалуйста, обрадуйте кто нибудь, кодом Движения Огня на Pascale.

Открыть MS Word 2003 или 2007 или 2010 в XP или 7 - Delphi WinAPI
Всем привет! столкнулся с проблемой. Надо из делфи запустить мс ворд. Ну это не сложно. проблема в том, что я сижу на WinXP а вдруг в...

RS триггер на элементах ИЛИ-НЕ,ИСКЛ.ИЛИ (МОНТАЖНОЕ ИЛИ) - Теория автоматов
Здравствуйте,очень нужна ваша помощь.Нужно построить RS-триггер на элементах ИЛИ-НЕ,ИСКЛ.ИЛИ (МОНТАЖНОЕ ИЛИ).Никак не получается.Спасибо.

.NET 3.x Или PageMethods или AJAX или еще что? - C# ASP.NET
У меня есть на странице FileUpoader и кнопочка &quot;Обновить аватарку&quot;. То есть я клацаю на Обзор... выбираю файл и потом нажимаю на кнопочку,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.11.2012, 13:07
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru