Biomorphix
@Biomorphix

Почему не работает return?

Привет!
Взялся за задание, которое нашел в просторах сети и я [s]немного[/s] очень сильно запутался.
Задание: сделать терминал управления зоомагазином, использовать классы.
Мой вопрос: почему оператор return не возвращает к функции, которая вызвала функцию, которая вызвала return? (Как закрутил, извиняюсь)
Забыл написать в чем ошибка: программа доходит до функции input(); и закрывается, хотя должна вернуться обратно в меню.
#include <iostream>

using namespace std;
const int SIZE = 10;
class zoo {
	public:
		char name[25];
		char animal[25];
		int cost; 
		void input();
}anim[SIZE];

void manager(), show(), add_animal();

int main() {
	cout << "Hello, it's ZooCoo! Please choose the action. Who are u?\n\n" <<
		"1. Manager \n 2.User \n";
	
	int sea;
	cin >> sea;

	switch (sea)
	{
	case 1: manager(); break;
		

	}

	system("pause");
	return 0;
}


void manager(){
	cout << "Hello, MANAGER!\n Choose action\n" <<
		"1. Add animal \n 2. Show animal \n 3. Exit \n\n";
	int choise;
	cin >> choise;
	switch (choise)
	{
	case 1: add_animal();
			break;
	case 2: show(); break;
	}
	return;
}

void add_animal(){
	int i;

	for (i = 0; i < SIZE; ++i){
		
		if (!anim[i].animal) break;
		if (i == SIZE){ cout << "Its full"; return; }
		
		
	}
	anim[i].input();
	return;
}

void zoo::input(){
	cout << "What is that animal?\n\n";
	cin >> animal;

	cout << "Animal's name\n\n";
	cin >> name;

	cout << "What about cost?\n\n";
	cin >> cost;

	return;
}

void show(){
	int i;
	for (i = 0; i < SIZE; i++){
		if (anim[i].animal){
			cout << "\nAnimal\t" << anim[i].animal <<
				"\nName\t" << anim[i].name <<
				"\nCost\t" << anim[i].cost << endl;
		}
	}
	return;
}
  • Вопрос задан
  • 3522 просмотра
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert

for (i = 0; i < SIZE; ++i){
		
		if (!anim[i].animal) break;
		if (i == SIZE){ cout << "Its full"; return; }
		
		
	}
	anim[i].input();

Первое условие никогда не выполнится, потому что animal -- это массив внутри объекта, он никогда не равен 0.
Но и второе условие никогда не выполнится, потому что цикл до i < SIZE.
Таким образом вы вызываете input() у объекта за пределами массива.
Неопределённое поведение.
Ответ написан
Комментировать
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Используйте отступы для выделения блоков, ничего же не понятно!
void add_animal(){
  int i;
  for (i = 0; i < SIZE; ++i){
    if (!anim[i].animal) break; //WAT??? Для массивов char это не сработает как
            //проверка на пустоту строки, тем более неинициализированные массивы забиты мусором.
            //Удобнее использовать std::string и проверять (!animal.empty())
    if (i == SIZE){ cout << "Its full"; return; }  //никогда не выполнится по условию цикла
    
    
  }
  anim[i].input(); //Это вы хотели сделать в цикле, с отступами бы вы это заметили!
  return;
}

Ну и все в manager нужно запихнуть в while(true) и сделать return в case 3 например.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы