Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52

Вычислить значение булевской формулы

28.03.2014, 11:06. Показов 1720. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток программисты!

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

Задача звучит -

Вычислить значение булевской формулы, содержащей двоичные числа и знаки двоичных операций и не содержащей скобок. Реализовать следующие двоичные операции: ~ (отрицание), | (конъюнкция), & (дизъюнкция), ^ (сложение по модулю два).

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

Ну как поможете?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.03.2014, 11:06
Ответы с готовыми решениями:

Вычислить значение формулы
Дано натуральное число n. Вычислить

Вычислить значение формулы в постфиксной форме
Привет,ребят!помогите пожалуйста решить задачку на С# Дана формула.Перевести ее в постфиксную форму.Вычислить значение формулы в...

Используя Stack вычислить значение формулы
Доборого дня суток, помогите пж, очень надо Используя Stack В текстовом файле записана без ошибок формула вида: <формула>=...

16
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
28.03.2014, 11:12
Цитата Сообщение от Пинок Под Зад Посмотреть сообщение
что значит - не содержащей скобок
наверное то что у каждой операции имеется свой приоритет выполнения

Добавлено через 1 минуту
Цитата Сообщение от Пинок Под Зад Посмотреть сообщение
Вычислить значение булевской формулы, содержащей двоичные числа и знаки двоичных операций и не содержащей скобок. Реализовать следующие двоичные операции: ~ (отрицание), | (конъюнкция), & (дизъюнкция), ^ (сложение по модулю два).
я так понял задание следующее . в консольку вводится выражение состоящее из двоичных чисел и знаков операций. и надо это все решить .. сложности не вижу
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52
28.03.2014, 11:14  [ТС]
Metall_Version, тоесть что бы все шло в определенной по умолчанию последовательности ? по типу - сперва умножение,сложение,вычитание ,деление? вы про это имели ввиду ... тоесть как бы 2+2*2 = 6 а не 8 потому что нету скобок ?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
28.03.2014, 11:19
Цитата Сообщение от Пинок Под Зад Посмотреть сообщение
необходимо углубляться, в том числе как я понял в асемблер
асм тут ни к чему.
решение задачи сводится к разбору строки на элементарные операции, определение приоритета выполнения этих операций, ну и собственно последовательное выполнение согласно приоритетам
1
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
28.03.2014, 11:27
Цитата Сообщение от Пинок Под Зад Посмотреть сообщение
Metall_Version, тоесть что бы все шло в определенной по умолчанию последовательности ? по типу - сперва умножение,сложение,вычитание ,деление? вы про это имели ввиду ... тоесть как бы 2+2*2 = 6 а не 8 потому что нету скобок ?
ну да
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52
28.03.2014, 11:34  [ТС]
nio,

ну хорошо , звучит вроде все просто, но в тоже время не понятно )))

думаю просто нужно начать ...

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
          
            Console.Write("Введите количество цифр и нажмите Enter:");
            int c = Convert.ToInt32(Console.ReadLine());
         
 
            int[] mas = new int[c];
            Random r = new Random();
            for (int i = 0; i < mas.Length; i++)
            {
                mas[i] = r.Next(0, 2);
                Console.Write(mas[i] + " ");
            }
 
 
 
            Console.Read();
 
        }
    }
}

вот этот код - заполняет масив цифрами 1 и 0 в рандомном варианте, пользователь определяет количество цифр ...

дальше что мне с этими цифрами делать?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
28.03.2014, 13:11
Пинок Под Зад, ищите по форуму Калькулятор и обратная польская запись.
вам следует создать самый обычный калькулятор только операции у него будут не обычные арифметические, а двоичные логические. а они в C# так же есть как и арифметические
1
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52
28.03.2014, 17:45  [ТС]
Learx, Мысль весьма интересна...прочитал на викепедии по этому поводу...сам смысл то вроде понятен...теперь выяснить как это реализовать в коде...да и разобраться с этими двоичными операциями
0
 Аватар для Metall_Version
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
28.03.2014, 18:10
Цитата Сообщение от Пинок Под Зад Посмотреть сообщение
Learx, Мысль весьма интересна...прочитал на викепедии по этому поводу...сам смысл то вроде понятен...теперь выяснить как это реализовать в коде...да и разобраться с этими двоичными операциями
разбираться в этих операциях не нужно . тут только работа со строкой. нужно идентифицировать символы лог. операций , и сами числа в двоичной системе. а все логические операции в шарпе реализованы
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
28.03.2014, 18:23
Пинок Под Зад, говорю же искать по форуму - эта тема уже сто раз поднималась!
Metall_Version, аналогично. задач на СЧ на формуме овер дофига(простите за мой албанский)
0
0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 71
28.03.2014, 18:25
У меня все же впечатление, что, например, при передаче строки 10001011|10010111 должно выдаваться 10000011 тогда
Цитата Сообщение от Пинок Под Зад Посмотреть сообщение
думаю просто нужно начать ...
не с кода рандомных цифр, а с обработки вводимой строки. Например, в динамический массив (можно строк) вписывать не по цифре, а по целому числу(двоичному). После обработки выровнять их по длине, дописав слева 0, где потребуется.
К сожалению, у меня не самый изощренный ум в плане логики программы, так что что делать с операциями так сразу в голову не приходит. Может, так же массив токо структур из 3 полей( операция, ссылка на операнд1, ссылка на операнд2), выровненный по приоритету.
Под конец сам процесс:
Предложил бы бежать по массиву операций и менять операнды(так как скобок у нас нет, можно менять оба операнда на результат операции). Т.к. меняем по ссылке, в будущих операциях значения так же изменятся.
Единственное. Я тоже начинающий, так что понятия не имею как это будет выглядеть в коде)
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
28.03.2014, 19:38
Icerfog, обратная польская запись. и выравнивать ничего не надо
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.03.2014, 20:11
Пинок Под Зад, почитайте, что такое LL-парсер.

Добавлено через 2 минуты
типичная реализация для калькулятора (перевод в ОПН):
http://ru.wikipedia.org/wiki/%... 1%81%D1%8C

из ОПН решение тривиально.
1
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52
28.03.2014, 23:10  [ТС]
Learx, не сомневаюсь в ваших знаниях...но действительно для меня все это ново...только учусь...потому прошу простить мой нубизм...наверняка все с этого начинали и тыкали кого то в прямой код носом...правда,я только тут не давно...

Добавлено через 4 минуты
Psilon, сейчас ознакомлюсь.

Добавлено через 10 минут
Psilon, по LL-парсер.,не совсем понял, что это и как относится?
По поводу ссылки на википедию, я уже прочитал ее с верху в низ до конца,но поясняю,сам смысл понятен,но пока что не могу придумать концепцую как это реализовать в код...да и впрчем в какой код...я только начинаю...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.03.2014, 00:46
Пинок Под Зад, у меня был неплохой калькулятор, но потом я начал его переделывать под "соответствие паттернам" и в итоге запорол, паттерны вообще зло, если их писать ради них самих.

Хотя вот код, который осуществляет перевод в обратную польскую нотацию. Вроде как даже работает:

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System.Collections.Generic;
using System.Text;
 
namespace MyMath
{
    public class RPNHelper
    {
        public readonly string Input;
 
        public RPNHelper(string input)
        {
            Input = input;
        }
 
        public bool BadBreckets() //Проверяем баланс скобок в строке
        {
            int i = 0;
            foreach (char c in Input)
            {
                if (c == '(')
                    i++;
                else if (c == ')')
                {
                    i--;
                    if (i < 0)
                        return false;
                }
            }
            return i != 0;
        }
 
        public string Convert()
        {
            var result = new StringBuilder(Input.Length);
            bool negative = false;
            var operatorstack = new Stack<char>();
            foreach (char c in Input)
            {
                if (c == ' ') continue;
                if (c == '(')
                    operatorstack.Push(c);
                else if (c == ')')
                {
                    result.Append(PopUntilOpenBracket(operatorstack));
                }
                else if (OperationFactory.IsSupportedOperation(c))
                {
                    WorkWithOperator(c, out negative, result, operatorstack);
                }
                else
                {
                    if (negative)
                    {
                        result.Append('-');
                        negative = false;
                    }
                    result.Append(c);
                } //Если это не скобки и не операторы, то это цифра, добавляем к выходной строке, с учетом знака
            }
            while (operatorstack.Count > 0) //Вытряхиваем в строку оставшиеся символы
                result.Append(" " + operatorstack.Pop());
            return result.ToString();
        }
 
        private void WorkWithOperator(char c, out bool negative, StringBuilder result, Stack<char> operatorstack)
        {
            Operation op = OperationFactory.GetOperation(c);
            if (c == '-')
            {
                negative = true;
                result.Append("0 "); //Используем математический подход a - b = a + (0 - b)
                op = OperationFactory.GetOperation('+');
            }
            else
                negative = false;
            result.Append(" ");
            while (operatorstack.Count > 0 && op.Priority < OperationFactory.GetOperation(operatorstack.Peek()).Priority)
            {
                result.Append(operatorstack.Pop() + " ");
            }
            operatorstack.Push(op.Symbol);
        }
 
        private string PopUntilOpenBracket(Stack<char> stack)
        {
            var sb = new StringBuilder();
            while (stack.Count > 0)
            {
                char a = stack.Pop();
                if (a == '(') break;
                sb.Append(" " + a);
            }
            return sb.ToString();
        }
    }
}
1
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52
14.04.2014, 17:25  [ТС]
Господа!
В продолжение темы, вообщем то мне вдруг показалось что мы пошли в дебри...прочитав в сотый раз задание мне вдруг показалось что я понял вопрос и просветлело как реализовать ответ!
рассказываю мое видение
разбираю вопрос по кускам

"Вычислить значение булевской формулы"

тоесть вычислить истина или ложь в ответе - другими словами 1 или 0

"содержащей двоичные числа и знаки двоичных операций"
тоесть содержит 1 или 0 и знаки двоичных операций (операции приведены ниже)

"и не содержащей скобок"
вот это не понятно , и я думаю что никто и не заметит если я этого не реализую - по моему замыслу пользователь сможет вводить только 0 или 1 без каких либо других знаков.

"Реализовать следующие двоичные операции: ~ (отрицание)"
тоесть юзер выбирает операцию отрицание - его просят ввести одну операнду - 1 или 0 , если он пишет 1 то в ответе получает 0 , если пишет 0 то в ответе получает 1 .

тоесть ответ согласно таблицы истинности

A ~A
0 1
1 0

" | (конъюнкция)"
тут подобная ситуация, юзер выбирает операцию конъюнкция
программа просит две операнды, юзер вводит и в ответ получает результат согласно таблицы истинности для конъюнкции

A B A & B
0 0 0
0 1 1
1 0 1
1 1 1

"& (дизъюнкция)"
тут собственно так же как и выше, только таблица истинности другая и соответственно результат

A B A | B
0 0 0
0 1 0
1 0 0
1 1 1


"^ (сложение по модулю два)"
Ну и тут программа попросит ввести три операнды, и выдаст ответ согласно таблицы
X Y Z ^(X,Y,Z)
0 0 0 0
1 0 0 1
0 1 0 1
1 1 0 0
0 0 1 1
1 0 1 0
0 1 1 0
1 1 1 1

думаю усложнять не зачем...как считаете мои мысли адекватны?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
14.04.2014, 18:47
Пинок Под Зад,
1) двоичные числа это не 0 и 1, а числа в двоичной СС

совсем просто получить число в десятичной СС:
C#
1
  uint x = Convert.ToUInt32("1111", 2); //15
2) на входе имеем строку вида:

010010 & 11011 | ~01110 ^ 10110

легко находим на форуме парсер в обратную польскую запись(потратил всего 10 минут): https://www.cyberforum.ru/csha... ost1275998
и Калькулятор: сделать обратную польскую запись

немного адаптируем его под себя(поставив свои знаки операций)

3. собственно я уже за тебя сделал 99%. может, приложишь усилие и сделаешь оставшийся 1% ???

Добавлено через 6 минут
P.S. ОПЗ вычисляется гораздо проще:
1. храним в виде стека(не переводим в строку)
2. извлекаем элемент - если операнд, то сохраняем в стек операндов выполнив Convert
3. если операция, то извлекаем из стека операндов один(для ~)-два операнда(для других) и сохраняем в стек операндов результат операции
4. по окончанию стека ОПЗ в стеке операндов содержится единственный элемент-результат
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2014, 18:47
Помогаю со студенческими работами здесь

Вычислить для каждой из матриц значение формулы
Даны вещественные матрицы A, B и C размером 1020 . Вычислить для каждой из них величину : + Меню в этой программе.

Вычислить значение формулы при действительных значениях всех переменных
Вычислить значение формулы при действительных значениях всех переменных (1+1/x^2 )^x-12x^2 y

Вычислить значение формулы при действительных значениях всех переменных...
Вычислить значение формулы при действительных значениях всех переменных (1+1/x^2 )^x-12x^2 y

Булевской переменной Flag присвоить значение True если значения переменных X равны
1) Булевской переменной Flag присвоить значение True если значения переменных X равны, и значение False в противоположном случае. 2)...

Вычислить значение формулы: x=(a*2+b*c)/(d-3)
Добрый день! помогите н нужно написать подобную x= (a*5+b*c)/(b-6) заранее спасибо:) Пример программы Требуется вычислить...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru