С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/47: Рейтинг темы: голосов - 47, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 12.09.2020
Сообщений: 24

Составные логические условия

12.09.2020, 20:31. Показов 9495. Ответов 17
Метки нет (Все метки)

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

Знаю, что очень криво, но вот код. Не работает 20ая строчка кода, выводит "Dark", вместо "Lightly". Также не работает 38ая строчка кода, если писать ф или # (как пример) выводит или Темно, или Светло, почему? Тоже не понимаю. Может я не до конца понимаю принцип if, но прочитал много сайтов, ошибку так и не понял.

Сам код:

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
#include <iostream>
 
using namespace std;
 
int main()
 
{
    bool day, curtains, lamp;
    cout << "Enter values:\n";
    cin >> day >> curtains >> lamp; // curtains = True (open), False (not open); lamp = True (is working), False = (not working);
 
    if (day == true, curtains == true, lamp == true) { // 1 1 1
        cout << "Lightly";
    }
    else if (day == true, curtains == false, lamp == false) { // 1 0 0
        cout << "Dark";
    }
    else if (day == true, curtains == true, lamp == false) { // 1 1 0
        cout << ".";
    }
    else if (day == true, curtains == false, lamp = true) { // 1 0 1
        cout << "Lightly";
    }
    else if (day == false, curtains == false, lamp == false) { // 0 0 0
        cout << "Dark";
    }
    else if (day == false, curtains == true, lamp == true) { // 0 1 1
        cout << "Lightly";
    }
    else if (day == false, curtains == false, lamp == true) { // 0 0 1
        cout << "Lightly";
    }
    else if (day == false, curtains == true, lamp == false) { // 0 1 0
        cout << "Dark";
    }
    else {
        cout << "Invalid values";
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.09.2020, 20:31
Ответы с готовыми решениями:

Составные логические условия
Задание «Лампа со шторой». В комнате светло, если на улице день и раздвинуты шторы или если включена лампа. Ваша программа должна, в...

Составные логические условия
Здравствуйте , помогите пожалуйста .Оно работает ,но не так как я хочу, если я ввожу число , которое не попадает в диапазон ...

Разработка с разветвлениями.Составные условия
Определить сумму налога на доходы, который необходимо оплатить, если процент отчислений зависит от суммы дохода. Если доход не превышает...

17
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.09.2020, 20:42
Лучший ответ Сообщение было отмечено WoRRuM как решение

Решение

Цитата Сообщение от WoRRuM Посмотреть сообщение
if (day == true, curtains == true, lamp == true) { // 1 1 1
        cout << "Lightly";
    }
    else if (day == true, curtains == false, lamp == false) { // 1 0 0
        cout << "Dark";
    }
    else if (day == true, curtains == true, lamp == false) { // 1 1 0
        cout << ".";
    }
C++
1
2
3
4
5
6
7
8
9
10
11
if (day && curtains && lamp) { // 1 1 1
    cout << "Lightly";
}
else if (day && !curtains && !lamp) { // 1 0 0
    cout << "Dark";
}
else if (day && curtains && !lamp) { // 1 1 0
    cout << ".";
}
 
..........................
Дальше по-аналогии
1
0 / 0 / 0
Регистрация: 12.09.2020
Сообщений: 24
12.09.2020, 21:49  [ТС]
Не подскажете как сделать так, чтобы при вводе других значений программа выводила "Invalid values"?

Спасибо за решение первой части проблемы, всё заработало!

Но теперь, когда я пишу:
C++
1
2
3
else {
        cout << "Invalid values";
    }
Вывод:
Enter values:
a
Lightly

То есть, последнее else не работает
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.09.2020, 22:04
Цитата Сообщение от WoRRuM Посмотреть сообщение
Не подскажете как сделать так, чтобы при вводе других значений программа выводила "Invalid values"?
C++
1
2
3
4
5
6
 cin >> day >> curtains >> lamp; // curtains = True (open), False (not open); lamp = True (is working), False = (not working);
if (!std::cin)
{
   cout << "Invalid values" << std::endl;
   return -1;
}
1
0 / 0 / 0
Регистрация: 12.09.2020
Сообщений: 24
13.09.2020, 01:13  [ТС]
Теперь
Вывод: "LightlyInvalidValues"
xD

Добавлено через 2 часа 42 минуты
Тему можно считать закрытой, самостоятельно разобрался, большое вам спасибо, Олег!
0
3 / 2 / 1
Регистрация: 13.09.2020
Сообщений: 5
13.09.2020, 10:55
Лучший ответ Сообщение было отмечено WoRRuM как решение

Решение

WoRRuM,
хочу предложить тотальное упрощение ветвлений
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main() {
    bool day, curtains, lamp;
    cout << "Enter values:\n";
    cin >> day >> curtains >> lamp;
    if (lamp) {
        cout << "Lightly";
    }
    else if (day & curtains) {
        cout << "Lightly";
    }
    else {
        cout << "Dark";
    }
    return 0;
}
Такой код легче читать, быстрее писать, меньшая вероятность допустить ошибку, да и найти ошибку, в случае чего, проще
1
0 / 0 / 0
Регистрация: 12.09.2020
Сообщений: 24
13.09.2020, 11:55  [ТС]
Вы - гений! (для меня)
Я обязательно использую в следующий раз ваш удобный, компактный код, но сдавать этот код в университете под видом "сам сделал", я не буду, и совестливо, и принцип работы объяснить на 100% не смогу, и как к этому пришёл
0
3 / 2 / 1
Регистрация: 13.09.2020
Сообщений: 5
13.09.2020, 12:29
WoRRuM,
Здесь всё крайне просто, могу объяснить на пальцах
Т.к. общее условие
Цитата Сообщение от WoRRuM Посмотреть сообщение
"В комнате светло, если на улице день и раздвинуты шторы или если включена лампа
" содержит "или" то мы можем его разбить на 2 части, сначала проверить лампу и не зависимо от других условий мы можем выдать результат(если лампа горит, то true, иначе проверяем следующие условия), а потом проверить остальные условия и, если они не true, то в конечном условии(
Цитата Сообщение от WoRRuM Посмотреть сообщение
"В комнате светло, если на улице день и раздвинуты шторы или если включена лампа
) мы всегда получим false, а дальше живём и радуемся результатам. Удачной учёбы в универе.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2020, 12:33
Можно и так:
C++
1
2
3
4
5
if (cin >> day >> curtains >> lamp)
{
   cout << "Invalid values" << std::endl;
   return -1;
}
2
0 / 0 / 0
Регистрация: 12.09.2020
Сообщений: 24
13.09.2020, 13:15  [ТС]
Теперь мне всё понятно! Большое вам спасибо! :З
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2020, 13:20
Вообще тут лучше наверное использовать флаги.

Т.е. вместо трех переменных bool day, curtains, lamp; использовать одну int flags (или структуру с битовыми плями); и выставлять биты и тогда можно будет использовать switch/case
0
0 / 0 / 0
Регистрация: 12.09.2020
Сообщений: 24
13.09.2020, 13:34  [ТС]
Я только начинаю изучать c++, знаю только азы и самые основы, так что про флаги пока что не знаю, но изучу этот вопрос более детально на досуге
0
 Аватар для Alex Kireev
28 / 36 / 6
Регистрация: 21.11.2017
Сообщений: 202
13.09.2020, 14:17
Почитай про логические операции
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2020, 14:51
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
#include <iostream>
 
using namespace std;
 
union Value
{
    struct
    {
      char day:1;
      char curtains:1;
      char lamp:1;    
    };  
    unsigned data; 
} value;
 
 
int main()
{
    bool day, curtains, lamp;
    if(cin >> day >> curtains >> lamp)
    {
        value.day = day;
        value.curtains = curtains;
        value.lamp = lamp;
        
        switch(value.data)
        {
            
          case 0b111:
          case 0b101: 
              cout << "Lightly"; break;  
              
          case 0b000:  
          case 0b100:  
              cout << "Dark"; break;
             
          // итд             
        };
    }
 
    return 0;
}
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.09.2020, 16:01
Avazart, стандарт такое не одобряет
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2020, 18:36
Цитата Сообщение от zayats80888 Посмотреть сообщение
Avazart, стандарт такое не одобряет
А ссылку можно? Что именно не одобряет ? union или битовые поля?

В любом случае можно использовать сдвиг, не в этом суть.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.09.2020, 18:49
Цитата Сообщение от Avazart Посмотреть сообщение
Что именно не одобряет ?
switch(value.data) - чтение неактивного члена.
https://timsong-cpp.github.io/... ss.union#2

Добавлено через 2 минуты
union не для этого, если нужна реинтерпретация, используют bit_cast или memcpy
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2020, 18:50
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
#include <iostream>
using namespace std;
 
int main()
{
    bool day, curtains, lamp;
 
    if(cin >> day >> curtains >> lamp)
    {
        int value=  (day<<2) | (curtains<<1) | lamp;
        switch(value)
        {
            
          case 0b111:
          case 0b101: 
              cout << "Lightly"; break;  
              
          case 0b100:  
             cout << "Dark"; break;
             
          // итд             
        };
    }
 
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2020, 18:50
Помогаю со студенческими работами здесь

Как правильно записывать составные условия
Задание: Створити програму, що визначає належить крапка з заданими координат ами X,Y . #include &lt;iostream&gt; #include...

Логические условия со строками
#include &lt;clocale&gt; #include &lt;string&gt; #include &lt;iostream&gt; using namespace std; int main(){ setlocale(LC_CTYPE, &quot;rus&quot;); ...

Логические условия включающие сравнение кодов символов
объясните что это означает return (a &lt; 48 || a &gt; 57) s.erase(remove_if(s.begin(), s.end(), (char a) { return (a &lt; 48 || a...

Составные логические условия
Здравствуйте, решил написать программу для открытия программ но не просто для открытия а чтобы перед запуском запрашивало пароль а то брат...

Записать следующие логические выражения (составные высказывания)
ПОмогите решить задачу на c# Задание Даны высказывания: Высказывание A: Конь - животное Высказывание B: Ночью светит...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru