Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2012, 23:22   #1
kibcat
 
Регистрация: 16.05.2012
Сообщений: 5
По умолчанию присваивание переменной "левого" значения

здавствуйте
1. Составить программу, реализующую решение системы булевых функций. Решить систему уравнений
все функции читаем из файла, сначала функцию g, находим её значения на всех 8 наборах,
сначала предпологаем что все наборы являются решениями. Затем считываем первую функцию и сравнивать её значения с значением функции g на 1-м наборе 000, если значение функции на q-м наборе равно значению функции g на 1-м наборе, то записываем номер этого набора в массив resh[e], е, на полученных после первой функции начинаем проверять вторую и полученные значения 2-й функции сравниваем с значением функции g на 2-м наборе. И так далее, до тех пор пока число возможных решений е не станет равным 0, или не перебёрём все уравнения
ошибка происходит гдето с 233 по 239 строке когда мы проверяем 1-ю функцию на 8-м набобое, после выполнения этих 6 строк переменная q принимает значение равное 20, каким образом непонятно, в этом блоке переменная q не используется вообще, самостоятельно я несмог понять почему происходит изменение переменной q
начало файла такое:
(x&(y>-z))
((t&-y)v(z&-x))
Код:
# include <stdio.h>
#include "windows.h"
#include <locale>
#include <iostream>
# include <string.h>
# include <fstream>
using namespace std;

const int N=64, M=6;
int mas[N][M];
int s[100];// массив в который записываются открывающие и закрывающие скобки, переменные и порядок действия с переменными
int s1[100];// масси хранит промежуточные вычислени, после нахождения значения скобки, ячейки массива s  в котором хранилась скобка замещаются на новую переменную в этом массиве, остальные элементы массива s переписываются, так осуществляется последовательность действий
char p[5]="xyzt"; 
char func[100]; // массив хранящий функцию
int k,i,j,q;
int n, m=1;
int k_max=1;
char zapis[16]="()xyztv&-><+~|/";
int x,y,z,t;
int resh[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};// хранит номера наборов являющихся решениями системы, первоночально предпологаем что все наборы являются решениями
int g[20];// хранит таблицу истинности для функции g
int number_function=1;// исп в функции auto_input и input_keyboard, в каждой функции используется для различных задач
int schitannie_simvoli=0;

int diz (int,int);
int kon (int, int);
int ne (int);
int imp (int,int);
int mod2 (int, int);
int akv (int, int);
int sheff (int, int);
int pirs (int,int);
int raz (int,int);
int postr();
void input_keyboard();
void auto_input();
void table_truth(int);
void rewriting_in_a_digital_form();

ifstream f1("readfile.txt");	
void main()
{
	setlocale(LC_ALL, "Russian");// подключение русской раскладки для вывода всех сообщений на русском языке
	int vvod;// используется для выбора метода ввода
	
	do// выбор метода ввода
	{
	cout<< "выберите режим ввода данных:"<<endl<<"1. Вручную (ввод с клавиатуры)"<<endl<<"2.Машинно (чтение из файла)"<<endl;
	cin >> vvod;
	}
	while(vvod!=2||vvod!=2);
	
	switch(vvod)// оператор switch собственно и существляет выбор метода ввода
	{
	case 1: 	input_keyboard(); 
		
		
		break;
	case 2:	
		auto_input(); 
		rewriting_in_a_digital_form();
		n=3;
		table_truth(n);
		cout<<endl;
		
		for(q=0;q<m;q++) 
		{
			g[q]=postr();
			cout<< g[q]<<" ";
		} //построение таблицы истинности для функции g
		
		//for(q=0;q<m;q++)cout<< g[q]<<" ";
		n=4;
		m=1;
		number_function++;
		int e=0; // переменная e хранит в себе количество общих решений уравнений, т.е сначала решения системы из 1-го ур, 
		//затем системы из 1-го и 2-го, и т.д., 
		
		int number_solutions=16;// количество возможных решений системы
		int number_equation=1;// номер уровнения в системе функций, используется для сравнения с нужным значением функции g
		table_truth(n);
		while(number_solutions!=0||number_function!=10)
		{
			e=0;
			auto_input();
			rewriting_in_a_digital_form();
			system("pause");
			int nabor;
		for(q=0;q<number_solutions;q++){// подставляем наборы, которые могут являться решениями системы в функции, 
		//тоесть если после нахождения всех значений 1-й функции условиям удовлетворяют только 9, 
		//то в следующую функцию будем подставлять только эти 9 наборов
		
		
		nabor=postr();
		if(nabor==g[number_equation]){resh[e]=q;e++;}
		
		}
			cout<<endl;
				for (int kl=0;kl<number_solutions;kl++)cout << resh[kl]<< " ";
		number_solutions=e; 
		number_equation++;
		number_function++;
		if(number_solutions==0){cout<< endl<<"система не имеет решений"<<endl;break;}// вывод на экран решения системы, если они есть, 
		//если их нет то выводим сообщение о том что решений нет
			
		
		}
		for(i=0;i<number_solutions;i++){
			for(j=0;j<n;j++)cout<<mas[resh[i]][j];
		}
		break;
	}
		
	end1: system ("pause");
}
мнебы только понять почему там меняется значение, с остальным сам должен разобраться

Последний раз редактировалось kibcat; 16.05.2012 в 23:30. Причина: добавил функции с которыми я работаю
kibcat вне форума Ответить с цитированием
Старый 16.05.2012, 23:23   #2
kibcat
 
Регистрация: 16.05.2012
Сообщений: 5
По умолчанию

Код:
int diz (int x,int y)
{
	if (x==0 && y==0) return 0; 
	else return 1;
}

int kon (int x, int y)
{
	if (x==1 && y==1) return 1; 
	else return 0;
}

int ne (int x)
{
	if (x==0) return 1; 
	else return 0;
}

int imp (int x,int y)
{
	if (x==1 && y==0) return 0; 
	else return 1;
}

int mod2 (int x, int y)
{
	if ((x==0 && y==1)||(x==1 && y==0)) return 1; 
	else return 0;
}

int akv (int x, int y)
{
	return ne(mod2(x,y));
}

int sheff (int x, int y)
{
	return ne(kon(x,y));
}

int pirs (int x,int y)
{
	return ne(diz(x,y));
}

int raz (int x,int y)
{
	if(x==1&&y==0) return 1;
	else return 0;
}

int postr()// построение таблицы истинности, последовательность действий будет осуществлятьcz pfчёт переписывания массива с действиями s  ан месте решённой скобки будет ставиться новая переменная
{ 
	int c,x1,x2,kj[100],b=0,kl[50],s1,h=0,l=0; 
	
		s1=k;
	for (int j=0;j<k;j++) kj[j]=s[j];// запоминаем массив s для того чтобы при нахождении значения функции значения массива s не потерялись
//cout<<endl<<q<<" "<<endl<<endl<<endl;
	 for(j=0;j<s1;j++)
	 {
			//cout<<endl;
				//for (int kl=0;kl<s1;kl++)cout << s[kl]<< " ";
				//
		if(s[j]==0&&s[j+4]==1){
			//cout<<endl<<s1<<" "<<j<<endl;
			//	for (int kl=0;kl<s1;kl++)cout << s[kl]<< " ";
				if(s[j+1]==2)x1=mas[resh[q]][0];//задаём значение 1-й переменной
				if(s[j+1]==3)x1=mas[resh[q]][1];
				if(s[j+1]==4)x1=mas[resh[q]][2];
				if(s[j+1]==5)x1=mas[resh[q]][3];
				if(s[j+1]==15)x1=ne(mas[resh[q]][0]);
				if(s[j+1]==16)x1=ne(mas[resh[q]][1]);
				if(s[j+1]==17)x1=ne(mas[resh[q]][2]);
				if(s[j+1]==18)x1=ne(mas[resh[q]][3]);
				if(s[j+1]==19)x1=0;// появляются после нахождения значений какойлибо скобки
				if(s[j+1]==20)x1=1;

				if(s[j+3]==2)x2=mas[resh[q]][0];//задаём значение 2-й переменной
				if(s[j+3]==3)x2=mas[resh[q]][1];
				if(s[j+3]==4)x2=mas[resh[q]][2];
				if(s[j+3]==5)x2=mas[resh[q]][3];
				if(s[j+3]==15)x2=ne(mas[resh[q]][0]);
				if(s[j+3]==16)x2=ne(mas[resh[q]][1]);
				if(s[j+3]==17)x2=ne(mas[resh[q]][2]);
				if(s[j+3]==18)x2=ne(mas[resh[q]][3]);
				if(s[j+3]==19)x2=0;// появляются после нахождения значений какойлибо скобки
				if(s[j+3]==20)x2=1;

				if(s[j+2]==6) c=diz(x1,x2);//выполняем указанное между ними действие
				if(s[j+2]==7) c=kon(x1,x2);
				if(s[j+2]==9) c=imp(x1,x2);
				if(s[j+2]==11) c=mod2(x1,x2);
				if(s[j+2]==12) c=akv(x1,x2);
				if(s[j+2]==13) c=sheff(x1,x2);
				if(s[j+2]==10) c=pirs(x1,x2);
				if(s[j+2]==14) c=raz(x1,x2);
				//cout<< endl<<x1 << " "<<x2 <<" "<< c<<endl;
				
				h=0;
			//	system("pause");
				//	cout<<endl<<s1<<" "<<j<<endl;
				//	for (int kl=0;kl<s1;kl++)cout << s[kl]<< " ";
				

				for (int l=0;l<s1;l++){
					if(l==j) {  if(c==0){s[l]=19; h=4;}
								else {s[l]=20; h=4;}
					l=l+5;
					}
					s[l-h]=s[l];
					}
				s1=s1-h;
				cout<<endl<<q<<endl;
				//for (int kl=0;kl<s1;kl++)cout << s[kl]<< " ";
значение меняется именно при выполнении этой строке:срабатывает условие, изза того что у нас j=0? берётся значение s[j-1]из памяти,подчёркнутый текст это фрагмент который я добавил 		
				if(s[j-1]==8&&j!=0){// отрицание слагаемого или всей функции, проверить работоспособность на примере
					//for (int kl=0;kl<s1;kl++)cout << s[kl]<< " ";
					//cout<<endl;
						if(s[j]==19) s[j-1]=20;
						if(s[j]==20) s[j-1]=19;// как на той строчке может меняться q??????? 
				for (int kg=j;kg<s1-1;kg++) s[kg]=s[kg+1];
					s1=s1-1;
					
				}
				cout<<q<<endl;
				//cout<<endl;
				//for (int kl=0;kl<s1;kl++)cout << s[kl]<< " ";
				
				//system ("pause");
			//	if(s1==1) break;
				//else break;
				//cout<<endl;
			//	for (int l=0;l<s1;l++) cout << " "<<s[l];
				j=-1;

		}}
		
	
	int znach_function;
		if(s[0]==19)znach_function=0;
                       if(s[0]==20)znach_function=1;
		for (int l=0;l<k;l++) s[l]=kj[l];
		return znach_function;
}

void input_keyboard()
{
end2: cout << "Обозначения:"<< endl << "названия переменных (использовать по порядку) x,y,z,t    "<< endl << "дизъюнкцияv          v";
	cout<< endl << "конъюнкция           &"<< endl << "отрицание            -"<< endl << "импликация           >";
	cout<< endl << "сумма по модулю      +"<< endl << "эквивалентность      ~"<< endl << "штрих шефера         |";
	cout<< endl << "стрелка пирса        <"<< endl << "разность             /"<< endl<<endl;
	cout << "введите функцию"<< endl;
	cin >> func;

	for(i=0;func[i]!='\0';i++);//нахождение количества введёных символов
	k=i; // к-количество символов
	for (i=0; i<k;i++) //проверка функции на ввод символов, если введён символ которого нет в алфавите то необходимо ввести функцию заново
	{
	for(j=0;;j++)
	{
		if(func[i]==zapis[j]) break;
	if(j==16){cout << "ошибка, " << i <<"-й символ   "<< func[i]<< "  нераспознан"<< endl; goto end2;}
	}
	}
}

Последний раз редактировалось kibcat; 17.05.2012 в 00:11. Причина: исправил код на рабочий
kibcat вне форума Ответить с цитированием
Старый 16.05.2012, 23:26   #3
kibcat
 
Регистрация: 16.05.2012
Сообщений: 5
По умолчанию

Код:
void auto_input()
{
ifstream f1("readfile.txt");
f1.ignore(schitannie_simvoli);
f1.getline(&func[0],1100);
j=0;
int km=0;
//cout<<endl<<schitannie_simvoli<<endl;
	for(i=0;i<1;)
	{
		km=0;
		for(int l=0;l<15;l++)
		{
			if(func[j]==zapis[l]){km=1; break;}
		}
		j++;
		if(km==0){func[j]=NULL;i++;schitannie_simvoli=schitannie_simvoli+j;}
		
	}
// удаляем из потока символ перевода на другую строку, число 0 это число удаляемых символов
					   // так как в си отсчёт начинается с нуля то число удаляемых символов 0, а не 1
					   // elfkbnmсимвол необходимо так как если его не удалить то вместо функции будет считан символ перевода на другую строку

	//cout<<endl<<schitannie_simvoli<<endl;
	i=0;
	while(func[i]!='\0')
{
cout<<func[i];
i++;
}
k=i;// количество считанных символов
}
void table_truth(int)
{
	m=1;
	for (j=0; j<n;j++) 	m=2*m; //возведение 2 в степень n
	k_max=1;
for (int i=n-1;i>=0;i--)
	{
		int k=0;
		int v=0;
		for (int j=0;j<m;j++)
		{
			mas[j][i]=v;
			k++;
			if (k==k_max) 
				{
					k=0;
					v=ne(v);
				}
		}
		k_max=k_max*2;
	}
/*for (int i=0;i<m;i++) // вывод таблицы наборов значений(неудалять коментарий!!! удалить только то что в скобках)
	{
		cout<<endl;
		for (int j=0;j<n;j++)	cout <<mas[i][j]<< " ";
		
	}*/
}
void rewriting_in_a_digital_form()
{
int h=0, f=1; // h используется для уточнения количества символов которые уменьшаются из-за того что 
	//при перевод в цифровой вид отрицание кокой-лобо переменной должно считаться одним символом, а в символьном виде это 2 символа
	for(i=0;i<k;i++)// запись функции в цифровом виде
	{
		f=0;
		for(j=0;j<15;j++){
			if(func[i]==zapis[j]) {
				if(func[i]=='-'){
					s[i]=8;
					if(func[i+1]=='x'){s[i-h]=15; i++; h++; f=1;break;}//  для того чтобы отрицание перменной считалось одним символом для распознавания при построении т.и.
					if(func[i+1]=='y'){s[i-h]=16; i++; h++; f=1;break;}
					if(func[i+1]=='z'){s[i-h]=17; i++; h++; f=1;break;}
					if(func[i+1]=='t'){s[i-h]=18; i++; h++; f=1;break;}
								}
				else {s[i-h]=j; f=1;break;}} 
						  }
	}
	k=k-h;
}
kibcat вне форума Ответить с цитированием
Старый 17.05.2012, 00:07   #4
kibcat
 
Регистрация: 16.05.2012
Сообщений: 5
По умолчанию

нашёл способ как исправить ошибку (поправил поправил представленные код), но не смогу понять отчего она произошла, кто знает можете подсказать?
kibcat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присваивание переменной значения ячейки Soviet Microsoft Office Excel 4 02.04.2012 12:24
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Add New Project и добавление "левого" кода в код консольной программы Upgrades Общие вопросы Delphi 2 21.10.2011 23:03
Как построить график, который "сглаживает" значения?" Longy_Dongy Microsoft Office Excel 4 16.10.2011 16:16
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04