22.09.2017, 07:33 [+3 UTC]
в нашей команде: 2 124 чел. | участники онлайн: 0 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
21.09.2017, 12:28

Последний вопрос:
19.09.2017, 11:37

Последний ответ:
21.09.2017, 10:04

Последняя рассылка:
21.09.2017, 21:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
14.02.2017, 20:27 »
svrvsvrv
Большое спасибо за консультацию. Очень подробно и доступно. [вопрос № 190562, ответ № 274649]
14.05.2013, 21:16 »
Илья
Большое спасибо! Помогли [вопрос № 187337, ответ № 272263]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 239
solowey
Статус: 6-й класс
Рейтинг: 83
Хватов Сергей
Статус: Академик
Рейтинг: 71

Перейти к консультации №:
 

Консультация онлайн # 191339
Раздел: • С / С++
Автор вопроса: mir97_00 (Посетитель)
Отправлена: 12.09.2017, 16:31
Поступило ответов: 0

Здравствуйте! У меня возникли сложности с таким вопросом:
Помогите пожалуйста решить одну из двух задач. Написать надо на языке Си.
1. Программа должна строить полную таблицу истинности введённой формулы.
2. Программа должна отыскивать все интерпретации на которых введённая формула принимает ложное значение.

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 191339

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

= общий = | 12.09.2017, 16:45 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

1) Вы как-то пробовали писать программу?
2) приведите пример формулы
3) количество аргументов? Если любое, то пределы.
4) какие функции надо обрабатывать? Какими значками обозначать?
5) что понимаете под полной таблицей истинности?
6) в каком виде выводить таблицу истинности? Приведите пример.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.09.2017, 16:47

mir97_00
Посетитель

ID: 401316

# 2

= общий = | 12.09.2017, 17:03 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

1. у меня были идеи. я раньше писала похожее но там надо было для определенной формулы. а тут я даже не знаю. как бы понятно что надо сначала заполнить матрицу всеми нулями а потом единицы в определенных местах. но я даже не знаю как потом перебирать для каждой буквы значения.
2. формула например такая (A&B)|(C!&B)
3.количество интерпретаций задает пользователь .
4.ну я думаю самые стандартные я даж думала создать к каждой формуле логической функцию такую что бы потом легче было в основной подставлять

bool and1(bool x, bool y)//^&
{
    if(x==true&&y==true) return 1;
    else return 0;
}
bool or1(bool x,bool y) //V
{
    if(x==false&&y==false) return 0;
    else return 1;
}

5.как я поняла надо что бы она выводила значения интерпретаций всех тоесть первыф столбик А второй В и внизу 00 01 10 ... и последний столбик уже сама формула
6. ну тут без разницы можно просто по столбцам как она и есть

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.09.2017, 17:25

mir97_00
Посетитель

ID: 401316

# 3

= общий = | 12.09.2017, 17:06 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

еще там надо для кнф сделать
я уже делала такое но на паскале и это надо использовать при написании только на си
Программный модуль, способный находить значение формулы, представленной в нормальной форме на данной интерпретации.
Спецификация функции KNF:
1) Заголовок: function KNF (const interpret:t_interpret;const expres1,expres2:t_expression):boolean;
2) Назначение: возвращает true если введённая функция КНФ на данной интерпретации- interpret принимает истинное значение, иначе возвращает -false;
3) Входные параметры – interpret, expres1, expres2;
4) Выходные параметры – нет;

Код (Pascal) :: выделить код
function KNF(const interpret:t_interpret;const expres1,expres2:t_expression):boolean;
var i,n:t_index2;
    funct:boolean;
begin
     funct:=true;
     n:=expres1[0];
     i:=1;
     while (funct=true)and(i<=n) do
           begin
                funct:=interpret[expres1[i]] or interpret[expres2[i]];
                i:=i+1;
           end;
     KNF:=funct;
end;

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.09.2017, 17:25

mir97_00
Посетитель

ID: 401316

# 4

= общий = | 12.09.2017, 17:12 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

вот я делала на паскале но там я выводила результат формул и пользователь сам вводил интерпретации

Программа, способная считывать формулу логики высказываний в одной из нормальных форм(по выбору пользователя) и находить значение данной формулы на вводимых пользователем интерпретациях.

Код (Pascal) :: выделить код
const Max_exp=52;
      Max=1000;
type
    t_base1=boolean; 
    t_index2=0..Max;
    t_base2=1..Max_exp;
    t_interpret=array[t_base2] of t_base1; {Значение высказываний на данной интерпретации}
    t_expression=array[t_index2] of t_base2; {Номера высказываний, используемых в формуле}
function DNF(const interpret:t_interpret;const expres1,expres2:t_expression):boolean;
var i,n:t_index2;
    funct:boolean;
begin
     funct:=false;
     n:=expres1[0];
     i:=1;
     while (funct=false)and(i<=n) do
           begin
                funct:=interpret[expres1[i]] and interpret[expres2[i]];
                i:=i+1;
           end;
     DNF:=funct;
end;
{-----------------------------------------------------------------------------------}
function KNF(const interpret:t_interpret;const expres1,expres2:t_expression):boolean;
var i,n:t_index2;
    funct:boolean;
begin
     funct:=true;
     n:=expres1[0];
     i:=1;
     while (funct=true)and(i<=n) do
           begin
                funct:=interpret[expres1[i]] or interpret[expres2[i]];
                i:=i+1;
           end;
     KNF:=funct;
end;

procedure Input_interpret(var interpret:t_interpret);
var i,m:t_index2;
    x:0..1;
    s:string;
begin
     s:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     write('Enter number of expression: ');
     readln(m); {m-число высказываний, используемых в формуле}
{В цикле вводятся значения высказываний на данной интерпретации}
     for i:=1 to m do
         begin
              write(s[i],'=');
              readln(x);
              if x=0 then interpret[i]:=false
              else interpret[i]:=true;
              interpret[Max_exp-i+1]:=not interpret[i];
         end;
end;
{-----------------------------------------------------------}
procedure Input_exp(var expres1,expres2:t_expression);
var i,m:t_index2;
    l,j:word;
    h,k:0..3;
    s:string;
begin

     write('Enter the formula: ');
     readln(s);
     l:=ord(s[0]);
     j:=0;
     i:=1;
     while i<l do
           begin
                h:=0;
                j:=j+1;
                if s[i]='(' then i:=i+1;
                for k:=1 to 2 do
                begin
                if (s[i]>='A') and (s[i]<='Z') then
                   begin
                   h:=h+1;
                   if s[i+1]='!' then
                      begin
                           if k=1 then expres1[j]:=Max_exp-(ord(s[i])-ord('A'));
                           if k=2 then expres2[j]:=Max_exp-(ord(s[i])-ord('A'));
                           i:=i+2;
                      end
                   else
                       begin
                            if k=1 then expres1[j]:=ord(s[i])-ord('A')+1;
                            if k=2 then expres2[j]:=ord(s[i])-ord('A')+1;
                            i:=i+1;
                       end;
                   end;
                if (s[i]='&')or(s[i]='|') then i:=i+1;
                end;
                if h=1 then expres2[j]:=expres1[j];
                if s[i]=')' then i:=i+1;
                if (s[i]='|')or(s[i]='&') then i:=i+1;
           end;
     expres1[0]:=j;
end;
{-----------------------------------------------------------}
var  interpret:t_interpret;
     expres1,expres2:t_expression;
     nf:1..2;
begin
     Input_interpret(interpret);
     write('Enter 1 if DNF, Enter 2 if KNF:  ');
     readln(nf); {}
     if nf=1 then
        begin
             Input_exp(expres1,expres2);
             writeln('--------REZALT--------');
             write(DNF(interpret,expres1,expres2));
        end
     else if nf=2 then
          begin
               Input_exp(expres1,expres2);
               writeln('--------REZALT--------');
               writeln(KNF(interpret,expres1,expres2));
          end
     else write('Error!!!');
end.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.09.2017, 17:24

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 5

= общий = | 12.09.2017, 17:38 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

5) Т.е. выводим только исходные и результат? Промежуточные не нужны?

Я бы делал по-другому:
Считываем формулу (любую!), преобразуем ее в обратную польскую запись, одновременно подсчитывая количество аргументов и проверяя на корректность.
Далее, по полученной ОПЗ циклим и получаем все, что требуется.
Можно решить обе задачи одновременно.
Как Вам такой алгоритм?

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.09.2017, 17:39

mir97_00
Посетитель

ID: 401316

# 6

= общий = | 12.09.2017, 17:40 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Как это "обратная польская запись "?
промежуточные не нужны.
ну можно и одновременно решить )

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 7

= общий = | 12.09.2017, 17:44 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Ознакомьтесь хотя бы здесь, если не знакомы.
Очень удобная вещь. Как раз для таких задач.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 8

= общий = | 12.09.2017, 17:56 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Могу обрадовать, нашел готовую программу, которая выводит таблицу истинности smile

#include <stdio.h>
#include <conio.h>

struct code_op			//структура для хранения допустимых символов операций
{
	char	symbol;		//символ
	char	priority;	//приоритет операции
};
						//коды операций, как индекс в массиве codes
#define SPACE_CODE	0
#define OR_CODE		1
#define AND_CODE	2
#define NOT_CODE	3
#define XOR_CODE	4
#define IMP_CODE	5
#define EQU_CODE	6
#define OPEN_CODE	7
#define CLOSE_CODE	8
#define MAX_CODE	9

code_op	codes[MAX_CODE] =
{
	{' ', 0},			//разделитель (игнорируется)
	{'|', 2},			//или
	{'&', 3},			//и
	{'~', 7},			//отрицание
	{'+', 4},			//исключающее или
	{'>', 5},			//импликация
	{'=', 6},			//эквиваленция
	{'(', 1},			//открывающая скобка
	{')', 1}			//закрывающая скобка
};

int CmpOp(char op)		//поиск кода в массиве codes
{
	int		i;

	for (i=0; i<MAX_CODE; i++)
	{
		if (codes[i].symbol == op)
			return i;	//возвращаем индекс
	}
	return -1;			//или -1, если не найдено
}

//построение обратной польской нотации с проверкой на корректность.
//параметры:
//str - входная строка с обычной нотацией
//opn - выходная строка с обратной польской нотацией
//возвращается количество переменных или -1, если любая ошибка
int OPN(char *str, char *opn)	
{
	char	*temp = opn;	//сохраним адрес выхожной строки для окончательной проверки
	char	stack[256];		//стек, растет снизу вверх
	int		top = 0;		//вершина стека
	int		cnt = 0;		//количество аргументов
	int		check;			//переменная для последней проверки корректности
	char	code;			//текущий символ

	for(code=*(str++); code; code=*(str++))	//по всем символам строки
	{
		if ((code >= 'A')&&(code <= 'Z'))	//заглавные буковки переменных
			code += 0x20;					//превратим в малые!
		if ((code >= 'a')&&(code <= 'z'))	//переменные ?
		{
			*(opn++) = code;				//пишем в выходную строку
			if (cnt < (code-'a'+1))			//одновременно ищем количество переменных,
				cnt = code-'a'+1;			// как максимальный используемый код
			while (top && (stack[top-1] == NOT_CODE))	//если перед этим было отрицание
				*(opn++) = stack[--top];	//извлечем из стека в выходную строку
		}
		else if ((code == '1')||(code == '0'))	//явные константы
		{
			*(opn++) = code;					//пишем в строку, как переменные
			while (top && (stack[top-1] == NOT_CODE))	//если перед этим было отрицание
				*(opn++) = stack[--top];	//извлечем из стека в выходную строку
		}
		else
		{
			code = CmpOp(code);				//проверим на допустимый код операции, возвращается индекс в массиве
			if (code == SPACE_CODE)
				continue;					//пробелы игнорируем
			else
			{
				if (code == OPEN_CODE)		//открывающая скобка?
					stack[top++] = code;	//пишем в стек
				else if (code == CLOSE_CODE)//закрывающая скобка?
				{
					if (top)				//есть что-то в стеке?
					{
						for(code=stack[--top]; code!=OPEN_CODE; code=stack[--top])
						{					//пока не дойдем до открывающей скобки
							*(opn++) = code;//извлекаем код операции в выходную строку
							if (top == 0)	//проверим на парность скобок
								return -1;	//если дошли до 0, значит открывающей скобки не было, ошибка!
						}
						while (top && (stack[top-1] == NOT_CODE))	//извлечем из стека отрицания,
							*(opn++) = stack[--top];				// которые перед открывающей скобкой
					}
					else
						return -1;			//в стеке ничего нет - ошибка!
				}
				else						//код операции
				{							//проверим приоритет операций
					if (top != 0)			//в случае, если что-то есть в стеке
					{
						if (stack[top-1] != NOT_CODE)	//кроме отрицания!
											//если приоритет новой операции меньше или равен
											//приоритета операции в стеке
							if (codes[code].priority <= codes[stack[top-1]].priority)
								*(opn++) = stack[--top];	//то извлечем код операции из стека
					}
					stack[top++] = code;	//запишем новый код в стек
				}
			}
		}
	}
	//извлечем из стека операции
	while(top)								//пока что-то там есть
	{
		if (stack[top-1] != OPEN_CODE)		//но никак не открывающая скобка!
			*(opn++) = stack[--top];
		else
			return -1;						//( - ошибка!
	}
	*opn = 0;								//закроем строку нулем
											//проверим строку на соответствие операций и переменных!
											//чтобы у операций (кроме отрицания) было два аргумента!
	check = 0;								//счетчик аргументов
	for(code=*(temp++); code; code=*(temp++))//по всем символам opn
	{
		if (code < MAX_CODE)				//операция?
		{
			if (code != NOT_CODE)			//не отрицание, для него надо один аргумент
			{
				check--;					//операции из двух аргументов получают один, т.е. уменьшаем на 1
			}
		}
		else
			check++;						//для аргументов увеличиваем на 1
	}
	if (check != 1)							//в итоге должны получить 1! Последний аргумент и будет результатом
		return -1;							//иначе - ошибка!
	return cnt;								//возвращаем количество переменных
}

void print_opn(char *opn)					//вывод строки ОПН
{
	char	ch;

	printf("OPN = ");

	for(ch=*(opn++); ch; ch=*(opn++))		//по всем символам строки
	{
		if (ch >= 'a')						//переменную
			printf("%c", ch);				//выводим, как ее саму
		else
			printf("%c", codes[ch].symbol);	//операцию, как символ из массива (в строке ОПН лежит индекс)
	}
	printf("\n");
}

void print_header(int cnt)					//заголовок таблицы истинности, параметр - число переменных
{
	int		i;
	
	for(i=0; i<cnt; i++)					//для всех
		printf("%c ", i+'a');				//выводим буковки, разделяя пробелом
	printf("f\n");							//f, как идентификатор значения функции
}

//расчет функции для конкретного набора значений переменных
//значения задаются битами в параметре row, которые можно рассматривать, как номер строки
//параметры:
// opn - строка обратной польской нотации
// row - порядковый номер строки
// cnt - количество переменных
//возвращает значение функции на конкретном наборе переменных
int F(char* opn, int row, int cnt)
{
	char	stack[256];		//стек для отработки ОПН
	int		top = 0;		//вершина стека, растет вверх
	char	ch;

	for(ch=*(opn++); ch; ch=*(opn++))	//по всем символам ОПН
	{
		if (ch >= 'a')					//переменная?
										//пишем в стек значение соответствующего бита в row
										//номер переменной (0,1,...) получаем, как ch-'a'
										//из-за того, что младший бит справа, 
										//перевернем номер относительно количества переменных
										//т.е. получим cnt-ch+'a'-1
										//тогда маска бита получается 1<<(cnt-ch+'a'-1)
										//в стек получим или 1, или 0, как результат сравнения не 0
			stack[top++] = (char)(((1<<(cnt-ch+'a'-1)) & row)!=0);
		else if ((ch == '0') || (ch == '1'))	//явные константы
			stack[top++] = ch - '0';			//отправим в стек, как значения 0 или 1
		else
			switch (ch)					//для операций
			{							//берем два значения (или одно для отрицания) из стека, 
										// делаем операцию и отправляем обратно в стек
				case OR_CODE:
					stack[top++] = stack[--top] | stack[--top];	//или
					break;
				case AND_CODE:
					stack[top++] = stack[--top] & stack[--top];	//и
					break;
				case NOT_CODE:
					stack[top++] = 1 ^ stack[--top];			//отрицание, как исключающее или с 1
					break;
				case XOR_CODE:
					stack[top++] = stack[--top] ^ stack[--top];	//исключающее или
					break;
				case IMP_CODE:
					stack[top++] = stack[--top] | (1 ^ stack[--top]);	//импликация по формуле a->b=~a|b
					break;												//сначала достаем второй аргумент!
				case EQU_CODE:
					stack[top++] = 1 ^ (stack[--top] ^ stack[--top]);	//эквиваленция, как отрицание xor
					break;
			}
	}
	return stack[--top];				//после всех расчетов в вершине стека - результат
}

//расчет и вывод строки таблицы истинности
//параметры:
//ОПН, номер строки, количество переменных
void print_table(char* opn, int row, int cnt)
{
	int		i;
	for(i=0; i<cnt; i++)
	{
		printf("%d ", (((1<<(cnt-i-1)) & row)!=0));	//вывод значений переменных (о маске бита смотри выше)
	}
	printf("%d\n", F(opn, row, cnt));				//расчет и вывод значения функции
}

int main()
{
	char	str[256];					//входная строка
	char	opn[256];					//строка ОПН
	int		i;
	int		cnt;						//количество переменных
	int		max;						//число строк таблицы истинности

	printf("Enter function: ");
	gets(str);							//вводим строку
	if ((cnt = OPN(str, opn))>0)		//пребразовываем в ОПН (с проверкой на синтаксис).
	{									//одновременно получаем количество переменных
		print_opn(opn);					//выведем строку ОПН

		print_header(cnt);				//заголовок таблицы истинности

		max = 1<<cnt;					//количество строк таблицы истинности
		for(i=0; i<max; i++)
			print_table(opn, i, cnt);	//расчет и вывод очередной строки ТИ
	}
	else
		printf("Syntax error...\n");	//ошибка! Получили cnt=-1
	_getch();
	return 0;
}

Посмотрите smile Какие функции - в тексте программы
Если не понятно, спрашивайте, разберемся... smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 9

= общий = | 12.09.2017, 17:59 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

:D
спасибо большое) ща буду разбираться )

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 10

= общий = | 12.09.2017, 18:06 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Учитывается все: и приоритеты, и скобки smile
Поломать голову немного придется. smile
Поняли, что такое ОПЗ?

Добавить решение второй задачи проще простого:
выводим только те аргументы, для которых имеем нулевое значение формулы

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.09.2017, 18:13

mir97_00
Посетитель

ID: 401316

# 11

= общий = | 12.09.2017, 22:05 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

я разобрала программу) конечно стек мы еще не проходили но зато теперь я знаю что это) но у меня такой вопрос
наверно программа была написана и на плюсах немного
просто плюсы я не знаю
и не понимаю что это означает:
max = 1<<cnt;
(1<<(cnt-i-1))
именно эта операция "<<"

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 12

= общий = | 12.09.2017, 22:48 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Чистый Си. Ничего от С++ тут нет smile
<< означает логический сдвиг влево на указанное число бит
1<<0 даст 0x01
1<<2 даст 0x04
3<<4 даст 0x30

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 13

= общий = | 12.09.2017, 22:51 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Кстати, стек обычно растет сверху вниз.
В данной программе реализован снизу вверх. Но принцип тот же: "последний пришел - первый ушел"

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 14

= общий = | 12.09.2017, 22:54 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

а ну да точно smile
просто не ожидала тут сдвиг увидеть)
а про опз я поняла) очень интересно
раньше даже не слышала о таком

Хватов Сергей
Академик

ID: 20764

# 15

= общий = | 13.09.2017, 09:11 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Что-то здесь не так: автор вопроса ещё не добралась до многих низкоуровневых вещей, а тут требуется грамматический разбор (и, возможно, лексический впридачу). Это всё нетривиальные (и достаточно специализированные) задачи. Вероятно, подразумевается, что исходное выражение захардкодено в программе, и требуется всего лишь организовать перебор всех аргументов. Если это не так, то по сути предлагается написать свой компилятор.

mir97_00
Посетитель

ID: 401316

# 16

= общий = | 13.09.2017, 09:23 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Хватов Сергей:

Вы имеете ввиду что сами формулы уже должны быть в программе и надо просто по ним составить таблицы истинности?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 17

= общий = | 13.09.2017, 10:08 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Ну это уже Вам и Вашему преподавателю решать.
Мое решение, действительно, нетривиальное.
Если Вы только начали изучать Си, то решение вряд ли Вам подойдет.
Полагаю, преподаватель быстро раскусит, что это не Вы писали...
Посоветуйтесь с преподавателем, что, конкретно, должна делать программа.

Впрочем, для общего развития, программка даже очень полезна smile smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 18

= общий = | 13.09.2017, 11:35 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Си мы изучаем пол года
И преподаватель говорил что то про этот метод
Но для развития конечно очень полезно )

Хватов Сергей
Академик

ID: 20764

# 19

= общий = | 13.09.2017, 11:47 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата: Лысков Игорь Витальевич
Впрочем, для общего развития, программка даже очень полезна

Не очень полезна.
Общепринятая реализация грамматического разбора весьма компактна и изящна. Но теория там неочевидная. Тут лучше как раз теорию поверхостно почитать, а не разбираться в коде, тем более написаным "в один кирпич".
Только это интересно в основном специалистам по матлингвистике и писателям компиляторов. Для практиков есть генераторы кода прямо по формальному описанию грамматики с включёнными кусками кода, реализующими свёртки.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 20

= общий = | 13.09.2017, 12:02 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Хватов Сергей:

Я с Вами не согласен. Можно пользоваться готовыми решениями, да. Но понимать, как это работает, никогда не вредно.
Тем более, в коде можно увидеть и научиться некоторым другим полезным "штучкам". Речь же идет об обучении программированию,
а не о выполнении конкретной работы.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 13.09.2017, 12:03

mir97_00
Посетитель

ID: 401316

# 21

= общий = | 16.09.2017, 02:05 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Извините
А вы не могли бы подробнее рассказать как работает эта операция сдвига
Саму операцию я знаю
Но не понимаю какую матрицу она делает, а точнее как

mir97_00
Посетитель

ID: 401316

# 22

= общий = | 16.09.2017, 12:37 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

И кстати она не правильно считает

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 23

= общий = | 18.09.2017, 10:29 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Не исключено. Программка, в общем-то, писалась на скорую руку.
Приведите пример, на котором неправильно считает. Было бы неплохо исправить.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 24

= общий = | 18.09.2017, 10:51 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Смотрите вот например если строк 2
То она выведет порвано сначала 0 потом 1
Допустим 8 строк она выведет сначала 4 нуля а потом 4 единицы

mir97_00
Посетитель

ID: 401316

# 25

= общий = | 18.09.2017, 10:52 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

ОПЗ выводит правильно только не правильно сам ответ функции выводит

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 26

= общий = | 18.09.2017, 11:02 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

© Цитата:
если строк 2
То она выведет порвано сначала 0 потом 1
Допустим 8 строк она выведет сначала 4 нуля а потом 4 единицы

Честно говоря, не понял, как это. Как это 2 строки, и как порвано выведет
Предполагалось, что строка будет одна.
Нарисуйте буковками, что было понятно, о чем речь

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 27

= общий = | 18.09.2017, 11:07 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

A&B
A B F
0 0 0
0 1 0
1 0 1
1 1 1
Или
(A&B)|(C>B)
A B C F
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 1

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 28

= общий = | 18.09.2017, 11:32 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Вот мои результаты: smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 29

= общий = | 18.09.2017, 11:34 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Очень странно) ладно дома ещё раз проверю

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 30

= общий = | 18.09.2017, 11:40 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Кстати, я понял, что имелось в виду, когда говорилось "выведет сначала 4 нуля а потом 4 единицы" smile
Выводило первый аргумент. Но почему, совершенно непонятно...
Если будет то же самое, киньте мне полученный exe-файл (загрузите в "мои файлы" на главной странице и дайте ссылку). Я посмотрю изнутри smile smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 18.09.2017, 11:41

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 31

= общий = | 18.09.2017, 11:47 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

© Цитата:
А вы не могли бы подробнее рассказать как работает эта операция сдвига
Саму операцию я знаю
Но не понимаю какую матрицу она делает, а точнее как
Это до сих пор непонятно?

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 32

= общий = | 18.09.2017, 12:00 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

В двух словах, была использована двойная природа бит:
1) биты, как самостоятельная единица информации;
2) биты в совокупности являются неким числом.
Другими словами, разные наборы значений переменных являются последовательными числами от 0 до 2N - 1, где N - количество переменных.
Перебирая числа от 0 до 2N - 1, мы получим все наборы.
А взяв соответствующие биты из числа, получим значения логических переменных для конкретного набора.
А вот чтобы получить значение бита и используем маску, как сдвиг единицы на соответствующее место.
Проверив на 0 конъюнкцию маски и числа, получим значение соответствующей переменной.

