Перейти к содержанию
СофтФорум - всё о компьютерах и не только

алгебра высказываний в С++


Рекомендуемые сообщения

в общем суть такая: пользователь вводит пропозициональную форму. Программа должна расставить скобки (с выводом полученного результата) и вывести таблицу истинности. Пользователь может ввести 5 различных букв. Как это организовать?

Ссылка на комментарий
Поделиться на другие сайты

Есть ли функция, которая возвращает индекс символа, а также функция для вставки символа в любое место строки?

Ссылка на комментарий
Поделиться на другие сайты

valek_g00d_man:

Попробуй применить что-то из этого.

Функции задания формата

CForm[expr] — выполняет вывод ехрг в форме, принятой для языка С.

ColonForm[a,b] — выводит в виде а:b.

ColumnForm[ {el, e2,...} ] — дает вывод в виде столбца с el над е2 и т.д.

ColumnForm[list, horiz] — при выводе дает горизонтальное выравнивание каждого элемента.

ColumnForm[list, horiz, vert] — при выводе дает как горизонтальное, так и вертикальное выравнивание всего столбца.

FontForm[expr, {"font", size}] — устанавливает шрифт "font" и размер size, с которыми выводится выражение ехрг.

Format [ехрг] — выводит ехрг в форматированном виде.

Format [expr, type] — возвращает формат для указанного типа type.

InputForm[expr] — выводит ехрг во входной форме.

NumberForm[expr, n] — выполняет вывод приближенного представления вещественного значения ехрr с точностью до n цифр.

OutputForm[expr] — выполняет вывод ехрr в стандартной выходной форме системы Mathematica.

PaddedForm[expr, n] — выводит все числа ехрr, заполняя оставшиеся места так, чтобы каждое число содержало n знаков.

PaddedForm[expr, {n, f} ]—выводит ехрг с приближенными вещественными числами, имеющими ровно f цифр справа от десятичной точки.

PrecedenceForm[expr, prec] — выводит выражение ехрг, заключенное в скобки так, как если бы оно содержало оператор с приоритетом ргес.

Prefix [f [ехрг] ] — выводит функцию f [ехрг] в префиксной форме: f @ ехрг.

Prefix [f [ехрг] , h] — выводит функцию f [ехрг] с заголовком h, то есть как hexpr.

$ Print Forms — является списком базисных форм вывода. Он автоматически обновляется при создании описаний Format, использующих новые формы вывода.

TextForm[expr] — выполняет вывод ехрг в обычном текстовом формате.

Unevaluated [ехрr] — представляет невычисляемую форму выражения ехрг, когда оно используется как аргумент функции.

Для функции Number Form и родственных функций используется ряд опций:

DigitBlock — указывает максимальную длину групп разрядов при использовании разделителей.

FormatType — указывает тип формата по умолчанию при выводе выражений.

NumberFormat — указывает, как мантисса, основание и порядок должны быть скомпонованы в конечную форму вывода.

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

NumberPoint— задает строку для использования в качестве десятичной точки.

NumberSeparator — задает строку для вставки между группами разрядов.

Right — используется для указания правостороннего выравнивания в таких формах вывода, как ColumnForm и TableForm.

Дополнительные функции и опции ввода/вывода

Attributes [symbol] — возвращает список атрибутов символа symbol.

Bastchlnput — возвращает True, если ввод в текущем сеансе работы производится непосредственно в ядро системы в пакетном режиме, и False в противном случае.

$BatchOutput — возвращает True, если вывод в текущем сеансеработы пересылается в пакетном режиме и пригоден для чтения другими программами, и False в ином случае.

Characters ["string"] — возвращает список символов в строке.

Dialog[ ]— инициирует диалог (часто используется совместно с функцией Return).

Dialog [ехрг] — инициирует диалог с использованием ехрг как текущего значения.

DialoGLndent [d] — возвращает величину отступа для строк ввода и вывода, которая используется в диалогах с глубиной вложенности d.

FullDefinition [s1, s2,...] — выводит определения, присвоенные символам si и всем символам, от которых данные символы зависят.

Information [symbol] — выводит информацию о символе symbol.

$ Input — глобальная переменная, значением которой является имя потока, из которого Mathematica в данный момент ожидает поступления входной информации.

$ Language — является списком строк, которые дают названия языков, используемых для сообщений.

Normal [ехрг] — преобразует ехрг из ряда специальных форм в нормальное выражение.

Out [n] — глобальный объект, соответствующий выводу, произведенному в и-й выходной строке (ячейке).

% — возвращает последний произведенный результат.

% % — возвращает предпоследний результат.

%%...% (k раз) — возвращает k-й предшествующий результат.

%k — возвращает результат из k-й выходной строки (абсолютная адресация).

Shallow [ехрг] — выводит первые четыре уровня ехрг, за исключением частей ехрг, длина которых превышает 10. Остальные части выводятся в структурной (скелетной) форме.

Shallow [expr, depth] — выводит части выражения ехрг до указанной глубины depth. Остальные части выводятся в структурной (скелетной) форме.

Shallow [expr, {depth, length}] — возвращает в структурной (скелетной) форме также и те части, длины которых выше указанного предела length.

Shallow[expr, {depth, length}, form] — использует скелетную форму для любых частей выражения, сопоставимых с указанным шаблоном form.

Short [expr] — выводит краткую форму ехрг, не превышающую длину одной строки.

Short [expr, n] — выводит ехрг в форме длиной около n строк.

SpaceFormfn] — выводит n пробелов.

Ссылка на комментарий
Поделиться на другие сайты

valek_g00d_man:

Есть ли функция, которая возвращает индекс символа, а также функция для вставки символа в любое место строки?
Естественно :) Еще бы таких элементарных вещей в языке не было... Вот пример использования этих функций
#include <iostream.h>#include <stdio.h>#include <string.h>using namespace std;int main() { int m; string pl="abcd"; m=pl.find('c');pl.insert(2,1,':'); cout<<m<<endl<<pl<<endl;getchar(); return 0;}
Ссылка на комментарий
Поделиться на другие сайты

Большое спасибо! Если можно напишите побольше функций для работы со строками (с описанием. можно без примера использования)! Если у кого есть еще идеи по поводу моего начального вопроса буду рад! Заранее спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ссылка на комментарий
Поделиться на другие сайты

valek_g00d_man:

Если можно напишите побольше функций для работы со строками
Это же не моя личная коллекция функций :)

Есть стандарт C++ и соответствующие справочники, в которых описан набор функций C++. В частности, класс строк имеет около 35 функций. Описание их есть, например, тут (в левой части страницы по ссылке колонка-оглавление).

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

допустим, что пользователь ввел формулу следующего вида:

A=>B+~C*D<=>~F*G (~ - отрицание, <=> - эквиваленция, + - дизъюнкция, * - конъюнкция, => - Следование)

Программа должна поставить скобки в след порядке:

1. A=>B+(~C)*D<=>(~F)*G

2. A=>B+((~C)*D)<=>((~F)*G)

3. A=>(B+((~C)*D))<=>((~F)*G)

4. (A=>(B+((~C)*D)))<=>((~F)*G)

5. ((A=>(B+((~C)*D)))<=>((~F)*G))

как это сделать? Каким образом в символьную строку вставить символ, а все остальные символы сдвинулись на 1 позицию вправо?

Очень нужно!!

P.S. Естественно знаки могут распологатьься по другому, но очередность расставления такая.

Ссылка на комментарий
Поделиться на другие сайты

Каким образом в символьную строку вставить символ, а все остальные символы сдвинулись на 1 позицию вправо?
Функцией insert, только что обсуждали.

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

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Функцией insert, только что обсуждали.

Да. Со строкой все понятно, но я прошу функцию для char, а не для string.

И по скобкам, если можешь черкани пожайлуста пример кода.

Ссылка на комментарий
Поделиться на другие сайты

valek_g00d_man:

Со строкой все понятно, но я прошу функцию для char, а не для string.
Вроде говорили о символьных строках :blushing: В C++ для них, в отличие от C, введен специальный тип, для которого и написаны функции типа insert.

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

#include <iostream>using namespace std;char* insert(char *s,char c,int k){int n=0;while(s[n++]!='\0');while(n--!=k)s[n]=s[n-1];s[k]=c;return s;}int main(){char s[30]="example";int k=4;char c='#';insert(s,c,k);cout<<s<<endl;getchar();}

Параметры функции insert:

s - указатель на массив символов (строку)

c - вставляемый символ

k - позиция в строке, в которую будет вставляться символ, раздвигающий строку (позиция отсчитывается от 0, как это принято в C и C++).

По скобкам пример "черкануть" не смогу, это не так просто.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Спустя месяц, я всеже смог расставить скобки.

Кому интересно:

cout << "\n'~' - otricanie" << endl << "'^' - konunkcia" << endl << "'v' - dizunkcia" << endl << "'-' - sledovanie" << endl << "'=' - ekvivalentnost" << endl << "-----------------------" << endl;string Str = "A=~(A^C)-Dv~C";		  // пример П-Формы................................index1 = Str.length();//================== Отрицание ====================for (i=0;i<index1;i++)  {  if (Str[i]== '~') { if (Str[i+1]=='(')	{	j=i+1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]=='(')		  a++;	   if (Str[ind]==')')		  b++;	   j++;	   }	while (b!=a); Str.insert(ind,1,')'); } else	Str.insert(i+2,1,')');Str.insert(i, 1, '(');  i++;  index1 = Str.length();  }}//================== Конъюнкция ====================for (i=0;i<index1;i++)  {  if (Str[i]== '^'  & Str[i-1]!='(' & Str[i+2]!=')') { if (Str[i+1]=='(')	{	j=i+1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]=='(')		  a++;	   if (Str[ind]==')')		  b++;	   j++;	   }	 while (b!=a); Str.insert(ind,1,')');	} else	Str.insert(i+2,1,')');//------------------------------------- if (Str[i-1]==')')	{	j=i-1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]==')')		  a++;	   if (Str[ind]=='(')		  b++;	   j--;	   }	 while (b!=a); Str.insert(ind,1,'(');	 } else	Str.insert(i-1,1,'(');  i++;  index1 = Str.length();  }}//================== Дизъюнкция ====================for (i=0;i<index1;i++)  {  if (Str[i]== 'v'  & Str[i-1]!='(' & Str[i+2]!=')') { if (Str[i+1]=='(')	{	j=i+1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]=='(')		  a++;	   if (Str[ind]==')')		  b++;	   j++;	   }	 while (b!=a); Str.insert(ind,1,')');	} else	Str.insert(i+2,1,')');//------------------------------------- if (Str[i-1]==')')	{	j=i-1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]==')')		  a++;	   if (Str[ind]=='(')		  b++;	   j--;	   }	 while (b!=a); Str.insert(ind,1,'(');	 } else	Str.insert(i-1,1,'(');  i++;  index1 = Str.length();  }}//================== Следование ====================for (i=0;i<index1;i++)  {  if (Str[i]== '-'  & Str[i-1]!='(' & Str[i+2]!=')') { if (Str[i+1]=='(')	{	j=i+1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]=='(')		  a++;	   if (Str[ind]==')')		  b++;	   j++;	   }	 while (b!=a);Str.insert(ind,1,')');	} else	Str.insert(i+2,1,')');//------------------------------------- if (Str[i-1]==')')	{	j=i-1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]==')')		  a++;	   if (Str[ind]=='(')		  b++;	   j--;	   }	 while (b!=a); Str.insert(ind,1,'(');	 } else	Str.insert(i-1,1,'(');  i++;  index1 = Str.length();  }}//================== Эквивалентность ====================for (i=0;i<index1;i++)  {  if (Str[i]== '='  & Str[i-1]!='(' & Str[i+2]!=')') { if (Str[i+1]=='(')	{	j=i+1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]=='(')		  a++;	   if (Str[ind]==')')		  b++;	   j++;	   }	 while (b!=a); Str.insert(ind,1,')');	} else	Str.insert(i+2,1,')');//------------------------------------- if (Str[i-1]==')')	{	j=i-1;	a=0;	b=0;	do	   {	   ind=j;	   if (Str[ind]==')')		  a++;	   if (Str[ind]=='(')		  b++;	   j--;	   }	 while (b!=a); Str.insert(ind,1,'(');	 } else	Str.insert(i-1,1,'(');  i++;  index1 = Str.length();  }}cout << "\nPforma posle preobrazovanii: " << Str << endl;

Но у меня теперь другие проблемы:

 string PBukv;int Kol=0, Kol2=0, x=0;index1=Str.length();string Alf = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";for (int i=0; i<index1; i++)  {  for (int j=0; j<Alf.length(); j++)  {  if (Str[i]==Alf[j])	 {	 if (Str[i]!=PBukv[j])		Kol++;	 if (Str[i]==PBukv[j])		Kol2++;	 }  }  if (Kol!=0)	 if (Kol2==0)  {  PBukv[x]=Str[i];  x++;  }  Kol=0;  Kol2=0;  }

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

И вторая проблема:

Как сделать таблицу истинности? А точнее, как забить в массив единицы и нули. Количество букв может быть от 2 до 5. Количество строк в таблице истинности = 2^n (n - количество букв).

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...