Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 03.10.2021
Сообщений: 8
1

Функция в функции, которая возвращает два значения

02.09.2022, 14:12. Показов 1432. Ответов 24

Author24 — интернет-сервис помощи студентам
Всем привет, я недавно начал заниматься С++ и решил сделать свою мини-игру. но по мере написания кода, столкнулся с одной проблемой.

в этой игре я сделал карту из двумерного массива и передвигаюсь по ней через x и y, как раз в функции передвижения и возникает проблема, у меня не возвращаются x и y в другую функцию.

в этой функции я перемещаюсь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int Map_movement(int x, int y, int key) {
    switch (key)
    {
    case 1:
        if (y == 9) {
            cout << "\nВам запрещенно покидать границы вашего государства.\n";
            break;
        }
        else {
            if (World[x + 1][y] == 4) {
                cout << "\nВиднеются высокие горы, через них не пройти.\n";
            }
            else {
                return x++;
            }
        }
 
    case 2:
        if (y == 0) {
            cout << "\nВам запрещенно покидать границы вашего государства.\n";
            break;
        }
        else {
            if (World[x - 1][y] == 4) {
                cout << "\nКакие ысокие горы, путь закрыт.\n";
            }
            else {
                return x--;
            }
        }
 
    case 3:
        if (x == 9) {
            cout << "\nВам запрещенно покидать границы вашего государства.\n";
            break;
        }
        else {
            if (World[x][y - 1] == 4) {
                cout << "\nКакие высокие горы, через них пройти не получится.\n";
            }
            else {
                return y--;
            }
        }
 
    case 4:
        if (x == 0) {
            cout << "\nВам запрещенно покидать границы вашего государства.\n";
            break;
        }
        else {
            if (World[x][y + 1] == 4) {
                cout << "\nВот это гора, взабраться не получится.\n";
            }
            else {
                return y++;
            }
        }
    }
}
А в этой выбираю направление для перемещения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int Movement_screen(int x, int y){
    int key;
    system("cls");
    cout << "Введите номер текста, чтобы туда пойти\n";
    if (World[x - 1][y] == 0) cout << "1. На севере находится ваш домик.\n";
    if (World[x - 1][y] == 1) cout << "1. На севере виднеется тропа.\n";
    if (World[x - 1][y] == 2) cout << "1. На севере видны крыши домов, там город.\n";
    if (World[x - 1][y] == 3) cout << "1. На севере виден густой лес.\n";
    if (World[x - 1][y] == 4) cout << "1. На севере видно горы.\n";
    if (World[x - 1][y] == 5 || World[x - 1][y] == 6 || World[x - 1][y] == 7 || World[x - 1][y] == 8) cout << "1. На севере вроде видно пещеру.\n";
 
    if (World[x + 1][y] == 0) cout << "2. На юге находится ваш домик.\n";
    if (World[x + 1][y] == 1) cout << "2. На юге виднеется тропа.\n";
    if (World[x + 1][y] == 2) cout << "2. На юге видны крыши домов, там город.\n";
    if (World[x + 1][y] == 3) cout << "2. На юге виден густой лес.\n";
    if (World[x + 1][y] == 4) cout << "2. На юге видно горы.\n";
    if (World[x + 1][y] == 5 || World[x + 1][y] == 6 || World[x + 1][y] == 7 || World[x + 1][y] == 8) cout << "2. На юге вроде видно пещеру.\n";
 
    if (World[x][y - 1] == 0) cout << "3. На западе находится ваш домик.\n";
    if (World[x][y - 1] == 1) cout << "3. На западе виднеется тропа.\n";
    if (World[x][y - 1] == 2) cout << "3. На западе видны крыши домов, там город.\n";
    if (World[x][y - 1] == 3) cout << "3. На западе виден густой лес.\n";
    if (World[x][y - 1] == 4) cout << "3. На западе видно горы.\n";
    if (World[x][y - 1] == 5 || World[x][y - 1] == 6 || World[x][y - 1] == 7 || World[x][y - 1] == 8) cout << "3. На западе вроде видно пещеру.\n";
 
    if (World[x][y + 1] == 0) cout << "4. На востоке находится ваш домик.\n";
    if (World[x][y + 1] == 1) cout << "4. На востоке виднеется тропа.\n";
    if (World[x][y + 1] == 2) cout << "4. На востоке видны крыши домов, там город.\n";
    if (World[x][y + 1] == 3) cout << "4. На востоке виден густой лес.\n";
    if (World[x][y + 1] == 4) cout << "4. На востоке видно горы.\n";
    if (World[x][y + 1] == 5 || World[x][y + 1] == 6 || World[x][y + 1] == 7 || World[x][y + 1] == 8) cout << "4. На востоке вроде видно пещеру.\n";
 
    cin >> key;
    int j = 0;
    int k = x;
    int l = y;
    while (j == 0) {
        if (key == 1 || key == 2 || key == 3 || key == 4) {
            if (key == 1 || key == 2) x = Map_movement(x, y, key);
            else y = Map_movement(x, y, key);
            j = 1;
        }
        else cin >> key;
    }
    if (k != x) return x;
    else return y;
}
и функция main откуда все начинается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    int x = 3, y = 3;
    setlocale(LC_ALL, "Russian");
    Start();
 
    x = Movement_screen(x, y);
    y = Movement_screen(x, y);
    if (World[x][y] == 1) Field();
    if (World[x][y] == 2) Small_town();
    if (World[x][y] == 3) Forest();
    if (World[x][y] == 5) Cave_1();
    if (World[x][y] == 6) Cave_2();
    if (World[x][y] == 7) Cave_3();
    if (World[x][y] == 8) Cave_4();
    if (World[x][y] == 0) Native_house();
    return 0;
}
Если подскажите в решении проблемы буду очень признателен, также буду рад выслушать и другие советы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2022, 14:12
Ответы с готовыми решениями:

Определить функцию, которая принимает два аргумента и возвращает два значения
Задали такую задачку(, которая частично основана на задаче о которой я уже спрашивал на данном...

Напишите функцию, которая возвращает два значения
Напишите функцию, которая возвращает два значения. Первое значение это результат сложения...

Напишите функцию, которая возвращает два значения
Напишите функцию, которая возвращает два значения. Первое значение это результат сложения...

Функция, которая возвращает 2 значения в структуре
В функции searchMax должны возвращаться координаты, как это сделать? #include &lt;stdlib.h&gt;...

24
2338 / 1828 / 753
Регистрация: 27.07.2012
Сообщений: 5,410
02.09.2022, 14:26 2
Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
как раз в функции передвижения и возникает проблема, у меня не возвращаются x и y в другую функцию
Если речь о функции Map_movement, то что именно вы хотите оттуда вернуть?

Добавлено через 1 минуту
Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
C++
1
return x++;
Кстати, вы правильно понимаете, как тут жта штука сработает?
0
0 / 0 / 0
Регистрация: 03.10.2021
Сообщений: 8
02.09.2022, 16:31  [ТС] 3
Цитата Сообщение от John Prick Посмотреть сообщение
Если речь о функции Map_movement, то что именно вы хотите оттуда вернуть?
Я хочу от туда возвращать x или y, в зависимости от выбранного направления


Цитата Сообщение от John Prick Посмотреть сообщение
Кстати, вы правильно понимаете, как тут жта штука сработает?
Точно, нужно поставить ++x, иначе он не будет плюсовать его. Если бы вы не спросили, я так бы и думал в чем проблема
0
2338 / 1828 / 753
Регистрация: 27.07.2012
Сообщений: 5,410
02.09.2022, 16:52 4
Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
Точно, нужно поставить ++x
Вообще не стоит писать таких вещей, в результате которых вы сомневаетесь. Напишите просто
C++
1
2
++x; // или x++
return x;
0
 Аватар для SmallEvil
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
02.09.2022, 16:57 5
Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
функция в функции
В с++ это запрещено
0
2338 / 1828 / 753
Регистрация: 27.07.2012
Сообщений: 5,410
02.09.2022, 17:00 6
Цитата Сообщение от SmallEvil Посмотреть сообщение
В с++ это запрещено
Ну почему же. Лямбды можно же писать всюду.
0
 Аватар для SmallEvil
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
02.09.2022, 17:04 7
Цитата Сообщение от John Prick Посмотреть сообщение
Лямбды можно же писать всюду.
лямбды не функции
0
2338 / 1828 / 753
Регистрация: 27.07.2012
Сообщений: 5,410
02.09.2022, 17:10 8
Цитата Сообщение от SmallEvil Посмотреть сообщение
лямбды не функции
Ну так-то да, но выглядят как функции. Имелось ли в виду под "функция в функции" именно функция, а не что-то на неё очень похожее, нам не известно.
0
 Аватар для SmallEvil
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
02.09.2022, 23:24 9
Цитата Сообщение от John Prick Посмотреть сообщение
Имелось ли в виду
жто уже для новго поколения форумчан )

Добавлено через 1 минуту
Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
if (World[x][y - 1] == 0)
ну нельзя же надд инвалидами то глумится а ?

Добавлено через 1 минуту
Цитата Сообщение от John Prick Посмотреть сообщение
Ну так-то да, но выглядят как функции
Милиардеры тоже выглядят как люди да ? ...
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
03.09.2022, 08:52 10
Цитата Сообщение от SmallEvil Посмотреть сообщение
лямбды не функции
А что это, макросы, что ли?
Лямбды принимают параметры, возвращают результат.
Так что лямбды — самые настоящие функции, только без идентификатора.
Точно также как оператор сложения, умножения или конструкторы с деструкторами — тоже функции.
0
 Аватар для SmallEvil
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
03.09.2022, 11:04 11
Цитата Сообщение от Замабувараев Посмотреть сообщение
А что это, макросы, что ли?
Это функциональный объект.
Замабувараев, Книжки и документацию не читаем, кодим только под "окна", угу -угу, попсятина ...
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
03.09.2022, 11:48 12
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это функциональный объект.
Функциональный объект — это всё что слева от знака равенства, а сама лямбда — это функция.
0
 Аватар для SmallEvil
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
03.09.2022, 12:20 13
Цитата Сообщение от Замабувараев Посмотреть сообщение
а сама лямбда
это выражение
дальше разжёвывать, ведь сам то не в состоянии ?

Добавлено через 35 секунд
Цитата Сообщение от Замабувараев Посмотреть сообщение
Функциональный объект — это всё что слева от знака равенства, а сама лямбда — это функция.
Просто глубочайшие познания, браво.

Добавлено через 1 минуту
Цитата Сообщение от Замабувараев Посмотреть сообщение
это всё что слева от знака равенства
и где здесь знак равенства ?
C++
1
sort(vec.begin(), vec.end(), [](auto& a, auto& b){/*some code here*/});
Добавлено через 4 минуты
или здесь ?
C++
1
2
3
4
5
6
struct SomeFunctor{
   void operator()(){
      // i am the Void :) 
   }
};
SomeFunctor()();
А ведь функциональный объект то есть.
Ах да, мы же не знаем что это такое ... сорри, стена хороший слушатель

Добавлено через 13 минут
Замабувараев, и для совсем ленивых и безруких, без отсылок на спецификации на англицком и прочем, для самхы маленьких как бе.
Цитата Сообщение от https://ru.wikipedia.org/wiki/Лямбда-выражение
Лямбда-выражение в программировании — специальный синтаксис для определения функциональных объектов, заимствованный из λ-исчисления. Применяется как правило для объявления анонимных функций по месту их использования, и обычно допускает замыкание на лексический контекст, в котором это выражение использовано. Используя лямбда-выражения, можно объявлять функции в любом месте кода.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
03.09.2022, 13:11 14
Цитата Сообщение от SmallEvil Посмотреть сообщение
sort(vec.begin(), vec.end(), [](auto& a, auto& b){/*some code here*/});
Ага, и в качестве доказательств вы приводите функцию из библиотеки языка Си (не Си Плас Плас), которая знать не знает ни про классы, ни про объекты и принимает указатель на функцию.
Цитата Сообщение от SmallEvil Посмотреть сообщение
SomeFunctor()();
Здесь нет анонимных функций, здесь вызов оператора «скобочки».
0
 Аватар для Kuzia domovenok
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,521
Записей в блоге: 1
03.09.2022, 13:22 15
Цитата Сообщение от Замабувараев Посмотреть сообщение
Ага, и в качестве доказательств вы приводите функцию из библиотеки языка Си (не Си Плас Плас), которая знать не знает ни про классы, ни про объекты и принимает указатель на функцию.
ты про sort?
её нет в Си

Добавлено через 46 секунд
Цитата Сообщение от Замабувараев Посмотреть сообщение
которая знать не знает ни про классы, ни про объекты
с++ от С отличается не только классами
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
03.09.2022, 13:32 16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты про sort?
её нет в Си
Ага, значит это С++. Ну штош.
Тем не менее, не увидел где sort принимает класс.
Я увидел только, что sort принимает функцию‐компаратор.
0
 Аватар для SmallEvil
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
03.09.2022, 14:26 17
Цитата Сообщение от Замабувараев Посмотреть сообщение
Тем не менее, не увидел где sort принимает класс.
Я увидел только, что sort принимает функцию‐компаратор.
Она шаблонная, и в качестве покмпаратора примет все что угодно.
И будет работать ожидаемым образом с любым объектом способным выполнить вызов как функцию
и соответствовать бинарному предикату.
Что такое "бинарный" и "предикат" тоже разжевать или сам погуглишь ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
template<class T>
struct MyCompare{
    bool operator()(const T& a, const T& b){
        return a<b; // or any other compare
    }
};
int main(){
    vector<int> v{5,1,3,2,4,};
    sort(v.begin(), v.end(), MyCompare<vector<int>::value_type>());
    copy(v.begin(), v.end(), ostream_iterator<int>(cout," "));
}
Не вижу смысла дальше проводить ликбез.
Потому что это на целую книгу наберется.

Добавлено через 2 минуты
Цитата Сообщение от Замабувараев Посмотреть сообщение
Тем не менее, не увидел где sort принимает класс.
Да приведенный код, это класс.
И одновременно функтор или функциональный объект.

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
sort(v.begin(), v.end(), MyCompare<vector<int>::value_type>());
Заметь, что передается в качестве компаратора.
Не метод класса, а именно его объект.
0
0 / 0 / 0
Регистрация: 03.10.2021
Сообщений: 8
08.09.2022, 18:46  [ТС] 18
Цитата Сообщение от SmallEvil Посмотреть сообщение
ну нельзя же надд инвалидами то глумится а ?
А что не так в этом фрагменте?
Объяснишь для инвалидов?
0
 Аватар для Vitalik-2007
1 / 1 / 0
Регистрация: 27.05.2021
Сообщений: 97
08.09.2022, 19:12 19
Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
Объяснишь для инвалидов?
Нормальный человек:
C++
1
if (World[y - 1][x] == 0)
Инвалид:
C++
1
if (World[x][y - 1] == 0)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12812 / 6684 / 1800
Регистрация: 18.10.2014
Сообщений: 16,935
08.09.2022, 19:25 20
Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
у меня не возвращаются x и y в другую функцию.
Что значит "не возвращаются"?

Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
case 1:
        if (y == 9) {
            cout << "\nВам запрещенно покидать границы вашего государства.\n";
            break;
        }
Но после этого break функция просто завершится. А где return? Почему у вас функция типа int завершается без return В С++ такое не разрешается.

Цитата Сообщение от hiku_rurubachi Посмотреть сообщение
return x++;
В чем смысл делать постфиксный ++ на локальную переменную в return? Что это должно делать, по вашему замыслу?

---

Также проваливающиеся друг в друга ветки case - это так и задумано?
Распространенные ошибки

Добавлено через 3 минуты
Цитата Сообщение от Замабувараев Посмотреть сообщение
а сама лямбда — это функция.
Нет.

В С++ вообще нет никакой "самой лямбды". В С++ есть лямбда-выражения, результатом которых является prvalue-объекты неоговоренного типа. Они называются объектами замыкания (closure object).

Никаких "функций" здесь нет.
0
08.09.2022, 19:25
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2022, 19:25
Помогаю со студенческими работами здесь

Функция, принимает три строки и возвращает два больших значения
Недавно только взялся за изучение языка и тут такая задача. Необходимо написать функцию, которая...

Функция, которая получает в качестве параметров два целых числа и возвращает сумму
Написать функцию, которая получает в качестве параметров два целых числа и возвращает сумму чисел...

Есть ли функция, которая возвращает в качестве значения расположение проекта?
Есть ли функция, которая отдает значение расположение проекта?

Функция которая ищет в массиве значения и возвращает его номер
Здравствуйте. Начал изучать javascript, столкнулся с одним заданием: Вот мой не рабочий код,...

PROG функция, которая возвращает в качестве значения длину списка
Помогите разобраться в программе. Нужно преподу объяснить как она работает, а я ни как не...

Создать модуль U21, который содержит следующие функции: a. Функция F(real), которая возвращает значение функции F(x)=x+(x+1)/(x+2) b. Процедуру A,
Создать модуль U21, который содержит следующие функции: a. Функция F(real), которая возвращает...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru