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

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

Войти
Регистрация
Восстановить пароль
 
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
#1

Использование выражений типа a == b == c; - C++

29.06.2012, 16:14. Просмотров 660. Ответов 14
Метки нет (Все метки)

Скажите, можно ли использовать такие выражения и как они работают?

Почему такая конструкция дает истину только когда все переменные равны 1 ?

C++
1
if(a==b==c) cout << "Hello, World !"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2012, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование выражений типа a == b == c; (C++):

Доказать (перебор) что для любых величин А, В, С типа Boolean следующие пары логических выражений эквивалентны - C++
Доказать (путем перебора возможных значений), что для любых величин А, В, С типа Boolean следующие пары логических выражений имеют...

Использование неопределённого типа - C++
Использование неопределённого типа &quot;monsters&quot;. Игра не дописанная, помогите решить ошибку!#include &quot;stdafx.h&quot; #include &lt;windows.h&gt; ...

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

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

Использование шаблонного типа в shared_ptr - C++
Здравствуйте, я решил поупражняться на С++ и написать свой двунаправленный список: Node.h #pragma once #include &quot;stdafx.h&quot; using...

Написать парсер математических выражений с функцией упрощения этих выражений - C++
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка вида &quot;a*b+a*c&quot;, являющаяся корректным...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
29.06.2012, 16:25 #2
sievmi, нельзя использовать, потому что оператор == возвращает true или false и соответственно второй оператор сравнивает правое значение с true или false
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
29.06.2012, 16:48  [ТС] #3
gooseim, спасибо за ответ.
Если их использовать нельзя, то самый просто способ сделать это поругому с помощью логческих связок?
Если так, то получается вот это короче сделать не получиться?

C++
1
2
3
4
5
for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            if(a[i][j]=='.' && a[i-1][j]=='.' && a[i+1][j]=='.'
                && a[i][j-1]=='.' && a[i][j+1]=='.')
                    c++;
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
29.06.2012, 16:50 #4
sievmi, какого типа переменные a, b и с?
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
29.06.2012, 16:53  [ТС] #5
Цитата Сообщение от gooseim Посмотреть сообщение
sievmi, какого типа переменные a, b и с?
Я кусок с a,b,c для примера написал, а вообще пытаюсь упростить вот этот кусок:
C++
1
2
3
4
5
for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            if(a[i][j]=='.' && a[i-1][j]=='.' && a[i+1][j]=='.'
                && a[i][j-1]=='.' && a[i][j+1]=='.')
                    c++;
Сдесь массив типа char.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
29.06.2012, 16:55 #6
sievmi, можете написать человеческим языком поставку задачи?
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
29.06.2012, 19:28  [ТС] #7
gooseim, извеняюсь, задача такая :

Есть двумерный массив, заполненный символами '.' и '*'. Если элемент массива равен '.', то нужно проверить имеет ли он общие стороны с элементами равными '*', если нет, то увеличить счетчик.
Короче говоря, это часть задачи морской бой, нужно по заданному полю установить количество возможных мест для однопалубного корабля.('*' - занятая клетка, '.' - свободная).

Добавлено через 2 часа 25 минут
Да, наверное я очень криво изложил свою задачу и мало кто хочет разбираться в этих кривых строчках)
Но главную задачу попробую изъяснить коротко и ясно:
какие есть способы проверить равны ли несколько переменных между собой
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
29.06.2012, 19:31 #8
C++
1
if(a==b && b==c)
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
29.06.2012, 20:21  [ТС] #9
А если элементов не 3, а скажем 30 или 100, используется этот же способ ?
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.06.2012, 21:30 #10
зависит от ситуации. но в общем случае все сто элементов и нужно будет проверить.
чтобы не загромождать код подобными сравнениями, их лучше вынести в отдельную функцию и передавать ей все необходимое для проверки, а она уже будет возвращать результат:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool IsMatched(int** arr, unsigned i, unsigned j) // имя лучше какое-нибудь более осмысленное
{
  // тут делайте что хотите и как хотите.
  const char symbol = '.';
  return arr[i][j]==symbol
      && arr[i-1][j]==symbol
      && arr[i+1][j]==symbol
      && arr[i][j-1]==symbol
      && arr[i][j+1]==symbol
      ;
}
 
...
 
for(i=1; i<=n; i++)
{
  for(j=1; j<=m; j++)
  {
     if (IsMatched(a, i, j))
       c++;
   }
}
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
29.06.2012, 21:43 #11
Цитата Сообщение от sievmi Посмотреть сообщение
А если элементов не 3, а скажем 30 или 100, используется этот же способ ?
C++
1
2
3
4
5
6
7
bool yes = true;
for (int i=1; i < ARRSIZE; i++)
    if (ARR[i] != ARR[i-1])
    {
        yes = false;
        break;
    }
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.06.2012, 07:07 #12
Цитата Сообщение от DU Посмотреть сообщение
bool IsMatched(int** arr, unsigned i, unsigned j) // имя лучше какое-нибудь более осмысленное
Наверное не int** arr, а char** arr ?
C++
1
bool IsMatched(char** arr, unsigned i, unsigned j)
И не забыть, что массив будет объявляться так:
C++
1
char **a = new char*[n];
где n константа.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.06.2012, 08:01 #13
Цитата Сообщение от sievmi Посмотреть сообщение
Почему такая конструкция дает истину только когда все переменные равны 1 ?
А ты разверни её пополам. Что будет?
C++
1
(a==b)==c
, или
C++
1
a==(b==c)
, но и
C++
1
a==b
, и
C++
1
b==c
возвращают bool, он не может принимать ни каких значений, кромек 0 и 1.

Добавлено через 2 минуты
Цитата Сообщение от sievmi Посмотреть сообщение
Если их использовать нельзя, то самый просто способ сделать это поругому с помощью логческих связок?
C++
1
(a==b)&&(a==c)
,
C++
1
(a==b)&&(b==c)
, или
C++
1
(a==c)&&(b==c)
. Идея в том, что одна величина сравнивается со всеми и результаты объединяются по
C++
1
&&
.

Добавлено через 1 минуту
Цитата Сообщение от gooseim Посмотреть сообщение
можете написать человеческим языком поставку задачи?
Поставка бывает товара, а если задачи, то постановка.

Добавлено через 45 секунд
Цитата Сообщение от sievmi Посмотреть сообщение
извеняюсь
От слова "вина", а не "Вена".

Добавлено через 1 минуту
Цитата Сообщение от sievmi Посмотреть сообщение
Короче говоря, это часть задачи морской бой, нужно по заданному полю установить количество возможных мест для однопалубного корабля.('*' - занятая клетка, '.' - свободная).
Лучше подойдёт массив булов, а к нему как раз применим
C++
1
a==b==c
.

Добавлено через 1 минуту
Цитата Сообщение от sievmi Посмотреть сообщение
А если элементов не 3, а скажем 30 или 100, используется этот же способ ?
Тогда только циклом.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
30.06.2012, 10:53 #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Лучше подойдёт массив булов, а к нему как раз применим
C++
1
a==b==c
Да ну...
a = 1; b = 0; c = 0;
Результатом будет истина, а должна быть ложь. Без логических связок никак.

Добавлено через 3 минуты
Но в этом случае можно будет писать
C++
1
a && b && c
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.06.2012, 11:11 #15
Цитата Сообщение от grizlik78 Посмотреть сообщение
a = 1; b = 0; c = 0;
Не учёл ассоциативность. Да, только отдельными сравнениями. Но массив булов здесь всё равно уместнее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2012, 11:11
Привет! Вот еще темы с ответами:

Недопустимое использование типа в качетве выражения С++ - C++
Добрый вечер всем! Не могу понять в чем проблема. Задача такова: создать клас для хранения БД (тел. справочник). Создать производный...

IntelliSense: использование имени типа не допускается - C++
Model.h #pragma once class ModelClass { private: ModelClass(void); ~ModelClass(void); static ModelClass* playInstance;

Использование переменной типа char в цикле for - C++
Ребята, подскажите пожалуйста, как использовать 8-ми битную переменную в цикле for? Неправильный пример - for(char i = 0; i &lt; N; i++)

Использование strlen для объектов типа string - C++
Подскажите пожалуйста, как strlen использовать на string.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.06.2012, 11:11
Ответ Создать тему
Опции темы

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