Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 592
#1

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

16.11.2013, 16:28. Просмотров 668. Ответов 18
Метки нет (Все метки)

Поспорил с одним человеком, что смогу следующий код:
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2013, 16:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++11 Лямбда-выражения и вывод результата (C++):

Вычисление арифметического выражения и вывод полученного результата - C++
Ребят, помогите пожалуйста..только начали С++ учить..ничего не пойму,а учительница говорит самим разбираться,не помогает Разработать...

Лямбда выражения - C++
Здрасьте) вопрос по новому стандарту, в который ввели лямбда-выражения. создаю класс, у которого есть поле data, типа map. map...

Лямбда-выражения и замыкание - C++
Здравствуйте, изучаю новый для себя стандарт языка и не совсем могу разобраться с замыканием Прогнал по отладчику - c изменяется...

Почему не работают лямбда-выражения? - C++
Почему не компилиться выводит 38 7 C:\Users\Administrator\Desktop\pjc6\z1-2\main.cpp 'lamMul' does not name a type ...

Что такое лямбда выражения? - C++
Объясните, пожалуйста, простым и человеческим языком, что такое лямбда выражения? Можно на примере печати двумерного вектора (часть...

Определение типа возвращаемого значения лямбда-выражения - C++
Вообщем не совсем понимаю в каких случаях надо использовать замыкающий тип возвращаемого выражения. У липпмана написано что данный пример...

18
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
16.11.2013, 16:36 #2
cin.get код символа даёт, а не число читает.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.11.2013, 16:42 #3
С учетом замечания Somebody можно сделать так:
C++
1
printf("%s", [](vector<const char*> s){ int k; cin >> k; return s[k]; }({"Spring", "Summer", "Autumn", "Winter"}));
0
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 592
16.11.2013, 16:58  [ТС] #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;
}
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
16.11.2013, 17:45 #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 = ...
0
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 592
16.11.2013, 18:13  [ТС] #6
Somebody, опять же, повторюсь: для меня была важно, чтобы делалось как можно меньше действия и всё можно бы было "красивенько" пихнуть в одну строку.

Добавлено через 22 секунды
Прошу закрыть тему во избежание спама, т.к. я разобрался
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.11.2013, 18:21 #7
Цитата Сообщение от MastAKK Посмотреть сообщение
Прошу закрыть тему во избежание спама, т.к. я разобрался
А чего Вам за спам переживать? Сами же начали
И если Вы считаете, что результат впихивания в одну строку делает код "красивым", Вы глубоко заблуждаетесь.
0
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 592
16.11.2013, 18:22  [ТС] #8
Tulosba, я так не считаю, я имел ввиду, что мне нужно запихнуть всё в одну строку, но так чтобы всё было относительно "красиво" (не было куча действия через ; подряд)
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
16.11.2013, 18:31 #9
В одну строку всегда можно сделать. В одном statement'е? В одном expression'е? Что надо-то? И тут вопрос в том, насколько поведение должно соответствовать коду на JS при вводе произвольных строк, вещественных и отрицательных чисел.
А использование лямбды, чтобы взять элемент по индексу, это "красивенько"?

Добавлено через 2 минуты
А многие запятые можно менять на &&...
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.11.2013, 18:41 #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');
}
0
Max Dark
шКодер самоучка
1852 / 1652 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
16.11.2013, 19:18 #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
2
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.11.2013, 19:25 #12
Cra3y, но тут же нет лямбд
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
16.11.2013, 19:55 #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;
}
2
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.11.2013, 20:03 #14
castaway, во, уже без горизонтального скролбара
1
castaway
16.11.2013, 20:09     С++11 Лямбда-выражения и вывод результата
  #15

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2013, 20:09
Привет! Вот еще темы с ответами:

Использование лямбда выражения в качестве аргумента функции - C++
После того как я познакомился с ламбда функциями я хотел проверить их знания на некой практике, но я столкнулся с тем, что не знаю как...

Определение типа результата арифметического выражения - C++
Как определить тип результата арифметического выражения?

Составить алгоритм нахождения результата выражения по формуле - C++
*Вводятся натуральные числа m, n и действительные числа а1, ..., anm. Вычислить: a_1a_2\cdot...\cdot a_m+a_{m+1}a_{m+2}\cdot...\cdot...

Вывод результата - C++
Прошу совета. Сперва думал, что где-то в коде ошибка, но потом создал элементарную программу, типа 2+3 и вывел ответ на экран. Естественно...


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

Или воспользуйтесь поиском по форуму:
15
16.11.2013, 20:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.