Там есть небольшой момент: первая переменная задается старшим используемым битом,
поэтому в программе производится небольшое преобразование. smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 18.09.2017, 12:05

mir97_00
Посетитель

ID: 401316

# 33

= общий = | 18.09.2017, 22:25 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

http://rfpro.ru/upload/10594

-----
 Прикрепленный файл (кликните по картинке для увеличения):

mir97_00
Посетитель

ID: 401316

# 34

= общий = | 20.09.2017, 12:12 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Вы посмотрели файл ?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 35

= общий = | 20.09.2017, 12:21 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Программа не запускается...
Ее размер точно равен 71680 байт?
Если судить по заголовку, ее размер должен быть порядка 163840
Киньте на почту lyskov@gmail.com
Только переименуйте, например, в *.eee

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 36

= общий = | 20.09.2017, 14:00 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Отправила

mir97_00
Посетитель

ID: 401316

# 37

= общий = | 20.09.2017, 14:49 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Теперь загрузилось?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 38

= общий = | 20.09.2017, 16:27 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Все равно, не работает... Надо было собрать в один exe...

Вроде нашел в Инете все требуемые dll, но все равно VCRUNTIME140D.dll не та, не находится некая функция, не факт, что одна
Так что, киньте, наверное, мне еще VCRUNTIME140D.dll (найдите ее на своем диске)

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 39

= общий = | 20.09.2017, 16:34 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

Лучше давайте упакуйте проект в архив и киньте мне.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

mir97_00
Посетитель

ID: 401316

# 40

= общий = | 20.09.2017, 16:43 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Хорошо вечером кину

Вадим Исаев ака sir Henry
Старший модератор

ID: 425

# 41

= общий = | 21.09.2017, 07:36 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

© Цитата: Лысков Игорь Витальевич
Вроде нашел в Инете все требуемые dll, но все равно VCRUNTIME140D.dll не та, не находится некая функция, не факт, что одна
Так что, киньте, наверное, мне еще VCRUNTIME140D.dll (найдите ее на своем диске)

А не может быть такого, что у Вас разрядности программы и DLL разные?

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

mir97_00
Посетитель

ID: 401316

# 42

= общий = | 21.09.2017, 08:30 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Вадим Исаев ака sir Henry:

Я думала об этом
Но что в этом случае делать?:с
Как исправить что бы правильно работала

Вадим Исаев ака sir Henry
Старший модератор

ID: 425

# 43

= общий = | 21.09.2017, 09:02 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mir97_00:

© Цитата: mir97_00
Но что в этом случае делать?:с
Как исправить что бы правильно работала

Даже не знаю, понравится ли Вам мой ответ... smile
Не использовать программное обеспечение тех фирм, которые озабочены только своими прибылями. smile
Для Windows можно использовать C/C++ либо проекта MinGW, либо проетка Cygwin. И тот и другой - попытка переложить на рельсы Windows кучу полезных программ из Linux, в том числе и набор компиляторов GCC (это Си, Си++, Ада, Ди, Фортран, Го, может ещё кого забыл smile ). Их отличия - MinGW для русского языка использует ту же кодировку, что и Windows, а в Cygwin'е - всё как в Линукс, кодировка UTF8 (на англицкий язык UTF8 никак не влияет, только на другие языки).
Самая главная проблема для тех, кто программировал только в Windows - для этого набора компиляторов разработчиками не предусмотрено никакого графического IDE, приходится пользоваться командной строкой, многих это приводит в панический ужас... smile Правда в интернете можно найти для них IDE'шки, но это никакие не Visual - только под тексты программ, с цветовыделением ключевых слов и кнопками компиляции\запуска. Зато если в конторе, где Вы работаете\собираетесь работать выйдет в пятницу срочный приказ "До понедельника всем перейти на открытую операционную систему Linux" (как это, к примеру было в службе судебных приставов и ещё кое-каких госконторах), Вас это ни капли не смутит - Вы будете единственным человеком, который умеет там программировать. А это сразу, как минимум, должность замдиректора по новым информационным технологиям и возможность финансово не напрягаясь четыре раза в год ездить отдыхать на Майорку или в Малагу. smile
smile

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

 

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.37741 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн