Логическая схема

#include <iostream>
#include <string>
using namespace std;
string power = "off";
int main()
{
int num;
cout << power << endl;
cin >> num;
if (num == 0) { string power = "off"; main (); } 
else if(num == 1) { string power = "on"; main (); }


}

При запуске должен выдаваться статус «off», далее при вводе с клавиатуры статус должен меняться, но как бы я не пытался, ничего не получается.
Нужна логическая схема, именно с переменной power, чтобы менять её значение.
Сколько не пробовал, ничего не работает. Выше я привёл пример.
Помогите нубу, пожалуйста :)

Просто убери string перед power внутри main

if (num == 0) {  power = "off"; main (); } 
else if(num == 1) {  power = "on"; main (); }

Тип данных должен присваиваться переменной только один раз при её объявлении.

Интересно, это нубы сами додумываются до рекурсивного вызова main()? Или этому какой-то мудак учит? Подозреваю, что второе. Поскольку такой код появляется волнами.

whit3g, вот ты сам додумался? Или где-то в и-нете вычитал? Ссылочкой не поделишься? Или тебя преподаватель (учитель информатики?) этому научил?

ЗЫ. whit3g, если это ты сам до этого додумался, то молодец. Это решение хоть и неправильно, и опасно, но демонстрирует нестандартность твоего мышления.

Я думаю большинство до этого сами додумываются. Я например сразу как узнал о возможности функции вызывать саму себя, задал себе два вопроса. 1) Можно ли вызывать из одной функции другую функцию. 2) Можно ли всё это делать с main. И сразу же начал опыты проводить. Ведь в уроках на сайтах, что я встречал, нигде не пишут чего нельзя делать (незнаю, как в бумажных учебниках). Только то, что можно, а дальше творческий полет фантазии. Пробовать и учиться на ошибках гораздо продуктивнее, чем на готовых правильных шаблонах, имхо. А желание рекурсии main объясняется простым алгоритмом — если выполнено такое то действие, начни всё с самого начала.

Тут есть два момента.

Во-первых, по стандарту С++11 функция main() не может быть использована внутри программы (ISO/IEC 14882:2011(E) пункт 3.6.1.3).

Во-вторых, как следствие, рекурсивный вызов main() разрешают далеко не все компиляторы. Такой код непереносим.

В-третьих, конечно, запрет на рекурсивный вызов main() можно легко обойти. Однако неограниченная рекурсия (без обратной раскрутки) обязательно приведёт к переполнению стека и аварийному завершению программы.

string power = "off";
int main()
{
    // ...
    if (num == 0) { string power = "off"; main (); } 
    else if(num == 1) { string power = "on"; main (); }
    // ...
}

Странно! И Dev-C и Visual-C пропускают эту ошибку при компиляции!?

Здесь нет ошибки. С точки зрения синтаксиса — всё правильно.

Блок определяет свою область видимости. (Блок — это фигурные скобки и то, что внутри них.) Здесь есть две области видимости: охватывающая (в данном случае это глобальная область видимости) и локальная (блок). Есть переменная string power, которая определена в охватывающей области видимости. В блоке определяется другая переменная string power, которая экранирует одноимённую переменную из охватывающей области видимости. При выходе из блока локальные переменные блока уничтожаются.

Соответственно, в редакции от whit3g локальная переменная блока никакого влияния на одноимённую глобальную переменную не оказывает.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.