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

С++11 Лямбда-выражения и вывод результата - C++

Восстановить пароль Регистрация
 
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
16.11.2013, 16:28     С++11 Лямбда-выражения и вывод результата #1
Поспорил с одним человеком, что смогу следующий код:
Javascript
1
alert( ['Весна', 'Лето', 'Осень', 'Зима'][prompt('Номер месяца?')/3|0] );
на C++ сделать (тоже просто). Решил использовать лямбда-выражения и C++11. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
 
using namespace std;
 
int main()
{
    int i = cin.get();
    printf("%s", [](int i, vector<char*> s)->char*{ return s[i]; }(i, {"Spring", "Summer", "Autumn", "Winter"}));
    return 0;
}
Но выводится (null). Почему? Пытался через cout делать, но там прога вообще вылетает.

Добавлено через 2 минуты
Вот ещё одна версия кода (хотелось бы чтобы работало именно так):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
 
using namespace std;
 
int main()
{
    printf("%s", [](vector<char*> s)->char*{ return s[cin.get()]; }({"Spring", "Summer", "Autumn", "Winter"}));
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
16.11.2013, 16:36     С++11 Лямбда-выражения и вывод результата #2
cin.get код символа даёт, а не число читает.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.11.2013, 16:42     С++11 Лямбда-выражения и вывод результата #3
С учетом замечания Somebody можно сделать так:
C++
1
printf("%s", [](vector<const char*> s){ int k; cin >> k; return s[k]; }({"Spring", "Summer", "Autumn", "Winter"}));
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
16.11.2013, 16:58  [ТС]     С++11 Лямбда-выражения и вывод результата #4
Tulosba, не, хотелось бы в одно действие. Сейчас сижу, гуглю, ищу способы...

Добавлено через 8 минут
Сделал, если кому интересно)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
 
using namespace std;
 
int main()
{
    printf("%s", [](vector<char*> s, int i)->const char*{ return (i < 4 && i > 0) ? s[i] : "Input number from 1 to 4"; }({"Spring", "Summer", "Autumn", "Winter"}, cin.get()-49));
    return 0;
}
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
16.11.2013, 17:45     С++11 Лямбда-выражения и вывод результата #5
Есть такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
int i = (
    cout << "Month number:",
    cin >> i,
    i /= 3,
    cout << (
        i >= 0 && i < 4 ?
            "Spring\0Summer\0Autumn\0Winter" + i * 7 :
            "undefined"
        ),
    0);
gcc только говорит: "operation on 'i' may be undefined [-Wsequence-point]". ИМХО, тут всё нормально, просто нестандартная инициализация такая получилась, но можно на всякий случай int i, x = ...
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
16.11.2013, 18:13  [ТС]     С++11 Лямбда-выражения и вывод результата #6
Somebody, опять же, повторюсь: для меня была важно, чтобы делалось как можно меньше действия и всё можно бы было "красивенько" пихнуть в одну строку.

Добавлено через 22 секунды
Прошу закрыть тему во избежание спама, т.к. я разобрался
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.11.2013, 18:21     С++11 Лямбда-выражения и вывод результата #7
Цитата Сообщение от MastAKK Посмотреть сообщение
Прошу закрыть тему во избежание спама, т.к. я разобрался
А чего Вам за спам переживать? Сами же начали
И если Вы считаете, что результат впихивания в одну строку делает код "красивым", Вы глубоко заблуждаетесь.
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
16.11.2013, 18:22  [ТС]     С++11 Лямбда-выражения и вывод результата #8
Tulosba, я так не считаю, я имел ввиду, что мне нужно запихнуть всё в одну строку, но так чтобы всё было относительно "красиво" (не было куча действия через ; подряд)
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
16.11.2013, 18:31     С++11 Лямбда-выражения и вывод результата #9
В одну строку всегда можно сделать. В одном statement'е? В одном expression'е? Что надо-то? И тут вопрос в том, насколько поведение должно соответствовать коду на JS при вводе произвольных строк, вещественных и отрицательных чисел.
А использование лямбды, чтобы взять элемент по индексу, это "красивенько"?

Добавлено через 2 минуты
А многие запятые можно менять на &&...
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.11.2013, 18:41     С++11 Лямбда-выражения и вывод результата #10
Еще вариант в коллекцию. Без vector'а.
C++
1
2
3
4
5
#include <iostream>
int main()
{
    std::cout << [](int k) { const char* s[] = {"Spring", "Summer", "Autumn", "Winter"}; return s[k]; }(std::cin.get()-'0');
}
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
16.11.2013, 19:18     С++11 Лямбда-выражения и вывод результата #11
А если так?
C++
1
2
3
4
5
6
7
#include <iostream>
#include <vector>
int main()
{
    std::cout << (std::vector<const char*>({"Spring", "Summer", "Autumn", "Winter"}))[std::cin.get()-'0'];
    return 0;
}
Bash
1
2
3
4
$ g++ --std=c++11 lya.cpp
:$ ./a.out 
1
Summer
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.11.2013, 19:25     С++11 Лямбда-выражения и вывод результата #12
Cra3y, но тут же нет лямбд
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
16.11.2013, 19:55     С++11 Лямбда-выражения и вывод результата #13
Cra3y, а зачем нам вектор?
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    std::cout << &"Spring\0Summer\0Autumn\0Winter"[(std::cin.get() - '0') * 7];
    return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.11.2013, 20:03     С++11 Лямбда-выражения и вывод результата #14
castaway, во, уже без горизонтального скролбара
castaway
16.11.2013, 20:09
  #15

Не по теме:

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

Tulosba
16.11.2013, 20:17
  #16

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
может стоит написать об этом в соответствующем разделе?
По-моему, в соответствующем разделе это уже обсуждалось. Правда, как видим, воз и ныне там. Наверное было что-то опять "нецелесообразно".

castaway
16.11.2013, 20:19
  #17

Не по теме:

Tulosba, тем не менее я всё же туда написал. Вдруг дело хоть на этот раз сдвинется с "мёртвой точки"..

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
17.11.2013, 04:46     С++11 Лямбда-выражения и вывод результата #18
Цитата Сообщение от Tulosba Посмотреть сообщение
castaway, во, уже без горизонтального скролбара
С позволения Cra3y
C++
#include <iostream>
#include <vector>
int main()
{
    std::cout << (std::vector<const char*>({"Spring", "Summer", "Autumn", "Winter"}))[std::cin.get()-'0'];
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2013, 08:48     С++11 Лямбда-выражения и вывод результата
Еще ссылки по теме:

C++ Составить алгоритм нахождения результата выражения по формуле
C++ Вывод результата
Почему не работают лямбда-выражения? C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.11.2013, 08:48     С++11 Лямбда-выражения и вывод результата #19
MrGluck, теперь не могу сосчитать кол-во строк.
Yandex
Объявления
17.11.2013, 08:48     С++11 Лямбда-выражения и вывод результата
Ответ Создать тему
Опции темы

Текущее время: 03:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru