Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/33: Рейтинг темы: голосов - 33, средняя оценка - 4.97
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
1

Библиотека функций

26.02.2011, 20:46. Показов 6264. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Может кто поможет!!
Язык С. Создать библиотеку функций для построения таблиц истинности булевых функций заданных КНФ и ДНФ. Пользователь вводит ДНФ или КНФ и при подключении BF.H (которую нужно создать..как? help!!) выводит табл истинности.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2011, 20:46
Ответы с готовыми решениями:

Какая библиотека отвечает за использования математических функций в VS 2005?
Какая библиотека отвечает за использования математических функций в VS 2005??

Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h
Помогите решить задания: 1.Дано натуральное число n. Найти разность между первой цифрой этого...

Передача значений функций в главную программу, вызов функций
Здравствуйте! Скорее всего, неправильно передаю значения функциям и в главную программу. Помогите...

Объявление функций внутри других функций
Иногда вижу в некоторых исходниках на c объявление функций, внутри main. Например: main(){ ...

21
110 / 46 / 4
Регистрация: 03.09.2009
Сообщений: 112
26.02.2011, 20:56 2
bf.h
C++
1
2
3
4
5
6
7
8
#ifndef _BF_H_
#define _BF_H_
 
void MyLibFunction1();
void MyLibFunction2();
void MyLibFunction3();
 
#endif //_BF_H_
bf.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "bf.h"
 
void MyLibFunction1()
{
}
void MyLibFunction2()
{
}
void MyLibFunction3()
{
}
вот так
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:00  [ТС] 3
вот кое что уже есть..
как передать в хедер задаваемое кнф (днф) типа х1!х2х3 and х1х2!х3 ???

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
#ifndef  __BF_H
#define  __BF_H
 
 void knf( /*как вот сюда передать кнф */)
 { if  int x1, x2, x3, y;
    printf("x1|x2|x3| y\n");
    printf("-----------\n");
    for(x1=0; x1<2; x1++)
    {
        for(x2=0; x2<2; x2++)
        {
             for(x3=0; x3<2; x3++)
             {
                 y = !х1х2х3 and x1!x2x3;
                 printf(" %i| %i| %i| %i\n", x1, x2, x3, y);
             };
        };
    };
        
    system ("pause");
    return 0;
}
 #define false   0
 #define true    1
 #define and     &&
 #define and_eq  &=
 #define bitand  &
 #define compl   ~
 #define not     !
 #define not_eq  !=
 #define or      ||
 #define or_eq   |=
 #define xor     ^
 #define xor_eq  ^=
#endif
0
110 / 46 / 4
Регистрация: 03.09.2009
Сообщений: 112
27.02.2011, 00:06 4
Я не знаю, что такое кнф и днф, но передавать это нужно при вызове функции в качестве параметров.
прототип функции:
C++
1
void MyFunction1(int param1, double param2);
вызов функции:
C++
1
MyFunction1( 1, 0.56 );
Добавлено через 2 минуты
Цитата Сообщение от NektaRR Посмотреть сообщение
y = !х1х2х3 and x1!x2x3;
это что еще такое?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.02.2011, 00:15 5
NektaRR, тут так просто всё не решится, надо писать разбор выражения. Задача нетривиальная, просто так писать никто не будет.

Добавлено через 6 минут
Цитата Сообщение от reich Посмотреть сообщение
Я не знаю, что такое кнф и днф
Логические функции. Первая представлена как конъюнкция простых дизъюнкций (т.е. таких, в которые каждая переменная или её отрицание входят не более одного раза), вторая, соответственно, дизъюнкция простых конъюнкций. Их-то и надо парсить, что и пытается таким вот простым путём сделать ТС в 14 строке)))
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:15  [ТС] 6
кнф это вот такая строка какой её тип будет?? char?

y=х1!х2х3 and х1х2!х3

Вообщем на экране в результате должно выводитсь что-то в этом роде табличка ( если ввести y=х1!х2х3 and х1х2!х3 то знач у в табл будут другие,правильние)

х1 х2 х3 у
0 0 0 0
0 0 1 0
0 1 0 0
1 0 0 0
0 1 1 1
1 1 0 0
1 0 1 1
1 1 1 0
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:20  [ТС] 7
Цитата Сообщение от reich Посмотреть сообщение
Я не знаю, что такое кнф и днф, но передавать это нужно при вызове функции в качестве параметров.
прототип функции:
C++
1
void MyFunction1(int param1, double param2);
вызов функции:
C++
1
MyFunction1( 1, 0.56 );
Добавлено через 2 минуты

это что еще такое?
это пример кнф где если х1=1 значение !х1=0 ... булева алгебра... дискретная математика..
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.02.2011, 00:22 8
и правда
сперва понадобится лексический разбор, пропустить все пробельные знаки, вычленить и распределить все лексемы, из лексем пронумеровать переменные
потом построение грамматики - из синтаксического дерева рассчитать значение выражения
морочно вообщем
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:23  [ТС] 9
Цитата Сообщение от silent_1991 Посмотреть сообщение
надо писать разбор выражения
что ти имеешь ввиду?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.02.2011, 00:24 10
NektaRR, ваша функция ни ДНФ, ни КНФ не является. У вас тут конъюнкция конъюнкций, т.е. белиберда. КНФ ваша функция являлась бы, если бы имела вид вроде y = (x1 \/ !x2 \/ x3)/\(x1 \/ x2 \/ !x3). ДНФ же она была бы при такой записи: y = x1 /\ !x2 /\ x3 \/ x1 /\ x2 /\ !x3
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:27  [ТС] 11
Цитата Сообщение от alex_x_x Посмотреть сообщение
и правда
сперва понадобится лексический разбор, пропустить все пробельные знаки, вычленить и распределить все лексемы, из лексем пронумеровать переменные
потом построение грамматики - из синтаксического дерева рассчитать значение выражения
морочно вообщем
это можно сделать через if.. если єто проверка на то как правильно введено кнф, то я знаю как...
только где его писать в теле void knf() или перед..?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.02.2011, 00:29 12
Цитата Сообщение от NektaRR Посмотреть сообщение
что ти имеешь ввиду?
Вот вы смотрите на выражение, например, y = (x1 \/ !x2 \/ x3)/\(x1 \/ x2 \/ !x3). Что вы видите? Что сперва надо посчитать значение в левой скобке, потом в правой, а потом выполнить их конъюнкцию. При этом посчитать выражения в скобках можно слева направо, поскольку там стоят одинаковые операции (точнее, операции с одним приоритетом). Так же там есть отрицания, их тоже надо учитывать. Вы это всё видите эмпирически. А вот как втолковать это компьютеру? Он никаких конъюнкций, отрицаний и скобок не знает. Так вот, для этого надо реализовывать специальный алгоритм, который простую строку переводит в определённую структуру данных, которую затем было бы легко разбирать алгоритмически (например, дерево). Вот это процесс и является основным в данной программе и достаточно громоздким.
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:30  [ТС] 13
Цитата Сообщение от silent_1991 Посмотреть сообщение
ваша функция ни ДНФ, ни КНФ не является. У вас тут конъюнкция конъюнкций, т.е. белиберда. КНФ ваша функция являлась бы, если бы имела вид вроде y = (x1 \/ !x2 \/ x3)/\(x1 \/ x2 \/ !x3). ДНФ же она была бы при такой записи: y = x1 /\ !x2 /\ x3 \/ x1 /\ x2 /\ !x3
согласн.. завтык..
кста, как записать знаки конъюкции и дизъюнкции правильно?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.02.2011, 00:35 14
NektaRR, давайте сначала разберёмся: вам нужна одна конкретная функция в программе или вам нужна программа, которой пользователь сообщает любую функцию любой сложности и которая эту функцию обрабатывает? Если первое, то жёстко впилить эту функцию в исходник труда не составляет - вы просто пишите её как она есть, учитывая правила синтаксиса языка. Только с этой программой вы уже ничего не сделаете, она будет считать строго эту функцию и никакую иную. Но вам-то нужен именно второй вариант, т.е. чтобы пользователь сам вводил функцию любой сложности, и программа её обрабатывала. Тогда вам придётся писать обработку логических выражений (т.н. парсер), и никакого другого пути у вас нет.
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:37  [ТС] 15
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что сперва надо посчитать значение в левой скобке, потом в правой, а потом выполнить их конъюнкцию. При этом посчитать выражения в скобках можно слева направо, поскольку там стоят одинаковые операции (точнее, операции с одним приоритетом). Так же там есть отрицания, их тоже надо учитывать. Вы это всё видите эмпирически. А вот как втолковать это компьютеру? Он никаких конъюнкций, отрицаний и скобок не знает. Так вот, для этого надо реализовывать специальный алгоритм, который простую строку переводит в определённую структуру данных, которую затем было бы легко разбирать алгоритмически (например, дерево). Вот это процесс и является основным в данной программе и достаточно громоздким.
...сложно..((
но вот эта прога откуда взят кусок для того bf.h что в начале работает и вроде правильно считает таблицу истинности только для одной заданой функции, может ее как то переделать для для любой вводимой кнф(днф)
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
#include <stdlib.h>
#include <stdio.h>
 
int main ()
{
    int x1, x2, x3, y;
        
    printf("x1|x2|x3| y\n");
    printf("-----------\n");
    for(x1=0; x1<2; x1++)
    {
        for(x2=0; x2<2; x2++)
        {
             for(x3=0; x3<2; x3++)
             {
                 y = ( (!x1 && x2) || (x1 && !x2) ) && (x3 || x1 && x2);
                 printf(" %i| %i| %i| %i\n", x1, x2, x3, y);
             };
        };
    };
        
    system ("pause");
    return 0;
}
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:38  [ТС] 16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что сперва надо посчитать значение в левой скобке, потом в правой, а потом выполнить их конъюнкцию. При этом посчитать выражения в скобках можно слева направо, поскольку там стоят одинаковые операции (точнее, операции с одним приоритетом). Так же там есть отрицания, их тоже надо учитывать. Вы это всё видите эмпирически. А вот как втолковать это компьютеру? Он никаких конъюнкций, отрицаний и скобок не знает. Так вот, для этого надо реализовывать специальный алгоритм, который простую строку переводит в определённую структуру данных, которую затем было бы легко разбирать алгоритмически (например, дерево). Вот это процесс и является основным в данной программе и достаточно громоздким.
...сложно..((
но вот эта прога откуда взят кусок для того bf.h что в начале работает и вроде правильно считает таблицу истинности только для одной заданой функции, может ее как то переделать для для любой вводимой кнф(днф)
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
#include <stdlib.h>
#include <stdio.h>
 
int main ()
{
    int x1, x2, x3, y;
        
    printf("x1|x2|x3| y\n");
    printf("-----------\n");
    for(x1=0; x1<2; x1++)
    {
        for(x2=0; x2<2; x2++)
        {
             for(x3=0; x3<2; x3++)
             {
                 y = ( (!x1 && x2) || (x1 && !x2) ) && (x3 || x1 && x2);
                 printf(" %i| %i| %i| %i\n", x1, x2, x3, y);
             };
        };
    };
        
    system ("pause");
    return 0;
}
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.02.2011, 00:44 17
NektaRR, вы наотрез отказываетесь хоть чуть-чуть вдуматься в то, что вам пишут уже два человека несколько сообщений подряд. Отвечаю ещё раз:
Да, её можно переделать для любой вводимой функции. Но для этого нужно написать разбор выражения. А то вы хотите примерно так:
"- Этот автомобиль разгоняется до 200 за 6 секунд, но он стоит $200000. А вот этот до 70 за 20 секунд, но и стоит он 70000 рублей.
- Ой, а можно мне до 200 за 6 секунд, но только за 70 тысяч?"
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:45  [ТС] 18
Цитата Сообщение от silent_1991 Посмотреть сообщение
нужен именно второй вариант, т.е. чтобы пользователь сам вводил функцию любой сложности, и программа её обрабатывала
там как по мне нужны проверки :
что первый символ х или !
что нет пробелов
что символы только х,0..9, и знаки которыми обозначаються дизъюнкции и конъюнкции (п.с. какими знаками обозначать правильно?)
ну и .. больше не придумаю
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.02.2011, 00:47 19
NektaRR, ёшкин кот... Эти проверки нужны для синтаксического анализа. Но он вам ничего не даст кроме знания, что в функции нет синтаксических ошибок. Для лексического анализа (а значит и для, собственно, вычисления) нужен парсер, чёрт его дери!
0
1 / 1 / 2
Регистрация: 26.02.2011
Сообщений: 53
27.02.2011, 00:51  [ТС] 20
silent_1991, ОК!
можно пример дерева?
это моя третяя програма на С!! HELP!! пожалста!!
0
27.02.2011, 00:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2011, 00:51
Помогаю со студенческими работами здесь

Вызов функций внутри других функций
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include...

Библиотека функций
Необходимо написать некоторую функцию (или несколько), довольно объемную. Но использовать её нужно...

Библиотека нужных функций
Всем привет! Наверное у каждого есть некоторая своя библиотека нужных функций, которые облегчают...

библиотека, расширяющая набор функций
Здравствуйте, у меня тут задача на создание библиотеки... А я даже не знаю как она выглядит=)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru