Вернуть значения из функции для stack в c++

Задача: Сделать ханойскую башню , чтобы можно было через консоль перекидывать круги . Указываешь количество кругов и тебе теперь нужно их перекидывать пока на 2 или 3 башне не будут все круги . 1- меньший круг и находится на самом верху .

Без использования функции я задачу решил и выполнил , но когда решил что можно попробовать одно и тоже действие выразить через функцию то ничего не выходит .Сама функция :

int lastabd(stack <int> str1 ,stack <int> str2,stack <int> str3,int a,int b,int c,int n){
        cout<<"test";
        if(str1.size()!=0)
        {a = 0;
        a+=str1.top();}
        if(str1.size()==0){ a = n + 1;}
        if(str2.size()!=0)
        {b = 0;
        b += str2.top();}
        if(str2.size()==0){ b = n + 1;}
        if(str3.size()!=0)
        {c = 0;
        c+=str3.top();}
        if(str3.size()==0){ c = n + 1;}
        return str1,str2,str3,a,b,c; }

str1,str2,str3 - сами стеки . a,b,c=верхний элемент стека . n-количества колец используемых .Когда всё сделал в цикле не используя функцию то всё работало. Возможно ошибка в обьявлении или в чём-то другом . Полный код:

#include <iostream>
#include <locale>
#include <fstream>
#include <stack>
#include <windows.h>
#include <clocale>
#include <cstdlib>
void color(int c, int b);
using namespace std;
int lastabd(stack <int> str1 ,stack <int> str2,stack <int> str3,int a,int b,int c,int n)
{
 cout<<"test";
         if(str1.size()!=0)
         {a = 0;
         a+=str1.top();}
         if(str1.size()==0){ a = n + 1;}
         if(str2.size()!=0)
         {b = 0;
         b += str2.top();}
         if(str2.size()==0){ b = n + 1;}
         if(str3.size()!=0)
         {c = 0;
         c+=str3.top();}
         if(str3.size()==0){ c = n + 1;}
         return str1,str2,str3,a,b,c;
}
int main()
{
 setlocale(0, "");
 //setlocale(LC_CTYPE,"Russian");
 int s, i, n, choice,a,b,c,schet=0;
 stack <int> s1;
 stack <int> s11;
 stack <int> s2;
 stack <int> s22;
 stack <int> s3;
 stack <int> s33;
 cout << "Введите количество колец" << endl;
 cin >> n;
 cout<<endl;
 s = n;
 for (i = n - 1; i > -1; i--)
 {
     s1.push(s);
     //cout<<s<<" ";
     s--;
 }
 a = s+1;
 b = n + 1;
 c = n + 1;
 lastabd(s1,s2,s3,a,b,c,n);
 while (1) {
         if(s2.size()==n||s3.size()==n)
         {
             color(10, 4);
             cout<<"ПОЗДРАВЛЯЮ! ВЫ ВЫЙГРАЛИ";
             cout<<endl<<"Было совершено: "<<schet<<" действий!";
             color(6, 1);
             exit(0);
         }
         else{
     s11 = s1;
     s22 = s2;
     s33 = s3;
     //cout << endl;
     //cout << "ВЫВОД 1 , 2 И 3 БАШНИ" << endl;
     color(14, 1);
     cout <<endl<< "Первая башня:";
     while (!s11.empty())
     {
         cout << s11.top() << " ";
         s11.pop();
     }
     cout << endl << "Вторая башня:";
     while (!s22.empty())
     {
         cout << s22.top() << " ";
         s22.pop();
     }
     cout << endl << "Третья башня:";
     while (!s33.empty())
     {
         cout << s33.top() << " ";
         s33.pop();
     }
     color(2, 1);
     //color(4, 4);
     //system("Color F8");
     cout << endl <<endl<< "0 - Выход." << endl;
     cout << "1 - Переместить с 1 на 2" << endl;
     cout << "2 - Переместить с 1 на 3" << endl;
     cout << "3 - Переместить с 2 на 3" << endl;
     cout << "4 - Переместить с 2 на 1" << endl;
     cout << "5 - Переместить с 3 на 1" << endl;
     cout << "6 - Переместить с 3 на 2" << endl;
     color(6, 1);
     //color(7, 3);
     cout << "A:" << a << endl;
     cout << "B:" << b << endl;     //Нужно было для проверки последнего числа
     cout << "C:" << c << endl;
     cout << "Enter your choice: ";
     cin >> choice;
     switch (choice) {
     case 1:
     {
         if(a < b){
         s2.push(s1.top());//с первого на 2
         s1.pop();
         lastabd(s1,s2,s3,a,b,c,n);
         schet++;
         system("cls"); //ОЧИСТКА КОНСОЛИ
         continue;}
         else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
         system("cls"); //ОЧИСТКА КОНСОЛИ
         continue;}
     }
     case 2:
         if(a < c){
         s3.push(s1.top());//с первого на 3
         s1.pop();
         lastabd(s1,s2,s3,a,b,c,n);
         schet++;
         system("cls");
         continue;}
         else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
         system("cls");
         continue;}
     case 3:
         if(b < c){
         s3.push(s2.top());//с второго на 3
         s2.pop();
         lastabd(s1,s2,s3,a,b,c,n);
         schet++;
         system("cls");
         continue;}
         else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
         system("cls");
         continue;}
     case 4:
         if(b < a){
         s1.push(s2.top());//с второго на 1
         s2.pop();
         lastabd(s1,s2,s3,a,b,c,n);
         schet++;
         system("cls");
         continue;}
         else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
         system("cls");
         continue;}
     case 5:
         if(c < a){
         s1.push(s3.top());//с третьего на 1
         s3.pop();
         lastabd(s1,s2,s3,a,b,c,n);
         schet++;
         system("cls");
         continue;}
         else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
         system("cls");
         continue;}
     case 6:
         if(c < b){
         s2.push(s3.top());//с третьего на 2
         s3.pop();
         lastabd(s1,s2,s3,a,b,c,n);
         schet++;
         system("cls");
         continue;}
         else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
         system("cls");
         continue;}
     case 0:
         exit(0);
     default:
         cout << "Неправильно.Попробуй ещё раз" << endl;
     }
 }
 }
}

void color(int c, int b)
{
 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(hConsole, (WORD)(c | b));
}

если заменить lastabd на его содержимое то всё будет работать . Работаю в codeblocks


Ответы (0 шт):